507 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * zfcp device driver4 *5 * Interface to the FSF support functions.6 *7 * Copyright IBM Corp. 2002, 20208 */9 10#ifndef FSF_H11#define FSF_H12 13#include <linux/pfn.h>14#include <linux/scatterlist.h>15#include <scsi/libfc.h>16 17#define FSF_QTCB_CURRENT_VERSION 0x0000000118 19/* FSF commands */20#define FSF_QTCB_FCP_CMND 0x0000000121#define FSF_QTCB_ABORT_FCP_CMND 0x0000000222#define FSF_QTCB_OPEN_PORT_WITH_DID 0x0000000523#define FSF_QTCB_OPEN_LUN 0x0000000624#define FSF_QTCB_CLOSE_LUN 0x0000000725#define FSF_QTCB_CLOSE_PORT 0x0000000826#define FSF_QTCB_CLOSE_PHYSICAL_PORT 0x0000000927#define FSF_QTCB_SEND_ELS 0x0000000B28#define FSF_QTCB_SEND_GENERIC 0x0000000C29#define FSF_QTCB_EXCHANGE_CONFIG_DATA 0x0000000D30#define FSF_QTCB_EXCHANGE_PORT_DATA 0x0000000E31#define FSF_QTCB_DOWNLOAD_CONTROL_FILE 0x0000001232#define FSF_QTCB_UPLOAD_CONTROL_FILE 0x0000001333 34/* FSF QTCB types */35#define FSF_IO_COMMAND 0x0000000136#define FSF_SUPPORT_COMMAND 0x0000000237#define FSF_CONFIG_COMMAND 0x0000000338#define FSF_PORT_COMMAND 0x0000000439 40/* FSF protocol states */41#define FSF_PROT_GOOD 0x0000000142#define FSF_PROT_QTCB_VERSION_ERROR 0x0000001043#define FSF_PROT_SEQ_NUMB_ERROR 0x0000002044#define FSF_PROT_UNSUPP_QTCB_TYPE 0x0000004045#define FSF_PROT_HOST_CONNECTION_INITIALIZING 0x0000008046#define FSF_PROT_FSF_STATUS_PRESENTED 0x0000010047#define FSF_PROT_DUPLICATE_REQUEST_ID 0x0000020048#define FSF_PROT_LINK_DOWN 0x0000040049#define FSF_PROT_REEST_QUEUE 0x0000080050#define FSF_PROT_ERROR_STATE 0x0100000051 52/* FSF states */53#define FSF_GOOD 0x0000000054#define FSF_PORT_ALREADY_OPEN 0x0000000155#define FSF_LUN_ALREADY_OPEN 0x0000000256#define FSF_PORT_HANDLE_NOT_VALID 0x0000000357#define FSF_LUN_HANDLE_NOT_VALID 0x0000000458#define FSF_HANDLE_MISMATCH 0x0000000559#define FSF_SERVICE_CLASS_NOT_SUPPORTED 0x0000000660#define FSF_FCPLUN_NOT_VALID 0x0000000961#define FSF_LUN_SHARING_VIOLATION 0x0000001262#define FSF_FCP_COMMAND_DOES_NOT_EXIST 0x0000002263#define FSF_DIRECTION_INDICATOR_NOT_VALID 0x0000003064#define FSF_CMND_LENGTH_NOT_VALID 0x0000003365#define FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED 0x0000004066#define FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED 0x0000004167#define FSF_ELS_COMMAND_REJECTED 0x0000005068#define FSF_GENERIC_COMMAND_REJECTED 0x0000005169#define FSF_PORT_BOXED 0x0000005970#define FSF_LUN_BOXED 0x0000005A71#define FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE 0x0000005B72#define FSF_PAYLOAD_SIZE_MISMATCH 0x0000006073#define FSF_REQUEST_SIZE_TOO_LARGE 0x0000006174#define FSF_RESPONSE_SIZE_TOO_LARGE 0x0000006275#define FSF_SBAL_MISMATCH 0x0000006376#define FSF_INCONSISTENT_PROT_DATA 0x0000007077#define FSF_INVALID_PROT_PARM 0x0000007178#define FSF_BLOCK_GUARD_CHECK_FAILURE 0x0000008179#define FSF_APP_TAG_CHECK_FAILURE 0x0000008280#define FSF_REF_TAG_CHECK_FAILURE 0x0000008381#define FSF_SECURITY_ERROR 0x0000009082#define FSF_ADAPTER_STATUS_AVAILABLE 0x000000AD83#define FSF_FCP_RSP_AVAILABLE 0x000000AF84#define FSF_UNKNOWN_COMMAND 0x000000E285#define FSF_UNKNOWN_OP_SUBTYPE 0x000000E386#define FSF_INVALID_COMMAND_OPTION 0x000000E587 88#define FSF_PROT_STATUS_QUAL_SIZE 1689#define FSF_STATUS_QUALIFIER_SIZE 1690 91/* FSF status qualifier, recommendations */92#define FSF_SQ_NO_RECOM 0x0093#define FSF_SQ_FCP_RSP_AVAILABLE 0x0194#define FSF_SQ_RETRY_IF_POSSIBLE 0x0295#define FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED 0x0396#define FSF_SQ_INVOKE_LINK_TEST_PROCEDURE 0x0497#define FSF_SQ_COMMAND_ABORTED 0x0698#define FSF_SQ_NO_RETRY_POSSIBLE 0x0799 100/* FSF status qualifier (most significant 4 bytes), local link down */101#define FSF_PSQ_LINK_NO_LIGHT 0x00000004102#define FSF_PSQ_LINK_WRAP_PLUG 0x00000008103#define FSF_PSQ_LINK_NO_FCP 0x00000010104#define FSF_PSQ_LINK_FIRMWARE_UPDATE 0x00000020105#define FSF_PSQ_LINK_INVALID_WWPN 0x00000100106#define FSF_PSQ_LINK_NO_NPIV_SUPPORT 0x00000200107#define FSF_PSQ_LINK_NO_FCP_RESOURCES 0x00000400108#define FSF_PSQ_LINK_NO_FABRIC_RESOURCES 0x00000800109#define FSF_PSQ_LINK_FABRIC_LOGIN_UNABLE 0x00001000110#define FSF_PSQ_LINK_WWPN_ASSIGNMENT_CORRUPTED 0x00002000111#define FSF_PSQ_LINK_MODE_TABLE_CURRUPTED 0x00004000112#define FSF_PSQ_LINK_NO_WWPN_ASSIGNMENT 0x00008000113 114/* FSF status qualifier, security error */115#define FSF_SQ_SECURITY_REQUIRED 0x00000001116#define FSF_SQ_SECURITY_TIMEOUT 0x00000002117#define FSF_SQ_SECURITY_KM_UNAVAILABLE 0x00000003118#define FSF_SQ_SECURITY_RKM_UNAVAILABLE 0x00000004119#define FSF_SQ_SECURITY_AUTH_FAILURE 0x00000005120#define FSF_SQ_SECURITY_ENC_FAILURE 0x00000010121 122/* payload size in status read buffer */123#define FSF_STATUS_READ_PAYLOAD_SIZE 4032124 125/* number of status read buffers that should be sent by ULP */126#define FSF_STATUS_READS_RECOM 16127 128/* status types in status read buffer */129#define FSF_STATUS_READ_PORT_CLOSED 0x00000001130#define FSF_STATUS_READ_INCOMING_ELS 0x00000002131#define FSF_STATUS_READ_SENSE_DATA_AVAIL 0x00000003132#define FSF_STATUS_READ_BIT_ERROR_THRESHOLD 0x00000004133#define FSF_STATUS_READ_LINK_DOWN 0x00000005134#define FSF_STATUS_READ_LINK_UP 0x00000006135#define FSF_STATUS_READ_NOTIFICATION_LOST 0x00000009136#define FSF_STATUS_READ_FEATURE_UPDATE_ALERT 0x0000000C137#define FSF_STATUS_READ_VERSION_CHANGE 0x0000000D138 139/* status subtypes for link down */140#define FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK 0x00000000141#define FSF_STATUS_READ_SUB_FDISC_FAILED 0x00000001142#define FSF_STATUS_READ_SUB_FIRMWARE_UPDATE 0x00000002143 144/* status subtypes for unsolicited status notification lost */145#define FSF_STATUS_READ_SUB_INCOMING_ELS 0x00000001146#define FSF_STATUS_READ_SUB_VERSION_CHANGE 0x00000100147 148/* status subtypes for version change */149#define FSF_STATUS_READ_SUB_LIC_CHANGE 0x00000001150 151/* topologie that is detected by the adapter */152#define FSF_TOPO_P2P 0x00000001153#define FSF_TOPO_FABRIC 0x00000002154#define FSF_TOPO_AL 0x00000003155 156/* data direction for FCP commands */157#define FSF_DATADIR_WRITE 0x00000001158#define FSF_DATADIR_READ 0x00000002159#define FSF_DATADIR_CMND 0x00000004160#define FSF_DATADIR_DIF_WRITE_INSERT 0x00000009161#define FSF_DATADIR_DIF_READ_STRIP 0x0000000a162#define FSF_DATADIR_DIF_WRITE_CONVERT 0x0000000b163#define FSF_DATADIR_DIF_READ_CONVERT 0X0000000c164 165/* data protection control flags */166#define FSF_APP_TAG_CHECK_ENABLE 0x10167 168/* fc service class */169#define FSF_CLASS_3 0x00000003170 171/* logging space behind QTCB */172#define FSF_QTCB_LOG_SIZE 1024173 174/* channel features */175#define FSF_FEATURE_NOTIFICATION_LOST 0x00000008176#define FSF_FEATURE_HBAAPI_MANAGEMENT 0x00000010177#define FSF_FEATURE_ELS_CT_CHAINED_SBALS 0x00000020178#define FSF_FEATURE_UPDATE_ALERT 0x00000100179#define FSF_FEATURE_MEASUREMENT_DATA 0x00000200180#define FSF_FEATURE_REQUEST_SFP_DATA 0x00000200181#define FSF_FEATURE_REPORT_SFP_DATA 0x00000800182#define FSF_FEATURE_FC_SECURITY 0x00001000183#define FSF_FEATURE_DIF_PROT_TYPE1 0x00010000184#define FSF_FEATURE_DIX_PROT_TCPIP 0x00020000185 186/* host connection features */187#define FSF_FEATURE_NPIV_MODE 0x00000001188 189/* option */190#define FSF_OPEN_LUN_SUPPRESS_BOXING 0x00000001191 192/* FC security algorithms */193#define FSF_FC_SECURITY_AUTH 0x00000001194#define FSF_FC_SECURITY_ENC_FCSP2 0x00000002195#define FSF_FC_SECURITY_ENC_ERAS 0x00000004196 197struct fsf_queue_designator {198 u8 cssid;199 u8 chpid;200 u8 hla;201 u8 ua;202 u32 res1;203} __attribute__ ((packed));204 205struct fsf_bit_error_payload {206 u32 res1;207 u32 link_failure_error_count;208 u32 loss_of_sync_error_count;209 u32 loss_of_signal_error_count;210 u32 primitive_sequence_error_count;211 u32 invalid_transmission_word_error_count;212 u32 crc_error_count;213 u32 primitive_sequence_event_timeout_count;214 u32 elastic_buffer_overrun_error_count;215 u32 fcal_arbitration_timeout_count;216 u32 advertised_receive_b2b_credit;217 u32 current_receive_b2b_credit;218 u32 advertised_transmit_b2b_credit;219 u32 current_transmit_b2b_credit;220} __attribute__ ((packed));221 222struct fsf_link_down_info {223 u32 error_code;224 u32 res1;225 u8 res2[2];226 u8 primary_status;227 u8 ioerr_code;228 u8 action_code;229 u8 reason_code;230 u8 explanation_code;231 u8 vendor_specific_code;232} __attribute__ ((packed));233 234struct fsf_version_change {235 u32 current_version;236 u32 previous_version;237} __packed;238 239struct fsf_status_read_buffer {240 u32 status_type;241 u32 status_subtype;242 u32 length;243 u32 res1;244 struct fsf_queue_designator queue_designator;245 u8 res2;246 u8 d_id[3];247 u32 class;248 u64 fcp_lun;249 u8 res3[24];250 union {251 u8 data[FSF_STATUS_READ_PAYLOAD_SIZE];252 u32 word[FSF_STATUS_READ_PAYLOAD_SIZE/sizeof(u32)];253 struct fsf_link_down_info link_down_info;254 struct fsf_bit_error_payload bit_error;255 struct fsf_version_change version_change;256 } payload;257} __attribute__ ((packed));258 259struct fsf_qual_version_error {260 u32 fsf_version;261 u32 res1[3];262} __attribute__ ((packed));263 264struct fsf_qual_sequence_error {265 u32 exp_req_seq_no;266 u32 res1[3];267} __attribute__ ((packed));268 269struct fsf_qual_latency_info {270 u32 channel_lat;271 u32 fabric_lat;272 u8 res1[8];273} __attribute__ ((packed));274 275union fsf_prot_status_qual {276 u32 word[FSF_PROT_STATUS_QUAL_SIZE / sizeof(u32)];277 u64 doubleword[FSF_PROT_STATUS_QUAL_SIZE / sizeof(u64)];278 struct fsf_qual_version_error version_error;279 struct fsf_qual_sequence_error sequence_error;280 struct fsf_link_down_info link_down_info;281 struct fsf_qual_latency_info latency_info;282} __attribute__ ((packed));283 284struct fsf_qtcb_prefix {285 u64 req_id;286 u32 qtcb_version;287 u32 ulp_info;288 u32 qtcb_type;289 u32 req_seq_no;290 u32 prot_status;291 union fsf_prot_status_qual prot_status_qual;292 u8 res1[20];293} __attribute__ ((packed));294 295struct fsf_statistics_info {296 u64 input_req;297 u64 output_req;298 u64 control_req;299 u64 input_mb;300 u64 output_mb;301 u64 seconds_act;302} __attribute__ ((packed));303 304union fsf_status_qual {305 u8 byte[FSF_STATUS_QUALIFIER_SIZE];306 u16 halfword[FSF_STATUS_QUALIFIER_SIZE / sizeof (u16)];307 u32 word[FSF_STATUS_QUALIFIER_SIZE / sizeof (u32)];308 u64 doubleword[FSF_STATUS_QUALIFIER_SIZE / sizeof(u64)];309 struct fsf_queue_designator fsf_queue_designator;310 struct fsf_link_down_info link_down_info;311} __attribute__ ((packed));312 313struct fsf_qtcb_header {314 u64 req_handle;315 u32 fsf_command;316 u32 res1;317 u32 port_handle;318 u32 lun_handle;319 u32 res2;320 u32 fsf_status;321 union fsf_status_qual fsf_status_qual;322 u8 res3[28];323 u16 log_start;324 u16 log_length;325 u8 res4[16];326} __attribute__ ((packed));327 328#define FSF_PLOGI_MIN_LEN 112329 330#define FSF_FCP_CMND_SIZE 288331#define FSF_FCP_RSP_SIZE 128332 333struct fsf_qtcb_bottom_io {334 u32 data_direction;335 u32 service_class;336 u8 res1;337 u8 data_prot_flags;338 u16 app_tag_value;339 u32 ref_tag_value;340 u32 fcp_cmnd_length;341 u32 data_block_length;342 u32 prot_data_length;343 u8 res2[4];344 union {345 u8 byte[FSF_FCP_CMND_SIZE];346 struct fcp_cmnd iu;347 } fcp_cmnd;348 union {349 u8 byte[FSF_FCP_RSP_SIZE];350 struct fcp_resp_with_ext iu;351 } fcp_rsp;352 u8 res3[64];353} __attribute__ ((packed));354 355struct fsf_qtcb_bottom_support {356 u32 operation_subtype;357 u8 res1[13];358 u8 d_id[3];359 u32 option;360 u64 fcp_lun;361 u64 res2;362 u64 req_handle;363 u32 service_class;364 u8 res3[3];365 u8 timeout;366 u32 lun_access_info;367 u32 connection_info;368 u8 res4[176];369 u32 els1_length;370 u32 els2_length;371 u32 req_buf_length;372 u32 resp_buf_length;373 u8 els[256];374} __attribute__ ((packed));375 376#define ZFCP_FSF_TIMER_INT_MASK 0x3FFF377 378struct fsf_qtcb_bottom_config {379 u32 lic_version;380 u32 feature_selection;381 u32 high_qtcb_version;382 u32 low_qtcb_version;383 u32 max_qtcb_size;384 u32 max_data_transfer_size;385 u32 adapter_features;386 u32 connection_features;387 u32 fc_topology;388 u32 fc_link_speed; /* one of ZFCP_FSF_PORTSPEED_* */389 u32 adapter_type;390 u8 res0;391 u8 peer_d_id[3];392 u16 status_read_buf_num;393 u16 timer_interval;394 u8 res2[9];395 u8 s_id[3];396 u8 nport_serv_param[128];397 u8 res3[8];398 u32 adapter_ports;399 u32 hardware_version;400 u8 serial_number[32];401 u8 plogi_payload[112];402 struct fsf_statistics_info stat_info;403 u8 res4[112];404} __attribute__ ((packed));405 406struct fsf_qtcb_bottom_port {407 u64 wwpn;408 u32 fc_port_id;409 u32 port_type;410 u32 port_state;411 u32 class_of_service; /* should be 0x00000006 for class 2 and 3 */412 u8 supported_fc4_types[32]; /* should be 0x00000100 for scsi fcp */413 u8 active_fc4_types[32];414 u32 supported_speed; /* any combination of ZFCP_FSF_PORTSPEED_* */415 u32 maximum_frame_size; /* fixed value of 2112 */416 u64 seconds_since_last_reset;417 u64 tx_frames;418 u64 tx_words;419 u64 rx_frames;420 u64 rx_words;421 u64 lip; /* 0 */422 u64 nos; /* currently 0 */423 u64 error_frames; /* currently 0 */424 u64 dumped_frames; /* currently 0 */425 u64 link_failure;426 u64 loss_of_sync;427 u64 loss_of_signal;428 u64 psp_error_counts;429 u64 invalid_tx_words;430 u64 invalid_crcs;431 u64 input_requests;432 u64 output_requests;433 u64 control_requests;434 u64 input_mb; /* where 1 MByte == 1.000.000 Bytes */435 u64 output_mb; /* where 1 MByte == 1.000.000 Bytes */436 u8 cp_util;437 u8 cb_util;438 u8 a_util;439 u8 res2;440 s16 temperature;441 u16 vcc;442 u16 tx_bias;443 u16 tx_power;444 u16 rx_power;445 union {446 u16 raw;447 struct {448 u16 fec_active :1;449 u16:7;450 u16 connector_type :2;451 u16 sfp_invalid :1;452 u16 optical_port :1;453 u16 port_tx_type :4;454 };455 } sfp_flags;456 u32 fc_security_algorithms;457 u8 res3[236];458} __attribute__ ((packed));459 460union fsf_qtcb_bottom {461 struct fsf_qtcb_bottom_io io;462 struct fsf_qtcb_bottom_support support;463 struct fsf_qtcb_bottom_config config;464 struct fsf_qtcb_bottom_port port;465};466 467struct fsf_qtcb {468 struct fsf_qtcb_prefix prefix;469 struct fsf_qtcb_header header;470 union fsf_qtcb_bottom bottom;471 u8 log[FSF_QTCB_LOG_SIZE];472} __attribute__ ((packed));473 474struct zfcp_blk_drv_data {475#define ZFCP_BLK_DRV_DATA_MAGIC 0x1476 u32 magic;477#define ZFCP_BLK_LAT_VALID 0x1478#define ZFCP_BLK_REQ_ERROR 0x2479 u16 flags;480 u8 inb_usage;481 u8 outb_usage;482 u64 channel_lat;483 u64 fabric_lat;484} __attribute__ ((packed));485 486/**487 * struct zfcp_fsf_ct_els - zfcp data for ct or els request488 * @req: scatter-gather list for request, points to &zfcp_fc_req.sg_req or BSG489 * @resp: scatter-gather list for response, points to &zfcp_fc_req.sg_rsp or BSG490 * @handler: handler function (called for response to the request)491 * @handler_data: data passed to handler function492 * @port: Optional pointer to port for zfcp internal ELS (only test link ADISC)493 * @status: used to pass error status to calling function494 * @d_id: Destination ID of either open WKA port for CT or of D_ID for ELS495 */496struct zfcp_fsf_ct_els {497 struct scatterlist *req;498 struct scatterlist *resp;499 void (*handler)(void *);500 void *handler_data;501 struct zfcp_port *port;502 int status;503 u32 d_id;504};505 506#endif /* FSF_H */507