linux/drivers/scsi/be2iscsi/be_cmds.c
<<
>>
Prefs
   1/*
   2 * Copyright 2017 Broadcom. All Rights Reserved.
   3 * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License version 2
   7 * as published by the Free Software Foundation. The full GNU General
   8 * Public License is included in this distribution in the file called COPYING.
   9 *
  10 * Contact Information:
  11 * linux-drivers@broadcom.com
  12 *
  13 */
  14
  15#include <scsi/iscsi_proto.h>
  16
  17#include "be_main.h"
  18#include "be.h"
  19#include "be_mgmt.h"
  20
  21/* UE Status Low CSR */
  22static const char * const desc_ue_status_low[] = {
  23        "CEV",
  24        "CTX",
  25        "DBUF",
  26        "ERX",
  27        "Host",
  28        "MPU",
  29        "NDMA",
  30        "PTC ",
  31        "RDMA ",
  32        "RXF ",
  33        "RXIPS ",
  34        "RXULP0 ",
  35        "RXULP1 ",
  36        "RXULP2 ",
  37        "TIM ",
  38        "TPOST ",
  39        "TPRE ",
  40        "TXIPS ",
  41        "TXULP0 ",
  42        "TXULP1 ",
  43        "UC ",
  44        "WDMA ",
  45        "TXULP2 ",
  46        "HOST1 ",
  47        "P0_OB_LINK ",
  48        "P1_OB_LINK ",
  49        "HOST_GPIO ",
  50        "MBOX ",
  51        "AXGMAC0",
  52        "AXGMAC1",
  53        "JTAG",
  54        "MPU_INTPEND"
  55};
  56
  57/* UE Status High CSR */
  58static const char * const desc_ue_status_hi[] = {
  59        "LPCMEMHOST",
  60        "MGMT_MAC",
  61        "PCS0ONLINE",
  62        "MPU_IRAM",
  63        "PCS1ONLINE",
  64        "PCTL0",
  65        "PCTL1",
  66        "PMEM",
  67        "RR",
  68        "TXPB",
  69        "RXPP",
  70        "XAUI",
  71        "TXP",
  72        "ARM",
  73        "IPC",
  74        "HOST2",
  75        "HOST3",
  76        "HOST4",
  77        "HOST5",
  78        "HOST6",
  79        "HOST7",
  80        "HOST8",
  81        "HOST9",
  82        "NETC",
  83        "Unknown",
  84        "Unknown",
  85        "Unknown",
  86        "Unknown",
  87        "Unknown",
  88        "Unknown",
  89        "Unknown",
  90        "Unknown"
  91};
  92
  93struct be_mcc_wrb *alloc_mcc_wrb(struct beiscsi_hba *phba,
  94                                 unsigned int *ref_tag)
  95{
  96        struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
  97        struct be_mcc_wrb *wrb = NULL;
  98        unsigned int tag;
  99
 100        spin_lock(&phba->ctrl.mcc_lock);
 101        if (mccq->used == mccq->len) {
 102                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT |
 103                            BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
 104                            "BC_%d : MCC queue full: WRB used %u tag avail %u\n",
 105                            mccq->used, phba->ctrl.mcc_tag_available);
 106                goto alloc_failed;
 107        }
 108
 109        if (!phba->ctrl.mcc_tag_available)
 110                goto alloc_failed;
 111
 112        tag = phba->ctrl.mcc_tag[phba->ctrl.mcc_alloc_index];
 113        if (!tag) {
 114                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT |
 115                            BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
 116                            "BC_%d : MCC tag 0 allocated: tag avail %u alloc index %u\n",
 117                            phba->ctrl.mcc_tag_available,
 118                            phba->ctrl.mcc_alloc_index);
 119                goto alloc_failed;
 120        }
 121
 122        /* return this tag for further reference */
 123        *ref_tag = tag;
 124        phba->ctrl.mcc_tag[phba->ctrl.mcc_alloc_index] = 0;
 125        phba->ctrl.mcc_tag_status[tag] = 0;
 126        phba->ctrl.ptag_state[tag].tag_state = 0;
 127        phba->ctrl.ptag_state[tag].cbfn = NULL;
 128        phba->ctrl.mcc_tag_available--;
 129        if (phba->ctrl.mcc_alloc_index == (MAX_MCC_CMD - 1))
 130                phba->ctrl.mcc_alloc_index = 0;
 131        else
 132                phba->ctrl.mcc_alloc_index++;
 133
 134        wrb = queue_head_node(mccq);
 135        memset(wrb, 0, sizeof(*wrb));
 136        wrb->tag0 = tag;
 137        wrb->tag0 |= (mccq->head << MCC_Q_WRB_IDX_SHIFT) & MCC_Q_WRB_IDX_MASK;
 138        queue_head_inc(mccq);
 139        mccq->used++;
 140
 141alloc_failed:
 142        spin_unlock(&phba->ctrl.mcc_lock);
 143        return wrb;
 144}
 145
 146void free_mcc_wrb(struct be_ctrl_info *ctrl, unsigned int tag)
 147{
 148        struct be_queue_info *mccq = &ctrl->mcc_obj.q;
 149
 150        spin_lock(&ctrl->mcc_lock);
 151        tag = tag & MCC_Q_CMD_TAG_MASK;
 152        ctrl->mcc_tag[ctrl->mcc_free_index] = tag;
 153        if (ctrl->mcc_free_index == (MAX_MCC_CMD - 1))
 154                ctrl->mcc_free_index = 0;
 155        else
 156                ctrl->mcc_free_index++;
 157        ctrl->mcc_tag_available++;
 158        mccq->used--;
 159        spin_unlock(&ctrl->mcc_lock);
 160}
 161
 162/*
 163 * beiscsi_mcc_compl_status - Return the status of MCC completion
 164 * @phba: Driver private structure
 165 * @tag: Tag for the MBX Command
 166 * @wrb: the WRB used for the MBX Command
 167 * @mbx_cmd_mem: ptr to memory allocated for MBX Cmd
 168 *
 169 * return
 170 * Success: 0
 171 * Failure: Non-Zero
 172 */
 173int __beiscsi_mcc_compl_status(struct beiscsi_hba *phba,
 174                               unsigned int tag,
 175                               struct be_mcc_wrb **wrb,
 176                               struct be_dma_mem *mbx_cmd_mem)
 177{
 178        struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
 179        uint16_t status = 0, addl_status = 0, wrb_num = 0;
 180        struct be_cmd_resp_hdr *mbx_resp_hdr;
 181        struct be_cmd_req_hdr *mbx_hdr;
 182        struct be_mcc_wrb *temp_wrb;
 183        uint32_t mcc_tag_status;
 184        int rc = 0;
 185
 186        mcc_tag_status = phba->ctrl.mcc_tag_status[tag];
 187        status = (mcc_tag_status & CQE_STATUS_MASK);
 188        addl_status = ((mcc_tag_status & CQE_STATUS_ADDL_MASK) >>
 189                        CQE_STATUS_ADDL_SHIFT);
 190
 191        if (mbx_cmd_mem) {
 192                mbx_hdr = (struct be_cmd_req_hdr *)mbx_cmd_mem->va;
 193        } else {
 194                wrb_num = (mcc_tag_status & CQE_STATUS_WRB_MASK) >>
 195                          CQE_STATUS_WRB_SHIFT;
 196                temp_wrb = (struct be_mcc_wrb *)queue_get_wrb(mccq, wrb_num);
 197                mbx_hdr = embedded_payload(temp_wrb);
 198
 199                if (wrb)
 200                        *wrb = temp_wrb;
 201        }
 202
 203        if (status || addl_status) {
 204                beiscsi_log(phba, KERN_WARNING,
 205                            BEISCSI_LOG_INIT | BEISCSI_LOG_EH |
 206                            BEISCSI_LOG_CONFIG,
 207                            "BC_%d : MBX Cmd Failed for Subsys : %d Opcode : %d with Status : %d and Extd_Status : %d\n",
 208                            mbx_hdr->subsystem, mbx_hdr->opcode,
 209                            status, addl_status);
 210                rc = -EIO;
 211                if (status == MCC_STATUS_INSUFFICIENT_BUFFER) {
 212                        mbx_resp_hdr = (struct be_cmd_resp_hdr *)mbx_hdr;
 213                        beiscsi_log(phba, KERN_WARNING,
 214                                    BEISCSI_LOG_INIT | BEISCSI_LOG_EH |
 215                                    BEISCSI_LOG_CONFIG,
 216                                    "BC_%d : Insufficient Buffer Error Resp_Len : %d Actual_Resp_Len : %d\n",
 217                                    mbx_resp_hdr->response_length,
 218                                    mbx_resp_hdr->actual_resp_len);
 219                        rc = -EAGAIN;
 220                }
 221        }
 222
 223        return rc;
 224}
 225
 226/*
 227 * beiscsi_mccq_compl_wait()- Process completion in MCC CQ
 228 * @phba: Driver private structure
 229 * @tag: Tag for the MBX Command
 230 * @wrb: the WRB used for the MBX Command
 231 * @mbx_cmd_mem: ptr to memory allocated for MBX Cmd
 232 *
 233 * Waits for MBX completion with the passed TAG.
 234 *
 235 * return
 236 * Success: 0
 237 * Failure: Non-Zero
 238 **/
 239int beiscsi_mccq_compl_wait(struct beiscsi_hba *phba,
 240                            unsigned int tag,
 241                            struct be_mcc_wrb **wrb,
 242                            struct be_dma_mem *mbx_cmd_mem)
 243{
 244        int rc = 0;
 245
 246        if (!tag || tag > MAX_MCC_CMD) {
 247                __beiscsi_log(phba, KERN_ERR,
 248                              "BC_%d : invalid tag %u\n", tag);
 249                return -EINVAL;
 250        }
 251
 252        if (beiscsi_hba_in_error(phba)) {
 253                clear_bit(MCC_TAG_STATE_RUNNING,
 254                          &phba->ctrl.ptag_state[tag].tag_state);
 255                return -EIO;
 256        }
 257
 258        /* wait for the mccq completion */
 259        rc = wait_event_interruptible_timeout(phba->ctrl.mcc_wait[tag],
 260                                              phba->ctrl.mcc_tag_status[tag],
 261                                              msecs_to_jiffies(
 262                                                BEISCSI_HOST_MBX_TIMEOUT));
 263        /**
 264         * Return EIO if port is being disabled. Associated DMA memory, if any,
 265         * is freed by the caller. When port goes offline, MCCQ is cleaned up
 266         * so does WRB.
 267         */
 268        if (!test_bit(BEISCSI_HBA_ONLINE, &phba->state)) {
 269                clear_bit(MCC_TAG_STATE_RUNNING,
 270                          &phba->ctrl.ptag_state[tag].tag_state);
 271                return -EIO;
 272        }
 273
 274        /**
 275         * If MBOX cmd timeout expired, tag and resource allocated
 276         * for cmd is not freed until FW returns completion.
 277         */
 278        if (rc <= 0) {
 279                struct be_dma_mem *tag_mem;
 280
 281                /**
 282                 * PCI/DMA memory allocated and posted in non-embedded mode
 283                 * will have mbx_cmd_mem != NULL.
 284                 * Save virtual and bus addresses for the command so that it
 285                 * can be freed later.
 286                 **/
 287                tag_mem = &phba->ctrl.ptag_state[tag].tag_mem_state;
 288                if (mbx_cmd_mem) {
 289                        tag_mem->size = mbx_cmd_mem->size;
 290                        tag_mem->va = mbx_cmd_mem->va;
 291                        tag_mem->dma = mbx_cmd_mem->dma;
 292                } else
 293                        tag_mem->size = 0;
 294
 295                /* first make tag_mem_state visible to all */
 296                wmb();
 297                set_bit(MCC_TAG_STATE_TIMEOUT,
 298                                &phba->ctrl.ptag_state[tag].tag_state);
 299
 300                beiscsi_log(phba, KERN_ERR,
 301                            BEISCSI_LOG_INIT | BEISCSI_LOG_EH |
 302                            BEISCSI_LOG_CONFIG,
 303                            "BC_%d : MBX Cmd Completion timed out\n");
 304                return -EBUSY;
 305        }
 306
 307        rc = __beiscsi_mcc_compl_status(phba, tag, wrb, mbx_cmd_mem);
 308
 309        free_mcc_wrb(&phba->ctrl, tag);
 310        return rc;
 311}
 312
 313/*
 314 * beiscsi_process_mbox_compl()- Check the MBX completion status
 315 * @ctrl: Function specific MBX data structure
 316 * @compl: Completion status of MBX Command
 317 *
 318 * Check for the MBX completion status when BMBX method used
 319 *
 320 * return
 321 * Success: Zero
 322 * Failure: Non-Zero
 323 **/
 324static int beiscsi_process_mbox_compl(struct be_ctrl_info *ctrl,
 325                                      struct be_mcc_compl *compl)
 326{
 327        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
 328        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
 329        struct be_cmd_req_hdr *hdr = embedded_payload(wrb);
 330        u16 compl_status, extd_status;
 331
 332        /**
 333         * To check if valid bit is set, check the entire word as we don't know
 334         * the endianness of the data (old entry is host endian while a new
 335         * entry is little endian)
 336         */
 337        if (!compl->flags) {
 338                beiscsi_log(phba, KERN_ERR,
 339                                BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
 340                                "BC_%d : BMBX busy, no completion\n");
 341                return -EBUSY;
 342        }
 343        compl->flags = le32_to_cpu(compl->flags);
 344        WARN_ON((compl->flags & CQE_FLAGS_VALID_MASK) == 0);
 345
 346        /**
 347         * Just swap the status to host endian;
 348         * mcc tag is opaquely copied from mcc_wrb.
 349         */
 350        be_dws_le_to_cpu(compl, 4);
 351        compl_status = (compl->status >> CQE_STATUS_COMPL_SHIFT) &
 352                CQE_STATUS_COMPL_MASK;
 353        extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) &
 354                CQE_STATUS_EXTD_MASK;
 355        /* Need to reset the entire word that houses the valid bit */
 356        compl->flags = 0;
 357
 358        if (compl_status == MCC_STATUS_SUCCESS)
 359                return 0;
 360
 361        beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
 362                    "BC_%d : error in cmd completion: Subsystem : %d Opcode : %d status(compl/extd)=%d/%d\n",
 363                    hdr->subsystem, hdr->opcode, compl_status, extd_status);
 364        return compl_status;
 365}
 366
 367static void beiscsi_process_async_link(struct beiscsi_hba *phba,
 368                                       struct be_mcc_compl *compl)
 369{
 370        struct be_async_event_link_state *evt;
 371
 372        evt = (struct be_async_event_link_state *)compl;
 373
 374        phba->port_speed = evt->port_speed;
 375        /**
 376         * Check logical link status in ASYNC event.
 377         * This has been newly introduced in SKH-R Firmware 10.0.338.45.
 378         **/
 379        if (evt->port_link_status & BE_ASYNC_LINK_UP_MASK) {
 380                set_bit(BEISCSI_HBA_LINK_UP, &phba->state);
 381                if (test_bit(BEISCSI_HBA_BOOT_FOUND, &phba->state))
 382                        beiscsi_start_boot_work(phba, BE_BOOT_INVALID_SHANDLE);
 383                __beiscsi_log(phba, KERN_ERR,
 384                              "BC_%d : Link Up on Port %d tag 0x%x\n",
 385                              evt->physical_port, evt->event_tag);
 386        } else {
 387                clear_bit(BEISCSI_HBA_LINK_UP, &phba->state);
 388                __beiscsi_log(phba, KERN_ERR,
 389                              "BC_%d : Link Down on Port %d tag 0x%x\n",
 390                              evt->physical_port, evt->event_tag);
 391                iscsi_host_for_each_session(phba->shost,
 392                                            beiscsi_session_fail);
 393        }
 394}
 395
 396static char *beiscsi_port_misconf_event_msg[] = {
 397        "Physical Link is functional.",
 398        "Optics faulted/incorrectly installed/not installed - Reseat optics, if issue not resolved, replace.",
 399        "Optics of two types installed - Remove one optic or install matching pair of optics.",
 400        "Incompatible optics - Replace with compatible optics for card to function.",
 401        "Unqualified optics - Replace with Avago optics for Warranty and Technical Support.",
 402        "Uncertified optics - Replace with Avago Certified optics to enable link operation."
 403};
 404
 405static void beiscsi_process_async_sli(struct beiscsi_hba *phba,
 406                                      struct be_mcc_compl *compl)
 407{
 408        struct be_async_event_sli *async_sli;
 409        u8 evt_type, state, old_state, le;
 410        char *sev = KERN_WARNING;
 411        char *msg = NULL;
 412
 413        evt_type = compl->flags >> ASYNC_TRAILER_EVENT_TYPE_SHIFT;
 414        evt_type &= ASYNC_TRAILER_EVENT_TYPE_MASK;
 415
 416        /* processing only MISCONFIGURED physical port event */
 417        if (evt_type != ASYNC_SLI_EVENT_TYPE_MISCONFIGURED)
 418                return;
 419
 420        async_sli = (struct be_async_event_sli *)compl;
 421        state = async_sli->event_data1 >>
 422                 (phba->fw_config.phys_port * 8) & 0xff;
 423        le = async_sli->event_data2 >>
 424                 (phba->fw_config.phys_port * 8) & 0xff;
 425
 426        old_state = phba->optic_state;
 427        phba->optic_state = state;
 428
 429        if (state >= ARRAY_SIZE(beiscsi_port_misconf_event_msg)) {
 430                /* fw is reporting a state we don't know, log and return */
 431                __beiscsi_log(phba, KERN_ERR,
 432                            "BC_%d : Port %c: Unrecognized optic state 0x%x\n",
 433                            phba->port_name, async_sli->event_data1);
 434                return;
 435        }
 436
 437        if (ASYNC_SLI_LINK_EFFECT_VALID(le)) {
 438                /* log link effect for unqualified-4, uncertified-5 optics */
 439                if (state > 3)
 440                        msg = (ASYNC_SLI_LINK_EFFECT_STATE(le)) ?
 441                                " Link is non-operational." :
 442                                " Link is operational.";
 443                /* 1 - info */
 444                if (ASYNC_SLI_LINK_EFFECT_SEV(le) == 1)
 445                        sev = KERN_INFO;
 446                /* 2 - error */
 447                if (ASYNC_SLI_LINK_EFFECT_SEV(le) == 2)
 448                        sev = KERN_ERR;
 449        }
 450
 451        if (old_state != phba->optic_state)
 452                __beiscsi_log(phba, sev, "BC_%d : Port %c: %s%s\n",
 453                              phba->port_name,
 454                              beiscsi_port_misconf_event_msg[state],
 455                              !msg ? "" : msg);
 456}
 457
 458void beiscsi_process_async_event(struct beiscsi_hba *phba,
 459                                struct be_mcc_compl *compl)
 460{
 461        char *sev = KERN_INFO;
 462        u8 evt_code;
 463
 464        /* interpret flags as an async trailer */
 465        evt_code = compl->flags >> ASYNC_TRAILER_EVENT_CODE_SHIFT;
 466        evt_code &= ASYNC_TRAILER_EVENT_CODE_MASK;
 467        switch (evt_code) {
 468        case ASYNC_EVENT_CODE_LINK_STATE:
 469                beiscsi_process_async_link(phba, compl);
 470                break;
 471        case ASYNC_EVENT_CODE_ISCSI:
 472                if (test_bit(BEISCSI_HBA_BOOT_FOUND, &phba->state))
 473                        beiscsi_start_boot_work(phba, BE_BOOT_INVALID_SHANDLE);
 474                sev = KERN_ERR;
 475                break;
 476        case ASYNC_EVENT_CODE_SLI:
 477                beiscsi_process_async_sli(phba, compl);
 478                break;
 479        default:
 480                /* event not registered */
 481                sev = KERN_ERR;
 482        }
 483
 484        beiscsi_log(phba, sev, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
 485                    "BC_%d : ASYNC Event %x: status 0x%08x flags 0x%08x\n",
 486                    evt_code, compl->status, compl->flags);
 487}
 488
 489int beiscsi_process_mcc_compl(struct be_ctrl_info *ctrl,
 490                              struct be_mcc_compl *compl)
 491{
 492        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
 493        u16 compl_status, extd_status;
 494        struct be_dma_mem *tag_mem;
 495        unsigned int tag, wrb_idx;
 496
 497        be_dws_le_to_cpu(compl, 4);
 498        tag = (compl->tag0 & MCC_Q_CMD_TAG_MASK);
 499        wrb_idx = (compl->tag0 & CQE_STATUS_WRB_MASK) >> CQE_STATUS_WRB_SHIFT;
 500
 501        if (!test_bit(MCC_TAG_STATE_RUNNING,
 502                      &ctrl->ptag_state[tag].tag_state)) {
 503                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_MBOX |
 504                            BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
 505                            "BC_%d : MBX cmd completed but not posted\n");
 506                return 0;
 507        }
 508
 509        /* end MCC with this tag */
 510        clear_bit(MCC_TAG_STATE_RUNNING, &ctrl->ptag_state[tag].tag_state);
 511
 512        if (test_bit(MCC_TAG_STATE_TIMEOUT, &ctrl->ptag_state[tag].tag_state)) {
 513                beiscsi_log(phba, KERN_WARNING,
 514                            BEISCSI_LOG_MBOX | BEISCSI_LOG_INIT |
 515                            BEISCSI_LOG_CONFIG,
 516                            "BC_%d : MBX Completion for timeout Command from FW\n");
 517                /**
 518                 * Check for the size before freeing resource.
 519                 * Only for non-embedded cmd, PCI resource is allocated.
 520                 **/
 521                tag_mem = &ctrl->ptag_state[tag].tag_mem_state;
 522                if (tag_mem->size) {
 523                        pci_free_consistent(ctrl->pdev, tag_mem->size,
 524                                        tag_mem->va, tag_mem->dma);
 525                        tag_mem->size = 0;
 526                }
 527                free_mcc_wrb(ctrl, tag);
 528                return 0;
 529        }
 530
 531        compl_status = (compl->status >> CQE_STATUS_COMPL_SHIFT) &
 532                       CQE_STATUS_COMPL_MASK;
 533        extd_status = (compl->status >> CQE_STATUS_EXTD_SHIFT) &
 534                      CQE_STATUS_EXTD_MASK;
 535        /* The ctrl.mcc_tag_status[tag] is filled with
 536         * [31] = valid, [30:24] = Rsvd, [23:16] = wrb, [15:8] = extd_status,
 537         * [7:0] = compl_status
 538         */
 539        ctrl->mcc_tag_status[tag] = CQE_VALID_MASK;
 540        ctrl->mcc_tag_status[tag] |= (wrb_idx << CQE_STATUS_WRB_SHIFT);
 541        ctrl->mcc_tag_status[tag] |= (extd_status << CQE_STATUS_ADDL_SHIFT) &
 542                                     CQE_STATUS_ADDL_MASK;
 543        ctrl->mcc_tag_status[tag] |= (compl_status & CQE_STATUS_MASK);
 544
 545        if (test_bit(MCC_TAG_STATE_ASYNC, &ctrl->ptag_state[tag].tag_state)) {
 546                if (ctrl->ptag_state[tag].cbfn)
 547                        ctrl->ptag_state[tag].cbfn(phba, tag);
 548                else
 549                        __beiscsi_log(phba, KERN_ERR,
 550                                      "BC_%d : MBX ASYNC command with no callback\n");
 551                free_mcc_wrb(ctrl, tag);
 552                return 0;
 553        }
 554
 555        if (test_bit(MCC_TAG_STATE_IGNORE, &ctrl->ptag_state[tag].tag_state)) {
 556                /* just check completion status and free wrb */
 557                __beiscsi_mcc_compl_status(phba, tag, NULL, NULL);
 558                free_mcc_wrb(ctrl, tag);
 559                return 0;
 560        }
 561
 562        wake_up_interruptible(&ctrl->mcc_wait[tag]);
 563        return 0;
 564}
 565
 566void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag)
 567{
 568        struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
 569        u32 val = 0;
 570
 571        set_bit(MCC_TAG_STATE_RUNNING, &phba->ctrl.ptag_state[tag].tag_state);
 572        val |= mccq->id & DB_MCCQ_RING_ID_MASK;
 573        val |= 1 << DB_MCCQ_NUM_POSTED_SHIFT;
 574        /* make request available for DMA */
 575        wmb();
 576        iowrite32(val, phba->db_va + DB_MCCQ_OFFSET);
 577}
 578
 579/*
 580 * be_mbox_db_ready_poll()- Check ready status
 581 * @ctrl: Function specific MBX data structure
 582 *
 583 * Check for the ready status of FW to send BMBX
 584 * commands to adapter.
 585 *
 586 * return
 587 * Success: 0
 588 * Failure: Non-Zero
 589 **/
 590static int be_mbox_db_ready_poll(struct be_ctrl_info *ctrl)
 591{
 592        /* wait 30s for generic non-flash MBOX operation */
 593#define BEISCSI_MBX_RDY_BIT_TIMEOUT     30000
 594        void __iomem *db = ctrl->db + MPU_MAILBOX_DB_OFFSET;
 595        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
 596        unsigned long timeout;
 597        u32 ready;
 598
 599        /*
 600         * This BMBX busy wait path is used during init only.
 601         * For the commands executed during init, 5s should suffice.
 602         */
 603        timeout = jiffies + msecs_to_jiffies(BEISCSI_MBX_RDY_BIT_TIMEOUT);
 604        do {
 605                if (beiscsi_hba_in_error(phba))
 606                        return -EIO;
 607
 608                ready = ioread32(db);
 609                if (ready == 0xffffffff)
 610                        return -EIO;
 611
 612                ready &= MPU_MAILBOX_DB_RDY_MASK;
 613                if (ready)
 614                        return 0;
 615
 616                if (time_after(jiffies, timeout))
 617                        break;
 618                /* 1ms sleep is enough in most cases */
 619                schedule_timeout_uninterruptible(msecs_to_jiffies(1));
 620        } while (!ready);
 621
 622        beiscsi_log(phba, KERN_ERR,
 623                        BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
 624                        "BC_%d : FW Timed Out\n");
 625        set_bit(BEISCSI_HBA_FW_TIMEOUT, &phba->state);
 626        return -EBUSY;
 627}
 628
 629/*
 630 * be_mbox_notify: Notify adapter of new BMBX command
 631 * @ctrl: Function specific MBX data structure
 632 *
 633 * Ring doorbell to inform adapter of a BMBX command
 634 * to process
 635 *
 636 * return
 637 * Success: 0
 638 * Failure: Non-Zero
 639 **/
 640static int be_mbox_notify(struct be_ctrl_info *ctrl)
 641{
 642        int status;
 643        u32 val = 0;
 644        void __iomem *db = ctrl->db + MPU_MAILBOX_DB_OFFSET;
 645        struct be_dma_mem *mbox_mem = &ctrl->mbox_mem;
 646        struct be_mcc_mailbox *mbox = mbox_mem->va;
 647
 648        status = be_mbox_db_ready_poll(ctrl);
 649        if (status)
 650                return status;
 651
 652        val &= ~MPU_MAILBOX_DB_RDY_MASK;
 653        val |= MPU_MAILBOX_DB_HI_MASK;
 654        val |= (upper_32_bits(mbox_mem->dma) >> 2) << 2;
 655        iowrite32(val, db);
 656
 657        status = be_mbox_db_ready_poll(ctrl);
 658        if (status)
 659                return status;
 660
 661        val = 0;
 662        val &= ~MPU_MAILBOX_DB_RDY_MASK;
 663        val &= ~MPU_MAILBOX_DB_HI_MASK;
 664        val |= (u32) (mbox_mem->dma >> 4) << 2;
 665        iowrite32(val, db);
 666
 667        status = be_mbox_db_ready_poll(ctrl);
 668        if (status)
 669                return status;
 670
 671        /* RDY is set; small delay before CQE read. */
 672        udelay(1);
 673
 674        status = beiscsi_process_mbox_compl(ctrl, &mbox->compl);
 675        return status;
 676}
 677
 678void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, u32 payload_len,
 679                        bool embedded, u8 sge_cnt)
 680{
 681        if (embedded)
 682                wrb->emb_sgecnt_special |= MCC_WRB_EMBEDDED_MASK;
 683        else
 684                wrb->emb_sgecnt_special |= (sge_cnt & MCC_WRB_SGE_CNT_MASK) <<
 685                                           MCC_WRB_SGE_CNT_SHIFT;
 686        wrb->payload_length = payload_len;
 687        be_dws_cpu_to_le(wrb, 8);
 688}
 689
 690void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
 691                        u8 subsystem, u8 opcode, u32 cmd_len)
 692{
 693        req_hdr->opcode = opcode;
 694        req_hdr->subsystem = subsystem;
 695        req_hdr->request_length = cpu_to_le32(cmd_len - sizeof(*req_hdr));
 696        req_hdr->timeout = BEISCSI_FW_MBX_TIMEOUT;
 697}
 698
 699static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages,
 700                                                        struct be_dma_mem *mem)
 701{
 702        int i, buf_pages;
 703        u64 dma = (u64) mem->dma;
 704
 705        buf_pages = min(PAGES_4K_SPANNED(mem->va, mem->size), max_pages);
 706        for (i = 0; i < buf_pages; i++) {
 707                pages[i].lo = cpu_to_le32(dma & 0xFFFFFFFF);
 708                pages[i].hi = cpu_to_le32(upper_32_bits(dma));
 709                dma += PAGE_SIZE_4K;
 710        }
 711}
 712
 713static u32 eq_delay_to_mult(u32 usec_delay)
 714{
 715#define MAX_INTR_RATE 651042
 716        const u32 round = 10;
 717        u32 multiplier;
 718
 719        if (usec_delay == 0)
 720                multiplier = 0;
 721        else {
 722                u32 interrupt_rate = 1000000 / usec_delay;
 723                if (interrupt_rate == 0)
 724                        multiplier = 1023;
 725                else {
 726                        multiplier = (MAX_INTR_RATE - interrupt_rate) * round;
 727                        multiplier /= interrupt_rate;
 728                        multiplier = (multiplier + round / 2) / round;
 729                        multiplier = min(multiplier, (u32) 1023);
 730                }
 731        }
 732        return multiplier;
 733}
 734
 735struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem)
 736{
 737        return &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb;
 738}
 739
 740int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl,
 741                          struct be_queue_info *eq, int eq_delay)
 742{
 743        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
 744        struct be_cmd_req_eq_create *req = embedded_payload(wrb);
 745        struct be_cmd_resp_eq_create *resp = embedded_payload(wrb);
 746        struct be_dma_mem *q_mem = &eq->dma_mem;
 747        int status;
 748
 749        mutex_lock(&ctrl->mbox_lock);
 750        memset(wrb, 0, sizeof(*wrb));
 751
 752        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
 753
 754        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
 755                        OPCODE_COMMON_EQ_CREATE, sizeof(*req));
 756
 757        req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
 758
 759        AMAP_SET_BITS(struct amap_eq_context, func, req->context,
 760                                                PCI_FUNC(ctrl->pdev->devfn));
 761        AMAP_SET_BITS(struct amap_eq_context, valid, req->context, 1);
 762        AMAP_SET_BITS(struct amap_eq_context, size, req->context, 0);
 763        AMAP_SET_BITS(struct amap_eq_context, count, req->context,
 764                                        __ilog2_u32(eq->len / 256));
 765        AMAP_SET_BITS(struct amap_eq_context, delaymult, req->context,
 766                                        eq_delay_to_mult(eq_delay));
 767        be_dws_cpu_to_le(req->context, sizeof(req->context));
 768
 769        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
 770
 771        status = be_mbox_notify(ctrl);
 772        if (!status) {
 773                eq->id = le16_to_cpu(resp->eq_id);
 774                eq->created = true;
 775        }
 776        mutex_unlock(&ctrl->mbox_lock);
 777        return status;
 778}
 779
 780int beiscsi_cmd_cq_create(struct be_ctrl_info *ctrl,
 781                          struct be_queue_info *cq, struct be_queue_info *eq,
 782                          bool sol_evts, bool no_delay, int coalesce_wm)
 783{
 784        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
 785        struct be_cmd_req_cq_create *req = embedded_payload(wrb);
 786        struct be_cmd_resp_cq_create *resp = embedded_payload(wrb);
 787        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
 788        struct be_dma_mem *q_mem = &cq->dma_mem;
 789        void *ctxt = &req->context;
 790        int status;
 791
 792        mutex_lock(&ctrl->mbox_lock);
 793        memset(wrb, 0, sizeof(*wrb));
 794
 795        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
 796
 797        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
 798                        OPCODE_COMMON_CQ_CREATE, sizeof(*req));
 799
 800        req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
 801        if (is_chip_be2_be3r(phba)) {
 802                AMAP_SET_BITS(struct amap_cq_context, coalescwm,
 803                              ctxt, coalesce_wm);
 804                AMAP_SET_BITS(struct amap_cq_context, nodelay, ctxt, no_delay);
 805                AMAP_SET_BITS(struct amap_cq_context, count, ctxt,
 806                              __ilog2_u32(cq->len / 256));
 807                AMAP_SET_BITS(struct amap_cq_context, valid, ctxt, 1);
 808                AMAP_SET_BITS(struct amap_cq_context, solevent, ctxt, sol_evts);
 809                AMAP_SET_BITS(struct amap_cq_context, eventable, ctxt, 1);
 810                AMAP_SET_BITS(struct amap_cq_context, eqid, ctxt, eq->id);
 811                AMAP_SET_BITS(struct amap_cq_context, armed, ctxt, 1);
 812                AMAP_SET_BITS(struct amap_cq_context, func, ctxt,
 813                              PCI_FUNC(ctrl->pdev->devfn));
 814        } else {
 815                req->hdr.version = MBX_CMD_VER2;
 816                req->page_size = 1;
 817                AMAP_SET_BITS(struct amap_cq_context_v2, coalescwm,
 818                              ctxt, coalesce_wm);
 819                AMAP_SET_BITS(struct amap_cq_context_v2, nodelay,
 820                              ctxt, no_delay);
 821                AMAP_SET_BITS(struct amap_cq_context_v2, count, ctxt,
 822                              __ilog2_u32(cq->len / 256));
 823                AMAP_SET_BITS(struct amap_cq_context_v2, valid, ctxt, 1);
 824                AMAP_SET_BITS(struct amap_cq_context_v2, eventable, ctxt, 1);
 825                AMAP_SET_BITS(struct amap_cq_context_v2, eqid, ctxt, eq->id);
 826                AMAP_SET_BITS(struct amap_cq_context_v2, armed, ctxt, 1);
 827        }
 828
 829        be_dws_cpu_to_le(ctxt, sizeof(req->context));
 830
 831        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
 832
 833        status = be_mbox_notify(ctrl);
 834        if (!status) {
 835                cq->id = le16_to_cpu(resp->cq_id);
 836                cq->created = true;
 837        } else
 838                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
 839                            "BC_%d : In be_cmd_cq_create, status=ox%08x\n",
 840                            status);
 841
 842        mutex_unlock(&ctrl->mbox_lock);
 843
 844        return status;
 845}
 846
 847static u32 be_encoded_q_len(int q_len)
 848{
 849        u32 len_encoded = fls(q_len);   /* log2(len) + 1 */
 850        if (len_encoded == 16)
 851                len_encoded = 0;
 852        return len_encoded;
 853}
 854
 855int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba,
 856                        struct be_queue_info *mccq,
 857                        struct be_queue_info *cq)
 858{
 859        struct be_mcc_wrb *wrb;
 860        struct be_cmd_req_mcc_create_ext *req;
 861        struct be_dma_mem *q_mem = &mccq->dma_mem;
 862        struct be_ctrl_info *ctrl;
 863        void *ctxt;
 864        int status;
 865
 866        mutex_lock(&phba->ctrl.mbox_lock);
 867        ctrl = &phba->ctrl;
 868        wrb = wrb_from_mbox(&ctrl->mbox_mem);
 869        memset(wrb, 0, sizeof(*wrb));
 870        req = embedded_payload(wrb);
 871        ctxt = &req->context;
 872
 873        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
 874
 875        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
 876                        OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req));
 877
 878        req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
 879        req->async_evt_bitmap = 1 << ASYNC_EVENT_CODE_LINK_STATE;
 880        req->async_evt_bitmap |= 1 << ASYNC_EVENT_CODE_ISCSI;
 881        req->async_evt_bitmap |= 1 << ASYNC_EVENT_CODE_SLI;
 882
 883        AMAP_SET_BITS(struct amap_mcc_context, fid, ctxt,
 884                      PCI_FUNC(phba->pcidev->devfn));
 885        AMAP_SET_BITS(struct amap_mcc_context, valid, ctxt, 1);
 886        AMAP_SET_BITS(struct amap_mcc_context, ring_size, ctxt,
 887                be_encoded_q_len(mccq->len));
 888        AMAP_SET_BITS(struct amap_mcc_context, cq_id, ctxt, cq->id);
 889
 890        be_dws_cpu_to_le(ctxt, sizeof(req->context));
 891
 892        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
 893
 894        status = be_mbox_notify(ctrl);
 895        if (!status) {
 896                struct be_cmd_resp_mcc_create *resp = embedded_payload(wrb);
 897                mccq->id = le16_to_cpu(resp->id);
 898                mccq->created = true;
 899        }
 900        mutex_unlock(&phba->ctrl.mbox_lock);
 901
 902        return status;
 903}
 904
 905int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
 906                          int queue_type)
 907{
 908        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
 909        struct be_cmd_req_q_destroy *req = embedded_payload(wrb);
 910        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
 911        u8 subsys = 0, opcode = 0;
 912        int status;
 913
 914        beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
 915                    "BC_%d : In beiscsi_cmd_q_destroy "
 916                    "queue_type : %d\n", queue_type);
 917
 918        mutex_lock(&ctrl->mbox_lock);
 919        memset(wrb, 0, sizeof(*wrb));
 920        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
 921
 922        switch (queue_type) {
 923        case QTYPE_EQ:
 924                subsys = CMD_SUBSYSTEM_COMMON;
 925                opcode = OPCODE_COMMON_EQ_DESTROY;
 926                break;
 927        case QTYPE_CQ:
 928                subsys = CMD_SUBSYSTEM_COMMON;
 929                opcode = OPCODE_COMMON_CQ_DESTROY;
 930                break;
 931        case QTYPE_MCCQ:
 932                subsys = CMD_SUBSYSTEM_COMMON;
 933                opcode = OPCODE_COMMON_MCC_DESTROY;
 934                break;
 935        case QTYPE_WRBQ:
 936                subsys = CMD_SUBSYSTEM_ISCSI;
 937                opcode = OPCODE_COMMON_ISCSI_WRBQ_DESTROY;
 938                break;
 939        case QTYPE_DPDUQ:
 940                subsys = CMD_SUBSYSTEM_ISCSI;
 941                opcode = OPCODE_COMMON_ISCSI_DEFQ_DESTROY;
 942                break;
 943        case QTYPE_SGL:
 944                subsys = CMD_SUBSYSTEM_ISCSI;
 945                opcode = OPCODE_COMMON_ISCSI_CFG_REMOVE_SGL_PAGES;
 946                break;
 947        default:
 948                mutex_unlock(&ctrl->mbox_lock);
 949                BUG();
 950        }
 951        be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req));
 952        if (queue_type != QTYPE_SGL)
 953                req->id = cpu_to_le16(q->id);
 954
 955        status = be_mbox_notify(ctrl);
 956
 957        mutex_unlock(&ctrl->mbox_lock);
 958        return status;
 959}
 960
 961/**
 962 * be_cmd_create_default_pdu_queue()- Create DEFQ for the adapter
 963 * @ctrl: ptr to ctrl_info
 964 * @cq: Completion Queue
 965 * @dq: Default Queue
 966 * @lenght: ring size
 967 * @entry_size: size of each entry in DEFQ
 968 * @is_header: Header or Data DEFQ
 969 * @ulp_num: Bind to which ULP
 970 *
 971 * Create HDR/Data DEFQ for the passed ULP. Unsol PDU are posted
 972 * on this queue by the FW
 973 *
 974 * return
 975 *      Success: 0
 976 *      Failure: Non-Zero Value
 977 *
 978 **/
 979int be_cmd_create_default_pdu_queue(struct be_ctrl_info *ctrl,
 980                                    struct be_queue_info *cq,
 981                                    struct be_queue_info *dq, int length,
 982                                    int entry_size, uint8_t is_header,
 983                                    uint8_t ulp_num)
 984{
 985        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
 986        struct be_defq_create_req *req = embedded_payload(wrb);
 987        struct be_dma_mem *q_mem = &dq->dma_mem;
 988        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
 989        void *ctxt = &req->context;
 990        int status;
 991
 992        mutex_lock(&ctrl->mbox_lock);
 993        memset(wrb, 0, sizeof(*wrb));
 994
 995        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
 996
 997        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
 998                           OPCODE_COMMON_ISCSI_DEFQ_CREATE, sizeof(*req));
 999
