linux/drivers/s390/scsi/zfcp_fsf.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * zfcp device driver
   4 *
   5 * Implementation of FSF commands.
   6 *
   7 * Copyright IBM Corp. 2002, 2017
   8 */
   9
  10#define KMSG_COMPONENT "zfcp"
  11#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  12
  13#include <linux/blktrace_api.h>
  14#include <linux/slab.h>
  15#include <scsi/fc/fc_els.h>
  16#include "zfcp_ext.h"
  17#include "zfcp_fc.h"
  18#include "zfcp_dbf.h"
  19#include "zfcp_qdio.h"
  20#include "zfcp_reqlist.h"
  21
  22struct kmem_cache *zfcp_fsf_qtcb_cache;
  23
  24static void zfcp_fsf_request_timeout_handler(struct timer_list *t)
  25{
  26        struct zfcp_fsf_req *fsf_req = from_timer(fsf_req, t, timer);
  27        struct zfcp_adapter *adapter = fsf_req->adapter;
  28
  29        zfcp_qdio_siosl(adapter);
  30        zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
  31                                "fsrth_1");
  32}
  33
  34static void zfcp_fsf_start_timer(struct zfcp_fsf_req *fsf_req,
  35                                 unsigned long timeout)
  36{
  37        fsf_req->timer.function = zfcp_fsf_request_timeout_handler;
  38        fsf_req->timer.expires = jiffies + timeout;
  39        add_timer(&fsf_req->timer);
  40}
  41
  42static void zfcp_fsf_start_erp_timer(struct zfcp_fsf_req *fsf_req)
  43{
  44        BUG_ON(!fsf_req->erp_action);
  45        fsf_req->timer.function = zfcp_erp_timeout_handler;
  46        fsf_req->timer.expires = jiffies + 30 * HZ;
  47        add_timer(&fsf_req->timer);
  48}
  49
  50/* association between FSF command and FSF QTCB type */
  51static u32 fsf_qtcb_type[] = {
  52        [FSF_QTCB_FCP_CMND] =             FSF_IO_COMMAND,
  53        [FSF_QTCB_ABORT_FCP_CMND] =       FSF_SUPPORT_COMMAND,
  54        [FSF_QTCB_OPEN_PORT_WITH_DID] =   FSF_SUPPORT_COMMAND,
  55        [FSF_QTCB_OPEN_LUN] =             FSF_SUPPORT_COMMAND,
  56        [FSF_QTCB_CLOSE_LUN] =            FSF_SUPPORT_COMMAND,
  57        [FSF_QTCB_CLOSE_PORT] =           FSF_SUPPORT_COMMAND,
  58        [FSF_QTCB_CLOSE_PHYSICAL_PORT] =  FSF_SUPPORT_COMMAND,
  59        [FSF_QTCB_SEND_ELS] =             FSF_SUPPORT_COMMAND,
  60        [FSF_QTCB_SEND_GENERIC] =         FSF_SUPPORT_COMMAND,
  61        [FSF_QTCB_EXCHANGE_CONFIG_DATA] = FSF_CONFIG_COMMAND,
  62        [FSF_QTCB_EXCHANGE_PORT_DATA] =   FSF_PORT_COMMAND,
  63        [FSF_QTCB_DOWNLOAD_CONTROL_FILE] = FSF_SUPPORT_COMMAND,
  64        [FSF_QTCB_UPLOAD_CONTROL_FILE] =  FSF_SUPPORT_COMMAND
  65};
  66
  67static void zfcp_fsf_class_not_supp(struct zfcp_fsf_req *req)
  68{
  69        dev_err(&req->adapter->ccw_device->dev, "FCP device not "
  70                "operational because of an unsupported FC class\n");
  71        zfcp_erp_adapter_shutdown(req->adapter, 0, "fscns_1");
  72        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
  73}
  74
  75/**
  76 * zfcp_fsf_req_free - free memory used by fsf request
  77 * @fsf_req: pointer to struct zfcp_fsf_req
  78 */
  79void zfcp_fsf_req_free(struct zfcp_fsf_req *req)
  80{
  81        if (likely(req->pool)) {
  82                if (likely(req->qtcb))
  83                        mempool_free(req->qtcb, req->adapter->pool.qtcb_pool);
  84                mempool_free(req, req->pool);
  85                return;
  86        }
  87
  88        if (likely(req->qtcb))
  89                kmem_cache_free(zfcp_fsf_qtcb_cache, req->qtcb);
  90        kfree(req);
  91}
  92
  93static void zfcp_fsf_status_read_port_closed(struct zfcp_fsf_req *req)
  94{
  95        unsigned long flags;
  96        struct fsf_status_read_buffer *sr_buf = req->data;
  97        struct zfcp_adapter *adapter = req->adapter;
  98        struct zfcp_port *port;
  99        int d_id = ntoh24(sr_buf->d_id);
 100
 101        read_lock_irqsave(&adapter->port_list_lock, flags);
 102        list_for_each_entry(port, &adapter->port_list, list)
 103                if (port->d_id == d_id) {
 104                        zfcp_erp_port_reopen(port, 0, "fssrpc1");
 105                        break;
 106                }
 107        read_unlock_irqrestore(&adapter->port_list_lock, flags);
 108}
 109
 110static void zfcp_fsf_link_down_info_eval(struct zfcp_fsf_req *req,
 111                                         struct fsf_link_down_info *link_down)
 112{
 113        struct zfcp_adapter *adapter = req->adapter;
 114
 115        if (atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED)
 116                return;
 117
 118        atomic_or(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status);
 119
 120        zfcp_scsi_schedule_rports_block(adapter);
 121
 122        if (!link_down)
 123                goto out;
 124
 125        switch (link_down->error_code) {
 126        case FSF_PSQ_LINK_NO_LIGHT:
 127                dev_warn(&req->adapter->ccw_device->dev,
 128                         "There is no light signal from the local "
 129                         "fibre channel cable\n");
 130                break;
 131        case FSF_PSQ_LINK_WRAP_PLUG:
 132                dev_warn(&req->adapter->ccw_device->dev,
 133                         "There is a wrap plug instead of a fibre "
 134                         "channel cable\n");
 135                break;
 136        case FSF_PSQ_LINK_NO_FCP:
 137                dev_warn(&req->adapter->ccw_device->dev,
 138                         "The adjacent fibre channel node does not "
 139                         "support FCP\n");
 140                break;
 141        case FSF_PSQ_LINK_FIRMWARE_UPDATE:
 142                dev_warn(&req->adapter->ccw_device->dev,
 143                         "The FCP device is suspended because of a "
 144                         "firmware update\n");
 145                break;
 146        case FSF_PSQ_LINK_INVALID_WWPN:
 147                dev_warn(&req->adapter->ccw_device->dev,
 148                         "The FCP device detected a WWPN that is "
 149                         "duplicate or not valid\n");
 150                break;
 151        case FSF_PSQ_LINK_NO_NPIV_SUPPORT:
 152                dev_warn(&req->adapter->ccw_device->dev,
 153                         "The fibre channel fabric does not support NPIV\n");
 154                break;
 155        case FSF_PSQ_LINK_NO_FCP_RESOURCES:
 156                dev_warn(&req->adapter->ccw_device->dev,
 157                         "The FCP adapter cannot support more NPIV ports\n");
 158                break;
 159        case FSF_PSQ_LINK_NO_FABRIC_RESOURCES:
 160                dev_warn(&req->adapter->ccw_device->dev,
 161                         "The adjacent switch cannot support "
 162                         "more NPIV ports\n");
 163                break;
 164        case FSF_PSQ_LINK_FABRIC_LOGIN_UNABLE:
 165                dev_warn(&req->adapter->ccw_device->dev,
 166                         "The FCP adapter could not log in to the "
 167                         "fibre channel fabric\n");
 168                break;
 169        case FSF_PSQ_LINK_WWPN_ASSIGNMENT_CORRUPTED:
 170                dev_warn(&req->adapter->ccw_device->dev,
 171                         "The WWPN assignment file on the FCP adapter "
 172                         "has been damaged\n");
 173                break;
 174        case FSF_PSQ_LINK_MODE_TABLE_CURRUPTED:
 175                dev_warn(&req->adapter->ccw_device->dev,
 176                         "The mode table on the FCP adapter "
 177                         "has been damaged\n");
 178                break;
 179        case FSF_PSQ_LINK_NO_WWPN_ASSIGNMENT:
 180                dev_warn(&req->adapter->ccw_device->dev,
 181                         "All NPIV ports on the FCP adapter have "
 182                         "been assigned\n");
 183                break;
 184        default:
 185                dev_warn(&req->adapter->ccw_device->dev,
 186                         "The link between the FCP adapter and "
 187                         "the FC fabric is down\n");
 188        }
 189out:
 190        zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_ERP_FAILED);
 191}
 192
 193static void zfcp_fsf_status_read_link_down(struct zfcp_fsf_req *req)
 194{
 195        struct fsf_status_read_buffer *sr_buf = req->data;
 196        struct fsf_link_down_info *ldi =
 197                (struct fsf_link_down_info *) &sr_buf->payload;
 198
 199        switch (sr_buf->status_subtype) {
 200        case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK:
 201        case FSF_STATUS_READ_SUB_FDISC_FAILED:
 202                zfcp_fsf_link_down_info_eval(req, ldi);
 203                break;
 204        case FSF_STATUS_READ_SUB_FIRMWARE_UPDATE:
 205                zfcp_fsf_link_down_info_eval(req, NULL);
 206        }
 207}
 208
 209static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req)
 210{
 211        struct zfcp_adapter *adapter = req->adapter;
 212        struct fsf_status_read_buffer *sr_buf = req->data;
 213
 214        if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED) {
 215                zfcp_dbf_hba_fsf_uss("fssrh_1", req);
 216                mempool_free(virt_to_page(sr_buf), adapter->pool.sr_data);
 217                zfcp_fsf_req_free(req);
 218                return;
 219        }
 220
 221        zfcp_dbf_hba_fsf_uss("fssrh_4", req);
 222
 223        switch (sr_buf->status_type) {
 224        case FSF_STATUS_READ_PORT_CLOSED:
 225                zfcp_fsf_status_read_port_closed(req);
 226                break;
 227        case FSF_STATUS_READ_INCOMING_ELS:
 228                zfcp_fc_incoming_els(req);
 229                break;
 230        case FSF_STATUS_READ_SENSE_DATA_AVAIL:
 231                break;
 232        case FSF_STATUS_READ_BIT_ERROR_THRESHOLD:
 233                dev_warn(&adapter->ccw_device->dev,
 234                         "The error threshold for checksum statistics "
 235                         "has been exceeded\n");
 236                zfcp_dbf_hba_bit_err("fssrh_3", req);
 237                break;
 238        case FSF_STATUS_READ_LINK_DOWN:
 239                zfcp_fsf_status_read_link_down(req);
 240                zfcp_fc_enqueue_event(adapter, FCH_EVT_LINKDOWN, 0);
 241                break;
 242        case FSF_STATUS_READ_LINK_UP:
 243                dev_info(&adapter->ccw_device->dev,
 244                         "The local link has been restored\n");
 245                /* All ports should be marked as ready to run again */
 246                zfcp_erp_set_adapter_status(adapter,
 247                                            ZFCP_STATUS_COMMON_RUNNING);
 248                zfcp_erp_adapter_reopen(adapter,
 249                                        ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
 250                                        ZFCP_STATUS_COMMON_ERP_FAILED,
 251                                        "fssrh_2");
 252                zfcp_fc_enqueue_event(adapter, FCH_EVT_LINKUP, 0);
 253
 254                break;
 255        case FSF_STATUS_READ_NOTIFICATION_LOST:
 256                if (sr_buf->status_subtype & FSF_STATUS_READ_SUB_INCOMING_ELS)
 257                        zfcp_fc_conditional_port_scan(adapter);
 258                break;
 259        case FSF_STATUS_READ_FEATURE_UPDATE_ALERT:
 260                adapter->adapter_features = sr_buf->payload.word[0];
 261                break;
 262        }
 263
 264        mempool_free(virt_to_page(sr_buf), adapter->pool.sr_data);
 265        zfcp_fsf_req_free(req);
 266
 267        atomic_inc(&adapter->stat_miss);
 268        queue_work(adapter->work_queue, &adapter->stat_work);
 269}
 270
 271static void zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *req)
 272{
 273        switch (req->qtcb->header.fsf_status_qual.word[0]) {
 274        case FSF_SQ_FCP_RSP_AVAILABLE:
 275        case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
 276        case FSF_SQ_NO_RETRY_POSSIBLE:
 277        case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
 278                return;
 279        case FSF_SQ_COMMAND_ABORTED:
 280                break;
 281        case FSF_SQ_NO_RECOM:
 282                dev_err(&req->adapter->ccw_device->dev,
 283                        "The FCP adapter reported a problem "
 284                        "that cannot be recovered\n");
 285                zfcp_qdio_siosl(req->adapter);
 286                zfcp_erp_adapter_shutdown(req->adapter, 0, "fsfsqe1");
 287                break;
 288        }
 289        /* all non-return stats set FSFREQ_ERROR*/
 290        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 291}
 292
 293static void zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *req)
 294{
 295        if (unlikely(req->status & ZFCP_STATUS_FSFREQ_ERROR))
 296                return;
 297
 298        switch (req->qtcb->header.fsf_status) {
 299        case FSF_UNKNOWN_COMMAND:
 300                dev_err(&req->adapter->ccw_device->dev,
 301                        "The FCP adapter does not recognize the command 0x%x\n",
 302                        req->qtcb->header.fsf_command);
 303                zfcp_erp_adapter_shutdown(req->adapter, 0, "fsfse_1");
 304                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 305                break;
 306        case FSF_ADAPTER_STATUS_AVAILABLE:
 307                zfcp_fsf_fsfstatus_qual_eval(req);
 308                break;
 309        }
 310}
 311
 312static void zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *req)
 313{
 314        struct zfcp_adapter *adapter = req->adapter;
 315        struct fsf_qtcb *qtcb = req->qtcb;
 316        union fsf_prot_status_qual *psq = &qtcb->prefix.prot_status_qual;
 317
 318        zfcp_dbf_hba_fsf_response(req);
 319
 320        if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED) {
 321                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 322                return;
 323        }
 324
 325        switch (qtcb->prefix.prot_status) {
 326        case FSF_PROT_GOOD:
 327        case FSF_PROT_FSF_STATUS_PRESENTED:
 328                return;
 329        case FSF_PROT_QTCB_VERSION_ERROR:
 330                dev_err(&adapter->ccw_device->dev,
 331                        "QTCB version 0x%x not supported by FCP adapter "
 332                        "(0x%x to 0x%x)\n", FSF_QTCB_CURRENT_VERSION,
 333                        psq->word[0], psq->word[1]);
 334                zfcp_erp_adapter_shutdown(adapter, 0, "fspse_1");
 335                break;
 336        case FSF_PROT_ERROR_STATE:
 337        case FSF_PROT_SEQ_NUMB_ERROR:
 338                zfcp_erp_adapter_reopen(adapter, 0, "fspse_2");
 339                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 340                break;
 341        case FSF_PROT_UNSUPP_QTCB_TYPE:
 342                dev_err(&adapter->ccw_device->dev,
 343                        "The QTCB type is not supported by the FCP adapter\n");
 344                zfcp_erp_adapter_shutdown(adapter, 0, "fspse_3");
 345                break;
 346        case FSF_PROT_HOST_CONNECTION_INITIALIZING:
 347                atomic_or(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
 348                                &adapter->status);
 349                break;
 350        case FSF_PROT_DUPLICATE_REQUEST_ID:
 351                dev_err(&adapter->ccw_device->dev,
 352                        "0x%Lx is an ambiguous request identifier\n",
 353                        (unsigned long long)qtcb->bottom.support.req_handle);
 354                zfcp_erp_adapter_shutdown(adapter, 0, "fspse_4");
 355                break;
 356        case FSF_PROT_LINK_DOWN:
 357                zfcp_fsf_link_down_info_eval(req, &psq->link_down_info);
 358                /* go through reopen to flush pending requests */
 359                zfcp_erp_adapter_reopen(adapter, 0, "fspse_6");
 360                break;
 361        case FSF_PROT_REEST_QUEUE:
 362                /* All ports should be marked as ready to run again */
 363                zfcp_erp_set_adapter_status(adapter,
 364                                            ZFCP_STATUS_COMMON_RUNNING);
 365                zfcp_erp_adapter_reopen(adapter,
 366                                        ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
 367                                        ZFCP_STATUS_COMMON_ERP_FAILED,
 368                                        "fspse_8");
 369                break;
 370        default:
 371                dev_err(&adapter->ccw_device->dev,
 372                        "0x%x is not a valid transfer protocol status\n",
 373                        qtcb->prefix.prot_status);
 374                zfcp_qdio_siosl(adapter);
 375                zfcp_erp_adapter_shutdown(adapter, 0, "fspse_9");
 376        }
 377        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 378}
 379
 380/**
 381 * zfcp_fsf_req_complete - process completion of a FSF request
 382 * @fsf_req: The FSF request that has been completed.
 383 *
 384 * When a request has been completed either from the FCP adapter,
 385 * or it has been dismissed due to a queue shutdown, this function
 386 * is called to process the completion status and trigger further
 387 * events related to the FSF request.
 388 */
 389static void zfcp_fsf_req_complete(struct zfcp_fsf_req *req)
 390{
 391        if (unlikely(req->fsf_command == FSF_QTCB_UNSOLICITED_STATUS)) {
 392                zfcp_fsf_status_read_handler(req);
 393                return;
 394        }
 395
 396        del_timer(&req->timer);
 397        zfcp_fsf_protstatus_eval(req);
 398        zfcp_fsf_fsfstatus_eval(req);
 399        req->handler(req);
 400
 401        if (req->erp_action)
 402                zfcp_erp_notify(req->erp_action, 0);
 403
 404        if (likely(req->status & ZFCP_STATUS_FSFREQ_CLEANUP))
 405                zfcp_fsf_req_free(req);
 406        else
 407                complete(&req->completion);
 408}
 409
 410/**
 411 * zfcp_fsf_req_dismiss_all - dismiss all fsf requests
 412 * @adapter: pointer to struct zfcp_adapter
 413 *
 414 * Never ever call this without shutting down the adapter first.
 415 * Otherwise the adapter would continue using and corrupting s390 storage.
 416 * Included BUG_ON() call to ensure this is done.
 417 * ERP is supposed to be the only user of this function.
 418 */
 419void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
 420{
 421        struct zfcp_fsf_req *req, *tmp;
 422        LIST_HEAD(remove_queue);
 423
 424        BUG_ON(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP);
 425        zfcp_reqlist_move(adapter->req_list, &remove_queue);
 426
 427        list_for_each_entry_safe(req, tmp, &remove_queue, list) {
 428                list_del(&req->list);
 429                req->status |= ZFCP_STATUS_FSFREQ_DISMISSED;
 430                zfcp_fsf_req_complete(req);
 431        }
 432}
 433
 434#define ZFCP_FSF_PORTSPEED_1GBIT        (1 <<  0)
 435#define ZFCP_FSF_PORTSPEED_2GBIT        (1 <<  1)
 436#define ZFCP_FSF_PORTSPEED_4GBIT        (1 <<  2)
 437#define ZFCP_FSF_PORTSPEED_10GBIT       (1 <<  3)
 438#define ZFCP_FSF_PORTSPEED_8GBIT        (1 <<  4)
 439#define ZFCP_FSF_PORTSPEED_16GBIT       (1 <<  5)
 440#define ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED (1 << 15)
 441
 442static u32 zfcp_fsf_convert_portspeed(u32 fsf_speed)
 443{
 444        u32 fdmi_speed = 0;
 445        if (fsf_speed & ZFCP_FSF_PORTSPEED_1GBIT)
 446                fdmi_speed |= FC_PORTSPEED_1GBIT;
 447        if (fsf_speed & ZFCP_FSF_PORTSPEED_2GBIT)
 448                fdmi_speed |= FC_PORTSPEED_2GBIT;
 449        if (fsf_speed & ZFCP_FSF_PORTSPEED_4GBIT)
 450                fdmi_speed |= FC_PORTSPEED_4GBIT;
 451        if (fsf_speed & ZFCP_FSF_PORTSPEED_10GBIT)
 452                fdmi_speed |= FC_PORTSPEED_10GBIT;
 453        if (fsf_speed & ZFCP_FSF_PORTSPEED_8GBIT)
 454                fdmi_speed |= FC_PORTSPEED_8GBIT;
 455        if (fsf_speed & ZFCP_FSF_PORTSPEED_16GBIT)
 456                fdmi_speed |= FC_PORTSPEED_16GBIT;
 457        if (fsf_speed & ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED)
 458                fdmi_speed |= FC_PORTSPEED_NOT_NEGOTIATED;
 459        return fdmi_speed;
 460}
 461
 462static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req)
 463{
 464        struct fsf_qtcb_bottom_config *bottom = &req->qtcb->bottom.config;
 465        struct zfcp_adapter *adapter = req->adapter;
 466        struct Scsi_Host *shost = adapter->scsi_host;
 467        struct fc_els_flogi *nsp, *plogi;
 468
 469        /* adjust pointers for missing command code */
 470        nsp = (struct fc_els_flogi *) ((u8 *)&bottom->nport_serv_param
 471                                        - sizeof(u32));
 472        plogi = (struct fc_els_flogi *) ((u8 *)&bottom->plogi_payload
 473                                        - sizeof(u32));
 474
 475        if (req->data)
 476                memcpy(req->data, bottom, sizeof(*bottom));
 477
 478        fc_host_port_name(shost) = be64_to_cpu(nsp->fl_wwpn);
 479        fc_host_node_name(shost) = be64_to_cpu(nsp->fl_wwnn);
 480        fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3;
 481
 482        adapter->timer_ticks = bottom->timer_interval & ZFCP_FSF_TIMER_INT_MASK;
 483        adapter->stat_read_buf_num = max(bottom->status_read_buf_num,
 484                                         (u16)FSF_STATUS_READS_RECOM);
 485
 486        if (fc_host_permanent_port_name(shost) == -1)
 487                fc_host_permanent_port_name(shost) = fc_host_port_name(shost);
 488
 489        zfcp_scsi_set_prot(adapter);
 490
 491        /* no error return above here, otherwise must fix call chains */
 492        /* do not evaluate invalid fields */
 493        if (req->qtcb->header.fsf_status == FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE)
 494                return 0;
 495
 496        fc_host_port_id(shost) = ntoh24(bottom->s_id);
 497        fc_host_speed(shost) =
 498                zfcp_fsf_convert_portspeed(bottom->fc_link_speed);
 499
 500        adapter->hydra_version = bottom->adapter_type;
 501
 502        switch (bottom->fc_topology) {
 503        case FSF_TOPO_P2P:
 504                adapter->peer_d_id = ntoh24(bottom->peer_d_id);
 505                adapter->peer_wwpn = be64_to_cpu(plogi->fl_wwpn);
 506                adapter->peer_wwnn = be64_to_cpu(plogi->fl_wwnn);
 507                fc_host_port_type(shost) = FC_PORTTYPE_PTP;
 508                break;
 509        case FSF_TOPO_FABRIC:
 510                if (bottom->connection_features & FSF_FEATURE_NPIV_MODE)
 511                        fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
 512                else
 513                        fc_host_port_type(shost) = FC_PORTTYPE_NPORT;
 514                break;
 515        case FSF_TOPO_AL:
 516                fc_host_port_type(shost) = FC_PORTTYPE_NLPORT;
 517                /* fall through */
 518        default:
 519                dev_err(&adapter->ccw_device->dev,
 520                        "Unknown or unsupported arbitrated loop "
 521                        "fibre channel topology detected\n");
 522                zfcp_erp_adapter_shutdown(adapter, 0, "fsece_1");
 523                return -EIO;
 524        }
 525
 526        return 0;
 527}
 528
 529static void zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *req)
 530{
 531        struct zfcp_adapter *adapter = req->adapter;
 532        struct fsf_qtcb *qtcb = req->qtcb;
 533        struct fsf_qtcb_bottom_config *bottom = &qtcb->bottom.config;
 534        struct Scsi_Host *shost = adapter->scsi_host;
 535
 536        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
 537                return;
 538
 539        adapter->fsf_lic_version = bottom->lic_version;
 540        adapter->adapter_features = bottom->adapter_features;
 541        adapter->connection_features = bottom->connection_features;
 542        adapter->peer_wwpn = 0;
 543        adapter->peer_wwnn = 0;
 544        adapter->peer_d_id = 0;
 545
 546        switch (qtcb->header.fsf_status) {
 547        case FSF_GOOD:
 548                if (zfcp_fsf_exchange_config_evaluate(req))
 549                        return;
 550
 551                if (bottom->max_qtcb_size < sizeof(struct fsf_qtcb)) {
 552                        dev_err(&adapter->ccw_device->dev,
 553                                "FCP adapter maximum QTCB size (%d bytes) "
 554                                "is too small\n",
 555                                bottom->max_qtcb_size);
 556                        zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh1");
 557                        return;
 558                }
 559                atomic_or(ZFCP_STATUS_ADAPTER_XCONFIG_OK,
 560                                &adapter->status);
 561                break;
 562        case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE:
 563                fc_host_node_name(shost) = 0;
 564                fc_host_port_name(shost) = 0;
 565                fc_host_port_id(shost) = 0;
 566                fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
 567                fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN;
 568                adapter->hydra_version = 0;
 569
 570                /* avoids adapter shutdown to be able to recognize
 571                 * events such as LINK UP */
 572                atomic_or(ZFCP_STATUS_ADAPTER_XCONFIG_OK,
 573                                &adapter->status);
 574                zfcp_fsf_link_down_info_eval(req,
 575                        &qtcb->header.fsf_status_qual.link_down_info);
 576                if (zfcp_fsf_exchange_config_evaluate(req))
 577                        return;
 578                break;
 579        default:
 580                zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh3");
 581                return;
 582        }
 583
 584        if (adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT) {
 585                adapter->hardware_version = bottom->hardware_version;
 586                memcpy(fc_host_serial_number(shost), bottom->serial_number,
 587                       min(FC_SERIAL_NUMBER_SIZE, 17));
 588                EBCASC(fc_host_serial_number(shost),
 589                       min(FC_SERIAL_NUMBER_SIZE, 17));
 590        }
 591
 592        if (FSF_QTCB_CURRENT_VERSION < bottom->low_qtcb_version) {
 593                dev_err(&adapter->ccw_device->dev,
 594                        "The FCP adapter only supports newer "
 595                        "control block versions\n");
 596                zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh4");
 597                return;
 598        }
 599        if (FSF_QTCB_CURRENT_VERSION > bottom->high_qtcb_version) {
 600                dev_err(&adapter->ccw_device->dev,
 601                        "The FCP adapter only supports older "
 602                        "control block versions\n");
 603                zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh5");
 604        }
 605}
 606
 607static void zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *req)
 608{
 609        struct zfcp_adapter *adapter = req->adapter;
 610        struct fsf_qtcb_bottom_port *bottom = &req->qtcb->bottom.port;
 611        struct Scsi_Host *shost = adapter->scsi_host;
 612
 613        if (req->data)
 614                memcpy(req->data, bottom, sizeof(*bottom));
 615
 616        if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) {
 617                fc_host_permanent_port_name(shost) = bottom->wwpn;
 618        } else
 619                fc_host_permanent_port_name(shost) = fc_host_port_name(shost);
 620        fc_host_maxframe_size(shost) = bottom->maximum_frame_size;
 621        fc_host_supported_speeds(shost) =
 622                zfcp_fsf_convert_portspeed(bottom->supported_speed);
 623        memcpy(fc_host_supported_fc4s(shost), bottom->supported_fc4_types,
 624               FC_FC4_LIST_SIZE);
 625        memcpy(fc_host_active_fc4s(shost), bottom->active_fc4_types,
 626               FC_FC4_LIST_SIZE);
 627}
 628
 629static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *req)
 630{
 631        struct fsf_qtcb *qtcb = req->qtcb;
 632
 633        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
 634                return;
 635
 636        switch (qtcb->header.fsf_status) {
 637        case FSF_GOOD:
 638                zfcp_fsf_exchange_port_evaluate(req);
 639                break;
 640        case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE:
 641                zfcp_fsf_exchange_port_evaluate(req);
 642                zfcp_fsf_link_down_info_eval(req,
 643                        &qtcb->header.fsf_status_qual.link_down_info);
 644                break;
 645        }
 646}
 647
 648static struct zfcp_fsf_req *zfcp_fsf_alloc(mempool_t *pool)
 649{
 650        struct zfcp_fsf_req *req;
 651
 652        if (likely(pool))
 653                req = mempool_alloc(pool, GFP_ATOMIC);
 654        else
 655                req = kmalloc(sizeof(*req), GFP_ATOMIC);
 656
 657        if (unlikely(!req))
 658                return NULL;
 659
 660        memset(req, 0, sizeof(*req));
 661        req->pool = pool;
 662        return req;
 663}
 664
 665static struct fsf_qtcb *zfcp_qtcb_alloc(mempool_t *pool)
 666{
 667        struct fsf_qtcb *qtcb;
 668
 669        if (likely(pool))
 670                qtcb = mempool_alloc(pool, GFP_ATOMIC);
 671        else
 672                qtcb = kmem_cache_alloc(zfcp_fsf_qtcb_cache, GFP_ATOMIC);
 673
 674        if (unlikely(!qtcb))
 675                return NULL;
 676
 677        memset(qtcb, 0, sizeof(*qtcb));
 678        return qtcb;
 679}
 680
 681static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio,
 682                                                u32 fsf_cmd, u8 sbtype,
 683                                                mempool_t *pool)
 684{
 685        struct zfcp_adapter *adapter = qdio->adapter;
 686        struct zfcp_fsf_req *req = zfcp_fsf_alloc(pool);
 687
 688        if (unlikely(!req))
 689                return ERR_PTR(-ENOMEM);
 690
 691        if (adapter->req_no == 0)
 692                adapter->req_no++;
 693
 694        INIT_LIST_HEAD(&req->list);
 695        timer_setup(&req->timer, NULL, 0);
 696        init_completion(&req->completion);
 697
 698        req->adapter = adapter;
 699        req->fsf_command = fsf_cmd;
 700        req->req_id = adapter->req_no;
 701
 702        if (likely(fsf_cmd != FSF_QTCB_UNSOLICITED_STATUS)) {
 703                if (likely(pool))
 704                        req->qtcb = zfcp_qtcb_alloc(adapter->pool.qtcb_pool);
 705                else
 706                        req->qtcb = zfcp_qtcb_alloc(NULL);
 707
 708                if (unlikely(!req->qtcb)) {
 709                        zfcp_fsf_req_free(req);
 710                        return ERR_PTR(-ENOMEM);
 711                }
 712
 713                req->seq_no = adapter->fsf_req_seq_no;
 714                req->qtcb->prefix.req_seq_no = adapter->fsf_req_seq_no;
 715                req->qtcb->prefix.req_id = req->req_id;
 716                req->qtcb->prefix.ulp_info = 26;
 717                req->qtcb->prefix.qtcb_type = fsf_qtcb_type[req->fsf_command];
 718                req->qtcb->prefix.qtcb_version = FSF_QTCB_CURRENT_VERSION;
 719                req->qtcb->header.req_handle = req->req_id;
 720                req->qtcb->header.fsf_command = req->fsf_command;
 721        }
 722
 723        zfcp_qdio_req_init(adapter->qdio, &req->qdio_req, req->req_id, sbtype,
 724                           req->qtcb, sizeof(struct fsf_qtcb));
 725
 726        return req;
 727}
 728
 729static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
 730{
 731        struct zfcp_adapter *adapter = req->adapter;
 732        struct zfcp_qdio *qdio = adapter->qdio;
 733        int with_qtcb = (req->qtcb != NULL);
 734        int req_id = req->req_id;
 735
 736        zfcp_reqlist_add(adapter->req_list, req);
 737
 738        req->qdio_req.qdio_outb_usage = atomic_read(&qdio->req_q_free);
 739        req->issued = get_tod_clock();
 740        if (zfcp_qdio_send(qdio, &req->qdio_req)) {
 741                del_timer(&req->timer);
 742                /* lookup request again, list might have changed */
 743                zfcp_reqlist_find_rm(adapter->req_list, req_id);
 744                zfcp_erp_adapter_reopen(adapter, 0, "fsrs__1");
 745                return -EIO;
 746        }
 747
 748        /* Don't increase for unsolicited status */
 749        if (with_qtcb)
 750                adapter->fsf_req_seq_no++;
 751        adapter->req_no++;
 752
 753        return 0;
 754}
 755
 756/**
 757 * zfcp_fsf_status_read - send status read request
 758 * @adapter: pointer to struct zfcp_adapter
 759 * @req_flags: request flags
 760 * Returns: 0 on success, ERROR otherwise
 761 */
 762int zfcp_fsf_status_read(struct zfcp_qdio *qdio)
 763{
 764        struct zfcp_adapter *adapter = qdio->adapter;
 765        struct zfcp_fsf_req *req;
 766        struct fsf_status_read_buffer *sr_buf;
 767        struct page *page;
 768        int retval = -EIO;
 769
 770        spin_lock_irq(&qdio->req_q_lock);
 771        if (zfcp_qdio_sbal_get(qdio))
 772                goto out;
 773
 774        req = zfcp_fsf_req_create(qdio, FSF_QTCB_UNSOLICITED_STATUS,
 775                                  SBAL_SFLAGS0_TYPE_STATUS,
 776                                  adapter->pool.status_read_req);
 777        if (IS_ERR(req)) {
 778                retval = PTR_ERR(req);
 779                goto out;
 780        }
 781
 782        page = mempool_alloc(adapter->pool.sr_data, GFP_ATOMIC);
 783        if (!page) {
 784                retval = -ENOMEM;
 785                goto failed_buf;
 786        }
 787        sr_buf = page_address(page);
 788        memset(sr_buf, 0, sizeof(*sr_buf));
 789        req->data = sr_buf;
 790
 791        zfcp_qdio_fill_next(qdio, &req->qdio_req, sr_buf, sizeof(*sr_buf));
 792        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
 793
 794        retval = zfcp_fsf_req_send(req);
 795        if (retval)
 796                goto failed_req_send;
 797
 798        goto out;
 799
 800failed_req_send:
 801        req->data = NULL;
 802        mempool_free(virt_to_page(sr_buf), adapter->pool.sr_data);
 803failed_buf:
 804        zfcp_dbf_hba_fsf_uss("fssr__1", req);
 805        zfcp_fsf_req_free(req);
 806out:
 807        spin_unlock_irq(&qdio->req_q_lock);
 808        return retval;
 809}
 810
 811static void zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *req)
 812{
 813        struct scsi_device *sdev = req->data;
 814        struct zfcp_scsi_dev *zfcp_sdev;
 815        union fsf_status_qual *fsq = &req->qtcb->header.fsf_status_qual;
 816
 817        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
 818                return;
 819
 820        zfcp_sdev = sdev_to_zfcp(sdev);
 821
 822        switch (req->qtcb->header.fsf_status) {
 823        case FSF_PORT_HANDLE_NOT_VALID:
 824                if (fsq->word[0] == fsq->word[1]) {
 825                        zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0,
 826                                                "fsafch1");
 827                        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 828                }
 829                break;
 830        case FSF_LUN_HANDLE_NOT_VALID:
 831                if (fsq->word[0] == fsq->word[1]) {
 832                        zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fsafch2");
 833                        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 834                }
 835                break;
 836        case FSF_FCP_COMMAND_DOES_NOT_EXIST:
 837                req->status |= ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED;
 838                break;
 839        case FSF_PORT_BOXED:
 840                zfcp_erp_set_port_status(zfcp_sdev->port,
 841                                         ZFCP_STATUS_COMMON_ACCESS_BOXED);
 842                zfcp_erp_port_reopen(zfcp_sdev->port,
 843                                     ZFCP_STATUS_COMMON_ERP_FAILED, "fsafch3");
 844                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 845                break;
 846        case FSF_LUN_BOXED:
 847                zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ACCESS_BOXED);
 848                zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED,
 849                                    "fsafch4");
 850                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 851                break;
 852        case FSF_ADAPTER_STATUS_AVAILABLE:
 853                switch (fsq->word[0]) {
 854                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
 855                        zfcp_fc_test_link(zfcp_sdev->port);
 856                        /* fall through */
 857                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
 858                        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 859                        break;
 860                }
 861                break;
 862        case FSF_GOOD:
 863                req->status |= ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED;
 864                break;
 865        }
 866}
 867
 868/**
 869 * zfcp_fsf_abort_fcp_cmnd - abort running SCSI command
 870 * @scmnd: The SCSI command to abort
 871 * Returns: pointer to struct zfcp_fsf_req
 872 */
 873
 874struct zfcp_fsf_req *zfcp_fsf_abort_fcp_cmnd(struct scsi_cmnd *scmnd)
 875{
 876        struct zfcp_fsf_req *req = NULL;
 877        struct scsi_device *sdev = scmnd->device;
 878        struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
 879        struct zfcp_qdio *qdio = zfcp_sdev->port->adapter->qdio;
 880        unsigned long old_req_id = (unsigned long) scmnd->host_scribble;
 881
 882        spin_lock_irq(&qdio->req_q_lock);
 883        if (zfcp_qdio_sbal_get(qdio))
 884                goto out;
 885        req = zfcp_fsf_req_create(qdio, FSF_QTCB_ABORT_FCP_CMND,
 886                                  SBAL_SFLAGS0_TYPE_READ,
 887                                  qdio->adapter->pool.scsi_abort);
 888        if (IS_ERR(req)) {
 889                req = NULL;
 890                goto out;
 891        }
 892
 893        if (unlikely(!(atomic_read(&zfcp_sdev->status) &
 894                       ZFCP_STATUS_COMMON_UNBLOCKED)))
 895                goto out_error_free;
 896
 897        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
 898
 899        req->data = sdev;
 900        req->handler = zfcp_fsf_abort_fcp_command_handler;
 901        req->qtcb->header.lun_handle = zfcp_sdev->lun_handle;
 902        req->qtcb->header.port_handle = zfcp_sdev->port->handle;
 903        req->qtcb->bottom.support.req_handle = (u64) old_req_id;
 904
 905        zfcp_fsf_start_timer(req, ZFCP_SCSI_ER_TIMEOUT);
 906        if (!zfcp_fsf_req_send(req))
 907                goto out;
 908
 909out_error_free:
 910        zfcp_fsf_req_free(req);
 911        req = NULL;
 912out:
 913        spin_unlock_irq(&qdio->req_q_lock);
 914        return req;
 915}
 916
 917static void zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *req)
 918{
 919        struct zfcp_adapter *adapter = req->adapter;
 920        struct zfcp_fsf_ct_els *ct = req->data;
 921        struct fsf_qtcb_header *header = &req->qtcb->header;
 922
 923        ct->status = -EINVAL;
 924
 925        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
 926                goto skip_fsfstatus;
 927
 928        switch (header->fsf_status) {
 929        case FSF_GOOD:
 930                ct->status = 0;
 931                zfcp_dbf_san_res("fsscth2", req);
 932                break;
 933        case FSF_SERVICE_CLASS_NOT_SUPPORTED:
 934                zfcp_fsf_class_not_supp(req);
 935                break;
 936        case FSF_ADAPTER_STATUS_AVAILABLE:
 937                switch (header->fsf_status_qual.word[0]){
 938                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
 939                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
 940                        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 941                        break;
 942                }
 943                break;
 944        case FSF_PORT_BOXED:
 945                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 946                break;
 947        case FSF_PORT_HANDLE_NOT_VALID:
 948                zfcp_erp_adapter_reopen(adapter, 0, "fsscth1");
 949                /* fall through */
 950        case FSF_GENERIC_COMMAND_REJECTED:
 951        case FSF_PAYLOAD_SIZE_MISMATCH:
 952        case FSF_REQUEST_SIZE_TOO_LARGE:
 953        case FSF_RESPONSE_SIZE_TOO_LARGE:
 954        case FSF_SBAL_MISMATCH:
 955                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 956                break;
 957        }
 958
 959skip_fsfstatus:
 960        if (ct->handler)
 961                ct->handler(ct->handler_data);
 962}
 963
 964static void zfcp_fsf_setup_ct_els_unchained(struct zfcp_qdio *qdio,
 965                                            struct zfcp_qdio_req *q_req,
 966                                            struct scatterlist *sg_req,
 967                                            struct scatterlist *sg_resp)
 968{
 969        zfcp_qdio_fill_next(qdio, q_req, sg_virt(sg_req), sg_req->length);
 970        zfcp_qdio_fill_next(qdio, q_req, sg_virt(sg_resp), sg_resp->length);
 971        zfcp_qdio_set_sbale_last(qdio, q_req);
 972}
 973
 974static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
 975                                       struct scatterlist *sg_req,
 976                                       struct scatterlist *sg_resp)
 977{
 978        struct zfcp_adapter *adapter = req->adapter;
 979        struct zfcp_qdio *qdio = adapter->qdio;
 980        struct fsf_qtcb *qtcb = req->qtcb;
 981        u32 feat = adapter->adapter_features;
 982
 983        if (zfcp_adapter_multi_buffer_active(adapter)) {
 984                if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_req))
 985                        return -EIO;
 986                qtcb->bottom.support.req_buf_length =
 987                        zfcp_qdio_real_bytes(sg_req);
 988                if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_resp))
 989                        return -EIO;
 990                qtcb->bottom.support.resp_buf_length =
 991                        zfcp_qdio_real_bytes(sg_resp);
 992
 993                zfcp_qdio_set_data_div(qdio, &req->qdio_req, sg_nents(sg_req));
 994                zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
 995                zfcp_qdio_set_scount(qdio, &req->qdio_req);
 996                return 0;
 997        }
 998
 999        /* use single, unchained SBAL if it can hold the request */
