linux/drivers/scsi/qla2xxx/qla_iocb.c
<<
>>
Prefs
   1/*
   2 * QLogic Fibre Channel HBA Driver
   3 * Copyright (c)  2003-2013 QLogic Corporation
   4 *
   5 * See LICENSE.qla2xxx for copyright and licensing details.
   6 */
   7#include "qla_def.h"
   8#include "qla_target.h"
   9
  10#include <linux/blkdev.h>
  11#include <linux/delay.h>
  12
  13#include <scsi/scsi_tcq.h>
  14
  15static void qla25xx_set_que(srb_t *, struct rsp_que **);
  16/**
  17 * qla2x00_get_cmd_direction() - Determine control_flag data direction.
  18 * @cmd: SCSI command
  19 *
  20 * Returns the proper CF_* direction based on CDB.
  21 */
  22static inline uint16_t
  23qla2x00_get_cmd_direction(srb_t *sp)
  24{
  25        uint16_t cflags;
  26        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
  27        struct scsi_qla_host *vha = sp->fcport->vha;
  28
  29        cflags = 0;
  30
  31        /* Set transfer direction */
  32        if (cmd->sc_data_direction == DMA_TO_DEVICE) {
  33                cflags = CF_WRITE;
  34                vha->qla_stats.output_bytes += scsi_bufflen(cmd);
  35        } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) {
  36                cflags = CF_READ;
  37                vha->qla_stats.input_bytes += scsi_bufflen(cmd);
  38        }
  39        return (cflags);
  40}
  41
  42/**
  43 * qla2x00_calc_iocbs_32() - Determine number of Command Type 2 and
  44 * Continuation Type 0 IOCBs to allocate.
  45 *
  46 * @dsds: number of data segment decriptors needed
  47 *
  48 * Returns the number of IOCB entries needed to store @dsds.
  49 */
  50uint16_t
  51qla2x00_calc_iocbs_32(uint16_t dsds)
  52{
  53        uint16_t iocbs;
  54
  55        iocbs = 1;
  56        if (dsds > 3) {
  57                iocbs += (dsds - 3) / 7;
  58                if ((dsds - 3) % 7)
  59                        iocbs++;
  60        }
  61        return (iocbs);
  62}
  63
  64/**
  65 * qla2x00_calc_iocbs_64() - Determine number of Command Type 3 and
  66 * Continuation Type 1 IOCBs to allocate.
  67 *
  68 * @dsds: number of data segment decriptors needed
  69 *
  70 * Returns the number of IOCB entries needed to store @dsds.
  71 */
  72uint16_t
  73qla2x00_calc_iocbs_64(uint16_t dsds)
  74{
  75        uint16_t iocbs;
  76
  77        iocbs = 1;
  78        if (dsds > 2) {
  79                iocbs += (dsds - 2) / 5;
  80                if ((dsds - 2) % 5)
  81                        iocbs++;
  82        }
  83        return (iocbs);
  84}
  85
  86/**
  87 * qla2x00_prep_cont_type0_iocb() - Initialize a Continuation Type 0 IOCB.
  88 * @ha: HA context
  89 *
  90 * Returns a pointer to the Continuation Type 0 IOCB packet.
  91 */
  92static inline cont_entry_t *
  93qla2x00_prep_cont_type0_iocb(struct scsi_qla_host *vha)
  94{
  95        cont_entry_t *cont_pkt;
  96        struct req_que *req = vha->req;
  97        /* Adjust ring index. */
  98        req->ring_index++;
  99        if (req->ring_index == req->length) {
 100                req->ring_index = 0;
 101                req->ring_ptr = req->ring;
 102        } else {
 103                req->ring_ptr++;
 104        }
 105
 106        cont_pkt = (cont_entry_t *)req->ring_ptr;
 107
 108        /* Load packet defaults. */
 109        *((uint32_t *)(&cont_pkt->entry_type)) =
 110            __constant_cpu_to_le32(CONTINUE_TYPE);
 111
 112        return (cont_pkt);
 113}
 114
 115/**
 116 * qla2x00_prep_cont_type1_iocb() - Initialize a Continuation Type 1 IOCB.
 117 * @ha: HA context
 118 *
 119 * Returns a pointer to the continuation type 1 IOCB packet.
 120 */
 121static inline cont_a64_entry_t *
 122qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha, struct req_que *req)
 123{
 124        cont_a64_entry_t *cont_pkt;
 125
 126        /* Adjust ring index. */
 127        req->ring_index++;
 128        if (req->ring_index == req->length) {
 129                req->ring_index = 0;
 130                req->ring_ptr = req->ring;
 131        } else {
 132                req->ring_ptr++;
 133        }
 134
 135        cont_pkt = (cont_a64_entry_t *)req->ring_ptr;
 136
 137        /* Load packet defaults. */
 138        *((uint32_t *)(&cont_pkt->entry_type)) = IS_QLAFX00(vha->hw) ?
 139            __constant_cpu_to_le32(CONTINUE_A64_TYPE_FX00) :
 140            __constant_cpu_to_le32(CONTINUE_A64_TYPE);
 141
 142        return (cont_pkt);
 143}
 144
 145static inline int
 146qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts)
 147{
 148        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
 149        uint8_t guard = scsi_host_get_guard(cmd->device->host);
 150
 151        /* We always use DIFF Bundling for best performance */
 152        *fw_prot_opts = 0;
 153
 154        /* Translate SCSI opcode to a protection opcode */
 155        switch (scsi_get_prot_op(cmd)) {
 156        case SCSI_PROT_READ_STRIP:
 157                *fw_prot_opts |= PO_MODE_DIF_REMOVE;
 158                break;
 159        case SCSI_PROT_WRITE_INSERT:
 160                *fw_prot_opts |= PO_MODE_DIF_INSERT;
 161                break;
 162        case SCSI_PROT_READ_INSERT:
 163                *fw_prot_opts |= PO_MODE_DIF_INSERT;
 164                break;
 165        case SCSI_PROT_WRITE_STRIP:
 166                *fw_prot_opts |= PO_MODE_DIF_REMOVE;
 167                break;
 168        case SCSI_PROT_READ_PASS:
 169        case SCSI_PROT_WRITE_PASS:
 170                if (guard & SHOST_DIX_GUARD_IP)
 171                        *fw_prot_opts |= PO_MODE_DIF_TCP_CKSUM;
 172                else
 173                        *fw_prot_opts |= PO_MODE_DIF_PASS;
 174                break;
 175        default:        /* Normal Request */
 176                *fw_prot_opts |= PO_MODE_DIF_PASS;
 177                break;
 178        }
 179
 180        return scsi_prot_sg_count(cmd);
 181}
 182
 183/*
 184 * qla2x00_build_scsi_iocbs_32() - Build IOCB command utilizing 32bit
 185 * capable IOCB types.
 186 *
 187 * @sp: SRB command to process
 188 * @cmd_pkt: Command type 2 IOCB
 189 * @tot_dsds: Total number of segments to transfer
 190 */
 191void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt,
 192    uint16_t tot_dsds)
 193{
 194        uint16_t        avail_dsds;
 195        uint32_t        *cur_dsd;
 196        scsi_qla_host_t *vha;
 197        struct scsi_cmnd *cmd;
 198        struct scatterlist *sg;
 199        int i;
 200
 201        cmd = GET_CMD_SP(sp);
 202
 203        /* Update entry type to indicate Command Type 2 IOCB */
 204        *((uint32_t *)(&cmd_pkt->entry_type)) =
 205            __constant_cpu_to_le32(COMMAND_TYPE);
 206
 207        /* No data transfer */
 208        if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) {
 209                cmd_pkt->byte_count = __constant_cpu_to_le32(0);
 210                return;
 211        }
 212
 213        vha = sp->fcport->vha;
 214        cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
 215
 216        /* Three DSDs are available in the Command Type 2 IOCB */
 217        avail_dsds = 3;
 218        cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address;
 219
 220        /* Load data segments */
 221        scsi_for_each_sg(cmd, sg, tot_dsds, i) {
 222                cont_entry_t *cont_pkt;
 223
 224                /* Allocate additional continuation packets? */
 225                if (avail_dsds == 0) {
 226                        /*
 227                         * Seven DSDs are available in the Continuation
 228                         * Type 0 IOCB.
 229                         */
 230                        cont_pkt = qla2x00_prep_cont_type0_iocb(vha);
 231                        cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address;
 232                        avail_dsds = 7;
 233                }
 234
 235                *cur_dsd++ = cpu_to_le32(sg_dma_address(sg));
 236                *cur_dsd++ = cpu_to_le32(sg_dma_len(sg));
 237                avail_dsds--;
 238        }
 239}
 240
 241/**
 242 * qla2x00_build_scsi_iocbs_64() - Build IOCB command utilizing 64bit
 243 * capable IOCB types.
 244 *
 245 * @sp: SRB command to process
 246 * @cmd_pkt: Command type 3 IOCB
 247 * @tot_dsds: Total number of segments to transfer
 248 */
 249void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt,
 250    uint16_t tot_dsds)
 251{
 252        uint16_t        avail_dsds;
 253        uint32_t        *cur_dsd;
 254        scsi_qla_host_t *vha;
 255        struct scsi_cmnd *cmd;
 256        struct scatterlist *sg;
 257        int i;
 258
 259        cmd = GET_CMD_SP(sp);
 260
 261        /* Update entry type to indicate Command Type 3 IOCB */
 262        *((uint32_t *)(&cmd_pkt->entry_type)) =
 263            __constant_cpu_to_le32(COMMAND_A64_TYPE);
 264
 265        /* No data transfer */
 266        if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) {
 267                cmd_pkt->byte_count = __constant_cpu_to_le32(0);
 268                return;
 269        }
 270
 271        vha = sp->fcport->vha;
 272        cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
 273
 274        /* Two DSDs are available in the Command Type 3 IOCB */
 275        avail_dsds = 2;
 276        cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address;
 277
 278        /* Load data segments */
 279        scsi_for_each_sg(cmd, sg, tot_dsds, i) {
 280                dma_addr_t      sle_dma;
 281                cont_a64_entry_t *cont_pkt;
 282
 283                /* Allocate additional continuation packets? */
 284                if (avail_dsds == 0) {
 285                        /*
 286                         * Five DSDs are available in the Continuation
 287                         * Type 1 IOCB.
 288                         */
 289                        cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req);
 290                        cur_dsd = (uint32_t *)cont_pkt->dseg_0_address;
 291                        avail_dsds = 5;
 292                }
 293
 294                sle_dma = sg_dma_address(sg);
 295                *cur_dsd++ = cpu_to_le32(LSD(sle_dma));
 296                *cur_dsd++ = cpu_to_le32(MSD(sle_dma));
 297                *cur_dsd++ = cpu_to_le32(sg_dma_len(sg));
 298                avail_dsds--;
 299        }
 300}
 301
 302/**
 303 * qla2x00_start_scsi() - Send a SCSI command to the ISP
 304 * @sp: command to send to the ISP
 305 *
 306 * Returns non-zero if a failure occurred, else zero.
 307 */
 308int
 309qla2x00_start_scsi(srb_t *sp)
 310{
 311        int             ret, nseg;
 312        unsigned long   flags;
 313        scsi_qla_host_t *vha;
 314        struct scsi_cmnd *cmd;
 315        uint32_t        *clr_ptr;
 316        uint32_t        index;
 317        uint32_t        handle;
 318        cmd_entry_t     *cmd_pkt;
 319        uint16_t        cnt;
 320        uint16_t        req_cnt;
 321        uint16_t        tot_dsds;
 322        struct device_reg_2xxx __iomem *reg;
 323        struct qla_hw_data *ha;
 324        struct req_que *req;
 325        struct rsp_que *rsp;
 326        char            tag[2];
 327
 328        /* Setup device pointers. */
 329        ret = 0;
 330        vha = sp->fcport->vha;
 331        ha = vha->hw;
 332        reg = &ha->iobase->isp;
 333        cmd = GET_CMD_SP(sp);
 334        req = ha->req_q_map[0];
 335        rsp = ha->rsp_q_map[0];
 336        /* So we know we haven't pci_map'ed anything yet */
 337        tot_dsds = 0;
 338
 339        /* Send marker if required */
 340        if (vha->marker_needed != 0) {
 341                if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) !=
 342                    QLA_SUCCESS) {
 343                        return (QLA_FUNCTION_FAILED);
 344                }
 345                vha->marker_needed = 0;
 346        }
 347
 348        /* Acquire ring specific lock */
 349        spin_lock_irqsave(&ha->hardware_lock, flags);
 350
 351        /* Check for room in outstanding command list. */
 352        handle = req->current_outstanding_cmd;
 353        for (index = 1; index < req->num_outstanding_cmds; index++) {
 354                handle++;
 355                if (handle == req->num_outstanding_cmds)
 356                        handle = 1;
 357                if (!req->outstanding_cmds[handle])
 358                        break;
 359        }
 360        if (index == req->num_outstanding_cmds)
 361                goto queuing_error;
 362
 363        /* Map the sg table so we have an accurate count of sg entries needed */
 364        if (scsi_sg_count(cmd)) {
 365                nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd),
 366                    scsi_sg_count(cmd), cmd->sc_data_direction);
 367                if (unlikely(!nseg))
 368                        goto queuing_error;
 369        } else
 370                nseg = 0;
 371
 372        tot_dsds = nseg;
 373
 374        /* Calculate the number of request entries needed. */
 375        req_cnt = ha->isp_ops->calc_req_entries(tot_dsds);
 376        if (req->cnt < (req_cnt + 2)) {
 377                cnt = RD_REG_WORD_RELAXED(ISP_REQ_Q_OUT(ha, reg));
 378                if (req->ring_index < cnt)
 379                        req->cnt = cnt - req->ring_index;
 380                else
 381                        req->cnt = req->length -
 382                            (req->ring_index - cnt);
 383                /* If still no head room then bail out */
 384                if (req->cnt < (req_cnt + 2))
 385                        goto queuing_error;
 386        }
 387
 388        /* Build command packet */
 389        req->current_outstanding_cmd = handle;
 390        req->outstanding_cmds[handle] = sp;
 391        sp->handle = handle;
 392        cmd->host_scribble = (unsigned char *)(unsigned long)handle;
 393        req->cnt -= req_cnt;
 394
 395        cmd_pkt = (cmd_entry_t *)req->ring_ptr;
 396        cmd_pkt->handle = handle;
 397        /* Zero out remaining portion of packet. */
 398        clr_ptr = (uint32_t *)cmd_pkt + 2;
 399        memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8);
 400        cmd_pkt->dseg_count = cpu_to_le16(tot_dsds);
 401
 402        /* Set target ID and LUN number*/
 403        SET_TARGET_ID(ha, cmd_pkt->target, sp->fcport->loop_id);
 404        cmd_pkt->lun = cpu_to_le16(cmd->device->lun);
 405
 406        /* Update tagged queuing modifier */
 407        if (scsi_populate_tag_msg(cmd, tag)) {
 408                switch (tag[0]) {
 409                case HEAD_OF_QUEUE_TAG:
 410                        cmd_pkt->control_flags =
 411                            __constant_cpu_to_le16(CF_HEAD_TAG);
 412                        break;
 413                case ORDERED_QUEUE_TAG:
 414                        cmd_pkt->control_flags =
 415                            __constant_cpu_to_le16(CF_ORDERED_TAG);
 416                        break;
 417                default:
 418                        cmd_pkt->control_flags =
 419                            __constant_cpu_to_le16(CF_SIMPLE_TAG);
 420                        break;
 421                }
 422        }
 423
 424        /* Load SCSI command packet. */
 425        memcpy(cmd_pkt->scsi_cdb, cmd->cmnd, cmd->cmd_len);
 426        cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd));
 427
 428        /* Build IOCB segments */
 429        ha->isp_ops->build_iocbs(sp, cmd_pkt, tot_dsds);
 430
 431        /* Set total data segment count. */
 432        cmd_pkt->entry_count = (uint8_t)req_cnt;
 433        wmb();
 434
 435        /* Adjust ring index. */
 436        req->ring_index++;
 437        if (req->ring_index == req->length) {
 438                req->ring_index = 0;
 439                req->ring_ptr = req->ring;
 440        } else
 441                req->ring_ptr++;
 442
 443        sp->flags |= SRB_DMA_VALID;
 444
 445        /* Set chip new ring index. */
 446        WRT_REG_WORD(ISP_REQ_Q_IN(ha, reg), req->ring_index);
 447        RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, reg));     /* PCI Posting. */
 448
 449        /* Manage unprocessed RIO/ZIO commands in response queue. */
 450        if (vha->flags.process_response_queue &&
 451            rsp->ring_ptr->signature != RESPONSE_PROCESSED)
 452                qla2x00_process_response_queue(rsp);
 453
 454        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 455        return (QLA_SUCCESS);
 456
 457queuing_error:
 458        if (tot_dsds)
 459                scsi_dma_unmap(cmd);
 460
 461        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 462
 463        return (QLA_FUNCTION_FAILED);
 464}
 465
 466/**
 467 * qla2x00_start_iocbs() - Execute the IOCB command
 468 */
 469void
 470qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req)
 471{
 472        struct qla_hw_data *ha = vha->hw;
 473        device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id);
 474
 475        if (IS_QLA82XX(ha)) {
 476                qla82xx_start_iocbs(vha);
 477        } else {
 478                /* Adjust ring index. */
 479                req->ring_index++;
 480                if (req->ring_index == req->length) {
 481                        req->ring_index = 0;
 482                        req->ring_ptr = req->ring;
 483                } else
 484                        req->ring_ptr++;
 485
 486                /* Set chip new ring index. */
 487                if (ha->mqenable || IS_QLA83XX(ha)) {
 488                        WRT_REG_DWORD(req->req_q_in, req->ring_index);
 489                        RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr);
 490                } else if (IS_QLAFX00(ha)) {
 491                        WRT_REG_DWORD(&reg->ispfx00.req_q_in, req->ring_index);
 492                        RD_REG_DWORD_RELAXED(&reg->ispfx00.req_q_in);
 493                        QLAFX00_SET_HST_INTR(ha, ha->rqstq_intr_code);
 494                } else if (IS_FWI2_CAPABLE(ha)) {
 495                        WRT_REG_DWORD(&reg->isp24.req_q_in, req->ring_index);
 496                        RD_REG_DWORD_RELAXED(&reg->isp24.req_q_in);
 497                } else {
 498                        WRT_REG_WORD(ISP_REQ_Q_IN(ha, &reg->isp),
 499                                req->ring_index);
 500                        RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, &reg->isp));
 501                }
 502        }
 503}
 504
 505/**
 506 * qla2x00_marker() - Send a marker IOCB to the firmware.
 507 * @ha: HA context
 508 * @loop_id: loop ID
 509 * @lun: LUN
 510 * @type: marker modifier
 511 *
 512 * Can be called from both normal and interrupt context.
 513 *
 514 * Returns non-zero if a failure occurred, else zero.
 515 */
 516static int
 517__qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,
 518                        struct rsp_que *rsp, uint16_t loop_id,
 519                        uint16_t lun, uint8_t type)
 520{
 521        mrk_entry_t *mrk;
 522        struct mrk_entry_24xx *mrk24 = NULL;
 523        struct mrk_entry_fx00 *mrkfx = NULL;
 524
 525        struct qla_hw_data *ha = vha->hw;
 526        scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
 527
 528        req = ha->req_q_map[0];
 529        mrk = (mrk_entry_t *)qla2x00_alloc_iocbs(vha, NULL);
 530        if (mrk == NULL) {
 531                ql_log(ql_log_warn, base_vha, 0x3026,
 532                    "Failed to allocate Marker IOCB.\n");
 533
 534                return (QLA_FUNCTION_FAILED);
 535        }
 536
 537        mrk->entry_type = MARKER_TYPE;
 538        mrk->modifier = type;
 539        if (type != MK_SYNC_ALL) {
 540                if (IS_QLAFX00(ha)) {
 541                        mrkfx = (struct mrk_entry_fx00 *) mrk;
 542                        mrkfx->handle = MAKE_HANDLE(req->id, mrkfx->handle);
 543                        mrkfx->handle_hi = 0;
 544                        mrkfx->tgt_id = cpu_to_le16(loop_id);
 545                        mrkfx->lun[1] = LSB(lun);
 546                        mrkfx->lun[2] = MSB(lun);
 547                        host_to_fcp_swap(mrkfx->lun, sizeof(mrkfx->lun));
 548                } else if (IS_FWI2_CAPABLE(ha)) {
 549                        mrk24 = (struct mrk_entry_24xx *) mrk;
 550                        mrk24->nport_handle = cpu_to_le16(loop_id);
 551                        mrk24->lun[1] = LSB(lun);
 552                        mrk24->lun[2] = MSB(lun);
 553                        host_to_fcp_swap(mrk24->lun, sizeof(mrk24->lun));
 554                        mrk24->vp_index = vha->vp_idx;
 555                        mrk24->handle = MAKE_HANDLE(req->id, mrk24->handle);
 556                } else {
 557                        SET_TARGET_ID(ha, mrk->target, loop_id);
 558                        mrk->lun = cpu_to_le16(lun);
 559                }
 560        }
 561        wmb();
 562
 563        qla2x00_start_iocbs(vha, req);
 564
 565        return (QLA_SUCCESS);
 566}
 567
 568int
 569qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,
 570                struct rsp_que *rsp, uint16_t loop_id, uint16_t lun,
 571                uint8_t type)
 572{
 573        int ret;
 574        unsigned long flags = 0;
 575
 576        spin_lock_irqsave(&vha->hw->hardware_lock, flags);
 577        ret = __qla2x00_marker(vha, req, rsp, loop_id, lun, type);
 578        spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
 579
 580        return (ret);
 581}
 582
 583/*
 584 * qla2x00_issue_marker
 585 *
 586 * Issue marker
 587 * Caller CAN have hardware lock held as specified by ha_locked parameter.
 588 * Might release it, then reaquire.
 589 */
 590int qla2x00_issue_marker(scsi_qla_host_t *vha, int ha_locked)
 591{
 592        if (ha_locked) {
 593                if (__qla2x00_marker(vha, vha->req, vha->req->rsp, 0, 0,
 594                                        MK_SYNC_ALL) != QLA_SUCCESS)
 595                        return QLA_FUNCTION_FAILED;
 596        } else {
 597                if (qla2x00_marker(vha, vha->req, vha->req->rsp, 0, 0,
 598                                        MK_SYNC_ALL) != QLA_SUCCESS)
 599                        return QLA_FUNCTION_FAILED;
 600        }
 601        vha->marker_needed = 0;
 602
 603        return QLA_SUCCESS;
 604}
 605
 606static inline int
 607qla24xx_build_scsi_type_6_iocbs(srb_t *sp, struct cmd_type_6 *cmd_pkt,
 608        uint16_t tot_dsds)
 609{
 610        uint32_t *cur_dsd = NULL;
 611        scsi_qla_host_t *vha;
 612        struct qla_hw_data *ha;
 613        struct scsi_cmnd *cmd;
 614        struct  scatterlist *cur_seg;
 615        uint32_t *dsd_seg;
 616        void *next_dsd;
 617        uint8_t avail_dsds;
 618        uint8_t first_iocb = 1;
 619        uint32_t dsd_list_len;
 620        struct dsd_dma *dsd_ptr;
 621        struct ct6_dsd *ctx;
 622
 623        cmd = GET_CMD_SP(sp);
 624
 625        /* Update entry type to indicate Command Type 3 IOCB */
 626        *((uint32_t *)(&cmd_pkt->entry_type)) =
 627                __constant_cpu_to_le32(COMMAND_TYPE_6);
 628
 629        /* No data transfer */
 630        if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) {
 631                cmd_pkt->byte_count = __constant_cpu_to_le32(0);
 632                return 0;
 633        }
 634
 635        vha = sp->fcport->vha;
 636        ha = vha->hw;
 637
 638        /* Set transfer direction */
 639        if (cmd->sc_data_direction == DMA_TO_DEVICE) {
 640                cmd_pkt->control_flags =
 641                    __constant_cpu_to_le16(CF_WRITE_DATA);
 642                vha->qla_stats.output_bytes += scsi_bufflen(cmd);
 643        } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) {
 644                cmd_pkt->control_flags =
 645                    __constant_cpu_to_le16(CF_READ_DATA);
 646                vha->qla_stats.input_bytes += scsi_bufflen(cmd);
 647        }
 648
 649        cur_seg = scsi_sglist(cmd);
 650        ctx = GET_CMD_CTX_SP(sp);
 651
 652        while (tot_dsds) {
 653                avail_dsds = (tot_dsds > QLA_DSDS_PER_IOCB) ?
 654                    QLA_DSDS_PER_IOCB : tot_dsds;
 655                tot_dsds -= avail_dsds;
 656                dsd_list_len = (avail_dsds + 1) * QLA_DSD_SIZE;
 657
 658                dsd_ptr = list_first_entry(&ha->gbl_dsd_list,
 659                    struct dsd_dma, list);
 660                next_dsd = dsd_ptr->dsd_addr;
 661                list_del(&dsd_ptr->list);
 662                ha->gbl_dsd_avail--;
 663                list_add_tail(&dsd_ptr->list, &ctx->dsd_list);
 664                ctx->dsd_use_cnt++;
 665                ha->gbl_dsd_inuse++;
 666
 667                if (first_iocb) {
 668                        first_iocb = 0;
 669                        dsd_seg = (uint32_t *)&cmd_pkt->fcp_data_dseg_address;
 670                        *dsd_seg++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma));
 671                        *dsd_seg++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma));
 672                        cmd_pkt->fcp_data_dseg_len = cpu_to_le32(dsd_list_len);
 673                } else {
 674                        *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma));
 675                        *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma));
 676                        *cur_dsd++ = cpu_to_le32(dsd_list_len);
 677                }
 678                cur_dsd = (uint32_t *)next_dsd;
 679                while (avail_dsds) {
 680                        dma_addr_t      sle_dma;
 681
 682                        sle_dma = sg_dma_address(cur_seg);
 683                        *cur_dsd++ = cpu_to_le32(LSD(sle_dma));
 684                        *cur_dsd++ = cpu_to_le32(MSD(sle_dma));
 685                        *cur_dsd++ = cpu_to_le32(sg_dma_len(cur_seg));
 686                        cur_seg = sg_next(cur_seg);
 687                        avail_dsds--;
 688                }
 689        }
 690
 691        /* Null termination */
 692        *cur_dsd++ =  0;
 693        *cur_dsd++ = 0;
 694        *cur_dsd++ = 0;
 695        cmd_pkt->control_flags |= CF_DATA_SEG_DESCR_ENABLE;
 696        return 0;
 697}
 698
 699/*
 700 * qla24xx_calc_dsd_lists() - Determine number of DSD list required
 701 * for Command Type 6.
 702 *
 703 * @dsds: number of data segment decriptors needed
 704 *
 705 * Returns the number of dsd list needed to store @dsds.
 706 */
 707inline uint16_t
 708qla24xx_calc_dsd_lists(uint16_t dsds)
 709{
 710        uint16_t dsd_lists = 0;
 711
 712        dsd_lists = (dsds/QLA_DSDS_PER_IOCB);
 713        if (dsds % QLA_DSDS_PER_IOCB)
 714                dsd_lists++;
 715        return dsd_lists;
 716}
 717
 718
 719/**
 720 * qla24xx_build_scsi_iocbs() - Build IOCB command utilizing Command Type 7
 721 * IOCB types.
 722 *
 723 * @sp: SRB command to process
 724 * @cmd_pkt: Command type 3 IOCB
 725 * @tot_dsds: Total number of segments to transfer
 726 */
 727inline void
 728qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt,
 729    uint16_t tot_dsds)
 730{
 731        uint16_t        avail_dsds;
 732        uint32_t        *cur_dsd;
 733        scsi_qla_host_t *vha;
 734        struct scsi_cmnd *cmd;
 735        struct scatterlist *sg;
 736        int i;
 737        struct req_que *req;
 738
 739        cmd = GET_CMD_SP(sp);
 740
 741        /* Update entry type to indicate Command Type 3 IOCB */
 742        *((uint32_t *)(&cmd_pkt->entry_type)) =
 743            __constant_cpu_to_le32(COMMAND_TYPE_7);
 744
 745        /* No data transfer */
 746        if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) {
 747                cmd_pkt->byte_count = __constant_cpu_to_le32(0);
 748                return;
 749        }
 750
 751        vha = sp->fcport->vha;
 752        req = vha->req;
 753
 754        /* Set transfer direction */
 755        if (cmd->sc_data_direction == DMA_TO_DEVICE) {
 756                cmd_pkt->task_mgmt_flags =
 757                    __constant_cpu_to_le16(TMF_WRITE_DATA);
 758                vha->qla_stats.output_bytes += scsi_bufflen(cmd);
 759        } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) {
 760                cmd_pkt->task_mgmt_flags =
 761                    __constant_cpu_to_le16(TMF_READ_DATA);
 762                vha->qla_stats.input_bytes += scsi_bufflen(cmd);
 763        }
 764
 765        /* One DSD is available in the Command Type 3 IOCB */
 766        avail_dsds = 1;
 767        cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address;
 768
 769        /* Load data segments */
 770
 771        scsi_for_each_sg(cmd, sg, tot_dsds, i) {
 772                dma_addr_t      sle_dma;
 773                cont_a64_entry_t *cont_pkt;
 774
 775                /* Allocate additional continuation packets? */
 776                if (avail_dsds == 0) {
 777                        /*
 778                         * Five DSDs are available in the Continuation
 779                         * Type 1 IOCB.
 780                         */
 781                        cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req);
 782                        cur_dsd = (uint32_t *)cont_pkt->dseg_0_address;
 783                        avail_dsds = 5;
 784                }
 785
 786                sle_dma = sg_dma_address(sg);
 787                *cur_dsd++ = cpu_to_le32(LSD(sle_dma));
 788                *cur_dsd++ = cpu_to_le32(MSD(sle_dma));
 789                *cur_dsd++ = cpu_to_le32(sg_dma_len(sg));
 790                avail_dsds--;
 791        }
 792}
 793
 794struct fw_dif_context {
 795        uint32_t ref_tag;
 796        uint16_t app_tag;
 797        uint8_t ref_tag_mask[4];        /* Validation/Replacement Mask*/
 798        uint8_t app_tag_mask[2];        /* Validation/Replacement Mask*/
 799};
 800
 801/*
 802 * qla24xx_set_t10dif_tags_from_cmd - Extract Ref and App tags from SCSI command
 803 *
 804 */
 805static inline void
 806qla24xx_set_t10dif_tags(srb_t *sp, struct fw_dif_context *pkt,
 807    unsigned int protcnt)
 808{
 809        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
 810
 811        switch (scsi_get_prot_type(cmd)) {
 812        case SCSI_PROT_DIF_TYPE0:
 813                /*
 814                 * No check for ql2xenablehba_err_chk, as it would be an
 815                 * I/O error if hba tag generation is not done.
 816                 */
 817                pkt->ref_tag = cpu_to_le32((uint32_t)
 818                    (0xffffffff & scsi_get_lba(cmd)));
 819
 820                if (!qla2x00_hba_err_chk_enabled(sp))
 821                        break;
 822
 823                pkt->ref_tag_mask[0] = 0xff;
 824                pkt->ref_tag_mask[1] = 0xff;
 825                pkt->ref_tag_mask[2] = 0xff;
 826                pkt->ref_tag_mask[3] = 0xff;
 827                break;
 828
 829        /*
 830         * For TYPE 2 protection: 16 bit GUARD + 32 bit REF tag has to
 831         * match LBA in CDB + N
 832         */
 833        case SCSI_PROT_DIF_TYPE2:
 834                pkt->app_tag = __constant_cpu_to_le16(0);
 835                pkt->app_tag_mask[0] = 0x0;
 836                pkt->app_tag_mask[1] = 0x0;
 837
 838                pkt->ref_tag = cpu_to_le32((uint32_t)
 839                    (0xffffffff & scsi_get_lba(cmd)));
 840
 841                if (!qla2x00_hba_err_chk_enabled(sp))
 842                        break;
 843
 844                /* enable ALL bytes of the ref tag */
 845                pkt->ref_tag_mask[0] = 0xff;
 846                pkt->ref_tag_mask[1] = 0xff;
 847                pkt->ref_tag_mask[2] = 0xff;
 848                pkt->ref_tag_mask[3] = 0xff;
 849                break;
 850
 851        /* For Type 3 protection: 16 bit GUARD only */
 852        case SCSI_PROT_DIF_TYPE3:
 853                pkt->ref_tag_mask[0] = pkt->ref_tag_mask[1] =
 854                        pkt->ref_tag_mask[2] = pkt->ref_tag_mask[3] =
 855                                                                0x00;
 856                break;
 857
 858        /*
 859         * For TYpe 1 protection: 16 bit GUARD tag, 32 bit REF tag, and
 860         * 16 bit app tag.
 861         */
 862        case SCSI_PROT_DIF_TYPE1:
 863                pkt->ref_tag = cpu_to_le32((uint32_t)
 864                    (0xffffffff & scsi_get_lba(cmd)));
 865                pkt->app_tag = __constant_cpu_to_le16(0);
 866                pkt->app_tag_mask[0] = 0x0;
 867                pkt->app_tag_mask[1] = 0x0;
 868
 869                if (!qla2x00_hba_err_chk_enabled(sp))
 870                        break;
 871
 872                /* enable ALL bytes of the ref tag */
 873                pkt->ref_tag_mask[0] = 0xff;
 874                pkt->ref_tag_mask[1] = 0xff;
 875                pkt->ref_tag_mask[2] = 0xff;
 876                pkt->ref_tag_mask[3] = 0xff;
 877                break;
 878        }
 879}
 880
 881struct qla2_sgx {
 882        dma_addr_t              dma_addr;       /* OUT */
 883        uint32_t                dma_len;        /* OUT */
 884
 885        uint32_t                tot_bytes;      /* IN */
 886        struct scatterlist      *cur_sg;        /* IN */
 887
 888        /* for book keeping, bzero on initial invocation */
 889        uint32_t                bytes_consumed;
 890        uint32_t                num_bytes;
 891        uint32_t                tot_partial;
 892
 893        /* for debugging */
 894        uint32_t                num_sg;
 895        srb_t                   *sp;
 896};
 897
 898static int
 899qla24xx_get_one_block_sg(uint32_t blk_sz, struct qla2_sgx *sgx,
 900        uint32_t *partial)
 901{
 902        struct scatterlist *sg;
 903        uint32_t cumulative_partial, sg_len;
 904        dma_addr_t sg_dma_addr;
 905
 906        if (sgx->num_bytes == sgx->tot_bytes)
 907                return 0;
 908
 909        sg = sgx->cur_sg;
 910        cumulative_partial = sgx->tot_partial;
 911
 912        sg_dma_addr = sg_dma_address(sg);
 913        sg_len = sg_dma_len(sg);
 914
 915        sgx->dma_addr = sg_dma_addr + sgx->bytes_consumed;
 916
 917        if ((cumulative_partial + (sg_len - sgx->bytes_consumed)) >= blk_sz) {
 918                sgx->dma_len = (blk_sz - cumulative_partial);
 919                sgx->tot_partial = 0;
 920                sgx->num_bytes += blk_sz;
 921                *partial = 0;
 922        } else {
 923                sgx->dma_len = sg_len - sgx->bytes_consumed;
 924                sgx->tot_partial += sgx->dma_len;
 925                *partial = 1;
 926        }
 927
 928        sgx->bytes_consumed += sgx->dma_len;
 929
 930        if (sg_len == sgx->bytes_consumed) {
 931                sg = sg_next(sg);
 932                sgx->num_sg++;
 933                sgx->cur_sg = sg;
 934                sgx->bytes_consumed = 0;
 935        }
 936
 937        return 1;
 938}
 939
 940static int
 941qla24xx_walk_and_build_sglist_no_difb(struct qla_hw_data *ha, srb_t *sp,
 942        uint32_t *dsd, uint16_t tot_dsds)
 943{
 944        void *next_dsd;
 945        uint8_t avail_dsds = 0;
 946        uint32_t dsd_list_len;
 947        struct dsd_dma *dsd_ptr;
 948        struct scatterlist *sg_prot;
 949        uint32_t *cur_dsd = dsd;
 950        uint16_t        used_dsds = tot_dsds;
 951
 952        uint32_t        prot_int;
 953        uint32_t        partial;
 954        struct qla2_sgx sgx;
 955        dma_addr_t      sle_dma;
 956        uint32_t        sle_dma_len, tot_prot_dma_len = 0;
 957        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
 958
 959        prot_int = cmd->device->sector_size;
 960
 961        memset(&sgx, 0, sizeof(struct qla2_sgx));
 962        sgx.tot_bytes = scsi_bufflen(cmd);
 963        sgx.cur_sg = scsi_sglist(cmd);
 964        sgx.sp = sp;
 965
 966        sg_prot = scsi_prot_sglist(cmd);
 967
 968        while (qla24xx_get_one_block_sg(prot_int, &sgx, &partial)) {
 969
 970                sle_dma = sgx.dma_addr;
 971                sle_dma_len = sgx.dma_len;
 972alloc_and_fill:
 973                /* Allocate additional continuation packets? */
 974                if (avail_dsds == 0) {
 975                        avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ?
 976                                        QLA_DSDS_PER_IOCB : used_dsds;
 977                        dsd_list_len = (avail_dsds + 1) * 12;
 978                        used_dsds -= avail_dsds;
 979
 980                        /* allocate tracking DS */
 981                        dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC);
 982                        if (!dsd_ptr)
 983                                return 1;
 984
 985                        /* allocate new list */
 986                        dsd_ptr->dsd_addr = next_dsd =
 987                            dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC,
 988                                &dsd_ptr->dsd_list_dma);
 989
 990                        if (!next_dsd) {
 991                                /*
 992                                 * Need to cleanup only this dsd_ptr, rest
 993                                 * will be done by sp_free_dma()
 994                                 */
 995                                kfree(dsd_ptr);
 996                                return 1;
 997                        }
 998
 999                        list_add_tail(&dsd_ptr->list,
1000                            &((struct crc_context *)sp->u.scmd.ctx)->dsd_list);
1001
1002                        sp->flags |= SRB_CRC_CTX_DSD_VALID;
1003
1004                        /* add new list to cmd iocb or last list */
1005                        *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma));
1006                        *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma));
1007                        *cur_dsd++ = dsd_list_len;
1008                        cur_dsd = (uint32_t *)next_dsd;
1009                }
1010                *cur_dsd++ = cpu_to_le32(LSD(sle_dma));
1011                *cur_dsd++ = cpu_to_le32(MSD(sle_dma));
1012                *cur_dsd++ = cpu_to_le32(sle_dma_len);
1013                avail_dsds--;
1014
1015                if (partial == 0) {
1016                        /* Got a full protection interval */
1017                        sle_dma = sg_dma_address(sg_prot) + tot_prot_dma_len;
1018                        sle_dma_len = 8;
1019
1020                        tot_prot_dma_len += sle_dma_len;
1021                        if (tot_prot_dma_len == sg_dma_len(sg_prot)) {
1022                                tot_prot_dma_len = 0;
1023                                sg_prot = sg_next(sg_prot);
1024                        }
1025
1026                        partial = 1; /* So as to not re-enter this block */
1027                        goto alloc_and_fill;
1028                }
1029        }
1030        /* Null termination */
1031        *cur_dsd++ = 0;
1032        *cur_dsd++ = 0;
1033        *cur_dsd++ = 0;
1034        return 0;
1035}
1036
1037static int
1038qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd,
1039        uint16_t tot_dsds)
1040{
1041        void *next_dsd;
1042        uint8_t avail_dsds = 0;
1043        uint32_t dsd_list_len;
1044        struct dsd_dma *dsd_ptr;
1045        struct scatterlist *sg;
1046        uint32_t *cur_dsd = dsd;
1047        int     i;
1048        uint16_t        used_dsds = tot_dsds;
1049        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
1050
1051        scsi_for_each_sg(cmd, sg, tot_dsds, i) {
1052                dma_addr_t      sle_dma;
1053
1054                /* Allocate additional continuation packets? */
1055                if (avail_dsds == 0) {
1056                        avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ?
1057                                        QLA_DSDS_PER_IOCB : used_dsds;
1058                        dsd_list_len = (avail_dsds + 1) * 12;
1059                        used_dsds -= avail_dsds;
1060
1061                        /* allocate tracking DS */
1062                        dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC);
1063                        if (!dsd_ptr)
1064                                return 1;
1065
1066                        /* allocate new list */
1067                        dsd_ptr->dsd_addr = next_dsd =
1068                            dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC,
1069                                &dsd_ptr->dsd_list_dma);
1070
1071                        if (!next_dsd) {
1072                                /*
1073                                 * Need to cleanup only this dsd_ptr, rest
1074                                 * will be done by sp_free_dma()
1075                                 */
1076                                kfree(dsd_ptr);
1077                                return 1;
1078                        }
1079
1080                        list_add_tail(&dsd_ptr->list,
1081                            &((struct crc_context *)sp->u.scmd.ctx)->dsd_list);
1082
1083                        sp->flags |= SRB_CRC_CTX_DSD_VALID;
1084
1085                        /* add new list to cmd iocb or last list */
1086                        *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma));
1087                        *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma));
1088                        *cur_dsd++ = dsd_list_len;
1089                        cur_dsd = (uint32_t *)next_dsd;
1090                }
1091                sle_dma = sg_dma_address(sg);
1092
1093                *cur_dsd++ = cpu_to_le32(LSD(sle_dma));
1094                *cur_dsd++ = cpu_to_le32(MSD(sle_dma));
1095                *cur_dsd++ = cpu_to_le32(sg_dma_len(sg));
1096                avail_dsds--;
1097
1098        }
1099        /* Null termination */
1100        *cur_dsd++ = 0;
1101        *cur_dsd++ = 0;
1102        *cur_dsd++ = 0;
1103        return 0;
1104}
1105
1106static int
1107qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp,
1108                                                        uint32_t *dsd,
1109        uint16_t tot_dsds)
1110{
1111        void *next_dsd;
1112        uint8_t avail_dsds = 0;
1113        uint32_t dsd_list_len;
1114        struct dsd_dma *dsd_ptr;
1115        struct scatterlist *sg;
1116        int     i;
1117        struct scsi_cmnd *cmd;
1118        uint32_t *cur_dsd = dsd;
1119        uint16_t        used_dsds = tot_dsds;
1120
1121        cmd = GET_CMD_SP(sp);
1122        scsi_for_each_prot_sg(cmd, sg, tot_dsds, i) {
1123                dma_addr_t      sle_dma;
1124
1125                /* Allocate additional continuation packets? */
1126                if (avail_dsds == 0) {
1127                        avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ?
1128                                                QLA_DSDS_PER_IOCB : used_dsds;
1129                        dsd_list_len = (avail_dsds + 1) * 12;
1130                        used_dsds -= avail_dsds;
1131
1132                        /* allocate tracking DS */
1133                        dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC);
1134                        if (!dsd_ptr)
1135                                return 1;
1136
1137                        /* allocate new list */
1138                        dsd_ptr->dsd_addr = next_dsd =
1139                            dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC,
1140                                &dsd_ptr->dsd_list_dma);
1141
1142                        if (!next_dsd) {
1143                                /*
1144                                 * Need to cleanup only this dsd_ptr, rest
1145                                 * will be done by sp_free_dma()
1146                                 */
1147                                kfree(dsd_ptr);
1148                                return 1;
1149                        }
1150
1151                        list_add_tail(&dsd_ptr->list,
1152                            &((struct crc_context *)sp->u.scmd.ctx)->dsd_list);
1153
1154                        sp->flags |= SRB_CRC_CTX_DSD_VALID;
1155
1156                        /* add new list to cmd iocb or last list */
1157                        *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma));
1158                        *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma));
1159                        *cur_dsd++ = dsd_list_len;
1160                        cur_dsd = (uint32_t *)next_dsd;
1161                }
1162                sle_dma = sg_dma_address(sg);
1163
1164                *cur_dsd++ = cpu_to_le32(LSD(sle_dma));
1165                *cur_dsd++ = cpu_to_le32(MSD(sle_dma));
1166                *cur_dsd++ = cpu_to_le32(sg_dma_len(sg));
1167
1168                avail_dsds--;
1169        }
1170        /* Null termination */
1171        *cur_dsd++ = 0;
1172        *cur_dsd++ = 0;
1173        *cur_dsd++ = 0;
1174        return 0;
1175}
1176
1177/**
1178 * qla24xx_build_scsi_crc_2_iocbs() - Build IOCB command utilizing Command
1179 *                                                      Type 6 IOCB types.
1180 *
1181 * @sp: SRB command to process
1182 * @cmd_pkt: Command type 3 IOCB
1183 * @tot_dsds: Total number of segments to transfer
1184 */
1185static inline int
1186qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt,
1187    uint16_t tot_dsds, uint16_t tot_prot_dsds, uint16_t fw_prot_opts)
1188{
1189        uint32_t                *cur_dsd, *fcp_dl;
1190        scsi_qla_host_t         *vha;
1191        struct scsi_cmnd        *cmd;
1192        struct scatterlist      *cur_seg;
1193        int                     sgc;
1194        uint32_t                total_bytes = 0;
1195        uint32_t                data_bytes;
1196        uint32_t                dif_bytes;
1197        uint8_t                 bundling = 1;
1198        uint16_t                blk_size;
1199        uint8_t                 *clr_ptr;
1200        struct crc_context      *crc_ctx_pkt = NULL;
1201        struct qla_hw_data      *ha;
1202        uint8_t                 additional_fcpcdb_len;
1203        uint16_t                fcp_cmnd_len;
1204        struct fcp_cmnd         *fcp_cmnd;
1205        dma_addr_t              crc_ctx_dma;
1206        char                    tag[2];
1207
1208        cmd = GET_CMD_SP(sp);
1209
1210        sgc = 0;
1211        /* Update entry type to indicate Command Type CRC_2 IOCB */
1212        *((uint32_t *)(&cmd_pkt->entry_type)) =
1213            __constant_cpu_to_le32(COMMAND_TYPE_CRC_2);
1214
1215        vha = sp->fcport->vha;
1216        ha = vha->hw;
1217
1218        /* No data transfer */
1219        data_bytes = scsi_bufflen(cmd);
1220        if (!data_bytes || cmd->sc_data_direction == DMA_NONE) {
1221                cmd_pkt->byte_count = __constant_cpu_to_le32(0);
1222                return QLA_SUCCESS;
1223        }
1224
1225        cmd_pkt->vp_index = sp->fcport->vha->vp_idx;
1226
1227        /* Set transfer direction */
1228        if (cmd->sc_data_direction == DMA_TO_DEVICE) {
1229                cmd_pkt->control_flags =
1230                    __constant_cpu_to_le16(CF_WRITE_DATA);
1231        } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) {
1232                cmd_pkt->control_flags =
1233                    __constant_cpu_to_le16(CF_READ_DATA);
1234        }
1235
1236        if ((scsi_get_prot_op(cmd) == SCSI_PROT_READ_INSERT) ||
1237            (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_STRIP) ||
1238            (scsi_get_prot_op(cmd) == SCSI_PROT_READ_STRIP) ||
1239            (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_INSERT))
1240                bundling = 0;
1241
1242        /* Allocate CRC context from global pool */
1243        crc_ctx_pkt = sp->u.scmd.ctx =
1244            dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, &crc_ctx_dma);
1245
1246        if (!crc_ctx_pkt)
1247                goto crc_queuing_error;
1248
1249        /* Zero out CTX area. */
1250        clr_ptr = (uint8_t *)crc_ctx_pkt;
1251        memset(clr_ptr, 0, sizeof(*crc_ctx_pkt));
1252
1253        crc_ctx_pkt->crc_ctx_dma = crc_ctx_dma;
1254
1255        sp->flags |= SRB_CRC_CTX_DMA_VALID;
1256
1257        /* Set handle */
1258        crc_ctx_pkt->handle = cmd_pkt->handle;
1259
1260        INIT_LIST_HEAD(&crc_ctx_pkt->dsd_list);
1261
1262        qla24xx_set_t10dif_tags(sp, (struct fw_dif_context *)
1263            &crc_ctx_pkt->ref_tag, tot_prot_dsds);
1264
1265        cmd_pkt->crc_context_address[0] = cpu_to_le32(LSD(crc_ctx_dma));
1266        cmd_pkt->crc_context_address[1] = cpu_to_le32(MSD(crc_ctx_dma));
1267        cmd_pkt->crc_context_len = CRC_CONTEXT_LEN_FW;
1268
1269        /* Determine SCSI command length -- align to 4 byte boundary */
1270        if (cmd->cmd_len > 16) {
1271                additional_fcpcdb_len = cmd->cmd_len - 16;
1272                if ((cmd->cmd_len % 4) != 0) {
1273                        /* SCSI cmd > 16 bytes must be multiple of 4 */
1274                        goto crc_queuing_error;
1275                }
1276                fcp_cmnd_len = 12 + cmd->cmd_len + 4;
1277        } else {
1278                additional_fcpcdb_len = 0;
1279                fcp_cmnd_len = 12 + 16 + 4;
1280        }
1281
1282        fcp_cmnd = &crc_ctx_pkt->fcp_cmnd;
1283
1284        fcp_cmnd->additional_cdb_len = additional_fcpcdb_len;
1285        if (cmd->sc_data_direction == DMA_TO_DEVICE)
1286                fcp_cmnd->additional_cdb_len |= 1;
1287        else if (cmd->sc_data_direction == DMA_FROM_DEVICE)
1288                fcp_cmnd->additional_cdb_len |= 2;
1289
1290        int_to_scsilun(cmd->device->lun, &fcp_cmnd->lun);
1291        memcpy(fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len);
1292        cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(fcp_cmnd_len);
1293        cmd_pkt->fcp_cmnd_dseg_address[0] = cpu_to_le32(
1294            LSD(crc_ctx_dma + CRC_CONTEXT_FCPCMND_OFF));
1295        cmd_pkt->fcp_cmnd_dseg_address[1] = cpu_to_le32(
1296            MSD(crc_ctx_dma + CRC_CONTEXT_FCPCMND_OFF));
1297        fcp_cmnd->task_management = 0;
1298
1299        /*
1300         * Update tagged queuing modifier if using command tag queuing
1301         */
1302        if (scsi_populate_tag_msg(cmd, tag)) {
1303                switch (tag[0]) {
1304                case HEAD_OF_QUEUE_TAG:
1305                    fcp_cmnd->task_attribute = TSK_HEAD_OF_QUEUE;
1306                    break;
1307                case ORDERED_QUEUE_TAG:
1308                    fcp_cmnd->task_attribute = TSK_ORDERED;
1309                    break;
1310                default:
1311                    fcp_cmnd->task_attribute = 0;
1312                    break;
1313                }
1314        } else {
1315                fcp_cmnd->task_attribute = 0;
1316        }
1317
1318        cmd_pkt->fcp_rsp_dseg_len = 0; /* Let response come in status iocb */
1319
1320        /* Compute dif len and adjust data len to incude protection */
1321        dif_bytes = 0;
1322        blk_size = cmd->device->sector_size;
1323        dif_bytes = (data_bytes / blk_size) * 8;
1324
1325        switch (scsi_get_prot_op(GET_CMD_SP(sp))) {
1326        case SCSI_PROT_READ_INSERT:
1327        case SCSI_PROT_WRITE_STRIP:
1328            total_bytes = data_bytes;
1329            data_bytes += dif_bytes;
1330            break;
1331
1332        case SCSI_PROT_READ_STRIP:
1333        case SCSI_PROT_WRITE_INSERT:
1334        case SCSI_PROT_READ_PASS:
1335        case SCSI_PROT_WRITE_PASS:
1336            total_bytes = data_bytes + dif_bytes;
1337            break;
1338        default:
1339            BUG();
1340        }
1341
1342        if (!qla2x00_hba_err_chk_enabled(sp))
1343                fw_prot_opts |= 0x10; /* Disable Guard tag checking */
1344        /* HBA error checking enabled */
1345        else if (IS_PI_UNINIT_CAPABLE(ha)) {
1346                if ((scsi_get_prot_type(GET_CMD_SP(sp)) == SCSI_PROT_DIF_TYPE1)
1347                    || (scsi_get_prot_type(GET_CMD_SP(sp)) ==
1348                        SCSI_PROT_DIF_TYPE2))
1349                        fw_prot_opts |= BIT_10;
1350                else if (scsi_get_prot_type(GET_CMD_SP(sp)) ==
1351                    SCSI_PROT_DIF_TYPE3)
1352                        fw_prot_opts |= BIT_11;
1353        }
1354
1355        if (!bundling) {
1356                cur_dsd = (uint32_t *) &crc_ctx_pkt->u.nobundling.data_address;
1357        } else {
1358                /*
1359                 * Configure Bundling if we need to fetch interlaving
1360                 * protection PCI accesses
1361                 */
1362                fw_prot_opts |= PO_ENABLE_DIF_BUNDLING;
1363                crc_ctx_pkt->u.bundling.dif_byte_count = cpu_to_le32(dif_bytes);
1364                crc_ctx_pkt->u.bundling.dseg_count = cpu_to_le16(tot_dsds -
1365                                                        tot_prot_dsds);
1366                cur_dsd = (uint32_t *) &crc_ctx_pkt->u.bundling.data_address;
1367        }
1368
1369        /* Finish the common fields of CRC pkt */
1370        crc_ctx_pkt->blk_size = cpu_to_le16(blk_size);
1371        crc_ctx_pkt->prot_opts = cpu_to_le16(fw_prot_opts);
1372        crc_ctx_pkt->byte_count = cpu_to_le32(data_bytes);
1373        crc_ctx_pkt->guard_seed = __constant_cpu_to_le16(0);
1374        /* Fibre channel byte count */
1375        cmd_pkt->byte_count = cpu_to_le32(total_bytes);
1376        fcp_dl = (uint32_t *)(crc_ctx_pkt->fcp_cmnd.cdb + 16 +
1377            additional_fcpcdb_len);
1378        *fcp_dl = htonl(total_bytes);
1379
1380        if (!data_bytes || cmd->sc_data_direction == DMA_NONE) {
1381                cmd_pkt->byte_count = __constant_cpu_to_le32(0);
1382                return QLA_SUCCESS;
1383        }
1384        /* Walks data segments */
1385
1386        cmd_pkt->control_flags |=
1387            __constant_cpu_to_le16(CF_DATA_SEG_DESCR_ENABLE);
1388
1389        if (!bundling && tot_prot_dsds) {
1390                if (qla24xx_walk_and_build_sglist_no_difb(ha, sp,
1391                    cur_dsd, tot_dsds))
1392                        goto crc_queuing_error;
1393        } else if (qla24xx_walk_and_build_sglist(ha, sp, cur_dsd,
1394            (tot_dsds - tot_prot_dsds)))
1395                goto crc_queuing_error;
1396
1397        if (bundling && tot_prot_dsds) {
1398                /* Walks dif segments */
1399                cur_seg = scsi_prot_sglist(cmd);
1400                cmd_pkt->control_flags |=
1401                        __constant_cpu_to_le16(CF_DIF_SEG_DESCR_ENABLE);
1402                cur_dsd = (uint32_t *) &crc_ctx_pkt->u.bundling.dif_address;
1403                if (qla24xx_walk_and_build_prot_sglist(ha, sp, cur_dsd,
1404                    tot_prot_dsds))
1405                        goto crc_queuing_error;
1406        }
1407        return QLA_SUCCESS;
1408
1409crc_queuing_error:
1410        /* Cleanup will be performed by the caller */
1411
1412        return QLA_FUNCTION_FAILED;
1413}
1414
1415/**
1416 * qla24xx_start_scsi() - Send a SCSI command to the ISP
1417 * @sp: command to send to the ISP
1418 *
1419 * Returns non-zero if a failure occurred, else zero.
1420 */
1421int
1422qla24xx_start_scsi(srb_t *sp)
1423{
1424        int             ret, nseg;
1425        unsigned long   flags;
1426        uint32_t        *clr_ptr;
1427        uint32_t        index;
1428        uint32_t        handle;
1429        struct cmd_type_7 *cmd_pkt;
1430        uint16_t        cnt;
1431        uint16_t        req_cnt;
1432        uint16_t        tot_dsds;
1433        struct req_que *req = NULL;
1434        struct rsp_que *rsp = NULL;
1435        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
1436        struct scsi_qla_host *vha = sp->fcport->vha;
1437        struct qla_hw_data *ha = vha->hw;
1438        char            tag[2];
1439
1440        /* Setup device pointers. */
1441        ret = 0;
1442
1443        qla25xx_set_que(sp, &rsp);
1444        req = vha->req;
1445
1446        /* So we know we haven't pci_map'ed anything yet */
1447        tot_dsds = 0;
1448
1449        /* Send marker if required */
1450        if (vha->marker_needed != 0) {
1451                if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) !=
1452                    QLA_SUCCESS)
1453                        return QLA_FUNCTION_FAILED;
1454                vha->marker_needed = 0;
1455        }
1456
1457        /* Acquire ring specific lock */
1458        spin_lock_irqsave(&ha->hardware_lock, flags);
1459
1460        /* Check for room in outstanding command list. */
1461        handle = req->current_outstanding_cmd;
1462        for (index = 1; index < req->num_outstanding_cmds; index++) {
1463                handle++;
1464                if (handle == req->num_outstanding_cmds)
1465                        handle = 1;
1466                if (!req->outstanding_cmds[handle])
1467                        break;
1468        }
1469        if (index == req->num_outstanding_cmds)
1470                goto queuing_error;
1471
1472        /* Map the sg table so we have an accurate count of sg entries needed */
1473        if (scsi_sg_count(cmd)) {
1474                nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd),
1475                    scsi_sg_count(cmd), cmd->sc_data_direction);
1476                if (unlikely(!nseg))
1477                        goto queuing_error;
1478        } else
1479                nseg = 0;
1480
1481        tot_dsds = nseg;
1482        req_cnt = qla24xx_calc_iocbs(vha, tot_dsds);
1483        if (req->cnt < (req_cnt + 2)) {
1484                cnt = RD_REG_DWORD_RELAXED(req->req_q_out);
1485
1486                if (req->ring_index < cnt)
1487                        req->cnt = cnt - req->ring_index;
1488                else
1489                        req->cnt = req->length -
1490                                (req->ring_index - cnt);
1491                if (req->cnt < (req_cnt + 2))
1492                        goto queuing_error;
1493        }
1494
1495        /* Build command packet. */
1496        req->current_outstanding_cmd = handle;
1497        req->outstanding_cmds[handle] = sp;
1498        sp->handle = handle;
1499        cmd->host_scribble = (unsigned char *)(unsigned long)handle;
1500        req->cnt -= req_cnt;
1501
1502        cmd_pkt = (struct cmd_type_7 *)req->ring_ptr;
1503        cmd_pkt->handle = MAKE_HANDLE(req->id, handle);
1504
1505        /* Zero out remaining portion of packet. */
1506        /*    tagged queuing modifier -- default is TSK_SIMPLE (0). */
1507        clr_ptr = (uint32_t *)cmd_pkt + 2;
1508        memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8);
1509        cmd_pkt->dseg_count = cpu_to_le16(tot_dsds);
1510
1511        /* Set NPORT-ID and LUN number*/
1512        cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id);
1513        cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa;
1514        cmd_pkt->port_id[1] = sp->fcport->d_id.b.area;
1515        cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain;
1516        cmd_pkt->vp_index = sp->fcport->vha->vp_idx;
1517
1518        int_to_scsilun(cmd->device->lun, &cmd_pkt->lun);
1519        host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun));
1520
1521        /* Update tagged queuing modifier -- default is TSK_SIMPLE (0). */
1522        if (scsi_populate_tag_msg(cmd, tag)) {
1523                switch (tag[0]) {
1524                case HEAD_OF_QUEUE_TAG:
1525                        cmd_pkt->task = TSK_HEAD_OF_QUEUE;
1526                        break;
1527                case ORDERED_QUEUE_TAG:
1528                        cmd_pkt->task = TSK_ORDERED;
1529                        break;
1530                }
1531        }
1532
1533        /* Load SCSI command packet. */
1534        memcpy(cmd_pkt->fcp_cdb, cmd->cmnd, cmd->cmd_len);
1535        host_to_fcp_swap(cmd_pkt->fcp_cdb, sizeof(cmd_pkt->fcp_cdb));
1536
1537        cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd));
1538
1539        /* Build IOCB segments */
1540        qla24xx_build_scsi_iocbs(sp, cmd_pkt, tot_dsds);
1541
1542        /* Set total data segment count. */
1543        cmd_pkt->entry_count = (uint8_t)req_cnt;
1544        /* Specify response queue number where completion should happen */
1545        cmd_pkt->entry_status = (uint8_t) rsp->id;
1546        wmb();
1547        /* Adjust ring index. */
1548        req->ring_index++;
1549        if (req->ring_index == req->length) {
1550                req->ring_index = 0;
1551                req->ring_ptr = req->ring;
1552        } else
1553                req->ring_ptr++;
1554
1555        sp->flags |= SRB_DMA_VALID;
1556
1557        /* Set chip new ring index. */
1558        WRT_REG_DWORD(req->req_q_in, req->ring_index);
1559        RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr);
1560
1561        /* Manage unprocessed RIO/ZIO commands in response queue. */
1562        if (vha->flags.process_response_queue &&
1563                rsp->ring_ptr->signature != RESPONSE_PROCESSED)
1564                qla24xx_process_response_queue(vha, rsp);
1565
1566        spin_unlock_irqrestore(&ha->hardware_lock, flags);
1567        return QLA_SUCCESS;
1568
1569queuing_error:
1570        if (tot_dsds)
1571                scsi_dma_unmap(cmd);
1572
1573        spin_unlock_irqrestore(&ha->hardware_lock, flags);
1574
1575        return QLA_FUNCTION_FAILED;
1576}
1577
1578/**
1579 * qla24xx_dif_start_scsi() - Send a SCSI command to the ISP
1580 * @sp: command to send to the ISP
1581 *
1582 * Returns non-zero if a failure occurred, else zero.
1583 */
1584int
1585qla24xx_dif_start_scsi(srb_t *sp)
1586{
1587        int                     nseg;
1588        unsigned long           flags;
1589        uint32_t                *clr_ptr;
1590        uint32_t                index;
1591        uint32_t                handle;
1592        uint16_t                cnt;
1593        uint16_t                req_cnt = 0;
1594        uint16_t                tot_dsds;
1595        uint16_t                tot_prot_dsds;
1596        uint16_t                fw_prot_opts = 0;
1597        struct req_que          *req = NULL;
1598        struct rsp_que          *rsp = NULL;
1599        struct scsi_cmnd        *cmd = GET_CMD_SP(sp);
1600        struct scsi_qla_host    *vha = sp->fcport->vha;
1601        struct qla_hw_data      *ha = vha->hw;
1602        struct cmd_type_crc_2   *cmd_pkt;
1603        uint32_t                status = 0;
1604
1605#define QDSS_GOT_Q_SPACE        BIT_0
1606
1607        /* Only process protection or >16 cdb in this routine */
1608        if (scsi_get_prot_op(cmd) == SCSI_PROT_NORMAL) {
1609                if (cmd->cmd_len <= 16)
1610                        return qla24xx_start_scsi(sp);
1611        }
1612
1613        /* Setup device pointers. */
1614
1615        qla25xx_set_que(sp, &rsp);
1616        req = vha->req;
1617
1618        /* So we know we haven't pci_map'ed anything yet */
1619        tot_dsds = 0;
1620
1621        /* Send marker if required */
1622        if (vha->marker_needed != 0) {
1623                if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) !=
1624                    QLA_SUCCESS)
1625                        return QLA_FUNCTION_FAILED;
1626                vha->marker_needed = 0;
1627        }
1628
1629        /* Acquire ring specific lock */
1630        spin_lock_irqsave(&ha->hardware_lock, flags);
1631
1632        /* Check for room in outstanding command list. */
1633        handle = req->current_outstanding_cmd;
1634        for (index = 1; index < req->num_outstanding_cmds; index++) {
1635                handle++;
1636                if (handle == req->num_outstanding_cmds)
1637                        handle = 1;
1638                if (!req->outstanding_cmds[handle])
1639                        break;
1640        }
1641
1642        if (index == req->num_outstanding_cmds)
1643                goto queuing_error;
1644
1645        /* Compute number of required data segments */
1646        /* Map the sg table so we have an accurate count of sg entries needed */
1647        if (scsi_sg_count(cmd)) {
1648                nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd),
1649                    scsi_sg_count(cmd), cmd->sc_data_direction);
1650                if (unlikely(!nseg))
1651                        goto queuing_error;
1652                else
1653                        sp->flags |= SRB_DMA_VALID;
1654
1655                if ((scsi_get_prot_op(cmd) == SCSI_PROT_READ_INSERT) ||
1656                    (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_STRIP)) {
1657                        struct qla2_sgx sgx;
1658                        uint32_t        partial;
1659
1660                        memset(&sgx, 0, sizeof(struct qla2_sgx));
1661                        sgx.tot_bytes = scsi_bufflen(cmd);
1662                        sgx.cur_sg = scsi_sglist(cmd);
1663                        sgx.sp = sp;
1664
1665                        nseg = 0;
1666                        while (qla24xx_get_one_block_sg(
1667                            cmd->device->sector_size, &sgx, &partial))
1668                                nseg++;
1669                }
1670        } else
1671                nseg = 0;
1672
1673        /* number of required data segments */
1674        tot_dsds = nseg;
1675
1676        /* Compute number of required protection segments */
1677        if (qla24xx_configure_prot_mode(sp, &fw_prot_opts)) {
1678                nseg = dma_map_sg(&ha->pdev->dev, scsi_prot_sglist(cmd),
1679                    scsi_prot_sg_count(cmd), cmd->sc_data_direction);
1680                if (unlikely(!nseg))
1681                        goto queuing_error;
1682                else
1683                        sp->flags |= SRB_CRC_PROT_DMA_VALID;
1684
1685                if ((scsi_get_prot_op(cmd) == SCSI_PROT_READ_INSERT) ||
1686                    (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_STRIP)) {
1687                        nseg = scsi_bufflen(cmd) / cmd->device->sector_size;
1688                }
1689        } else {
1690                nseg = 0;
1691        }
1692
1693        req_cnt = 1;
1694        /* Total Data and protection sg segment(s) */
1695        tot_prot_dsds = nseg;
1696        tot_dsds += nseg;
1697        if (req->cnt < (req_cnt + 2)) {
1698                cnt = RD_REG_DWORD_RELAXED(req->req_q_out);
1699
1700                if (req->ring_index < cnt)
1701                        req->cnt = cnt - req->ring_index;
1702                else
1703                        req->cnt = req->length -
1704                                (req->ring_index - cnt);
1705                if (req->cnt < (req_cnt + 2))
1706                        goto queuing_error;
1707        }
1708
1709        status |= QDSS_GOT_Q_SPACE;
1710
1711        /* Build header part of command packet (excluding the OPCODE). */
1712        req->current_outstanding_cmd = handle;
1713        req->outstanding_cmds[handle] = sp;
1714        sp->handle = handle;
1715        cmd->host_scribble = (unsigned char *)(unsigned long)handle;
1716        req->cnt -= req_cnt;
1717
1718        /* Fill-in common area */
1719        cmd_pkt = (struct cmd_type_crc_2 *)req->ring_ptr;
1720        cmd_pkt->handle = MAKE_HANDLE(req->id, handle);
1721
1722        clr_ptr = (uint32_t *)cmd_pkt + 2;
1723        memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8);
1724
1725        /* Set NPORT-ID and LUN number*/
1726        cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id);
1727        cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa;
1728        cmd_pkt->port_id[1] = sp->fcport->d_id.b.area;
1729        cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain;
1730
1731        int_to_scsilun(cmd->device->lun, &cmd_pkt->lun);
1732        host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun));
1733
1734        /* Total Data and protection segment(s) */
1735        cmd_pkt->dseg_count = cpu_to_le16(tot_dsds);
1736
1737        /* Build IOCB segments and adjust for data protection segments */
1738        if (qla24xx_build_scsi_crc_2_iocbs(sp, (struct cmd_type_crc_2 *)
1739            req->ring_ptr, tot_dsds, tot_prot_dsds, fw_prot_opts) !=
1740                QLA_SUCCESS)
1741                goto queuing_error;
1742
1743        cmd_pkt->entry_count = (uint8_t)req_cnt;
1744        /* Specify response queue number where completion should happen */
1745        cmd_pkt->entry_status = (uint8_t) rsp->id;
1746        cmd_pkt->timeout = __constant_cpu_to_le16(0);
1747        wmb();
1748
1749        /* Adjust ring index. */
1750        req->ring_index++;
1751        if (req->ring_index == req->length) {
1752                req->ring_index = 0;
1753                req->ring_ptr = req->ring;
1754        } else
1755                req->ring_ptr++;
1756
1757        /* Set chip new ring index. */
1758        WRT_REG_DWORD(req->req_q_in, req->ring_index);
1759        RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr);
1760
1761        /* Manage unprocessed RIO/ZIO commands in response queue. */
1762        if (vha->flags.process_response_queue &&
1763            rsp->ring_ptr->signature != RESPONSE_PROCESSED)
1764                qla24xx_process_response_queue(vha, rsp);
1765
1766        spin_unlock_irqrestore(&ha->hardware_lock, flags);
1767
1768        return QLA_SUCCESS;
1769
1770queuing_error:
1771        if (status & QDSS_GOT_Q_SPACE) {
1772                req->outstanding_cmds[handle] = NULL;
1773                req->cnt += req_cnt;
1774        }
1775        /* Cleanup will be performed by the caller (queuecommand) */
1776
1777        spin_unlock_irqrestore(&ha->hardware_lock, flags);
1778        return QLA_FUNCTION_FAILED;
1779}
1780
1781
1782static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp)
1783{
1784        struct scsi_cmnd *cmd = GET_CMD_SP(sp);
1785        struct qla_hw_data *ha = sp->fcport->vha->hw;
1786        int affinity = cmd->request->cpu;
1787
1788        if (ha->flags.cpu_affinity_enabled && affinity >= 0 &&
1789                affinity < ha->max_rsp_queues - 1)
1790                *rsp = ha->rsp_q_map[affinity + 1];
1791         else
1792                *rsp = ha->rsp_q_map[0];
1793}
1794
1795/* Generic Control-SRB manipulation functions. */
1796void *
1797qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp)
1798{
1799        struct qla_hw_data *ha = vha->hw;
1800        struct req_que *req = ha->req_q_map[0];
1801        device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id);
1802        uint32_t index, handle;
1803        request_t *pkt;
1804        uint16_t cnt, req_cnt;
1805
1806        pkt = NULL;
1807        req_cnt = 1;
1808        handle = 0;
1809
1810        if (!sp)
1811                goto skip_cmd_array;
1812
1813        /* Check for room in outstanding command list. */
1814        handle = req->current_outstanding_cmd;
1815        for (index = 1; req->num_outstanding_cmds; index++) {
1816                handle++;
1817                if (handle == req->num_outstanding_cmds)
1818                        handle = 1;
1819                if (!req->outstanding_cmds[handle])
1820                        break;
1821        }
1822        if (index == req->num_outstanding_cmds) {
1823                ql_log(ql_log_warn, vha, 0x700b,
1824                    "No room on outstanding cmd array.\n");
1825                goto queuing_error;
1826        }
1827
1828        /* Prep command array. */
1829        req->current_outstanding_cmd = handle;
1830        req->outstanding_cmds[handle] = sp;
1831        sp->handle = handle;
1832
1833        /* Adjust entry-counts as needed. */
1834        if (sp->type != SRB_SCSI_CMD)
1835                req_cnt = sp->iocbs;
1836
1837skip_cmd_array:
1838        /* Check for room on request queue. */
1839        if (req->cnt < req_cnt) {
1840                if (ha->mqenable || IS_QLA83XX(ha))
1841                        cnt = RD_REG_DWORD(&reg->isp25mq.req_q_out);
1842                else if (IS_QLA82XX(ha))
1843                        cnt = RD_REG_DWORD(&reg->isp82.req_q_out);
1844                else if (IS_FWI2_CAPABLE(ha))
1845                        cnt = RD_REG_DWORD(&reg->isp24.req_q_out);
1846                else if (IS_QLAFX00(ha))
1847                        cnt = RD_REG_DWORD(&reg->ispfx00.req_q_out);
1848                else
1849                        cnt = qla2x00_debounce_register(
1850                            ISP_REQ_Q_OUT(ha, &reg->isp));
1851
1852                if  (req->ring_index < cnt)
1853                        req->cnt = cnt - req->ring_index;
1854                else
1855                        req->cnt = req->length -
1856                            (req->ring_index - cnt);
1857        }
1858        if (req->cnt < req_cnt)
1859                goto queuing_error;
1860
1861        /* Prep packet */
1862        req->cnt -= req_cnt;
1863        pkt = req->ring_ptr;
1864        memset(pkt, 0, REQUEST_ENTRY_SIZE);
1865        if (IS_QLAFX00(ha)) {
1866                WRT_REG_BYTE(&pkt->entry_count, req_cnt);
1867                WRT_REG_WORD(&pkt->handle, handle);
1868        } else {
1869                pkt->entry_count = req_cnt;
1870                pkt->handle = handle;
1871        }
1872
1873queuing_error:
1874        return pkt;
1875}
1876
1877static void
1878qla24xx_login_iocb(srb_t *sp, struct logio_entry_24xx *logio)
1879{
1880        struct srb_iocb *lio = &sp->u.iocb_cmd;
1881
1882        logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
1883        logio->control_flags = cpu_to_le16(LCF_COMMAND_PLOGI);
1884        if (lio->u.logio.flags & SRB_LOGIN_COND_PLOGI)
1885                logio->control_flags |= cpu_to_le16(LCF_COND_PLOGI);
1886        if (lio->u.logio.flags & SRB_LOGIN_SKIP_PRLI)
1887                logio->control_flags |= cpu_to_le16(LCF_SKIP_PRLI);
1888        logio->nport_handle = cpu_to_le16(sp->fcport->loop_id);
1889        logio->port_id[0] = sp->fcport->d_id.b.al_pa;
1890        logio->port_id[1] = sp->fcport->d_id.b.area;
1891        logio->port_id[2] = sp->fcport->d_id.b.domain;
1892        logio->vp_index = sp->fcport->vha->vp_idx;
1893}
1894
1895static void
1896qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx)
1897{
1898        struct qla_hw_data *ha = sp->fcport->vha->hw;
1899        struct srb_iocb *lio = &sp->u.iocb_cmd;
1900        uint16_t opts;
1901
1902        mbx->entry_type = MBX_IOCB_TYPE;
1903        SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id);
1904        mbx->mb0 = cpu_to_le16(MBC_LOGIN_FABRIC_PORT);
1905        opts = lio->u.logio.flags & SRB_LOGIN_COND_PLOGI ? BIT_0 : 0;
1906        opts |= lio->u.logio.flags & SRB_LOGIN_SKIP_PRLI ? BIT_1 : 0;
1907        if (HAS_EXTENDED_IDS(ha)) {
1908                mbx->mb1 = cpu_to_le16(sp->fcport->loop_id);
1909                mbx->mb10 = cpu_to_le16(opts);
1910        } else {
1911                mbx->mb1 = cpu_to_le16((sp->fcport->loop_id << 8) | opts);
1912        }
1913        mbx->mb2 = cpu_to_le16(sp->fcport->d_id.b.domain);
1914        mbx->mb3 = cpu_to_le16(sp->fcport->d_id.b.area << 8 |
1915            sp->fcport->d_id.b.al_pa);
1916        mbx->mb9 = cpu_to_le16(sp->fcport->vha->vp_idx);
1917}
1918
1919static void
1920qla24xx_logout_iocb(srb_t *sp, struct logio_entry_24xx *logio)
1921{
1922        logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
1923        logio->control_flags =
1924            cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO);
1925        logio->nport_handle = cpu_to_le16(sp->fcport->loop_id);
1926        logio->port_id[0] = sp->fcport->d_id.b.al_pa;
1927        logio->port_id[1] = sp->fcport->d_id.b.area;
1928        logio->port_id[2] = sp->fcport->d_id.b.domain;
1929        logio->vp_index = sp->fcport->vha->vp_idx;
1930}
1931
1932static void
1933qla2x00_logout_iocb(srb_t *sp, struct mbx_entry *mbx)
1934{
1935        struct qla_hw_data *ha = sp->fcport->vha->hw;
1936
1937        mbx->entry_type = MBX_IOCB_TYPE;
1938        SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id);
1939        mbx->mb0 = cpu_to_le16(MBC_LOGOUT_FABRIC_PORT);
1940        mbx->mb1 = HAS_EXTENDED_IDS(ha) ?
1941            cpu_to_le16(sp->fcport->loop_id):
1942            cpu_to_le16(sp->fcport->loop_id << 8);
1943        mbx->mb2 = cpu_to_le16(sp->fcport->d_id.b.domain);
1944        mbx->mb3 = cpu_to_le16(sp->fcport->d_id.b.area << 8 |
1945            sp->fcport->d_id.b.al_pa);
1946        mbx->mb9 = cpu_to_le16(sp->fcport->vha->vp_idx);
1947        /* Implicit: mbx->mbx10 = 0. */
1948}
1949
1950static void
1951qla24xx_adisc_iocb(srb_t *sp, struct logio_entry_24xx *logio)
1952{
1953        logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
1954        logio->control_flags = cpu_to_le16(LCF_COMMAND_ADISC);
1955        logio->nport_handle = cpu_to_le16(sp->fcport->loop_id);
1956        logio->vp_index = sp->fcport->vha->vp_idx;
1957}
1958
1959static void
1960qla2x00_adisc_iocb(srb_t *sp, struct mbx_entry *mbx)
1961{
1962        struct qla_hw_data *ha = sp->fcport->vha->hw;
1963
1964        mbx->entry_type = MBX_IOCB_TYPE;
1965        SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id);
1966        mbx->mb0 = cpu_to_le16(MBC_GET_PORT_DATABASE);
1967        if (HAS_EXTENDED_IDS(ha)) {
1968                mbx->mb1 = cpu_to_le16(sp->fcport->loop_id);
1969                mbx->mb10 = cpu_to_le16(BIT_0);
1970        } else {
1971                mbx->mb1 = cpu_to_le16((sp->fcport->loop_id << 8) | BIT_0);
1972        }
1973        mbx->mb2 = cpu_to_le16(MSW(ha->async_pd_dma));
1974        mbx->mb3 = cpu_to_le16(LSW(ha->async_pd_dma));
1975        mbx->mb6 = cpu_to_le16(MSW(MSD(ha->async_pd_dma)));
1976        mbx->mb7 = cpu_to_le16(LSW(MSD(ha->async_pd_dma)));
1977        mbx->mb9 = cpu_to_le16(sp->fcport->vha->vp_idx);
1978}
1979
1980static void
1981qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk)
1982{
1983        uint32_t flags;
1984        unsigned int lun;
1985        struct fc_port *fcport = sp->fcport;
1986        scsi_qla_host_t *vha = fcport->vha;
1987        struct qla_hw_data *ha = vha->hw;
1988        struct srb_iocb *iocb = &sp->u.iocb_cmd;
1989        struct req_que *req = vha->req;
1990
1991        flags = iocb->u.tmf.flags;
1992        lun = iocb->u.tmf.lun;
1993
1994        tsk->entry_type = TSK_MGMT_IOCB_TYPE;
1995        tsk->entry_count = 1;
1996        tsk->handle = MAKE_HANDLE(req->id, tsk->handle);
1997        tsk->nport_handle = cpu_to_le16(fcport->loop_id);
1998        tsk->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2);
1999        tsk->control_flags = cpu_to_le32(flags);
2000        tsk->port_id[0] = fcport->d_id.b.al_pa;
2001        tsk->port_id[1] = fcport->d_id.b.area;
2002        tsk->port_id[2] = fcport->d_id.b.domain;
2003        tsk->vp_index = fcport->vha->vp_idx;
2004
2005        if (flags == TCF_LUN_RESET) {
2006                int_to_scsilun(lun, &tsk->lun);
2007                host_to_fcp_swap((uint8_t *)&tsk->lun,
2008                        sizeof(tsk->lun));
2009        }
2010}
2011
2012static void
2013qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb)
2014{
2015        struct fc_bsg_job *bsg_job = sp->u.bsg_job;
2016
2017        els_iocb->entry_type = ELS_IOCB_TYPE;
2018        els_iocb->entry_count = 1;
2019        els_iocb->sys_define = 0;
2020        els_iocb->entry_status = 0;
2021        els_iocb->handle = sp->handle;
2022        els_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
2023        els_iocb->tx_dsd_count = __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt);
2024        els_iocb->vp_index = sp->fcport->vha->vp_idx;
2025        els_iocb->sof_type = EST_SOFI3;
2026        els_iocb->rx_dsd_count = __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt);
2027
2028        els_iocb->opcode =
2029            sp->type == SRB_ELS_CMD_RPT ?
2030            bsg_job->request->rqst_data.r_els.els_code :
2031            bsg_job->request->rqst_data.h_els.command_code;
2032        els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
2033        els_iocb->port_id[1] = sp->fcport->d_id.b.area;
2034        els_iocb->port_id[2] = sp->fcport->d_id.b.domain;
2035        els_iocb->control_flags = 0;
2036        els_iocb->rx_byte_count =
2037            cpu_to_le32(bsg_job->reply_payload.payload_len);
2038        els_iocb->tx_byte_count =
2039            cpu_to_le32(bsg_job->request_payload.payload_len);
2040
2041        els_iocb->tx_address[0] = cpu_to_le32(LSD(sg_dma_address
2042            (bsg_job->request_payload.sg_list)));
2043        els_iocb->tx_address[1] = cpu_to_le32(MSD(sg_dma_address
2044            (bsg_job->request_payload.sg_list)));
2045        els_iocb->tx_len = cpu_to_le32(sg_dma_len
2046            (bsg_job->request_payload.sg_list));
2047
2048        els_iocb->rx_address[0] = cpu_to_le32(LSD(sg_dma_address
2049            (bsg_job->reply_payload.sg_list)));
2050        els_iocb->rx_address[1] = cpu_to_le32(MSD(sg_dma_address
2051            (bsg_job->reply_payload.sg_list)));
2052        els_iocb->rx_len = cpu_to_le32(sg_dma_len
2053            (bsg_job->reply_payload.sg_list));
2054}
2055
2056static void
2057qla2x00_ct_iocb(srb_t *sp, ms_iocb_entry_t *ct_iocb)
2058{
2059        uint16_t        avail_dsds;
2060        uint32_t        *cur_dsd;
2061        struct scatterlist *sg;
2062        int index;
2063        uint16_t tot_dsds;
2064        scsi_qla_host_t *vha = sp->fcport->vha;
2065        struct qla_hw_data *ha = vha->hw;
2066        struct fc_bsg_job *bsg_job = sp->u.bsg_job;
2067        int loop_iterartion = 0;
2068        int cont_iocb_prsnt = 0;
2069        int entry_count = 1;
2070
2071        memset(ct_iocb, 0, sizeof(ms_iocb_entry_t));
2072        ct_iocb->entry_type = CT_IOCB_TYPE;
2073        ct_iocb->entry_status = 0;
2074        ct_iocb->handle1 = sp->handle;
2075        SET_TARGET_ID(ha, ct_iocb->loop_id, sp->fcport->loop_id);
2076        ct_iocb->status = __constant_cpu_to_le16(0);
2077        ct_iocb->control_flags = __constant_cpu_to_le16(0);
2078        ct_iocb->timeout = 0;
2079        ct_iocb->cmd_dsd_count =
2080            __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt);
2081        ct_iocb->total_dsd_count =
2082            __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt + 1);
2083        ct_iocb->req_bytecount =
2084            cpu_to_le32(bsg_job->request_payload.payload_len);
2085        ct_iocb->rsp_bytecount =
2086            cpu_to_le32(bsg_job->reply_payload.payload_len);
2087
2088        ct_iocb->dseg_req_address[0] = cpu_to_le32(LSD(sg_dma_address
2089            (bsg_job->request_payload.sg_list)));
2090        ct_iocb->dseg_req_address[1] = cpu_to_le32(MSD(sg_dma_address
2091            (bsg_job->request_payload.sg_list)));
2092        ct_iocb->dseg_req_length = ct_iocb->req_bytecount;
2093
2094        ct_iocb->dseg_rsp_address[0] = cpu_to_le32(LSD(sg_dma_address
2095            (bsg_job->reply_payload.sg_list)));
2096        ct_iocb->dseg_rsp_address[1] = cpu_to_le32(MSD(sg_dma_address
2097            (bsg_job->reply_payload.sg_list)));
2098        ct_iocb->dseg_rsp_length = ct_iocb->rsp_bytecount;
2099
2100        avail_dsds = 1;
2101        cur_dsd = (uint32_t *)ct_iocb->dseg_rsp_address;
2102        index = 0;
2103        tot_dsds = bsg_job->reply_payload.sg_cnt;
2104
2105        for_each_sg(bsg_job->reply_payload.sg_list, sg, tot_dsds, index) {
2106                dma_addr_t       sle_dma;
2107                cont_a64_entry_t *cont_pkt;
2108
2109                /* Allocate additional continuation packets? */
2110                if (avail_dsds == 0) {
2111                        /*
2112                        * Five DSDs are available in the Cont.
2113                        * Type 1 IOCB.
2114                               */
2115                        cont_pkt = qla2x00_prep_cont_type1_iocb(vha,
2116                            vha->hw->req_q_map[0]);
2117                        cur_dsd = (uint32_t *) cont_pkt->dseg_0_address;
2118                        avail_dsds = 5;
2119                        cont_iocb_prsnt = 1;
2120                        entry_count++;
2121                }
2122
2123                sle_dma = sg_dma_address(sg);
2124                *cur_dsd++   = cpu_to_le32(LSD(sle_dma));
2125                *cur_dsd++   = cpu_to_le32(MSD(sle_dma));
2126                *cur_dsd++   = cpu_to_le32(sg_dma_len(sg));
2127                loop_iterartion++;
2128                avail_dsds--;
2129        }
2130        ct_iocb->entry_count = entry_count;
2131}
2132
2133static void
2134qla24xx_ct_iocb(srb_t *sp, struct ct_entry_24xx *ct_iocb)
2135{
2136        uint16_t        avail_dsds;
2137        uint32_t        *cur_dsd;
2138        struct scatterlist *sg;
2139        int index;
2140        uint16_t tot_dsds;
2141        scsi_qla_host_t *vha = sp->fcport->vha;
2142        struct qla_hw_data *ha = vha->hw;
2143        struct fc_bsg_job *bsg_job = sp->u.bsg_job;
2144        int loop_iterartion = 0;
2145        int cont_iocb_prsnt = 0;
2146        int entry_count = 1;
2147
2148        ct_iocb->entry_type = CT_IOCB_TYPE;
2149        ct_iocb->entry_status = 0;
2150        ct_iocb->sys_define = 0;
2151        ct_iocb->handle = sp->handle;
2152
2153        ct_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
2154        ct_iocb->vp_index = sp->fcport->vha->vp_idx;
2155        ct_iocb->comp_status = __constant_cpu_to_le16(0);
2156
2157        ct_iocb->cmd_dsd_count =
2158            __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt);
2159        ct_iocb->timeout = 0;
2160        ct_iocb->rsp_dsd_count =
2161            __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt);
2162        ct_iocb->rsp_byte_count =
2163            cpu_to_le32(bsg_job->reply_payload.payload_len);
2164        ct_iocb->cmd_byte_count =
2165            cpu_to_le32(bsg_job->request_payload.payload_len);
2166        ct_iocb->dseg_0_address[0] = cpu_to_le32(LSD(sg_dma_address
2167            (bsg_job->request_payload.sg_list)));
2168        ct_iocb->dseg_0_address[1] = cpu_to_le32(MSD(sg_dma_address
2169           (bsg_job->request_payload.sg_list)));
2170        ct_iocb->dseg_0_len = cpu_to_le32(sg_dma_len
2171            (bsg_job->request_payload.sg_list));
2172
2173        avail_dsds = 1;
2174        cur_dsd = (uint32_t *)ct_iocb->dseg_1_address;
2175        index = 0;
2176        tot_dsds = bsg_job->reply_payload.sg_cnt;
2177
2178        for_each_sg(bsg_job->reply_payload.sg_list, sg, tot_dsds, index) {
2179                dma_addr_t       sle_dma;
2180                cont_a64_entry_t *cont_pkt;
2181
2182                /* Allocate additional continuation packets? */
2183                if (avail_dsds == 0) {
2184                        /*
2185                        * Five DSDs are available in the Cont.
2186                        * Type 1 IOCB.
2187                               */
2188                        cont_pkt = qla2x00_prep_cont_type1_iocb(vha,
2189                            ha->req_q_map[0]);
2190                        cur_dsd = (uint32_t *) cont_pkt->dseg_0_address;
2191                        avail_dsds = 5;
2192                        cont_iocb_prsnt = 1;
2193                        entry_count++;
2194                }
2195
2196                sle_dma = sg_dma_address(sg);
2197                *cur_dsd++   = cpu_to_le32(LSD(sle_dma));
2198                *cur_dsd++   = cpu_to_le32(MSD(sle_dma));
2199                *cur_dsd++   = cpu_to_le32(sg_dma_len(sg));
2200                loop_iterartion++;
2201                avail_dsds--;
2202        }
2203        ct_iocb->entry_count = entry_count;
2204}
2205
2206/*
2207 * qla82xx_start_scsi() - Send a SCSI command to the ISP
2208 * @sp: command to send to the ISP
2209 *
2210 * Returns non-zero if a failure occurred, else zero.
2211 */
2212int
2213qla82xx_start_scsi(srb_t *sp)
2214{
2215        int             ret, nseg;
2216        unsigned long   flags;
2217        struct scsi_cmnd *cmd;
2218        uint32_t        *clr_ptr;
2219        uint32_t        index;
2220        uint32_t        handle;
2221        uint16_t        cnt;
2222        uint16_t        req_cnt;
2223        uint16_t        tot_dsds;
2224        struct device_reg_82xx __iomem *reg;
2225        uint32_t dbval;
2226        uint32_t *fcp_dl;
2227        uint8_t additional_cdb_len;
2228        struct ct6_dsd *ctx;
2229        struct scsi_qla_host *vha = sp->fcport->vha;
2230        struct qla_hw_data *ha = vha->hw;
2231        struct req_que *req = NULL;
2232        struct rsp_que *rsp = NULL;
2233        char tag[2];
2234
2235        /* Setup device pointers. */
2236        ret = 0;
2237        reg = &ha->iobase->isp82;
2238        cmd = GET_CMD_SP(sp);
2239        req = vha->req;
2240        rsp = ha->rsp_q_map[0];
2241
2242        /* So we know we haven't pci_map'ed anything yet */
2243        tot_dsds = 0;
2244
2245        dbval = 0x04 | (ha->portnum << 5);
2246
2247        /* Send marker if required */
2248        if (vha->marker_needed != 0) {
2249                if (qla2x00_marker(vha, req,
2250                        rsp, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) {
2251                        ql_log(ql_log_warn, vha, 0x300c,
2252                            "qla2x00_marker failed for cmd=%p.\n", cmd);
2253                        return QLA_FUNCTION_FAILED;
2254                }
2255                vha->marker_needed = 0;
2256        }
2257
2258        /* Acquire ring specific lock */
2259        spin_lock_irqsave(&ha->hardware_lock, flags);
2260
2261        /* Check for room in outstanding command list. */
2262        handle = req->current_outstanding_cmd;
2263        for (index = 1; index < req->num_outstanding_cmds; index++) {
2264                handle++;
2265                if (handle == req->num_outstanding_cmds)
2266                        handle = 1;
2267                if (!req->outstanding_cmds[handle])
2268                        break;
2269        }
2270        if (index == req->num_outstanding_cmds)
2271                goto queuing_error;
2272
2273        /* Map the sg table so we have an accurate count of sg entries needed */
2274        if (scsi_sg_count(cmd)) {
2275                nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd),
2276                    scsi_sg_count(cmd), cmd->sc_data_direction);
2277                if (unlikely(!nseg))
2278                        goto queuing_error;
2279        } else
2280                nseg = 0;
2281
2282        tot_dsds = nseg;
2283
2284        if (tot_dsds > ql2xshiftctondsd) {
2285                struct cmd_type_6 *cmd_pkt;
2286                uint16_t more_dsd_lists = 0;
2287                struct dsd_dma *dsd_ptr;
2288                uint16_t i;
2289
2290                more_dsd_lists = qla24xx_calc_dsd_lists(tot_dsds);
2291                if ((more_dsd_lists + ha->gbl_dsd_inuse) >= NUM_DSD_CHAIN) {
2292                        ql_dbg(ql_dbg_io, vha, 0x300d,
2293                            "Num of DSD list %d is than %d for cmd=%p.\n",
2294                            more_dsd_lists + ha->gbl_dsd_inuse, NUM_DSD_CHAIN,
2295                            cmd);
2296                        goto queuing_error;
2297                }
2298
2299                if (more_dsd_lists <= ha->gbl_dsd_avail)
2300                        goto sufficient_dsds;
2301                else
2302                        more_dsd_lists -= ha->gbl_dsd_avail;
2303
2304                for (i = 0; i < more_dsd_lists; i++) {
2305                        dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC);
2306                        if (!dsd_ptr) {
2307                                ql_log(ql_log_fatal, vha, 0x300e,
2308                                    "Failed to allocate memory for dsd_dma "
2309                                    "for cmd=%p.\n", cmd);
2310                                goto queuing_error;
2311                        }
2312
2313                        dsd_ptr->dsd_addr = dma_pool_alloc(ha->dl_dma_pool,
2314                                GFP_ATOMIC, &dsd_ptr->dsd_list_dma);
2315                        if (!dsd_ptr->dsd_addr) {
2316                                kfree(dsd_ptr);
2317                                ql_log(ql_log_fatal, vha, 0x300f,
2318                                    "Failed to allocate memory for dsd_addr "
2319                                    "for cmd=%p.\n", cmd);
2320                                goto queuing_error;
2321                        }
2322                        list_add_tail(&dsd_ptr->list, &ha->gbl_dsd_list);
2323                        ha->gbl_dsd_avail++;
2324                }
2325
2326sufficient_dsds:
2327                req_cnt = 1;
2328
2329                if (req->cnt < (req_cnt + 2)) {
2330                        cnt = (uint16_t)RD_REG_DWORD_RELAXED(
2331                                &reg->req_q_out[0]);
2332                        if (req->ring_index < cnt)
2333                                req->cnt = cnt - req->ring_index;
2334                        else
2335                                req->cnt = req->length -
2336                                        (req->ring_index - cnt);
2337                        if (req->cnt < (req_cnt + 2))
2338                                goto queuing_error;
2339                }
2340
2341                ctx = sp->u.scmd.ctx =
2342                    mempool_alloc(ha->ctx_mempool, GFP_ATOMIC);
2343                if (!ctx) {
2344                        ql_log(ql_log_fatal, vha, 0x3010,
2345                            "Failed to allocate ctx for cmd=%p.\n", cmd);
2346                        goto queuing_error;
2347                }
2348
2349                memset(ctx, 0, sizeof(struct ct6_dsd));
2350                ctx->fcp_cmnd = dma_pool_alloc(ha->fcp_cmnd_dma_pool,
2351                        GFP_ATOMIC, &ctx->fcp_cmnd_dma);
2352                if (!ctx->fcp_cmnd) {
2353                        ql_log(ql_log_fatal, vha, 0x3011,
2354                            "Failed to allocate fcp_cmnd for cmd=%p.\n", cmd);
2355                        goto queuing_error;
2356                }
2357
2358                /* Initialize the DSD list and dma handle */
2359                INIT_LIST_HEAD(&ctx->dsd_list);
2360                ctx->dsd_use_cnt = 0;
2361
2362                if (cmd->cmd_len > 16) {
2363                        additional_cdb_len = cmd->cmd_len - 16;
2364                        if ((cmd->cmd_len % 4) != 0) {
2365                                /* SCSI command bigger than 16 bytes must be
2366                                 * multiple of 4
2367                                 */
2368                                ql_log(ql_log_warn, vha, 0x3012,
2369                                    "scsi cmd len %d not multiple of 4 "
2370                                    "for cmd=%p.\n", cmd->cmd_len, cmd);
2371                                goto queuing_error_fcp_cmnd;
2372                        }
2373                        ctx->fcp_cmnd_len = 12 + cmd->cmd_len + 4;
2374                } else {
2375                        additional_cdb_len = 0;
2376                        ctx->fcp_cmnd_len = 12 + 16 + 4;
2377                }
2378
2379                cmd_pkt = (struct cmd_type_6 *)req->ring_ptr;
2380                cmd_pkt->handle = MAKE_HANDLE(req->id, handle);
2381
2382                /* Zero out remaining portion of packet. */
2383                /*    tagged queuing modifier -- default is TSK_SIMPLE (0). */
2384                clr_ptr = (uint32_t *)cmd_pkt + 2;
2385                memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8);
2386                cmd_pkt->dseg_count = cpu_to_le16(tot_dsds);
2387
2388                /* Set NPORT-ID and LUN number*/
2389                cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id);
2390                cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa;
2391                cmd_pkt->port_id[1] = sp->fcport->d_id.b.area;
2392                cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain;
2393                cmd_pkt->vp_index = sp->fcport->vha->vp_idx;
2394
2395                /* Build IOCB segments */
2396                if (qla24xx_build_scsi_type_6_iocbs(sp, cmd_pkt, tot_dsds))
2397                        goto queuing_error_fcp_cmnd;
2398
2399                int_to_scsilun(cmd->device->lun, &cmd_pkt->lun);
2400                host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun));
2401
2402                /* build FCP_CMND IU */
2403                memset(ctx->fcp_cmnd, 0, sizeof(struct fcp_cmnd));
2404                int_to_scsilun(cmd->device->lun, &ctx->fcp_cmnd->lun);
2405                ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len;
2406
2407                if (cmd->sc_data_direction == DMA_TO_DEVICE)
2408                        ctx->fcp_cmnd->additional_cdb_len |= 1;
2409                else if (cmd->sc_data_direction == DMA_FROM_DEVICE)
2410                        ctx->fcp_cmnd->additional_cdb_len |= 2;
2411
2412                /*
2413                 * Update tagged queuing modifier -- default is TSK_SIMPLE (0).
2414                 */
2415                if (scsi_populate_tag_msg(cmd, tag)) {
2416                        switch (tag[0]) {
2417                        case HEAD_OF_QUEUE_TAG:
2418                                ctx->fcp_cmnd->task_attribute =
2419                                    TSK_HEAD_OF_QUEUE;
2420                                break;
2421                        case ORDERED_QUEUE_TAG:
2422                                ctx->fcp_cmnd->task_attribute =
2423                                    TSK_ORDERED;
2424                                break;
2425                        }
2426                }
2427
2428                /* Populate the FCP_PRIO. */
2429                if (ha->flags.fcp_prio_enabled)
2430                        ctx->fcp_cmnd->task_attribute |=
2431                            sp->fcport->fcp_prio << 3;
2432
2433                memcpy(ctx->fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len);
2434
2435                fcp_dl = (uint32_t *)(ctx->fcp_cmnd->cdb + 16 +
2436                    additional_cdb_len);
2437                *fcp_dl = htonl((uint32_t)scsi_bufflen(cmd));
2438
2439                cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(ctx->fcp_cmnd_len);
2440                cmd_pkt->fcp_cmnd_dseg_address[0] =
2441                    cpu_to_le32(LSD(ctx->fcp_cmnd_dma));
2442                cmd_pkt->fcp_cmnd_dseg_address[1] =
2443                    cpu_to_le32(MSD(ctx->fcp_cmnd_dma));
2444
2445                sp->flags |= SRB_FCP_CMND_DMA_VALID;
2446                cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd));
2447                /* Set total data segment count. */
2448                cmd_pkt->entry_count = (uint8_t)req_cnt;
2449                /* Specify response queue number where
2450                 * completion should happen
2451                 */
2452                cmd_pkt->entry_status = (uint8_t) rsp->id;
2453        } else {
2454                struct cmd_type_7 *cmd_pkt;
2455                req_cnt = qla24xx_calc_iocbs(vha, tot_dsds);
2456                if (req->cnt < (req_cnt + 2)) {
2457                        cnt = (uint16_t)RD_REG_DWORD_RELAXED(
2458                            &reg->req_q_out[0]);
2459                        if (req->ring_index < cnt)
2460                                req->cnt = cnt - req->ring_index;
2461                        else
2462                                req->cnt = req->length -
2463                                        (req->ring_index - cnt);
2464                }
2465                if (req->cnt < (req_cnt + 2))
2466                        goto queuing_error;
2467
2468                cmd_pkt = (struct cmd_type_7 *)req->ring_ptr;
2469                cmd_pkt->handle = MAKE_HANDLE(req->id, handle);
2470
2471                /* Zero out remaining portion of packet. */
2472                /* tagged queuing modifier -- default is TSK_SIMPLE (0).*/
2473                clr_ptr = (uint32_t *)cmd_pkt + 2;
2474                memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8);
2475                cmd_pkt->dseg_count = cpu_to_le16(tot_dsds);
2476
2477                /* Set NPORT-ID and LUN number*/
2478                cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id);
2479                cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa;
2480                cmd_pkt->port_id[1] = sp->fcport->d_id.b.area;
2481                cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain;
2482                cmd_pkt->vp_index = sp->fcport->vha->vp_idx;
2483
2484                int_to_scsilun(cmd->device->lun, &cmd_pkt->lun);
2485                host_to_fcp_swap((uint8_t *)&cmd_pkt->lun,
2486                    sizeof(cmd_pkt->lun));
2487
2488                /*
2489                 * Update tagged queuing modifier -- default is TSK_SIMPLE (0).
2490                 */
2491                if (scsi_populate_tag_msg(cmd, tag)) {
2492                        switch (tag[0]) {
2493                        case HEAD_OF_QUEUE_TAG:
2494                                cmd_pkt->task = TSK_HEAD_OF_QUEUE;
2495                                break;
2496                        case ORDERED_QUEUE_TAG:
2497                                cmd_pkt->task = TSK_ORDERED;
2498                                break;
2499                        }
2500                }
2501
2502                /* Populate the FCP_PRIO. */
2503                if (ha->flags.fcp_prio_enabled)
2504                        cmd_pkt->task |= sp->fcport->fcp_prio << 3;
2505
2506                /* Load SCSI command packet. */
2507                memcpy(cmd_pkt->fcp_cdb, cmd->cmnd, cmd->cmd_len);
2508                host_to_fcp_swap(cmd_pkt->fcp_cdb, sizeof(cmd_pkt->fcp_cdb));
2509
2510                cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd));
2511
2512                /* Build IOCB segments */
2513                qla24xx_build_scsi_iocbs(sp, cmd_pkt, tot_dsds);
2514
2515                /* Set total data segment count. */
2516                cmd_pkt->entry_count = (uint8_t)req_cnt;
2517                /* Specify response queue number where
2518                 * completion should happen.
2519                 */
2520                cmd_pkt->entry_status = (uint8_t) rsp->id;
2521
2522        }
2523        /* Build command packet. */
2524        req->current_outstanding_cmd = handle;
2525        req->outstanding_cmds[handle] = sp;
2526        sp->handle = handle;
2527        cmd->host_scribble = (unsigned char *)(unsigned long)handle;
2528        req->cnt -= req_cnt;
2529        wmb();
2530
2531        /* Adjust ring index. */
2532        req->ring_index++;
2533        if (req->ring_index == req->length) {
2534                req->ring_index = 0;
2535                req->ring_ptr = req->ring;
2536        } else
2537                req->ring_ptr++;
2538
2539        sp->flags |= SRB_DMA_VALID;
2540
2541        /* Set chip new ring index. */
2542        /* write, read and verify logic */
2543        dbval = dbval | (req->id << 8) | (req->ring_index << 16);
2544        if (ql2xdbwr)
2545                qla82xx_wr_32(ha, ha->nxdb_wr_ptr, dbval);
2546        else {
2547                WRT_REG_DWORD(
2548                        (unsigned long __iomem *)ha->nxdb_wr_ptr,
2549                        dbval);
2550                wmb();
2551                while (RD_REG_DWORD((void __iomem *)ha->nxdb_rd_ptr) != dbval) {
2552                        WRT_REG_DWORD(
2553                                (unsigned long __iomem *)ha->nxdb_wr_ptr,
2554                                dbval);
2555                        wmb();
2556                }
2557        }
2558
2559        /* Manage unprocessed RIO/ZIO commands in response queue. */
2560        if (vha->flags.process_response_queue &&
2561            rsp->ring_ptr->signature != RESPONSE_PROCESSED)
2562                qla24xx_process_response_queue(vha, rsp);
2563
2564        spin_unlock_irqrestore(&ha->hardware_lock, flags);
2565        return QLA_SUCCESS;
2566
2567queuing_error_fcp_cmnd:
2568        dma_pool_free(ha->fcp_cmnd_dma_pool, ctx->fcp_cmnd, ctx->fcp_cmnd_dma);
2569queuing_error:
2570        if (tot_dsds)
2571                scsi_dma_unmap(cmd);
2572
2573        if (sp->u.scmd.ctx) {
2574                mempool_free(sp->u.scmd.ctx, ha->ctx_mempool);
2575                sp->u.scmd.ctx = NULL;
2576        }
2577        spin_unlock_irqrestore(&ha->hardware_lock, flags);
2578
2579        return QLA_FUNCTION_FAILED;
2580}
2581
2582int
2583qla2x00_start_sp(srb_t *sp)
2584{
2585        int rval;
2586        struct qla_hw_data *ha = sp->fcport->vha->hw;
2587        void *pkt;
2588        unsigned long flags;
2589
2590        rval = QLA_FUNCTION_FAILED;
2591        spin_lock_irqsave(&ha->hardware_lock, flags);
2592        pkt = qla2x00_alloc_iocbs(sp->fcport->vha, sp);
2593        if (!pkt) {
2594                ql_log(ql_log_warn, sp->fcport->vha, 0x700c,
2595                    "qla2x00_alloc_iocbs failed.\n");
2596                goto done;
2597        }
2598
2599        rval = QLA_SUCCESS;
2600        switch (sp->type) {
2601        case SRB_LOGIN_CMD:
2602                IS_FWI2_CAPABLE(ha) ?
2603                    qla24xx_login_iocb(sp, pkt) :
2604                    qla2x00_login_iocb(sp, pkt);
2605                break;
2606        case SRB_LOGOUT_CMD:
2607                IS_FWI2_CAPABLE(ha) ?
2608                    qla24xx_logout_iocb(sp, pkt) :
2609                    qla2x00_logout_iocb(sp, pkt);
2610                break;
2611        case SRB_ELS_CMD_RPT:
2612        case SRB_ELS_CMD_HST:
2613                qla24xx_els_iocb(sp, pkt);
2614                break;
2615        case SRB_CT_CMD:
2616                IS_FWI2_CAPABLE(ha) ?
2617                    qla24xx_ct_iocb(sp, pkt) :
2618                    qla2x00_ct_iocb(sp, pkt);
2619                break;
2620        case SRB_ADISC_CMD:
2621                IS_FWI2_CAPABLE(ha) ?
2622                    qla24xx_adisc_iocb(sp, pkt) :
2623                    qla2x00_adisc_iocb(sp, pkt);
2624                break;
2625        case SRB_TM_CMD:
2626                IS_QLAFX00(ha) ?
2627                    qlafx00_tm_iocb(sp, pkt) :
2628                    qla24xx_tm_iocb(sp, pkt);
2629                break;
2630        case SRB_FXIOCB_DCMD:
2631        case SRB_FXIOCB_BCMD:
2632                qlafx00_fxdisc_iocb(sp, pkt);
2633                break;
2634        case SRB_ABT_CMD:
2635                qlafx00_abort_iocb(sp, pkt);
2636                break;
2637        default:
2638                break;
2639        }
2640
2641        wmb();
2642        qla2x00_start_iocbs(sp->fcport->vha, ha->req_q_map[0]);
2643done:
2644        spin_unlock_irqrestore(&ha->hardware_lock, flags);
2645        return rval;
2646}
2647
2648static void
2649qla25xx_build_bidir_iocb(srb_t *sp, struct scsi_qla_host *vha,
2650                                struct cmd_bidir *cmd_pkt, uint32_t tot_dsds)
2651{
2652        uint16_t avail_dsds;
2653        uint32_t *cur_dsd;
2654        uint32_t req_data_len = 0;
2655        uint32_t rsp_data_len = 0;
2656        struct scatterlist *sg;
2657        int index;
2658        int entry_count = 1;
2659        struct fc_bsg_job *bsg_job = sp->u.bsg_job;
2660
2661        /*Update entry type to indicate bidir command */
2662        *((uint32_t *)(&cmd_pkt->entry_type)) =
2663                __constant_cpu_to_le32(COMMAND_BIDIRECTIONAL);
2664
2665        /* Set the transfer direction, in this set both flags
2666         * Also set the BD_WRAP_BACK flag, firmware will take care
2667         * assigning DID=SID for outgoing pkts.
2668         */
2669        cmd_pkt->wr_dseg_count = cpu_to_le16(bsg_job->request_payload.sg_cnt);
2670        cmd_pkt->rd_dseg_count = cpu_to_le16(bsg_job->reply_payload.sg_cnt);
2671        cmd_pkt->control_flags =
2672                        __constant_cpu_to_le16(BD_WRITE_DATA | BD_READ_DATA |
2673                                                        BD_WRAP_BACK);
2674
2675        req_data_len = rsp_data_len = bsg_job->request_payload.payload_len;
2676        cmd_pkt->wr_byte_count = cpu_to_le32(req_data_len);
2677        cmd_pkt->rd_byte_count = cpu_to_le32(rsp_data_len);
2678        cmd_pkt->timeout = cpu_to_le16(qla2x00_get_async_timeout(vha) + 2);
2679
2680        vha->bidi_stats.transfer_bytes += req_data_len;
2681        vha->bidi_stats.io_count++;
2682
2683        /* Only one dsd is available for bidirectional IOCB, remaining dsds
2684         * are bundled in continuation iocb
2685         */
2686        avail_dsds = 1;
2687        cur_dsd = (uint32_t *)&cmd_pkt->fcp_data_dseg_address;
2688
2689        index = 0;
2690
2691        for_each_sg(bsg_job->request_payload.sg_list, sg,
2692                                bsg_job->request_payload.sg_cnt, index) {
2693                dma_addr_t sle_dma;
2694                cont_a64_entry_t *cont_pkt;
2695
2696                /* Allocate additional continuation packets */
2697                if (avail_dsds == 0) {
2698                        /* Continuation type 1 IOCB can accomodate
2699                         * 5 DSDS
2700                         */
2701                        cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req);
2702                        cur_dsd = (uint32_t *) cont_pkt->dseg_0_address;
2703                        avail_dsds = 5;
2704                        entry_count++;
2705                }
2706                sle_dma = sg_dma_address(sg);
2707                *cur_dsd++   = cpu_to_le32(LSD(sle_dma));
2708                *cur_dsd++   = cpu_to_le32(MSD(sle_dma));
2709                *cur_dsd++   = cpu_to_le32(sg_dma_len(sg));
2710                avail_dsds--;
2711        }
2712        /* For read request DSD will always goes to continuation IOCB
2713         * and follow the write DSD. If there is room on the current IOCB
2714         * then it is added to that IOCB else new continuation IOCB is
2715         * allocated.
2716         */
2717        for_each_sg(bsg_job->reply_payload.sg_list, sg,
2718                                bsg_job->reply_payload.sg_cnt, index) {
2719                dma_addr_t sle_dma;
2720                cont_a64_entry_t *cont_pkt;
2721
2722                /* Allocate additional continuation packets */
2723                if (avail_dsds == 0) {
2724                        /* Continuation type 1 IOCB can accomodate
2725                         * 5 DSDS
2726                         */
2727                        cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req);
2728                        cur_dsd = (uint32_t *) cont_pkt->dseg_0_address;
2729                        avail_dsds = 5;
2730                        entry_count++;
2731                }
2732                sle_dma = sg_dma_address(sg);
2733                *cur_dsd++   = cpu_to_le32(LSD(sle_dma));
2734                *cur_dsd++   = cpu_to_le32(MSD(sle_dma));
2735                *cur_dsd++   = cpu_to_le32(sg_dma_len(sg));
2736                avail_dsds--;
2737        }
2738        /* This value should be same as number of IOCB required for this cmd */
2739        cmd_pkt->entry_count = entry_count;
2740}
2741
2742int
2743qla2x00_start_bidir(srb_t *sp, struct scsi_qla_host *vha, uint32_t tot_dsds)
2744{
2745
2746        struct qla_hw_data *ha = vha->hw;
2747        unsigned long flags;
2748        uint32_t handle;
2749        uint32_t index;
2750        uint16_t req_cnt;
2751        uint16_t cnt;
2752        uint32_t *clr_ptr;
2753        struct cmd_bidir *cmd_pkt = NULL;
2754        struct rsp_que *rsp;
2755        struct req_que *req;
2756        int rval = EXT_STATUS_OK;
2757
2758        rval = QLA_SUCCESS;
2759
2760        rsp = ha->rsp_q_map[0];
2761        req = vha->req;
2762
2763        /* Send marker if required */
2764        if (vha->marker_needed != 0) {
2765                if (qla2x00_marker(vha, req,
2766                        rsp, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS)
2767                        return EXT_STATUS_MAILBOX;
2768                vha->marker_needed = 0;
2769        }
2770
2771        /* Acquire ring specific lock */
2772        spin_lock_irqsave(&ha->hardware_lock, flags);
2773
2774        /* Check for room in outstanding command list. */
2775        handle = req->current_outstanding_cmd;
2776        for (index = 1; index < req->num_outstanding_cmds; index++) {
2777                handle++;
2778        if (handle == req->num_outstanding_cmds)
2779                handle = 1;
2780        if (!req->outstanding_cmds[handle])
2781                break;
2782        }
2783
2784        if (index == req->num_outstanding_cmds) {
2785                rval = EXT_STATUS_BUSY;
2786                goto queuing_error;
2787        }
2788
2789        /* Calculate number of IOCB required */
2790        req_cnt = qla24xx_calc_iocbs(vha, tot_dsds);
2791
2792        /* Check for room on request queue. */
2793        if (req->cnt < req_cnt + 2) {
2794                cnt = RD_REG_DWORD_RELAXED(req->req_q_out);
2795
2796                if  (req->ring_index < cnt)
2797                        req->cnt = cnt - req->ring_index;
2798                else
2799                        req->cnt = req->length -
2800                                (req->ring_index - cnt);
2801        }
2802        if (req->cnt < req_cnt + 2) {
2803                rval = EXT_STATUS_BUSY;
2804                goto queuing_error;
2805        }
2806
2807        cmd_pkt = (struct cmd_bidir *)req->ring_ptr;
2808        cmd_pkt->handle = MAKE_HANDLE(req->id, handle);
2809
2810        /* Zero out remaining portion of packet. */
2811        /* tagged queuing modifier -- default is TSK_SIMPLE (0).*/
2812        clr_ptr = (uint32_t *)cmd_pkt + 2;
2813        memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8);
2814
2815        /* Set NPORT-ID  (of vha)*/
2816        cmd_pkt->nport_handle = cpu_to_le16(vha->self_login_loop_id);
2817        cmd_pkt->port_id[0] = vha->d_id.b.al_pa;
2818        cmd_pkt->port_id[1] = vha->d_id.b.area;
2819        cmd_pkt->port_id[2] = vha->d_id.b.domain;
2820
2821        qla25xx_build_bidir_iocb(sp, vha, cmd_pkt, tot_dsds);
2822        cmd_pkt->entry_status = (uint8_t) rsp->id;
2823        /* Build command packet. */
2824        req->current_outstanding_cmd = handle;
2825        req->outstanding_cmds[handle] = sp;
2826        sp->handle = handle;
2827        req->cnt -= req_cnt;
2828
2829        /* Send the command to the firmware */
2830        wmb();
2831        qla2x00_start_iocbs(vha, req);
2832queuing_error:
2833        spin_unlock_irqrestore(&ha->hardware_lock, flags);
2834        return rval;
2835}
2836