1000        req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
1001        if (phba->fw_config.dual_ulp_aware) {
1002                req->ulp_num = ulp_num;
1003                req->dua_feature |= (1 << BEISCSI_DUAL_ULP_AWARE_BIT);
1004                req->dua_feature |= (1 << BEISCSI_BIND_Q_TO_ULP_BIT);
1005        }
1006
1007        if (is_chip_be2_be3r(phba)) {
1008                AMAP_SET_BITS(struct amap_be_default_pdu_context,
1009                              rx_pdid, ctxt, 0);
1010                AMAP_SET_BITS(struct amap_be_default_pdu_context,
1011                              rx_pdid_valid, ctxt, 1);
1012                AMAP_SET_BITS(struct amap_be_default_pdu_context,
1013                              pci_func_id, ctxt, PCI_FUNC(ctrl->pdev->devfn));
1014                AMAP_SET_BITS(struct amap_be_default_pdu_context,
1015                              ring_size, ctxt,
1016                              be_encoded_q_len(length /
1017                              sizeof(struct phys_addr)));
1018                AMAP_SET_BITS(struct amap_be_default_pdu_context,
1019                              default_buffer_size, ctxt, entry_size);
1020                AMAP_SET_BITS(struct amap_be_default_pdu_context,
1021                              cq_id_recv, ctxt, cq->id);
1022        } else {
1023                AMAP_SET_BITS(struct amap_default_pdu_context_ext,
1024                              rx_pdid, ctxt, 0);
1025                AMAP_SET_BITS(struct amap_default_pdu_context_ext,
1026                              rx_pdid_valid, ctxt, 1);
1027                AMAP_SET_BITS(struct amap_default_pdu_context_ext,
1028                              ring_size, ctxt,
1029                              be_encoded_q_len(length /
1030                              sizeof(struct phys_addr)));
1031                AMAP_SET_BITS(struct amap_default_pdu_context_ext,
1032                              default_buffer_size, ctxt, entry_size);
1033                AMAP_SET_BITS(struct amap_default_pdu_context_ext,
1034                              cq_id_recv, ctxt, cq->id);
1035        }
1036
1037        be_dws_cpu_to_le(ctxt, sizeof(req->context));
1038
1039        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1040
1041        status = be_mbox_notify(ctrl);
1042        if (!status) {
1043                struct be_ring *defq_ring;
1044                struct be_defq_create_resp *resp = embedded_payload(wrb);
1045
1046                dq->id = le16_to_cpu(resp->id);
1047                dq->created = true;
1048                if (is_header)
1049                        defq_ring = &phba->phwi_ctrlr->default_pdu_hdr[ulp_num];
1050                else
1051                        defq_ring = &phba->phwi_ctrlr->
1052                                    default_pdu_data[ulp_num];
1053
1054                defq_ring->id = dq->id;
1055
1056                if (!phba->fw_config.dual_ulp_aware) {
1057                        defq_ring->ulp_num = BEISCSI_ULP0;
1058                        defq_ring->doorbell_offset = DB_RXULP0_OFFSET;
1059                } else {
1060                        defq_ring->ulp_num = resp->ulp_num;
1061                        defq_ring->doorbell_offset = resp->doorbell_offset;
1062                }
1063        }
1064        mutex_unlock(&ctrl->mbox_lock);
1065
1066        return status;
1067}
1068
1069/**
1070 * be_cmd_wrbq_create()- Create WRBQ
1071 * @ctrl: ptr to ctrl_info
1072 * @q_mem: memory details for the queue
1073 * @wrbq: queue info
1074 * @pwrb_context: ptr to wrb_context
1075 * @ulp_num: ULP on which the WRBQ is to be created
1076 *
1077 * Create WRBQ on the passed ULP_NUM.
1078 *
1079 **/
1080int be_cmd_wrbq_create(struct be_ctrl_info *ctrl,
1081                        struct be_dma_mem *q_mem,
1082                        struct be_queue_info *wrbq,
1083                        struct hwi_wrb_context *pwrb_context,
1084                        uint8_t ulp_num)
1085{
1086        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
1087        struct be_wrbq_create_req *req = embedded_payload(wrb);
1088        struct be_wrbq_create_resp *resp = embedded_payload(wrb);
1089        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
1090        int status;
1091
1092        mutex_lock(&ctrl->mbox_lock);
1093        memset(wrb, 0, sizeof(*wrb));
1094
1095        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1096
1097        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
1098                OPCODE_COMMON_ISCSI_WRBQ_CREATE, sizeof(*req));
1099        req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
1100
1101        if (phba->fw_config.dual_ulp_aware) {
1102                req->ulp_num = ulp_num;
1103                req->dua_feature |= (1 << BEISCSI_DUAL_ULP_AWARE_BIT);
1104                req->dua_feature |= (1 << BEISCSI_BIND_Q_TO_ULP_BIT);
1105        }
1106
1107        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1108
1109        status = be_mbox_notify(ctrl);
1110        if (!status) {
1111                wrbq->id = le16_to_cpu(resp->cid);
1112                wrbq->created = true;
1113
1114                pwrb_context->cid = wrbq->id;
1115                if (!phba->fw_config.dual_ulp_aware) {
1116                        pwrb_context->doorbell_offset = DB_TXULP0_OFFSET;
1117                        pwrb_context->ulp_num = BEISCSI_ULP0;
1118                } else {
1119                        pwrb_context->ulp_num = resp->ulp_num;
1120                        pwrb_context->doorbell_offset = resp->doorbell_offset;
1121                }
1122        }
1123        mutex_unlock(&ctrl->mbox_lock);
1124        return status;
1125}
1126
1127int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl,
1128                                    struct be_dma_mem *q_mem)
1129{
1130        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
1131        struct be_post_template_pages_req *req = embedded_payload(wrb);
1132        int status;
1133
1134        mutex_lock(&ctrl->mbox_lock);
1135
1136        memset(wrb, 0, sizeof(*wrb));
1137        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1138        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1139                           OPCODE_COMMON_ADD_TEMPLATE_HEADER_BUFFERS,
1140                           sizeof(*req));
1141
1142        req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
1143        req->type = BEISCSI_TEMPLATE_HDR_TYPE_ISCSI;
1144        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1145
1146        status = be_mbox_notify(ctrl);
1147        mutex_unlock(&ctrl->mbox_lock);
1148        return status;
1149}
1150
1151int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl)
1152{
1153        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
1154        struct be_remove_template_pages_req *req = embedded_payload(wrb);
1155        int status;
1156
1157        mutex_lock(&ctrl->mbox_lock);
1158
1159        memset(wrb, 0, sizeof(*wrb));
1160        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1161        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1162                           OPCODE_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS,
1163                           sizeof(*req));
1164
1165        req->type = BEISCSI_TEMPLATE_HDR_TYPE_ISCSI;
1166
1167        status = be_mbox_notify(ctrl);
1168        mutex_unlock(&ctrl->mbox_lock);
1169        return status;
1170}
1171
1172int be_cmd_iscsi_post_sgl_pages(struct be_ctrl_info *ctrl,
1173                                struct be_dma_mem *q_mem,
1174                                u32 page_offset, u32 num_pages)
1175{
1176        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
1177        struct be_post_sgl_pages_req *req = embedded_payload(wrb);
1178        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
1179        int status;
1180        unsigned int curr_pages;
1181        u32 internal_page_offset = 0;
1182        u32 temp_num_pages = num_pages;
1183
1184        if (num_pages == 0xff)
1185                num_pages = 1;
1186
1187        mutex_lock(&ctrl->mbox_lock);
1188        do {
1189                memset(wrb, 0, sizeof(*wrb));
1190                be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1191                be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
1192                                   OPCODE_COMMON_ISCSI_CFG_POST_SGL_PAGES,
1193                                   sizeof(*req));
1194                curr_pages = BE_NUMBER_OF_FIELD(struct be_post_sgl_pages_req,
1195                                                pages);
1196                req->num_pages = min(num_pages, curr_pages);
1197                req->page_offset = page_offset;
1198                be_cmd_page_addrs_prepare(req->pages, req->num_pages, q_mem);
1199                q_mem->dma = q_mem->dma + (req->num_pages * PAGE_SIZE);
1200                internal_page_offset += req->num_pages;
1201                page_offset += req->num_pages;
1202                num_pages -= req->num_pages;
1203
1204                if (temp_num_pages == 0xff)
1205                        req->num_pages = temp_num_pages;
1206
1207                status = be_mbox_notify(ctrl);
1208                if (status) {
1209                        beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1210                                    "BC_%d : FW CMD to map iscsi frags failed.\n");
1211
1212                        goto error;
1213                }
1214        } while (num_pages > 0);
1215error:
1216        mutex_unlock(&ctrl->mbox_lock);
1217        if (status != 0)
1218                beiscsi_cmd_q_destroy(ctrl, NULL, QTYPE_SGL);
1219        return status;
1220}
1221
1222/**
1223 * be_cmd_set_vlan()- Configure VLAN paramters on the adapter
1224 * @phba: device priv structure instance
1225 * @vlan_tag: TAG to be set
1226 *
1227 * Set the VLAN_TAG for the adapter or Disable VLAN on adapter
1228 *
1229 * returns
1230 *      TAG for the MBX Cmd
1231 * **/
1232int be_cmd_set_vlan(struct beiscsi_hba *phba,
1233                     uint16_t vlan_tag)
1234{
1235        unsigned int tag;
1236        struct be_mcc_wrb *wrb;
1237        struct be_cmd_set_vlan_req *req;
1238        struct be_ctrl_info *ctrl = &phba->ctrl;
1239
1240        if (mutex_lock_interruptible(&ctrl->mbox_lock))
1241                return 0;
1242        wrb = alloc_mcc_wrb(phba, &tag);
1243        if (!wrb) {
1244                mutex_unlock(&ctrl->mbox_lock);
1245                return 0;
1246        }
1247
1248        req = embedded_payload(wrb);
1249        be_wrb_hdr_prepare(wrb, sizeof(*wrb), true, 0);
1250        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
1251                           OPCODE_COMMON_ISCSI_NTWK_SET_VLAN,
1252                           sizeof(*req));
1253
1254        req->interface_hndl = phba->interface_handle;
1255        req->vlan_priority = vlan_tag;
1256
1257        be_mcc_notify(phba, tag);
1258        mutex_unlock(&ctrl->mbox_lock);
1259
1260        return tag;
1261}
1262
1263int beiscsi_check_supported_fw(struct be_ctrl_info *ctrl,
1264                               struct beiscsi_hba *phba)
1265{
1266        struct be_dma_mem nonemb_cmd;
1267        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
1268        struct be_mgmt_controller_attributes *req;
1269        struct be_sge *sge = nonembedded_sgl(wrb);
1270        int status = 0;
1271
1272        nonemb_cmd.va = pci_alloc_consistent(ctrl->pdev,
1273                                sizeof(struct be_mgmt_controller_attributes),
1274                                &nonemb_cmd.dma);
1275        if (nonemb_cmd.va == NULL) {
1276                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1277                            "BG_%d : pci_alloc_consistent failed in %s\n",
1278                            __func__);
1279                return -ENOMEM;
1280        }
1281        nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes);
1282        req = nonemb_cmd.va;
1283        memset(req, 0, sizeof(*req));
1284        mutex_lock(&ctrl->mbox_lock);
1285        memset(wrb, 0, sizeof(*wrb));
1286        be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
1287        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1288                           OPCODE_COMMON_GET_CNTL_ATTRIBUTES, sizeof(*req));
1289        sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd.dma));
1290        sge->pa_lo = cpu_to_le32(nonemb_cmd.dma & 0xFFFFFFFF);
1291        sge->len = cpu_to_le32(nonemb_cmd.size);
1292        status = be_mbox_notify(ctrl);
1293        if (!status) {
1294                struct be_mgmt_controller_attributes_resp *resp = nonemb_cmd.va;
1295
1296                beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
1297                            "BG_%d : Firmware Version of CMD : %s\n"
1298                            "Firmware Version is : %s\n"
1299                            "Developer Build, not performing version check...\n",
1300                            resp->params.hba_attribs
1301                            .flashrom_version_string,
1302                            resp->params.hba_attribs.
1303                            firmware_version_string);
1304
1305                phba->fw_config.iscsi_features =
1306                                resp->params.hba_attribs.iscsi_features;
1307                beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
1308                            "BM_%d : phba->fw_config.iscsi_features = %d\n",
1309                            phba->fw_config.iscsi_features);
1310                memcpy(phba->fw_ver_str, resp->params.hba_attribs.
1311                       firmware_version_string, BEISCSI_VER_STRLEN);
1312        } else
1313                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1314                            "BG_%d :  Failed in beiscsi_check_supported_fw\n");
1315        mutex_unlock(&ctrl->mbox_lock);
1316        if (nonemb_cmd.va)
1317                pci_free_consistent(ctrl->pdev, nonemb_cmd.size,
1318                                    nonemb_cmd.va, nonemb_cmd.dma);
1319
1320        return status;
1321}
1322
1323/**
1324 * beiscsi_get_fw_config()- Get the FW config for the function
1325 * @ctrl: ptr to Ctrl Info
1326 * @phba: ptr to the dev priv structure
1327 *
1328 * Get the FW config and resources available for the function.
1329 * The resources are created based on the count received here.
1330 *
1331 * return
1332 *      Success: 0
1333 *      Failure: Non-Zero Value
1334 **/
1335int beiscsi_get_fw_config(struct be_ctrl_info *ctrl,
1336                          struct beiscsi_hba *phba)
1337{
1338        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
1339        struct be_fw_cfg *pfw_cfg = embedded_payload(wrb);
1340        uint32_t cid_count, icd_count;
1341        int status = -EINVAL;
1342        uint8_t ulp_num = 0;
1343
1344        mutex_lock(&ctrl->mbox_lock);
1345        memset(wrb, 0, sizeof(*wrb));
1346        be_wrb_hdr_prepare(wrb, sizeof(*pfw_cfg), true, 0);
1347
1348        be_cmd_hdr_prepare(&pfw_cfg->hdr, CMD_SUBSYSTEM_COMMON,
1349                           OPCODE_COMMON_QUERY_FIRMWARE_CONFIG,
1350                           EMBED_MBX_MAX_PAYLOAD_SIZE);
1351
1352        if (be_mbox_notify(ctrl)) {
1353                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1354                            "BG_%d : Failed in beiscsi_get_fw_config\n");
1355                goto fail_init;
1356        }
1357
1358        /* FW response formats depend on port id */
1359        phba->fw_config.phys_port = pfw_cfg->phys_port;
1360        if (phba->fw_config.phys_port >= BEISCSI_PHYS_PORT_MAX) {
1361                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1362                            "BG_%d : invalid physical port id %d\n",
1363                            phba->fw_config.phys_port);
1364                goto fail_init;
1365        }
1366
1367        /* populate and check FW config against min and max values */
1368        if (!is_chip_be2_be3r(phba)) {
1369                phba->fw_config.eqid_count = pfw_cfg->eqid_count;
1370                phba->fw_config.cqid_count = pfw_cfg->cqid_count;
1371                if (phba->fw_config.eqid_count == 0 ||
1372                    phba->fw_config.eqid_count > 2048) {
1373                        beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1374                                    "BG_%d : invalid EQ count %d\n",
1375                                    phba->fw_config.eqid_count);
1376                        goto fail_init;
1377                }
1378                if (phba->fw_config.cqid_count == 0 ||
1379                    phba->fw_config.cqid_count > 4096) {
1380                        beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1381                                    "BG_%d : invalid CQ count %d\n",
1382                                    phba->fw_config.cqid_count);
1383                        goto fail_init;
1384                }
1385                beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
1386                            "BG_%d : EQ_Count : %d CQ_Count : %d\n",
1387                            phba->fw_config.eqid_count,
1388                            phba->fw_config.cqid_count);
1389        }
1390
1391        /**
1392         * Check on which all ULP iSCSI Protocol is loaded.
1393         * Set the Bit for those ULP. This set flag is used
1394         * at all places in the code to check on which ULP
1395         * iSCSi Protocol is loaded
1396         **/
1397        for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
1398                if (pfw_cfg->ulp[ulp_num].ulp_mode &
1399                    BEISCSI_ULP_ISCSI_INI_MODE) {
1400                        set_bit(ulp_num, &phba->fw_config.ulp_supported);
1401
1402                        /* Get the CID, ICD and Chain count for each ULP */
1403                        phba->fw_config.iscsi_cid_start[ulp_num] =
1404                                pfw_cfg->ulp[ulp_num].sq_base;
1405                        phba->fw_config.iscsi_cid_count[ulp_num] =
1406                                pfw_cfg->ulp[ulp_num].sq_count;
1407
1408                        phba->fw_config.iscsi_icd_start[ulp_num] =
1409                                pfw_cfg->ulp[ulp_num].icd_base;
1410                        phba->fw_config.iscsi_icd_count[ulp_num] =
1411                                pfw_cfg->ulp[ulp_num].icd_count;
1412
1413                        phba->fw_config.iscsi_chain_start[ulp_num] =
1414                                pfw_cfg->chain_icd[ulp_num].chain_base;
1415                        phba->fw_config.iscsi_chain_count[ulp_num] =
1416                                pfw_cfg->chain_icd[ulp_num].chain_count;
1417
1418                        beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
1419                                    "BG_%d : Function loaded on ULP : %d\n"
1420                                    "\tiscsi_cid_count : %d\n"
1421                                    "\tiscsi_cid_start : %d\n"
1422                                    "\t iscsi_icd_count : %d\n"
1423                                    "\t iscsi_icd_start : %d\n",
1424                                    ulp_num,
1425                                    phba->fw_config.
1426                                    iscsi_cid_count[ulp_num],
1427                                    phba->fw_config.
1428                                    iscsi_cid_start[ulp_num],
1429                                    phba->fw_config.
1430                                    iscsi_icd_count[ulp_num],
1431                                    phba->fw_config.
1432                                    iscsi_icd_start[ulp_num]);
1433                }
1434        }
1435
1436        if (phba->fw_config.ulp_supported == 0) {
1437                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1438                            "BG_%d : iSCSI initiator mode not set: ULP0 %x ULP1 %x\n",
1439                            pfw_cfg->ulp[BEISCSI_ULP0].ulp_mode,
1440                            pfw_cfg->ulp[BEISCSI_ULP1].ulp_mode);
1441                goto fail_init;
1442        }
1443
1444        /**
1445         * ICD is shared among ULPs. Use icd_count of any one loaded ULP
1446         **/
1447        for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++)
1448                if (test_bit(ulp_num, &phba->fw_config.ulp_supported))
1449                        break;
1450        icd_count = phba->fw_config.iscsi_icd_count[ulp_num];
1451        if (icd_count == 0 || icd_count > 65536) {
1452                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1453                            "BG_%d: invalid ICD count %d\n", icd_count);
1454                goto fail_init;
1455        }
1456
1457        cid_count = BEISCSI_GET_CID_COUNT(phba, BEISCSI_ULP0) +
1458                    BEISCSI_GET_CID_COUNT(phba, BEISCSI_ULP1);
1459        if (cid_count == 0 || cid_count > 4096) {
1460                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1461                            "BG_%d: invalid CID count %d\n", cid_count);
1462                goto fail_init;
1463        }
1464
1465        /**
1466         * Check FW is dual ULP aware i.e. can handle either
1467         * of the protocols.
1468         */
1469        phba->fw_config.dual_ulp_aware = (pfw_cfg->function_mode &
1470                                          BEISCSI_FUNC_DUA_MODE);
1471
1472        beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
1473                    "BG_%d : DUA Mode : 0x%x\n",
1474                    phba->fw_config.dual_ulp_aware);
1475
1476        /* all set, continue using this FW config */
1477        status = 0;
1478fail_init:
1479        mutex_unlock(&ctrl->mbox_lock);
1480        return status;
1481}
1482
1483/**
1484 * beiscsi_get_port_name()- Get port name for the function
1485 * @ctrl: ptr to Ctrl Info
1486 * @phba: ptr to the dev priv structure
1487 *
1488 * Get the alphanumeric character for port
1489 *
1490 **/
1491int beiscsi_get_port_name(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba)
1492{
1493        int ret = 0;
1494        struct be_mcc_wrb *wrb;
1495        struct be_cmd_get_port_name *ioctl;
1496
1497        mutex_lock(&ctrl->mbox_lock);
1498        wrb = wrb_from_mbox(&ctrl->mbox_mem);
1499        memset(wrb, 0, sizeof(*wrb));
1500        ioctl = embedded_payload(wrb);
1501
1502        be_wrb_hdr_prepare(wrb, sizeof(*ioctl), true, 0);
1503        be_cmd_hdr_prepare(&ioctl->h.req_hdr, CMD_SUBSYSTEM_COMMON,
1504                           OPCODE_COMMON_GET_PORT_NAME,
1505                           EMBED_MBX_MAX_PAYLOAD_SIZE);
1506        ret = be_mbox_notify(ctrl);
1507        phba->port_name = 0;
1508        if (!ret) {
1509                phba->port_name = ioctl->p.resp.port_names >>
1510                                  (phba->fw_config.phys_port * 8) & 0xff;
1511        } else {
1512                beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
1513                            "BG_%d : GET_PORT_NAME ret 0x%x status 0x%x\n",
1514                            ret, ioctl->h.resp_hdr.status);
1515        }
1516
1517        if (phba->port_name == 0)
1518                phba->port_name = '?';
1519
1520        mutex_unlock(&ctrl->mbox_lock);
1521        return ret;
1522}
1523
1524int beiscsi_set_host_data(struct beiscsi_hba *phba)
1525{
1526        struct be_ctrl_info *ctrl = &phba->ctrl;
1527        struct be_cmd_set_host_data *ioctl;
1528        struct be_mcc_wrb *wrb;
1529        int ret = 0;
1530
1531        if (is_chip_be2_be3r(phba))
1532                return ret;
1533
1534        mutex_lock(&ctrl->mbox_lock);
1535        wrb = wrb_from_mbox(&ctrl->mbox_mem);
1536        memset(wrb, 0, sizeof(*wrb));
1537        ioctl = embedded_payload(wrb);
1538
1539        be_wrb_hdr_prepare(wrb, sizeof(*ioctl), true, 0);
1540        be_cmd_hdr_prepare(&ioctl->h.req_hdr, CMD_SUBSYSTEM_COMMON,
1541                           OPCODE_COMMON_SET_HOST_DATA,
1542                           EMBED_MBX_MAX_PAYLOAD_SIZE);
1543        ioctl->param.req.param_id = BE_CMD_SET_HOST_PARAM_ID;
1544        ioctl->param.req.param_len =
1545                snprintf((char *)ioctl->param.req.param_data,
1546                         sizeof(ioctl->param.req.param_data),
1547                         "Linux iSCSI v%s", BUILD_STR);
1548        ioctl->param.req.param_len = ALIGN(ioctl->param.req.param_len, 4);
1549        if (ioctl->param.req.param_len > BE_CMD_MAX_DRV_VERSION)
1550                ioctl->param.req.param_len = BE_CMD_MAX_DRV_VERSION;
1551        ret = be_mbox_notify(ctrl);
1552        if (!ret) {
1553                beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
1554                            "BG_%d : HBA set host driver version\n");
1555        } else {
1556                /**
1557                 * Check "MCC_STATUS_INVALID_LENGTH" for SKH.
1558                 * Older FW versions return this error.
1559                 */
1560                if (ret == MCC_STATUS_ILLEGAL_REQUEST ||
1561                                ret == MCC_STATUS_INVALID_LENGTH)
1562                        __beiscsi_log(phba, KERN_INFO,
1563                                      "BG_%d : HBA failed to set host driver version\n");
1564        }
1565
1566        mutex_unlock(&ctrl->mbox_lock);
1567        return ret;
1568}
1569
1570int beiscsi_set_uer_feature(struct beiscsi_hba *phba)
1571{
1572        struct be_ctrl_info *ctrl = &phba->ctrl;
1573        struct be_cmd_set_features *ioctl;
1574        struct be_mcc_wrb *wrb;
1575        int ret = 0;
1576
1577        mutex_lock(&ctrl->mbox_lock);
1578        wrb = wrb_from_mbox(&ctrl->mbox_mem);
1579        memset(wrb, 0, sizeof(*wrb));
1580        ioctl = embedded_payload(wrb);
1581
1582        be_wrb_hdr_prepare(wrb, sizeof(*ioctl), true, 0);
1583        be_cmd_hdr_prepare(&ioctl->h.req_hdr, CMD_SUBSYSTEM_COMMON,
1584                           OPCODE_COMMON_SET_FEATURES,
1585                           EMBED_MBX_MAX_PAYLOAD_SIZE);
1586        ioctl->feature = BE_CMD_SET_FEATURE_UER;
1587        ioctl->param_len = sizeof(ioctl->param.req);
1588        ioctl->param.req.uer = BE_CMD_UER_SUPP_BIT;
1589        ret = be_mbox_notify(ctrl);
1590        if (!ret) {
1591                phba->ue2rp = ioctl->param.resp.ue2rp;
1592                set_bit(BEISCSI_HBA_UER_SUPP, &phba->state);
1593                beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
1594                            "BG_%d : HBA error recovery supported\n");
1595        } else {
1596                /**
1597                 * Check "MCC_STATUS_INVALID_LENGTH" for SKH.
1598                 * Older FW versions return this error.
1599                 */
1600                if (ret == MCC_STATUS_ILLEGAL_REQUEST ||
1601                    ret == MCC_STATUS_INVALID_LENGTH)
1602                        __beiscsi_log(phba, KERN_INFO,
1603                                      "BG_%d : HBA error recovery not supported\n");
1604        }
1605
1606        mutex_unlock(&ctrl->mbox_lock);
1607        return ret;
1608}
1609
1610static u32 beiscsi_get_post_stage(struct beiscsi_hba *phba)
1611{
1612        u32 sem;
1613
1614        if (is_chip_be2_be3r(phba))
1615                sem = ioread32(phba->csr_va + SLIPORT_SEMAPHORE_OFFSET_BEx);
1616        else
1617                pci_read_config_dword(phba->pcidev,
1618                                      SLIPORT_SEMAPHORE_OFFSET_SH, &sem);
1619        return sem;
1620}
1621
1622int beiscsi_check_fw_rdy(struct beiscsi_hba *phba)
1623{
1624        u32 loop, post, rdy = 0;
1625
1626        loop = 1000;
1627        while (loop--) {
1628                post = beiscsi_get_post_stage(phba);
1629                if (post & POST_ERROR_BIT)
1630                        break;
1631                if ((post & POST_STAGE_MASK) == POST_STAGE_ARMFW_RDY) {
1632                        rdy = 1;
1633                        break;
1634                }
1635                msleep(60);
1636        }
1637
1638        if (!rdy) {
1639                __beiscsi_log(phba, KERN_ERR,
1640                              "BC_%d : FW not ready 0x%x\n", post);
1641        }
1642
1643        return rdy;
1644}
1645
1646int beiscsi_cmd_function_reset(struct beiscsi_hba *phba)
1647{
1648        struct be_ctrl_info *ctrl = &phba->ctrl;
1649        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
1650        struct be_post_sgl_pages_req *req;
1651        int status;
1652
1653        mutex_lock(&ctrl->mbox_lock);
1654
1655        req = embedded_payload(wrb);
1656        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1657        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1658                           OPCODE_COMMON_FUNCTION_RESET, sizeof(*req));
1659        status = be_mbox_notify(ctrl);
1660
1661        mutex_unlock(&ctrl->mbox_lock);
1662        return status;
1663}
1664
1665int beiscsi_cmd_special_wrb(struct be_ctrl_info *ctrl, u32 load)
1666{
1667        struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
1668        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
1669        u8 *endian_check;
1670        int status;
1671
1672        mutex_lock(&ctrl->mbox_lock);
1673        memset(wrb, 0, sizeof(*wrb));
1674
1675        endian_check = (u8 *) wrb;
1676        if (load) {
1677                /* to start communicating */
1678                *endian_check++ = 0xFF;
1679                *endian_check++ = 0x12;
1680                *endian_check++ = 0x34;
1681                *endian_check++ = 0xFF;
1682                *endian_check++ = 0xFF;
1683                *endian_check++ = 0x56;
1684                *endian_check++ = 0x78;
1685                *endian_check++ = 0xFF;
1686        } else {
1687                /* to stop communicating */
1688                *endian_check++ = 0xFF;
1689                *endian_check++ = 0xAA;
1690                *endian_check++ = 0xBB;
1691                *endian_check++ = 0xFF;
1692                *endian_check++ = 0xFF;
1693                *endian_check++ = 0xCC;
1694                *endian_check++ = 0xDD;
1695                *endian_check = 0xFF;
1696        }
1697        be_dws_cpu_to_le(wrb, sizeof(*wrb));
1698
1699        status = be_mbox_notify(ctrl);
1700        if (status)
1701                beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
1702                            "BC_%d : special WRB message failed\n");
1703        mutex_unlock(&ctrl->mbox_lock);
1704        return status;
1705}
1706
1707int beiscsi_init_sliport(struct beiscsi_hba *phba)
1708{
1709        int status;
1710
1711        /* check POST stage before talking to FW */
1712        status = beiscsi_check_fw_rdy(phba);
1713        if (!status)
1714                return -EIO;
1715
1716        /* clear all error states after checking FW rdy */
1717        phba->state &= ~BEISCSI_HBA_IN_ERR;
1718
1719        /* check again UER support */
1720        phba->state &= ~BEISCSI_HBA_UER_SUPP;
1721
1722        /*
1723         * SLI COMMON_FUNCTION_RESET completion is indicated by BMBX RDY bit.
1724         * It should clean up any stale info in FW for this fn.
1725         */
1726        status = beiscsi_cmd_function_reset(phba);
1727        if (status) {
1728                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
1729                            "BC_%d : SLI Function Reset failed\n");
1730                return status;
1731        }
1732
1733        /* indicate driver is loading */
1734        return beiscsi_cmd_special_wrb(&phba->ctrl, 1);
1735}
1736
1737/**
1738 * beiscsi_cmd_iscsi_cleanup()- Inform FW to cleanup EP data structures.
1739 * @phba: pointer to dev priv structure
1740 * @ulp: ULP number.
1741 *
1742 * return
1743 *      Success: 0
1744 *      Failure: Non-Zero Value
1745 **/
1746int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp)
1747{
1748        struct be_ctrl_info *ctrl = &phba->ctrl;
1749        struct iscsi_cleanup_req_v1 *req_v1;
1750        struct iscsi_cleanup_req *req;
1751        u16 hdr_ring_id, data_ring_id;
1752        struct be_mcc_wrb *wrb;
1753        int status;
1754
1755        mutex_lock(&ctrl->mbox_lock);
1756        wrb = wrb_from_mbox(&ctrl->mbox_mem);
1757
1758        hdr_ring_id = HWI_GET_DEF_HDRQ_ID(phba, ulp);
1759        data_ring_id = HWI_GET_DEF_BUFQ_ID(phba, ulp);
1760        if (is_chip_be2_be3r(phba)) {
1761                req = embedded_payload(wrb);
1762                be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1763                be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
1764                                   OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req));
1765                req->chute = (1 << ulp);
1766                /* BE2/BE3 FW creates 8-bit ring id */
1767                req->hdr_ring_id = hdr_ring_id;
1768                req->data_ring_id = data_ring_id;
1769        } else {
1770                req_v1 = embedded_payload(wrb);
1771                be_wrb_hdr_prepare(wrb, sizeof(*req_v1), true, 0);
1772                be_cmd_hdr_prepare(&req_v1->hdr, CMD_SUBSYSTEM_ISCSI,
1773                                   OPCODE_COMMON_ISCSI_CLEANUP,
1774                                   sizeof(*req_v1));
1775                req_v1->hdr.version = 1;
1776                req_v1->chute = (1 << ulp);
1777                req_v1->hdr_ring_id = cpu_to_le16(hdr_ring_id);
1778                req_v1->data_ring_id = cpu_to_le16(data_ring_id);
1779        }
1780
1781        status = be_mbox_notify(ctrl);
1782        if (status)
1783                beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT,
1784                            "BG_%d : %s failed %d\n", __func__, ulp);
1785        mutex_unlock(&ctrl->mbox_lock);
1786        return status;
1787}
1788
1789/*
1790 * beiscsi_detect_ue()- Detect Unrecoverable Error on adapter
1791 * @phba: Driver priv structure
1792 *
1793 * Read registers linked to UE and check for the UE status
1794 **/
1795int beiscsi_detect_ue(struct beiscsi_hba *phba)
1796{
1797        uint32_t ue_mask_hi = 0, ue_mask_lo = 0;
1798        uint32_t ue_hi = 0, ue_lo = 0;
1799        uint8_t i = 0;
1800        int ret = 0;
1801
1802        pci_read_config_dword(phba->pcidev,
1803                              PCICFG_UE_STATUS_LOW, &ue_lo);
1804        pci_read_config_dword(phba->pcidev,
1805                              PCICFG_UE_STATUS_MASK_LOW,
1806                              &ue_mask_lo);
1807        pci_read_config_dword(phba->pcidev,
1808                              PCICFG_UE_STATUS_HIGH,
1809                              &ue_hi);
1810        pci_read_config_dword(phba->pcidev,
1811                              PCICFG_UE_STATUS_MASK_HI,
1812                              &ue_mask_hi);
1813
1814        ue_lo = (ue_lo & ~ue_mask_lo);
1815        ue_hi = (ue_hi & ~ue_mask_hi);
1816
1817
1818        if (ue_lo || ue_hi) {
1819                set_bit(BEISCSI_HBA_IN_UE, &phba->state);
1820                __beiscsi_log(phba, KERN_ERR,
1821                              "BC_%d : HBA error detected\n");
1822                ret = 1;
1823        }
1824
1825        if (ue_lo) {
1826                for (i = 0; ue_lo; ue_lo >>= 1, i++) {
1827                        if (ue_lo & 1)
1828                                __beiscsi_log(phba, KERN_ERR,
1829                                              "BC_%d : UE_LOW %s bit set\n",
1830                                              desc_ue_status_low[i]);
1831                }
1832        }
1833
1834        if (ue_hi) {
1835                for (i = 0; ue_hi; ue_hi >>= 1, i++) {
1836                        if (ue_hi & 1)
1837                                __beiscsi_log(phba, KERN_ERR,
1838                                              "BC_%d : UE_HIGH %s bit set\n",
1839                                              desc_ue_status_hi[i]);
1840                }
1841        }
1842        return ret;
1843}
1844
1845/*
1846 * beiscsi_detect_tpe()- Detect Transient Parity Error on adapter
1847 * @phba: Driver priv structure
1848 *
1849 * Read SLIPORT SEMAPHORE register to check for UER
1850 *
1851 **/
1852int beiscsi_detect_tpe(struct beiscsi_hba *phba)
1853{
1854        u32 post, status;
1855        int ret = 0;
1856
1857        post = beiscsi_get_post_stage(phba);
1858        status = post & POST_STAGE_MASK;
1859        if ((status & POST_ERR_RECOVERY_CODE_MASK) ==
1860            POST_STAGE_RECOVERABLE_ERR) {
1861                set_bit(BEISCSI_HBA_IN_TPE, &phba->state);
1862                __beiscsi_log(phba, KERN_INFO,
1863                              "BC_%d : HBA error recoverable: 0x%x\n", post);
1864                ret = 1;
1865        } else {
1866                __beiscsi_log(phba, KERN_INFO,
1867                              "BC_%d : HBA in UE: 0x%x\n", post);
1868        }
1869
1870        return ret;
1871}
1872