Showing error 1917

User: Jiri Slaby
Error type: Invalid Pointer Dereference
Error type description: A pointer which is invalid is being dereferenced
File location: drivers/s390/scsi/zfcp_fsf.c
Line in file: 1279
Project: Linux Kernel
Project version: 2.6.28
Tools: Cppcheck (1.59)
Entered: 2013-10-17 18:38:34 UTC


Source:

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