linux/drivers/scsi/lpfc/lpfc_bsg.c
<<
>>
Prefs
   1/*******************************************************************
   2 * This file is part of the Emulex Linux Device Driver for         *
   3 * Fibre Channel Host Bus Adapters.                                *
   4 * Copyright (C) 2017-2021 Broadcom. All Rights Reserved. The term *
   5 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.     *
   6 * Copyright (C) 2009-2015 Emulex.  All rights reserved.           *
   7 * EMULEX and SLI are trademarks of Emulex.                        *
   8 * www.broadcom.com                                                *
   9 *                                                                 *
  10 * This program is free software; you can redistribute it and/or   *
  11 * modify it under the terms of version 2 of the GNU General       *
  12 * Public License as published by the Free Software Foundation.    *
  13 * This program is distributed in the hope that it will be useful. *
  14 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
  15 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
  16 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
  17 * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
  18 * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
  19 * more details, a copy of which can be found in the file COPYING  *
  20 * included with this package.                                     *
  21 *******************************************************************/
  22
  23#include <linux/interrupt.h>
  24#include <linux/mempool.h>
  25#include <linux/pci.h>
  26#include <linux/slab.h>
  27#include <linux/delay.h>
  28#include <linux/list.h>
  29#include <linux/bsg-lib.h>
  30#include <linux/vmalloc.h>
  31
  32#include <scsi/scsi.h>
  33#include <scsi/scsi_host.h>
  34#include <scsi/scsi_transport_fc.h>
  35#include <scsi/scsi_bsg_fc.h>
  36#include <scsi/fc/fc_fs.h>
  37
  38#include "lpfc_hw4.h"
  39#include "lpfc_hw.h"
  40#include "lpfc_sli.h"
  41#include "lpfc_sli4.h"
  42#include "lpfc_nl.h"
  43#include "lpfc_bsg.h"
  44#include "lpfc_disc.h"
  45#include "lpfc_scsi.h"
  46#include "lpfc.h"
  47#include "lpfc_logmsg.h"
  48#include "lpfc_crtn.h"
  49#include "lpfc_debugfs.h"
  50#include "lpfc_vport.h"
  51#include "lpfc_version.h"
  52
  53struct lpfc_bsg_event {
  54        struct list_head node;
  55        struct kref kref;
  56        wait_queue_head_t wq;
  57
  58        /* Event type and waiter identifiers */
  59        uint32_t type_mask;
  60        uint32_t req_id;
  61        uint32_t reg_id;
  62
  63        /* next two flags are here for the auto-delete logic */
  64        unsigned long wait_time_stamp;
  65        int waiting;
  66
  67        /* seen and not seen events */
  68        struct list_head events_to_get;
  69        struct list_head events_to_see;
  70
  71        /* driver data associated with the job */
  72        void *dd_data;
  73};
  74
  75struct lpfc_bsg_iocb {
  76        struct lpfc_iocbq *cmdiocbq;
  77        struct lpfc_dmabuf *rmp;
  78        struct lpfc_nodelist *ndlp;
  79};
  80
  81struct lpfc_bsg_mbox {
  82        LPFC_MBOXQ_t *pmboxq;
  83        MAILBOX_t *mb;
  84        struct lpfc_dmabuf *dmabuffers; /* for BIU diags */
  85        uint8_t *ext; /* extended mailbox data */
  86        uint32_t mbOffset; /* from app */
  87        uint32_t inExtWLen; /* from app */
  88        uint32_t outExtWLen; /* from app */
  89};
  90
  91#define MENLO_DID 0x0000FC0E
  92
  93struct lpfc_bsg_menlo {
  94        struct lpfc_iocbq *cmdiocbq;
  95        struct lpfc_dmabuf *rmp;
  96};
  97
  98#define TYPE_EVT        1
  99#define TYPE_IOCB       2
 100#define TYPE_MBOX       3
 101#define TYPE_MENLO      4
 102struct bsg_job_data {
 103        uint32_t type;
 104        struct bsg_job *set_job; /* job waiting for this iocb to finish */
 105        union {
 106                struct lpfc_bsg_event *evt;
 107                struct lpfc_bsg_iocb iocb;
 108                struct lpfc_bsg_mbox mbox;
 109                struct lpfc_bsg_menlo menlo;
 110        } context_un;
 111};
 112
 113struct event_data {
 114        struct list_head node;
 115        uint32_t type;
 116        uint32_t immed_dat;
 117        void *data;
 118        uint32_t len;
 119};
 120
 121#define BUF_SZ_4K 4096
 122#define SLI_CT_ELX_LOOPBACK 0x10
 123
 124enum ELX_LOOPBACK_CMD {
 125        ELX_LOOPBACK_XRI_SETUP,
 126        ELX_LOOPBACK_DATA,
 127};
 128
 129#define ELX_LOOPBACK_HEADER_SZ \
 130        (size_t)(&((struct lpfc_sli_ct_request *)NULL)->un)
 131
 132struct lpfc_dmabufext {
 133        struct lpfc_dmabuf dma;
 134        uint32_t size;
 135        uint32_t flag;
 136};
 137
 138static void
 139lpfc_free_bsg_buffers(struct lpfc_hba *phba, struct lpfc_dmabuf *mlist)
 140{
 141        struct lpfc_dmabuf *mlast, *next_mlast;
 142
 143        if (mlist) {
 144                list_for_each_entry_safe(mlast, next_mlast, &mlist->list,
 145                                         list) {
 146                        lpfc_mbuf_free(phba, mlast->virt, mlast->phys);
 147                        list_del(&mlast->list);
 148                        kfree(mlast);
 149                }
 150                lpfc_mbuf_free(phba, mlist->virt, mlist->phys);
 151                kfree(mlist);
 152        }
 153        return;
 154}
 155
 156static struct lpfc_dmabuf *
 157lpfc_alloc_bsg_buffers(struct lpfc_hba *phba, unsigned int size,
 158                       int outbound_buffers, struct ulp_bde64 *bpl,
 159                       int *bpl_entries)
 160{
 161        struct lpfc_dmabuf *mlist = NULL;
 162        struct lpfc_dmabuf *mp;
 163        unsigned int bytes_left = size;
 164
 165        /* Verify we can support the size specified */
 166        if (!size || (size > (*bpl_entries * LPFC_BPL_SIZE)))
 167                return NULL;
 168
 169        /* Determine the number of dma buffers to allocate */
 170        *bpl_entries = (size % LPFC_BPL_SIZE ? size/LPFC_BPL_SIZE + 1 :
 171                        size/LPFC_BPL_SIZE);
 172
 173        /* Allocate dma buffer and place in BPL passed */
 174        while (bytes_left) {
 175                /* Allocate dma buffer  */
 176                mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
 177                if (!mp) {
 178                        if (mlist)
 179                                lpfc_free_bsg_buffers(phba, mlist);
 180                        return NULL;
 181                }
 182
 183                INIT_LIST_HEAD(&mp->list);
 184                mp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(mp->phys));
 185
 186                if (!mp->virt) {
 187                        kfree(mp);
 188                        if (mlist)
 189                                lpfc_free_bsg_buffers(phba, mlist);
 190                        return NULL;
 191                }
 192
 193                /* Queue it to a linked list */
 194                if (!mlist)
 195                        mlist = mp;
 196                else
 197                        list_add_tail(&mp->list, &mlist->list);
 198
 199                /* Add buffer to buffer pointer list */
 200                if (outbound_buffers)
 201                        bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
 202                else
 203                        bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
 204                bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys));
 205                bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys));
 206                bpl->tus.f.bdeSize = (uint16_t)
 207                        (bytes_left >= LPFC_BPL_SIZE ? LPFC_BPL_SIZE :
 208                         bytes_left);
 209                bytes_left -= bpl->tus.f.bdeSize;
 210                bpl->tus.w = le32_to_cpu(bpl->tus.w);
 211                bpl++;
 212        }
 213        return mlist;
 214}
 215
 216static unsigned int
 217lpfc_bsg_copy_data(struct lpfc_dmabuf *dma_buffers,
 218                   struct bsg_buffer *bsg_buffers,
 219                   unsigned int bytes_to_transfer, int to_buffers)
 220{
 221
 222        struct lpfc_dmabuf *mp;
 223        unsigned int transfer_bytes, bytes_copied = 0;
 224        unsigned int sg_offset, dma_offset;
 225        unsigned char *dma_address, *sg_address;
 226        LIST_HEAD(temp_list);
 227        struct sg_mapping_iter miter;
 228        unsigned long flags;
 229        unsigned int sg_flags = SG_MITER_ATOMIC;
 230        bool sg_valid;
 231
 232        list_splice_init(&dma_buffers->list, &temp_list);
 233        list_add(&dma_buffers->list, &temp_list);
 234        sg_offset = 0;
 235        if (to_buffers)
 236                sg_flags |= SG_MITER_FROM_SG;
 237        else
 238                sg_flags |= SG_MITER_TO_SG;
 239        sg_miter_start(&miter, bsg_buffers->sg_list, bsg_buffers->sg_cnt,
 240                       sg_flags);
 241        local_irq_save(flags);
 242        sg_valid = sg_miter_next(&miter);
 243        list_for_each_entry(mp, &temp_list, list) {
 244                dma_offset = 0;
 245                while (bytes_to_transfer && sg_valid &&
 246                       (dma_offset < LPFC_BPL_SIZE)) {
 247                        dma_address = mp->virt + dma_offset;
 248                        if (sg_offset) {
 249                                /* Continue previous partial transfer of sg */
 250                                sg_address = miter.addr + sg_offset;
 251                                transfer_bytes = miter.length - sg_offset;
 252                        } else {
 253                                sg_address = miter.addr;
 254                                transfer_bytes = miter.length;
 255                        }
 256                        if (bytes_to_transfer < transfer_bytes)
 257                                transfer_bytes = bytes_to_transfer;
 258                        if (transfer_bytes > (LPFC_BPL_SIZE - dma_offset))
 259                                transfer_bytes = LPFC_BPL_SIZE - dma_offset;
 260                        if (to_buffers)
 261                                memcpy(dma_address, sg_address, transfer_bytes);
 262                        else
 263                                memcpy(sg_address, dma_address, transfer_bytes);
 264                        dma_offset += transfer_bytes;
 265                        sg_offset += transfer_bytes;
 266                        bytes_to_transfer -= transfer_bytes;
 267                        bytes_copied += transfer_bytes;
 268                        if (sg_offset >= miter.length) {
 269                                sg_offset = 0;
 270                                sg_valid = sg_miter_next(&miter);
 271                        }
 272                }
 273        }
 274        sg_miter_stop(&miter);
 275        local_irq_restore(flags);
 276        list_del_init(&dma_buffers->list);
 277        list_splice(&temp_list, &dma_buffers->list);
 278        return bytes_copied;
 279}
 280
 281/**
 282 * lpfc_bsg_send_mgmt_cmd_cmp - lpfc_bsg_send_mgmt_cmd's completion handler
 283 * @phba: Pointer to HBA context object.
 284 * @cmdiocbq: Pointer to command iocb.
 285 * @rspiocbq: Pointer to response iocb.
 286 *
 287 * This function is the completion handler for iocbs issued using
 288 * lpfc_bsg_send_mgmt_cmd function. This function is called by the
 289 * ring event handler function without any lock held. This function
 290 * can be called from both worker thread context and interrupt
 291 * context. This function also can be called from another thread which
 292 * cleans up the SLI layer objects.
 293 * This function copies the contents of the response iocb to the
 294 * response iocb memory object provided by the caller of
 295 * lpfc_sli_issue_iocb_wait and then wakes up the thread which
 296 * sleeps for the iocb completion.
 297 **/
 298static void
 299lpfc_bsg_send_mgmt_cmd_cmp(struct lpfc_hba *phba,
 300                        struct lpfc_iocbq *cmdiocbq,
 301                        struct lpfc_iocbq *rspiocbq)
 302{
 303        struct bsg_job_data *dd_data;
 304        struct bsg_job *job;
 305        struct fc_bsg_reply *bsg_reply;
 306        IOCB_t *rsp;
 307        struct lpfc_dmabuf *bmp, *cmp, *rmp;
 308        struct lpfc_nodelist *ndlp;
 309        struct lpfc_bsg_iocb *iocb;
 310        unsigned long flags;
 311        unsigned int rsp_size;
 312        int rc = 0;
 313
 314        dd_data = cmdiocbq->context1;
 315
 316        /* Determine if job has been aborted */
 317        spin_lock_irqsave(&phba->ct_ev_lock, flags);
 318        job = dd_data->set_job;
 319        if (job) {
 320                bsg_reply = job->reply;
 321                /* Prevent timeout handling from trying to abort job */
 322                job->dd_data = NULL;
 323        }
 324        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
 325
 326        /* Close the timeout handler abort window */
 327        spin_lock_irqsave(&phba->hbalock, flags);
 328        cmdiocbq->iocb_flag &= ~LPFC_IO_CMD_OUTSTANDING;
 329        spin_unlock_irqrestore(&phba->hbalock, flags);
 330
 331        iocb = &dd_data->context_un.iocb;
 332        ndlp = iocb->cmdiocbq->context_un.ndlp;
 333        rmp = iocb->rmp;
 334        cmp = cmdiocbq->context2;
 335        bmp = cmdiocbq->context3;
 336        rsp = &rspiocbq->iocb;
 337
 338        /* Copy the completed data or set the error status */
 339
 340        if (job) {
 341                if (rsp->ulpStatus) {
 342                        if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
 343                                switch (rsp->un.ulpWord[4] & IOERR_PARAM_MASK) {
 344                                case IOERR_SEQUENCE_TIMEOUT:
 345                                        rc = -ETIMEDOUT;
 346                                        break;
 347                                case IOERR_INVALID_RPI:
 348                                        rc = -EFAULT;
 349                                        break;
 350                                default:
 351                                        rc = -EACCES;
 352                                        break;
 353                                }
 354                        } else {
 355                                rc = -EACCES;
 356                        }
 357                } else {
 358                        rsp_size = rsp->un.genreq64.bdl.bdeSize;
 359                        bsg_reply->reply_payload_rcv_len =
 360                                lpfc_bsg_copy_data(rmp, &job->reply_payload,
 361                                                   rsp_size, 0);
 362                }
 363        }
 364
 365        lpfc_free_bsg_buffers(phba, cmp);
 366        lpfc_free_bsg_buffers(phba, rmp);
 367        lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
 368        kfree(bmp);
 369        lpfc_nlp_put(ndlp);
 370        lpfc_sli_release_iocbq(phba, cmdiocbq);
 371        kfree(dd_data);
 372
 373        /* Complete the job if the job is still active */
 374
 375        if (job) {
 376                bsg_reply->result = rc;
 377                bsg_job_done(job, bsg_reply->result,
 378                               bsg_reply->reply_payload_rcv_len);
 379        }
 380        return;
 381}
 382
 383/**
 384 * lpfc_bsg_send_mgmt_cmd - send a CT command from a bsg request
 385 * @job: fc_bsg_job to handle
 386 **/
 387static int
 388lpfc_bsg_send_mgmt_cmd(struct bsg_job *job)
 389{
 390        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
 391        struct lpfc_hba *phba = vport->phba;
 392        struct lpfc_rport_data *rdata = fc_bsg_to_rport(job)->dd_data;
 393        struct lpfc_nodelist *ndlp = rdata->pnode;
 394        struct fc_bsg_reply *bsg_reply = job->reply;
 395        struct ulp_bde64 *bpl = NULL;
 396        uint32_t timeout;
 397        struct lpfc_iocbq *cmdiocbq = NULL;
 398        IOCB_t *cmd;
 399        struct lpfc_dmabuf *bmp = NULL, *cmp = NULL, *rmp = NULL;
 400        int request_nseg;
 401        int reply_nseg;
 402        struct bsg_job_data *dd_data;
 403        unsigned long flags;
 404        uint32_t creg_val;
 405        int rc = 0;
 406        int iocb_stat;
 407
 408        /* in case no data is transferred */
 409        bsg_reply->reply_payload_rcv_len = 0;
 410
 411        if (ndlp->nlp_flag & NLP_ELS_SND_MASK)
 412                return -ENODEV;
 413
 414        /* allocate our bsg tracking structure */
 415        dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
 416        if (!dd_data) {
 417                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
 418                                "2733 Failed allocation of dd_data\n");
 419                rc = -ENOMEM;
 420                goto no_dd_data;
 421        }
 422
 423        cmdiocbq = lpfc_sli_get_iocbq(phba);
 424        if (!cmdiocbq) {
 425                rc = -ENOMEM;
 426                goto free_dd;
 427        }
 428
 429        cmd = &cmdiocbq->iocb;
 430
 431        bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
 432        if (!bmp) {
 433                rc = -ENOMEM;
 434                goto free_cmdiocbq;
 435        }
 436        bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys);
 437        if (!bmp->virt) {
 438                rc = -ENOMEM;
 439                goto free_bmp;
 440        }
 441
 442        INIT_LIST_HEAD(&bmp->list);
 443
 444        bpl = (struct ulp_bde64 *) bmp->virt;
 445        request_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64);
 446        cmp = lpfc_alloc_bsg_buffers(phba, job->request_payload.payload_len,
 447                                     1, bpl, &request_nseg);
 448        if (!cmp) {
 449                rc = -ENOMEM;
 450                goto free_bmp;
 451        }
 452        lpfc_bsg_copy_data(cmp, &job->request_payload,
 453                           job->request_payload.payload_len, 1);
 454
 455        bpl += request_nseg;
 456        reply_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64) - request_nseg;
 457        rmp = lpfc_alloc_bsg_buffers(phba, job->reply_payload.payload_len, 0,
 458                                     bpl, &reply_nseg);
 459        if (!rmp) {
 460                rc = -ENOMEM;
 461                goto free_cmp;
 462        }
 463
 464        cmd->un.genreq64.bdl.ulpIoTag32 = 0;
 465        cmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
 466        cmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys);
 467        cmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
 468        cmd->un.genreq64.bdl.bdeSize =
 469                (request_nseg + reply_nseg) * sizeof(struct ulp_bde64);
 470        cmd->ulpCommand = CMD_GEN_REQUEST64_CR;
 471        cmd->un.genreq64.w5.hcsw.Fctl = (SI | LA);
 472        cmd->un.genreq64.w5.hcsw.Dfctl = 0;
 473        cmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL;
 474        cmd->un.genreq64.w5.hcsw.Type = FC_TYPE_CT;
 475        cmd->ulpBdeCount = 1;
 476        cmd->ulpLe = 1;
 477        cmd->ulpClass = CLASS3;
 478        cmd->ulpContext = ndlp->nlp_rpi;
 479        if (phba->sli_rev == LPFC_SLI_REV4)
 480                cmd->ulpContext = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
 481        cmd->ulpOwner = OWN_CHIP;
 482        cmdiocbq->vport = phba->pport;
 483        cmdiocbq->context3 = bmp;
 484        cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
 485        timeout = phba->fc_ratov * 2;
 486        cmd->ulpTimeout = timeout;
 487
 488        cmdiocbq->iocb_cmpl = lpfc_bsg_send_mgmt_cmd_cmp;
 489        cmdiocbq->context1 = dd_data;
 490        cmdiocbq->context2 = cmp;
 491        cmdiocbq->context3 = bmp;
 492
 493        dd_data->type = TYPE_IOCB;
 494        dd_data->set_job = job;
 495        dd_data->context_un.iocb.cmdiocbq = cmdiocbq;
 496        dd_data->context_un.iocb.rmp = rmp;
 497        job->dd_data = dd_data;
 498
 499        if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
 500                if (lpfc_readl(phba->HCregaddr, &creg_val)) {
 501                        rc = -EIO ;
 502                        goto free_rmp;
 503                }
 504                creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
 505                writel(creg_val, phba->HCregaddr);
 506                readl(phba->HCregaddr); /* flush */
 507        }
 508
 509        cmdiocbq->context_un.ndlp = lpfc_nlp_get(ndlp);
 510        if (!cmdiocbq->context_un.ndlp) {
 511                rc = -ENODEV;
 512                goto free_rmp;
 513        }
 514
 515        iocb_stat = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq, 0);
 516        if (iocb_stat == IOCB_SUCCESS) {
 517                spin_lock_irqsave(&phba->hbalock, flags);
 518                /* make sure the I/O had not been completed yet */
 519                if (cmdiocbq->iocb_flag & LPFC_IO_LIBDFC) {
 520                        /* open up abort window to timeout handler */
 521                        cmdiocbq->iocb_flag |= LPFC_IO_CMD_OUTSTANDING;
 522                }
 523                spin_unlock_irqrestore(&phba->hbalock, flags);
 524                return 0; /* done for now */
 525        } else if (iocb_stat == IOCB_BUSY) {
 526                rc = -EAGAIN;
 527        } else {
 528                rc = -EIO;
 529        }
 530
 531        /* iocb failed so cleanup */
 532        lpfc_nlp_put(ndlp);
 533
 534free_rmp:
 535        lpfc_free_bsg_buffers(phba, rmp);
 536free_cmp:
 537        lpfc_free_bsg_buffers(phba, cmp);
 538free_bmp:
 539        if (bmp->virt)
 540                lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
 541        kfree(bmp);
 542free_cmdiocbq:
 543        lpfc_sli_release_iocbq(phba, cmdiocbq);
 544free_dd:
 545        kfree(dd_data);
 546no_dd_data:
 547        /* make error code available to userspace */
 548        bsg_reply->result = rc;
 549        job->dd_data = NULL;
 550        return rc;
 551}
 552
 553/**
 554 * lpfc_bsg_rport_els_cmp - lpfc_bsg_rport_els's completion handler
 555 * @phba: Pointer to HBA context object.
 556 * @cmdiocbq: Pointer to command iocb.
 557 * @rspiocbq: Pointer to response iocb.
 558 *
 559 * This function is the completion handler for iocbs issued using
 560 * lpfc_bsg_rport_els_cmp function. This function is called by the
 561 * ring event handler function without any lock held. This function
 562 * can be called from both worker thread context and interrupt
 563 * context. This function also can be called from other thread which
 564 * cleans up the SLI layer objects.
 565 * This function copies the contents of the response iocb to the
 566 * response iocb memory object provided by the caller of
 567 * lpfc_sli_issue_iocb_wait and then wakes up the thread which
 568 * sleeps for the iocb completion.
 569 **/
 570static void
 571lpfc_bsg_rport_els_cmp(struct lpfc_hba *phba,
 572                        struct lpfc_iocbq *cmdiocbq,
 573                        struct lpfc_iocbq *rspiocbq)
 574{
 575        struct bsg_job_data *dd_data;
 576        struct bsg_job *job;
 577        struct fc_bsg_reply *bsg_reply;
 578        IOCB_t *rsp;
 579        struct lpfc_nodelist *ndlp;
 580        struct lpfc_dmabuf *pcmd = NULL, *prsp = NULL;
 581        struct fc_bsg_ctels_reply *els_reply;
 582        uint8_t *rjt_data;
 583        unsigned long flags;
 584        unsigned int rsp_size;
 585        int rc = 0;
 586
 587        dd_data = cmdiocbq->context1;
 588        ndlp = dd_data->context_un.iocb.ndlp;
 589        cmdiocbq->context1 = ndlp;
 590
 591        /* Determine if job has been aborted */
 592        spin_lock_irqsave(&phba->ct_ev_lock, flags);
 593        job = dd_data->set_job;
 594        if (job) {
 595                bsg_reply = job->reply;
 596                /* Prevent timeout handling from trying to abort job  */
 597                job->dd_data = NULL;
 598        }
 599        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
 600
 601        /* Close the timeout handler abort window */
 602        spin_lock_irqsave(&phba->hbalock, flags);
 603        cmdiocbq->iocb_flag &= ~LPFC_IO_CMD_OUTSTANDING;
 604        spin_unlock_irqrestore(&phba->hbalock, flags);
 605
 606        rsp = &rspiocbq->iocb;
 607        pcmd = (struct lpfc_dmabuf *)cmdiocbq->context2;
 608        prsp = (struct lpfc_dmabuf *)pcmd->list.next;
 609
 610        /* Copy the completed job data or determine the job status if job is
 611         * still active
 612         */
 613
 614        if (job) {
 615                if (rsp->ulpStatus == IOSTAT_SUCCESS) {
 616                        rsp_size = rsp->un.elsreq64.bdl.bdeSize;
 617                        bsg_reply->reply_payload_rcv_len =
 618                                sg_copy_from_buffer(job->reply_payload.sg_list,
 619                                                    job->reply_payload.sg_cnt,
 620                                                    prsp->virt,
 621                                                    rsp_size);
 622                } else if (rsp->ulpStatus == IOSTAT_LS_RJT) {
 623                        bsg_reply->reply_payload_rcv_len =
 624                                sizeof(struct fc_bsg_ctels_reply);
 625                        /* LS_RJT data returned in word 4 */
 626                        rjt_data = (uint8_t *)&rsp->un.ulpWord[4];
 627                        els_reply = &bsg_reply->reply_data.ctels_reply;
 628                        els_reply->status = FC_CTELS_STATUS_REJECT;
 629                        els_reply->rjt_data.action = rjt_data[3];
 630                        els_reply->rjt_data.reason_code = rjt_data[2];
 631                        els_reply->rjt_data.reason_explanation = rjt_data[1];
 632                        els_reply->rjt_data.vendor_unique = rjt_data[0];
 633                } else {
 634                        rc = -EIO;
 635                }
 636        }
 637
 638        lpfc_els_free_iocb(phba, cmdiocbq);
 639
 640        lpfc_nlp_put(ndlp);
 641        kfree(dd_data);
 642
 643        /* Complete the job if the job is still active */
 644
 645        if (job) {
 646                bsg_reply->result = rc;
 647                bsg_job_done(job, bsg_reply->result,
 648                               bsg_reply->reply_payload_rcv_len);
 649        }
 650        return;
 651}
 652
 653/**
 654 * lpfc_bsg_rport_els - send an ELS command from a bsg request
 655 * @job: fc_bsg_job to handle
 656 **/
 657static int
 658lpfc_bsg_rport_els(struct bsg_job *job)
 659{
 660        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
 661        struct lpfc_hba *phba = vport->phba;
 662        struct lpfc_rport_data *rdata = fc_bsg_to_rport(job)->dd_data;
 663        struct lpfc_nodelist *ndlp = rdata->pnode;
 664        struct fc_bsg_request *bsg_request = job->request;
 665        struct fc_bsg_reply *bsg_reply = job->reply;
 666        uint32_t elscmd;
 667        uint32_t cmdsize;
 668        struct lpfc_iocbq *cmdiocbq;
 669        uint16_t rpi = 0;
 670        struct bsg_job_data *dd_data;
 671        unsigned long flags;
 672        uint32_t creg_val;
 673        int rc = 0;
 674
 675        /* in case no data is transferred */
 676        bsg_reply->reply_payload_rcv_len = 0;
 677
 678        /* verify the els command is not greater than the
 679         * maximum ELS transfer size.
 680         */
 681
 682        if (job->request_payload.payload_len > FCELSSIZE) {
 683                rc = -EINVAL;
 684                goto no_dd_data;
 685        }
 686
 687        /* allocate our bsg tracking structure */
 688        dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
 689        if (!dd_data) {
 690                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
 691                                "2735 Failed allocation of dd_data\n");
 692                rc = -ENOMEM;
 693                goto no_dd_data;
 694        }
 695
 696        elscmd = bsg_request->rqst_data.r_els.els_code;
 697        cmdsize = job->request_payload.payload_len;
 698
 699        if (!lpfc_nlp_get(ndlp)) {
 700                rc = -ENODEV;
 701                goto free_dd_data;
 702        }
 703
 704        /* We will use the allocated dma buffers by prep els iocb for command
 705         * and response to ensure if the job times out and the request is freed,
 706         * we won't be dma into memory that is no longer allocated to for the
 707         * request.
 708         */
 709
 710        cmdiocbq = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp,
 711                                      ndlp->nlp_DID, elscmd);
 712        if (!cmdiocbq) {
 713                rc = -EIO;
 714                goto release_ndlp;
 715        }
 716
 717        /* Transfer the request payload to allocated command dma buffer */
 718        sg_copy_to_buffer(job->request_payload.sg_list,
 719                          job->request_payload.sg_cnt,
 720                          ((struct lpfc_dmabuf *)cmdiocbq->context2)->virt,
 721                          cmdsize);
 722
 723        rpi = ndlp->nlp_rpi;
 724
 725        if (phba->sli_rev == LPFC_SLI_REV4)
 726                cmdiocbq->iocb.ulpContext = phba->sli4_hba.rpi_ids[rpi];
 727        else
 728                cmdiocbq->iocb.ulpContext = rpi;
 729        cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
 730        cmdiocbq->context1 = dd_data;
 731        cmdiocbq->context_un.ndlp = ndlp;
 732        cmdiocbq->iocb_cmpl = lpfc_bsg_rport_els_cmp;
 733        dd_data->type = TYPE_IOCB;
 734        dd_data->set_job = job;
 735        dd_data->context_un.iocb.cmdiocbq = cmdiocbq;
 736        dd_data->context_un.iocb.ndlp = ndlp;
 737        dd_data->context_un.iocb.rmp = NULL;
 738        job->dd_data = dd_data;
 739
 740        if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
 741                if (lpfc_readl(phba->HCregaddr, &creg_val)) {
 742                        rc = -EIO;
 743                        goto linkdown_err;
 744                }
 745                creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
 746                writel(creg_val, phba->HCregaddr);
 747                readl(phba->HCregaddr); /* flush */
 748        }
 749
 750        cmdiocbq->context1 = lpfc_nlp_get(ndlp);
 751        if (!cmdiocbq->context1) {
 752                rc = -EIO;
 753                goto linkdown_err;
 754        }
 755
 756        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq, 0);
 757        if (rc == IOCB_SUCCESS) {
 758                spin_lock_irqsave(&phba->hbalock, flags);
 759                /* make sure the I/O had not been completed/released */
 760                if (cmdiocbq->iocb_flag & LPFC_IO_LIBDFC) {
 761                        /* open up abort window to timeout handler */
 762                        cmdiocbq->iocb_flag |= LPFC_IO_CMD_OUTSTANDING;
 763                }
 764                spin_unlock_irqrestore(&phba->hbalock, flags);
 765                return 0; /* done for now */
 766        } else if (rc == IOCB_BUSY) {
 767                rc = -EAGAIN;
 768        } else {
 769                rc = -EIO;
 770        }
 771
 772        /* I/O issue failed.  Cleanup resources. */
 773
 774linkdown_err:
 775        lpfc_els_free_iocb(phba, cmdiocbq);
 776
 777release_ndlp:
 778        lpfc_nlp_put(ndlp);
 779
 780free_dd_data:
 781        kfree(dd_data);
 782
 783no_dd_data:
 784        /* make error code available to userspace */
 785        bsg_reply->result = rc;
 786        job->dd_data = NULL;
 787        return rc;
 788}
 789
 790/**
 791 * lpfc_bsg_event_free - frees an allocated event structure
 792 * @kref: Pointer to a kref.
 793 *
 794 * Called from kref_put. Back cast the kref into an event structure address.
 795 * Free any events to get, delete associated nodes, free any events to see,
 796 * free any data then free the event itself.
 797 **/
 798static void
 799lpfc_bsg_event_free(struct kref *kref)
 800{
 801        struct lpfc_bsg_event *evt = container_of(kref, struct lpfc_bsg_event,
 802                                                  kref);
 803        struct event_data *ed;
 804
 805        list_del(&evt->node);
 806
 807        while (!list_empty(&evt->events_to_get)) {
 808                ed = list_entry(evt->events_to_get.next, typeof(*ed), node);
 809                list_del(&ed->node);
 810                kfree(ed->data);
 811                kfree(ed);
 812        }
 813
 814        while (!list_empty(&evt->events_to_see)) {
 815                ed = list_entry(evt->events_to_see.next, typeof(*ed), node);
 816                list_del(&ed->node);
 817                kfree(ed->data);
 818                kfree(ed);
 819        }
 820
 821        kfree(evt->dd_data);
 822        kfree(evt);
 823}
 824
 825/**
 826 * lpfc_bsg_event_ref - increments the kref for an event
 827 * @evt: Pointer to an event structure.
 828 **/
 829static inline void
 830lpfc_bsg_event_ref(struct lpfc_bsg_event *evt)
 831{
 832        kref_get(&evt->kref);
 833}
 834
 835/**
 836 * lpfc_bsg_event_unref - Uses kref_put to free an event structure
 837 * @evt: Pointer to an event structure.
 838 **/
 839static inline void
 840lpfc_bsg_event_unref(struct lpfc_bsg_event *evt)
 841{
 842        kref_put(&evt->kref, lpfc_bsg_event_free);
 843}
 844
 845/**
 846 * lpfc_bsg_event_new - allocate and initialize a event structure
 847 * @ev_mask: Mask of events.
 848 * @ev_reg_id: Event reg id.
 849 * @ev_req_id: Event request id.
 850 **/
 851static struct lpfc_bsg_event *
 852lpfc_bsg_event_new(uint32_t ev_mask, int ev_reg_id, uint32_t ev_req_id)
 853{
 854        struct lpfc_bsg_event *evt = kzalloc(sizeof(*evt), GFP_KERNEL);
 855
 856        if (!evt)
 857                return NULL;
 858
 859        INIT_LIST_HEAD(&evt->events_to_get);
 860        INIT_LIST_HEAD(&evt->events_to_see);
 861        evt->type_mask = ev_mask;
 862        evt->req_id = ev_req_id;
 863        evt->reg_id = ev_reg_id;
 864        evt->wait_time_stamp = jiffies;
 865        evt->dd_data = NULL;
 866        init_waitqueue_head(&evt->wq);
 867        kref_init(&evt->kref);
 868        return evt;
 869}
 870
 871/**
 872 * diag_cmd_data_free - Frees an lpfc dma buffer extension
 873 * @phba: Pointer to HBA context object.
 874 * @mlist: Pointer to an lpfc dma buffer extension.
 875 **/
 876static int
 877diag_cmd_data_free(struct lpfc_hba *phba, struct lpfc_dmabufext *mlist)
 878{
 879        struct lpfc_dmabufext *mlast;
 880        struct pci_dev *pcidev;
 881        struct list_head head, *curr, *next;
 882
 883        if ((!mlist) || (!lpfc_is_link_up(phba) &&
 884                (phba->link_flag & LS_LOOPBACK_MODE))) {
 885                return 0;
 886        }
 887
 888        pcidev = phba->pcidev;
 889        list_add_tail(&head, &mlist->dma.list);
 890
 891        list_for_each_safe(curr, next, &head) {
 892                mlast = list_entry(curr, struct lpfc_dmabufext , dma.list);
 893                if (mlast->dma.virt)
 894                        dma_free_coherent(&pcidev->dev,
 895                                          mlast->size,
 896                                          mlast->dma.virt,
 897                                          mlast->dma.phys);
 898                kfree(mlast);
 899        }
 900        return 0;
 901}
 902
 903/*
 904 * lpfc_bsg_ct_unsol_event - process an unsolicited CT command
 905 *
 906 * This function is called when an unsolicited CT command is received.  It
 907 * forwards the event to any processes registered to receive CT events.
 908 **/
 909int
 910lpfc_bsg_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
 911                        struct lpfc_iocbq *piocbq)
 912{
 913        uint32_t evt_req_id = 0;
 914        uint32_t cmd;
 915        struct lpfc_dmabuf *dmabuf = NULL;
 916        struct lpfc_bsg_event *evt;
 917        struct event_data *evt_dat = NULL;
 918        struct lpfc_iocbq *iocbq;
 919        size_t offset = 0;
 920        struct list_head head;
 921        struct ulp_bde64 *bde;
 922        dma_addr_t dma_addr;
 923        int i;
 924        struct lpfc_dmabuf *bdeBuf1 = piocbq->context2;
 925        struct lpfc_dmabuf *bdeBuf2 = piocbq->context3;
 926        struct lpfc_hbq_entry *hbqe;
 927        struct lpfc_sli_ct_request *ct_req;
 928        struct bsg_job *job = NULL;
 929        struct fc_bsg_reply *bsg_reply;
 930        struct bsg_job_data *dd_data = NULL;
 931        unsigned long flags;
 932        int size = 0;
 933
 934        INIT_LIST_HEAD(&head);
 935        list_add_tail(&head, &piocbq->list);
 936
 937        ct_req = (struct lpfc_sli_ct_request *)bdeBuf1->virt;
 938        evt_req_id = ct_req->FsType;
 939        cmd = ct_req->CommandResponse.bits.CmdRsp;
 940
 941        spin_lock_irqsave(&phba->ct_ev_lock, flags);
 942        list_for_each_entry(evt, &phba->ct_ev_waiters, node) {
 943                if (!(evt->type_mask & FC_REG_CT_EVENT) ||
 944                        evt->req_id != evt_req_id)
 945                        continue;
 946
 947                lpfc_bsg_event_ref(evt);
 948                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
 949                evt_dat = kzalloc(sizeof(*evt_dat), GFP_KERNEL);
 950                if (evt_dat == NULL) {
 951                        spin_lock_irqsave(&phba->ct_ev_lock, flags);
 952                        lpfc_bsg_event_unref(evt);
 953                        lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
 954                                        "2614 Memory allocation failed for "
 955                                        "CT event\n");
 956                        break;
 957                }
 958
 959                if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
 960                        /* take accumulated byte count from the last iocbq */
 961                        iocbq = list_entry(head.prev, typeof(*iocbq), list);
 962                        evt_dat->len = iocbq->iocb.unsli3.rcvsli3.acc_len;
 963                } else {
 964                        list_for_each_entry(iocbq, &head, list) {
 965                                for (i = 0; i < iocbq->iocb.ulpBdeCount; i++)
 966                                        evt_dat->len +=
 967                                        iocbq->iocb.un.cont64[i].tus.f.bdeSize;
 968                        }
 969                }
 970
 971                evt_dat->data = kzalloc(evt_dat->len, GFP_KERNEL);
 972                if (evt_dat->data == NULL) {
 973                        lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
 974                                        "2615 Memory allocation failed for "
 975                                        "CT event data, size %d\n",
 976                                        evt_dat->len);
 977                        kfree(evt_dat);
 978                        spin_lock_irqsave(&phba->ct_ev_lock, flags);
 979                        lpfc_bsg_event_unref(evt);
 980                        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
 981                        goto error_ct_unsol_exit;
 982                }
 983
 984                list_for_each_entry(iocbq, &head, list) {
 985                        size = 0;
 986                        if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
 987                                bdeBuf1 = iocbq->context2;
 988                                bdeBuf2 = iocbq->context3;
 989                        }
 990                        for (i = 0; i < iocbq->iocb.ulpBdeCount; i++) {
 991                                if (phba->sli3_options &
 992                                    LPFC_SLI3_HBQ_ENABLED) {
 993                                        if (i == 0) {
 994                                                hbqe = (struct lpfc_hbq_entry *)
 995                                                  &iocbq->iocb.un.ulpWord[0];
 996                                                size = hbqe->bde.tus.f.bdeSize;
 997                                                dmabuf = bdeBuf1;
 998                                        } else if (i == 1) {
 999                                                hbqe = (struct lpfc_hbq_entry *)
1000                                                        &iocbq->iocb.unsli3.
1001                                                        sli3Words[4];
1002                                                size = hbqe->bde.tus.f.bdeSize;
1003                                                dmabuf = bdeBuf2;
1004                                        }
1005                                        if ((offset + size) > evt_dat->len)
1006                                                size = evt_dat->len - offset;
1007                                } else {
1008                                        size = iocbq->iocb.un.cont64[i].
1009                                                tus.f.bdeSize;
1010                                        bde = &iocbq->iocb.un.cont64[i];
1011                                        dma_addr = getPaddr(bde->addrHigh,
1012                                                            bde->addrLow);
1013                                        dmabuf = lpfc_sli_ringpostbuf_get(phba,
1014                                                        pring, dma_addr);
1015                                }
1016                                if (!dmabuf) {
1017                                        lpfc_printf_log(phba, KERN_ERR,
1018                                                LOG_LIBDFC, "2616 No dmabuf "
1019                                                "found for iocbq x%px\n",
1020                                                iocbq);
1021                                        kfree(evt_dat->data);
1022                                        kfree(evt_dat);
1023                                        spin_lock_irqsave(&phba->ct_ev_lock,
1024                                                flags);
1025                                        lpfc_bsg_event_unref(evt);
1026                                        spin_unlock_irqrestore(
1027                                                &phba->ct_ev_lock, flags);
1028                                        goto error_ct_unsol_exit;
1029                                }
1030                                memcpy((char *)(evt_dat->data) + offset,
1031                                       dmabuf->virt, size);
1032                                offset += size;
1033                                if (evt_req_id != SLI_CT_ELX_LOOPBACK &&
1034                                    !(phba->sli3_options &
1035                                      LPFC_SLI3_HBQ_ENABLED)) {
1036                                        lpfc_sli_ringpostbuf_put(phba, pring,
1037                                                                 dmabuf);
1038                                } else {
1039                                        switch (cmd) {
1040                                        case ELX_LOOPBACK_DATA:
1041                                                if (phba->sli_rev <
1042                                                    LPFC_SLI_REV4)
1043                                                        diag_cmd_data_free(phba,
1044                                                        (struct lpfc_dmabufext
1045                                                         *)dmabuf);
1046                                                break;
1047                                        case ELX_LOOPBACK_XRI_SETUP:
1048                                                if ((phba->sli_rev ==
1049                                                        LPFC_SLI_REV2) ||
1050                                                        (phba->sli3_options &
1051                                                        LPFC_SLI3_HBQ_ENABLED
1052                                                        )) {
1053                                                        lpfc_in_buf_free(phba,
1054                                                                        dmabuf);
1055                                                } else {
1056                                                        lpfc_post_buffer(phba,
1057                                                                         pring,
1058                                                                         1);
1059                                                }
1060                                                break;
1061                                        default:
1062                                                if (!(phba->sli3_options &
1063                                                      LPFC_SLI3_HBQ_ENABLED))
1064                                                        lpfc_post_buffer(phba,
1065                                                                         pring,
1066                                                                         1);
1067                                                break;
1068                                        }
1069                                }
1070                        }
1071                }
1072
1073                spin_lock_irqsave(&phba->ct_ev_lock, flags);
1074                if (phba->sli_rev == LPFC_SLI_REV4) {
1075                        evt_dat->immed_dat = phba->ctx_idx;
1076                        phba->ctx_idx = (phba->ctx_idx + 1) % LPFC_CT_CTX_MAX;
1077                        /* Provide warning for over-run of the ct_ctx array */
1078                        if (phba->ct_ctx[evt_dat->immed_dat].valid ==
1079                            UNSOL_VALID)
1080                                lpfc_printf_log(phba, KERN_WARNING, LOG_ELS,
1081                                                "2717 CT context array entry "
1082                                                "[%d] over-run: oxid:x%x, "
1083                                                "sid:x%x\n", phba->ctx_idx,
1084                                                phba->ct_ctx[
1085                                                    evt_dat->immed_dat].oxid,
1086                                                phba->ct_ctx[
1087                                                    evt_dat->immed_dat].SID);
1088                        phba->ct_ctx[evt_dat->immed_dat].rxid =
1089                                piocbq->iocb.ulpContext;
1090                        phba->ct_ctx[evt_dat->immed_dat].oxid =
1091                                piocbq->iocb.unsli3.rcvsli3.ox_id;
1092                        phba->ct_ctx[evt_dat->immed_dat].SID =
1093                                piocbq->iocb.un.rcvels.remoteID;
1094                        phba->ct_ctx[evt_dat->immed_dat].valid = UNSOL_VALID;
1095                } else
1096                        evt_dat->immed_dat = piocbq->iocb.ulpContext;
1097
1098                evt_dat->type = FC_REG_CT_EVENT;
1099                list_add(&evt_dat->node, &evt->events_to_see);
1100                if (evt_req_id == SLI_CT_ELX_LOOPBACK) {
1101                        wake_up_interruptible(&evt->wq);
1102                        lpfc_bsg_event_unref(evt);
1103                        break;
1104                }
1105
1106                list_move(evt->events_to_see.prev, &evt->events_to_get);
1107
1108                dd_data = (struct bsg_job_data *)evt->dd_data;
1109                job = dd_data->set_job;
1110                dd_data->set_job = NULL;
1111                lpfc_bsg_event_unref(evt);
1112                if (job) {
1113                        bsg_reply = job->reply;
1114                        bsg_reply->reply_payload_rcv_len = size;
1115                        /* make error code available to userspace */
1116                        bsg_reply->result = 0;
1117                        job->dd_data = NULL;
1118                        /* complete the job back to userspace */
1119                        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1120                        bsg_job_done(job, bsg_reply->result,
1121                                       bsg_reply->reply_payload_rcv_len);
1122                        spin_lock_irqsave(&phba->ct_ev_lock, flags);
1123                }
1124        }
1125        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1126
1127error_ct_unsol_exit:
1128        if (!list_empty(&head))
1129                list_del(&head);
1130        if ((phba->sli_rev < LPFC_SLI_REV4) &&
1131            (evt_req_id == SLI_CT_ELX_LOOPBACK))
1132                return 0;
1133        return 1;
1134}
1135
1136/**
1137 * lpfc_bsg_ct_unsol_abort - handler ct abort to management plane
1138 * @phba: Pointer to HBA context object.
1139 * @dmabuf: pointer to a dmabuf that describes the FC sequence
1140 *
1141 * This function handles abort to the CT command toward management plane
1142 * for SLI4 port.
1143 *
1144 * If the pending context of a CT command to management plane present, clears
1145 * such context and returns 1 for handled; otherwise, it returns 0 indicating
1146 * no context exists.
1147 **/
1148int
1149lpfc_bsg_ct_unsol_abort(struct lpfc_hba *phba, struct hbq_dmabuf *dmabuf)
1150{
1151        struct fc_frame_header fc_hdr;
1152        struct fc_frame_header *fc_hdr_ptr = &fc_hdr;
1153        int ctx_idx, handled = 0;
1154        uint16_t oxid, rxid;
1155        uint32_t sid;
1156
1157        memcpy(fc_hdr_ptr, dmabuf->hbuf.virt, sizeof(struct fc_frame_header));
1158        sid = sli4_sid_from_fc_hdr(fc_hdr_ptr);
1159        oxid = be16_to_cpu(fc_hdr_ptr->fh_ox_id);
1160        rxid = be16_to_cpu(fc_hdr_ptr->fh_rx_id);
1161
1162        for (ctx_idx = 0; ctx_idx < LPFC_CT_CTX_MAX; ctx_idx++) {
1163                if (phba->ct_ctx[ctx_idx].valid != UNSOL_VALID)
1164                        continue;
1165                if (phba->ct_ctx[ctx_idx].rxid != rxid)
1166                        continue;
1167                if (phba->ct_ctx[ctx_idx].oxid != oxid)
1168                        continue;
1169                if (phba->ct_ctx[ctx_idx].SID != sid)
1170                        continue;
1171                phba->ct_ctx[ctx_idx].valid = UNSOL_INVALID;
1172                handled = 1;
1173        }
1174        return handled;
1175}
1176
1177/**
1178 * lpfc_bsg_hba_set_event - process a SET_EVENT bsg vendor command
1179 * @job: SET_EVENT fc_bsg_job
1180 **/
1181static int
1182lpfc_bsg_hba_set_event(struct bsg_job *job)
1183{
1184        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
1185        struct lpfc_hba *phba = vport->phba;
1186        struct fc_bsg_request *bsg_request = job->request;
1187        struct set_ct_event *event_req;
1188        struct lpfc_bsg_event *evt;
1189        int rc = 0;
1190        struct bsg_job_data *dd_data = NULL;
1191        uint32_t ev_mask;
1192        unsigned long flags;
1193
1194        if (job->request_len <
1195            sizeof(struct fc_bsg_request) + sizeof(struct set_ct_event)) {
1196                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1197                                "2612 Received SET_CT_EVENT below minimum "
1198                                "size\n");
1199                rc = -EINVAL;
1200                goto job_error;
1201        }
1202
1203        event_req = (struct set_ct_event *)
1204                bsg_request->rqst_data.h_vendor.vendor_cmd;
1205        ev_mask = ((uint32_t)(unsigned long)event_req->type_mask &
1206                                FC_REG_EVENT_MASK);
1207        spin_lock_irqsave(&phba->ct_ev_lock, flags);
1208        list_for_each_entry(evt, &phba->ct_ev_waiters, node) {
1209                if (evt->reg_id == event_req->ev_reg_id) {
1210                        lpfc_bsg_event_ref(evt);
1211                        evt->wait_time_stamp = jiffies;
1212                        dd_data = (struct bsg_job_data *)evt->dd_data;
1213                        break;
1214                }
1215        }
1216        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1217
1218        if (&evt->node == &phba->ct_ev_waiters) {
1219                /* no event waiting struct yet - first call */
1220                dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
1221                if (dd_data == NULL) {
1222                        lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1223                                        "2734 Failed allocation of dd_data\n");
1224                        rc = -ENOMEM;
1225                        goto job_error;
1226                }
1227                evt = lpfc_bsg_event_new(ev_mask, event_req->ev_reg_id,
1228                                        event_req->ev_req_id);
1229                if (!evt) {
1230                        lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1231                                        "2617 Failed allocation of event "
1232                                        "waiter\n");
1233                        rc = -ENOMEM;
1234                        goto job_error;
1235                }
1236                dd_data->type = TYPE_EVT;
1237                dd_data->set_job = NULL;
1238                dd_data->context_un.evt = evt;
1239                evt->dd_data = (void *)dd_data;
1240                spin_lock_irqsave(&phba->ct_ev_lock, flags);
1241                list_add(&evt->node, &phba->ct_ev_waiters);
1242                lpfc_bsg_event_ref(evt);
1243                evt->wait_time_stamp = jiffies;
1244                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1245        }
1246
1247        spin_lock_irqsave(&phba->ct_ev_lock, flags);
1248        evt->waiting = 1;
1249        dd_data->set_job = job; /* for unsolicited command */
1250        job->dd_data = dd_data; /* for fc transport timeout callback*/
1251        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1252        return 0; /* call job done later */
1253
1254job_error:
1255        kfree(dd_data);
1256        job->dd_data = NULL;
1257        return rc;
1258}
1259
1260/**
1261 * lpfc_bsg_hba_get_event - process a GET_EVENT bsg vendor command
1262 * @job: GET_EVENT fc_bsg_job
1263 **/
1264static int
1265lpfc_bsg_hba_get_event(struct bsg_job *job)
1266{
1267        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
1268        struct lpfc_hba *phba = vport->phba;
1269        struct fc_bsg_request *bsg_request = job->request;
1270        struct fc_bsg_reply *bsg_reply = job->reply;
1271        struct get_ct_event *event_req;
1272        struct get_ct_event_reply *event_reply;
1273        struct lpfc_bsg_event *evt, *evt_next;
1274        struct event_data *evt_dat = NULL;
1275        unsigned long flags;
1276        uint32_t rc = 0;
1277
1278        if (job->request_len <
1279            sizeof(struct fc_bsg_request) + sizeof(struct get_ct_event)) {
1280                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1281                                "2613 Received GET_CT_EVENT request below "
1282                                "minimum size\n");
1283                rc = -EINVAL;
1284                goto job_error;
1285        }
1286
1287        event_req = (struct get_ct_event *)
1288                bsg_request->rqst_data.h_vendor.vendor_cmd;
1289
1290        event_reply = (struct get_ct_event_reply *)
1291                bsg_reply->reply_data.vendor_reply.vendor_rsp;
1292        spin_lock_irqsave(&phba->ct_ev_lock, flags);
1293        list_for_each_entry_safe(evt, evt_next, &phba->ct_ev_waiters, node) {
1294                if (evt->reg_id == event_req->ev_reg_id) {
1295                        if (list_empty(&evt->events_to_get))
1296                                break;
1297                        lpfc_bsg_event_ref(evt);
1298                        evt->wait_time_stamp = jiffies;
1299                        evt_dat = list_entry(evt->events_to_get.prev,
1300                                             struct event_data, node);
1301                        list_del(&evt_dat->node);
1302                        break;
1303                }
1304        }
1305        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1306
1307        /* The app may continue to ask for event data until it gets
1308         * an error indicating that there isn't anymore
1309         */
1310        if (evt_dat == NULL) {
1311                bsg_reply->reply_payload_rcv_len = 0;
1312                rc = -ENOENT;
1313                goto job_error;
1314        }
1315
1316        if (evt_dat->len > job->request_payload.payload_len) {
1317                evt_dat->len = job->request_payload.payload_len;
1318                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1319                                "2618 Truncated event data at %d "
1320                                "bytes\n",
1321                                job->request_payload.payload_len);
1322        }
1323
1324        event_reply->type = evt_dat->type;
1325        event_reply->immed_data = evt_dat->immed_dat;
1326        if (evt_dat->len > 0)
1327                bsg_reply->reply_payload_rcv_len =
1328                        sg_copy_from_buffer(job->request_payload.sg_list,
1329                                            job->request_payload.sg_cnt,
1330                                            evt_dat->data, evt_dat->len);
1331        else
1332                bsg_reply->reply_payload_rcv_len = 0;
1333
1334        if (evt_dat) {
1335                kfree(evt_dat->data);
1336                kfree(evt_dat);
1337        }
1338
1339        spin_lock_irqsave(&phba->ct_ev_lock, flags);
1340        lpfc_bsg_event_unref(evt);
1341        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1342        job->dd_data = NULL;
1343        bsg_reply->result = 0;
1344        bsg_job_done(job, bsg_reply->result,
1345                       bsg_reply->reply_payload_rcv_len);
1346        return 0;
1347
1348job_error:
1349        job->dd_data = NULL;
1350        bsg_reply->result = rc;
1351        return rc;
1352}
1353
1354/**
1355 * lpfc_issue_ct_rsp_cmp - lpfc_issue_ct_rsp's completion handler
1356 * @phba: Pointer to HBA context object.
1357 * @cmdiocbq: Pointer to command iocb.
1358 * @rspiocbq: Pointer to response iocb.
1359 *
1360 * This function is the completion handler for iocbs issued using
1361 * lpfc_issue_ct_rsp_cmp function. This function is called by the
1362 * ring event handler function without any lock held. This function
1363 * can be called from both worker thread context and interrupt
1364 * context. This function also can be called from other thread which
1365 * cleans up the SLI layer objects.
1366 * This function copy the contents of the response iocb to the
1367 * response iocb memory object provided by the caller of
1368 * lpfc_sli_issue_iocb_wait and then wakes up the thread which
1369 * sleeps for the iocb completion.
1370 **/
1371static void
1372lpfc_issue_ct_rsp_cmp(struct lpfc_hba *phba,
1373                        struct lpfc_iocbq *cmdiocbq,
1374                        struct lpfc_iocbq *rspiocbq)
1375{
1376        struct bsg_job_data *dd_data;
1377        struct bsg_job *job;
1378        struct fc_bsg_reply *bsg_reply;
1379        IOCB_t *rsp;
1380        struct lpfc_dmabuf *bmp, *cmp;
1381        struct lpfc_nodelist *ndlp;
1382        unsigned long flags;
1383        int rc = 0;
1384
1385        dd_data = cmdiocbq->context1;
1386
1387        /* Determine if job has been aborted */
1388        spin_lock_irqsave(&phba->ct_ev_lock, flags);
1389        job = dd_data->set_job;
1390        if (job) {
1391                /* Prevent timeout handling from trying to abort job  */
1392                job->dd_data = NULL;
1393        }
1394        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
1395
1396        /* Close the timeout handler abort window */
1397        spin_lock_irqsave(&phba->hbalock, flags);
1398        cmdiocbq->iocb_flag &= ~LPFC_IO_CMD_OUTSTANDING;
1399        spin_unlock_irqrestore(&phba->hbalock, flags);
1400
1401        ndlp = dd_data->context_un.iocb.ndlp;
1402        cmp = cmdiocbq->context2;
1403        bmp = cmdiocbq->context3;
1404        rsp = &rspiocbq->iocb;
1405
1406        /* Copy the completed job data or set the error status */
1407
1408        if (job) {
1409                bsg_reply = job->reply;
1410                if (rsp->ulpStatus) {
1411                        if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
1412                                switch (rsp->un.ulpWord[4] & IOERR_PARAM_MASK) {
1413                                case IOERR_SEQUENCE_TIMEOUT:
1414                                        rc = -ETIMEDOUT;
1415                                        break;
1416                                case IOERR_INVALID_RPI:
1417                                        rc = -EFAULT;
1418                                        break;
1419                                default:
1420                                        rc = -EACCES;
1421                                        break;
1422                                }
1423                        } else {
1424                                rc = -EACCES;
1425                        }
1426                } else {
1427                        bsg_reply->reply_payload_rcv_len = 0;
1428                }
1429        }
1430
1431        lpfc_free_bsg_buffers(phba, cmp);
1432        lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
1433        kfree(bmp);
1434        lpfc_sli_release_iocbq(phba, cmdiocbq);
1435        lpfc_nlp_put(ndlp);
1436        kfree(dd_data);
1437
1438        /* Complete the job if the job is still active */
1439
1440        if (job) {
1441                bsg_reply->result = rc;
1442                bsg_job_done(job, bsg_reply->result,
1443                               bsg_reply->reply_payload_rcv_len);
1444        }
1445        return;
1446}
1447
1448/**
1449 * lpfc_issue_ct_rsp - issue a ct response
1450 * @phba: Pointer to HBA context object.
1451 * @job: Pointer to the job object.
1452 * @tag: tag index value into the ports context exchange array.
1453 * @cmp: Pointer to a cmp dma buffer descriptor.
1454 * @bmp: Pointer to a bmp dma buffer descriptor.
1455 * @num_entry: Number of enties in the bde.
1456 **/
1457static int
1458lpfc_issue_ct_rsp(struct lpfc_hba *phba, struct bsg_job *job, uint32_t tag,
1459                  struct lpfc_dmabuf *cmp, struct lpfc_dmabuf *bmp,
1460                  int num_entry)
1461{
1462        IOCB_t *icmd;
1463        struct lpfc_iocbq *ctiocb = NULL;
1464        int rc = 0;
1465        struct lpfc_nodelist *ndlp = NULL;
1466        struct bsg_job_data *dd_data;
1467        unsigned long flags;
1468        uint32_t creg_val;
1469
1470        ndlp = lpfc_findnode_did(phba->pport, phba->ct_ctx[tag].SID);
1471        if (!ndlp) {
1472                lpfc_printf_log(phba, KERN_WARNING, LOG_ELS,
1473                                "2721 ndlp null for oxid %x SID %x\n",
1474                                phba->ct_ctx[tag].rxid,
1475                                phba->ct_ctx[tag].SID);
1476                return IOCB_ERROR;
1477        }
1478
1479        /* allocate our bsg tracking structure */
1480        dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
1481        if (!dd_data) {
1482                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1483                                "2736 Failed allocation of dd_data\n");
1484                rc = -ENOMEM;
1485                goto no_dd_data;
1486        }
1487
1488        /* Allocate buffer for  command iocb */
1489        ctiocb = lpfc_sli_get_iocbq(phba);
1490        if (!ctiocb) {
1491                rc = -ENOMEM;
1492                goto no_ctiocb;
1493        }
1494
1495        icmd = &ctiocb->iocb;
1496        icmd->un.xseq64.bdl.ulpIoTag32 = 0;
1497        icmd->un.xseq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
1498        icmd->un.xseq64.bdl.addrLow = putPaddrLow(bmp->phys);
1499        icmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
1500        icmd->un.xseq64.bdl.bdeSize = (num_entry * sizeof(struct ulp_bde64));
1501        icmd->un.xseq64.w5.hcsw.Fctl = (LS | LA);
1502        icmd->un.xseq64.w5.hcsw.Dfctl = 0;
1503        icmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_DD_SOL_CTL;
1504        icmd->un.xseq64.w5.hcsw.Type = FC_TYPE_CT;
1505
1506        /* Fill in rest of iocb */
1507        icmd->ulpCommand = CMD_XMIT_SEQUENCE64_CX;
1508        icmd->ulpBdeCount = 1;
1509        icmd->ulpLe = 1;
1510        icmd->ulpClass = CLASS3;
1511        if (phba->sli_rev == LPFC_SLI_REV4) {
1512                /* Do not issue unsol response if oxid not marked as valid */
1513                if (phba->ct_ctx[tag].valid != UNSOL_VALID) {
1514                        rc = IOCB_ERROR;
1515                        goto issue_ct_rsp_exit;
1516                }
1517                icmd->ulpContext = phba->ct_ctx[tag].rxid;
1518                icmd->unsli3.rcvsli3.ox_id = phba->ct_ctx[tag].oxid;
1519                ndlp = lpfc_findnode_did(phba->pport, phba->ct_ctx[tag].SID);
1520                if (!ndlp) {
1521                        lpfc_printf_log(phba, KERN_WARNING, LOG_ELS,
1522                                 "2721 ndlp null for oxid %x SID %x\n",
1523                                        icmd->ulpContext,
1524                                        phba->ct_ctx[tag].SID);
1525                        rc = IOCB_ERROR;
1526                        goto issue_ct_rsp_exit;
1527                }
1528
1529                /* get a refernece count so the ndlp doesn't go away while
1530                 * we respond
1531                 */
1532                if (!lpfc_nlp_get(ndlp)) {
1533                        rc = IOCB_ERROR;
1534                        goto issue_ct_rsp_exit;
1535                }
1536
1537                icmd->un.ulpWord[3] =
1538                                phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
1539
1540                /* The exchange is done, mark the entry as invalid */
1541                phba->ct_ctx[tag].valid = UNSOL_INVALID;
1542        } else
1543                icmd->ulpContext = (ushort) tag;
1544
1545        icmd->ulpTimeout = phba->fc_ratov * 2;
1546
1547        /* Xmit CT response on exchange <xid> */
1548        lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1549                "2722 Xmit CT response on exchange x%x Data: x%x x%x x%x\n",
1550                icmd->ulpContext, icmd->ulpIoTag, tag, phba->link_state);
1551
1552        ctiocb->iocb_flag |= LPFC_IO_LIBDFC;
1553        ctiocb->vport = phba->pport;
1554        ctiocb->context1 = dd_data;
1555        ctiocb->context2 = cmp;
1556        ctiocb->context3 = bmp;
1557        ctiocb->context_un.ndlp = ndlp;
1558        ctiocb->iocb_cmpl = lpfc_issue_ct_rsp_cmp;
1559
1560        dd_data->type = TYPE_IOCB;
1561        dd_data->set_job = job;
1562        dd_data->context_un.iocb.cmdiocbq = ctiocb;
1563        dd_data->context_un.iocb.ndlp = lpfc_nlp_get(ndlp);
1564        if (!dd_data->context_un.iocb.ndlp) {
1565                rc = -IOCB_ERROR;
1566                goto issue_ct_rsp_exit;
1567        }
1568        dd_data->context_un.iocb.rmp = NULL;
1569        job->dd_data = dd_data;
1570
1571        if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
1572                if (lpfc_readl(phba->HCregaddr, &creg_val)) {
1573                        rc = -IOCB_ERROR;
1574                        goto issue_ct_rsp_exit;
1575                }
1576                creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
1577                writel(creg_val, phba->HCregaddr);
1578                readl(phba->HCregaddr); /* flush */
1579        }
1580
1581        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, ctiocb, 0);
1582        if (rc == IOCB_SUCCESS) {
1583                spin_lock_irqsave(&phba->hbalock, flags);
1584                /* make sure the I/O had not been completed/released */
1585                if (ctiocb->iocb_flag & LPFC_IO_LIBDFC) {
1586                        /* open up abort window to timeout handler */
1587                        ctiocb->iocb_flag |= LPFC_IO_CMD_OUTSTANDING;
1588                }
1589                spin_unlock_irqrestore(&phba->hbalock, flags);
1590                return 0; /* done for now */
1591        }
1592
1593        /* iocb failed so cleanup */
1594        job->dd_data = NULL;
1595        lpfc_nlp_put(ndlp);
1596
1597issue_ct_rsp_exit:
1598        lpfc_sli_release_iocbq(phba, ctiocb);
1599no_ctiocb:
1600        kfree(dd_data);
1601no_dd_data:
1602        return rc;
1603}
1604
1605/**
1606 * lpfc_bsg_send_mgmt_rsp - process a SEND_MGMT_RESP bsg vendor command
1607 * @job: SEND_MGMT_RESP fc_bsg_job
1608 **/
1609static int
1610lpfc_bsg_send_mgmt_rsp(struct bsg_job *job)
1611{
1612        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
1613        struct lpfc_hba *phba = vport->phba;
1614        struct fc_bsg_request *bsg_request = job->request;
1615        struct fc_bsg_reply *bsg_reply = job->reply;
1616        struct send_mgmt_resp *mgmt_resp = (struct send_mgmt_resp *)
1617                bsg_request->rqst_data.h_vendor.vendor_cmd;
1618        struct ulp_bde64 *bpl;
1619        struct lpfc_dmabuf *bmp = NULL, *cmp = NULL;
1620        int bpl_entries;
1621        uint32_t tag = mgmt_resp->tag;
1622        unsigned long reqbfrcnt =
1623                        (unsigned long)job->request_payload.payload_len;
1624        int rc = 0;
1625
1626        /* in case no data is transferred */
1627        bsg_reply->reply_payload_rcv_len = 0;
1628
1629        if (!reqbfrcnt || (reqbfrcnt > (80 * BUF_SZ_4K))) {
1630                rc = -ERANGE;
1631                goto send_mgmt_rsp_exit;
1632        }
1633
1634        bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
1635        if (!bmp) {
1636                rc = -ENOMEM;
1637                goto send_mgmt_rsp_exit;
1638        }
1639
1640        bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys);
1641        if (!bmp->virt) {
1642                rc = -ENOMEM;
1643                goto send_mgmt_rsp_free_bmp;
1644        }
1645
1646        INIT_LIST_HEAD(&bmp->list);
1647        bpl = (struct ulp_bde64 *) bmp->virt;
1648        bpl_entries = (LPFC_BPL_SIZE/sizeof(struct ulp_bde64));
1649        cmp = lpfc_alloc_bsg_buffers(phba, job->request_payload.payload_len,
1650                                     1, bpl, &bpl_entries);
1651        if (!cmp) {
1652                rc = -ENOMEM;
1653                goto send_mgmt_rsp_free_bmp;
1654        }
1655        lpfc_bsg_copy_data(cmp, &job->request_payload,
1656                           job->request_payload.payload_len, 1);
1657
1658        rc = lpfc_issue_ct_rsp(phba, job, tag, cmp, bmp, bpl_entries);
1659
1660        if (rc == IOCB_SUCCESS)
1661                return 0; /* done for now */
1662
1663        rc = -EACCES;
1664
1665        lpfc_free_bsg_buffers(phba, cmp);
1666
1667send_mgmt_rsp_free_bmp:
1668        if (bmp->virt)
1669                lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
1670        kfree(bmp);
1671send_mgmt_rsp_exit:
1672        /* make error code available to userspace */
1673        bsg_reply->result = rc;
1674        job->dd_data = NULL;
1675        return rc;
1676}
1677
1678/**
1679 * lpfc_bsg_diag_mode_enter - process preparing into device diag loopback mode
1680 * @phba: Pointer to HBA context object.
1681 *
1682 * This function is responsible for preparing driver for diag loopback
1683 * on device.
1684 */
1685static int
1686lpfc_bsg_diag_mode_enter(struct lpfc_hba *phba)
1687{
1688        struct lpfc_vport **vports;
1689        struct Scsi_Host *shost;
1690        struct lpfc_sli *psli;
1691        struct lpfc_queue *qp = NULL;
1692        struct lpfc_sli_ring *pring;
1693        int i = 0;
1694
1695        psli = &phba->sli;
1696        if (!psli)
1697                return -ENODEV;
1698
1699
1700        if ((phba->link_state == LPFC_HBA_ERROR) ||
1701            (psli->sli_flag & LPFC_BLOCK_MGMT_IO) ||
1702            (!(psli->sli_flag & LPFC_SLI_ACTIVE)))
1703                return -EACCES;
1704
1705        vports = lpfc_create_vport_work_array(phba);
1706        if (vports) {
1707                for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
1708                        shost = lpfc_shost_from_vport(vports[i]);
1709                        scsi_block_requests(shost);
1710                }
1711                lpfc_destroy_vport_work_array(phba, vports);
1712        } else {
1713                shost = lpfc_shost_from_vport(phba->pport);
1714                scsi_block_requests(shost);
1715        }
1716
1717        if (phba->sli_rev != LPFC_SLI_REV4) {
1718                pring = &psli->sli3_ring[LPFC_FCP_RING];
1719                lpfc_emptyq_wait(phba, &pring->txcmplq, &phba->hbalock);
1720                return 0;
1721        }
1722        list_for_each_entry(qp, &phba->sli4_hba.lpfc_wq_list, wq_list) {
1723                pring = qp->pring;
1724                if (!pring || (pring->ringno != LPFC_FCP_RING))
1725                        continue;
1726                if (!lpfc_emptyq_wait(phba, &pring->txcmplq,
1727                                      &pring->ring_lock))
1728                        break;
1729        }
1730        return 0;
1731}
1732
1733/**
1734 * lpfc_bsg_diag_mode_exit - exit process from device diag loopback mode
1735 * @phba: Pointer to HBA context object.
1736 *
1737 * This function is responsible for driver exit processing of setting up
1738 * diag loopback mode on device.
1739 */
1740static void
1741lpfc_bsg_diag_mode_exit(struct lpfc_hba *phba)
1742{
1743        struct Scsi_Host *shost;
1744        struct lpfc_vport **vports;
1745        int i;
1746
1747        vports = lpfc_create_vport_work_array(phba);
1748        if (vports) {
1749                for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
1750                        shost = lpfc_shost_from_vport(vports[i]);
1751                        scsi_unblock_requests(shost);
1752                }
1753                lpfc_destroy_vport_work_array(phba, vports);
1754        } else {
1755                shost = lpfc_shost_from_vport(phba->pport);
1756                scsi_unblock_requests(shost);
1757        }
1758        return;
1759}
1760
1761/**
1762 * lpfc_sli3_bsg_diag_loopback_mode - process an sli3 bsg vendor command
1763 * @phba: Pointer to HBA context object.
1764 * @job: LPFC_BSG_VENDOR_DIAG_MODE
1765 *
1766 * This function is responsible for placing an sli3  port into diagnostic
1767 * loopback mode in order to perform a diagnostic loopback test.
1768 * All new scsi requests are blocked, a small delay is used to allow the
1769 * scsi requests to complete then the link is brought down. If the link is
1770 * is placed in loopback mode then scsi requests are again allowed
1771 * so the scsi mid-layer doesn't give up on the port.
1772 * All of this is done in-line.
1773 */
1774static int
1775lpfc_sli3_bsg_diag_loopback_mode(struct lpfc_hba *phba, struct bsg_job *job)
1776{
1777        struct fc_bsg_request *bsg_request = job->request;
1778        struct fc_bsg_reply *bsg_reply = job->reply;
1779        struct diag_mode_set *loopback_mode;
1780        uint32_t link_flags;
1781        uint32_t timeout;
1782        LPFC_MBOXQ_t *pmboxq  = NULL;
1783        int mbxstatus = MBX_SUCCESS;
1784        int i = 0;
1785        int rc = 0;
1786
1787        /* no data to return just the return code */
1788        bsg_reply->reply_payload_rcv_len = 0;
1789
1790        if (job->request_len < sizeof(struct fc_bsg_request) +
1791            sizeof(struct diag_mode_set)) {
1792                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
1793                                "2738 Received DIAG MODE request size:%d "
1794                                "below the minimum size:%d\n",
1795                                job->request_len,
1796                                (int)(sizeof(struct fc_bsg_request) +
1797                                sizeof(struct diag_mode_set)));
1798                rc = -EINVAL;
1799                goto job_error;
1800        }
1801
1802        rc = lpfc_bsg_diag_mode_enter(phba);
1803        if (rc)
1804                goto job_error;
1805
1806        /* bring the link to diagnostic mode */
1807        loopback_mode = (struct diag_mode_set *)
1808                bsg_request->rqst_data.h_vendor.vendor_cmd;
1809        link_flags = loopback_mode->type;
1810        timeout = loopback_mode->timeout * 100;
1811
1812        pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1813        if (!pmboxq) {
1814                rc = -ENOMEM;
1815                goto loopback_mode_exit;
1816        }
1817        memset((void *)pmboxq, 0, sizeof(LPFC_MBOXQ_t));
1818        pmboxq->u.mb.mbxCommand = MBX_DOWN_LINK;
1819        pmboxq->u.mb.mbxOwner = OWN_HOST;
1820
1821        mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO);
1822
1823        if ((mbxstatus == MBX_SUCCESS) && (pmboxq->u.mb.mbxStatus == 0)) {
1824                /* wait for link down before proceeding */
1825                i = 0;
1826                while (phba->link_state != LPFC_LINK_DOWN) {
1827                        if (i++ > timeout) {
1828                                rc = -ETIMEDOUT;
1829                                goto loopback_mode_exit;
1830                        }
1831                        msleep(10);
1832                }
1833
1834                memset((void *)pmboxq, 0, sizeof(LPFC_MBOXQ_t));
1835                if (link_flags == INTERNAL_LOOP_BACK)
1836                        pmboxq->u.mb.un.varInitLnk.link_flags = FLAGS_LOCAL_LB;
1837                else
1838                        pmboxq->u.mb.un.varInitLnk.link_flags =
1839                                FLAGS_TOPOLOGY_MODE_LOOP;
1840
1841                pmboxq->u.mb.mbxCommand = MBX_INIT_LINK;
1842                pmboxq->u.mb.mbxOwner = OWN_HOST;
1843
1844                mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq,
1845                                                     LPFC_MBOX_TMO);
1846
1847                if ((mbxstatus != MBX_SUCCESS) || (pmboxq->u.mb.mbxStatus))
1848                        rc = -ENODEV;
1849                else {
1850                        spin_lock_irq(&phba->hbalock);
1851                        phba->link_flag |= LS_LOOPBACK_MODE;
1852                        spin_unlock_irq(&phba->hbalock);
1853                        /* wait for the link attention interrupt */
1854                        msleep(100);
1855
1856                        i = 0;
1857                        while (phba->link_state != LPFC_HBA_READY) {
1858                                if (i++ > timeout) {
1859                                        rc = -ETIMEDOUT;
1860                                        break;
1861                                }
1862
1863                                msleep(10);
1864                        }
1865                }
1866
1867        } else
1868                rc = -ENODEV;
1869
1870loopback_mode_exit:
1871        lpfc_bsg_diag_mode_exit(phba);
1872
1873        /*
1874         * Let SLI layer release mboxq if mbox command completed after timeout.
1875         */
1876        if (pmboxq && mbxstatus != MBX_TIMEOUT)
1877                mempool_free(pmboxq, phba->mbox_mem_pool);
1878
1879job_error:
1880        /* make error code available to userspace */
1881        bsg_reply->result = rc;
1882        /* complete the job back to userspace if no error */
1883        if (rc == 0)
1884                bsg_job_done(job, bsg_reply->result,
1885                               bsg_reply->reply_payload_rcv_len);
1886        return rc;
1887}
1888
1889/**
1890 * lpfc_sli4_bsg_set_link_diag_state - set sli4 link diag state
1891 * @phba: Pointer to HBA context object.
1892 * @diag: Flag for set link to diag or nomral operation state.
1893 *
1894 * This function is responsible for issuing a sli4 mailbox command for setting
1895 * link to either diag state or normal operation state.
1896 */
1897static int
1898lpfc_sli4_bsg_set_link_diag_state(struct lpfc_hba *phba, uint32_t diag)
1899{
1900        LPFC_MBOXQ_t *pmboxq;
1901        struct lpfc_mbx_set_link_diag_state *link_diag_state;
1902        uint32_t req_len, alloc_len;
1903        int mbxstatus = MBX_SUCCESS, rc;
1904
1905        pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1906        if (!pmboxq)
1907                return -ENOMEM;
1908
1909        req_len = (sizeof(struct lpfc_mbx_set_link_diag_state) -
1910                   sizeof(struct lpfc_sli4_cfg_mhdr));
1911        alloc_len = lpfc_sli4_config(phba, pmboxq, LPFC_MBOX_SUBSYSTEM_FCOE,
1912                                LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_STATE,
1913                                req_len, LPFC_SLI4_MBX_EMBED);
1914        if (alloc_len != req_len) {
1915                rc = -ENOMEM;
1916                goto link_diag_state_set_out;
1917        }
1918        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
1919                        "3128 Set link to diagnostic state:x%x (x%x/x%x)\n",
1920                        diag, phba->sli4_hba.lnk_info.lnk_tp,
1921                        phba->sli4_hba.lnk_info.lnk_no);
1922
1923        link_diag_state = &pmboxq->u.mqe.un.link_diag_state;
1924        bf_set(lpfc_mbx_set_diag_state_diag_bit_valid, &link_diag_state->u.req,
1925               LPFC_DIAG_STATE_DIAG_BIT_VALID_CHANGE);
1926        bf_set(lpfc_mbx_set_diag_state_link_num, &link_diag_state->u.req,
1927               phba->sli4_hba.lnk_info.lnk_no);
1928        bf_set(lpfc_mbx_set_diag_state_link_type, &link_diag_state->u.req,
1929               phba->sli4_hba.lnk_info.lnk_tp);
1930        if (diag)
1931                bf_set(lpfc_mbx_set_diag_state_diag,
1932                       &link_diag_state->u.req, 1);
1933        else
1934                bf_set(lpfc_mbx_set_diag_state_diag,
1935                       &link_diag_state->u.req, 0);
1936
1937        mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO);
1938
1939        if ((mbxstatus == MBX_SUCCESS) && (pmboxq->u.mb.mbxStatus == 0))
1940                rc = 0;
1941        else
1942                rc = -ENODEV;
1943
1944link_diag_state_set_out:
1945        if (pmboxq && (mbxstatus != MBX_TIMEOUT))
1946                mempool_free(pmboxq, phba->mbox_mem_pool);
1947
1948        return rc;
1949}
1950
1951/**
1952 * lpfc_sli4_bsg_set_loopback_mode - set sli4 internal loopback diagnostic
1953 * @phba: Pointer to HBA context object.
1954 * @mode: loopback mode to set
1955 * @link_no: link number for loopback mode to set
1956 *
1957 * This function is responsible for issuing a sli4 mailbox command for setting
1958 * up loopback diagnostic for a link.
1959 */
1960static int
1961lpfc_sli4_bsg_set_loopback_mode(struct lpfc_hba *phba, int mode,
1962                                uint32_t link_no)
1963{
1964        LPFC_MBOXQ_t *pmboxq;
1965        uint32_t req_len, alloc_len;
1966        struct lpfc_mbx_set_link_diag_loopback *link_diag_loopback;
1967        int mbxstatus = MBX_SUCCESS, rc = 0;
1968
1969        pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1970        if (!pmboxq)
1971                return -ENOMEM;
1972        req_len = (sizeof(struct lpfc_mbx_set_link_diag_loopback) -
1973                   sizeof(struct lpfc_sli4_cfg_mhdr));
1974        alloc_len = lpfc_sli4_config(phba, pmboxq, LPFC_MBOX_SUBSYSTEM_FCOE,
1975                                LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_LOOPBACK,
1976                                req_len, LPFC_SLI4_MBX_EMBED);
1977        if (alloc_len != req_len) {
1978                mempool_free(pmboxq, phba->mbox_mem_pool);
1979                return -ENOMEM;
1980        }
1981        link_diag_loopback = &pmboxq->u.mqe.un.link_diag_loopback;
1982        bf_set(lpfc_mbx_set_diag_state_link_num,
1983               &link_diag_loopback->u.req, link_no);
1984
1985        if (phba->sli4_hba.conf_trunk & (1 << link_no)) {
1986                bf_set(lpfc_mbx_set_diag_state_link_type,
1987                       &link_diag_loopback->u.req, LPFC_LNK_FC_TRUNKED);
1988        } else {
1989                bf_set(lpfc_mbx_set_diag_state_link_type,
1990                       &link_diag_loopback->u.req,
1991                       phba->sli4_hba.lnk_info.lnk_tp);
1992        }
1993
1994        bf_set(lpfc_mbx_set_diag_lpbk_type, &link_diag_loopback->u.req,
1995               mode);
1996
1997        mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO);
1998        if ((mbxstatus != MBX_SUCCESS) || (pmboxq->u.mb.mbxStatus)) {
1999                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2000                                "3127 Failed setup loopback mode mailbox "
2001                                "command, rc:x%x, status:x%x\n", mbxstatus,
2002                                pmboxq->u.mb.mbxStatus);
2003                rc = -ENODEV;
2004        }
2005        if (pmboxq && (mbxstatus != MBX_TIMEOUT))
2006                mempool_free(pmboxq, phba->mbox_mem_pool);
2007        return rc;
2008}
2009
2010/**
2011 * lpfc_sli4_diag_fcport_reg_setup - setup port registrations for diagnostic
2012 * @phba: Pointer to HBA context object.
2013 *
2014 * This function set up SLI4 FC port registrations for diagnostic run, which
2015 * includes all the rpis, vfi, and also vpi.
2016 */
2017static int
2018lpfc_sli4_diag_fcport_reg_setup(struct lpfc_hba *phba)
2019{
2020        int rc;
2021
2022        if (phba->pport->fc_flag & FC_VFI_REGISTERED) {
2023                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2024                                "3136 Port still had vfi registered: "
2025                                "mydid:x%x, fcfi:%d, vfi:%d, vpi:%d\n",
2026                                phba->pport->fc_myDID, phba->fcf.fcfi,
2027                                phba->sli4_hba.vfi_ids[phba->pport->vfi],
2028                                phba->vpi_ids[phba->pport->vpi]);
2029                return -EINVAL;
2030        }
2031        rc = lpfc_issue_reg_vfi(phba->pport);
2032        return rc;
2033}
2034
2035/**
2036 * lpfc_sli4_bsg_diag_loopback_mode - process an sli4 bsg vendor command
2037 * @phba: Pointer to HBA context object.
2038 * @job: LPFC_BSG_VENDOR_DIAG_MODE
2039 *
2040 * This function is responsible for placing an sli4 port into diagnostic
2041 * loopback mode in order to perform a diagnostic loopback test.
2042 */
2043static int
2044lpfc_sli4_bsg_diag_loopback_mode(struct lpfc_hba *phba, struct bsg_job *job)
2045{
2046        struct fc_bsg_request *bsg_request = job->request;
2047        struct fc_bsg_reply *bsg_reply = job->reply;
2048        struct diag_mode_set *loopback_mode;
2049        uint32_t link_flags, timeout, link_no;
2050        int i, rc = 0;
2051
2052        /* no data to return just the return code */
2053        bsg_reply->reply_payload_rcv_len = 0;
2054
2055        if (job->request_len < sizeof(struct fc_bsg_request) +
2056            sizeof(struct diag_mode_set)) {
2057                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2058                                "3011 Received DIAG MODE request size:%d "
2059                                "below the minimum size:%d\n",
2060                                job->request_len,
2061                                (int)(sizeof(struct fc_bsg_request) +
2062                                sizeof(struct diag_mode_set)));
2063                rc = -EINVAL;
2064                goto job_done;
2065        }
2066
2067        loopback_mode = (struct diag_mode_set *)
2068                bsg_request->rqst_data.h_vendor.vendor_cmd;
2069        link_flags = loopback_mode->type;
2070        timeout = loopback_mode->timeout * 100;
2071
2072        if (loopback_mode->physical_link == -1)
2073                link_no = phba->sli4_hba.lnk_info.lnk_no;
2074        else
2075                link_no = loopback_mode->physical_link;
2076
2077        if (link_flags == DISABLE_LOOP_BACK) {
2078                rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2079                                        LPFC_DIAG_LOOPBACK_TYPE_DISABLE,
2080                                        link_no);
2081                if (!rc) {
2082                        /* Unset the need disable bit */
2083                        phba->sli4_hba.conf_trunk &= ~((1 << link_no) << 4);
2084                }
2085                goto job_done;
2086        } else {
2087                /* Check if we need to disable the loopback state */
2088                if (phba->sli4_hba.conf_trunk & ((1 << link_no) << 4)) {
2089                        rc = -EPERM;
2090                        goto job_done;
2091                }
2092        }
2093
2094        rc = lpfc_bsg_diag_mode_enter(phba);
2095        if (rc)
2096                goto job_done;
2097
2098        /* indicate we are in loobpack diagnostic mode */
2099        spin_lock_irq(&phba->hbalock);
2100        phba->link_flag |= LS_LOOPBACK_MODE;
2101        spin_unlock_irq(&phba->hbalock);
2102
2103        /* reset port to start frome scratch */
2104        rc = lpfc_selective_reset(phba);
2105        if (rc)
2106                goto job_done;
2107
2108        /* bring the link to diagnostic mode */
2109        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2110                        "3129 Bring link to diagnostic state.\n");
2111
2112        rc = lpfc_sli4_bsg_set_link_diag_state(phba, 1);
2113        if (rc) {
2114                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2115                                "3130 Failed to bring link to diagnostic "
2116                                "state, rc:x%x\n", rc);
2117                goto loopback_mode_exit;
2118        }
2119
2120        /* wait for link down before proceeding */
2121        i = 0;
2122        while (phba->link_state != LPFC_LINK_DOWN) {
2123                if (i++ > timeout) {
2124                        rc = -ETIMEDOUT;
2125                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2126                                        "3131 Timeout waiting for link to "
2127                                        "diagnostic mode, timeout:%d ms\n",
2128                                        timeout * 10);
2129                        goto loopback_mode_exit;
2130                }
2131                msleep(10);
2132        }
2133
2134        /* set up loopback mode */
2135        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2136                        "3132 Set up loopback mode:x%x\n", link_flags);
2137
2138        switch (link_flags) {
2139        case INTERNAL_LOOP_BACK:
2140                if (phba->sli4_hba.conf_trunk & (1 << link_no)) {
2141                        rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2142                                        LPFC_DIAG_LOOPBACK_TYPE_INTERNAL,
2143                                        link_no);
2144                } else {
2145                        /* Trunk is configured, but link is not in this trunk */
2146                        if (phba->sli4_hba.conf_trunk) {
2147                                rc = -ELNRNG;
2148                                goto loopback_mode_exit;
2149                        }
2150
2151                        rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2152                                        LPFC_DIAG_LOOPBACK_TYPE_INTERNAL,
2153                                        link_no);
2154                }
2155
2156                if (!rc) {
2157                        /* Set the need disable bit */
2158                        phba->sli4_hba.conf_trunk |= (1 << link_no) << 4;
2159                }
2160
2161                break;
2162        case EXTERNAL_LOOP_BACK:
2163                if (phba->sli4_hba.conf_trunk & (1 << link_no)) {
2164                        rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2165                                LPFC_DIAG_LOOPBACK_TYPE_EXTERNAL_TRUNKED,
2166                                link_no);
2167                } else {
2168                        /* Trunk is configured, but link is not in this trunk */
2169                        if (phba->sli4_hba.conf_trunk) {
2170                                rc = -ELNRNG;
2171                                goto loopback_mode_exit;
2172                        }
2173
2174                        rc = lpfc_sli4_bsg_set_loopback_mode(phba,
2175                                                LPFC_DIAG_LOOPBACK_TYPE_SERDES,
2176                                                link_no);
2177                }
2178
2179                if (!rc) {
2180                        /* Set the need disable bit */
2181                        phba->sli4_hba.conf_trunk |= (1 << link_no) << 4;
2182                }
2183
2184                break;
2185        default:
2186                rc = -EINVAL;
2187                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
2188                                "3141 Loopback mode:x%x not supported\n",
2189                                link_flags);
2190                goto loopback_mode_exit;
2191        }
2192
2193        if (!rc) {
2194                /* wait for the link attention interrupt */
2195                msleep(100);
2196                i = 0;
2197                while (phba->link_state < LPFC_LINK_UP) {
2198                        if (i++ > timeout) {
2199                                rc = -ETIMEDOUT;
2200                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2201                                        "3137 Timeout waiting for link up "
2202                                        "in loopback mode, timeout:%d ms\n",
2203                                        timeout * 10);
2204                                break;
2205                        }
2206                        msleep(10);
2207                }
2208        }
2209
2210        /* port resource registration setup for loopback diagnostic */
2211        if (!rc) {
2212                /* set up a none zero myDID for loopback test */
2213                phba->pport->fc_myDID = 1;
2214                rc = lpfc_sli4_diag_fcport_reg_setup(phba);
2215        } else
2216                goto loopback_mode_exit;
2217
2218        if (!rc) {
2219                /* wait for the port ready */
2220                msleep(100);
2221                i = 0;
2222                while (phba->link_state != LPFC_HBA_READY) {
2223                        if (i++ > timeout) {
2224                                rc = -ETIMEDOUT;
2225                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2226                                        "3133 Timeout waiting for port "
2227                                        "loopback mode ready, timeout:%d ms\n",
2228                                        timeout * 10);
2229                                break;
2230                        }
2231                        msleep(10);
2232                }
2233        }
2234
2235loopback_mode_exit:
2236        /* clear loopback diagnostic mode */
2237        if (rc) {
2238                spin_lock_irq(&phba->hbalock);
2239                phba->link_flag &= ~LS_LOOPBACK_MODE;
2240                spin_unlock_irq(&phba->hbalock);
2241        }
2242        lpfc_bsg_diag_mode_exit(phba);
2243
2244job_done:
2245        /* make error code available to userspace */
2246        bsg_reply->result = rc;
2247        /* complete the job back to userspace if no error */
2248        if (rc == 0)
2249                bsg_job_done(job, bsg_reply->result,
2250                               bsg_reply->reply_payload_rcv_len);
2251        return rc;
2252}
2253
2254/**
2255 * lpfc_bsg_diag_loopback_mode - bsg vendor command for diag loopback mode
2256 * @job: LPFC_BSG_VENDOR_DIAG_MODE
2257 *
2258 * This function is responsible for responding to check and dispatch bsg diag
2259 * command from the user to proper driver action routines.
2260 */
2261static int
2262lpfc_bsg_diag_loopback_mode(struct bsg_job *job)
2263{
2264        struct Scsi_Host *shost;
2265        struct lpfc_vport *vport;
2266        struct lpfc_hba *phba;
2267        int rc;
2268
2269        shost = fc_bsg_to_shost(job);
2270        if (!shost)
2271                return -ENODEV;
2272        vport = shost_priv(shost);
2273        if (!vport)
2274                return -ENODEV;
2275        phba = vport->phba;
2276        if (!phba)
2277                return -ENODEV;
2278
2279        if (phba->sli_rev < LPFC_SLI_REV4)
2280                rc = lpfc_sli3_bsg_diag_loopback_mode(phba, job);
2281        else if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >=
2282                 LPFC_SLI_INTF_IF_TYPE_2)
2283                rc = lpfc_sli4_bsg_diag_loopback_mode(phba, job);
2284        else
2285                rc = -ENODEV;
2286
2287        return rc;
2288}
2289
2290/**
2291 * lpfc_sli4_bsg_diag_mode_end - sli4 bsg vendor command for ending diag mode
2292 * @job: LPFC_BSG_VENDOR_DIAG_MODE_END
2293 *
2294 * This function is responsible for responding to check and dispatch bsg diag
2295 * command from the user to proper driver action routines.
2296 */
2297static int
2298lpfc_sli4_bsg_diag_mode_end(struct bsg_job *job)
2299{
2300        struct fc_bsg_request *bsg_request = job->request;
2301        struct fc_bsg_reply *bsg_reply = job->reply;
2302        struct Scsi_Host *shost;
2303        struct lpfc_vport *vport;
2304        struct lpfc_hba *phba;
2305        struct diag_mode_set *loopback_mode_end_cmd;
2306        uint32_t timeout;
2307        int rc, i;
2308
2309        shost = fc_bsg_to_shost(job);
2310        if (!shost)
2311                return -ENODEV;
2312        vport = shost_priv(shost);
2313        if (!vport)
2314                return -ENODEV;
2315        phba = vport->phba;
2316        if (!phba)
2317                return -ENODEV;
2318
2319        if (phba->sli_rev < LPFC_SLI_REV4)
2320                return -ENODEV;
2321        if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
2322            LPFC_SLI_INTF_IF_TYPE_2)
2323                return -ENODEV;
2324
2325        /* clear loopback diagnostic mode */
2326        spin_lock_irq(&phba->hbalock);
2327        phba->link_flag &= ~LS_LOOPBACK_MODE;
2328        spin_unlock_irq(&phba->hbalock);
2329        loopback_mode_end_cmd = (struct diag_mode_set *)
2330                        bsg_request->rqst_data.h_vendor.vendor_cmd;
2331        timeout = loopback_mode_end_cmd->timeout * 100;
2332
2333        rc = lpfc_sli4_bsg_set_link_diag_state(phba, 0);
2334        if (rc) {
2335                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2336                                "3139 Failed to bring link to diagnostic "
2337                                "state, rc:x%x\n", rc);
2338                goto loopback_mode_end_exit;
2339        }
2340
2341        /* wait for link down before proceeding */
2342        i = 0;
2343        while (phba->link_state != LPFC_LINK_DOWN) {
2344                if (i++ > timeout) {
2345                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
2346                                        "3140 Timeout waiting for link to "
2347                                        "diagnostic mode_end, timeout:%d ms\n",
2348                                        timeout * 10);
2349                        /* there is nothing much we can do here */
2350                        break;
2351                }
2352                msleep(10);
2353        }
2354
2355        /* reset port resource registrations */
2356        rc = lpfc_selective_reset(phba);
2357        phba->pport->fc_myDID = 0;
2358
2359loopback_mode_end_exit:
2360        /* make return code available to userspace */
2361        bsg_reply->result = rc;
2362        /* complete the job back to userspace if no error */
2363        if (rc == 0)
2364                bsg_job_done(job, bsg_reply->result,
2365                               bsg_reply->reply_payload_rcv_len);
2366        return rc;
2367}
2368
2369/**
2370 * lpfc_sli4_bsg_link_diag_test - sli4 bsg vendor command for diag link test
2371 * @job: LPFC_BSG_VENDOR_DIAG_LINK_TEST
2372 *
2373 * This function is to perform SLI4 diag link test request from the user
2374 * applicaiton.
2375 */
2376static int
2377lpfc_sli4_bsg_link_diag_test(struct bsg_job *job)
2378{
2379        struct fc_bsg_request *bsg_request = job->request;
2380        struct fc_bsg_reply *bsg_reply = job->reply;
2381        struct Scsi_Host *shost;
2382        struct lpfc_vport *vport;
2383        struct lpfc_hba *phba;
2384        LPFC_MBOXQ_t *pmboxq;
2385        struct sli4_link_diag *link_diag_test_cmd;
2386        uint32_t req_len, alloc_len;
2387        struct lpfc_mbx_run_link_diag_test *run_link_diag_test;
2388        union lpfc_sli4_cfg_shdr *shdr;
2389        uint32_t shdr_status, shdr_add_status;
2390        struct diag_status *diag_status_reply;
2391        int mbxstatus, rc = -ENODEV, rc1 = 0;
2392
2393        shost = fc_bsg_to_shost(job);
2394        if (!shost)
2395                goto job_error;
2396
2397        vport = shost_priv(shost);
2398        if (!vport)
2399                goto job_error;
2400
2401        phba = vport->phba;
2402        if (!phba)
2403                goto job_error;
2404
2405
2406        if (phba->sli_rev < LPFC_SLI_REV4)
2407                goto job_error;
2408
2409        if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
2410            LPFC_SLI_INTF_IF_TYPE_2)
2411                goto job_error;
2412
2413        if (job->request_len < sizeof(struct fc_bsg_request) +
2414            sizeof(struct sli4_link_diag)) {
2415                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2416                                "3013 Received LINK DIAG TEST request "
2417                                " size:%d below the minimum size:%d\n",
2418                                job->request_len,
2419                                (int)(sizeof(struct fc_bsg_request) +
2420                                sizeof(struct sli4_link_diag)));
2421                rc = -EINVAL;
2422                goto job_error;
2423        }
2424
2425        rc = lpfc_bsg_diag_mode_enter(phba);
2426        if (rc)
2427                goto job_error;
2428
2429        link_diag_test_cmd = (struct sli4_link_diag *)
2430                         bsg_request->rqst_data.h_vendor.vendor_cmd;
2431
2432        rc = lpfc_sli4_bsg_set_link_diag_state(phba, 1);
2433
2434        if (rc)
2435                goto job_error;
2436
2437        pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
2438        if (!pmboxq) {
2439                rc = -ENOMEM;
2440                goto link_diag_test_exit;
2441        }
2442
2443        req_len = (sizeof(struct lpfc_mbx_set_link_diag_state) -
2444                   sizeof(struct lpfc_sli4_cfg_mhdr));
2445        alloc_len = lpfc_sli4_config(phba, pmboxq, LPFC_MBOX_SUBSYSTEM_FCOE,
2446                                     LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_STATE,
2447                                     req_len, LPFC_SLI4_MBX_EMBED);
2448        if (alloc_len != req_len) {
2449                rc = -ENOMEM;
2450                goto link_diag_test_exit;
2451        }
2452
2453        run_link_diag_test = &pmboxq->u.mqe.un.link_diag_test;
2454        bf_set(lpfc_mbx_run_diag_test_link_num, &run_link_diag_test->u.req,
2455               phba->sli4_hba.lnk_info.lnk_no);
2456        bf_set(lpfc_mbx_run_diag_test_link_type, &run_link_diag_test->u.req,
2457               phba->sli4_hba.lnk_info.lnk_tp);
2458        bf_set(lpfc_mbx_run_diag_test_test_id, &run_link_diag_test->u.req,
2459               link_diag_test_cmd->test_id);
2460        bf_set(lpfc_mbx_run_diag_test_loops, &run_link_diag_test->u.req,
2461               link_diag_test_cmd->loops);
2462        bf_set(lpfc_mbx_run_diag_test_test_ver, &run_link_diag_test->u.req,
2463               link_diag_test_cmd->test_version);
2464        bf_set(lpfc_mbx_run_diag_test_err_act, &run_link_diag_test->u.req,
2465               link_diag_test_cmd->error_action);
2466
2467        mbxstatus = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
2468
2469        shdr = (union lpfc_sli4_cfg_shdr *)
2470                &pmboxq->u.mqe.un.sli4_config.header.cfg_shdr;
2471        shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
2472        shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
2473        if (shdr_status || shdr_add_status || mbxstatus) {
2474                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
2475                                "3010 Run link diag test mailbox failed with "
2476                                "mbx_status x%x status x%x, add_status x%x\n",
2477                                mbxstatus, shdr_status, shdr_add_status);
2478        }
2479
2480        diag_status_reply = (struct diag_status *)
2481                            bsg_reply->reply_data.vendor_reply.vendor_rsp;
2482
2483        if (job->reply_len < sizeof(*bsg_reply) + sizeof(*diag_status_reply)) {
2484                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
2485                                "3012 Received Run link diag test reply "
2486                                "below minimum size (%d): reply_len:%d\n",
2487                                (int)(sizeof(*bsg_reply) +
2488                                sizeof(*diag_status_reply)),
2489                                job->reply_len);
2490                rc = -EINVAL;
2491                goto job_error;
2492        }
2493
2494        diag_status_reply->mbox_status = mbxstatus;
2495        diag_status_reply->shdr_status = shdr_status;
2496        diag_status_reply->shdr_add_status = shdr_add_status;
2497
2498link_diag_test_exit:
2499        rc1 = lpfc_sli4_bsg_set_link_diag_state(phba, 0);
2500
2501        if (pmboxq)
2502                mempool_free(pmboxq, phba->mbox_mem_pool);
2503
2504        lpfc_bsg_diag_mode_exit(phba);
2505
2506job_error:
2507        /* make error code available to userspace */
2508        if (rc1 && !rc)
2509                rc = rc1;
2510        bsg_reply->result = rc;
2511        /* complete the job back to userspace if no error */
2512        if (rc == 0)
2513                bsg_job_done(job, bsg_reply->result,
2514                               bsg_reply->reply_payload_rcv_len);
2515        return rc;
2516}
2517
2518/**
2519 * lpfcdiag_loop_self_reg - obtains a remote port login id
2520 * @phba: Pointer to HBA context object
2521 * @rpi: Pointer to a remote port login id
2522 *
2523 * This function obtains a remote port login id so the diag loopback test
2524 * can send and receive its own unsolicited CT command.
2525 **/
2526static int lpfcdiag_loop_self_reg(struct lpfc_hba *phba, uint16_t *rpi)
2527{
2528        LPFC_MBOXQ_t *mbox;
2529        struct lpfc_dmabuf *dmabuff;
2530        int status;
2531
2532        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
2533        if (!mbox)
2534                return -ENOMEM;
2535
2536        if (phba->sli_rev < LPFC_SLI_REV4)
2537                status = lpfc_reg_rpi(phba, 0, phba->pport->fc_myDID,
2538                                (uint8_t *)&phba->pport->fc_sparam,
2539                                mbox, *rpi);
2540        else {
2541                *rpi = lpfc_sli4_alloc_rpi(phba);
2542                if (*rpi == LPFC_RPI_ALLOC_ERROR) {
2543                        mempool_free(mbox, phba->mbox_mem_pool);
2544                        return -EBUSY;
2545                }
2546                status = lpfc_reg_rpi(phba, phba->pport->vpi,
2547                                phba->pport->fc_myDID,
2548                                (uint8_t *)&phba->pport->fc_sparam,
2549                                mbox, *rpi);
2550        }
2551
2552        if (status) {
2553                mempool_free(mbox, phba->mbox_mem_pool);
2554                if (phba->sli_rev == LPFC_SLI_REV4)
2555                        lpfc_sli4_free_rpi(phba, *rpi);
2556                return -ENOMEM;
2557        }
2558
2559        dmabuff = (struct lpfc_dmabuf *)mbox->ctx_buf;
2560        mbox->ctx_buf = NULL;
2561        mbox->ctx_ndlp = NULL;
2562        status = lpfc_sli_issue_mbox_wait(phba, mbox, LPFC_MBOX_TMO);
2563
2564        if ((status != MBX_SUCCESS) || (mbox->u.mb.mbxStatus)) {
2565                lpfc_mbuf_free(phba, dmabuff->virt, dmabuff->phys);
2566                kfree(dmabuff);
2567                if (status != MBX_TIMEOUT)
2568                        mempool_free(mbox, phba->mbox_mem_pool);
2569                if (phba->sli_rev == LPFC_SLI_REV4)
2570                        lpfc_sli4_free_rpi(phba, *rpi);
2571                return -ENODEV;
2572        }
2573
2574        if (phba->sli_rev < LPFC_SLI_REV4)
2575                *rpi = mbox->u.mb.un.varWords[0];
2576
2577        lpfc_mbuf_free(phba, dmabuff->virt, dmabuff->phys);
2578        kfree(dmabuff);
2579        mempool_free(mbox, phba->mbox_mem_pool);
2580        return 0;
2581}
2582
2583/**
2584 * lpfcdiag_loop_self_unreg - unregs from the rpi
2585 * @phba: Pointer to HBA context object
2586 * @rpi: Remote port login id
2587 *
2588 * This function unregisters the rpi obtained in lpfcdiag_loop_self_reg
2589 **/
2590static int lpfcdiag_loop_self_unreg(struct lpfc_hba *phba, uint16_t rpi)
2591{
2592        LPFC_MBOXQ_t *mbox;
2593        int status;
2594
2595        /* Allocate mboxq structure */
2596        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
2597        if (mbox == NULL)
2598                return -ENOMEM;
2599
2600        if (phba->sli_rev < LPFC_SLI_REV4)
2601                lpfc_unreg_login(phba, 0, rpi, mbox);
2602        else
2603                lpfc_unreg_login(phba, phba->pport->vpi,
2604                                 phba->sli4_hba.rpi_ids[rpi], mbox);
2605
2606        status = lpfc_sli_issue_mbox_wait(phba, mbox, LPFC_MBOX_TMO);
2607
2608        if ((status != MBX_SUCCESS) || (mbox->u.mb.mbxStatus)) {
2609                if (status != MBX_TIMEOUT)
2610                        mempool_free(mbox, phba->mbox_mem_pool);
2611                return -EIO;
2612        }
2613        mempool_free(mbox, phba->mbox_mem_pool);
2614        if (phba->sli_rev == LPFC_SLI_REV4)
2615                lpfc_sli4_free_rpi(phba, rpi);
2616        return 0;
2617}
2618
2619/**
2620 * lpfcdiag_loop_get_xri - obtains the transmit and receive ids
2621 * @phba: Pointer to HBA context object
2622 * @rpi: Remote port login id
2623 * @txxri: Pointer to transmit exchange id
2624 * @rxxri: Pointer to response exchabge id
2625 *
2626 * This function obtains the transmit and receive ids required to send
2627 * an unsolicited ct command with a payload. A special lpfc FsType and CmdRsp
2628 * flags are used to the unsolicted response handler is able to process
2629 * the ct command sent on the same port.
2630 **/
2631static int lpfcdiag_loop_get_xri(struct lpfc_hba *phba, uint16_t rpi,
2632                         uint16_t *txxri, uint16_t * rxxri)
2633{
2634        struct lpfc_bsg_event *evt;
2635        struct lpfc_iocbq *cmdiocbq, *rspiocbq;
2636        IOCB_t *cmd, *rsp;
2637        struct lpfc_dmabuf *dmabuf;
2638        struct ulp_bde64 *bpl = NULL;
2639        struct lpfc_sli_ct_request *ctreq = NULL;
2640        int ret_val = 0;
2641        int time_left;
2642        int iocb_stat = IOCB_SUCCESS;
2643        unsigned long flags;
2644
2645        *txxri = 0;
2646        *rxxri = 0;
2647        evt = lpfc_bsg_event_new(FC_REG_CT_EVENT, current->pid,
2648                                SLI_CT_ELX_LOOPBACK);
2649        if (!evt)
2650                return -ENOMEM;
2651
2652        spin_lock_irqsave(&phba->ct_ev_lock, flags);
2653        list_add(&evt->node, &phba->ct_ev_waiters);
2654        lpfc_bsg_event_ref(evt);
2655        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
2656
2657        cmdiocbq = lpfc_sli_get_iocbq(phba);
2658        rspiocbq = lpfc_sli_get_iocbq(phba);
2659
2660        dmabuf = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
2661        if (dmabuf) {
2662                dmabuf->virt = lpfc_mbuf_alloc(phba, 0, &dmabuf->phys);
2663                if (dmabuf->virt) {
2664                        INIT_LIST_HEAD(&dmabuf->list);
2665                        bpl = (struct ulp_bde64 *) dmabuf->virt;
2666                        memset(bpl, 0, sizeof(*bpl));
2667                        ctreq = (struct lpfc_sli_ct_request *)(bpl + 1);
2668                        bpl->addrHigh =
2669                                le32_to_cpu(putPaddrHigh(dmabuf->phys +
2670                                        sizeof(*bpl)));
2671                        bpl->addrLow =
2672                                le32_to_cpu(putPaddrLow(dmabuf->phys +
2673                                        sizeof(*bpl)));
2674                        bpl->tus.f.bdeFlags = 0;
2675                        bpl->tus.f.bdeSize = ELX_LOOPBACK_HEADER_SZ;
2676                        bpl->tus.w = le32_to_cpu(bpl->tus.w);
2677                }
2678        }
2679
2680        if (cmdiocbq == NULL || rspiocbq == NULL ||
2681            dmabuf == NULL || bpl == NULL || ctreq == NULL ||
2682                dmabuf->virt == NULL) {
2683                ret_val = -ENOMEM;
2684                goto err_get_xri_exit;
2685        }
2686
2687        cmd = &cmdiocbq->iocb;
2688        rsp = &rspiocbq->iocb;
2689
2690        memset(ctreq, 0, ELX_LOOPBACK_HEADER_SZ);
2691
2692        ctreq->RevisionId.bits.Revision = SLI_CT_REVISION;
2693        ctreq->RevisionId.bits.InId = 0;
2694        ctreq->FsType = SLI_CT_ELX_LOOPBACK;
2695        ctreq->FsSubType = 0;
2696        ctreq->CommandResponse.bits.CmdRsp = ELX_LOOPBACK_XRI_SETUP;
2697        ctreq->CommandResponse.bits.Size = 0;
2698
2699
2700        cmd->un.xseq64.bdl.addrHigh = putPaddrHigh(dmabuf->phys);
2701        cmd->un.xseq64.bdl.addrLow = putPaddrLow(dmabuf->phys);
2702        cmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
2703        cmd->un.xseq64.bdl.bdeSize = sizeof(*bpl);
2704
2705        cmd->un.xseq64.w5.hcsw.Fctl = LA;
2706        cmd->un.xseq64.w5.hcsw.Dfctl = 0;
2707        cmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL;
2708        cmd->un.xseq64.w5.hcsw.Type = FC_TYPE_CT;
2709
2710        cmd->ulpCommand = CMD_XMIT_SEQUENCE64_CR;
2711        cmd->ulpBdeCount = 1;
2712        cmd->ulpLe = 1;
2713        cmd->ulpClass = CLASS3;
2714        cmd->ulpContext = rpi;
2715
2716        cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
2717        cmdiocbq->vport = phba->pport;
2718        cmdiocbq->iocb_cmpl = NULL;
2719
2720        iocb_stat = lpfc_sli_issue_iocb_wait(phba, LPFC_ELS_RING, cmdiocbq,
2721                                rspiocbq,
2722                                (phba->fc_ratov * 2)
2723                                + LPFC_DRVR_TIMEOUT);
2724        if ((iocb_stat != IOCB_SUCCESS) || (rsp->ulpStatus != IOSTAT_SUCCESS)) {
2725                ret_val = -EIO;
2726                goto err_get_xri_exit;
2727        }
2728        *txxri =  rsp->ulpContext;
2729
2730        evt->waiting = 1;
2731        evt->wait_time_stamp = jiffies;
2732        time_left = wait_event_interruptible_timeout(
2733                evt->wq, !list_empty(&evt->events_to_see),
2734                msecs_to_jiffies(1000 *
2735                        ((phba->fc_ratov * 2) + LPFC_DRVR_TIMEOUT)));
2736        if (list_empty(&evt->events_to_see))
2737                ret_val = (time_left) ? -EINTR : -ETIMEDOUT;
2738        else {
2739                spin_lock_irqsave(&phba->ct_ev_lock, flags);
2740                list_move(evt->events_to_see.prev, &evt->events_to_get);
2741                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
2742                *rxxri = (list_entry(evt->events_to_get.prev,
2743                                     typeof(struct event_data),
2744                                     node))->immed_dat;
2745        }
2746        evt->waiting = 0;
2747
2748err_get_xri_exit:
2749        spin_lock_irqsave(&phba->ct_ev_lock, flags);
2750        lpfc_bsg_event_unref(evt); /* release ref */
2751        lpfc_bsg_event_unref(evt); /* delete */
2752        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
2753
2754        if (dmabuf) {
2755                if (dmabuf->virt)
2756                        lpfc_mbuf_free(phba, dmabuf->virt, dmabuf->phys);
2757                kfree(dmabuf);
2758        }
2759
2760        if (cmdiocbq && (iocb_stat != IOCB_TIMEDOUT))
2761                lpfc_sli_release_iocbq(phba, cmdiocbq);
2762        if (rspiocbq)
2763                lpfc_sli_release_iocbq(phba, rspiocbq);
2764        return ret_val;
2765}
2766
2767/**
2768 * lpfc_bsg_dma_page_alloc - allocate a bsg mbox page sized dma buffers
2769 * @phba: Pointer to HBA context object
2770 *
2771 * This function allocates BSG_MBOX_SIZE (4KB) page size dma buffer and
2772 * returns the pointer to the buffer.
2773 **/
2774static struct lpfc_dmabuf *
2775lpfc_bsg_dma_page_alloc(struct lpfc_hba *phba)
2776{
2777        struct lpfc_dmabuf *dmabuf;
2778        struct pci_dev *pcidev = phba->pcidev;
2779
2780        /* allocate dma buffer struct */
2781        dmabuf = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
2782        if (!dmabuf)
2783                return NULL;
2784
2785        INIT_LIST_HEAD(&dmabuf->list);
2786
2787        /* now, allocate dma buffer */
2788        dmabuf->virt = dma_alloc_coherent(&pcidev->dev, BSG_MBOX_SIZE,
2789                                          &(dmabuf->phys), GFP_KERNEL);
2790
2791        if (!dmabuf->virt) {
2792                kfree(dmabuf);
2793                return NULL;
2794        }
2795
2796        return dmabuf;
2797}
2798
2799/**
2800 * lpfc_bsg_dma_page_free - free a bsg mbox page sized dma buffer
2801 * @phba: Pointer to HBA context object.
2802 * @dmabuf: Pointer to the bsg mbox page sized dma buffer descriptor.
2803 *
2804 * This routine just simply frees a dma buffer and its associated buffer
2805 * descriptor referred by @dmabuf.
2806 **/
2807static void
2808lpfc_bsg_dma_page_free(struct lpfc_hba *phba, struct lpfc_dmabuf *dmabuf)
2809{
2810        struct pci_dev *pcidev = phba->pcidev;
2811
2812        if (!dmabuf)
2813                return;
2814
2815        if (dmabuf->virt)
2816                dma_free_coherent(&pcidev->dev, BSG_MBOX_SIZE,
2817                                  dmabuf->virt, dmabuf->phys);
2818        kfree(dmabuf);
2819        return;
2820}
2821
2822/**
2823 * lpfc_bsg_dma_page_list_free - free a list of bsg mbox page sized dma buffers
2824 * @phba: Pointer to HBA context object.
2825 * @dmabuf_list: Pointer to a list of bsg mbox page sized dma buffer descs.
2826 *
2827 * This routine just simply frees all dma buffers and their associated buffer
2828 * descriptors referred by @dmabuf_list.
2829 **/
2830static void
2831lpfc_bsg_dma_page_list_free(struct lpfc_hba *phba,
2832                            struct list_head *dmabuf_list)
2833{
2834        struct lpfc_dmabuf *dmabuf, *next_dmabuf;
2835
2836        if (list_empty(dmabuf_list))
2837                return;
2838
2839        list_for_each_entry_safe(dmabuf, next_dmabuf, dmabuf_list, list) {
2840                list_del_init(&dmabuf->list);
2841                lpfc_bsg_dma_page_free(phba, dmabuf);
2842        }
2843        return;
2844}
2845
2846/**
2847 * diag_cmd_data_alloc - fills in a bde struct with dma buffers
2848 * @phba: Pointer to HBA context object
2849 * @bpl: Pointer to 64 bit bde structure
2850 * @size: Number of bytes to process
2851 * @nocopydata: Flag to copy user data into the allocated buffer
2852 *
2853 * This function allocates page size buffers and populates an lpfc_dmabufext.
2854 * If allowed the user data pointed to with indataptr is copied into the kernel
2855 * memory. The chained list of page size buffers is returned.
2856 **/
2857static struct lpfc_dmabufext *
2858diag_cmd_data_alloc(struct lpfc_hba *phba,
2859                   struct ulp_bde64 *bpl, uint32_t size,
2860                   int nocopydata)
2861{
2862        struct lpfc_dmabufext *mlist = NULL;
2863        struct lpfc_dmabufext *dmp;
2864        int cnt, offset = 0, i = 0;
2865        struct pci_dev *pcidev;
2866
2867        pcidev = phba->pcidev;
2868
2869        while (size) {
2870                /* We get chunks of 4K */
2871                if (size > BUF_SZ_4K)
2872                        cnt = BUF_SZ_4K;
2873                else
2874                        cnt = size;
2875
2876                /* allocate struct lpfc_dmabufext buffer header */
2877                dmp = kmalloc(sizeof(struct lpfc_dmabufext), GFP_KERNEL);
2878                if (!dmp)
2879                        goto out;
2880
2881                INIT_LIST_HEAD(&dmp->dma.list);
2882
2883                /* Queue it to a linked list */
2884                if (mlist)
2885                        list_add_tail(&dmp->dma.list, &mlist->dma.list);
2886                else
2887                        mlist = dmp;
2888
2889                /* allocate buffer */
2890                dmp->dma.virt = dma_alloc_coherent(&pcidev->dev,
2891                                                   cnt,
2892                                                   &(dmp->dma.phys),
2893                                                   GFP_KERNEL);
2894
2895                if (!dmp->dma.virt)
2896                        goto out;
2897
2898                dmp->size = cnt;
2899
2900                if (nocopydata) {
2901                        bpl->tus.f.bdeFlags = 0;
2902                } else {
2903                        memset((uint8_t *)dmp->dma.virt, 0, cnt);
2904                        bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
2905                }
2906
2907                /* build buffer ptr list for IOCB */
2908                bpl->addrLow = le32_to_cpu(putPaddrLow(dmp->dma.phys));
2909                bpl->addrHigh = le32_to_cpu(putPaddrHigh(dmp->dma.phys));
2910                bpl->tus.f.bdeSize = (ushort) cnt;
2911                bpl->tus.w = le32_to_cpu(bpl->tus.w);
2912                bpl++;
2913
2914                i++;
2915                offset += cnt;
2916                size -= cnt;
2917        }
2918
2919        if (mlist) {
2920                mlist->flag = i;
2921                return mlist;
2922        }
2923out:
2924        diag_cmd_data_free(phba, mlist);
2925        return NULL;
2926}
2927
2928/**
2929 * lpfcdiag_loop_post_rxbufs - post the receive buffers for an unsol CT cmd
2930 * @phba: Pointer to HBA context object
2931 * @rxxri: Receive exchange id
2932 * @len: Number of data bytes
2933 *
2934 * This function allocates and posts a data buffer of sufficient size to receive
2935 * an unsolicted CT command.
2936 **/
2937static int lpfcdiag_loop_post_rxbufs(struct lpfc_hba *phba, uint16_t rxxri,
2938                             size_t len)
2939{
2940        struct lpfc_sli_ring *pring;
2941        struct lpfc_iocbq *cmdiocbq;
2942        IOCB_t *cmd = NULL;
2943        struct list_head head, *curr, *next;
2944        struct lpfc_dmabuf *rxbmp;
2945        struct lpfc_dmabuf *dmp;
2946        struct lpfc_dmabuf *mp[2] = {NULL, NULL};
2947        struct ulp_bde64 *rxbpl = NULL;
2948        uint32_t num_bde;
2949        struct lpfc_dmabufext *rxbuffer = NULL;
2950        int ret_val = 0;
2951        int iocb_stat;
2952        int i = 0;
2953
2954        pring = lpfc_phba_elsring(phba);
2955
2956        cmdiocbq = lpfc_sli_get_iocbq(phba);
2957        rxbmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
2958        if (rxbmp != NULL) {
2959                rxbmp->virt = lpfc_mbuf_alloc(phba, 0, &rxbmp->phys);
2960                if (rxbmp->virt) {
2961                        INIT_LIST_HEAD(&rxbmp->list);
2962                        rxbpl = (struct ulp_bde64 *) rxbmp->virt;
2963                        rxbuffer = diag_cmd_data_alloc(phba, rxbpl, len, 0);
2964                }
2965        }
2966
2967        if (!cmdiocbq || !rxbmp || !rxbpl || !rxbuffer || !pring) {
2968                ret_val = -ENOMEM;
2969                goto err_post_rxbufs_exit;
2970        }
2971
2972        /* Queue buffers for the receive exchange */
2973        num_bde = (uint32_t)rxbuffer->flag;
2974        dmp = &rxbuffer->dma;
2975
2976        cmd = &cmdiocbq->iocb;
2977        i = 0;
2978
2979        INIT_LIST_HEAD(&head);
2980        list_add_tail(&head, &dmp->list);
2981        list_for_each_safe(curr, next, &head) {
2982                mp[i] = list_entry(curr, struct lpfc_dmabuf, list);
2983                list_del(curr);
2984
2985                if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
2986                        mp[i]->buffer_tag = lpfc_sli_get_buffer_tag(phba);
2987                        cmd->un.quexri64cx.buff.bde.addrHigh =
2988                                putPaddrHigh(mp[i]->phys);
2989                        cmd->un.quexri64cx.buff.bde.addrLow =
2990                                putPaddrLow(mp[i]->phys);
2991                        cmd->un.quexri64cx.buff.bde.tus.f.bdeSize =
2992                                ((struct lpfc_dmabufext *)mp[i])->size;
2993                        cmd->un.quexri64cx.buff.buffer_tag = mp[i]->buffer_tag;
2994                        cmd->ulpCommand = CMD_QUE_XRI64_CX;
2995                        cmd->ulpPU = 0;
2996                        cmd->ulpLe = 1;
2997                        cmd->ulpBdeCount = 1;
2998                        cmd->unsli3.que_xri64cx_ext_words.ebde_count = 0;
2999
3000                } else {
3001                        cmd->un.cont64[i].addrHigh = putPaddrHigh(mp[i]->phys);
3002                        cmd->un.cont64[i].addrLow = putPaddrLow(mp[i]->phys);
3003                        cmd->un.cont64[i].tus.f.bdeSize =
3004                                ((struct lpfc_dmabufext *)mp[i])->size;
3005                        cmd->ulpBdeCount = ++i;
3006
3007                        if ((--num_bde > 0) && (i < 2))
3008                                continue;
3009
3010                        cmd->ulpCommand = CMD_QUE_XRI_BUF64_CX;
3011                        cmd->ulpLe = 1;
3012                }
3013
3014                cmd->ulpClass = CLASS3;
3015                cmd->ulpContext = rxxri;
3016
3017                iocb_stat = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq,
3018                                                0);
3019                if (iocb_stat == IOCB_ERROR) {
3020                        diag_cmd_data_free(phba,
3021                                (struct lpfc_dmabufext *)mp[0]);
3022                        if (mp[1])
3023                                diag_cmd_data_free(phba,
3024                                          (struct lpfc_dmabufext *)mp[1]);
3025                        dmp = list_entry(next, struct lpfc_dmabuf, list);
3026                        ret_val = -EIO;
3027                        goto err_post_rxbufs_exit;
3028                }
3029
3030                lpfc_sli_ringpostbuf_put(phba, pring, mp[0]);
3031                if (mp[1]) {
3032                        lpfc_sli_ringpostbuf_put(phba, pring, mp[1]);
3033                        mp[1] = NULL;
3034                }
3035
3036                /* The iocb was freed by lpfc_sli_issue_iocb */
3037                cmdiocbq = lpfc_sli_get_iocbq(phba);
3038                if (!cmdiocbq) {
3039                        dmp = list_entry(next, struct lpfc_dmabuf, list);
3040                        ret_val = -EIO;
3041                        goto err_post_rxbufs_exit;
3042                }
3043
3044                cmd = &cmdiocbq->iocb;
3045                i = 0;
3046        }
3047        list_del(&head);
3048
3049err_post_rxbufs_exit:
3050
3051        if (rxbmp) {
3052                if (rxbmp->virt)
3053                        lpfc_mbuf_free(phba, rxbmp->virt, rxbmp->phys);
3054                kfree(rxbmp);
3055        }
3056
3057        if (cmdiocbq)
3058                lpfc_sli_release_iocbq(phba, cmdiocbq);
3059        return ret_val;
3060}
3061
3062/**
3063 * lpfc_bsg_diag_loopback_run - run loopback on a port by issue ct cmd to itself
3064 * @job: LPFC_BSG_VENDOR_DIAG_TEST fc_bsg_job
3065 *
3066 * This function receives a user data buffer to be transmitted and received on
3067 * the same port, the link must be up and in loopback mode prior
3068 * to being called.
3069 * 1. A kernel buffer is allocated to copy the user data into.
3070 * 2. The port registers with "itself".
3071 * 3. The transmit and receive exchange ids are obtained.
3072 * 4. The receive exchange id is posted.
3073 * 5. A new els loopback event is created.
3074 * 6. The command and response iocbs are allocated.
3075 * 7. The cmd iocb FsType is set to elx loopback and the CmdRsp to looppback.
3076 *
3077 * This function is meant to be called n times while the port is in loopback
3078 * so it is the apps responsibility to issue a reset to take the port out
3079 * of loopback mode.
3080 **/
3081static int
3082lpfc_bsg_diag_loopback_run(struct bsg_job *job)
3083{
3084        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
3085        struct fc_bsg_reply *bsg_reply = job->reply;
3086        struct lpfc_hba *phba = vport->phba;
3087        struct lpfc_bsg_event *evt;
3088        struct event_data *evdat;
3089        struct lpfc_sli *psli = &phba->sli;
3090        uint32_t size;
3091        uint32_t full_size;
3092        size_t segment_len = 0, segment_offset = 0, current_offset = 0;
3093        uint16_t rpi = 0;
3094        struct lpfc_iocbq *cmdiocbq, *rspiocbq = NULL;
3095        IOCB_t *cmd, *rsp = NULL;
3096        struct lpfc_sli_ct_request *ctreq;
3097        struct lpfc_dmabuf *txbmp;
3098        struct ulp_bde64 *txbpl = NULL;
3099        struct lpfc_dmabufext *txbuffer = NULL;
3100        struct list_head head;
3101        struct lpfc_dmabuf  *curr;
3102        uint16_t txxri = 0, rxxri;
3103        uint32_t num_bde;
3104        uint8_t *ptr = NULL, *rx_databuf = NULL;
3105        int rc = 0;
3106        int time_left;
3107        int iocb_stat = IOCB_SUCCESS;
3108        unsigned long flags;
3109        void *dataout = NULL;
3110        uint32_t total_mem;
3111
3112        /* in case no data is returned return just the return code */
3113        bsg_reply->reply_payload_rcv_len = 0;
3114
3115        if (job->request_len <
3116            sizeof(struct fc_bsg_request) + sizeof(struct diag_mode_test)) {
3117                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3118                                "2739 Received DIAG TEST request below minimum "
3119                                "size\n");
3120                rc = -EINVAL;
3121                goto loopback_test_exit;
3122        }
3123
3124        if (job->request_payload.payload_len !=
3125                job->reply_payload.payload_len) {
3126                rc = -EINVAL;
3127                goto loopback_test_exit;
3128        }
3129
3130        if ((phba->link_state == LPFC_HBA_ERROR) ||
3131            (psli->sli_flag & LPFC_BLOCK_MGMT_IO) ||
3132            (!(psli->sli_flag & LPFC_SLI_ACTIVE))) {
3133                rc = -EACCES;
3134                goto loopback_test_exit;
3135        }
3136
3137        if (!lpfc_is_link_up(phba) || !(phba->link_flag & LS_LOOPBACK_MODE)) {
3138                rc = -EACCES;
3139                goto loopback_test_exit;
3140        }
3141
3142        size = job->request_payload.payload_len;
3143        full_size = size + ELX_LOOPBACK_HEADER_SZ; /* plus the header */
3144
3145        if ((size == 0) || (size > 80 * BUF_SZ_4K)) {
3146                rc = -ERANGE;
3147                goto loopback_test_exit;
3148        }
3149
3150        if (full_size >= BUF_SZ_4K) {
3151                /*
3152                 * Allocate memory for ioctl data. If buffer is bigger than 64k,
3153                 * then we allocate 64k and re-use that buffer over and over to
3154                 * xfer the whole block. This is because Linux kernel has a
3155                 * problem allocating more than 120k of kernel space memory. Saw
3156                 * problem with GET_FCPTARGETMAPPING...
3157                 */
3158                if (size <= (64 * 1024))
3159                        total_mem = full_size;
3160                else
3161                        total_mem = 64 * 1024;
3162        } else
3163                /* Allocate memory for ioctl data */
3164                total_mem = BUF_SZ_4K;
3165
3166        dataout = kmalloc(total_mem, GFP_KERNEL);
3167        if (dataout == NULL) {
3168                rc = -ENOMEM;
3169                goto loopback_test_exit;
3170        }
3171
3172        ptr = dataout;
3173        ptr += ELX_LOOPBACK_HEADER_SZ;
3174        sg_copy_to_buffer(job->request_payload.sg_list,
3175                                job->request_payload.sg_cnt,
3176                                ptr, size);
3177        rc = lpfcdiag_loop_self_reg(phba, &rpi);
3178        if (rc)
3179                goto loopback_test_exit;
3180
3181        if (phba->sli_rev < LPFC_SLI_REV4) {
3182                rc = lpfcdiag_loop_get_xri(phba, rpi, &txxri, &rxxri);
3183                if (rc) {
3184                        lpfcdiag_loop_self_unreg(phba, rpi);
3185                        goto loopback_test_exit;
3186                }
3187
3188                rc = lpfcdiag_loop_post_rxbufs(phba, rxxri, full_size);
3189                if (rc) {
3190                        lpfcdiag_loop_self_unreg(phba, rpi);
3191                        goto loopback_test_exit;
3192                }
3193        }
3194        evt = lpfc_bsg_event_new(FC_REG_CT_EVENT, current->pid,
3195                                SLI_CT_ELX_LOOPBACK);
3196        if (!evt) {
3197                lpfcdiag_loop_self_unreg(phba, rpi);
3198                rc = -ENOMEM;
3199                goto loopback_test_exit;
3200        }
3201
3202        spin_lock_irqsave(&phba->ct_ev_lock, flags);
3203        list_add(&evt->node, &phba->ct_ev_waiters);
3204        lpfc_bsg_event_ref(evt);
3205        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3206
3207        cmdiocbq = lpfc_sli_get_iocbq(phba);
3208        if (phba->sli_rev < LPFC_SLI_REV4)
3209                rspiocbq = lpfc_sli_get_iocbq(phba);
3210        txbmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
3211
3212        if (txbmp) {
3213                txbmp->virt = lpfc_mbuf_alloc(phba, 0, &txbmp->phys);
3214                if (txbmp->virt) {
3215                        INIT_LIST_HEAD(&txbmp->list);
3216                        txbpl = (struct ulp_bde64 *) txbmp->virt;
3217                        txbuffer = diag_cmd_data_alloc(phba,
3218                                                        txbpl, full_size, 0);
3219                }
3220        }
3221
3222        if (!cmdiocbq || !txbmp || !txbpl || !txbuffer || !txbmp->virt) {
3223                rc = -ENOMEM;
3224                goto err_loopback_test_exit;
3225        }
3226        if ((phba->sli_rev < LPFC_SLI_REV4) && !rspiocbq) {
3227                rc = -ENOMEM;
3228                goto err_loopback_test_exit;
3229        }
3230
3231        cmd = &cmdiocbq->iocb;
3232        if (phba->sli_rev < LPFC_SLI_REV4)
3233                rsp = &rspiocbq->iocb;
3234
3235        INIT_LIST_HEAD(&head);
3236        list_add_tail(&head, &txbuffer->dma.list);
3237        list_for_each_entry(curr, &head, list) {
3238                segment_len = ((struct lpfc_dmabufext *)curr)->size;
3239                if (current_offset == 0) {
3240                        ctreq = curr->virt;
3241                        memset(ctreq, 0, ELX_LOOPBACK_HEADER_SZ);
3242                        ctreq->RevisionId.bits.Revision = SLI_CT_REVISION;
3243                        ctreq->RevisionId.bits.InId = 0;
3244                        ctreq->FsType = SLI_CT_ELX_LOOPBACK;
3245                        ctreq->FsSubType = 0;
3246                        ctreq->CommandResponse.bits.CmdRsp = ELX_LOOPBACK_DATA;
3247                        ctreq->CommandResponse.bits.Size   = size;
3248                        segment_offset = ELX_LOOPBACK_HEADER_SZ;
3249                } else
3250                        segment_offset = 0;
3251
3252                BUG_ON(segment_offset >= segment_len);
3253                memcpy(curr->virt + segment_offset,
3254                        ptr + current_offset,
3255                        segment_len - segment_offset);
3256
3257                current_offset += segment_len - segment_offset;
3258                BUG_ON(current_offset > size);
3259        }
3260        list_del(&head);
3261
3262        /* Build the XMIT_SEQUENCE iocb */
3263        num_bde = (uint32_t)txbuffer->flag;
3264
3265        cmd->un.xseq64.bdl.addrHigh = putPaddrHigh(txbmp->phys);
3266        cmd->un.xseq64.bdl.addrLow = putPaddrLow(txbmp->phys);
3267        cmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
3268        cmd->un.xseq64.bdl.bdeSize = (num_bde * sizeof(struct ulp_bde64));
3269
3270        cmd->un.xseq64.w5.hcsw.Fctl = (LS | LA);
3271        cmd->un.xseq64.w5.hcsw.Dfctl = 0;
3272        cmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL;
3273        cmd->un.xseq64.w5.hcsw.Type = FC_TYPE_CT;
3274
3275        cmd->ulpCommand = CMD_XMIT_SEQUENCE64_CX;
3276        cmd->ulpBdeCount = 1;
3277        cmd->ulpLe = 1;
3278        cmd->ulpClass = CLASS3;
3279
3280        if (phba->sli_rev < LPFC_SLI_REV4) {
3281                cmd->ulpContext = txxri;
3282        } else {
3283                cmd->un.xseq64.bdl.ulpIoTag32 = 0;
3284                cmd->un.ulpWord[3] = phba->sli4_hba.rpi_ids[rpi];
3285                cmdiocbq->context3 = txbmp;
3286                cmdiocbq->sli4_xritag = NO_XRI;
3287                cmd->unsli3.rcvsli3.ox_id = 0xffff;
3288        }
3289        cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
3290        cmdiocbq->iocb_flag |= LPFC_IO_LOOPBACK;
3291        cmdiocbq->vport = phba->pport;
3292        cmdiocbq->iocb_cmpl = NULL;
3293        iocb_stat = lpfc_sli_issue_iocb_wait(phba, LPFC_ELS_RING, cmdiocbq,
3294                                             rspiocbq, (phba->fc_ratov * 2) +
3295                                             LPFC_DRVR_TIMEOUT);
3296
3297        if ((iocb_stat != IOCB_SUCCESS) ||
3298            ((phba->sli_rev < LPFC_SLI_REV4) &&
3299             (rsp->ulpStatus != IOSTAT_SUCCESS))) {
3300                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3301                                "3126 Failed loopback test issue iocb: "
3302                                "iocb_stat:x%x\n", iocb_stat);
3303                rc = -EIO;
3304                goto err_loopback_test_exit;
3305        }
3306
3307        evt->waiting = 1;
3308        time_left = wait_event_interruptible_timeout(
3309                evt->wq, !list_empty(&evt->events_to_see),
3310                msecs_to_jiffies(1000 *
3311                        ((phba->fc_ratov * 2) + LPFC_DRVR_TIMEOUT)));
3312        evt->waiting = 0;
3313        if (list_empty(&evt->events_to_see)) {
3314                rc = (time_left) ? -EINTR : -ETIMEDOUT;
3315                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3316                                "3125 Not receiving unsolicited event, "
3317                                "rc:x%x\n", rc);
3318        } else {
3319                spin_lock_irqsave(&phba->ct_ev_lock, flags);
3320                list_move(evt->events_to_see.prev, &evt->events_to_get);
3321                evdat = list_entry(evt->events_to_get.prev,
3322                                   typeof(*evdat), node);
3323                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3324                rx_databuf = evdat->data;
3325                if (evdat->len != full_size) {
3326                        lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3327                                "1603 Loopback test did not receive expected "
3328                                "data length. actual length 0x%x expected "
3329                                "length 0x%x\n",
3330                                evdat->len, full_size);
3331                        rc = -EIO;
3332                } else if (rx_databuf == NULL)
3333                        rc = -EIO;
3334                else {
3335                        rc = IOCB_SUCCESS;
3336                        /* skip over elx loopback header */
3337                        rx_databuf += ELX_LOOPBACK_HEADER_SZ;
3338                        bsg_reply->reply_payload_rcv_len =
3339                                sg_copy_from_buffer(job->reply_payload.sg_list,
3340                                                    job->reply_payload.sg_cnt,
3341                                                    rx_databuf, size);
3342                        bsg_reply->reply_payload_rcv_len = size;
3343                }
3344        }
3345
3346err_loopback_test_exit:
3347        lpfcdiag_loop_self_unreg(phba, rpi);
3348
3349        spin_lock_irqsave(&phba->ct_ev_lock, flags);
3350        lpfc_bsg_event_unref(evt); /* release ref */
3351        lpfc_bsg_event_unref(evt); /* delete */
3352        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3353
3354        if ((cmdiocbq != NULL) && (iocb_stat != IOCB_TIMEDOUT))
3355                lpfc_sli_release_iocbq(phba, cmdiocbq);
3356
3357        if (rspiocbq != NULL)
3358                lpfc_sli_release_iocbq(phba, rspiocbq);
3359
3360        if (txbmp != NULL) {
3361                if (txbpl != NULL) {
3362                        if (txbuffer != NULL)
3363                                diag_cmd_data_free(phba, txbuffer);
3364                        lpfc_mbuf_free(phba, txbmp->virt, txbmp->phys);
3365                }
3366                kfree(txbmp);
3367        }
3368
3369loopback_test_exit:
3370        kfree(dataout);
3371        /* make error code available to userspace */
3372        bsg_reply->result = rc;
3373        job->dd_data = NULL;
3374        /* complete the job back to userspace if no error */
3375        if (rc == IOCB_SUCCESS)
3376                bsg_job_done(job, bsg_reply->result,
3377                               bsg_reply->reply_payload_rcv_len);
3378        return rc;
3379}
3380
3381/**
3382 * lpfc_bsg_get_dfc_rev - process a GET_DFC_REV bsg vendor command
3383 * @job: GET_DFC_REV fc_bsg_job
3384 **/
3385static int
3386lpfc_bsg_get_dfc_rev(struct bsg_job *job)
3387{
3388        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
3389        struct fc_bsg_reply *bsg_reply = job->reply;
3390        struct lpfc_hba *phba = vport->phba;
3391        struct get_mgmt_rev_reply *event_reply;
3392        int rc = 0;
3393
3394        if (job->request_len <
3395            sizeof(struct fc_bsg_request) + sizeof(struct get_mgmt_rev)) {
3396                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3397                                "2740 Received GET_DFC_REV request below "
3398                                "minimum size\n");
3399                rc = -EINVAL;
3400                goto job_error;
3401        }
3402
3403        event_reply = (struct get_mgmt_rev_reply *)
3404                bsg_reply->reply_data.vendor_reply.vendor_rsp;
3405
3406        if (job->reply_len < sizeof(*bsg_reply) + sizeof(*event_reply)) {
3407                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3408                                "2741 Received GET_DFC_REV reply below "
3409                                "minimum size\n");
3410                rc = -EINVAL;
3411                goto job_error;
3412        }
3413
3414        event_reply->info.a_Major = MANAGEMENT_MAJOR_REV;
3415        event_reply->info.a_Minor = MANAGEMENT_MINOR_REV;
3416job_error:
3417        bsg_reply->result = rc;
3418        if (rc == 0)
3419                bsg_job_done(job, bsg_reply->result,
3420                               bsg_reply->reply_payload_rcv_len);
3421        return rc;
3422}
3423
3424/**
3425 * lpfc_bsg_issue_mbox_cmpl - lpfc_bsg_issue_mbox mbox completion handler
3426 * @phba: Pointer to HBA context object.
3427 * @pmboxq: Pointer to mailbox command.
3428 *
3429 * This is completion handler function for mailbox commands issued from
3430 * lpfc_bsg_issue_mbox function. This function is called by the
3431 * mailbox event handler function with no lock held. This function
3432 * will wake up thread waiting on the wait queue pointed by context1
3433 * of the mailbox.
3434 **/
3435static void
3436lpfc_bsg_issue_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
3437{
3438        struct bsg_job_data *dd_data;
3439        struct fc_bsg_reply *bsg_reply;
3440        struct bsg_job *job;
3441        uint32_t size;
3442        unsigned long flags;
3443        uint8_t *pmb, *pmb_buf;
3444
3445        dd_data = pmboxq->ctx_ndlp;
3446
3447        /*
3448         * The outgoing buffer is readily referred from the dma buffer,
3449         * just need to get header part from mailboxq structure.
3450         */
3451        pmb = (uint8_t *)&pmboxq->u.mb;
3452        pmb_buf = (uint8_t *)dd_data->context_un.mbox.mb;
3453        memcpy(pmb_buf, pmb, sizeof(MAILBOX_t));
3454
3455        /* Determine if job has been aborted */
3456
3457        spin_lock_irqsave(&phba->ct_ev_lock, flags);
3458        job = dd_data->set_job;
3459        if (job) {
3460                /* Prevent timeout handling from trying to abort job  */
3461                job->dd_data = NULL;
3462        }
3463        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3464
3465        /* Copy the mailbox data to the job if it is still active */
3466
3467        if (job) {
3468                bsg_reply = job->reply;
3469                size = job->reply_payload.payload_len;
3470                bsg_reply->reply_payload_rcv_len =
3471                        sg_copy_from_buffer(job->reply_payload.sg_list,
3472                                            job->reply_payload.sg_cnt,
3473                                            pmb_buf, size);
3474        }
3475
3476        dd_data->set_job = NULL;
3477        mempool_free(dd_data->context_un.mbox.pmboxq, phba->mbox_mem_pool);
3478        lpfc_bsg_dma_page_free(phba, dd_data->context_un.mbox.dmabuffers);
3479        kfree(dd_data);
3480
3481        /* Complete the job if the job is still active */
3482
3483        if (job) {
3484                bsg_reply->result = 0;
3485                bsg_job_done(job, bsg_reply->result,
3486                               bsg_reply->reply_payload_rcv_len);
3487        }
3488        return;
3489}
3490
3491/**
3492 * lpfc_bsg_check_cmd_access - test for a supported mailbox command
3493 * @phba: Pointer to HBA context object.
3494 * @mb: Pointer to a mailbox object.
3495 * @vport: Pointer to a vport object.
3496 *
3497 * Some commands require the port to be offline, some may not be called from
3498 * the application.
3499 **/
3500static int lpfc_bsg_check_cmd_access(struct lpfc_hba *phba,
3501        MAILBOX_t *mb, struct lpfc_vport *vport)
3502{
3503        /* return negative error values for bsg job */
3504        switch (mb->mbxCommand) {
3505        /* Offline only */
3506        case MBX_INIT_LINK:
3507        case MBX_DOWN_LINK:
3508        case MBX_CONFIG_LINK:
3509        case MBX_CONFIG_RING:
3510        case MBX_RESET_RING:
3511        case MBX_UNREG_LOGIN:
3512        case MBX_CLEAR_LA:
3513        case MBX_DUMP_CONTEXT:
3514        case MBX_RUN_DIAGS:
3515        case MBX_RESTART:
3516        case MBX_SET_MASK:
3517                if (!(vport->fc_flag & FC_OFFLINE_MODE)) {
3518                        lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3519                                "2743 Command 0x%x is illegal in on-line "
3520                                "state\n",
3521                                mb->mbxCommand);
3522                        return -EPERM;
3523                }
3524                break;
3525        case MBX_WRITE_NV:
3526        case MBX_WRITE_VPARMS:
3527        case MBX_LOAD_SM:
3528        case MBX_READ_NV:
3529        case MBX_READ_CONFIG:
3530        case MBX_READ_RCONFIG:
3531        case MBX_READ_STATUS:
3532        case MBX_READ_XRI:
3533        case MBX_READ_REV:
3534        case MBX_READ_LNK_STAT:
3535        case MBX_DUMP_MEMORY:
3536        case MBX_DOWN_LOAD:
3537        case MBX_UPDATE_CFG:
3538        case MBX_KILL_BOARD:
3539        case MBX_READ_TOPOLOGY:
3540        case MBX_LOAD_AREA:
3541        case MBX_LOAD_EXP_ROM:
3542        case MBX_BEACON:
3543        case MBX_DEL_LD_ENTRY:
3544        case MBX_SET_DEBUG:
3545        case MBX_WRITE_WWN:
3546        case MBX_SLI4_CONFIG:
3547        case MBX_READ_EVENT_LOG:
3548        case MBX_READ_EVENT_LOG_STATUS:
3549        case MBX_WRITE_EVENT_LOG:
3550        case MBX_PORT_CAPABILITIES:
3551        case MBX_PORT_IOV_CONTROL:
3552        case MBX_RUN_BIU_DIAG64:
3553                break;
3554        case MBX_SET_VARIABLE:
3555                lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
3556                        "1226 mbox: set_variable 0x%x, 0x%x\n",
3557                        mb->un.varWords[0],
3558                        mb->un.varWords[1]);
3559                if ((mb->un.varWords[0] == SETVAR_MLOMNT)
3560                        && (mb->un.varWords[1] == 1)) {
3561                        phba->wait_4_mlo_maint_flg = 1;
3562                } else if (mb->un.varWords[0] == SETVAR_MLORST) {
3563                        spin_lock_irq(&phba->hbalock);
3564                        phba->link_flag &= ~LS_LOOPBACK_MODE;
3565                        spin_unlock_irq(&phba->hbalock);
3566                        phba->fc_topology = LPFC_TOPOLOGY_PT_PT;
3567                }
3568                break;
3569        case MBX_READ_SPARM64:
3570        case MBX_REG_LOGIN:
3571        case MBX_REG_LOGIN64:
3572        case MBX_CONFIG_PORT:
3573        case MBX_RUN_BIU_DIAG:
3574        default:
3575                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
3576                        "2742 Unknown Command 0x%x\n",
3577                        mb->mbxCommand);
3578                return -EPERM;
3579        }
3580
3581        return 0; /* ok */
3582}
3583
3584/**
3585 * lpfc_bsg_mbox_ext_session_reset - clean up context of multi-buffer mbox session
3586 * @phba: Pointer to HBA context object.
3587 *
3588 * This is routine clean up and reset BSG handling of multi-buffer mbox
3589 * command session.
3590 **/
3591static void
3592lpfc_bsg_mbox_ext_session_reset(struct lpfc_hba *phba)
3593{
3594        if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_IDLE)
3595                return;
3596
3597        /* free all memory, including dma buffers */
3598        lpfc_bsg_dma_page_list_free(phba,
3599                                    &phba->mbox_ext_buf_ctx.ext_dmabuf_list);
3600        lpfc_bsg_dma_page_free(phba, phba->mbox_ext_buf_ctx.mbx_dmabuf);
3601        /* multi-buffer write mailbox command pass-through complete */
3602        memset((char *)&phba->mbox_ext_buf_ctx, 0,
3603               sizeof(struct lpfc_mbox_ext_buf_ctx));
3604        INIT_LIST_HEAD(&phba->mbox_ext_buf_ctx.ext_dmabuf_list);
3605
3606        return;
3607}
3608
3609/**
3610 * lpfc_bsg_issue_mbox_ext_handle_job - job handler for multi-buffer mbox cmpl
3611 * @phba: Pointer to HBA context object.
3612 * @pmboxq: Pointer to mailbox command.
3613 *
3614 * This is routine handles BSG job for mailbox commands completions with
3615 * multiple external buffers.
3616 **/
3617static struct bsg_job *
3618lpfc_bsg_issue_mbox_ext_handle_job(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
3619{
3620        struct bsg_job_data *dd_data;
3621        struct bsg_job *job;
3622        struct fc_bsg_reply *bsg_reply;
3623        uint8_t *pmb, *pmb_buf;
3624        unsigned long flags;
3625        uint32_t size;
3626        int rc = 0;
3627        struct lpfc_dmabuf *dmabuf;
3628        struct lpfc_sli_config_mbox *sli_cfg_mbx;
3629        uint8_t *pmbx;
3630
3631        dd_data = pmboxq->ctx_buf;
3632
3633        /* Determine if job has been aborted */
3634        spin_lock_irqsave(&phba->ct_ev_lock, flags);
3635        job = dd_data->set_job;
3636        if (job) {
3637                bsg_reply = job->reply;
3638                /* Prevent timeout handling from trying to abort job  */
3639                job->dd_data = NULL;
3640        }
3641        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
3642
3643        /*
3644         * The outgoing buffer is readily referred from the dma buffer,
3645         * just need to get header part from mailboxq structure.
3646         */
3647
3648        pmb = (uint8_t *)&pmboxq->u.mb;
3649        pmb_buf = (uint8_t *)dd_data->context_un.mbox.mb;
3650        /* Copy the byte swapped response mailbox back to the user */
3651        memcpy(pmb_buf, pmb, sizeof(MAILBOX_t));
3652        /* if there is any non-embedded extended data copy that too */
3653        dmabuf = phba->mbox_ext_buf_ctx.mbx_dmabuf;
3654        sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt;
3655        if (!bsg_bf_get(lpfc_mbox_hdr_emb,
3656            &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr)) {
3657                pmbx = (uint8_t *)dmabuf->virt;
3658                /* byte swap the extended data following the mailbox command */
3659                lpfc_sli_pcimem_bcopy(&pmbx[sizeof(MAILBOX_t)],
3660                        &pmbx[sizeof(MAILBOX_t)],
3661                        sli_cfg_mbx->un.sli_config_emb0_subsys.mse[0].buf_len);
3662        }
3663
3664        /* Complete the job if the job is still active */
3665
3666        if (job) {
3667                size = job->reply_payload.payload_len;
3668                bsg_reply->reply_payload_rcv_len =
3669                        sg_copy_from_buffer(job->reply_payload.sg_list,
3670                                            job->reply_payload.sg_cnt,
3671                                            pmb_buf, size);
3672
3673                /* result for successful */
3674                bsg_reply->result = 0;
3675
3676                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3677                                "2937 SLI_CONFIG ext-buffer mailbox command "
3678                                "(x%x/x%x) complete bsg job done, bsize:%d\n",
3679                                phba->mbox_ext_buf_ctx.nembType,
3680                                phba->mbox_ext_buf_ctx.mboxType, size);
3681                lpfc_idiag_mbxacc_dump_bsg_mbox(phba,
3682                                        phba->mbox_ext_buf_ctx.nembType,
3683                                        phba->mbox_ext_buf_ctx.mboxType,
3684                                        dma_ebuf, sta_pos_addr,
3685                                        phba->mbox_ext_buf_ctx.mbx_dmabuf, 0);
3686        } else {
3687                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3688                                "2938 SLI_CONFIG ext-buffer mailbox "
3689                                "command (x%x/x%x) failure, rc:x%x\n",
3690                                phba->mbox_ext_buf_ctx.nembType,
3691                                phba->mbox_ext_buf_ctx.mboxType, rc);
3692        }
3693
3694
3695        /* state change */
3696        phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_DONE;
3697        kfree(dd_data);
3698        return job;
3699}
3700
3701/**
3702 * lpfc_bsg_issue_read_mbox_ext_cmpl - compl handler for multi-buffer read mbox
3703 * @phba: Pointer to HBA context object.
3704 * @pmboxq: Pointer to mailbox command.
3705 *
3706 * This is completion handler function for mailbox read commands with multiple
3707 * external buffers.
3708 **/
3709static void
3710lpfc_bsg_issue_read_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
3711{
3712        struct bsg_job *job;
3713        struct fc_bsg_reply *bsg_reply;
3714
3715        job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq);
3716
3717        /* handle the BSG job with mailbox command */
3718        if (!job)
3719                pmboxq->u.mb.mbxStatus = MBXERR_ERROR;
3720
3721        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3722                        "2939 SLI_CONFIG ext-buffer rd mailbox command "
3723                        "complete, ctxState:x%x, mbxStatus:x%x\n",
3724                        phba->mbox_ext_buf_ctx.state, pmboxq->u.mb.mbxStatus);
3725
3726        if (pmboxq->u.mb.mbxStatus || phba->mbox_ext_buf_ctx.numBuf == 1)
3727                lpfc_bsg_mbox_ext_session_reset(phba);
3728
3729        /* free base driver mailbox structure memory */
3730        mempool_free(pmboxq, phba->mbox_mem_pool);
3731
3732        /* if the job is still active, call job done */
3733        if (job) {
3734                bsg_reply = job->reply;
3735                bsg_job_done(job, bsg_reply->result,
3736                               bsg_reply->reply_payload_rcv_len);
3737        }
3738        return;
3739}
3740
3741/**
3742 * lpfc_bsg_issue_write_mbox_ext_cmpl - cmpl handler for multi-buffer write mbox
3743 * @phba: Pointer to HBA context object.
3744 * @pmboxq: Pointer to mailbox command.
3745 *
3746 * This is completion handler function for mailbox write commands with multiple
3747 * external buffers.
3748 **/
3749static void
3750lpfc_bsg_issue_write_mbox_ext_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
3751{
3752        struct bsg_job *job;
3753        struct fc_bsg_reply *bsg_reply;
3754
3755        job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq);
3756
3757        /* handle the BSG job with the mailbox command */
3758        if (!job)
3759                pmboxq->u.mb.mbxStatus = MBXERR_ERROR;
3760
3761        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3762                        "2940 SLI_CONFIG ext-buffer wr mailbox command "
3763                        "complete, ctxState:x%x, mbxStatus:x%x\n",
3764                        phba->mbox_ext_buf_ctx.state, pmboxq->u.mb.mbxStatus);
3765
3766        /* free all memory, including dma buffers */
3767        mempool_free(pmboxq, phba->mbox_mem_pool);
3768        lpfc_bsg_mbox_ext_session_reset(phba);
3769
3770        /* if the job is still active, call job done */
3771        if (job) {
3772                bsg_reply = job->reply;
3773                bsg_job_done(job, bsg_reply->result,
3774                               bsg_reply->reply_payload_rcv_len);
3775        }
3776
3777        return;
3778}
3779
3780static void
3781lpfc_bsg_sli_cfg_dma_desc_setup(struct lpfc_hba *phba, enum nemb_type nemb_tp,
3782                                uint32_t index, struct lpfc_dmabuf *mbx_dmabuf,
3783                                struct lpfc_dmabuf *ext_dmabuf)
3784{
3785        struct lpfc_sli_config_mbox *sli_cfg_mbx;
3786
3787        /* pointer to the start of mailbox command */
3788        sli_cfg_mbx = (struct lpfc_sli_config_mbox *)mbx_dmabuf->virt;
3789
3790        if (nemb_tp == nemb_mse) {
3791                if (index == 0) {
3792                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3793                                mse[index].pa_hi =
3794                                putPaddrHigh(mbx_dmabuf->phys +
3795                                             sizeof(MAILBOX_t));
3796                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3797                                mse[index].pa_lo =
3798                                putPaddrLow(mbx_dmabuf->phys +
3799                                            sizeof(MAILBOX_t));
3800                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3801                                        "2943 SLI_CONFIG(mse)[%d], "
3802                                        "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3803                                        index,
3804                                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3805                                        mse[index].buf_len,
3806                                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3807                                        mse[index].pa_hi,
3808                                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3809                                        mse[index].pa_lo);
3810                } else {
3811                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3812                                mse[index].pa_hi =
3813                                putPaddrHigh(ext_dmabuf->phys);
3814                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3815                                mse[index].pa_lo =
3816                                putPaddrLow(ext_dmabuf->phys);
3817                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3818                                        "2944 SLI_CONFIG(mse)[%d], "
3819                                        "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3820                                        index,
3821                                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3822                                        mse[index].buf_len,
3823                                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3824                                        mse[index].pa_hi,
3825                                        sli_cfg_mbx->un.sli_config_emb0_subsys.
3826                                        mse[index].pa_lo);
3827                }
3828        } else {
3829                if (index == 0) {
3830                        sli_cfg_mbx->un.sli_config_emb1_subsys.
3831                                hbd[index].pa_hi =
3832                                putPaddrHigh(mbx_dmabuf->phys +
3833                                             sizeof(MAILBOX_t));
3834                        sli_cfg_mbx->un.sli_config_emb1_subsys.
3835                                hbd[index].pa_lo =
3836                                putPaddrLow(mbx_dmabuf->phys +
3837                                            sizeof(MAILBOX_t));
3838                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3839                                        "3007 SLI_CONFIG(hbd)[%d], "
3840                                        "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3841                                index,
3842                                bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
3843                                &sli_cfg_mbx->un.
3844                                sli_config_emb1_subsys.hbd[index]),
3845                                sli_cfg_mbx->un.sli_config_emb1_subsys.
3846                                hbd[index].pa_hi,
3847                                sli_cfg_mbx->un.sli_config_emb1_subsys.
3848                                hbd[index].pa_lo);
3849
3850                } else {
3851                        sli_cfg_mbx->un.sli_config_emb1_subsys.
3852                                hbd[index].pa_hi =
3853                                putPaddrHigh(ext_dmabuf->phys);
3854                        sli_cfg_mbx->un.sli_config_emb1_subsys.
3855                                hbd[index].pa_lo =
3856                                putPaddrLow(ext_dmabuf->phys);
3857                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3858                                        "3008 SLI_CONFIG(hbd)[%d], "
3859                                        "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3860                                index,
3861                                bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
3862                                &sli_cfg_mbx->un.
3863                                sli_config_emb1_subsys.hbd[index]),
3864                                sli_cfg_mbx->un.sli_config_emb1_subsys.
3865                                hbd[index].pa_hi,
3866                                sli_cfg_mbx->un.sli_config_emb1_subsys.
3867                                hbd[index].pa_lo);
3868                }
3869        }
3870        return;
3871}
3872
3873/**
3874 * lpfc_bsg_sli_cfg_read_cmd_ext - sli_config non-embedded mailbox cmd read
3875 * @phba: Pointer to HBA context object.
3876 * @job: Pointer to the job object.
3877 * @nemb_tp: Enumerate of non-embedded mailbox command type.
3878 * @dmabuf: Pointer to a DMA buffer descriptor.
3879 *
3880 * This routine performs SLI_CONFIG (0x9B) read mailbox command operation with
3881 * non-embedded external buffers.
3882 **/
3883static int
3884lpfc_bsg_sli_cfg_read_cmd_ext(struct lpfc_hba *phba, struct bsg_job *job,
3885                              enum nemb_type nemb_tp,
3886                              struct lpfc_dmabuf *dmabuf)
3887{
3888        struct fc_bsg_request *bsg_request = job->request;
3889        struct lpfc_sli_config_mbox *sli_cfg_mbx;
3890        struct dfc_mbox_req *mbox_req;
3891        struct lpfc_dmabuf *curr_dmabuf, *next_dmabuf;
3892        uint32_t ext_buf_cnt, ext_buf_index;
3893        struct lpfc_dmabuf *ext_dmabuf = NULL;
3894        struct bsg_job_data *dd_data = NULL;
3895        LPFC_MBOXQ_t *pmboxq = NULL;
3896        MAILBOX_t *pmb;
3897        uint8_t *pmbx;
3898        int rc, i;
3899
3900        mbox_req =
3901           (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd;
3902
3903        /* pointer to the start of mailbox command */
3904        sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt;
3905
3906        if (nemb_tp == nemb_mse) {
3907                ext_buf_cnt = bsg_bf_get(lpfc_mbox_hdr_mse_cnt,
3908                        &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr);
3909                if (ext_buf_cnt > LPFC_MBX_SLI_CONFIG_MAX_MSE) {
3910                        lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3911                                        "2945 Handled SLI_CONFIG(mse) rd, "
3912                                        "ext_buf_cnt(%d) out of range(%d)\n",
3913                                        ext_buf_cnt,
3914                                        LPFC_MBX_SLI_CONFIG_MAX_MSE);
3915                        rc = -ERANGE;
3916                        goto job_error;
3917                }
3918                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3919                                "2941 Handled SLI_CONFIG(mse) rd, "
3920                                "ext_buf_cnt:%d\n", ext_buf_cnt);
3921        } else {
3922                /* sanity check on interface type for support */
3923                if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
3924                    LPFC_SLI_INTF_IF_TYPE_2) {
3925                        rc = -ENODEV;
3926                        goto job_error;
3927                }
3928                /* nemb_tp == nemb_hbd */
3929                ext_buf_cnt = sli_cfg_mbx->un.sli_config_emb1_subsys.hbd_count;
3930                if (ext_buf_cnt > LPFC_MBX_SLI_CONFIG_MAX_HBD) {
3931                        lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
3932                                        "2946 Handled SLI_CONFIG(hbd) rd, "
3933                                        "ext_buf_cnt(%d) out of range(%d)\n",
3934                                        ext_buf_cnt,
3935                                        LPFC_MBX_SLI_CONFIG_MAX_HBD);
3936                        rc = -ERANGE;
3937                        goto job_error;
3938                }
3939                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3940                                "2942 Handled SLI_CONFIG(hbd) rd, "
3941                                "ext_buf_cnt:%d\n", ext_buf_cnt);
3942        }
3943
3944        /* before dma descriptor setup */
3945        lpfc_idiag_mbxacc_dump_bsg_mbox(phba, nemb_tp, mbox_rd, dma_mbox,
3946                                        sta_pre_addr, dmabuf, ext_buf_cnt);
3947
3948        /* reject non-embedded mailbox command with none external buffer */
3949        if (ext_buf_cnt == 0) {
3950                rc = -EPERM;
3951                goto job_error;
3952        } else if (ext_buf_cnt > 1) {
3953                /* additional external read buffers */
3954                for (i = 1; i < ext_buf_cnt; i++) {
3955                        ext_dmabuf = lpfc_bsg_dma_page_alloc(phba);
3956                        if (!ext_dmabuf) {
3957                                rc = -ENOMEM;
3958                                goto job_error;
3959                        }
3960                        list_add_tail(&ext_dmabuf->list,
3961                                      &phba->mbox_ext_buf_ctx.ext_dmabuf_list);
3962                }
3963        }
3964
3965        /* bsg tracking structure */
3966        dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
3967        if (!dd_data) {
3968                rc = -ENOMEM;
3969                goto job_error;
3970        }
3971
3972        /* mailbox command structure for base driver */
3973        pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
3974        if (!pmboxq) {
3975                rc = -ENOMEM;
3976                goto job_error;
3977        }
3978        memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
3979
3980        /* for the first external buffer */
3981        lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp, 0, dmabuf, dmabuf);
3982
3983        /* for the rest of external buffer descriptors if any */
3984        if (ext_buf_cnt > 1) {
3985                ext_buf_index = 1;
3986                list_for_each_entry_safe(curr_dmabuf, next_dmabuf,
3987                                &phba->mbox_ext_buf_ctx.ext_dmabuf_list, list) {
3988                        lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp,
3989                                                ext_buf_index, dmabuf,
3990                                                curr_dmabuf);
3991                        ext_buf_index++;
3992                }
3993        }
3994
3995        /* after dma descriptor setup */
3996        lpfc_idiag_mbxacc_dump_bsg_mbox(phba, nemb_tp, mbox_rd, dma_mbox,
3997                                        sta_pos_addr, dmabuf, ext_buf_cnt);
3998
3999        /* construct base driver mbox command */
4000        pmb = &pmboxq->u.mb;
4001        pmbx = (uint8_t *)dmabuf->virt;
4002        memcpy(pmb, pmbx, sizeof(*pmb));
4003        pmb->mbxOwner = OWN_HOST;
4004        pmboxq->vport = phba->pport;
4005
4006        /* multi-buffer handling context */
4007        phba->mbox_ext_buf_ctx.nembType = nemb_tp;
4008        phba->mbox_ext_buf_ctx.mboxType = mbox_rd;
4009        phba->mbox_ext_buf_ctx.numBuf = ext_buf_cnt;
4010        phba->mbox_ext_buf_ctx.mbxTag = mbox_req->extMboxTag;
4011        phba->mbox_ext_buf_ctx.seqNum = mbox_req->extSeqNum;
4012        phba->mbox_ext_buf_ctx.mbx_dmabuf = dmabuf;
4013
4014        /* callback for multi-buffer read mailbox command */
4015        pmboxq->mbox_cmpl = lpfc_bsg_issue_read_mbox_ext_cmpl;
4016
4017        /* context fields to callback function */
4018        pmboxq->ctx_buf = dd_data;
4019        dd_data->type = TYPE_MBOX;
4020        dd_data->set_job = job;
4021        dd_data->context_un.mbox.pmboxq = pmboxq;
4022        dd_data->context_un.mbox.mb = (MAILBOX_t *)pmbx;
4023        job->dd_data = dd_data;
4024
4025        /* state change */
4026        phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_PORT;
4027
4028        /*
4029         * Non-embedded mailbox subcommand data gets byte swapped here because
4030         * the lower level driver code only does the first 64 mailbox words.
4031         */
4032        if ((!bsg_bf_get(lpfc_mbox_hdr_emb,
4033            &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr)) &&
4034                (nemb_tp == nemb_mse))
4035                lpfc_sli_pcimem_bcopy(&pmbx[sizeof(MAILBOX_t)],
4036                        &pmbx[sizeof(MAILBOX_t)],
4037                                sli_cfg_mbx->un.sli_config_emb0_subsys.
4038                                        mse[0].buf_len);
4039
4040        rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
4041        if ((rc == MBX_SUCCESS) || (rc == MBX_BUSY)) {
4042                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4043                                "2947 Issued SLI_CONFIG ext-buffer "
4044                                "mailbox command, rc:x%x\n", rc);
4045                return SLI_CONFIG_HANDLED;
4046        }
4047        lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4048                        "2948 Failed to issue SLI_CONFIG ext-buffer "
4049                        "mailbox command, rc:x%x\n", rc);
4050        rc = -EPIPE;
4051
4052job_error:
4053        if (pmboxq)
4054                mempool_free(pmboxq, phba->mbox_mem_pool);
4055        lpfc_bsg_dma_page_list_free(phba,
4056                                    &phba->mbox_ext_buf_ctx.ext_dmabuf_list);
4057        kfree(dd_data);
4058        phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_IDLE;
4059        return rc;
4060}
4061
4062/**
4063 * lpfc_bsg_sli_cfg_write_cmd_ext - sli_config non-embedded mailbox cmd write
4064 * @phba: Pointer to HBA context object.
4065 * @job: Pointer to the job object.
4066 * @nemb_tp: Enumerate of non-embedded mailbox command type.
4067 * @dmabuf: Pointer to a DMA buffer descriptor.
4068 *
4069 * This routine performs SLI_CONFIG (0x9B) write mailbox command operation with
4070 * non-embedded external buffers.
4071 **/
4072static int
4073lpfc_bsg_sli_cfg_write_cmd_ext(struct lpfc_hba *phba, struct bsg_job *job,
4074                               enum nemb_type nemb_tp,
4075                               struct lpfc_dmabuf *dmabuf)
4076{
4077        struct fc_bsg_request *bsg_request = job->request;
4078        struct fc_bsg_reply *bsg_reply = job->reply;
4079        struct dfc_mbox_req *mbox_req;
4080        struct lpfc_sli_config_mbox *sli_cfg_mbx;
4081        uint32_t ext_buf_cnt;
4082        struct bsg_job_data *dd_data = NULL;
4083        LPFC_MBOXQ_t *pmboxq = NULL;
4084        MAILBOX_t *pmb;
4085        uint8_t *mbx;
4086        int rc = SLI_CONFIG_NOT_HANDLED, i;
4087
4088        mbox_req =
4089           (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd;
4090
4091        /* pointer to the start of mailbox command */
4092        sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt;
4093
4094        if (nemb_tp == nemb_mse) {
4095                ext_buf_cnt = bsg_bf_get(lpfc_mbox_hdr_mse_cnt,
4096                        &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr);
4097                if (ext_buf_cnt > LPFC_MBX_SLI_CONFIG_MAX_MSE) {
4098                        lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4099                                        "2953 Failed SLI_CONFIG(mse) wr, "
4100                                        "ext_buf_cnt(%d) out of range(%d)\n",
4101                                        ext_buf_cnt,
4102                                        LPFC_MBX_SLI_CONFIG_MAX_MSE);
4103                        return -ERANGE;
4104                }
4105                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4106                                "2949 Handled SLI_CONFIG(mse) wr, "
4107                                "ext_buf_cnt:%d\n", ext_buf_cnt);
4108        } else {
4109                /* sanity check on interface type for support */
4110                if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
4111                    LPFC_SLI_INTF_IF_TYPE_2)
4112                        return -ENODEV;
4113                /* nemb_tp == nemb_hbd */
4114                ext_buf_cnt = sli_cfg_mbx->un.sli_config_emb1_subsys.hbd_count;
4115                if (ext_buf_cnt > LPFC_MBX_SLI_CONFIG_MAX_HBD) {
4116                        lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4117                                        "2954 Failed SLI_CONFIG(hbd) wr, "
4118                                        "ext_buf_cnt(%d) out of range(%d)\n",
4119                                        ext_buf_cnt,
4120                                        LPFC_MBX_SLI_CONFIG_MAX_HBD);
4121                        return -ERANGE;
4122                }
4123                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4124                                "2950 Handled SLI_CONFIG(hbd) wr, "
4125                                "ext_buf_cnt:%d\n", ext_buf_cnt);
4126        }
4127
4128        /* before dma buffer descriptor setup */
4129        lpfc_idiag_mbxacc_dump_bsg_mbox(phba, nemb_tp, mbox_wr, dma_mbox,
4130                                        sta_pre_addr, dmabuf, ext_buf_cnt);
4131
4132        if (ext_buf_cnt == 0)
4133                return -EPERM;
4134
4135        /* for the first external buffer */
4136        lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp, 0, dmabuf, dmabuf);
4137
4138        /* after dma descriptor setup */
4139        lpfc_idiag_mbxacc_dump_bsg_mbox(phba, nemb_tp, mbox_wr, dma_mbox,
4140                                        sta_pos_addr, dmabuf, ext_buf_cnt);
4141
4142        /* log for looking forward */
4143        for (i = 1; i < ext_buf_cnt; i++) {
4144                if (nemb_tp == nemb_mse)
4145                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4146                                "2951 SLI_CONFIG(mse), buf[%d]-length:%d\n",
4147                                i, sli_cfg_mbx->un.sli_config_emb0_subsys.
4148                                mse[i].buf_len);
4149                else
4150                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4151                                "2952 SLI_CONFIG(hbd), buf[%d]-length:%d\n",
4152                                i, bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
4153                                &sli_cfg_mbx->un.sli_config_emb1_subsys.
4154                                hbd[i]));
4155        }
4156
4157        /* multi-buffer handling context */
4158        phba->mbox_ext_buf_ctx.nembType = nemb_tp;
4159        phba->mbox_ext_buf_ctx.mboxType = mbox_wr;
4160        phba->mbox_ext_buf_ctx.numBuf = ext_buf_cnt;
4161        phba->mbox_ext_buf_ctx.mbxTag = mbox_req->extMboxTag;
4162        phba->mbox_ext_buf_ctx.seqNum = mbox_req->extSeqNum;
4163        phba->mbox_ext_buf_ctx.mbx_dmabuf = dmabuf;
4164
4165        if (ext_buf_cnt == 1) {
4166                /* bsg tracking structure */
4167                dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
4168                if (!dd_data) {
4169                        rc = -ENOMEM;
4170                        goto job_error;
4171                }
4172
4173                /* mailbox command structure for base driver */
4174                pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4175                if (!pmboxq) {
4176                        rc = -ENOMEM;
4177                        goto job_error;
4178                }
4179                memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
4180                pmb = &pmboxq->u.mb;
4181                mbx = (uint8_t *)dmabuf->virt;
4182                memcpy(pmb, mbx, sizeof(*pmb));
4183                pmb->mbxOwner = OWN_HOST;
4184                pmboxq->vport = phba->pport;
4185
4186                /* callback for multi-buffer read mailbox command */
4187                pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
4188
4189                /* context fields to callback function */
4190                pmboxq->ctx_buf = dd_data;
4191                dd_data->type = TYPE_MBOX;
4192                dd_data->set_job = job;
4193                dd_data->context_un.mbox.pmboxq = pmboxq;
4194                dd_data->context_un.mbox.mb = (MAILBOX_t *)mbx;
4195                job->dd_data = dd_data;
4196
4197                /* state change */
4198
4199                phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_PORT;
4200                rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
4201                if ((rc == MBX_SUCCESS) || (rc == MBX_BUSY)) {
4202                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4203                                        "2955 Issued SLI_CONFIG ext-buffer "
4204                                        "mailbox command, rc:x%x\n", rc);
4205                        return SLI_CONFIG_HANDLED;
4206                }
4207                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4208                                "2956 Failed to issue SLI_CONFIG ext-buffer "
4209                                "mailbox command, rc:x%x\n", rc);
4210                rc = -EPIPE;
4211                goto job_error;
4212        }
4213
4214        /* wait for additional external buffers */
4215
4216        bsg_reply->result = 0;
4217        bsg_job_done(job, bsg_reply->result,
4218                       bsg_reply->reply_payload_rcv_len);
4219        return SLI_CONFIG_HANDLED;
4220
4221job_error:
4222        if (pmboxq)
4223                mempool_free(pmboxq, phba->mbox_mem_pool);
4224        kfree(dd_data);
4225
4226        return rc;
4227}
4228
4229/**
4230 * lpfc_bsg_handle_sli_cfg_mbox - handle sli-cfg mailbox cmd with ext buffer
4231 * @phba: Pointer to HBA context object.
4232 * @job: Pointer to the job object.
4233 * @dmabuf: Pointer to a DMA buffer descriptor.
4234 *
4235 * This routine handles SLI_CONFIG (0x9B) mailbox command with non-embedded
4236 * external buffers, including both 0x9B with non-embedded MSEs and 0x9B
4237 * with embedded subsystem 0x1 and opcodes with external HBDs.
4238 **/
4239static int
4240lpfc_bsg_handle_sli_cfg_mbox(struct lpfc_hba *phba, struct bsg_job *job,
4241                             struct lpfc_dmabuf *dmabuf)
4242{
4243        struct lpfc_sli_config_mbox *sli_cfg_mbx;
4244        uint32_t subsys;
4245        uint32_t opcode;
4246        int rc = SLI_CONFIG_NOT_HANDLED;
4247
4248        /* state change on new multi-buffer pass-through mailbox command */
4249        phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_HOST;
4250
4251        sli_cfg_mbx = (struct lpfc_sli_config_mbox *)dmabuf->virt;
4252
4253        if (!bsg_bf_get(lpfc_mbox_hdr_emb,
4254            &sli_cfg_mbx->un.sli_config_emb0_subsys.sli_config_hdr)) {
4255                subsys = bsg_bf_get(lpfc_emb0_subcmnd_subsys,
4256                                    &sli_cfg_mbx->un.sli_config_emb0_subsys);
4257                opcode = bsg_bf_get(lpfc_emb0_subcmnd_opcode,
4258                                    &sli_cfg_mbx->un.sli_config_emb0_subsys);
4259                if (subsys == SLI_CONFIG_SUBSYS_FCOE) {
4260                        switch (opcode) {
4261                        case FCOE_OPCODE_READ_FCF:
4262                        case FCOE_OPCODE_GET_DPORT_RESULTS:
4263                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4264                                                "2957 Handled SLI_CONFIG "
4265                                                "subsys_fcoe, opcode:x%x\n",
4266                                                opcode);
4267                                rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
4268                                                        nemb_mse, dmabuf);
4269                                break;
4270                        case FCOE_OPCODE_ADD_FCF:
4271                        case FCOE_OPCODE_SET_DPORT_MODE:
4272                        case LPFC_MBOX_OPCODE_FCOE_LINK_DIAG_STATE:
4273                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4274                                                "2958 Handled SLI_CONFIG "
4275                                                "subsys_fcoe, opcode:x%x\n",
4276                                                opcode);
4277                                rc = lpfc_bsg_sli_cfg_write_cmd_ext(phba, job,
4278                                                        nemb_mse, dmabuf);
4279                                break;
4280                        default:
4281                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4282                                                "2959 Reject SLI_CONFIG "
4283                                                "subsys_fcoe, opcode:x%x\n",
4284                                                opcode);
4285                                rc = -EPERM;
4286                                break;
4287                        }
4288                } else if (subsys == SLI_CONFIG_SUBSYS_COMN) {
4289                        switch (opcode) {
4290                        case COMN_OPCODE_GET_CNTL_ADDL_ATTRIBUTES:
4291                        case COMN_OPCODE_GET_CNTL_ATTRIBUTES:
4292                        case COMN_OPCODE_GET_PROFILE_CONFIG:
4293                        case COMN_OPCODE_SET_FEATURES:
4294                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4295                                                "3106 Handled SLI_CONFIG "
4296                                                "subsys_comn, opcode:x%x\n",
4297                                                opcode);
4298                                rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
4299                                                        nemb_mse, dmabuf);
4300                                break;
4301                        default:
4302                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4303                                                "3107 Reject SLI_CONFIG "
4304                                                "subsys_comn, opcode:x%x\n",
4305                                                opcode);
4306                                rc = -EPERM;
4307                                break;
4308                        }
4309                } else {
4310                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4311                                        "2977 Reject SLI_CONFIG "
4312                                        "subsys:x%d, opcode:x%x\n",
4313                                        subsys, opcode);
4314                        rc = -EPERM;
4315                }
4316        } else {
4317                subsys = bsg_bf_get(lpfc_emb1_subcmnd_subsys,
4318                                    &sli_cfg_mbx->un.sli_config_emb1_subsys);
4319                opcode = bsg_bf_get(lpfc_emb1_subcmnd_opcode,
4320                                    &sli_cfg_mbx->un.sli_config_emb1_subsys);
4321                if (subsys == SLI_CONFIG_SUBSYS_COMN) {
4322                        switch (opcode) {
4323                        case COMN_OPCODE_READ_OBJECT:
4324                        case COMN_OPCODE_READ_OBJECT_LIST:
4325                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4326                                                "2960 Handled SLI_CONFIG "
4327                                                "subsys_comn, opcode:x%x\n",
4328                                                opcode);
4329                                rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
4330                                                        nemb_hbd, dmabuf);
4331                                break;
4332                        case COMN_OPCODE_WRITE_OBJECT:
4333                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4334                                                "2961 Handled SLI_CONFIG "
4335                                                "subsys_comn, opcode:x%x\n",
4336                                                opcode);
4337                                rc = lpfc_bsg_sli_cfg_write_cmd_ext(phba, job,
4338                                                        nemb_hbd, dmabuf);
4339                                break;
4340                        default:
4341                                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4342                                                "2962 Not handled SLI_CONFIG "
4343                                                "subsys_comn, opcode:x%x\n",
4344                                                opcode);
4345                                rc = SLI_CONFIG_NOT_HANDLED;
4346                                break;
4347                        }
4348                } else {
4349                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4350                                        "2978 Not handled SLI_CONFIG "
4351                                        "subsys:x%d, opcode:x%x\n",
4352                                        subsys, opcode);
4353                        rc = SLI_CONFIG_NOT_HANDLED;
4354                }
4355        }
4356
4357        /* state reset on not handled new multi-buffer mailbox command */
4358        if (rc != SLI_CONFIG_HANDLED)
4359                phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_IDLE;
4360
4361        return rc;
4362}
4363
4364/**
4365 * lpfc_bsg_mbox_ext_abort - request to abort mbox command with ext buffers
4366 * @phba: Pointer to HBA context object.
4367 *
4368 * This routine is for requesting to abort a pass-through mailbox command with
4369 * multiple external buffers due to error condition.
4370 **/
4371static void
4372lpfc_bsg_mbox_ext_abort(struct lpfc_hba *phba)
4373{
4374        if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_PORT)
4375                phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_ABTS;
4376        else
4377                lpfc_bsg_mbox_ext_session_reset(phba);
4378        return;
4379}
4380
4381/**
4382 * lpfc_bsg_read_ebuf_get - get the next mailbox read external buffer
4383 * @phba: Pointer to HBA context object.
4384 * @job: Pointer to the job object.
4385 *
4386 * This routine extracts the next mailbox read external buffer back to
4387 * user space through BSG.
4388 **/
4389static int
4390lpfc_bsg_read_ebuf_get(struct lpfc_hba *phba, struct bsg_job *job)
4391{
4392        struct fc_bsg_reply *bsg_reply = job->reply;
4393        struct lpfc_sli_config_mbox *sli_cfg_mbx;
4394        struct lpfc_dmabuf *dmabuf;
4395        uint8_t *pbuf;
4396        uint32_t size;
4397        uint32_t index;
4398
4399        index = phba->mbox_ext_buf_ctx.seqNum;
4400        phba->mbox_ext_buf_ctx.seqNum++;
4401
4402        sli_cfg_mbx = (struct lpfc_sli_config_mbox *)
4403                        phba->mbox_ext_buf_ctx.mbx_dmabuf->virt;
4404
4405        if (phba->mbox_ext_buf_ctx.nembType == nemb_mse) {
4406                size = bsg_bf_get(lpfc_mbox_sli_config_mse_len,
4407                        &sli_cfg_mbx->un.sli_config_emb0_subsys.mse[index]);
4408                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4409                                "2963 SLI_CONFIG (mse) ext-buffer rd get "
4410                                "buffer[%d], size:%d\n", index, size);
4411        } else {
4412                size = bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
4413                        &sli_cfg_mbx->un.sli_config_emb1_subsys.hbd[index]);
4414                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4415                                "2964 SLI_CONFIG (hbd) ext-buffer rd get "
4416                                "buffer[%d], size:%d\n", index, size);
4417        }
4418        if (list_empty(&phba->mbox_ext_buf_ctx.ext_dmabuf_list))
4419                return -EPIPE;
4420        dmabuf = list_first_entry(&phba->mbox_ext_buf_ctx.ext_dmabuf_list,
4421                                  struct lpfc_dmabuf, list);
4422        list_del_init(&dmabuf->list);
4423
4424        /* after dma buffer descriptor setup */
4425        lpfc_idiag_mbxacc_dump_bsg_mbox(phba, phba->mbox_ext_buf_ctx.nembType,
4426                                        mbox_rd, dma_ebuf, sta_pos_addr,
4427                                        dmabuf, index);
4428
4429        pbuf = (uint8_t *)dmabuf->virt;
4430        bsg_reply->reply_payload_rcv_len =
4431                sg_copy_from_buffer(job->reply_payload.sg_list,
4432                                    job->reply_payload.sg_cnt,
4433                                    pbuf, size);
4434
4435        lpfc_bsg_dma_page_free(phba, dmabuf);
4436
4437        if (phba->mbox_ext_buf_ctx.seqNum == phba->mbox_ext_buf_ctx.numBuf) {
4438                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4439                                "2965 SLI_CONFIG (hbd) ext-buffer rd mbox "
4440                                "command session done\n");
4441                lpfc_bsg_mbox_ext_session_reset(phba);
4442        }
4443
4444        bsg_reply->result = 0;
4445        bsg_job_done(job, bsg_reply->result,
4446                       bsg_reply->reply_payload_rcv_len);
4447
4448        return SLI_CONFIG_HANDLED;
4449}
4450
4451/**
4452 * lpfc_bsg_write_ebuf_set - set the next mailbox write external buffer
4453 * @phba: Pointer to HBA context object.
4454 * @job: Pointer to the job object.
4455 * @dmabuf: Pointer to a DMA buffer descriptor.
4456 *
4457 * This routine sets up the next mailbox read external buffer obtained
4458 * from user space through BSG.
4459 **/
4460static int
4461lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
4462                        struct lpfc_dmabuf *dmabuf)
4463{
4464        struct fc_bsg_reply *bsg_reply = job->reply;
4465        struct bsg_job_data *dd_data = NULL;
4466        LPFC_MBOXQ_t *pmboxq = NULL;
4467        MAILBOX_t *pmb;
4468        enum nemb_type nemb_tp;
4469        uint8_t *pbuf;
4470        uint32_t size;
4471        uint32_t index;
4472        int rc;
4473
4474        index = phba->mbox_ext_buf_ctx.seqNum;
4475        phba->mbox_ext_buf_ctx.seqNum++;
4476        nemb_tp = phba->mbox_ext_buf_ctx.nembType;
4477
4478        pbuf = (uint8_t *)dmabuf->virt;
4479        size = job->request_payload.payload_len;
4480        sg_copy_to_buffer(job->request_payload.sg_list,
4481                          job->request_payload.sg_cnt,
4482                          pbuf, size);
4483
4484        if (phba->mbox_ext_buf_ctx.nembType == nemb_mse) {
4485                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4486                                "2966 SLI_CONFIG (mse) ext-buffer wr set "
4487                                "buffer[%d], size:%d\n",
4488                                phba->mbox_ext_buf_ctx.seqNum, size);
4489
4490        } else {
4491                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4492                                "2967 SLI_CONFIG (hbd) ext-buffer wr set "
4493                                "buffer[%d], size:%d\n",
4494                                phba->mbox_ext_buf_ctx.seqNum, size);
4495
4496        }
4497
4498        /* set up external buffer descriptor and add to external buffer list */
4499        lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp, index,
4500                                        phba->mbox_ext_buf_ctx.mbx_dmabuf,
4501                                        dmabuf);
4502        list_add_tail(&dmabuf->list, &phba->mbox_ext_buf_ctx.ext_dmabuf_list);
4503
4504        /* after write dma buffer */
4505        lpfc_idiag_mbxacc_dump_bsg_mbox(phba, phba->mbox_ext_buf_ctx.nembType,
4506                                        mbox_wr, dma_ebuf, sta_pos_addr,
4507                                        dmabuf, index);
4508
4509        if (phba->mbox_ext_buf_ctx.seqNum == phba->mbox_ext_buf_ctx.numBuf) {
4510                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4511                                "2968 SLI_CONFIG ext-buffer wr all %d "
4512                                "ebuffers received\n",
4513                                phba->mbox_ext_buf_ctx.numBuf);
4514
4515                dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
4516                if (!dd_data) {
4517                        rc = -ENOMEM;
4518                        goto job_error;
4519                }
4520
4521                /* mailbox command structure for base driver */
4522                pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4523                if (!pmboxq) {
4524                        rc = -ENOMEM;
4525                        goto job_error;
4526                }
4527                memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
4528                pbuf = (uint8_t *)phba->mbox_ext_buf_ctx.mbx_dmabuf->virt;
4529                pmb = &pmboxq->u.mb;
4530                memcpy(pmb, pbuf, sizeof(*pmb));
4531                pmb->mbxOwner = OWN_HOST;
4532                pmboxq->vport = phba->pport;
4533
4534                /* callback for multi-buffer write mailbox command */
4535                pmboxq->mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
4536
4537                /* context fields to callback function */
4538                pmboxq->ctx_buf = dd_data;
4539                dd_data->type = TYPE_MBOX;
4540                dd_data->set_job = job;
4541                dd_data->context_un.mbox.pmboxq = pmboxq;
4542                dd_data->context_un.mbox.mb = (MAILBOX_t *)pbuf;
4543                job->dd_data = dd_data;
4544
4545                /* state change */
4546                phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_PORT;
4547
4548                rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
4549                if ((rc == MBX_SUCCESS) || (rc == MBX_BUSY)) {
4550                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4551                                        "2969 Issued SLI_CONFIG ext-buffer "
4552                                        "mailbox command, rc:x%x\n", rc);
4553                        return SLI_CONFIG_HANDLED;
4554                }
4555                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4556                                "2970 Failed to issue SLI_CONFIG ext-buffer "
4557                                "mailbox command, rc:x%x\n", rc);
4558                rc = -EPIPE;
4559                goto job_error;
4560        }
4561
4562        /* wait for additional external buffers */
4563        bsg_reply->result = 0;
4564        bsg_job_done(job, bsg_reply->result,
4565                       bsg_reply->reply_payload_rcv_len);
4566        return SLI_CONFIG_HANDLED;
4567
4568job_error:
4569        if (pmboxq)
4570                mempool_free(pmboxq, phba->mbox_mem_pool);
4571        lpfc_bsg_dma_page_free(phba, dmabuf);
4572        kfree(dd_data);
4573
4574        return rc;
4575}
4576
4577/**
4578 * lpfc_bsg_handle_sli_cfg_ebuf - handle ext buffer with sli-cfg mailbox cmd
4579 * @phba: Pointer to HBA context object.
4580 * @job: Pointer to the job object.
4581 * @dmabuf: Pointer to a DMA buffer descriptor.
4582 *
4583 * This routine handles the external buffer with SLI_CONFIG (0x9B) mailbox
4584 * command with multiple non-embedded external buffers.
4585 **/
4586static int
4587lpfc_bsg_handle_sli_cfg_ebuf(struct lpfc_hba *phba, struct bsg_job *job,
4588                             struct lpfc_dmabuf *dmabuf)
4589{
4590        int rc;
4591
4592        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4593                        "2971 SLI_CONFIG buffer (type:x%x)\n",
4594                        phba->mbox_ext_buf_ctx.mboxType);
4595
4596        if (phba->mbox_ext_buf_ctx.mboxType == mbox_rd) {
4597                if (phba->mbox_ext_buf_ctx.state != LPFC_BSG_MBOX_DONE) {
4598                        lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4599                                        "2972 SLI_CONFIG rd buffer state "
4600                                        "mismatch:x%x\n",
4601                                        phba->mbox_ext_buf_ctx.state);
4602                        lpfc_bsg_mbox_ext_abort(phba);
4603                        return -EPIPE;
4604                }
4605                rc = lpfc_bsg_read_ebuf_get(phba, job);
4606                if (rc == SLI_CONFIG_HANDLED)
4607                        lpfc_bsg_dma_page_free(phba, dmabuf);
4608        } else { /* phba->mbox_ext_buf_ctx.mboxType == mbox_wr */
4609                if (phba->mbox_ext_buf_ctx.state != LPFC_BSG_MBOX_HOST) {
4610                        lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4611                                        "2973 SLI_CONFIG wr buffer state "
4612                                        "mismatch:x%x\n",
4613                                        phba->mbox_ext_buf_ctx.state);
4614                        lpfc_bsg_mbox_ext_abort(phba);
4615                        return -EPIPE;
4616                }
4617                rc = lpfc_bsg_write_ebuf_set(phba, job, dmabuf);
4618        }
4619        return rc;
4620}
4621
4622/**
4623 * lpfc_bsg_handle_sli_cfg_ext - handle sli-cfg mailbox with external buffer
4624 * @phba: Pointer to HBA context object.
4625 * @job: Pointer to the job object.
4626 * @dmabuf: Pointer to a DMA buffer descriptor.
4627 *
4628 * This routine checks and handles non-embedded multi-buffer SLI_CONFIG
4629 * (0x9B) mailbox commands and external buffers.
4630 **/
4631static int
4632lpfc_bsg_handle_sli_cfg_ext(struct lpfc_hba *phba, struct bsg_job *job,
4633                            struct lpfc_dmabuf *dmabuf)
4634{
4635        struct fc_bsg_request *bsg_request = job->request;
4636        struct dfc_mbox_req *mbox_req;
4637        int rc = SLI_CONFIG_NOT_HANDLED;
4638
4639        mbox_req =
4640           (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd;
4641
4642        /* mbox command with/without single external buffer */
4643        if (mbox_req->extMboxTag == 0 && mbox_req->extSeqNum == 0)
4644                return rc;
4645
4646        /* mbox command and first external buffer */
4647        if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_IDLE) {
4648                if (mbox_req->extSeqNum == 1) {
4649                        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4650                                        "2974 SLI_CONFIG mailbox: tag:%d, "
4651                                        "seq:%d\n", mbox_req->extMboxTag,
4652                                        mbox_req->extSeqNum);
4653                        rc = lpfc_bsg_handle_sli_cfg_mbox(phba, job, dmabuf);
4654                        return rc;
4655                } else
4656                        goto sli_cfg_ext_error;
4657        }
4658
4659        /*
4660         * handle additional external buffers
4661         */
4662
4663        /* check broken pipe conditions */
4664        if (mbox_req->extMboxTag != phba->mbox_ext_buf_ctx.mbxTag)
4665                goto sli_cfg_ext_error;
4666        if (mbox_req->extSeqNum > phba->mbox_ext_buf_ctx.numBuf)
4667                goto sli_cfg_ext_error;
4668        if (mbox_req->extSeqNum != phba->mbox_ext_buf_ctx.seqNum + 1)
4669                goto sli_cfg_ext_error;
4670
4671        lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
4672                        "2975 SLI_CONFIG mailbox external buffer: "
4673                        "extSta:x%x, tag:%d, seq:%d\n",
4674                        phba->mbox_ext_buf_ctx.state, mbox_req->extMboxTag,
4675                        mbox_req->extSeqNum);
4676        rc = lpfc_bsg_handle_sli_cfg_ebuf(phba, job, dmabuf);
4677        return rc;
4678
4679sli_cfg_ext_error:
4680        /* all other cases, broken pipe */
4681        lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
4682                        "2976 SLI_CONFIG mailbox broken pipe: "
4683                        "ctxSta:x%x, ctxNumBuf:%d "
4684                        "ctxTag:%d, ctxSeq:%d, tag:%d, seq:%d\n",
4685                        phba->mbox_ext_buf_ctx.state,
4686                        phba->mbox_ext_buf_ctx.numBuf,
4687                        phba->mbox_ext_buf_ctx.mbxTag,
4688                        phba->mbox_ext_buf_ctx.seqNum,
4689                        mbox_req->extMboxTag, mbox_req->extSeqNum);
4690
4691        lpfc_bsg_mbox_ext_session_reset(phba);
4692
4693        return -EPIPE;
4694}
4695
4696/**
4697 * lpfc_bsg_issue_mbox - issues a mailbox command on behalf of an app
4698 * @phba: Pointer to HBA context object.
4699 * @job: Pointer to the job object.
4700 * @vport: Pointer to a vport object.
4701 *
4702 * Allocate a tracking object, mailbox command memory, get a mailbox
4703 * from the mailbox pool, copy the caller mailbox command.
4704 *
4705 * If offline and the sli is active we need to poll for the command (port is
4706 * being reset) and complete the job, otherwise issue the mailbox command and
4707 * let our completion handler finish the command.
4708 **/
4709static int
4710lpfc_bsg_issue_mbox(struct lpfc_hba *phba, struct bsg_job *job,
4711        struct lpfc_vport *vport)
4712{
4713        struct fc_bsg_request *bsg_request = job->request;
4714        struct fc_bsg_reply *bsg_reply = job->reply;
4715        LPFC_MBOXQ_t *pmboxq = NULL; /* internal mailbox queue */
4716        MAILBOX_t *pmb; /* shortcut to the pmboxq mailbox */
4717        /* a 4k buffer to hold the mb and extended data from/to the bsg */
4718        uint8_t *pmbx = NULL;
4719        struct bsg_job_data *dd_data = NULL; /* bsg data tracking structure */
4720        struct lpfc_dmabuf *dmabuf = NULL;
4721        struct dfc_mbox_req *mbox_req;
4722        struct READ_EVENT_LOG_VAR *rdEventLog;
4723        uint32_t transmit_length, receive_length, mode;
4724        struct lpfc_mbx_sli4_config *sli4_config;
4725        struct lpfc_mbx_nembed_cmd *nembed_sge;
4726        struct ulp_bde64 *bde;
4727        uint8_t *ext = NULL;
4728        int rc = 0;
4729        uint8_t *from;
4730        uint32_t size;
4731
4732        /* in case no data is transferred */
4733        bsg_reply->reply_payload_rcv_len = 0;
4734
4735        /* sanity check to protect driver */
4736        if (job->reply_payload.payload_len > BSG_MBOX_SIZE ||
4737            job->request_payload.payload_len > BSG_MBOX_SIZE) {
4738                rc = -ERANGE;
4739                goto job_done;
4740        }
4741
4742        /*
4743         * Don't allow mailbox commands to be sent when blocked or when in
4744         * the middle of discovery
4745         */
4746        if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) {
4747                rc = -EAGAIN;
4748                goto job_done;
4749        }
4750
4751        mbox_req =
4752            (struct dfc_mbox_req *)bsg_request->rqst_data.h_vendor.vendor_cmd;
4753
4754        /* check if requested extended data lengths are valid */
4755        if ((mbox_req->inExtWLen > BSG_MBOX_SIZE/sizeof(uint32_t)) ||
4756            (mbox_req->outExtWLen > BSG_MBOX_SIZE/sizeof(uint32_t))) {
4757                rc = -ERANGE;
4758                goto job_done;
4759        }
4760
4761        dmabuf = lpfc_bsg_dma_page_alloc(phba);
4762        if (!dmabuf || !dmabuf->virt) {
4763                rc = -ENOMEM;
4764                goto job_done;
4765        }
4766
4767        /* Get the mailbox command or external buffer from BSG */
4768        pmbx = (uint8_t *)dmabuf->virt;
4769        size = job->request_payload.payload_len;
4770        sg_copy_to_buffer(job->request_payload.sg_list,
4771                          job->request_payload.sg_cnt, pmbx, size);
4772
4773        /* Handle possible SLI_CONFIG with non-embedded payloads */
4774        if (phba->sli_rev == LPFC_SLI_REV4) {
4775                rc = lpfc_bsg_handle_sli_cfg_ext(phba, job, dmabuf);
4776                if (rc == SLI_CONFIG_HANDLED)
4777                        goto job_cont;
4778                if (rc)
4779                        goto job_done;
4780                /* SLI_CONFIG_NOT_HANDLED for other mailbox commands */
4781        }
4782
4783        rc = lpfc_bsg_check_cmd_access(phba, (MAILBOX_t *)pmbx, vport);
4784        if (rc != 0)
4785                goto job_done; /* must be negative */
4786
4787        /* allocate our bsg tracking structure */
4788        dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
4789        if (!dd_data) {
4790                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
4791                                "2727 Failed allocation of dd_data\n");
4792                rc = -ENOMEM;
4793                goto job_done;
4794        }
4795
4796        pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4797        if (!pmboxq) {
4798                rc = -ENOMEM;
4799                goto job_done;
4800        }
4801        memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
4802
4803        pmb = &pmboxq->u.mb;
4804        memcpy(pmb, pmbx, sizeof(*pmb));
4805        pmb->mbxOwner = OWN_HOST;
4806        pmboxq->vport = vport;
4807
4808        /* If HBA encountered an error attention, allow only DUMP
4809         * or RESTART mailbox commands until the HBA is restarted.
4810         */
4811        if (phba->pport->stopped &&
4812            pmb->mbxCommand != MBX_DUMP_MEMORY &&
4813            pmb->mbxCommand != MBX_RESTART &&
4814            pmb->mbxCommand != MBX_WRITE_VPARMS &&
4815            pmb->mbxCommand != MBX_WRITE_WWN)
4816                lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX,
4817                                "2797 mbox: Issued mailbox cmd "
4818                                "0x%x while in stopped state.\n",
4819                                pmb->mbxCommand);
4820
4821        /* extended mailbox commands will need an extended buffer */
4822        if (mbox_req->inExtWLen || mbox_req->outExtWLen) {
4823                from = pmbx;
4824                ext = from + sizeof(MAILBOX_t);
4825                pmboxq->ctx_buf = ext;
4826                pmboxq->in_ext_byte_len =
4827                        mbox_req->inExtWLen * sizeof(uint32_t);
4828                pmboxq->out_ext_byte_len =
4829                        mbox_req->outExtWLen * sizeof(uint32_t);
4830                pmboxq->mbox_offset_word = mbox_req->mbOffset;
4831        }
4832
4833        /* biu diag will need a kernel buffer to transfer the data
4834         * allocate our own buffer and setup the mailbox command to
4835         * use ours
4836         */
4837        if (pmb->mbxCommand == MBX_RUN_BIU_DIAG64) {
4838                transmit_length = pmb->un.varWords[1];
4839                receive_length = pmb->un.varWords[4];
4840                /* transmit length cannot be greater than receive length or
4841                 * mailbox extension size
4842                 */
4843                if ((transmit_length > receive_length) ||
4844                        (transmit_length > BSG_MBOX_SIZE - sizeof(MAILBOX_t))) {
4845                        rc = -ERANGE;
4846                        goto job_done;
4847                }
4848                pmb->un.varBIUdiag.un.s2.xmit_bde64.addrHigh =
4849                        putPaddrHigh(dmabuf->phys + sizeof(MAILBOX_t));
4850                pmb->un.varBIUdiag.un.s2.xmit_bde64.addrLow =
4851                        putPaddrLow(dmabuf->phys + sizeof(MAILBOX_t));
4852
4853                pmb->un.varBIUdiag.un.s2.rcv_bde64.addrHigh =
4854                        putPaddrHigh(dmabuf->phys + sizeof(MAILBOX_t)
4855                          + pmb->un.varBIUdiag.un.s2.xmit_bde64.tus.f.bdeSize);
4856                pmb->un.varBIUdiag.un.s2.rcv_bde64.addrLow =
4857                        putPaddrLow(dmabuf->phys + sizeof(MAILBOX_t)
4858                          + pmb->un.varBIUdiag.un.s2.xmit_bde64.tus.f.bdeSize);
4859        } else if (pmb->mbxCommand == MBX_READ_EVENT_LOG) {
4860                rdEventLog = &pmb->un.varRdEventLog;
4861                receive_length = rdEventLog->rcv_bde64.tus.f.bdeSize;
4862                mode = bf_get(lpfc_event_log, rdEventLog);
4863
4864                /* receive length cannot be greater than mailbox
4865                 * extension size
4866                 */
4867                if (receive_length > BSG_MBOX_SIZE - sizeof(MAILBOX_t)) {
4868                        rc = -ERANGE;
4869                        goto job_done;
4870                }
4871
4872                /* mode zero uses a bde like biu diags command */
4873                if (mode == 0) {
4874                        pmb->un.varWords[3] = putPaddrLow(dmabuf->phys
4875                                                        + sizeof(MAILBOX_t));
4876                        pmb->un.varWords[4] = putPaddrHigh(dmabuf->phys
4877                                                        + sizeof(MAILBOX_t));
4878                }
4879        } else if (phba->sli_rev == LPFC_SLI_REV4) {
4880                /* Let type 4 (well known data) through because the data is
4881                 * returned in varwords[4-8]
4882                 * otherwise check the recieve length and fetch the buffer addr
4883                 */
4884                if ((pmb->mbxCommand == MBX_DUMP_MEMORY) &&
4885                        (pmb->un.varDmp.type != DMP_WELL_KNOWN)) {
4886                        /* rebuild the command for sli4 using our own buffers
4887                        * like we do for biu diags
4888                        */
4889                        receive_length = pmb->un.varWords[2];
4890                        /* receive length cannot be greater than mailbox
4891                         * extension size
4892                         */
4893                        if (receive_length == 0) {
4894                                rc = -ERANGE;
4895                                goto job_done;
4896                        }
4897                        pmb->un.varWords[3] = putPaddrLow(dmabuf->phys
4898                                                + sizeof(MAILBOX_t));
4899                        pmb->un.varWords[4] = putPaddrHigh(dmabuf->phys
4900                                                + sizeof(MAILBOX_t));
4901                } else if ((pmb->mbxCommand == MBX_UPDATE_CFG) &&
4902                        pmb->un.varUpdateCfg.co) {
4903                        bde = (struct ulp_bde64 *)&pmb->un.varWords[4];
4904
4905                        /* bde size cannot be greater than mailbox ext size */
4906                        if (bde->tus.f.bdeSize >
4907                            BSG_MBOX_SIZE - sizeof(MAILBOX_t)) {
4908                                rc = -ERANGE;
4909                                goto job_done;
4910                        }
4911                        bde->addrHigh = putPaddrHigh(dmabuf->phys
4912                                                + sizeof(MAILBOX_t));
4913                        bde->addrLow = putPaddrLow(dmabuf->phys
4914                                                + sizeof(MAILBOX_t));
4915                } else if (pmb->mbxCommand == MBX_SLI4_CONFIG) {
4916                        /* Handling non-embedded SLI_CONFIG mailbox command */
4917                        sli4_config = &pmboxq->u.mqe.un.sli4_config;
4918                        if (!bf_get(lpfc_mbox_hdr_emb,
4919                            &sli4_config->header.cfg_mhdr)) {
4920                                /* rebuild the command for sli4 using our
4921                                 * own buffers like we do for biu diags
4922                                 */
4923                                nembed_sge = (struct lpfc_mbx_nembed_cmd *)
4924                                                &pmb->un.varWords[0];
4925                                receive_length = nembed_sge->sge[0].length;
4926
4927                                /* receive length cannot be greater than
4928                                 * mailbox extension size
4929                                 */
4930                                if ((receive_length == 0) ||
4931                                    (receive_length >
4932                                     BSG_MBOX_SIZE - sizeof(MAILBOX_t))) {
4933                                        rc = -ERANGE;
4934                                        goto job_done;
4935                                }
4936
4937                                nembed_sge->sge[0].pa_hi =
4938                                                putPaddrHigh(dmabuf->phys
4939                                                   + sizeof(MAILBOX_t));
4940                                nembed_sge->sge[0].pa_lo =
4941                                                putPaddrLow(dmabuf->phys
4942                                                   + sizeof(MAILBOX_t));
4943                        }
4944                }
4945        }
4946
4947        dd_data->context_un.mbox.dmabuffers = dmabuf;
4948
4949        /* setup wake call as IOCB callback */
4950        pmboxq->mbox_cmpl = lpfc_bsg_issue_mbox_cmpl;
4951
4952        /* setup context field to pass wait_queue pointer to wake function */
4953        pmboxq->ctx_ndlp = dd_data;
4954        dd_data->type = TYPE_MBOX;
4955        dd_data->set_job = job;
4956        dd_data->context_un.mbox.pmboxq = pmboxq;
4957        dd_data->context_un.mbox.mb = (MAILBOX_t *)pmbx;
4958        dd_data->context_un.mbox.ext = ext;
4959        dd_data->context_un.mbox.mbOffset = mbox_req->mbOffset;
4960        dd_data->context_un.mbox.inExtWLen = mbox_req->inExtWLen;
4961        dd_data->context_un.mbox.outExtWLen = mbox_req->outExtWLen;
4962        job->dd_data = dd_data;
4963
4964        if ((vport->fc_flag & FC_OFFLINE_MODE) ||
4965            (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))) {
4966                rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
4967                if (rc != MBX_SUCCESS) {
4968                        rc = (rc == MBX_TIMEOUT) ? -ETIME : -ENODEV;
4969                        goto job_done;
4970                }
4971
4972                /* job finished, copy the data */
4973                memcpy(pmbx, pmb, sizeof(*pmb));
4974                bsg_reply->reply_payload_rcv_len =
4975                        sg_copy_from_buffer(job->reply_payload.sg_list,
4976                                            job->reply_payload.sg_cnt,
4977                                            pmbx, size);
4978                /* not waiting mbox already done */
4979                rc = 0;
4980                goto job_done;
4981        }
4982
4983        rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
4984        if ((rc == MBX_SUCCESS) || (rc == MBX_BUSY))
4985                return 1; /* job started */
4986
4987job_done:
4988        /* common exit for error or job completed inline */
4989        if (pmboxq)
4990                mempool_free(pmboxq, phba->mbox_mem_pool);
4991        lpfc_bsg_dma_page_free(phba, dmabuf);
4992        kfree(dd_data);
4993
4994job_cont:
4995        return rc;
4996}
4997
4998/**
4999 * lpfc_bsg_mbox_cmd - process an fc bsg LPFC_BSG_VENDOR_MBOX command
5000 * @job: MBOX fc_bsg_job for LPFC_BSG_VENDOR_MBOX.
5001 **/
5002static int
5003lpfc_bsg_mbox_cmd(struct bsg_job *job)
5004{
5005        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
5006        struct fc_bsg_request *bsg_request = job->request;
5007        struct fc_bsg_reply *bsg_reply = job->reply;
5008        struct lpfc_hba *phba = vport->phba;
5009        struct dfc_mbox_req *mbox_req;
5010        int rc = 0;
5011
5012        /* mix-and-match backward compatibility */
5013        bsg_reply->reply_payload_rcv_len = 0;
5014        if (job->request_len <
5015            sizeof(struct fc_bsg_request) + sizeof(struct dfc_mbox_req)) {
5016                lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
5017                                "2737 Mix-and-match backward compatibility "
5018                                "between MBOX_REQ old size:%d and "
5019                                "new request size:%d\n",
5020                                (int)(job->request_len -
5021                                      sizeof(struct fc_bsg_request)),
5022                                (int)sizeof(struct dfc_mbox_req));
5023                mbox_req = (struct dfc_mbox_req *)
5024                                bsg_request->rqst_data.h_vendor.vendor_cmd;
5025                mbox_req->extMboxTag = 0;
5026                mbox_req->extSeqNum = 0;
5027        }
5028
5029        rc = lpfc_bsg_issue_mbox(phba, job, vport);
5030
5031        if (rc == 0) {
5032                /* job done */
5033                bsg_reply->result = 0;
5034                job->dd_data = NULL;
5035                bsg_job_done(job, bsg_reply->result,
5036                               bsg_reply->reply_payload_rcv_len);
5037        } else if (rc == 1)
5038                /* job submitted, will complete later*/
5039                rc = 0; /* return zero, no error */
5040        else {
5041                /* some error occurred */
5042                bsg_reply->result = rc;
5043                job->dd_data = NULL;
5044        }
5045
5046        return rc;
5047}
5048
5049/**
5050 * lpfc_bsg_menlo_cmd_cmp - lpfc_menlo_cmd completion handler
5051 * @phba: Pointer to HBA context object.
5052 * @cmdiocbq: Pointer to command iocb.
5053 * @rspiocbq: Pointer to response iocb.
5054 *
5055 * This function is the completion handler for iocbs issued using
5056 * lpfc_menlo_cmd function. This function is called by the
5057 * ring event handler function without any lock held. This function
5058 * can be called from both worker thread context and interrupt
5059 * context. This function also can be called from another thread which
5060 * cleans up the SLI layer objects.
5061 * This function copies the contents of the response iocb to the
5062 * response iocb memory object provided by the caller of
5063 * lpfc_sli_issue_iocb_wait and then wakes up the thread which
5064 * sleeps for the iocb completion.
5065 **/
5066static void
5067lpfc_bsg_menlo_cmd_cmp(struct lpfc_hba *phba,
5068                        struct lpfc_iocbq *cmdiocbq,
5069                        struct lpfc_iocbq *rspiocbq)
5070{
5071        struct bsg_job_data *dd_data;
5072        struct bsg_job *job;
5073        struct fc_bsg_reply *bsg_reply;
5074        IOCB_t *rsp;
5075        struct lpfc_dmabuf *bmp, *cmp, *rmp;
5076        struct lpfc_bsg_menlo *menlo;
5077        unsigned long flags;
5078        struct menlo_response *menlo_resp;
5079        unsigned int rsp_size;
5080        int rc = 0;
5081
5082        dd_data = cmdiocbq->context1;
5083        cmp = cmdiocbq->context2;
5084        bmp = cmdiocbq->context3;
5085        menlo = &dd_data->context_un.menlo;
5086        rmp = menlo->rmp;
5087        rsp = &rspiocbq->iocb;
5088
5089        /* Determine if job has been aborted */
5090        spin_lock_irqsave(&phba->ct_ev_lock, flags);
5091        job = dd_data->set_job;
5092        if (job) {
5093                bsg_reply = job->reply;
5094                /* Prevent timeout handling from trying to abort job  */
5095                job->dd_data = NULL;
5096        }
5097        spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
5098
5099        /* Copy the job data or set the failing status for the job */
5100
5101        if (job) {
5102                /* always return the xri, this would be used in the case
5103                 * of a menlo download to allow the data to be sent as a
5104                 * continuation of the exchange.
5105                 */
5106
5107                menlo_resp = (struct menlo_response *)
5108                        bsg_reply->reply_data.vendor_reply.vendor_rsp;
5109                menlo_resp->xri = rsp->ulpContext;
5110                if (rsp->ulpStatus) {
5111                        if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
5112                                switch (rsp->un.ulpWord[4] & IOERR_PARAM_MASK) {
5113                                case IOERR_SEQUENCE_TIMEOUT:
5114                                        rc = -ETIMEDOUT;
5115                                        break;
5116                                case IOERR_INVALID_RPI:
5117                                        rc = -EFAULT;
5118                                        break;
5119                                default:
5120                                        rc = -EACCES;
5121                                        break;
5122                                }
5123                        } else {
5124                                rc = -EACCES;
5125                        }
5126                } else {
5127                        rsp_size = rsp->un.genreq64.bdl.bdeSize;
5128                        bsg_reply->reply_payload_rcv_len =
5129                                lpfc_bsg_copy_data(rmp, &job->reply_payload,
5130                                                   rsp_size, 0);
5131                }
5132
5133        }
5134
5135        lpfc_sli_release_iocbq(phba, cmdiocbq);
5136        lpfc_free_bsg_buffers(phba, cmp);
5137        lpfc_free_bsg_buffers(phba, rmp);
5138        lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
5139        kfree(bmp);
5140        kfree(dd_data);
5141
5142        /* Complete the job if active */
5143
5144        if (job) {
5145                bsg_reply->result = rc;
5146                bsg_job_done(job, bsg_reply->result,
5147                               bsg_reply->reply_payload_rcv_len);
5148        }
5149
5150        return;
5151}
5152
5153/**
5154 * lpfc_menlo_cmd - send an ioctl for menlo hardware
5155 * @job: fc_bsg_job to handle
5156 *
5157 * This function issues a gen request 64 CR ioctl for all menlo cmd requests,
5158 * all the command completions will return the xri for the command.
5159 * For menlo data requests a gen request 64 CX is used to continue the exchange
5160 * supplied in the menlo request header xri field.
5161 **/
5162static int
5163lpfc_menlo_cmd(struct bsg_job *job)
5164{
5165        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
5166        struct fc_bsg_request *bsg_request = job->request;
5167        struct fc_bsg_reply *bsg_reply = job->reply;
5168        struct lpfc_hba *phba = vport->phba;
5169        struct lpfc_iocbq *cmdiocbq;
5170        IOCB_t *cmd;
5171        int rc = 0;
5172        struct menlo_command *menlo_cmd;
5173        struct lpfc_dmabuf *bmp = NULL, *cmp = NULL, *rmp = NULL;
5174        int request_nseg;
5175        int reply_nseg;
5176        struct bsg_job_data *dd_data;
5177        struct ulp_bde64 *bpl = NULL;
5178
5179        /* in case no data is returned return just the return code */
5180        bsg_reply->reply_payload_rcv_len = 0;
5181
5182        if (job->request_len <
5183            sizeof(struct fc_bsg_request) +
5184                sizeof(struct menlo_command)) {
5185                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5186                                "2784 Received MENLO_CMD request below "
5187                                "minimum size\n");
5188                rc = -ERANGE;
5189                goto no_dd_data;
5190        }
5191
5192        if (job->reply_len < sizeof(*bsg_reply) +
5193                                sizeof(struct menlo_response)) {
5194                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5195                                "2785 Received MENLO_CMD reply below "
5196                                "minimum size\n");
5197                rc = -ERANGE;
5198                goto no_dd_data;
5199        }
5200
5201        if (!(phba->menlo_flag & HBA_MENLO_SUPPORT)) {
5202                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5203                                "2786 Adapter does not support menlo "
5204                                "commands\n");
5205                rc = -EPERM;
5206                goto no_dd_data;
5207        }
5208
5209        menlo_cmd = (struct menlo_command *)
5210                bsg_request->rqst_data.h_vendor.vendor_cmd;
5211
5212        /* allocate our bsg tracking structure */
5213        dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
5214        if (!dd_data) {
5215                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5216                                "2787 Failed allocation of dd_data\n");
5217                rc = -ENOMEM;
5218                goto no_dd_data;
5219        }
5220
5221        bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
5222        if (!bmp) {
5223                rc = -ENOMEM;
5224                goto free_dd;
5225        }
5226
5227        bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys);
5228        if (!bmp->virt) {
5229                rc = -ENOMEM;
5230                goto free_bmp;
5231        }
5232
5233        INIT_LIST_HEAD(&bmp->list);
5234
5235        bpl = (struct ulp_bde64 *)bmp->virt;
5236        request_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64);
5237        cmp = lpfc_alloc_bsg_buffers(phba, job->request_payload.payload_len,
5238                                     1, bpl, &request_nseg);
5239        if (!cmp) {
5240                rc = -ENOMEM;
5241                goto free_bmp;
5242        }
5243        lpfc_bsg_copy_data(cmp, &job->request_payload,
5244                           job->request_payload.payload_len, 1);
5245
5246        bpl += request_nseg;
5247        reply_nseg = LPFC_BPL_SIZE/sizeof(struct ulp_bde64) - request_nseg;
5248        rmp = lpfc_alloc_bsg_buffers(phba, job->reply_payload.payload_len, 0,
5249                                     bpl, &reply_nseg);
5250        if (!rmp) {
5251                rc = -ENOMEM;
5252                goto free_cmp;
5253        }
5254
5255        cmdiocbq = lpfc_sli_get_iocbq(phba);
5256        if (!cmdiocbq) {
5257                rc = -ENOMEM;
5258                goto free_rmp;
5259        }
5260
5261        cmd = &cmdiocbq->iocb;
5262        cmd->un.genreq64.bdl.ulpIoTag32 = 0;
5263        cmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
5264        cmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys);
5265        cmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
5266        cmd->un.genreq64.bdl.bdeSize =
5267            (request_nseg + reply_nseg) * sizeof(struct ulp_bde64);
5268        cmd->un.genreq64.w5.hcsw.Fctl = (SI | LA);
5269        cmd->un.genreq64.w5.hcsw.Dfctl = 0;
5270        cmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CMD;
5271        cmd->un.genreq64.w5.hcsw.Type = MENLO_TRANSPORT_TYPE; /* 0xfe */
5272        cmd->ulpBdeCount = 1;
5273        cmd->ulpClass = CLASS3;
5274        cmd->ulpOwner = OWN_CHIP;
5275        cmd->ulpLe = 1; /* Limited Edition */
5276        cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
5277        cmdiocbq->vport = phba->pport;
5278        /* We want the firmware to timeout before we do */
5279        cmd->ulpTimeout = MENLO_TIMEOUT - 5;
5280        cmdiocbq->iocb_cmpl = lpfc_bsg_menlo_cmd_cmp;
5281        cmdiocbq->context1 = dd_data;
5282        cmdiocbq->context2 = cmp;
5283        cmdiocbq->context3 = bmp;
5284        if (menlo_cmd->cmd == LPFC_BSG_VENDOR_MENLO_CMD) {
5285                cmd->ulpCommand = CMD_GEN_REQUEST64_CR;
5286                cmd->ulpPU = MENLO_PU; /* 3 */
5287                cmd->un.ulpWord[4] = MENLO_DID; /* 0x0000FC0E */
5288                cmd->ulpContext = MENLO_CONTEXT; /* 0 */
5289        } else {
5290                cmd->ulpCommand = CMD_GEN_REQUEST64_CX;
5291                cmd->ulpPU = 1;
5292                cmd->un.ulpWord[4] = 0;
5293                cmd->ulpContext = menlo_cmd->xri;
5294        }
5295
5296        dd_data->type = TYPE_MENLO;
5297        dd_data->set_job = job;
5298        dd_data->context_un.menlo.cmdiocbq = cmdiocbq;
5299        dd_data->context_un.menlo.rmp = rmp;
5300        job->dd_data = dd_data;
5301
5302        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq,
5303                MENLO_TIMEOUT - 5);
5304        if (rc == IOCB_SUCCESS)
5305                return 0; /* done for now */
5306
5307        lpfc_sli_release_iocbq(phba, cmdiocbq);
5308
5309free_rmp:
5310        lpfc_free_bsg_buffers(phba, rmp);
5311free_cmp:
5312        lpfc_free_bsg_buffers(phba, cmp);
5313free_bmp:
5314        if (bmp->virt)
5315                lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
5316        kfree(bmp);
5317free_dd:
5318        kfree(dd_data);
5319no_dd_data:
5320        /* make error code available to userspace */
5321        bsg_reply->result = rc;
5322        job->dd_data = NULL;
5323        return rc;
5324}
5325
5326static int
5327lpfc_forced_link_speed(struct bsg_job *job)
5328{
5329        struct Scsi_Host *shost = fc_bsg_to_shost(job);
5330        struct lpfc_vport *vport = shost_priv(shost);
5331        struct lpfc_hba *phba = vport->phba;
5332        struct fc_bsg_reply *bsg_reply = job->reply;
5333        struct forced_link_speed_support_reply *forced_reply;
5334        int rc = 0;
5335
5336        if (job->request_len <
5337            sizeof(struct fc_bsg_request) +
5338            sizeof(struct get_forced_link_speed_support)) {
5339                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5340                                "0048 Received FORCED_LINK_SPEED request "
5341                                "below minimum size\n");
5342                rc = -EINVAL;
5343                goto job_error;
5344        }
5345
5346        forced_reply = (struct forced_link_speed_support_reply *)
5347                bsg_reply->reply_data.vendor_reply.vendor_rsp;
5348
5349        if (job->reply_len < sizeof(*bsg_reply) + sizeof(*forced_reply)) {
5350                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5351                                "0049 Received FORCED_LINK_SPEED reply below "
5352                                "minimum size\n");
5353                rc = -EINVAL;
5354                goto job_error;
5355        }
5356
5357        forced_reply->supported = (phba->hba_flag & HBA_FORCED_LINK_SPEED)
5358                                   ? LPFC_FORCED_LINK_SPEED_SUPPORTED
5359                                   : LPFC_FORCED_LINK_SPEED_NOT_SUPPORTED;
5360job_error:
5361        bsg_reply->result = rc;
5362        if (rc == 0)
5363                bsg_job_done(job, bsg_reply->result,
5364                               bsg_reply->reply_payload_rcv_len);
5365        return rc;
5366}
5367
5368/**
5369 * lpfc_check_fwlog_support: Check FW log support on the adapter
5370 * @phba: Pointer to HBA context object.
5371 *
5372 * Check if FW Logging support by the adapter
5373 **/
5374int
5375lpfc_check_fwlog_support(struct lpfc_hba *phba)
5376{
5377        struct lpfc_ras_fwlog *ras_fwlog = NULL;
5378
5379        ras_fwlog = &phba->ras_fwlog;
5380
5381        if (!ras_fwlog->ras_hwsupport)
5382                return -EACCES;
5383        else if (!ras_fwlog->ras_enabled)
5384                return -EPERM;
5385        else
5386                return 0;
5387}
5388
5389/**
5390 * lpfc_bsg_get_ras_config: Get RAS configuration settings
5391 * @job: fc_bsg_job to handle
5392 *
5393 * Get RAS configuration values set.
5394 **/
5395static int
5396lpfc_bsg_get_ras_config(struct bsg_job *job)
5397{
5398        struct Scsi_Host *shost = fc_bsg_to_shost(job);
5399        struct lpfc_vport *vport = shost_priv(shost);
5400        struct fc_bsg_reply *bsg_reply = job->reply;
5401        struct lpfc_hba *phba = vport->phba;
5402        struct lpfc_bsg_get_ras_config_reply *ras_reply;
5403        struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog;
5404        int rc = 0;
5405
5406        if (job->request_len <
5407            sizeof(struct fc_bsg_request) +
5408            sizeof(struct lpfc_bsg_ras_req)) {
5409                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5410                                "6192 FW_LOG request received "
5411                                "below minimum size\n");
5412                rc = -EINVAL;
5413                goto ras_job_error;
5414        }
5415
5416        /* Check FW log status */
5417        rc = lpfc_check_fwlog_support(phba);
5418        if (rc)
5419                goto ras_job_error;
5420
5421        ras_reply = (struct lpfc_bsg_get_ras_config_reply *)
5422                bsg_reply->reply_data.vendor_reply.vendor_rsp;
5423
5424        /* Current logging state */
5425        spin_lock_irq(&phba->hbalock);
5426        if (ras_fwlog->state == ACTIVE)
5427                ras_reply->state = LPFC_RASLOG_STATE_RUNNING;
5428        else
5429                ras_reply->state = LPFC_RASLOG_STATE_STOPPED;
5430        spin_unlock_irq(&phba->hbalock);
5431
5432        ras_reply->log_level = phba->ras_fwlog.fw_loglevel;
5433        ras_reply->log_buff_sz = phba->cfg_ras_fwlog_buffsize;
5434
5435ras_job_error:
5436        /* make error code available to userspace */
5437        bsg_reply->result = rc;
5438
5439        /* complete the job back to userspace */
5440        if (!rc)
5441                bsg_job_done(job, bsg_reply->result,
5442                             bsg_reply->reply_payload_rcv_len);
5443        return rc;
5444}
5445
5446/**
5447 * lpfc_bsg_set_ras_config: Set FW logging parameters
5448 * @job: fc_bsg_job to handle
5449 *
5450 * Set log-level parameters for FW-logging in host memory
5451 **/
5452static int
5453lpfc_bsg_set_ras_config(struct bsg_job *job)
5454{
5455        struct Scsi_Host *shost = fc_bsg_to_shost(job);
5456        struct lpfc_vport *vport = shost_priv(shost);
5457        struct lpfc_hba *phba = vport->phba;
5458        struct lpfc_bsg_set_ras_config_req *ras_req;
5459        struct fc_bsg_request *bsg_request = job->request;
5460        struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog;
5461        struct fc_bsg_reply *bsg_reply = job->reply;
5462        uint8_t action = 0, log_level = 0;
5463        int rc = 0, action_status = 0;
5464
5465        if (job->request_len <
5466            sizeof(struct fc_bsg_request) +
5467            sizeof(struct lpfc_bsg_set_ras_config_req)) {
5468                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5469                                "6182 Received RAS_LOG request "
5470                                "below minimum size\n");
5471                rc = -EINVAL;
5472                goto ras_job_error;
5473        }
5474
5475        /* Check FW log status */
5476        rc = lpfc_check_fwlog_support(phba);
5477        if (rc)
5478                goto ras_job_error;
5479
5480        ras_req = (struct lpfc_bsg_set_ras_config_req *)
5481                bsg_request->rqst_data.h_vendor.vendor_cmd;
5482        action = ras_req->action;
5483        log_level = ras_req->log_level;
5484
5485        if (action == LPFC_RASACTION_STOP_LOGGING) {
5486                /* Check if already disabled */
5487                spin_lock_irq(&phba->hbalock);
5488                if (ras_fwlog->state != ACTIVE) {
5489                        spin_unlock_irq(&phba->hbalock);
5490                        rc = -ESRCH;
5491                        goto ras_job_error;
5492                }
5493                spin_unlock_irq(&phba->hbalock);
5494
5495                /* Disable logging */
5496                lpfc_ras_stop_fwlog(phba);
5497        } else {
5498                /*action = LPFC_RASACTION_START_LOGGING*/
5499
5500                /* Even though FW-logging is active re-initialize
5501                 * FW-logging with new log-level. Return status
5502                 * "Logging already Running" to caller.
5503                 **/
5504                spin_lock_irq(&phba->hbalock);
5505                if (ras_fwlog->state != INACTIVE)
5506                        action_status = -EINPROGRESS;
5507                spin_unlock_irq(&phba->hbalock);
5508
5509                /* Enable logging */
5510                rc = lpfc_sli4_ras_fwlog_init(phba, log_level,
5511                                              LPFC_RAS_ENABLE_LOGGING);
5512                if (rc) {
5513                        rc = -EINVAL;
5514                        goto ras_job_error;
5515                }
5516
5517                /* Check if FW-logging is re-initialized */
5518                if (action_status == -EINPROGRESS)
5519                        rc = action_status;
5520        }
5521ras_job_error:
5522        /* make error code available to userspace */
5523        bsg_reply->result = rc;
5524
5525        /* complete the job back to userspace */
5526        if (!rc)
5527                bsg_job_done(job, bsg_reply->result,
5528                             bsg_reply->reply_payload_rcv_len);
5529
5530        return rc;
5531}
5532
5533/**
5534 * lpfc_bsg_get_ras_lwpd: Get log write position data
5535 * @job: fc_bsg_job to handle
5536 *
5537 * Get Offset/Wrap count of the log message written
5538 * in host memory
5539 **/
5540static int
5541lpfc_bsg_get_ras_lwpd(struct bsg_job *job)
5542{
5543        struct Scsi_Host *shost = fc_bsg_to_shost(job);
5544        struct lpfc_vport *vport = shost_priv(shost);
5545        struct lpfc_bsg_get_ras_lwpd *ras_reply;
5546        struct lpfc_hba *phba = vport->phba;
5547        struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog;
5548        struct fc_bsg_reply *bsg_reply = job->reply;
5549        u32 *lwpd_ptr = NULL;
5550        int rc = 0;
5551
5552        rc = lpfc_check_fwlog_support(phba);
5553        if (rc)
5554                goto ras_job_error;
5555
5556        if (job->request_len <
5557            sizeof(struct fc_bsg_request) +
5558            sizeof(struct lpfc_bsg_ras_req)) {
5559                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5560                                "6183 Received RAS_LOG request "
5561                                "below minimum size\n");
5562                rc = -EINVAL;
5563                goto ras_job_error;
5564        }
5565
5566        ras_reply = (struct lpfc_bsg_get_ras_lwpd *)
5567                bsg_reply->reply_data.vendor_reply.vendor_rsp;
5568
5569        if (!ras_fwlog->lwpd.virt) {
5570                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5571                                "6193 Restart FW Logging\n");
5572                rc = -EINVAL;
5573                goto ras_job_error;
5574        }
5575
5576        /* Get lwpd offset */
5577        lwpd_ptr = (uint32_t *)(ras_fwlog->lwpd.virt);
5578        ras_reply->offset = be32_to_cpu(*lwpd_ptr & 0xffffffff);
5579
5580        /* Get wrap count */
5581        ras_reply->wrap_count = be32_to_cpu(*(++lwpd_ptr) & 0xffffffff);
5582
5583ras_job_error:
5584        /* make error code available to userspace */
5585        bsg_reply->result = rc;
5586
5587        /* complete the job back to userspace */
5588        if (!rc)
5589                bsg_job_done(job, bsg_reply->result,
5590                             bsg_reply->reply_payload_rcv_len);
5591
5592        return rc;
5593}
5594
5595/**
5596 * lpfc_bsg_get_ras_fwlog: Read FW log
5597 * @job: fc_bsg_job to handle
5598 *
5599 * Copy the FW log into the passed buffer.
5600 **/
5601static int
5602lpfc_bsg_get_ras_fwlog(struct bsg_job *job)
5603{
5604        struct Scsi_Host *shost = fc_bsg_to_shost(job);
5605        struct lpfc_vport *vport = shost_priv(shost);
5606        struct lpfc_hba *phba = vport->phba;
5607        struct fc_bsg_request *bsg_request = job->request;
5608        struct fc_bsg_reply *bsg_reply = job->reply;
5609        struct lpfc_bsg_get_fwlog_req *ras_req;
5610        u32 rd_offset, rd_index, offset;
5611        void *src, *fwlog_buff;
5612        struct lpfc_ras_fwlog *ras_fwlog = NULL;
5613        struct lpfc_dmabuf *dmabuf, *next;
5614        int rc = 0;
5615
5616        ras_fwlog = &phba->ras_fwlog;
5617
5618        rc = lpfc_check_fwlog_support(phba);
5619        if (rc)
5620                goto ras_job_error;
5621
5622        /* Logging to be stopped before reading */
5623        spin_lock_irq(&phba->hbalock);
5624        if (ras_fwlog->state == ACTIVE) {
5625                spin_unlock_irq(&phba->hbalock);
5626                rc = -EINPROGRESS;
5627                goto ras_job_error;
5628        }
5629        spin_unlock_irq(&phba->hbalock);
5630
5631        if (job->request_len <
5632            sizeof(struct fc_bsg_request) +
5633            sizeof(struct lpfc_bsg_get_fwlog_req)) {
5634                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5635                                "6184 Received RAS_LOG request "
5636                                "below minimum size\n");
5637                rc = -EINVAL;
5638                goto ras_job_error;
5639        }
5640
5641        ras_req = (struct lpfc_bsg_get_fwlog_req *)
5642                bsg_request->rqst_data.h_vendor.vendor_cmd;
5643        rd_offset = ras_req->read_offset;
5644
5645        /* Allocate memory to read fw log*/
5646        fwlog_buff = vmalloc(ras_req->read_size);
5647        if (!fwlog_buff) {
5648                rc = -ENOMEM;
5649                goto ras_job_error;
5650        }
5651
5652        rd_index = (rd_offset / LPFC_RAS_MAX_ENTRY_SIZE);
5653        offset = (rd_offset % LPFC_RAS_MAX_ENTRY_SIZE);
5654
5655        list_for_each_entry_safe(dmabuf, next,
5656                              &ras_fwlog->fwlog_buff_list, list) {
5657
5658                if (dmabuf->buffer_tag < rd_index)
5659                        continue;
5660
5661                src = dmabuf->virt + offset;
5662                memcpy(fwlog_buff, src, ras_req->read_size);
5663                break;
5664        }
5665
5666        bsg_reply->reply_payload_rcv_len =
5667                sg_copy_from_buffer(job->reply_payload.sg_list,
5668                                    job->reply_payload.sg_cnt,
5669                                    fwlog_buff, ras_req->read_size);
5670
5671        vfree(fwlog_buff);
5672
5673ras_job_error:
5674        bsg_reply->result = rc;
5675        if (!rc)
5676                bsg_job_done(job, bsg_reply->result,
5677                             bsg_reply->reply_payload_rcv_len);
5678
5679        return rc;
5680}
5681
5682static int
5683lpfc_get_trunk_info(struct bsg_job *job)
5684{
5685        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
5686        struct lpfc_hba *phba = vport->phba;
5687        struct fc_bsg_reply *bsg_reply = job->reply;
5688        struct lpfc_trunk_info *event_reply;
5689        int rc = 0;
5690
5691        if (job->request_len <
5692            sizeof(struct fc_bsg_request) + sizeof(struct get_trunk_info_req)) {
5693                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5694                                "2744 Received GET TRUNK _INFO request below "
5695                                "minimum size\n");
5696                rc = -EINVAL;
5697                goto job_error;
5698        }
5699
5700        event_reply = (struct lpfc_trunk_info *)
5701                bsg_reply->reply_data.vendor_reply.vendor_rsp;
5702
5703        if (job->reply_len < sizeof(*bsg_reply) + sizeof(*event_reply)) {
5704                lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC,
5705                                "2728 Received GET TRUNK _INFO reply below "
5706                                "minimum size\n");
5707                rc = -EINVAL;
5708                goto job_error;
5709        }
5710        if (event_reply == NULL) {
5711                rc = -EINVAL;
5712                goto job_error;
5713        }
5714
5715        bsg_bf_set(lpfc_trunk_info_link_status, event_reply,
5716                   (phba->link_state >= LPFC_LINK_UP) ? 1 : 0);
5717
5718        bsg_bf_set(lpfc_trunk_info_trunk_active0, event_reply,
5719                   (phba->trunk_link.link0.state == LPFC_LINK_UP) ? 1 : 0);
5720
5721        bsg_bf_set(lpfc_trunk_info_trunk_active1, event_reply,
5722                   (phba->trunk_link.link1.state == LPFC_LINK_UP) ? 1 : 0);
5723
5724        bsg_bf_set(lpfc_trunk_info_trunk_active2, event_reply,
5725                   (phba->trunk_link.link2.state == LPFC_LINK_UP) ? 1 : 0);
5726
5727        bsg_bf_set(lpfc_trunk_info_trunk_active3, event_reply,
5728                   (phba->trunk_link.link3.state == LPFC_LINK_UP) ? 1 : 0);
5729
5730        bsg_bf_set(lpfc_trunk_info_trunk_config0, event_reply,
5731                   bf_get(lpfc_conf_trunk_port0, &phba->sli4_hba));
5732
5733        bsg_bf_set(lpfc_trunk_info_trunk_config1, event_reply,
5734                   bf_get(lpfc_conf_trunk_port1, &phba->sli4_hba));
5735
5736        bsg_bf_set(lpfc_trunk_info_trunk_config2, event_reply,
5737                   bf_get(lpfc_conf_trunk_port2, &phba->sli4_hba));
5738
5739        bsg_bf_set(lpfc_trunk_info_trunk_config3, event_reply,
5740                   bf_get(lpfc_conf_trunk_port3, &phba->sli4_hba));
5741
5742        event_reply->port_speed = phba->sli4_hba.link_state.speed / 1000;
5743        event_reply->logical_speed =
5744                                phba->sli4_hba.link_state.logical_speed / 1000;
5745job_error:
5746        bsg_reply->result = rc;
5747        if (!rc)
5748                bsg_job_done(job, bsg_reply->result,
5749                             bsg_reply->reply_payload_rcv_len);
5750        return rc;
5751
5752}
5753
5754static int
5755lpfc_get_cgnbuf_info(struct bsg_job *job)
5756{
5757        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
5758        struct lpfc_hba *phba = vport->phba;
5759        struct fc_bsg_request *bsg_request = job->request;
5760        struct fc_bsg_reply *bsg_reply = job->reply;
5761        struct get_cgnbuf_info_req *cgnbuf_req;
5762        struct lpfc_cgn_info *cp;
5763        uint8_t *cgn_buff;
5764        int size, cinfosz;
5765        int  rc = 0;
5766
5767        if (job->request_len < sizeof(struct fc_bsg_request) +
5768            sizeof(struct get_cgnbuf_info_req)) {
5769                rc = -ENOMEM;
5770                goto job_exit;
5771        }
5772
5773        if (!phba->sli4_hba.pc_sli4_params.cmf) {
5774                rc = -ENOENT;
5775                goto job_exit;
5776        }
5777
5778        if (!phba->cgn_i || !phba->cgn_i->virt) {
5779                rc = -ENOENT;
5780                goto job_exit;
5781        }
5782
5783        cp = phba->cgn_i->virt;
5784        if (cp->cgn_info_version < LPFC_CGN_INFO_V3) {
5785                rc = -EPERM;
5786                goto job_exit;
5787        }
5788
5789        cgnbuf_req = (struct get_cgnbuf_info_req *)
5790                bsg_request->rqst_data.h_vendor.vendor_cmd;
5791
5792        /* For reset or size == 0 */
5793        bsg_reply->reply_payload_rcv_len = 0;
5794
5795        if (cgnbuf_req->reset == LPFC_BSG_CGN_RESET_STAT) {
5796                lpfc_init_congestion_stat(phba);
5797                goto job_exit;
5798        }
5799
5800        /* We don't want to include the CRC at the end */
5801        cinfosz = sizeof(struct lpfc_cgn_info) - sizeof(uint32_t);
5802
5803        size = cgnbuf_req->read_size;
5804        if (!size)
5805                goto job_exit;
5806
5807        if (size < cinfosz) {
5808                /* Just copy back what we can */
5809                cinfosz = size;
5810                rc = -E2BIG;
5811        }
5812
5813        /* Allocate memory to read congestion info */
5814        cgn_buff = vmalloc(cinfosz);
5815        if (!cgn_buff) {
5816                rc = -ENOMEM;
5817                goto job_exit;
5818        }
5819
5820        memcpy(cgn_buff, cp, cinfosz);
5821
5822        bsg_reply->reply_payload_rcv_len =
5823                sg_copy_from_buffer(job->reply_payload.sg_list,
5824                                    job->reply_payload.sg_cnt,
5825                                    cgn_buff, cinfosz);
5826
5827        vfree(cgn_buff);
5828
5829job_exit:
5830        bsg_reply->result = rc;
5831        if (!rc)
5832                bsg_job_done(job, bsg_reply->result,
5833                             bsg_reply->reply_payload_rcv_len);
5834        else
5835                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
5836                                "2724 GET CGNBUF error: %d\n", rc);
5837        return rc;
5838}
5839
5840/**
5841 * lpfc_bsg_hst_vendor - process a vendor-specific fc_bsg_job
5842 * @job: fc_bsg_job to handle
5843 **/
5844static int
5845lpfc_bsg_hst_vendor(struct bsg_job *job)
5846{
5847        struct fc_bsg_request *bsg_request = job->request;
5848        struct fc_bsg_reply *bsg_reply = job->reply;
5849        int command = bsg_request->rqst_data.h_vendor.vendor_cmd[0];
5850        int rc;
5851
5852        switch (command) {
5853        case LPFC_BSG_VENDOR_SET_CT_EVENT:
5854                rc = lpfc_bsg_hba_set_event(job);
5855                break;
5856        case LPFC_BSG_VENDOR_GET_CT_EVENT:
5857                rc = lpfc_bsg_hba_get_event(job);
5858                break;
5859        case LPFC_BSG_VENDOR_SEND_MGMT_RESP:
5860                rc = lpfc_bsg_send_mgmt_rsp(job);
5861                break;
5862        case LPFC_BSG_VENDOR_DIAG_MODE:
5863                rc = lpfc_bsg_diag_loopback_mode(job);
5864                break;
5865        case LPFC_BSG_VENDOR_DIAG_MODE_END:
5866                rc = lpfc_sli4_bsg_diag_mode_end(job);
5867                break;
5868        case LPFC_BSG_VENDOR_DIAG_RUN_LOOPBACK:
5869                rc = lpfc_bsg_diag_loopback_run(job);
5870                break;
5871        case LPFC_BSG_VENDOR_LINK_DIAG_TEST:
5872                rc = lpfc_sli4_bsg_link_diag_test(job);
5873                break;
5874        case LPFC_BSG_VENDOR_GET_MGMT_REV:
5875                rc = lpfc_bsg_get_dfc_rev(job);
5876                break;
5877        case LPFC_BSG_VENDOR_MBOX:
5878                rc = lpfc_bsg_mbox_cmd(job);
5879                break;
5880        case LPFC_BSG_VENDOR_MENLO_CMD:
5881        case LPFC_BSG_VENDOR_MENLO_DATA:
5882                rc = lpfc_menlo_cmd(job);
5883                break;
5884        case LPFC_BSG_VENDOR_FORCED_LINK_SPEED:
5885                rc = lpfc_forced_link_speed(job);
5886                break;
5887        case LPFC_BSG_VENDOR_RAS_GET_LWPD:
5888                rc = lpfc_bsg_get_ras_lwpd(job);
5889                break;
5890        case LPFC_BSG_VENDOR_RAS_GET_FWLOG:
5891                rc = lpfc_bsg_get_ras_fwlog(job);
5892                break;
5893        case LPFC_BSG_VENDOR_RAS_GET_CONFIG:
5894                rc = lpfc_bsg_get_ras_config(job);
5895                break;
5896        case LPFC_BSG_VENDOR_RAS_SET_CONFIG:
5897                rc = lpfc_bsg_set_ras_config(job);
5898                break;
5899        case LPFC_BSG_VENDOR_GET_TRUNK_INFO:
5900                rc = lpfc_get_trunk_info(job);
5901                break;
5902        case LPFC_BSG_VENDOR_GET_CGNBUF_INFO:
5903                rc = lpfc_get_cgnbuf_info(job);
5904                break;
5905        default:
5906                rc = -EINVAL;
5907                bsg_reply->reply_payload_rcv_len = 0;
5908                /* make error code available to userspace */
5909                bsg_reply->result = rc;
5910                break;
5911        }
5912
5913        return rc;
5914}
5915
5916/**
5917 * lpfc_bsg_request - handle a bsg request from the FC transport
5918 * @job: bsg_job to handle
5919 **/
5920int
5921lpfc_bsg_request(struct bsg_job *job)
5922{
5923        struct fc_bsg_request *bsg_request = job->request;
5924        struct fc_bsg_reply *bsg_reply = job->reply;
5925        uint32_t msgcode;
5926        int rc;
5927
5928        msgcode = bsg_request->msgcode;
5929        switch (msgcode) {
5930        case FC_BSG_HST_VENDOR:
5931                rc = lpfc_bsg_hst_vendor(job);
5932                break;
5933        case FC_BSG_RPT_ELS:
5934                rc = lpfc_bsg_rport_els(job);
5935                break;
5936        case FC_BSG_RPT_CT:
5937                rc = lpfc_bsg_send_mgmt_cmd(job);
5938                break;
5939        default:
5940                rc = -EINVAL;
5941                bsg_reply->reply_payload_rcv_len = 0;
5942                /* make error code available to userspace */
5943                bsg_reply->result = rc;
5944                break;
5945        }
5946
5947        return rc;
5948}
5949
5950/**
5951 * lpfc_bsg_timeout - handle timeout of a bsg request from the FC transport
5952 * @job: bsg_job that has timed out
5953 *
5954 * This function just aborts the job's IOCB.  The aborted IOCB will return to
5955 * the waiting function which will handle passing the error back to userspace
5956 **/
5957int
5958lpfc_bsg_timeout(struct bsg_job *job)
5959{
5960        struct lpfc_vport *vport = shost_priv(fc_bsg_to_shost(job));
5961        struct lpfc_hba *phba = vport->phba;
5962        struct lpfc_iocbq *cmdiocb;
5963        struct lpfc_sli_ring *pring;
5964        struct bsg_job_data *dd_data;
5965        unsigned long flags;
5966        int rc = 0;
5967        LIST_HEAD(completions);
5968        struct lpfc_iocbq *check_iocb, *next_iocb;
5969
5970        pring = lpfc_phba_elsring(phba);
5971        if (unlikely(!pring))
5972                return -EIO;
5973
5974        /* if job's driver data is NULL, the command completed or is in the
5975         * the process of completing.  In this case, return status to request
5976         * so the timeout is retried.  This avoids double completion issues
5977         * and the request will be pulled off the timer queue when the
5978         * command's completion handler executes.  Otherwise, prevent the
5979         * command's completion handler from executing the job done callback
5980         * and continue processing to abort the outstanding the command.
5981         */
5982
5983        spin_lock_irqsave(&phba->ct_ev_lock, flags);
5984        dd_data = (struct bsg_job_data *)job->dd_data;
5985        if (dd_data) {
5986                dd_data->set_job = NULL;
5987                job->dd_data = NULL;
5988        } else {
5989                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
5990                return -EAGAIN;
5991        }
5992
5993        switch (dd_data->type) {
5994        case TYPE_IOCB:
5995                /* Check to see if IOCB was issued to the port or not. If not,
5996                 * remove it from the txq queue and call cancel iocbs.
5997                 * Otherwise, call abort iotag
5998                 */
5999                cmdiocb = dd_data->context_un.iocb.cmdiocbq;
6000                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
6001
6002                spin_lock_irqsave(&phba->hbalock, flags);
6003                /* make sure the I/O abort window is still open */
6004                if (!(cmdiocb->iocb_flag & LPFC_IO_CMD_OUTSTANDING)) {
6005                        spin_unlock_irqrestore(&phba->hbalock, flags);
6006                        return -EAGAIN;
6007                }
6008                list_for_each_entry_safe(check_iocb, next_iocb, &pring->txq,
6009                                         list) {
6010                        if (check_iocb == cmdiocb) {
6011                                list_move_tail(&check_iocb->list, &completions);
6012                                break;
6013                        }
6014                }
6015                if (list_empty(&completions))
6016                        lpfc_sli_issue_abort_iotag(phba, pring, cmdiocb, NULL);
6017                spin_unlock_irqrestore(&phba->hbalock, flags);
6018                if (!list_empty(&completions)) {
6019                        lpfc_sli_cancel_iocbs(phba, &completions,
6020                                              IOSTAT_LOCAL_REJECT,
6021                                              IOERR_SLI_ABORTED);
6022                }
6023                break;
6024
6025        case TYPE_EVT:
6026                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
6027                break;
6028
6029        case TYPE_MBOX:
6030                /* Update the ext buf ctx state if needed */
6031
6032                if (phba->mbox_ext_buf_ctx.state == LPFC_BSG_MBOX_PORT)
6033                        phba->mbox_ext_buf_ctx.state = LPFC_BSG_MBOX_ABTS;
6034                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
6035                break;
6036        case TYPE_MENLO:
6037                /* Check to see if IOCB was issued to the port or not. If not,
6038                 * remove it from the txq queue and call cancel iocbs.
6039                 * Otherwise, call abort iotag.
6040                 */
6041                cmdiocb = dd_data->context_un.menlo.cmdiocbq;
6042                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
6043
6044                spin_lock_irqsave(&phba->hbalock, flags);
6045                list_for_each_entry_safe(check_iocb, next_iocb, &pring->txq,
6046                                         list) {
6047                        if (check_iocb == cmdiocb) {
6048                                list_move_tail(&check_iocb->list, &completions);
6049                                break;
6050                        }
6051                }
6052                if (list_empty(&completions))
6053                        lpfc_sli_issue_abort_iotag(phba, pring, cmdiocb, NULL);
6054                spin_unlock_irqrestore(&phba->hbalock, flags);
6055                if (!list_empty(&completions)) {
6056                        lpfc_sli_cancel_iocbs(phba, &completions,
6057                                              IOSTAT_LOCAL_REJECT,
6058                                              IOERR_SLI_ABORTED);
6059                }
6060                break;
6061        default:
6062                spin_unlock_irqrestore(&phba->ct_ev_lock, flags);
6063                break;
6064        }
6065
6066        /* scsi transport fc fc_bsg_job_timeout expects a zero return code,
6067         * otherwise an error message will be displayed on the console
6068         * so always return success (zero)
6069         */
6070        return rc;
6071}
6072