957 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * ibmvfc.h -- driver for IBM Power Virtual Fibre Channel Adapter4 *5 * Written By: Brian King <brking@linux.vnet.ibm.com>, IBM Corporation6 *7 * Copyright (C) IBM Corporation, 20088 */9 10#ifndef _IBMVFC_H11#define _IBMVFC_H12 13#include <linux/list.h>14#include <linux/types.h>15#include <scsi/viosrp.h>16 17#define IBMVFC_NAME "ibmvfc"18#define IBMVFC_DRIVER_VERSION "1.0.11"19#define IBMVFC_DRIVER_DATE "(April 12, 2013)"20 21#define IBMVFC_DEFAULT_TIMEOUT 6022#define IBMVFC_ADISC_CANCEL_TIMEOUT 4523#define IBMVFC_ADISC_TIMEOUT 1524#define IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT \25 (IBMVFC_ADISC_TIMEOUT + IBMVFC_ADISC_CANCEL_TIMEOUT)26#define IBMVFC_INIT_TIMEOUT 12027#define IBMVFC_ABORT_TIMEOUT 828#define IBMVFC_ABORT_WAIT_TIMEOUT 4029#define IBMVFC_MAX_REQUESTS_DEFAULT 10030#define IBMVFC_SCSI_QDEPTH 12831 32#define IBMVFC_DEBUG 033#define IBMVFC_MAX_TARGETS 102434#define IBMVFC_MAX_LUN 0xffffffff35#define IBMVFC_MAX_SECTORS 204836#define IBMVFC_MAX_DISC_THREADS 437#define IBMVFC_TGT_MEMPOOL_SZ 6438#define IBMVFC_MAX_CMDS_PER_LUN 6439#define IBMVFC_MAX_HOST_INIT_RETRIES 640#define IBMVFC_MAX_TGT_INIT_RETRIES 341#define IBMVFC_DEV_LOSS_TMO (5 * 60)42#define IBMVFC_DEFAULT_LOG_LEVEL 243#define IBMVFC_MAX_CDB_LEN 1644#define IBMVFC_CLS3_ERROR 045#define IBMVFC_MQ 146#define IBMVFC_SCSI_CHANNELS 847#define IBMVFC_MAX_SCSI_QUEUES 1648#define IBMVFC_SCSI_HW_QUEUES 849#define IBMVFC_MIG_NO_SUB_TO_CRQ 050#define IBMVFC_MIG_NO_N_TO_M 051 52/*53 * Ensure we have resources for ERP and initialization:54 * 1 for ERP55 * 1 for initialization56 * 1 for NPIV Logout57 * 2 for BSG passthru58 * 2 for each discovery thread59 */60#define IBMVFC_NUM_INTERNAL_REQ (1 + 1 + 1 + 2 + (disc_threads * 2))61/* Reserved suset of events for cancelling channelized IO commands */62#define IBMVFC_NUM_INTERNAL_SUBQ_REQ 463 64#define IBMVFC_MAD_SUCCESS 0x0065#define IBMVFC_MAD_NOT_SUPPORTED 0xF166#define IBMVFC_MAD_VERSION_NOT_SUPP 0xF267#define IBMVFC_MAD_FAILED 0xF768#define IBMVFC_MAD_DRIVER_FAILED 0xEE69#define IBMVFC_MAD_CRQ_ERROR 0xEF70 71enum ibmvfc_crq_valid {72 IBMVFC_CRQ_CMD_RSP = 0x80,73 IBMVFC_CRQ_INIT_RSP = 0xC0,74 IBMVFC_CRQ_XPORT_EVENT = 0xFF,75};76 77enum ibmvfc_crq_init_msg {78 IBMVFC_CRQ_INIT = 0x01,79 IBMVFC_CRQ_INIT_COMPLETE = 0x02,80};81 82enum ibmvfc_crq_xport_evts {83 IBMVFC_PARTNER_FAILED = 0x01,84 IBMVFC_PARTNER_DEREGISTER = 0x02,85 IBMVFC_PARTITION_MIGRATED = 0x06,86};87 88enum ibmvfc_cmd_status_flags {89 IBMVFC_FABRIC_MAPPED = 0x0001,90 IBMVFC_VIOS_FAILURE = 0x0002,91 IBMVFC_FC_FAILURE = 0x0004,92 IBMVFC_FC_SCSI_ERROR = 0x0008,93 IBMVFC_HW_EVENT_LOGGED = 0x0010,94 IBMVFC_VIOS_LOGGED = 0x0020,95};96 97enum ibmvfc_fabric_mapped_errors {98 IBMVFC_UNABLE_TO_ESTABLISH = 0x0001,99 IBMVFC_XPORT_FAULT = 0x0002,100 IBMVFC_CMD_TIMEOUT = 0x0003,101 IBMVFC_ENETDOWN = 0x0004,102 IBMVFC_HW_FAILURE = 0x0005,103 IBMVFC_LINK_DOWN_ERR = 0x0006,104 IBMVFC_LINK_DEAD_ERR = 0x0007,105 IBMVFC_UNABLE_TO_REGISTER = 0x0008,106 IBMVFC_XPORT_BUSY = 0x000A,107 IBMVFC_XPORT_DEAD = 0x000B,108 IBMVFC_CONFIG_ERROR = 0x000C,109 IBMVFC_NAME_SERVER_FAIL = 0x000D,110 IBMVFC_LINK_HALTED = 0x000E,111 IBMVFC_XPORT_GENERAL = 0x8000,112};113 114enum ibmvfc_vios_errors {115 IBMVFC_CRQ_FAILURE = 0x0001,116 IBMVFC_SW_FAILURE = 0x0002,117 IBMVFC_INVALID_PARAMETER = 0x0003,118 IBMVFC_MISSING_PARAMETER = 0x0004,119 IBMVFC_HOST_IO_BUS = 0x0005,120 IBMVFC_TRANS_CANCELLED = 0x0006,121 IBMVFC_TRANS_CANCELLED_IMPLICIT = 0x0007,122 IBMVFC_INSUFFICIENT_RESOURCE = 0x0008,123 IBMVFC_PLOGI_REQUIRED = 0x0010,124 IBMVFC_COMMAND_FAILED = 0x8000,125};126 127enum ibmvfc_mad_types {128 IBMVFC_NPIV_LOGIN = 0x0001,129 IBMVFC_DISC_TARGETS = 0x0002,130 IBMVFC_PORT_LOGIN = 0x0004,131 IBMVFC_PROCESS_LOGIN = 0x0008,132 IBMVFC_QUERY_TARGET = 0x0010,133 IBMVFC_MOVE_LOGIN = 0x0020,134 IBMVFC_IMPLICIT_LOGOUT = 0x0040,135 IBMVFC_PASSTHRU = 0x0200,136 IBMVFC_TMF_MAD = 0x0100,137 IBMVFC_NPIV_LOGOUT = 0x0800,138 IBMVFC_CHANNEL_ENQUIRY = 0x1000,139 IBMVFC_CHANNEL_SETUP = 0x2000,140 IBMVFC_CONNECTION_INFO = 0x4000,141};142 143struct ibmvfc_mad_common {144 __be32 version;145 __be32 reserved;146 __be32 opcode;147 __be16 status;148 __be16 length;149 __be64 tag;150} __packed __aligned(8);151 152struct ibmvfc_npiv_login_mad {153 struct ibmvfc_mad_common common;154 struct srp_direct_buf buffer;155} __packed __aligned(8);156 157struct ibmvfc_npiv_logout_mad {158 struct ibmvfc_mad_common common;159} __packed __aligned(8);160 161#define IBMVFC_MAX_NAME 256162 163struct ibmvfc_npiv_login {164 __be32 ostype;165#define IBMVFC_OS_LINUX 0x02166 __be32 pad;167 __be64 max_dma_len;168 __be32 max_payload;169 __be32 max_response;170 __be32 partition_num;171 __be32 vfc_frame_version;172 __be16 fcp_version;173 __be16 flags;174#define IBMVFC_CLIENT_MIGRATED 0x01175#define IBMVFC_FLUSH_ON_HALT 0x02176 __be32 max_cmds;177 __be64 capabilities;178#define IBMVFC_CAN_MIGRATE 0x01179#define IBMVFC_CAN_USE_CHANNELS 0x02180#define IBMVFC_CAN_HANDLE_FPIN 0x04181#define IBMVFC_CAN_USE_MAD_VERSION 0x08182#define IBMVFC_CAN_SEND_VF_WWPN 0x10183 __be64 node_name;184 struct srp_direct_buf async;185 u8 partition_name[IBMVFC_MAX_NAME];186 u8 device_name[IBMVFC_MAX_NAME];187 u8 drc_name[IBMVFC_MAX_NAME];188 __be64 reserved2[2];189} __packed __aligned(8);190 191struct ibmvfc_common_svc_parms {192 __be16 fcph_version;193 __be16 b2b_credit;194 __be16 features;195 __be16 bb_rcv_sz; /* upper nibble is BB_SC_N */196 __be32 ratov;197 __be32 edtov;198} __packed __aligned(4);199 200struct ibmvfc_service_parms {201 struct ibmvfc_common_svc_parms common;202 u8 port_name[8];203 u8 node_name[8];204 __be32 class1_parms[4];205 __be32 class2_parms[4];206 __be32 class3_parms[4];207 __be32 obsolete[4];208 __be32 vendor_version[4];209 __be32 services_avail[2];210 __be32 ext_len;211 __be32 reserved[30];212 __be32 clk_sync_qos[2];213 __be32 reserved2;214} __packed __aligned(4);215 216struct ibmvfc_npiv_login_resp {217 __be32 version;218 __be16 status;219 __be16 error;220 __be32 flags;221#define IBMVFC_NATIVE_FC 0x01222 __be32 reserved;223 __be64 capabilities;224#define IBMVFC_CAN_FLUSH_ON_HALT 0x08225#define IBMVFC_CAN_SUPPRESS_ABTS 0x10226#define IBMVFC_MAD_VERSION_CAP 0x20227#define IBMVFC_HANDLE_VF_WWPN 0x40228#define IBMVFC_CAN_SUPPORT_CHANNELS 0x80229 __be32 max_cmds;230 __be32 scsi_id_sz;231 __be64 max_dma_len;232 __be64 scsi_id;233 __be64 port_name;234 __be64 node_name;235 __be64 link_speed;236 u8 partition_name[IBMVFC_MAX_NAME];237 u8 device_name[IBMVFC_MAX_NAME];238 u8 port_loc_code[IBMVFC_MAX_NAME];239 u8 drc_name[IBMVFC_MAX_NAME];240 struct ibmvfc_service_parms service_parms;241 __be64 reserved2;242} __packed __aligned(8);243 244union ibmvfc_npiv_login_data {245 struct ibmvfc_npiv_login login;246 struct ibmvfc_npiv_login_resp resp;247} __packed __aligned(8);248 249struct ibmvfc_discover_targets_entry {250 __be32 scsi_id;251 __be32 pad;252 __be64 wwpn;253#define IBMVFC_DISC_TGT_SCSI_ID_MASK 0x00ffffff254} __packed __aligned(8);255 256struct ibmvfc_discover_targets {257 struct ibmvfc_mad_common common;258 struct srp_direct_buf buffer;259 __be32 flags;260#define IBMVFC_DISC_TGT_PORT_ID_WWPN_LIST 0x02261 __be16 status;262 __be16 error;263 __be32 bufflen;264 __be32 num_avail;265 __be32 num_written;266 __be64 reserved[2];267} __packed __aligned(8);268 269enum ibmvfc_fc_reason {270 IBMVFC_INVALID_ELS_CMD_CODE = 0x01,271 IBMVFC_INVALID_VERSION = 0x02,272 IBMVFC_LOGICAL_ERROR = 0x03,273 IBMVFC_INVALID_CT_IU_SIZE = 0x04,274 IBMVFC_LOGICAL_BUSY = 0x05,275 IBMVFC_PROTOCOL_ERROR = 0x07,276 IBMVFC_UNABLE_TO_PERFORM_REQ = 0x09,277 IBMVFC_CMD_NOT_SUPPORTED = 0x0B,278 IBMVFC_SERVER_NOT_AVAIL = 0x0D,279 IBMVFC_CMD_IN_PROGRESS = 0x0E,280 IBMVFC_VENDOR_SPECIFIC = 0xFF,281};282 283enum ibmvfc_fc_type {284 IBMVFC_FABRIC_REJECT = 0x01,285 IBMVFC_PORT_REJECT = 0x02,286 IBMVFC_LS_REJECT = 0x03,287 IBMVFC_FABRIC_BUSY = 0x04,288 IBMVFC_PORT_BUSY = 0x05,289 IBMVFC_BASIC_REJECT = 0x06,290};291 292enum ibmvfc_gs_explain {293 IBMVFC_PORT_NAME_NOT_REG = 0x02,294};295 296struct ibmvfc_port_login {297 struct ibmvfc_mad_common common;298 __be64 scsi_id;299 __be16 reserved;300 __be16 fc_service_class;301 __be32 blksz;302 __be32 hdr_per_blk;303 __be16 status;304 __be16 error; /* also fc_reason */305 __be16 fc_explain;306 __be16 fc_type;307 __be32 reserved2;308 struct ibmvfc_service_parms service_parms;309 struct ibmvfc_service_parms service_parms_change;310 __be64 target_wwpn;311 __be64 reserved3[2];312} __packed __aligned(8);313 314struct ibmvfc_move_login {315 struct ibmvfc_mad_common common;316 __be64 old_scsi_id;317 __be64 new_scsi_id;318 __be64 wwpn;319 __be64 node_name;320 __be32 flags;321#define IBMVFC_MOVE_LOGIN_IMPLICIT_OLD_FAILED 0x01322#define IBMVFC_MOVE_LOGIN_IMPLICIT_NEW_FAILED 0x02323#define IBMVFC_MOVE_LOGIN_PORT_LOGIN_FAILED 0x04324 __be32 reserved;325 struct ibmvfc_service_parms service_parms;326 struct ibmvfc_service_parms service_parms_change;327 __be32 reserved2;328 __be16 service_class;329 __be16 vios_flags;330#define IBMVFC_MOVE_LOGIN_VF_NOT_SENT_ADAPTER 0x01331 __be64 reserved3;332} __packed __aligned(8);333 334struct ibmvfc_prli_svc_parms {335 u8 type;336#define IBMVFC_SCSI_FCP_TYPE 0x08337 u8 type_ext;338 __be16 flags;339#define IBMVFC_PRLI_ORIG_PA_VALID 0x8000340#define IBMVFC_PRLI_RESP_PA_VALID 0x4000341#define IBMVFC_PRLI_EST_IMG_PAIR 0x2000342 __be32 orig_pa;343 __be32 resp_pa;344 __be32 service_parms;345#define IBMVFC_PRLI_TASK_RETRY 0x00000200346#define IBMVFC_PRLI_RETRY 0x00000100347#define IBMVFC_PRLI_DATA_OVERLAY 0x00000040348#define IBMVFC_PRLI_INITIATOR_FUNC 0x00000020349#define IBMVFC_PRLI_TARGET_FUNC 0x00000010350#define IBMVFC_PRLI_READ_FCP_XFER_RDY_DISABLED 0x00000002351#define IBMVFC_PRLI_WR_FCP_XFER_RDY_DISABLED 0x00000001352} __packed __aligned(4);353 354struct ibmvfc_process_login {355 struct ibmvfc_mad_common common;356 __be64 scsi_id;357 struct ibmvfc_prli_svc_parms parms;358 u8 reserved[48];359 __be16 status;360 __be16 error; /* also fc_reason */361 __be32 reserved2;362 __be64 target_wwpn;363 __be64 reserved3[2];364} __packed __aligned(8);365 366struct ibmvfc_query_tgt {367 struct ibmvfc_mad_common common;368 __be64 wwpn;369 __be64 scsi_id;370 __be16 status;371 __be16 error;372 __be16 fc_explain;373 __be16 fc_type;374 __be64 reserved[2];375} __packed __aligned(8);376 377struct ibmvfc_implicit_logout {378 struct ibmvfc_mad_common common;379 __be64 old_scsi_id;380 __be64 reserved[2];381} __packed __aligned(8);382 383struct ibmvfc_tmf {384 struct ibmvfc_mad_common common;385 __be64 scsi_id;386 struct scsi_lun lun;387 __be32 flags;388#define IBMVFC_TMF_ABORT_TASK 0x02389#define IBMVFC_TMF_ABORT_TASK_SET 0x04390#define IBMVFC_TMF_LUN_RESET 0x10391#define IBMVFC_TMF_TGT_RESET 0x20392#define IBMVFC_TMF_LUA_VALID 0x40393#define IBMVFC_TMF_SUPPRESS_ABTS 0x80394 __be32 cancel_key;395 __be32 my_cancel_key;396 __be32 pad;397 __be64 target_wwpn;398 __be64 task_tag;399 __be64 reserved[2];400} __packed __aligned(8);401 402enum ibmvfc_fcp_rsp_info_codes {403 RSP_NO_FAILURE = 0x00,404 RSP_TMF_REJECTED = 0x04,405 RSP_TMF_FAILED = 0x05,406 RSP_TMF_INVALID_LUN = 0x09,407};408 409struct ibmvfc_fcp_rsp_info {410 u8 reserved[3];411 u8 rsp_code;412 u8 reserved2[4];413} __packed __aligned(2);414 415enum ibmvfc_fcp_rsp_flags {416 FCP_BIDI_RSP = 0x80,417 FCP_BIDI_READ_RESID_UNDER = 0x40,418 FCP_BIDI_READ_RESID_OVER = 0x20,419 FCP_CONF_REQ = 0x10,420 FCP_RESID_UNDER = 0x08,421 FCP_RESID_OVER = 0x04,422 FCP_SNS_LEN_VALID = 0x02,423 FCP_RSP_LEN_VALID = 0x01,424};425 426union ibmvfc_fcp_rsp_data {427 struct ibmvfc_fcp_rsp_info info;428 u8 sense[SCSI_SENSE_BUFFERSIZE + sizeof(struct ibmvfc_fcp_rsp_info)];429} __packed __aligned(8);430 431struct ibmvfc_fcp_rsp {432 __be64 reserved;433 __be16 retry_delay_timer;434 u8 flags;435 u8 scsi_status;436 __be32 fcp_resid;437 __be32 fcp_sense_len;438 __be32 fcp_rsp_len;439 union ibmvfc_fcp_rsp_data data;440} __packed __aligned(8);441 442enum ibmvfc_cmd_flags {443 IBMVFC_SCATTERLIST = 0x0001,444 IBMVFC_NO_MEM_DESC = 0x0002,445 IBMVFC_READ = 0x0004,446 IBMVFC_WRITE = 0x0008,447 IBMVFC_TMF = 0x0080,448 IBMVFC_CLASS_3_ERR = 0x0100,449};450 451enum ibmvfc_fc_task_attr {452 IBMVFC_SIMPLE_TASK = 0x00,453 IBMVFC_HEAD_OF_QUEUE = 0x01,454 IBMVFC_ORDERED_TASK = 0x02,455 IBMVFC_ACA_TASK = 0x04,456};457 458enum ibmvfc_fc_tmf_flags {459 IBMVFC_ABORT_TASK_SET = 0x02,460 IBMVFC_LUN_RESET = 0x10,461 IBMVFC_TARGET_RESET = 0x20,462};463 464struct ibmvfc_fcp_cmd_iu {465 struct scsi_lun lun;466 u8 crn;467 u8 pri_task_attr;468 u8 tmf_flags;469 u8 add_cdb_len;470#define IBMVFC_RDDATA 0x02471#define IBMVFC_WRDATA 0x01472 u8 cdb[IBMVFC_MAX_CDB_LEN];473 __be32 xfer_len;474} __packed __aligned(4);475 476struct ibmvfc_cmd {477 __be64 task_tag;478 __be32 frame_type;479 __be32 payload_len;480 __be32 resp_len;481 __be32 adapter_resid;482 __be16 status;483 __be16 error;484 __be16 flags;485 __be16 response_flags;486#define IBMVFC_ADAPTER_RESID_VALID 0x01487 __be32 cancel_key;488 __be32 exchange_id;489 struct srp_direct_buf ext_func;490 struct srp_direct_buf ioba;491 struct srp_direct_buf resp;492 __be64 correlation;493 __be64 tgt_scsi_id;494 __be64 tag;495 __be64 target_wwpn;496 __be64 reserved3;497 union {498 struct {499 struct ibmvfc_fcp_cmd_iu iu;500 struct ibmvfc_fcp_rsp rsp;501 } v1;502 struct {503 __be64 reserved4;504 struct ibmvfc_fcp_cmd_iu iu;505 struct ibmvfc_fcp_rsp rsp;506 } v2;507 };508} __packed __aligned(8);509 510struct ibmvfc_passthru_fc_iu {511 __be32 payload[7];512#define IBMVFC_ADISC 0x52000000513 __be32 response[7];514};515 516struct ibmvfc_passthru_iu {517 __be64 task_tag;518 __be32 cmd_len;519 __be32 rsp_len;520 __be16 status;521 __be16 error;522 __be32 flags;523#define IBMVFC_FC_ELS 0x01524#define IBMVFC_FC_CT_IU 0x02525 __be32 cancel_key;526#define IBMVFC_PASSTHRU_CANCEL_KEY 0x80000000527#define IBMVFC_INTERNAL_CANCEL_KEY 0x80000001528 __be32 reserved;529 struct srp_direct_buf cmd;530 struct srp_direct_buf rsp;531 __be64 correlation;532 __be64 scsi_id;533 __be64 tag;534 __be64 target_wwpn;535 __be64 reserved2[2];536} __packed __aligned(8);537 538struct ibmvfc_passthru_mad {539 struct ibmvfc_mad_common common;540 struct srp_direct_buf cmd_ioba;541 struct ibmvfc_passthru_iu iu;542 struct ibmvfc_passthru_fc_iu fc_iu;543} __packed __aligned(8);544 545struct ibmvfc_channel_enquiry {546 struct ibmvfc_mad_common common;547 __be32 flags;548#define IBMVFC_NO_CHANNELS_TO_CRQ_SUPPORT 0x01549#define IBMVFC_SUPPORT_VARIABLE_SUBQ_MSG 0x02550#define IBMVFC_NO_N_TO_M_CHANNELS_SUPPORT 0x04551 __be32 num_scsi_subq_channels;552 __be32 num_nvmeof_subq_channels;553 __be32 num_scsi_vas_channels;554 __be32 num_nvmeof_vas_channels;555} __packed __aligned(8);556 557struct ibmvfc_channel_setup_mad {558 struct ibmvfc_mad_common common;559 struct srp_direct_buf buffer;560} __packed __aligned(8);561 562#define IBMVFC_MAX_CHANNELS 502563 564struct ibmvfc_channel_setup {565 __be32 flags;566#define IBMVFC_CANCEL_CHANNELS 0x01567#define IBMVFC_USE_BUFFER 0x02568#define IBMVFC_CHANNELS_CANCELED 0x04569 __be32 reserved;570 __be32 num_scsi_subq_channels;571 __be32 num_nvmeof_subq_channels;572 __be32 num_scsi_vas_channels;573 __be32 num_nvmeof_vas_channels;574 struct srp_direct_buf buffer;575 __be64 reserved2[5];576 __be64 channel_handles[IBMVFC_MAX_CHANNELS];577} __packed __aligned(8);578 579struct ibmvfc_connection_info {580 struct ibmvfc_mad_common common;581 __be64 information_bits;582#define IBMVFC_NO_FC_IO_CHANNEL 0x01583#define IBMVFC_NO_PHYP_VAS 0x02584#define IBMVFC_NO_PHYP_SUBQ 0x04585#define IBMVFC_PHYP_DEPRECATED_SUBQ 0x08586#define IBMVFC_PHYP_PRESERVED_SUBQ 0x10587#define IBMVFC_PHYP_FULL_SUBQ 0x20588 __be64 reserved[16];589} __packed __aligned(8);590 591struct ibmvfc_trace_start_entry {592 u32 xfer_len;593} __packed;594 595struct ibmvfc_trace_end_entry {596 u16 status;597 u16 error;598 u8 fcp_rsp_flags;599 u8 rsp_code;600 u8 scsi_status;601 u8 reserved;602} __packed;603 604struct ibmvfc_trace_entry {605 struct ibmvfc_event *evt;606 u32 time;607 u32 scsi_id;608 u32 lun;609 u8 fmt;610 u8 op_code;611 u8 tmf_flags;612 u8 type;613#define IBMVFC_TRC_START 0x00614#define IBMVFC_TRC_END 0xff615 union {616 struct ibmvfc_trace_start_entry start;617 struct ibmvfc_trace_end_entry end;618 } u;619} __packed __aligned(8);620 621enum ibmvfc_crq_formats {622 IBMVFC_CMD_FORMAT = 0x01,623 IBMVFC_ASYNC_EVENT = 0x02,624 IBMVFC_MAD_FORMAT = 0x04,625};626 627enum ibmvfc_async_event {628 IBMVFC_AE_ELS_PLOGI = 0x0001,629 IBMVFC_AE_ELS_LOGO = 0x0002,630 IBMVFC_AE_ELS_PRLO = 0x0004,631 IBMVFC_AE_SCN_NPORT = 0x0008,632 IBMVFC_AE_SCN_GROUP = 0x0010,633 IBMVFC_AE_SCN_DOMAIN = 0x0020,634 IBMVFC_AE_SCN_FABRIC = 0x0040,635 IBMVFC_AE_LINK_UP = 0x0080,636 IBMVFC_AE_LINK_DOWN = 0x0100,637 IBMVFC_AE_LINK_DEAD = 0x0200,638 IBMVFC_AE_HALT = 0x0400,639 IBMVFC_AE_RESUME = 0x0800,640 IBMVFC_AE_ADAPTER_FAILED = 0x1000,641 IBMVFC_AE_FPIN = 0x2000,642};643 644struct ibmvfc_async_desc {645 const char *desc;646 enum ibmvfc_async_event ae;647 int log_level;648};649 650struct ibmvfc_crq {651 volatile u8 valid;652 volatile u8 format;653 u8 reserved[6];654 volatile __be64 ioba;655} __packed __aligned(8);656 657struct ibmvfc_sub_crq {658 struct ibmvfc_crq crq;659 __be64 reserved[2];660} __packed __aligned(8);661 662enum ibmvfc_ae_link_state {663 IBMVFC_AE_LS_LINK_UP = 0x01,664 IBMVFC_AE_LS_LINK_BOUNCED = 0x02,665 IBMVFC_AE_LS_LINK_DOWN = 0x04,666 IBMVFC_AE_LS_LINK_DEAD = 0x08,667};668 669enum ibmvfc_ae_fpin_status {670 IBMVFC_AE_FPIN_LINK_CONGESTED = 0x1,671 IBMVFC_AE_FPIN_PORT_CONGESTED = 0x2,672 IBMVFC_AE_FPIN_PORT_CLEARED = 0x3,673 IBMVFC_AE_FPIN_PORT_DEGRADED = 0x4,674};675 676struct ibmvfc_async_crq {677 volatile u8 valid;678 u8 link_state;679 u8 fpin_status;680 u8 pad;681 __be32 pad2;682 volatile __be64 event;683 volatile __be64 scsi_id;684 volatile __be64 wwpn;685 volatile __be64 node_name;686 __be64 reserved;687} __packed __aligned(8);688 689union ibmvfc_iu {690 struct ibmvfc_mad_common mad_common;691 struct ibmvfc_npiv_login_mad npiv_login;692 struct ibmvfc_npiv_logout_mad npiv_logout;693 struct ibmvfc_discover_targets discover_targets;694 struct ibmvfc_port_login plogi;695 struct ibmvfc_process_login prli;696 struct ibmvfc_move_login move_login;697 struct ibmvfc_query_tgt query_tgt;698 struct ibmvfc_implicit_logout implicit_logout;699 struct ibmvfc_tmf tmf;700 struct ibmvfc_cmd cmd;701 struct ibmvfc_passthru_mad passthru;702 struct ibmvfc_channel_enquiry channel_enquiry;703 struct ibmvfc_channel_setup_mad channel_setup;704 struct ibmvfc_connection_info connection_info;705} __packed __aligned(8);706 707enum ibmvfc_target_action {708 IBMVFC_TGT_ACTION_NONE = 0,709 IBMVFC_TGT_ACTION_INIT,710 IBMVFC_TGT_ACTION_INIT_WAIT,711 IBMVFC_TGT_ACTION_LOGOUT_RPORT,712 IBMVFC_TGT_ACTION_LOGOUT_RPORT_WAIT,713 IBMVFC_TGT_ACTION_DEL_RPORT,714 IBMVFC_TGT_ACTION_DELETED_RPORT,715 IBMVFC_TGT_ACTION_DEL_AND_LOGOUT_RPORT,716 IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT,717};718 719enum ibmvfc_protocol {720 IBMVFC_PROTO_SCSI = 0,721 IBMVFC_PROTO_NVME = 1,722};723 724struct ibmvfc_target {725 struct list_head queue;726 struct ibmvfc_host *vhost;727 enum ibmvfc_protocol protocol;728 u64 scsi_id;729 u64 wwpn;730 u64 new_scsi_id;731 struct fc_rport *rport;732 int target_id;733 enum ibmvfc_target_action action;734 int need_login;735 int add_rport;736 int init_retries;737 int logo_rcvd;738 int move_login;739 u32 cancel_key;740 struct ibmvfc_service_parms service_parms;741 struct ibmvfc_service_parms service_parms_change;742 struct fc_rport_identifiers ids;743 void (*job_step) (struct ibmvfc_target *);744 struct timer_list timer;745 struct kref kref;746};747 748/* a unit of work for the hosting partition */749struct ibmvfc_event {750 struct list_head queue_list;751 struct list_head cancel;752 struct ibmvfc_host *vhost;753 struct ibmvfc_queue *queue;754 struct ibmvfc_target *tgt;755 struct scsi_cmnd *cmnd;756 atomic_t free;757 atomic_t active;758 union ibmvfc_iu *xfer_iu;759 void (*done)(struct ibmvfc_event *evt);760 void (*_done)(struct ibmvfc_event *evt);761 struct ibmvfc_crq crq;762 union ibmvfc_iu iu;763 union ibmvfc_iu *sync_iu;764 struct srp_direct_buf *ext_list;765 dma_addr_t ext_list_token;766 struct completion comp;767 struct completion *eh_comp;768 struct timer_list timer;769 u16 hwq;770 u8 reserved;771};772 773/* a pool of event structs for use */774struct ibmvfc_event_pool {775 struct ibmvfc_event *events;776 u32 size;777 union ibmvfc_iu *iu_storage;778 dma_addr_t iu_token;779};780 781enum ibmvfc_msg_fmt {782 IBMVFC_CRQ_FMT = 0,783 IBMVFC_ASYNC_FMT,784 IBMVFC_SUB_CRQ_FMT,785};786 787union ibmvfc_msgs {788 void *handle;789 struct ibmvfc_crq *crq;790 struct ibmvfc_async_crq *async;791 struct ibmvfc_sub_crq *scrq;792};793 794struct ibmvfc_queue {795 union ibmvfc_msgs msgs;796 dma_addr_t msg_token;797 enum ibmvfc_msg_fmt fmt;798 int size, cur;799 spinlock_t _lock;800 spinlock_t *q_lock;801 802 struct ibmvfc_host *vhost;803 struct ibmvfc_event_pool evt_pool;804 struct list_head sent;805 struct list_head free;806 u16 total_depth;807 u16 evt_depth;808 u16 reserved_depth;809 u16 evt_free;810 u16 reserved_free;811 spinlock_t l_lock;812 813 union ibmvfc_iu cancel_rsp;814 815 /* Sub-CRQ fields */816 unsigned long cookie;817 unsigned long vios_cookie;818 unsigned long hw_irq;819 unsigned long irq;820 unsigned long hwq_id;821 char name[32];822 irq_handler_t handler;823};824 825struct ibmvfc_channels {826 struct ibmvfc_queue *scrqs;827 enum ibmvfc_protocol protocol;828 unsigned int active_queues;829 unsigned int desired_queues;830 unsigned int max_queues;831 int disc_buf_sz;832 struct ibmvfc_discover_targets_entry *disc_buf;833 dma_addr_t disc_buf_dma;834};835 836enum ibmvfc_host_action {837 IBMVFC_HOST_ACTION_NONE = 0,838 IBMVFC_HOST_ACTION_RESET,839 IBMVFC_HOST_ACTION_REENABLE,840 IBMVFC_HOST_ACTION_LOGO,841 IBMVFC_HOST_ACTION_LOGO_WAIT,842 IBMVFC_HOST_ACTION_INIT,843 IBMVFC_HOST_ACTION_INIT_WAIT,844 IBMVFC_HOST_ACTION_QUERY,845 IBMVFC_HOST_ACTION_QUERY_TGTS,846 IBMVFC_HOST_ACTION_TGT_DEL,847 IBMVFC_HOST_ACTION_ALLOC_TGTS,848 IBMVFC_HOST_ACTION_TGT_INIT,849 IBMVFC_HOST_ACTION_TGT_DEL_FAILED,850};851 852enum ibmvfc_host_state {853 IBMVFC_NO_CRQ = 0,854 IBMVFC_INITIALIZING,855 IBMVFC_ACTIVE,856 IBMVFC_HALTED,857 IBMVFC_LINK_DOWN,858 IBMVFC_LINK_DEAD,859 IBMVFC_HOST_OFFLINE,860};861 862struct ibmvfc_host {863 char name[8];864 struct list_head queue;865 struct Scsi_Host *host;866 enum ibmvfc_host_state state;867 enum ibmvfc_host_action action;868#define IBMVFC_NUM_TRACE_INDEX_BITS 8869#define IBMVFC_NUM_TRACE_ENTRIES (1 << IBMVFC_NUM_TRACE_INDEX_BITS)870#define IBMVFC_TRACE_INDEX_MASK (IBMVFC_NUM_TRACE_ENTRIES - 1)871#define IBMVFC_TRACE_SIZE (sizeof(struct ibmvfc_trace_entry) * IBMVFC_NUM_TRACE_ENTRIES)872 struct ibmvfc_trace_entry *trace;873 atomic_t trace_index;874 int num_targets;875 struct list_head targets;876 struct list_head purge;877 struct device *dev;878 struct dma_pool *sg_pool;879 mempool_t *tgt_pool;880 struct ibmvfc_queue crq;881 struct ibmvfc_queue async_crq;882 struct ibmvfc_channels scsi_scrqs;883 struct ibmvfc_npiv_login login_info;884 union ibmvfc_npiv_login_data *login_buf;885 dma_addr_t login_buf_dma;886 struct ibmvfc_channel_setup *channel_setup_buf;887 dma_addr_t channel_setup_dma;888 int log_level;889 struct mutex passthru_mutex;890 unsigned int max_vios_scsi_channels;891 int task_set;892 int init_retries;893 int discovery_threads;894 int abort_threads;895 unsigned int client_migrated:1;896 unsigned int reinit:1;897 unsigned int delay_init:1;898 unsigned int logged_in:1;899 unsigned int mq_enabled:1;900 unsigned int using_channels:1;901 unsigned int do_enquiry:1;902 unsigned int aborting_passthru:1;903 unsigned int scan_complete:1;904 int scan_timeout;905 int events_to_log;906#define IBMVFC_AE_LINKUP 0x0001907#define IBMVFC_AE_LINKDOWN 0x0002908#define IBMVFC_AE_RSCN 0x0004909 unsigned int partition_number;910 char partition_name[97];911 void (*job_step) (struct ibmvfc_host *);912 struct task_struct *work_thread;913 struct tasklet_struct tasklet;914 struct work_struct rport_add_work_q;915 wait_queue_head_t init_wait_q;916 wait_queue_head_t work_wait_q;917};918 919#define DBG_CMD(CMD) do { if (ibmvfc_debug) CMD; } while (0)920 921#define tgt_dbg(t, fmt, ...) \922 DBG_CMD(dev_info((t)->vhost->dev, "%llX: " fmt, (t)->scsi_id, ##__VA_ARGS__))923 924#define tgt_info(t, fmt, ...) \925 dev_info((t)->vhost->dev, "%llX: " fmt, (t)->scsi_id, ##__VA_ARGS__)926 927#define tgt_err(t, fmt, ...) \928 dev_err((t)->vhost->dev, "%llX: " fmt, (t)->scsi_id, ##__VA_ARGS__)929 930#define tgt_log(t, level, fmt, ...) \931 do { \932 if ((t)->vhost->log_level >= level) \933 tgt_err(t, fmt, ##__VA_ARGS__); \934 } while (0)935 936#define ibmvfc_dbg(vhost, ...) \937 DBG_CMD(dev_info((vhost)->dev, ##__VA_ARGS__))938 939#define ibmvfc_log(vhost, level, ...) \940 do { \941 if ((vhost)->log_level >= level) \942 dev_err((vhost)->dev, ##__VA_ARGS__); \943 } while (0)944 945#define ENTER DBG_CMD(printk(KERN_INFO IBMVFC_NAME": Entering %s\n", __func__))946#define LEAVE DBG_CMD(printk(KERN_INFO IBMVFC_NAME": Leaving %s\n", __func__))947 948#ifdef CONFIG_SCSI_IBMVFC_TRACE949#define ibmvfc_create_trace_file(kobj, attr) sysfs_create_bin_file(kobj, attr)950#define ibmvfc_remove_trace_file(kobj, attr) sysfs_remove_bin_file(kobj, attr)951#else952#define ibmvfc_create_trace_file(kobj, attr) 0953#define ibmvfc_remove_trace_file(kobj, attr) do { } while (0)954#endif955 956#endif957