linux/drivers/scsi/elx/efct/efct_scsi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
   4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
   5 */
   6
   7#include "efct_driver.h"
   8#include "efct_hw.h"
   9
  10#define enable_tsend_auto_resp(efct)    1
  11#define enable_treceive_auto_resp(efct) 0
  12
  13#define SCSI_IOFMT "[%04x][i:%04x t:%04x h:%04x]"
  14
  15#define scsi_io_printf(io, fmt, ...) \
  16        efc_log_debug(io->efct, "[%s]" SCSI_IOFMT fmt, \
  17                io->node->display_name, io->instance_index,\
  18                io->init_task_tag, io->tgt_task_tag, io->hw_tag, ##__VA_ARGS__)
  19
  20#define EFCT_LOG_ENABLE_SCSI_TRACE(efct)                \
  21                (((efct) != NULL) ? (((efct)->logmask & (1U << 2)) != 0) : 0)
  22
  23#define scsi_io_trace(io, fmt, ...) \
  24        do { \
  25                if (EFCT_LOG_ENABLE_SCSI_TRACE(io->efct)) \
  26                        scsi_io_printf(io, fmt, ##__VA_ARGS__); \
  27        } while (0)
  28
  29struct efct_io *
  30efct_scsi_io_alloc(struct efct_node *node)
  31{
  32        struct efct *efct;
  33        struct efct_xport *xport;
  34        struct efct_io *io;
  35        unsigned long flags;
  36
  37        efct = node->efct;
  38
  39        xport = efct->xport;
  40
  41        spin_lock_irqsave(&node->active_ios_lock, flags);
  42
  43        io = efct_io_pool_io_alloc(efct->xport->io_pool);
  44        if (!io) {
  45                efc_log_err(efct, "IO alloc Failed\n");
  46                atomic_add_return(1, &xport->io_alloc_failed_count);
  47                return NULL;
  48        }
  49
  50        /* initialize refcount */
  51        kref_init(&io->ref);
  52        io->release = _efct_scsi_io_free;
  53
  54        /* set generic fields */
  55        io->efct = efct;
  56        io->node = node;
  57        kref_get(&node->ref);
  58
  59        /* set type and name */
  60        io->io_type = EFCT_IO_TYPE_IO;
  61        io->display_name = "scsi_io";
  62
  63        io->cmd_ini = false;
  64        io->cmd_tgt = true;
  65
  66        /* Add to node's active_ios list */
  67        INIT_LIST_HEAD(&io->list_entry);
  68        list_add(&io->list_entry, &node->active_ios);
  69
  70        spin_unlock_irqrestore(&node->active_ios_lock, flags);
  71
  72        return io;
  73}
  74
  75void
  76_efct_scsi_io_free(struct kref *arg)
  77{
  78        struct efct_io *io = container_of(arg, struct efct_io, ref);
  79        struct efct *efct = io->efct;
  80        struct efct_node *node = io->node;
  81        unsigned long flags = 0;
  82
  83        scsi_io_trace(io, "freeing io 0x%p %s\n", io, io->display_name);
  84
  85        if (io->io_free) {
  86                efc_log_err(efct, "IO already freed.\n");
  87                return;
  88        }
  89
  90        spin_lock_irqsave(&node->active_ios_lock, flags);
  91        list_del_init(&io->list_entry);
  92        spin_unlock_irqrestore(&node->active_ios_lock, flags);
  93
  94        kref_put(&node->ref, node->release);
  95        io->node = NULL;
  96        efct_io_pool_io_free(efct->xport->io_pool, io);
  97}
  98
  99void
 100efct_scsi_io_free(struct efct_io *io)
 101{
 102        scsi_io_trace(io, "freeing io 0x%p %s\n", io, io->display_name);
 103        WARN_ON(!refcount_read(&io->ref.refcount));
 104        kref_put(&io->ref, io->release);
 105}
 106
 107static void
 108efct_target_io_cb(struct efct_hw_io *hio, u32 length, int status,
 109                  u32 ext_status, void *app)
 110{
 111        u32 flags = 0;
 112        struct efct_io *io = app;
 113        struct efct *efct;
 114        enum efct_scsi_io_status scsi_stat = EFCT_SCSI_STATUS_GOOD;
 115        efct_scsi_io_cb_t cb;
 116
 117        if (!io || !io->efct) {
 118                pr_err("%s: IO can not be NULL\n", __func__);
 119                return;
 120        }
 121
 122        scsi_io_trace(io, "status x%x ext_status x%x\n", status, ext_status);
 123
 124        efct = io->efct;
 125
 126        io->transferred += length;
 127
 128        if (!io->scsi_tgt_cb) {
 129                efct_scsi_check_pending(efct);
 130                return;
 131        }
 132
 133        /* Call target server completion */
 134        cb = io->scsi_tgt_cb;
 135
 136        /* Clear the callback before invoking the callback */
 137        io->scsi_tgt_cb = NULL;
 138
 139        /* if status was good, and auto-good-response was set,
 140         * then callback target-server with IO_CMPL_RSP_SENT,
 141         * otherwise send IO_CMPL
 142         */
 143        if (status == 0 && io->auto_resp)
 144                flags |= EFCT_SCSI_IO_CMPL_RSP_SENT;
 145        else
 146                flags |= EFCT_SCSI_IO_CMPL;
 147
 148        switch (status) {
 149        case SLI4_FC_WCQE_STATUS_SUCCESS:
 150                scsi_stat = EFCT_SCSI_STATUS_GOOD;
 151                break;
 152        case SLI4_FC_WCQE_STATUS_DI_ERROR:
 153                if (ext_status & SLI4_FC_DI_ERROR_GE)
 154                        scsi_stat = EFCT_SCSI_STATUS_DIF_GUARD_ERR;
 155                else if (ext_status & SLI4_FC_DI_ERROR_AE)
 156                        scsi_stat = EFCT_SCSI_STATUS_DIF_APP_TAG_ERROR;
 157                else if (ext_status & SLI4_FC_DI_ERROR_RE)
 158                        scsi_stat = EFCT_SCSI_STATUS_DIF_REF_TAG_ERROR;
 159                else
 160                        scsi_stat = EFCT_SCSI_STATUS_DIF_UNKNOWN_ERROR;
 161                break;
 162        case SLI4_FC_WCQE_STATUS_LOCAL_REJECT:
 163                switch (ext_status) {
 164                case SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET:
 165                case SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED:
 166                        scsi_stat = EFCT_SCSI_STATUS_ABORTED;
 167                        break;
 168                case SLI4_FC_LOCAL_REJECT_INVALID_RPI:
 169                        scsi_stat = EFCT_SCSI_STATUS_NEXUS_LOST;
 170                        break;
 171                case SLI4_FC_LOCAL_REJECT_NO_XRI:
 172                        scsi_stat = EFCT_SCSI_STATUS_NO_IO;
 173                        break;
 174                default:
 175                        /*we have seen 0x0d(TX_DMA_FAILED err)*/
 176                        scsi_stat = EFCT_SCSI_STATUS_ERROR;
 177                        break;
 178                }
 179                break;
 180
 181        case SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT:
 182                /* target IO timed out */
 183                scsi_stat = EFCT_SCSI_STATUS_TIMEDOUT_AND_ABORTED;
 184                break;
 185
 186        case SLI4_FC_WCQE_STATUS_SHUTDOWN:
 187                /* Target IO cancelled by HW */
 188                scsi_stat = EFCT_SCSI_STATUS_SHUTDOWN;
 189                break;
 190
 191        default:
 192                scsi_stat = EFCT_SCSI_STATUS_ERROR;
 193                break;
 194        }
 195
 196        cb(io, scsi_stat, flags, io->scsi_tgt_cb_arg);
 197
 198        efct_scsi_check_pending(efct);
 199}
 200
 201static int
 202efct_scsi_build_sgls(struct efct_hw *hw, struct efct_hw_io *hio,
 203                     struct efct_scsi_sgl *sgl, u32 sgl_count,
 204                     enum efct_hw_io_type type)
 205{
 206        int rc;
 207        u32 i;
 208        struct efct *efct = hw->os;
 209
 210        /* Initialize HW SGL */
 211        rc = efct_hw_io_init_sges(hw, hio, type);
 212        if (rc) {
 213                efc_log_err(efct, "efct_hw_io_init_sges failed: %d\n", rc);
 214                return -EIO;
 215        }
 216
 217        for (i = 0; i < sgl_count; i++) {
 218                /* Add data SGE */
 219                rc = efct_hw_io_add_sge(hw, hio, sgl[i].addr, sgl[i].len);
 220                if (rc) {
 221                        efc_log_err(efct, "add sge failed cnt=%d rc=%d\n",
 222                                    sgl_count, rc);
 223                        return rc;
 224                }
 225        }
 226
 227        return 0;
 228}
 229
 230static void efc_log_sgl(struct efct_io *io)
 231{
 232        struct efct_hw_io *hio = io->hio;
 233        struct sli4_sge *data = NULL;
 234        u32 *dword = NULL;
 235        u32 i;
 236        u32 n_sge;
 237
 238        scsi_io_trace(io, "def_sgl at 0x%x 0x%08x\n",
 239                      upper_32_bits(hio->def_sgl.phys),
 240                      lower_32_bits(hio->def_sgl.phys));
 241        n_sge = (hio->sgl == &hio->def_sgl) ? hio->n_sge : hio->def_sgl_count;
 242        for (i = 0, data = hio->def_sgl.virt; i < n_sge; i++, data++) {
 243                dword = (u32 *)data;
 244
 245                scsi_io_trace(io, "SGL %2d 0x%08x 0x%08x 0x%08x 0x%08x\n",
 246                              i, dword[0], dword[1], dword[2], dword[3]);
 247
 248                if (dword[2] & (1U << 31))
 249                        break;
 250        }
 251}
 252
 253static void
 254efct_scsi_check_pending_async_cb(struct efct_hw *hw, int status,
 255                                 u8 *mqe, void *arg)
 256{
 257        struct efct_io *io = arg;
 258
 259        if (io) {
 260                efct_hw_done_t cb = io->hw_cb;
 261
 262                if (!io->hw_cb)
 263                        return;
 264
 265                io->hw_cb = NULL;
 266                (cb)(io->hio, 0, SLI4_FC_WCQE_STATUS_DISPATCH_ERROR, 0, io);
 267        }
 268}
 269
 270static int
 271efct_scsi_io_dispatch_hw_io(struct efct_io *io, struct efct_hw_io *hio)
 272{
 273        int rc = 0;
 274        struct efct *efct = io->efct;
 275
 276        /* Got a HW IO;
 277         * update ini/tgt_task_tag with HW IO info and dispatch
 278         */
 279        io->hio = hio;
 280        if (io->cmd_tgt)
 281                io->tgt_task_tag = hio->indicator;
 282        else if (io->cmd_ini)
 283                io->init_task_tag = hio->indicator;
 284        io->hw_tag = hio->reqtag;
 285
 286        hio->eq = io->hw_priv;
 287
 288        /* Copy WQ steering */
 289        switch (io->wq_steering) {
 290        case EFCT_SCSI_WQ_STEERING_CLASS >> EFCT_SCSI_WQ_STEERING_SHIFT:
 291                hio->wq_steering = EFCT_HW_WQ_STEERING_CLASS;
 292                break;
 293        case EFCT_SCSI_WQ_STEERING_REQUEST >> EFCT_SCSI_WQ_STEERING_SHIFT:
 294                hio->wq_steering = EFCT_HW_WQ_STEERING_REQUEST;
 295                break;
 296        case EFCT_SCSI_WQ_STEERING_CPU >> EFCT_SCSI_WQ_STEERING_SHIFT:
 297                hio->wq_steering = EFCT_HW_WQ_STEERING_CPU;
 298                break;
 299        }
 300
 301        switch (io->io_type) {
 302        case EFCT_IO_TYPE_IO:
 303                rc = efct_scsi_build_sgls(&efct->hw, io->hio,
 304                                          io->sgl, io->sgl_count, io->hio_type);
 305                if (rc)
 306                        break;
 307
 308                if (EFCT_LOG_ENABLE_SCSI_TRACE(efct))
 309                        efc_log_sgl(io);
 310
 311                if (io->app_id)
 312                        io->iparam.fcp_tgt.app_id = io->app_id;
 313
 314                io->iparam.fcp_tgt.vpi = io->node->vpi;
 315                io->iparam.fcp_tgt.rpi = io->node->rpi;
 316                io->iparam.fcp_tgt.s_id = io->node->port_fc_id;
 317                io->iparam.fcp_tgt.d_id = io->node->node_fc_id;
 318                io->iparam.fcp_tgt.xmit_len = io->wire_len;
 319
 320                rc = efct_hw_io_send(&io->efct->hw, io->hio_type, io->hio,
 321                                     &io->iparam, io->hw_cb, io);
 322                break;
 323        default:
 324                scsi_io_printf(io, "Unknown IO type=%d\n", io->io_type);
 325                rc = -EIO;
 326                break;
 327        }
 328        return rc;
 329}
 330
 331static int
 332efct_scsi_io_dispatch_no_hw_io(struct efct_io *io)
 333{
 334        int rc;
 335
 336        switch (io->io_type) {
 337        case EFCT_IO_TYPE_ABORT: {
 338                struct efct_hw_io *hio_to_abort = NULL;
 339
 340                hio_to_abort = io->io_to_abort->hio;
 341
 342                if (!hio_to_abort) {
 343                        /*
 344                         * If "IO to abort" does not have an
 345                         * associated HW IO, immediately make callback with
 346                         * success. The command must have been sent to
 347                         * the backend, but the data phase has not yet
 348                         * started, so we don't have a HW IO.
 349                         *
 350                         * Note: since the backend shims should be
 351                         * taking a reference on io_to_abort, it should not
 352                         * be possible to have been completed and freed by
 353                         * the backend before the abort got here.
 354                         */
 355                        scsi_io_printf(io, "IO: not active\n");
 356                        ((efct_hw_done_t)io->hw_cb)(io->hio, 0,
 357                                        SLI4_FC_WCQE_STATUS_SUCCESS, 0, io);
 358                        rc = 0;
 359                        break;
 360                }
 361
 362                /* HW IO is valid, abort it */
 363                scsi_io_printf(io, "aborting\n");
 364                rc = efct_hw_io_abort(&io->efct->hw, hio_to_abort,
 365                                      io->send_abts, io->hw_cb, io);
 366                if (rc) {
 367                        int status = SLI4_FC_WCQE_STATUS_SUCCESS;
 368                        efct_hw_done_t cb = io->hw_cb;
 369
 370                        if (rc != -ENOENT && rc != -EINPROGRESS) {
 371                                status = -1;
 372                                scsi_io_printf(io, "Failed to abort IO rc=%d\n",
 373                                               rc);
 374                        }
 375                        cb(io->hio, 0, status, 0, io);
 376                        rc = 0;
 377                }
 378
 379                break;
 380        }
 381        default:
 382                scsi_io_printf(io, "Unknown IO type=%d\n", io->io_type);
 383                rc = -EIO;
 384                break;
 385        }
 386        return rc;
 387}
 388
 389static struct efct_io *
 390efct_scsi_dispatch_pending(struct efct *efct)
 391{
 392        struct efct_xport *xport = efct->xport;
 393        struct efct_io *io = NULL;
 394        struct efct_hw_io *hio;
 395        unsigned long flags = 0;
 396        int status;
 397
 398        spin_lock_irqsave(&xport->io_pending_lock, flags);
 399
 400        if (!list_empty(&xport->io_pending_list)) {
 401                io = list_first_entry(&xport->io_pending_list, struct efct_io,
 402                                      io_pending_link);
 403                list_del_init(&io->io_pending_link);
 404        }
 405
 406        if (!io) {
 407                spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 408                return NULL;
 409        }
 410
 411        if (io->io_type == EFCT_IO_TYPE_ABORT) {
 412                hio = NULL;
 413        } else {
 414                hio = efct_hw_io_alloc(&efct->hw);
 415                if (!hio) {
 416                        /*
 417                         * No HW IO available.Put IO back on
 418                         * the front of pending list
 419                         */
 420                        list_add(&xport->io_pending_list, &io->io_pending_link);
 421                        io = NULL;
 422                } else {
 423                        hio->eq = io->hw_priv;
 424                }
 425        }
 426
 427        /* Must drop the lock before dispatching the IO */
 428        spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 429
 430        if (!io)
 431                return NULL;
 432
 433        /*
 434         * We pulled an IO off the pending list,
 435         * and either got an HW IO or don't need one
 436         */
 437        atomic_sub_return(1, &xport->io_pending_count);
 438        if (!hio)
 439                status = efct_scsi_io_dispatch_no_hw_io(io);
 440        else
 441                status = efct_scsi_io_dispatch_hw_io(io, hio);
 442        if (status) {
 443                /*
 444                 * Invoke the HW callback, but do so in the
 445                 * separate execution context,provided by the
 446                 * NOP mailbox completion processing context
 447                 * by using efct_hw_async_call()
 448                 */
 449                if (efct_hw_async_call(&efct->hw,
 450                                       efct_scsi_check_pending_async_cb, io)) {
 451                        efc_log_debug(efct, "call hw async failed\n");
 452                }
 453        }
 454
 455        return io;
 456}
 457
 458void
 459efct_scsi_check_pending(struct efct *efct)
 460{
 461        struct efct_xport *xport = efct->xport;
 462        struct efct_io *io = NULL;
 463        int count = 0;
 464        unsigned long flags = 0;
 465        int dispatch = 0;
 466
 467        /* Guard against recursion */
 468        if (atomic_add_return(1, &xport->io_pending_recursing)) {
 469                /* This function is already running.  Decrement and return. */
 470                atomic_sub_return(1, &xport->io_pending_recursing);
 471                return;
 472        }
 473
 474        while (efct_scsi_dispatch_pending(efct))
 475                count++;
 476
 477        if (count) {
 478                atomic_sub_return(1, &xport->io_pending_recursing);
 479                return;
 480        }
 481
 482        /*
 483         * If nothing was removed from the list,
 484         * we might be in a case where we need to abort an
 485         * active IO and the abort is on the pending list.
 486         * Look for an abort we can dispatch.
 487         */
 488
 489        spin_lock_irqsave(&xport->io_pending_lock, flags);
 490
 491        list_for_each_entry(io, &xport->io_pending_list, io_pending_link) {
 492                if (io->io_type == EFCT_IO_TYPE_ABORT && io->io_to_abort->hio) {
 493                        /* This IO has a HW IO, so it is
 494                         * active.  Dispatch the abort.
 495                         */
 496                        dispatch = 1;
 497                        list_del_init(&io->io_pending_link);
 498                        atomic_sub_return(1, &xport->io_pending_count);
 499                        break;
 500                }
 501        }
 502
 503        spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 504
 505        if (dispatch) {
 506                if (efct_scsi_io_dispatch_no_hw_io(io)) {
 507                        if (efct_hw_async_call(&efct->hw,
 508                                efct_scsi_check_pending_async_cb, io)) {
 509                                efc_log_debug(efct, "hw async failed\n");
 510                        }
 511                }
 512        }
 513
 514        atomic_sub_return(1, &xport->io_pending_recursing);
 515}
 516
 517int
 518efct_scsi_io_dispatch(struct efct_io *io, void *cb)
 519{
 520        struct efct_hw_io *hio;
 521        struct efct *efct = io->efct;
 522        struct efct_xport *xport = efct->xport;
 523        unsigned long flags = 0;
 524
 525        io->hw_cb = cb;
 526
 527        /*
 528         * if this IO already has a HW IO, then this is either
 529         * not the first phase of the IO. Send it to the HW.
 530         */
 531        if (io->hio)
 532                return efct_scsi_io_dispatch_hw_io(io, io->hio);
 533
 534        /*
 535         * We don't already have a HW IO associated with the IO. First check
 536         * the pending list. If not empty, add IO to the tail and process the
 537         * pending list.
 538         */
 539        spin_lock_irqsave(&xport->io_pending_lock, flags);
 540        if (!list_empty(&xport->io_pending_list)) {
 541                /*
 542                 * If this is a low latency request,
 543                 * the put at the front of the IO pending
 544                 * queue, otherwise put it at the end of the queue.
 545                 */
 546                if (io->low_latency) {
 547                        INIT_LIST_HEAD(&io->io_pending_link);
 548                        list_add(&xport->io_pending_list, &io->io_pending_link);
 549                } else {
 550                        INIT_LIST_HEAD(&io->io_pending_link);
 551                        list_add_tail(&io->io_pending_link,
 552                                      &xport->io_pending_list);
 553                }
 554                spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 555                atomic_add_return(1, &xport->io_pending_count);
 556                atomic_add_return(1, &xport->io_total_pending);
 557
 558                /* process pending list */
 559                efct_scsi_check_pending(efct);
 560                return 0;
 561        }
 562        spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 563
 564        /*
 565         * We don't have a HW IO associated with the IO and there's nothing
 566         * on the pending list. Attempt to allocate a HW IO and dispatch it.
 567         */
 568        hio = efct_hw_io_alloc(&io->efct->hw);
 569        if (!hio) {
 570                /* Couldn't get a HW IO. Save this IO on the pending list */
 571                spin_lock_irqsave(&xport->io_pending_lock, flags);
 572                INIT_LIST_HEAD(&io->io_pending_link);
 573                list_add_tail(&io->io_pending_link, &xport->io_pending_list);
 574                spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 575
 576                atomic_add_return(1, &xport->io_total_pending);
 577                atomic_add_return(1, &xport->io_pending_count);
 578                return 0;
 579        }
 580
 581        /* We successfully allocated a HW IO; dispatch to HW */
 582        return efct_scsi_io_dispatch_hw_io(io, hio);
 583}
 584
 585int
 586efct_scsi_io_dispatch_abort(struct efct_io *io, void *cb)
 587{
 588        struct efct *efct = io->efct;
 589        struct efct_xport *xport = efct->xport;
 590        unsigned long flags = 0;
 591
 592        io->hw_cb = cb;
 593
 594        /*
 595         * For aborts, we don't need a HW IO, but we still want
 596         * to pass through the pending list to preserve ordering.
 597         * Thus, if the pending list is not empty, add this abort
 598         * to the pending list and process the pending list.
 599         */
 600        spin_lock_irqsave(&xport->io_pending_lock, flags);
 601        if (!list_empty(&xport->io_pending_list)) {
 602                INIT_LIST_HEAD(&io->io_pending_link);
 603                list_add_tail(&io->io_pending_link, &xport->io_pending_list);
 604                spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 605                atomic_add_return(1, &xport->io_pending_count);
 606                atomic_add_return(1, &xport->io_total_pending);
 607
 608                /* process pending list */
 609                efct_scsi_check_pending(efct);
 610                return 0;
 611        }
 612        spin_unlock_irqrestore(&xport->io_pending_lock, flags);
 613
 614        /* nothing on pending list, dispatch abort */
 615        return efct_scsi_io_dispatch_no_hw_io(io);
 616}
 617
 618static inline int
 619efct_scsi_xfer_data(struct efct_io *io, u32 flags,
 620                    struct efct_scsi_sgl *sgl, u32 sgl_count, u64 xwire_len,
 621                    enum efct_hw_io_type type, int enable_ar,
 622                    efct_scsi_io_cb_t cb, void *arg)
 623{
 624        struct efct *efct;
 625        size_t residual = 0;
 626
 627        io->sgl_count = sgl_count;
 628
 629        efct = io->efct;
 630
 631        scsi_io_trace(io, "%s wire_len %llu\n",
 632                      (type == EFCT_HW_IO_TARGET_READ) ? "send" : "recv",
 633                      xwire_len);
 634
 635        io->hio_type = type;
 636
 637        io->scsi_tgt_cb = cb;
 638        io->scsi_tgt_cb_arg = arg;
 639
 640        residual = io->exp_xfer_len - io->transferred;
 641        io->wire_len = (xwire_len < residual) ? xwire_len : residual;
 642        residual = (xwire_len - io->wire_len);
 643
 644        memset(&io->iparam, 0, sizeof(io->iparam));
 645        io->iparam.fcp_tgt.ox_id = io->init_task_tag;
 646        io->iparam.fcp_tgt.offset = io->transferred;
 647        io->iparam.fcp_tgt.cs_ctl = io->cs_ctl;
 648        io->iparam.fcp_tgt.timeout = io->timeout;
 649
 650        /* if this is the last data phase and there is no residual, enable
 651         * auto-good-response
 652         */
 653        if (enable_ar && (flags & EFCT_SCSI_LAST_DATAPHASE) && residual == 0 &&
 654            ((io->transferred + io->wire_len) == io->exp_xfer_len) &&
 655            (!(flags & EFCT_SCSI_NO_AUTO_RESPONSE))) {
 656                io->iparam.fcp_tgt.flags |= SLI4_IO_AUTO_GOOD_RESPONSE;
 657                io->auto_resp = true;
 658        } else {
 659                io->auto_resp = false;
 660        }
 661
 662        /* save this transfer length */
 663        io->xfer_req = io->wire_len;
 664
 665        /* Adjust the transferred count to account for overrun
 666         * when the residual is calculated in efct_scsi_send_resp
 667         */
 668        io->transferred += residual;
 669
 670        /* Adjust the SGL size if there is overrun */
 671
 672        if (residual) {
 673                struct efct_scsi_sgl  *sgl_ptr = &io->sgl[sgl_count - 1];
 674
 675                while (residual) {
 676                        size_t len = sgl_ptr->len;
 677
 678                        if (len > residual) {
 679                                sgl_ptr->len = len - residual;
 680                                residual = 0;
 681                        } else {
 682                                sgl_ptr->len = 0;
 683                                residual -= len;
 684                                io->sgl_count--;
 685                        }
 686                        sgl_ptr--;
 687                }
 688        }
 689
 690        /* Set latency and WQ steering */
 691        io->low_latency = (flags & EFCT_SCSI_LOW_LATENCY) != 0;
 692        io->wq_steering = (flags & EFCT_SCSI_WQ_STEERING_MASK) >>
 693                                EFCT_SCSI_WQ_STEERING_SHIFT;
 694        io->wq_class = (flags & EFCT_SCSI_WQ_CLASS_MASK) >>
 695                                EFCT_SCSI_WQ_CLASS_SHIFT;
 696
 697        if (efct->xport) {
 698                struct efct_xport *xport = efct->xport;
 699
 700                if (type == EFCT_HW_IO_TARGET_READ) {
 701                        xport->fcp_stats.input_requests++;
 702                        xport->fcp_stats.input_bytes += xwire_len;
 703                } else if (type == EFCT_HW_IO_TARGET_WRITE) {
 704                        xport->fcp_stats.output_requests++;
 705                        xport->fcp_stats.output_bytes += xwire_len;
 706                }
 707        }
 708        return efct_scsi_io_dispatch(io, efct_target_io_cb);
 709}
 710
 711int
 712efct_scsi_send_rd_data(struct efct_io *io, u32 flags,
 713                       struct efct_scsi_sgl *sgl, u32 sgl_count, u64 len,
 714                       efct_scsi_io_cb_t cb, void *arg)
 715{
 716        return efct_scsi_xfer_data(io, flags, sgl, sgl_count,
 717                                   len, EFCT_HW_IO_TARGET_READ,
 718                                   enable_tsend_auto_resp(io->efct), cb, arg);
 719}
 720
 721int
 722efct_scsi_recv_wr_data(struct efct_io *io, u32 flags,
 723                       struct efct_scsi_sgl *sgl, u32 sgl_count, u64 len,
 724                       efct_scsi_io_cb_t cb, void *arg)
 725{
 726        return efct_scsi_xfer_data(io, flags, sgl, sgl_count, len,
 727                                   EFCT_HW_IO_TARGET_WRITE,
 728                                   enable_treceive_auto_resp(io->efct), cb, arg);
 729}
 730
 731int
 732efct_scsi_send_resp(struct efct_io *io, u32 flags,
 733                    struct efct_scsi_cmd_resp *rsp,
 734                    efct_scsi_io_cb_t cb, void *arg)
 735{
 736        struct efct *efct;
 737        int residual;
 738        /* Always try auto resp */
 739        bool auto_resp = true;
 740        u8 scsi_status = 0;
 741        u16 scsi_status_qualifier = 0;
 742        u8 *sense_data = NULL;
 743        u32 sense_data_length = 0;
 744
 745        efct = io->efct;
 746
 747        if (rsp) {
 748                scsi_status = rsp->scsi_status;
 749                scsi_status_qualifier = rsp->scsi_status_qualifier;
 750                sense_data = rsp->sense_data;
 751                sense_data_length = rsp->sense_data_length;
 752                residual = rsp->residual;
 753        } else {
 754                residual = io->exp_xfer_len - io->transferred;
 755        }
 756
 757        io->wire_len = 0;
 758        io->hio_type = EFCT_HW_IO_TARGET_RSP;
 759
 760        io->scsi_tgt_cb = cb;
 761        io->scsi_tgt_cb_arg = arg;
 762
 763        memset(&io->iparam, 0, sizeof(io->iparam));
 764        io->iparam.fcp_tgt.ox_id = io->init_task_tag;
 765        io->iparam.fcp_tgt.offset = 0;
 766        io->iparam.fcp_tgt.cs_ctl = io->cs_ctl;
 767        io->iparam.fcp_tgt.timeout = io->timeout;
 768
 769        /* Set low latency queueing request */
 770        io->low_latency = (flags & EFCT_SCSI_LOW_LATENCY) != 0;
 771        io->wq_steering = (flags & EFCT_SCSI_WQ_STEERING_MASK) >>
 772                                EFCT_SCSI_WQ_STEERING_SHIFT;
 773        io->wq_class = (flags & EFCT_SCSI_WQ_CLASS_MASK) >>
 774                                EFCT_SCSI_WQ_CLASS_SHIFT;
 775
 776        if (scsi_status != 0 || residual || sense_data_length) {
 777                struct fcp_resp_with_ext *fcprsp = io->rspbuf.virt;
 778                u8 *sns_data;
 779
 780                if (!fcprsp) {
 781                        efc_log_err(efct, "NULL response buffer\n");
 782                        return -EIO;
 783                }
 784
 785                sns_data = (u8 *)io->rspbuf.virt + sizeof(*fcprsp);
 786
 787                auto_resp = false;
 788
 789                memset(fcprsp, 0, sizeof(*fcprsp));
 790
 791                io->wire_len += sizeof(*fcprsp);
 792
 793                fcprsp->resp.fr_status = scsi_status;
 794                fcprsp->resp.fr_retry_delay =
 795                        cpu_to_be16(scsi_status_qualifier);
 796
 797                /* set residual status if necessary */
 798                if (residual != 0) {
 799                        /* FCP: if data transferred is less than the
 800                         * amount expected, then this is an underflow.
 801                         * If data transferred would have been greater
 802                         * than the amount expected this is an overflow
 803                         */
 804                        if (residual > 0) {
 805                                fcprsp->resp.fr_flags |= FCP_RESID_UNDER;
 806                                fcprsp->ext.fr_resid =  cpu_to_be32(residual);
 807                        } else {
 808                                fcprsp->resp.fr_flags |= FCP_RESID_OVER;
 809                                fcprsp->ext.fr_resid = cpu_to_be32(-residual);
 810                        }
 811                }
 812
 813                if (EFCT_SCSI_SNS_BUF_VALID(sense_data) && sense_data_length) {
 814                        if (sense_data_length > SCSI_SENSE_BUFFERSIZE) {
 815                                efc_log_err(efct, "Sense exceeds max size.\n");
 816                                return -EIO;
 817                        }
 818
 819                        fcprsp->resp.fr_flags |= FCP_SNS_LEN_VAL;
 820                        memcpy(sns_data, sense_data, sense_data_length);
 821                        fcprsp->ext.fr_sns_len = cpu_to_be32(sense_data_length);
 822                        io->wire_len += sense_data_length;
 823                }
 824
 825                io->sgl[0].addr = io->rspbuf.phys;
 826                io->sgl[0].dif_addr = 0;
 827                io->sgl[0].len = io->wire_len;
 828                io->sgl_count = 1;
 829        }
 830
 831        if (auto_resp)
 832                io->iparam.fcp_tgt.flags |= SLI4_IO_AUTO_GOOD_RESPONSE;
 833
 834        return efct_scsi_io_dispatch(io, efct_target_io_cb);
 835}
 836
 837static int
 838efct_target_bls_resp_cb(struct efct_hw_io *hio, u32 length, int status,
 839                        u32 ext_status, void *app)
 840{
 841        struct efct_io *io = app;
 842        struct efct *efct;
 843        enum efct_scsi_io_status bls_status;
 844
 845        efct = io->efct;
 846
 847        /* BLS isn't really a "SCSI" concept, but use SCSI status */
 848        if (status) {
 849                io_error_log(io, "s=%#x x=%#x\n", status, ext_status);
 850                bls_status = EFCT_SCSI_STATUS_ERROR;
 851        } else {
 852                bls_status = EFCT_SCSI_STATUS_GOOD;
 853        }
 854
 855        if (io->bls_cb) {
 856                efct_scsi_io_cb_t bls_cb = io->bls_cb;
 857                void *bls_cb_arg = io->bls_cb_arg;
 858
 859                io->bls_cb = NULL;
 860                io->bls_cb_arg = NULL;
 861
 862                /* invoke callback */
 863                bls_cb(io, bls_status, 0, bls_cb_arg);
 864        }
 865
 866        efct_scsi_check_pending(efct);
 867        return 0;
 868}
 869
 870static int
 871efct_target_send_bls_resp(struct efct_io *io,
 872                          efct_scsi_io_cb_t cb, void *arg)
 873{
 874        struct efct_node *node = io->node;
 875        struct sli_bls_params *bls = &io->iparam.bls;
 876        struct efct *efct = node->efct;
 877        struct fc_ba_acc *acc;
 878        int rc;
 879
 880        /* fill out IO structure with everything needed to send BA_ACC */
 881        memset(&io->iparam, 0, sizeof(io->iparam));
 882        bls->ox_id = io->init_task_tag;
 883        bls->rx_id = io->abort_rx_id;
 884        bls->vpi = io->node->vpi;
 885        bls->rpi = io->node->rpi;
 886        bls->s_id = U32_MAX;
 887        bls->d_id = io->node->node_fc_id;
 888        bls->rpi_registered = true;
 889
 890        acc = (void *)bls->payload;
 891        acc->ba_ox_id = cpu_to_be16(bls->ox_id);
 892        acc->ba_rx_id = cpu_to_be16(bls->rx_id);
 893        acc->ba_high_seq_cnt = cpu_to_be16(U16_MAX);
 894
 895        /* generic io fields have already been populated */
 896
 897        /* set type and BLS-specific fields */
 898        io->io_type = EFCT_IO_TYPE_BLS_RESP;
 899        io->display_name = "bls_rsp";
 900        io->hio_type = EFCT_HW_BLS_ACC;
 901        io->bls_cb = cb;
 902        io->bls_cb_arg = arg;
 903
 904        /* dispatch IO */
 905        rc = efct_hw_bls_send(efct, FC_RCTL_BA_ACC, bls,
 906                              efct_target_bls_resp_cb, io);
 907        return rc;
 908}
 909
 910static int efct_bls_send_rjt_cb(struct efct_hw_io *hio, u32 length, int status,
 911                                u32 ext_status, void *app)
 912{
 913        struct efct_io *io = app;
 914
 915        efct_scsi_io_free(io);
 916        return 0;
 917}
 918
 919struct efct_io *
 920efct_bls_send_rjt(struct efct_io *io, struct fc_frame_header *hdr)
 921{
 922        struct efct_node *node = io->node;
 923        struct sli_bls_params *bls = &io->iparam.bls;
 924        struct efct *efct = node->efct;
 925        struct fc_ba_rjt *acc;
 926        int rc;
 927
 928        /* fill out BLS Response-specific fields */
 929        io->io_type = EFCT_IO_TYPE_BLS_RESP;
 930        io->display_name = "ba_rjt";
 931        io->hio_type = EFCT_HW_BLS_RJT;
 932        io->init_task_tag = be16_to_cpu(hdr->fh_ox_id);
 933
 934        /* fill out iparam fields */
 935        memset(&io->iparam, 0, sizeof(io->iparam));
 936        bls->ox_id = be16_to_cpu(hdr->fh_ox_id);
 937        bls->rx_id = be16_to_cpu(hdr->fh_rx_id);
 938        bls->vpi = io->node->vpi;
 939        bls->rpi = io->node->rpi;
 940        bls->s_id = U32_MAX;
 941        bls->d_id = io->node->node_fc_id;
 942        bls->rpi_registered = true;
 943
 944        acc = (void *)bls->payload;
 945        acc->br_reason = ELS_RJT_UNAB;
 946        acc->br_explan = ELS_EXPL_NONE;
 947
 948        rc = efct_hw_bls_send(efct, FC_RCTL_BA_RJT, bls, efct_bls_send_rjt_cb,
 949                              io);
 950        if (rc) {
 951                efc_log_err(efct, "efct_scsi_io_dispatch() failed: %d\n", rc);
 952                efct_scsi_io_free(io);
 953                io = NULL;
 954        }
 955        return io;
 956}
 957
 958int
 959efct_scsi_send_tmf_resp(struct efct_io *io,
 960                        enum efct_scsi_tmf_resp rspcode,
 961                        u8 addl_rsp_info[3],
 962                        efct_scsi_io_cb_t cb, void *arg)
 963{
 964        int rc;
 965        struct {
 966                struct fcp_resp_with_ext rsp_ext;
 967                struct fcp_resp_rsp_info info;
 968        } *fcprsp;
 969        u8 fcp_rspcode;
 970
 971        io->wire_len = 0;
 972
 973        switch (rspcode) {
 974        case EFCT_SCSI_TMF_FUNCTION_COMPLETE:
 975                fcp_rspcode = FCP_TMF_CMPL;
 976                break;
 977        case EFCT_SCSI_TMF_FUNCTION_SUCCEEDED:
 978        case EFCT_SCSI_TMF_FUNCTION_IO_NOT_FOUND:
 979                fcp_rspcode = FCP_TMF_CMPL;
 980                break;
 981        case EFCT_SCSI_TMF_FUNCTION_REJECTED:
 982                fcp_rspcode = FCP_TMF_REJECTED;
 983                break;
 984        case EFCT_SCSI_TMF_INCORRECT_LOGICAL_UNIT_NUMBER:
 985                fcp_rspcode = FCP_TMF_INVALID_LUN;
 986                break;
 987        case EFCT_SCSI_TMF_SERVICE_DELIVERY:
 988                fcp_rspcode = FCP_TMF_FAILED;
 989                break;
 990        default:
 991                fcp_rspcode = FCP_TMF_REJECTED;
 992                break;
 993        }
 994
 995        io->hio_type = EFCT_HW_IO_TARGET_RSP;
 996
 997        io->scsi_tgt_cb = cb;
 998        io->scsi_tgt_cb_arg = arg;
 999
1000        if (io->tmf_cmd == EFCT_SCSI_TMF_ABORT_TASK) {
1001                rc = efct_target_send_bls_resp(io, cb, arg);
1002                return rc;
1003        }
1004
1005        /* populate the FCP TMF response */
1006        fcprsp = io->rspbuf.virt;
1007        memset(fcprsp, 0, sizeof(*fcprsp));
1008
1009        fcprsp->rsp_ext.resp.fr_flags |= FCP_SNS_LEN_VAL;
1010
1011        if (addl_rsp_info) {
1012                memcpy(fcprsp->info._fr_resvd, addl_rsp_info,
1013                       sizeof(fcprsp->info._fr_resvd));
1014        }
1015        fcprsp->info.rsp_code = fcp_rspcode;
1016
1017        io->wire_len = sizeof(*fcprsp);
1018
1019        fcprsp->rsp_ext.ext.fr_rsp_len =
1020                        cpu_to_be32(sizeof(struct fcp_resp_rsp_info));
1021
1022        io->sgl[0].addr = io->rspbuf.phys;
1023        io->sgl[0].dif_addr = 0;
1024        io->sgl[0].len = io->wire_len;
1025        io->sgl_count = 1;
1026
1027        memset(&io->iparam, 0, sizeof(io->iparam));
1028        io->iparam.fcp_tgt.ox_id = io->init_task_tag;
1029        io->iparam.fcp_tgt.offset = 0;
1030        io->iparam.fcp_tgt.cs_ctl = io->cs_ctl;
1031        io->iparam.fcp_tgt.timeout = io->timeout;
1032
1033        rc = efct_scsi_io_dispatch(io, efct_target_io_cb);
1034
1035        return rc;
1036}
1037
1038static int
1039efct_target_abort_cb(struct efct_hw_io *hio, u32 length, int status,
1040                     u32 ext_status, void *app)
1041{
1042        struct efct_io *io = app;
1043        struct efct *efct;
1044        enum efct_scsi_io_status scsi_status;
1045        efct_scsi_io_cb_t abort_cb;
1046        void *abort_cb_arg;
1047
1048        efct = io->efct;
1049
1050        if (!io->abort_cb)
1051                goto done;
1052
1053        abort_cb = io->abort_cb;
1054        abort_cb_arg = io->abort_cb_arg;
1055
1056        io->abort_cb = NULL;
1057        io->abort_cb_arg = NULL;
1058
1059        switch (status) {
1060        case SLI4_FC_WCQE_STATUS_SUCCESS:
1061                scsi_status = EFCT_SCSI_STATUS_GOOD;
1062                break;
1063        case SLI4_FC_WCQE_STATUS_LOCAL_REJECT:
1064                switch (ext_status) {
1065                case SLI4_FC_LOCAL_REJECT_NO_XRI:
1066                        scsi_status = EFCT_SCSI_STATUS_NO_IO;
1067                        break;
1068                case SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS:
1069                        scsi_status = EFCT_SCSI_STATUS_ABORT_IN_PROGRESS;
1070                        break;
1071                default:
1072                        /*we have seen 0x15 (abort in progress)*/
1073                        scsi_status = EFCT_SCSI_STATUS_ERROR;
1074                        break;
1075                }
1076                break;
1077        case SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE:
1078                scsi_status = EFCT_SCSI_STATUS_CHECK_RESPONSE;
1079                break;
1080        default:
1081                scsi_status = EFCT_SCSI_STATUS_ERROR;
1082                break;
1083        }
1084        /* invoke callback */
1085        abort_cb(io->io_to_abort, scsi_status, 0, abort_cb_arg);
1086
1087done:
1088        /* done with IO to abort,efct_ref_get(): efct_scsi_tgt_abort_io() */
1089        kref_put(&io->io_to_abort->ref, io->io_to_abort->release);
1090
1091        efct_io_pool_io_free(efct->xport->io_pool, io);
1092
1093        efct_scsi_check_pending(efct);
1094        return 0;
1095}
1096
1097int
1098efct_scsi_tgt_abort_io(struct efct_io *io, efct_scsi_io_cb_t cb, void *arg)
1099{
1100        struct efct *efct;
1101        struct efct_xport *xport;
1102        int rc;
1103        struct efct_io *abort_io = NULL;
1104
1105        efct = io->efct;
1106        xport = efct->xport;
1107
1108        /* take a reference on IO being aborted */
1109        if (kref_get_unless_zero(&io->ref) == 0) {
1110                /* command no longer active */
1111                scsi_io_printf(io, "command no longer active\n");
1112                return -EIO;
1113        }
1114
1115        /*
1116         * allocate a new IO to send the abort request. Use efct_io_alloc()
1117         * directly, as we need an IO object that will not fail allocation
1118         * due to allocations being disabled (in efct_scsi_io_alloc())
1119         */
1120        abort_io = efct_io_pool_io_alloc(efct->xport->io_pool);
1121        if (!abort_io) {
1122                atomic_add_return(1, &xport->io_alloc_failed_count);
1123                kref_put(&io->ref, io->release);
1124                return -EIO;
1125        }
1126
1127        /* Save the target server callback and argument */
1128        /* set generic fields */
1129        abort_io->cmd_tgt = true;
1130        abort_io->node = io->node;
1131
1132        /* set type and abort-specific fields */
1133        abort_io->io_type = EFCT_IO_TYPE_ABORT;
1134        abort_io->display_name = "tgt_abort";
1135        abort_io->io_to_abort = io;
1136        abort_io->send_abts = false;
1137        abort_io->abort_cb = cb;
1138        abort_io->abort_cb_arg = arg;
1139
1140        /* now dispatch IO */
1141        rc = efct_scsi_io_dispatch_abort(abort_io, efct_target_abort_cb);
1142        if (rc)
1143                kref_put(&io->ref, io->release);
1144        return rc;
1145}
1146
1147void
1148efct_scsi_io_complete(struct efct_io *io)
1149{
1150        if (io->io_free) {
1151                efc_log_debug(io->efct, "completion for non-busy io tag 0x%x\n",
1152                              io->tag);
1153                return;
1154        }
1155
1156        scsi_io_trace(io, "freeing io 0x%p %s\n", io, io->display_name);
1157        kref_put(&io->ref, io->release);
1158}
1159