cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

zfcp_fsf.c (80162B)


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