1000        if (zfcp_qdio_sg_one_sbale(sg_req) && zfcp_qdio_sg_one_sbale(sg_resp)) {
1001                zfcp_fsf_setup_ct_els_unchained(qdio, &req->qdio_req,
1002                                                sg_req, sg_resp);
1003                return 0;
1004        }
1005
1006        if (!(feat & FSF_FEATURE_ELS_CT_CHAINED_SBALS))
1007                return -EOPNOTSUPP;
1008
1009        if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_req))
1010                return -EIO;
1011
1012        qtcb->bottom.support.req_buf_length = zfcp_qdio_real_bytes(sg_req);
1013
1014        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1015        zfcp_qdio_skip_to_last_sbale(qdio, &req->qdio_req);
1016
1017        if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_resp))
1018                return -EIO;
1019
1020        qtcb->bottom.support.resp_buf_length = zfcp_qdio_real_bytes(sg_resp);
1021
1022        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1023
1024        return 0;
1025}
1026
1027static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req,
1028                                 struct scatterlist *sg_req,
1029                                 struct scatterlist *sg_resp,
1030                                 unsigned int timeout)
1031{
1032        int ret;
1033
1034        ret = zfcp_fsf_setup_ct_els_sbals(req, sg_req, sg_resp);
1035        if (ret)
1036                return ret;
1037
1038        /* common settings for ct/gs and els requests */
1039        if (timeout > 255)
1040                timeout = 255; /* max value accepted by hardware */
1041        req->qtcb->bottom.support.service_class = FSF_CLASS_3;
1042        req->qtcb->bottom.support.timeout = timeout;
1043        zfcp_fsf_start_timer(req, (timeout + 10) * HZ);
1044
1045        return 0;
1046}
1047
1048/**
1049 * zfcp_fsf_send_ct - initiate a Generic Service request (FC-GS)
1050 * @ct: pointer to struct zfcp_send_ct with data for request
1051 * @pool: if non-null this mempool is used to allocate struct zfcp_fsf_req
1052 */
1053int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port,
1054                     struct zfcp_fsf_ct_els *ct, mempool_t *pool,
1055                     unsigned int timeout)
1056{
1057        struct zfcp_qdio *qdio = wka_port->adapter->qdio;
1058        struct zfcp_fsf_req *req;
1059        int ret = -EIO;
1060
1061        spin_lock_irq(&qdio->req_q_lock);
1062        if (zfcp_qdio_sbal_get(qdio))
1063                goto out;
1064
1065        req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_GENERIC,
1066                                  SBAL_SFLAGS0_TYPE_WRITE_READ, pool);
1067
1068        if (IS_ERR(req)) {
1069                ret = PTR_ERR(req);
1070                goto out;
1071        }
1072
1073        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1074        ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp, timeout);
1075        if (ret)
1076                goto failed_send;
1077
1078        req->handler = zfcp_fsf_send_ct_handler;
1079        req->qtcb->header.port_handle = wka_port->handle;
1080        ct->d_id = wka_port->d_id;
1081        req->data = ct;
1082
1083        zfcp_dbf_san_req("fssct_1", req, wka_port->d_id);
1084
1085        ret = zfcp_fsf_req_send(req);
1086        if (ret)
1087                goto failed_send;
1088
1089        goto out;
1090
1091failed_send:
1092        zfcp_fsf_req_free(req);
1093out:
1094        spin_unlock_irq(&qdio->req_q_lock);
1095        return ret;
1096}
1097
1098static void zfcp_fsf_send_els_handler(struct zfcp_fsf_req *req)
1099{
1100        struct zfcp_fsf_ct_els *send_els = req->data;
1101        struct fsf_qtcb_header *header = &req->qtcb->header;
1102
1103        send_els->status = -EINVAL;
1104
1105        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1106                goto skip_fsfstatus;
1107
1108        switch (header->fsf_status) {
1109        case FSF_GOOD:
1110                send_els->status = 0;
1111                zfcp_dbf_san_res("fsselh1", req);
1112                break;
1113        case FSF_SERVICE_CLASS_NOT_SUPPORTED:
1114                zfcp_fsf_class_not_supp(req);
1115                break;
1116        case FSF_ADAPTER_STATUS_AVAILABLE:
1117                switch (header->fsf_status_qual.word[0]){
1118                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1119                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1120                case FSF_SQ_RETRY_IF_POSSIBLE:
1121                        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1122                        break;
1123                }
1124                break;
1125        case FSF_ELS_COMMAND_REJECTED:
1126        case FSF_PAYLOAD_SIZE_MISMATCH:
1127        case FSF_REQUEST_SIZE_TOO_LARGE:
1128        case FSF_RESPONSE_SIZE_TOO_LARGE:
1129                break;
1130        case FSF_SBAL_MISMATCH:
1131                /* should never occur, avoided in zfcp_fsf_send_els */
1132                /* fall through */
1133        default:
1134                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1135                break;
1136        }
1137skip_fsfstatus:
1138        if (send_els->handler)
1139                send_els->handler(send_els->handler_data);
1140}
1141
1142/**
1143 * zfcp_fsf_send_els - initiate an ELS command (FC-FS)
1144 * @els: pointer to struct zfcp_send_els with data for the command
1145 */
1146int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id,
1147                      struct zfcp_fsf_ct_els *els, unsigned int timeout)
1148{
1149        struct zfcp_fsf_req *req;
1150        struct zfcp_qdio *qdio = adapter->qdio;
1151        int ret = -EIO;
1152
1153        spin_lock_irq(&qdio->req_q_lock);
1154        if (zfcp_qdio_sbal_get(qdio))
1155                goto out;
1156
1157        req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_ELS,
1158                                  SBAL_SFLAGS0_TYPE_WRITE_READ, NULL);
1159
1160        if (IS_ERR(req)) {
1161                ret = PTR_ERR(req);
1162                goto out;
1163        }
1164
1165        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1166
1167        if (!zfcp_adapter_multi_buffer_active(adapter))
1168                zfcp_qdio_sbal_limit(qdio, &req->qdio_req, 2);
1169
1170        ret = zfcp_fsf_setup_ct_els(req, els->req, els->resp, timeout);
1171
1172        if (ret)
1173                goto failed_send;
1174
1175        hton24(req->qtcb->bottom.support.d_id, d_id);
1176        req->handler = zfcp_fsf_send_els_handler;
1177        els->d_id = d_id;
1178        req->data = els;
1179
1180        zfcp_dbf_san_req("fssels1", req, d_id);
1181
1182        ret = zfcp_fsf_req_send(req);
1183        if (ret)
1184                goto failed_send;
1185
1186        goto out;
1187
1188failed_send:
1189        zfcp_fsf_req_free(req);
1190out:
1191        spin_unlock_irq(&qdio->req_q_lock);
1192        return ret;
1193}
1194
1195int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
1196{
1197        struct zfcp_fsf_req *req;
1198        struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1199        int retval = -EIO;
1200
1201        spin_lock_irq(&qdio->req_q_lock);
1202        if (zfcp_qdio_sbal_get(qdio))
1203                goto out;
1204
1205        req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA,
1206                                  SBAL_SFLAGS0_TYPE_READ,
1207                                  qdio->adapter->pool.erp_req);
1208
1209        if (IS_ERR(req)) {
1210                retval = PTR_ERR(req);
1211                goto out;
1212        }
1213
1214        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1215        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1216
1217        req->qtcb->bottom.config.feature_selection =
1218                        FSF_FEATURE_NOTIFICATION_LOST |
1219                        FSF_FEATURE_UPDATE_ALERT;
1220        req->erp_action = erp_action;
1221        req->handler = zfcp_fsf_exchange_config_data_handler;
1222        erp_action->fsf_req_id = req->req_id;
1223
1224        zfcp_fsf_start_erp_timer(req);
1225        retval = zfcp_fsf_req_send(req);
1226        if (retval) {
1227                zfcp_fsf_req_free(req);
1228                erp_action->fsf_req_id = 0;
1229        }
1230out:
1231        spin_unlock_irq(&qdio->req_q_lock);
1232        return retval;
1233}
1234
1235int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio,
1236                                       struct fsf_qtcb_bottom_config *data)
1237{
1238        struct zfcp_fsf_req *req = NULL;
1239        int retval = -EIO;
1240
1241        spin_lock_irq(&qdio->req_q_lock);
1242        if (zfcp_qdio_sbal_get(qdio))
1243                goto out_unlock;
1244
1245        req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA,
1246                                  SBAL_SFLAGS0_TYPE_READ, NULL);
1247
1248        if (IS_ERR(req)) {
1249                retval = PTR_ERR(req);
1250                goto out_unlock;
1251        }
1252
1253        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1254        req->handler = zfcp_fsf_exchange_config_data_handler;
1255
1256        req->qtcb->bottom.config.feature_selection =
1257                        FSF_FEATURE_NOTIFICATION_LOST |
1258                        FSF_FEATURE_UPDATE_ALERT;
1259
1260        if (data)
1261                req->data = data;
1262
1263        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
1264        retval = zfcp_fsf_req_send(req);
1265        spin_unlock_irq(&qdio->req_q_lock);
1266        if (!retval)
1267                wait_for_completion(&req->completion);
1268
1269        zfcp_fsf_req_free(req);
1270        return retval;
1271
1272out_unlock:
1273        spin_unlock_irq(&qdio->req_q_lock);
1274        return retval;
1275}
1276
1277/**
1278 * zfcp_fsf_exchange_port_data - request information about local port
1279 * @erp_action: ERP action for the adapter for which port data is requested
1280 * Returns: 0 on success, error otherwise
1281 */
1282int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
1283{
1284        struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1285        struct zfcp_fsf_req *req;
1286        int retval = -EIO;
1287
1288        if (!(qdio->adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
1289                return -EOPNOTSUPP;
1290
1291        spin_lock_irq(&qdio->req_q_lock);
1292        if (zfcp_qdio_sbal_get(qdio))
1293                goto out;
1294
1295        req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA,
1296                                  SBAL_SFLAGS0_TYPE_READ,
1297                                  qdio->adapter->pool.erp_req);
1298
1299        if (IS_ERR(req)) {
1300                retval = PTR_ERR(req);
1301                goto out;
1302        }
1303
1304        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1305        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1306
1307        req->handler = zfcp_fsf_exchange_port_data_handler;
1308        req->erp_action = erp_action;
1309        erp_action->fsf_req_id = req->req_id;
1310
1311        zfcp_fsf_start_erp_timer(req);
1312        retval = zfcp_fsf_req_send(req);
1313        if (retval) {
1314                zfcp_fsf_req_free(req);
1315                erp_action->fsf_req_id = 0;
1316        }
1317out:
1318        spin_unlock_irq(&qdio->req_q_lock);
1319        return retval;
1320}
1321
1322/**
1323 * zfcp_fsf_exchange_port_data_sync - request information about local port
1324 * @qdio: pointer to struct zfcp_qdio
1325 * @data: pointer to struct fsf_qtcb_bottom_port
1326 * Returns: 0 on success, error otherwise
1327 */
1328int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio,
1329                                     struct fsf_qtcb_bottom_port *data)
1330{
1331        struct zfcp_fsf_req *req = NULL;
1332        int retval = -EIO;
1333
1334        if (!(qdio->adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
1335                return -EOPNOTSUPP;
1336
1337        spin_lock_irq(&qdio->req_q_lock);
1338        if (zfcp_qdio_sbal_get(qdio))
1339                goto out_unlock;
1340
1341        req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA,
1342                                  SBAL_SFLAGS0_TYPE_READ, NULL);
1343
1344        if (IS_ERR(req)) {
1345                retval = PTR_ERR(req);
1346                goto out_unlock;
1347        }
1348
1349        if (data)
1350                req->data = data;
1351
1352        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1353
1354        req->handler = zfcp_fsf_exchange_port_data_handler;
1355        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
1356        retval = zfcp_fsf_req_send(req);
1357        spin_unlock_irq(&qdio->req_q_lock);
1358
1359        if (!retval)
1360                wait_for_completion(&req->completion);
1361
1362        zfcp_fsf_req_free(req);
1363
1364        return retval;
1365
1366out_unlock:
1367        spin_unlock_irq(&qdio->req_q_lock);
1368        return retval;
1369}
1370
1371static void zfcp_fsf_open_port_handler(struct zfcp_fsf_req *req)
1372{
1373        struct zfcp_port *port = req->data;
1374        struct fsf_qtcb_header *header = &req->qtcb->header;
1375        struct fc_els_flogi *plogi;
1376
1377        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1378                goto out;
1379
1380        switch (header->fsf_status) {
1381        case FSF_PORT_ALREADY_OPEN:
1382                break;
1383        case FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED:
1384                dev_warn(&req->adapter->ccw_device->dev,
1385                         "Not enough FCP adapter resources to open "
1386                         "remote port 0x%016Lx\n",
1387                         (unsigned long long)port->wwpn);
1388                zfcp_erp_set_port_status(port,
1389                                         ZFCP_STATUS_COMMON_ERP_FAILED);
1390                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1391                break;
1392        case FSF_ADAPTER_STATUS_AVAILABLE:
1393                switch (header->fsf_status_qual.word[0]) {
1394                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1395                        /* no zfcp_fc_test_link() with failed open port */
1396                        /* fall through */
1397                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1398                case FSF_SQ_NO_RETRY_POSSIBLE:
1399                        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1400                        break;
1401                }
1402                break;
1403        case FSF_GOOD:
1404                port->handle = header->port_handle;
1405                atomic_or(ZFCP_STATUS_COMMON_OPEN |
1406                                ZFCP_STATUS_PORT_PHYS_OPEN, &port->status);
1407                atomic_andnot(ZFCP_STATUS_COMMON_ACCESS_BOXED,
1408                                  &port->status);
1409                /* check whether D_ID has changed during open */
1410                /*
1411                 * FIXME: This check is not airtight, as the FCP channel does
1412                 * not monitor closures of target port connections caused on
1413                 * the remote side. Thus, they might miss out on invalidating
1414                 * locally cached WWPNs (and other N_Port parameters) of gone
1415                 * target ports. So, our heroic attempt to make things safe
1416                 * could be undermined by 'open port' response data tagged with
1417                 * obsolete WWPNs. Another reason to monitor potential
1418                 * connection closures ourself at least (by interpreting
1419                 * incoming ELS' and unsolicited status). It just crosses my
1420                 * mind that one should be able to cross-check by means of
1421                 * another GID_PN straight after a port has been opened.
1422                 * Alternately, an ADISC/PDISC ELS should suffice, as well.
1423                 */
1424                plogi = (struct fc_els_flogi *) req->qtcb->bottom.support.els;
1425                if (req->qtcb->bottom.support.els1_length >=
1426                    FSF_PLOGI_MIN_LEN)
1427                                zfcp_fc_plogi_evaluate(port, plogi);
1428                break;
1429        case FSF_UNKNOWN_OP_SUBTYPE:
1430                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1431                break;
1432        }
1433
1434out:
1435        put_device(&port->dev);
1436}
1437
1438/**
1439 * zfcp_fsf_open_port - create and send open port request
1440 * @erp_action: pointer to struct zfcp_erp_action
1441 * Returns: 0 on success, error otherwise
1442 */
1443int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
1444{
1445        struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1446        struct zfcp_port *port = erp_action->port;
1447        struct zfcp_fsf_req *req;
1448        int retval = -EIO;
1449
1450        spin_lock_irq(&qdio->req_q_lock);
1451        if (zfcp_qdio_sbal_get(qdio))
1452                goto out;
1453
1454        req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID,
1455                                  SBAL_SFLAGS0_TYPE_READ,
1456                                  qdio->adapter->pool.erp_req);
1457
1458        if (IS_ERR(req)) {
1459                retval = PTR_ERR(req);
1460                goto out;
1461        }
1462
1463        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1464        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1465
1466        req->handler = zfcp_fsf_open_port_handler;
1467        hton24(req->qtcb->bottom.support.d_id, port->d_id);
1468        req->data = port;
1469        req->erp_action = erp_action;
1470        erp_action->fsf_req_id = req->req_id;
1471        get_device(&port->dev);
1472
1473        zfcp_fsf_start_erp_timer(req);
1474        retval = zfcp_fsf_req_send(req);
1475        if (retval) {
1476                zfcp_fsf_req_free(req);
1477                erp_action->fsf_req_id = 0;
1478                put_device(&port->dev);
1479        }
1480out:
1481        spin_unlock_irq(&qdio->req_q_lock);
1482        return retval;
1483}
1484
1485static void zfcp_fsf_close_port_handler(struct zfcp_fsf_req *req)
1486{
1487        struct zfcp_port *port = req->data;
1488
1489        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1490                return;
1491
1492        switch (req->qtcb->header.fsf_status) {
1493        case FSF_PORT_HANDLE_NOT_VALID:
1494                zfcp_erp_adapter_reopen(port->adapter, 0, "fscph_1");
1495                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1496                break;
1497        case FSF_ADAPTER_STATUS_AVAILABLE:
1498                break;
1499        case FSF_GOOD:
1500                zfcp_erp_clear_port_status(port, ZFCP_STATUS_COMMON_OPEN);
1501                break;
1502        }
1503}
1504
1505/**
1506 * zfcp_fsf_close_port - create and send close port request
1507 * @erp_action: pointer to struct zfcp_erp_action
1508 * Returns: 0 on success, error otherwise
1509 */
1510int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
1511{
1512        struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1513        struct zfcp_fsf_req *req;
1514        int retval = -EIO;
1515
1516        spin_lock_irq(&qdio->req_q_lock);
1517        if (zfcp_qdio_sbal_get(qdio))
1518                goto out;
1519
1520        req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT,
1521                                  SBAL_SFLAGS0_TYPE_READ,
1522                                  qdio->adapter->pool.erp_req);
1523
1524        if (IS_ERR(req)) {
1525                retval = PTR_ERR(req);
1526                goto out;
1527        }
1528
1529        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1530        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1531
1532        req->handler = zfcp_fsf_close_port_handler;
1533        req->data = erp_action->port;
1534        req->erp_action = erp_action;
1535        req->qtcb->header.port_handle = erp_action->port->handle;
1536        erp_action->fsf_req_id = req->req_id;
1537
1538        zfcp_fsf_start_erp_timer(req);
1539        retval = zfcp_fsf_req_send(req);
1540        if (retval) {
1541                zfcp_fsf_req_free(req);
1542                erp_action->fsf_req_id = 0;
1543        }
1544out:
1545        spin_unlock_irq(&qdio->req_q_lock);
1546        return retval;
1547}
1548
1549static void zfcp_fsf_open_wka_port_handler(struct zfcp_fsf_req *req)
1550{
1551        struct zfcp_fc_wka_port *wka_port = req->data;
1552        struct fsf_qtcb_header *header = &req->qtcb->header;
1553
1554        if (req->status & ZFCP_STATUS_FSFREQ_ERROR) {
1555                wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
1556                goto out;
1557        }
1558
1559        switch (header->fsf_status) {
1560        case FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED:
1561                dev_warn(&req->adapter->ccw_device->dev,
1562                         "Opening WKA port 0x%x failed\n", wka_port->d_id);
1563                /* fall through */
1564        case FSF_ADAPTER_STATUS_AVAILABLE:
1565                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1566                wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
1567                break;
1568        case FSF_GOOD:
1569                wka_port->handle = header->port_handle;
1570                /* fall through */
1571        case FSF_PORT_ALREADY_OPEN:
1572                wka_port->status = ZFCP_FC_WKA_PORT_ONLINE;
1573        }
1574out:
1575        wake_up(&wka_port->completion_wq);
1576}
1577
1578/**
1579 * zfcp_fsf_open_wka_port - create and send open wka-port request
1580 * @wka_port: pointer to struct zfcp_fc_wka_port
1581 * Returns: 0 on success, error otherwise
1582 */
1583int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
1584{
1585        struct zfcp_qdio *qdio = wka_port->adapter->qdio;
1586        struct zfcp_fsf_req *req;
1587        int retval = -EIO;
1588
1589        spin_lock_irq(&qdio->req_q_lock);
1590        if (zfcp_qdio_sbal_get(qdio))
1591                goto out;
1592
1593        req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID,
1594                                  SBAL_SFLAGS0_TYPE_READ,
1595                                  qdio->adapter->pool.erp_req);
1596
1597        if (IS_ERR(req)) {
1598                retval = PTR_ERR(req);
1599                goto out;
1600        }
1601
1602        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1603        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1604
1605        req->handler = zfcp_fsf_open_wka_port_handler;
1606        hton24(req->qtcb->bottom.support.d_id, wka_port->d_id);
1607        req->data = wka_port;
1608
1609        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
1610        retval = zfcp_fsf_req_send(req);
1611        if (retval)
1612                zfcp_fsf_req_free(req);
1613out:
1614        spin_unlock_irq(&qdio->req_q_lock);
1615        if (!retval)
1616                zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id);
1617        return retval;
1618}
1619
1620static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req)
1621{
1622        struct zfcp_fc_wka_port *wka_port = req->data;
1623
1624        if (req->qtcb->header.fsf_status == FSF_PORT_HANDLE_NOT_VALID) {
1625                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1626                zfcp_erp_adapter_reopen(wka_port->adapter, 0, "fscwph1");
1627        }
1628
1629        wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
1630        wake_up(&wka_port->completion_wq);
1631}
1632
1633/**
1634 * zfcp_fsf_close_wka_port - create and send close wka port request
1635 * @wka_port: WKA port to open
1636 * Returns: 0 on success, error otherwise
1637 */
1638int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
1639{
1640        struct zfcp_qdio *qdio = wka_port->adapter->qdio;
1641        struct zfcp_fsf_req *req;
1642        int retval = -EIO;
1643
1644        spin_lock_irq(&qdio->req_q_lock);
1645        if (zfcp_qdio_sbal_get(qdio))
1646                goto out;
1647
1648        req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT,
1649                                  SBAL_SFLAGS0_TYPE_READ,
1650                                  qdio->adapter->pool.erp_req);
1651
1652        if (IS_ERR(req)) {
1653                retval = PTR_ERR(req);
1654                goto out;
1655        }
1656
1657        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1658        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1659
1660        req->handler = zfcp_fsf_close_wka_port_handler;
1661        req->data = wka_port;
1662        req->qtcb->header.port_handle = wka_port->handle;
1663
1664        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
1665        retval = zfcp_fsf_req_send(req);
1666        if (retval)
1667                zfcp_fsf_req_free(req);
1668out:
1669        spin_unlock_irq(&qdio->req_q_lock);
1670        if (!retval)
1671                zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id);
1672        return retval;
1673}
1674
1675static void zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *req)
1676{
1677        struct zfcp_port *port = req->data;
1678        struct fsf_qtcb_header *header = &req->qtcb->header;
1679        struct scsi_device *sdev;
1680
1681        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1682                return;
1683
1684        switch (header->fsf_status) {
1685        case FSF_PORT_HANDLE_NOT_VALID:
1686                zfcp_erp_adapter_reopen(port->adapter, 0, "fscpph1");
1687                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1688                break;
1689        case FSF_PORT_BOXED:
1690                /* can't use generic zfcp_erp_modify_port_status because
1691                 * ZFCP_STATUS_COMMON_OPEN must not be reset for the port */
1692                atomic_andnot(ZFCP_STATUS_PORT_PHYS_OPEN, &port->status);
1693                shost_for_each_device(sdev, port->adapter->scsi_host)
1694                        if (sdev_to_zfcp(sdev)->port == port)
1695                                atomic_andnot(ZFCP_STATUS_COMMON_OPEN,
1696                                                  &sdev_to_zfcp(sdev)->status);
1697                zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_ACCESS_BOXED);
1698                zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
1699                                     "fscpph2");
1700                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1701                break;
1702        case FSF_ADAPTER_STATUS_AVAILABLE:
1703                switch (header->fsf_status_qual.word[0]) {
1704                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1705                        /* fall through */
1706                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1707                        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1708                        break;
1709                }
1710                break;
1711        case FSF_GOOD:
1712                /* can't use generic zfcp_erp_modify_port_status because
1713                 * ZFCP_STATUS_COMMON_OPEN must not be reset for the port
1714                 */
1715                atomic_andnot(ZFCP_STATUS_PORT_PHYS_OPEN, &port->status);
1716                shost_for_each_device(sdev, port->adapter->scsi_host)
1717                        if (sdev_to_zfcp(sdev)->port == port)
1718                                atomic_andnot(ZFCP_STATUS_COMMON_OPEN,
1719                                                  &sdev_to_zfcp(sdev)->status);
1720                break;
1721        }
1722}
1723
1724/**
1725 * zfcp_fsf_close_physical_port - close physical port
1726 * @erp_action: pointer to struct zfcp_erp_action
1727 * Returns: 0 on success
1728 */
1729int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
1730{
1731        struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1732        struct zfcp_fsf_req *req;
1733        int retval = -EIO;
1734
1735        spin_lock_irq(&qdio->req_q_lock);
1736        if (zfcp_qdio_sbal_get(qdio))
1737                goto out;
1738
1739        req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PHYSICAL_PORT,
1740                                  SBAL_SFLAGS0_TYPE_READ,
1741                                  qdio->adapter->pool.erp_req);
1742
1743        if (IS_ERR(req)) {
1744                retval = PTR_ERR(req);
1745                goto out;
1746        }
1747
1748        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1749        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1750
1751        req->data = erp_action->port;
1752        req->qtcb->header.port_handle = erp_action->port->handle;
1753        req->erp_action = erp_action;
1754        req->handler = zfcp_fsf_close_physical_port_handler;
1755        erp_action->fsf_req_id = req->req_id;
1756
1757        zfcp_fsf_start_erp_timer(req);
1758        retval = zfcp_fsf_req_send(req);
1759        if (retval) {
1760                zfcp_fsf_req_free(req);
1761                erp_action->fsf_req_id = 0;
1762        }
1763out:
1764        spin_unlock_irq(&qdio->req_q_lock);
1765        return retval;
1766}
1767
1768static void zfcp_fsf_open_lun_handler(struct zfcp_fsf_req *req)
1769{
1770        struct zfcp_adapter *adapter = req->adapter;
1771        struct scsi_device *sdev = req->data;
1772        struct zfcp_scsi_dev *zfcp_sdev;
1773        struct fsf_qtcb_header *header = &req->qtcb->header;
1774        union fsf_status_qual *qual = &header->fsf_status_qual;
1775
1776        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1777                return;
1778
1779        zfcp_sdev = sdev_to_zfcp(sdev);
1780
1781        atomic_andnot(ZFCP_STATUS_COMMON_ACCESS_DENIED |
1782                          ZFCP_STATUS_COMMON_ACCESS_BOXED,
1783                          &zfcp_sdev->status);
1784
1785        switch (header->fsf_status) {
1786
1787        case FSF_PORT_HANDLE_NOT_VALID:
1788                zfcp_erp_adapter_reopen(adapter, 0, "fsouh_1");
1789                /* fall through */
1790        case FSF_LUN_ALREADY_OPEN:
1791                break;
1792        case FSF_PORT_BOXED:
1793                zfcp_erp_set_port_status(zfcp_sdev->port,
1794                                         ZFCP_STATUS_COMMON_ACCESS_BOXED);
1795                zfcp_erp_port_reopen(zfcp_sdev->port,
1796                                     ZFCP_STATUS_COMMON_ERP_FAILED, "fsouh_2");
1797                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1798                break;
1799        case FSF_LUN_SHARING_VIOLATION:
1800                if (qual->word[0])
1801                        dev_warn(&zfcp_sdev->port->adapter->ccw_device->dev,
1802                                 "LUN 0x%Lx on port 0x%Lx is already in "
1803                                 "use by CSS%d, MIF Image ID %x\n",
1804                                 zfcp_scsi_dev_lun(sdev),
1805                                 (unsigned long long)zfcp_sdev->port->wwpn,
1806                                 qual->fsf_queue_designator.cssid,
1807                                 qual->fsf_queue_designator.hla);
1808                zfcp_erp_set_lun_status(sdev,
1809                                        ZFCP_STATUS_COMMON_ERP_FAILED |
1810                                        ZFCP_STATUS_COMMON_ACCESS_DENIED);
1811                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1812                break;
1813        case FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED:
1814                dev_warn(&adapter->ccw_device->dev,
1815                         "No handle is available for LUN "
1816                         "0x%016Lx on port 0x%016Lx\n",
1817                         (unsigned long long)zfcp_scsi_dev_lun(sdev),
1818                         (unsigned long long)zfcp_sdev->port->wwpn);
1819                zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ERP_FAILED);
1820                /* fall through */
1821        case FSF_INVALID_COMMAND_OPTION:
1822                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1823                break;
1824        case FSF_ADAPTER_STATUS_AVAILABLE:
1825                switch (header->fsf_status_qual.word[0]) {
1826                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1827                        zfcp_fc_test_link(zfcp_sdev->port);
1828                        /* fall through */
1829                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1830                        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1831                        break;
1832                }
1833                break;
1834
1835        case FSF_GOOD:
1836                zfcp_sdev->lun_handle = header->lun_handle;
1837                atomic_or(ZFCP_STATUS_COMMON_OPEN, &zfcp_sdev->status);
1838                break;
1839        }
1840}
1841
1842/**
1843 * zfcp_fsf_open_lun - open LUN
1844 * @erp_action: pointer to struct zfcp_erp_action
1845 * Returns: 0 on success, error otherwise
1846 */
1847int zfcp_fsf_open_lun(struct zfcp_erp_action *erp_action)
1848{
1849        struct zfcp_adapter *adapter = erp_action->adapter;
1850        struct zfcp_qdio *qdio = adapter->qdio;
1851        struct zfcp_fsf_req *req;
1852        int retval = -EIO;
1853
1854        spin_lock_irq(&qdio->req_q_lock);
1855        if (zfcp_qdio_sbal_get(qdio))
1856                goto out;
1857
1858        req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_LUN,
1859                                  SBAL_SFLAGS0_TYPE_READ,
1860                                  adapter->pool.erp_req);
1861
1862        if (IS_ERR(req)) {
1863                retval = PTR_ERR(req);
1864                goto out;
1865        }
1866
1867        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1868        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1869
1870        req->qtcb->header.port_handle = erp_action->port->handle;
1871        req->qtcb->bottom.support.fcp_lun = zfcp_scsi_dev_lun(erp_action->sdev);
1872        req->handler = zfcp_fsf_open_lun_handler;
1873        req->data = erp_action->sdev;
1874        req->erp_action = erp_action;
1875        erp_action->fsf_req_id = req->req_id;
1876
1877        if (!(adapter->connection_features & FSF_FEATURE_NPIV_MODE))
1878                req->qtcb->bottom.support.option = FSF_OPEN_LUN_SUPPRESS_BOXING;
1879
1880        zfcp_fsf_start_erp_timer(req);
1881        retval = zfcp_fsf_req_send(req);
1882        if (retval) {
1883                zfcp_fsf_req_free(req);
1884                erp_action->fsf_req_id = 0;
1885        }
1886out:
1887        spin_unlock_irq(&qdio->req_q_lock);
1888        return retval;
1889}
1890
1891static void zfcp_fsf_close_lun_handler(struct zfcp_fsf_req *req)
1892{
1893        struct scsi_device *sdev = req->data;
1894        struct zfcp_scsi_dev *zfcp_sdev;
1895
1896        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1897                return;
1898
1899        zfcp_sdev = sdev_to_zfcp(sdev);
1900
1901        switch (req->qtcb->header.fsf_status) {
1902        case FSF_PORT_HANDLE_NOT_VALID:
1903                zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fscuh_1");
1904                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1905                break;
1906        case FSF_LUN_HANDLE_NOT_VALID:
1907                zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fscuh_2");
1908                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1909                break;
1910        case FSF_PORT_BOXED:
1911                zfcp_erp_set_port_status(zfcp_sdev->port,
1912                                         ZFCP_STATUS_COMMON_ACCESS_BOXED);
1913                zfcp_erp_port_reopen(zfcp_sdev->port,
1914                                     ZFCP_STATUS_COMMON_ERP_FAILED, "fscuh_3");
1915                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1916                break;
1917        case FSF_ADAPTER_STATUS_AVAILABLE:
1918                switch (req->qtcb->header.fsf_status_qual.word[0]) {
1919                case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1920                        zfcp_fc_test_link(zfcp_sdev->port);
1921                        /* fall through */
1922                case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1923                        req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1924                        break;
1925                }
1926                break;
1927        case FSF_GOOD:
1928                atomic_andnot(ZFCP_STATUS_COMMON_OPEN, &zfcp_sdev->status);
1929                break;
1930        }
1931}
1932
1933/**
1934 * zfcp_fsf_close_LUN - close LUN
1935 * @erp_action: pointer to erp_action triggering the "close LUN"
1936 * Returns: 0 on success, error otherwise
1937 */
1938int zfcp_fsf_close_lun(struct zfcp_erp_action *erp_action)
1939{
1940        struct zfcp_qdio *qdio = erp_action->adapter->qdio;
1941        struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(erp_action->sdev);
1942        struct zfcp_fsf_req *req;
1943        int retval = -EIO;
1944
1945        spin_lock_irq(&qdio->req_q_lock);
1946        if (zfcp_qdio_sbal_get(qdio))
1947                goto out;
1948
1949        req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_LUN,
1950                                  SBAL_SFLAGS0_TYPE_READ,
1951                                  qdio->adapter->pool.erp_req);
1952
1953        if (IS_ERR(req)) {
1954                retval = PTR_ERR(req);
1955                goto out;
1956        }
1957
1958        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
1959        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
1960
1961        req->qtcb->header.port_handle = erp_action->port->handle;
1962        req->qtcb->header.lun_handle = zfcp_sdev->lun_handle;
1963        req->handler = zfcp_fsf_close_lun_handler;
1964        req->data = erp_action->sdev;
1965        req->erp_action = erp_action;
1966        erp_action->fsf_req_id = req->req_id;
1967
1968        zfcp_fsf_start_erp_timer(req);
1969        retval = zfcp_fsf_req_send(req);
1970        if (retval) {
1971                zfcp_fsf_req_free(req);
1972                erp_action->fsf_req_id = 0;
1973        }
1974out:
1975        spin_unlock_irq(&qdio->req_q_lock);
1976        return retval;
1977}
1978
1979static void zfcp_fsf_update_lat(struct fsf_latency_record *lat_rec, u32 lat)
1980{
1981        lat_rec->sum += lat;
1982        lat_rec->min = min(lat_rec->min, lat);
1983        lat_rec->max = max(lat_rec->max, lat);
1984}
1985
1986static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi)
1987{
1988        struct fsf_qual_latency_info *lat_in;
1989        struct latency_cont *lat = NULL;
1990        struct zfcp_scsi_dev *zfcp_sdev;
1991        struct zfcp_blk_drv_data blktrc;
1992        int ticks = req->adapter->timer_ticks;
1993
1994        lat_in = &req->qtcb->prefix.prot_status_qual.latency_info;
1995
1996        blktrc.flags = 0;
1997        blktrc.magic = ZFCP_BLK_DRV_DATA_MAGIC;
1998        if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1999                blktrc.flags |= ZFCP_BLK_REQ_ERROR;
2000        blktrc.inb_usage = 0;
2001        blktrc.outb_usage = req->qdio_req.qdio_outb_usage;
2002
2003        if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA &&
2004            !(req->status & ZFCP_STATUS_FSFREQ_ERROR)) {
2005                zfcp_sdev = sdev_to_zfcp(scsi->device);
2006                blktrc.flags |= ZFCP_BLK_LAT_VALID;
2007                blktrc.channel_lat = lat_in->channel_lat * ticks;
2008                blktrc.fabric_lat = lat_in->fabric_lat * ticks;
2009
2010                switch (req->qtcb->bottom.io.data_direction) {
2011                case FSF_DATADIR_DIF_READ_STRIP:
2012                case FSF_DATADIR_DIF_READ_CONVERT:
2013                case FSF_DATADIR_READ:
2014                        lat = &zfcp_sdev->latencies.read;
2015                        break;
2016                case FSF_DATADIR_DIF_WRITE_INSERT:
2017                case FSF_DATADIR_DIF_WRITE_CONVERT:
2018                case FSF_DATADIR_WRITE:
2019                        lat = &zfcp_sdev->latencies.write;
2020                        break;
2021                case FSF_DATADIR_CMND:
2022                        lat = &zfcp_sdev->latencies.cmd;
2023                        break;
2024                }
2025
2026                if (lat) {
2027                        spin_lock(&zfcp_sdev->latencies.lock);
2028                        zfcp_fsf_update_lat(&lat->channel, lat_in->channel_lat);
2029                        zfcp_fsf_update_lat(&lat->fabric, lat_in->fabric_lat);
2030                        lat->counter++;
2031                        spin_unlock(&zfcp_sdev->latencies.lock);
2032                }
2033        }
2034
2035        blk_add_driver_data(scsi->request->q, scsi->request, &blktrc,
2036                            sizeof(blktrc));
2037}
2038
2039static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req)
2040{
2041        struct scsi_cmnd *scmnd = req->data;
2042        struct scsi_device *sdev = scmnd->device;
2043        struct zfcp_scsi_dev *zfcp_sdev;
2044        struct fsf_qtcb_header *header = &req->qtcb->header;
2045
2046        if (unlikely(req->status & ZFCP_STATUS_FSFREQ_ERROR))
2047                return;
2048
2049        zfcp_sdev = sdev_to_zfcp(sdev);
2050
2051        switch (header->fsf_status) {
2052        case FSF_HANDLE_MISMATCH:
2053        case FSF_PORT_HANDLE_NOT_VALID:
2054                zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fssfch1");
2055                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2056                break;
2057        case FSF_FCPLUN_NOT_VALID:
2058        case FSF_LUN_HANDLE_NOT_VALID:
2059                zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fssfch2");
2060                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2061                break;
2062        case FSF_SERVICE_CLASS_NOT_SUPPORTED:
2063                zfcp_fsf_class_not_supp(req);
2064                break;
2065        case FSF_DIRECTION_INDICATOR_NOT_VALID:
2066                dev_err(&req->adapter->ccw_device->dev,
2067                        "Incorrect direction %d, LUN 0x%016Lx on port "
2068                        "0x%016Lx closed\n",
2069                        req->qtcb->bottom.io.data_direction,
2070                        (unsigned long long)zfcp_scsi_dev_lun(sdev),
2071                        (unsigned long long)zfcp_sdev->port->wwpn);
2072                zfcp_erp_adapter_shutdown(zfcp_sdev->port->adapter, 0,
2073                                          "fssfch3");
2074                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2075                break;
2076        case FSF_CMND_LENGTH_NOT_VALID:
2077                dev_err(&req->adapter->ccw_device->dev,
2078                        "Incorrect CDB length %d, LUN 0x%016Lx on "
2079                        "port 0x%016Lx closed\n",
2080                        req->qtcb->bottom.io.fcp_cmnd_length,
2081                        (unsigned long long)zfcp_scsi_dev_lun(sdev),
2082                        (unsigned long long)zfcp_sdev->port->wwpn);
2083                zfcp_erp_adapter_shutdown(zfcp_sdev->port->adapter, 0,
2084                                          "fssfch4");
2085                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2086                break;
2087        case FSF_PORT_BOXED:
2088                zfcp_erp_set_port_status(zfcp_sdev->port,
2089                                         ZFCP_STATUS_COMMON_ACCESS_BOXED);
2090                zfcp_erp_port_reopen(zfcp_sdev->port,
2091                                     ZFCP_STATUS_COMMON_ERP_FAILED, "fssfch5");
2092                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2093                break;
2094        case FSF_LUN_BOXED:
2095                zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ACCESS_BOXED);
2096                zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED,
2097                                    "fssfch6");
2098                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2099                break;
2100        case FSF_ADAPTER_STATUS_AVAILABLE:
2101                if (header->fsf_status_qual.word[0] ==
2102                    FSF_SQ_INVOKE_LINK_TEST_PROCEDURE)
2103                        zfcp_fc_test_link(zfcp_sdev->port);
2104                req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2105                break;
2106        }
2107}
2108
2109static void zfcp_fsf_fcp_cmnd_handler(struct zfcp_fsf_req *req)
2110{
2111        struct scsi_cmnd *scpnt;
2112        struct fcp_resp_with_ext *fcp_rsp;
2113        unsigned long flags;
2114
2115        read_lock_irqsave(&req->adapter->abort_lock, flags);
2116
2117        scpnt = req->data;
2118        if (unlikely(!scpnt)) {
2119                read_unlock_irqrestore(&req->adapter->abort_lock, flags);
2120                return;
2121        }
2122
2123        zfcp_fsf_fcp_handler_common(req);
2124
2125        if (unlikely(req->status & ZFCP_STATUS_FSFREQ_ERROR)) {
2126                set_host_byte(scpnt, DID_TRANSPORT_DISRUPTED);
2127                goto skip_fsfstatus;
2128        }
2129
2130        switch (req->qtcb->header.fsf_status) {
2131        case FSF_INCONSISTENT_PROT_DATA:
2132        case FSF_INVALID_PROT_PARM:
2133                set_host_byte(scpnt, DID_ERROR);
2134                goto skip_fsfstatus;
2135        case FSF_BLOCK_GUARD_CHECK_FAILURE:
2136                zfcp_scsi_dif_sense_error(scpnt, 0x1);
2137                goto skip_fsfstatus;
2138        case FSF_APP_TAG_CHECK_FAILURE:
2139                zfcp_scsi_dif_sense_error(scpnt, 0x2);
2140                goto skip_fsfstatus;
2141        case FSF_REF_TAG_CHECK_FAILURE:
2142                zfcp_scsi_dif_sense_error(scpnt, 0x3);
2143                goto skip_fsfstatus;
2144        }
2145        BUILD_BUG_ON(sizeof(struct fcp_resp_with_ext) > FSF_FCP_RSP_SIZE);
2146        fcp_rsp = &req->qtcb->bottom.io.fcp_rsp.iu;
2147        zfcp_fc_eval_fcp_rsp(fcp_rsp, scpnt);
2148
2149skip_fsfstatus:
2150        zfcp_fsf_req_trace(req, scpnt);
2151        zfcp_dbf_scsi_result(scpnt, req);
2152
2153        scpnt->host_scribble = NULL;
2154        (scpnt->scsi_done) (scpnt);
2155        /*
2156         * We must hold this lock until scsi_done has been called.
2157         * Otherwise we may call scsi_done after abort regarding this
2158         * command has completed.
2159         * Note: scsi_done must not block!
2160         */
2161        read_unlock_irqrestore(&req->adapter->abort_lock, flags);
2162}
2163
2164static int zfcp_fsf_set_data_dir(struct scsi_cmnd *scsi_cmnd, u32 *data_dir)
2165{
2166        switch (scsi_get_prot_op(scsi_cmnd)) {
2167        case SCSI_PROT_NORMAL:
2168                switch (scsi_cmnd->sc_data_direction) {
2169                case DMA_NONE:
2170                        *data_dir = FSF_DATADIR_CMND;
2171                        break;
2172                case DMA_FROM_DEVICE:
2173                        *data_dir = FSF_DATADIR_READ;
2174                        break;
2175                case DMA_TO_DEVICE:
2176                        *data_dir = FSF_DATADIR_WRITE;
2177                        break;
2178                case DMA_BIDIRECTIONAL:
2179                        return -EINVAL;
2180                }
2181                break;
2182
2183        case SCSI_PROT_READ_STRIP:
2184                *data_dir = FSF_DATADIR_DIF_READ_STRIP;
2185                break;
2186        case SCSI_PROT_WRITE_INSERT:
2187                *data_dir = FSF_DATADIR_DIF_WRITE_INSERT;
2188                break;
2189        case SCSI_PROT_READ_PASS:
2190                *data_dir = FSF_DATADIR_DIF_READ_CONVERT;
2191                break;
2192        case SCSI_PROT_WRITE_PASS:
2193                *data_dir = FSF_DATADIR_DIF_WRITE_CONVERT;
2194                break;
2195        default:
2196                return -EINVAL;
2197        }
2198
2199        return 0;
2200}
2201
2202/**
2203 * zfcp_fsf_fcp_cmnd - initiate an FCP command (for a SCSI command)
2204 * @scsi_cmnd: scsi command to be sent
2205 */
2206int zfcp_fsf_fcp_cmnd(struct scsi_cmnd *scsi_cmnd)
2207{
2208        struct zfcp_fsf_req *req;
2209        struct fcp_cmnd *fcp_cmnd;
2210        u8 sbtype = SBAL_SFLAGS0_TYPE_READ;
2211        int retval = -EIO;
2212        struct scsi_device *sdev = scsi_cmnd->device;
2213        struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
2214        struct zfcp_adapter *adapter = zfcp_sdev->port->adapter;
2215        struct zfcp_qdio *qdio = adapter->qdio;
2216        struct fsf_qtcb_bottom_io *io;
2217        unsigned long flags;
2218
2219        if (unlikely(!(atomic_read(&zfcp_sdev->status) &
2220                       ZFCP_STATUS_COMMON_UNBLOCKED)))
2221                return -EBUSY;
2222
2223        spin_lock_irqsave(&qdio->req_q_lock, flags);
2224        if (atomic_read(&qdio->req_q_free) <= 0) {
2225                atomic_inc(&qdio->req_q_full);
2226                goto out;
2227        }
2228
2229        if (scsi_cmnd->sc_data_direction == DMA_TO_DEVICE)
2230                sbtype = SBAL_SFLAGS0_TYPE_WRITE;
2231
2232        req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND,
2233                                  sbtype, adapter->pool.scsi_req);
2234
2235        if (IS_ERR(req)) {
2236                retval = PTR_ERR(req);
2237                goto out;
2238        }
2239
2240        scsi_cmnd->host_scribble = (unsigned char *) req->req_id;
2241
2242        io = &req->qtcb->bottom.io;
2243        req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
2244        req->data = scsi_cmnd;
2245        req->handler = zfcp_fsf_fcp_cmnd_handler;
2246        req->qtcb->header.lun_handle = zfcp_sdev->lun_handle;
2247        req->qtcb->header.port_handle = zfcp_sdev->port->handle;
2248        io->service_class = FSF_CLASS_3;
2249        io->fcp_cmnd_length = FCP_CMND_LEN;
2250
2251        if (scsi_get_prot_op(scsi_cmnd) != SCSI_PROT_NORMAL) {
2252                io->data_block_length = scsi_cmnd->device->sector_size;
2253                io->ref_tag_value = scsi_get_lba(scsi_cmnd) & 0xFFFFFFFF;
2254        }
2255
2256        if (zfcp_fsf_set_data_dir(scsi_cmnd, &io->data_direction))
2257                goto failed_scsi_cmnd;
2258
2259        BUILD_BUG_ON(sizeof(struct fcp_cmnd) > FSF_FCP_CMND_SIZE);
2260        fcp_cmnd = &req->qtcb->bottom.io.fcp_cmnd.iu;
2261        zfcp_fc_scsi_to_fcp(fcp_cmnd, scsi_cmnd, 0);
2262
2263        if ((scsi_get_prot_op(scsi_cmnd) != SCSI_PROT_NORMAL) &&
2264            scsi_prot_sg_count(scsi_cmnd)) {
2265                zfcp_qdio_set_data_div(qdio, &req->qdio_req,
2266                                       scsi_prot_sg_count(scsi_cmnd));
2267                retval = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req,
2268                                                 scsi_prot_sglist(scsi_cmnd));
2269                if (retval)
2270                        goto failed_scsi_cmnd;
2271                io->prot_data_length = zfcp_qdio_real_bytes(
2272                                                scsi_prot_sglist(scsi_cmnd));
2273        }
2274
2275        retval = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req,
2276                                         scsi_sglist(scsi_cmnd));
2277        if (unlikely(retval))
2278                goto failed_scsi_cmnd;
2279
2280        zfcp_qdio_set_sbale_last(adapter->qdio, &req->qdio_req);
2281        if (zfcp_adapter_multi_buffer_active(adapter))
2282                zfcp_qdio_set_scount(qdio, &req->qdio_req);
2283
2284        retval = zfcp_fsf_req_send(req);
2285        if (unlikely(retval))
2286                goto failed_scsi_cmnd;
2287
2288        goto out;
2289
2290failed_scsi_cmnd:
2291        zfcp_fsf_req_free(req);
2292        scsi_cmnd->host_scribble = NULL;
2293out:
2294        spin_unlock_irqrestore(&qdio->req_q_lock, flags);
2295        return retval;
2296}
2297
2298static void zfcp_fsf_fcp_task_mgmt_handler(struct zfcp_fsf_req *req)
2299{
2300        struct fcp_resp_with_ext *fcp_rsp;
2301        struct fcp_resp_rsp_info *rsp_info;
2302
2303        zfcp_fsf_fcp_handler_common(req);
2304
2305        fcp_rsp = &req->qtcb->bottom.io.fcp_rsp.iu;
2306        rsp_info = (struct fcp_resp_rsp_info *) &fcp_rsp[1];
2307
2308        if ((rsp_info->rsp_code != FCP_TMF_CMPL) ||
2309             (req->status & ZFCP_STATUS_FSFREQ_ERROR))
2310                req->status |= ZFCP_STATUS_FSFREQ_TMFUNCFAILED;
2311}
2312
2313/**
2314 * zfcp_fsf_fcp_task_mgmt - send SCSI task management command
2315 * @scmnd: SCSI command to send the task management command for
2316 * @tm_flags: unsigned byte for task management flags
2317 * Returns: on success pointer to struct fsf_req, NULL otherwise
2318 */
2319struct zfcp_fsf_req *zfcp_fsf_fcp_task_mgmt(struct scsi_cmnd *scmnd,
2320                                            u8 tm_flags)
2321{
2322        struct zfcp_fsf_req *req = NULL;
2323        struct fcp_cmnd *fcp_cmnd;
2324        struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scmnd->device);
2325        struct zfcp_qdio *qdio = zfcp_sdev->port->adapter->qdio;
2326
2327        if (unlikely(!(atomic_read(&zfcp_sdev->status) &
2328                       ZFCP_STATUS_COMMON_UNBLOCKED)))
2329                return NULL;
2330
2331        spin_lock_irq(&qdio->req_q_lock);
2332        if (zfcp_qdio_sbal_get(qdio))
2333                goto out;
2334
2335        req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND,
2336                                  SBAL_SFLAGS0_TYPE_WRITE,
2337                                  qdio->adapter->pool.scsi_req);
2338
2339        if (IS_ERR(req)) {
2340                req = NULL;
2341                goto out;
2342        }
2343
2344        req->data = scmnd;
2345        req->handler = zfcp_fsf_fcp_task_mgmt_handler;
2346        req->qtcb->header.lun_handle = zfcp_sdev->lun_handle;
2347        req->qtcb->header.port_handle = zfcp_sdev->port->handle;
2348        req->qtcb->bottom.io.data_direction = FSF_DATADIR_CMND;
2349        req->qtcb->bottom.io.service_class = FSF_CLASS_3;
2350        req->qtcb->bottom.io.fcp_cmnd_length = FCP_CMND_LEN;
2351
2352        zfcp_qdio_set_sbale_last(qdio, &req->qdio_req);
2353
2354        fcp_cmnd = &req->qtcb->bottom.io.fcp_cmnd.iu;
2355        zfcp_fc_scsi_to_fcp(fcp_cmnd, scmnd, tm_flags);
2356
2357        zfcp_fsf_start_timer(req, ZFCP_SCSI_ER_TIMEOUT);
2358        if (!zfcp_fsf_req_send(req))
2359                goto out;
2360
2361        zfcp_fsf_req_free(req);
2362        req = NULL;
2363out:
2364        spin_unlock_irq(&qdio->req_q_lock);
2365        return req;
2366}
2367
2368/**
2369 * zfcp_fsf_reqid_check - validate req_id contained in SBAL returned by QDIO
2370 * @adapter: pointer to struct zfcp_adapter
2371 * @sbal_idx: response queue index of SBAL to be processed
2372 */
2373void zfcp_fsf_reqid_check(struct zfcp_qdio *qdio, int sbal_idx)
2374{
2375        struct zfcp_adapter *adapter = qdio->adapter;
2376        struct qdio_buffer *sbal = qdio->res_q[sbal_idx];
2377        struct qdio_buffer_element *sbale;
2378        struct zfcp_fsf_req *fsf_req;
2379        unsigned long req_id;
2380        int idx;
2381
2382        for (idx = 0; idx < QDIO_MAX_ELEMENTS_PER_BUFFER; idx++) {
2383
2384                sbale = &sbal->element[idx];
2385                req_id = (unsigned long) sbale->addr;
2386                fsf_req = zfcp_reqlist_find_rm(adapter->req_list, req_id);
2387
2388                if (!fsf_req) {
2389                        /*
2390                         * Unknown request means that we have potentially memory
2391                         * corruption and must stop the machine immediately.
2392                         */
2393                        zfcp_qdio_siosl(adapter);
2394                        panic("error: unknown req_id (%lx) on adapter %s.\n",
2395                              req_id, dev_name(&adapter->ccw_device->dev));
2396                }
2397
2398                zfcp_fsf_req_complete(fsf_req);
2399
2400                if (likely(sbale->eflags & SBAL_EFLAGS_LAST_ENTRY))
2401                        break;
2402        }
2403}
2404