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