^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * zfcp device driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Interface to the FSF support functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright IBM Corp. 2002, 2020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #ifndef FSF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define FSF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/pfn.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/scatterlist.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <scsi/libfc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define FSF_QTCB_CURRENT_VERSION 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /* FSF commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define FSF_QTCB_FCP_CMND 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define FSF_QTCB_ABORT_FCP_CMND 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define FSF_QTCB_OPEN_PORT_WITH_DID 0x00000005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define FSF_QTCB_OPEN_LUN 0x00000006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define FSF_QTCB_CLOSE_LUN 0x00000007
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define FSF_QTCB_CLOSE_PORT 0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define FSF_QTCB_CLOSE_PHYSICAL_PORT 0x00000009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define FSF_QTCB_SEND_ELS 0x0000000B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define FSF_QTCB_SEND_GENERIC 0x0000000C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define FSF_QTCB_EXCHANGE_CONFIG_DATA 0x0000000D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define FSF_QTCB_EXCHANGE_PORT_DATA 0x0000000E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define FSF_QTCB_DOWNLOAD_CONTROL_FILE 0x00000012
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define FSF_QTCB_UPLOAD_CONTROL_FILE 0x00000013
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* FSF QTCB types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define FSF_IO_COMMAND 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define FSF_SUPPORT_COMMAND 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define FSF_CONFIG_COMMAND 0x00000003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define FSF_PORT_COMMAND 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* FSF protocol states */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define FSF_PROT_GOOD 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define FSF_PROT_QTCB_VERSION_ERROR 0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define FSF_PROT_SEQ_NUMB_ERROR 0x00000020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define FSF_PROT_UNSUPP_QTCB_TYPE 0x00000040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define FSF_PROT_HOST_CONNECTION_INITIALIZING 0x00000080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define FSF_PROT_FSF_STATUS_PRESENTED 0x00000100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define FSF_PROT_DUPLICATE_REQUEST_ID 0x00000200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define FSF_PROT_LINK_DOWN 0x00000400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define FSF_PROT_REEST_QUEUE 0x00000800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define FSF_PROT_ERROR_STATE 0x01000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /* FSF states */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define FSF_GOOD 0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define FSF_PORT_ALREADY_OPEN 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define FSF_LUN_ALREADY_OPEN 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define FSF_PORT_HANDLE_NOT_VALID 0x00000003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define FSF_LUN_HANDLE_NOT_VALID 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define FSF_HANDLE_MISMATCH 0x00000005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define FSF_SERVICE_CLASS_NOT_SUPPORTED 0x00000006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define FSF_FCPLUN_NOT_VALID 0x00000009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define FSF_LUN_SHARING_VIOLATION 0x00000012
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define FSF_FCP_COMMAND_DOES_NOT_EXIST 0x00000022
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define FSF_DIRECTION_INDICATOR_NOT_VALID 0x00000030
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define FSF_CMND_LENGTH_NOT_VALID 0x00000033
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED 0x00000040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED 0x00000041
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define FSF_ELS_COMMAND_REJECTED 0x00000050
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define FSF_GENERIC_COMMAND_REJECTED 0x00000051
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define FSF_PORT_BOXED 0x00000059
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define FSF_LUN_BOXED 0x0000005A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE 0x0000005B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define FSF_PAYLOAD_SIZE_MISMATCH 0x00000060
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define FSF_REQUEST_SIZE_TOO_LARGE 0x00000061
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define FSF_RESPONSE_SIZE_TOO_LARGE 0x00000062
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define FSF_SBAL_MISMATCH 0x00000063
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define FSF_INCONSISTENT_PROT_DATA 0x00000070
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define FSF_INVALID_PROT_PARM 0x00000071
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define FSF_BLOCK_GUARD_CHECK_FAILURE 0x00000081
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define FSF_APP_TAG_CHECK_FAILURE 0x00000082
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define FSF_REF_TAG_CHECK_FAILURE 0x00000083
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define FSF_SECURITY_ERROR 0x00000090
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define FSF_ADAPTER_STATUS_AVAILABLE 0x000000AD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define FSF_FCP_RSP_AVAILABLE 0x000000AF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define FSF_UNKNOWN_COMMAND 0x000000E2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define FSF_UNKNOWN_OP_SUBTYPE 0x000000E3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define FSF_INVALID_COMMAND_OPTION 0x000000E5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define FSF_PROT_STATUS_QUAL_SIZE 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define FSF_STATUS_QUALIFIER_SIZE 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /* FSF status qualifier, recommendations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define FSF_SQ_NO_RECOM 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define FSF_SQ_FCP_RSP_AVAILABLE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define FSF_SQ_RETRY_IF_POSSIBLE 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define FSF_SQ_INVOKE_LINK_TEST_PROCEDURE 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define FSF_SQ_COMMAND_ABORTED 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define FSF_SQ_NO_RETRY_POSSIBLE 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /* FSF status qualifier (most significant 4 bytes), local link down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define FSF_PSQ_LINK_NO_LIGHT 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define FSF_PSQ_LINK_WRAP_PLUG 0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define FSF_PSQ_LINK_NO_FCP 0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define FSF_PSQ_LINK_FIRMWARE_UPDATE 0x00000020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define FSF_PSQ_LINK_INVALID_WWPN 0x00000100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define FSF_PSQ_LINK_NO_NPIV_SUPPORT 0x00000200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define FSF_PSQ_LINK_NO_FCP_RESOURCES 0x00000400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define FSF_PSQ_LINK_NO_FABRIC_RESOURCES 0x00000800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define FSF_PSQ_LINK_FABRIC_LOGIN_UNABLE 0x00001000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define FSF_PSQ_LINK_WWPN_ASSIGNMENT_CORRUPTED 0x00002000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define FSF_PSQ_LINK_MODE_TABLE_CURRUPTED 0x00004000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define FSF_PSQ_LINK_NO_WWPN_ASSIGNMENT 0x00008000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /* FSF status qualifier, security error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define FSF_SQ_SECURITY_REQUIRED 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define FSF_SQ_SECURITY_TIMEOUT 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define FSF_SQ_SECURITY_KM_UNAVAILABLE 0x00000003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define FSF_SQ_SECURITY_RKM_UNAVAILABLE 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define FSF_SQ_SECURITY_AUTH_FAILURE 0x00000005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define FSF_SQ_SECURITY_ENC_FAILURE 0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /* payload size in status read buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define FSF_STATUS_READ_PAYLOAD_SIZE 4032
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* number of status read buffers that should be sent by ULP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define FSF_STATUS_READS_RECOM 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /* status types in status read buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define FSF_STATUS_READ_PORT_CLOSED 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define FSF_STATUS_READ_INCOMING_ELS 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define FSF_STATUS_READ_SENSE_DATA_AVAIL 0x00000003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define FSF_STATUS_READ_BIT_ERROR_THRESHOLD 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define FSF_STATUS_READ_LINK_DOWN 0x00000005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define FSF_STATUS_READ_LINK_UP 0x00000006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define FSF_STATUS_READ_NOTIFICATION_LOST 0x00000009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define FSF_STATUS_READ_FEATURE_UPDATE_ALERT 0x0000000C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* status subtypes for link down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK 0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define FSF_STATUS_READ_SUB_FDISC_FAILED 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define FSF_STATUS_READ_SUB_FIRMWARE_UPDATE 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* status subtypes for unsolicited status notification lost */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define FSF_STATUS_READ_SUB_INCOMING_ELS 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /* topologie that is detected by the adapter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define FSF_TOPO_P2P 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define FSF_TOPO_FABRIC 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define FSF_TOPO_AL 0x00000003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* data direction for FCP commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define FSF_DATADIR_WRITE 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define FSF_DATADIR_READ 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define FSF_DATADIR_CMND 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define FSF_DATADIR_DIF_WRITE_INSERT 0x00000009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define FSF_DATADIR_DIF_READ_STRIP 0x0000000a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define FSF_DATADIR_DIF_WRITE_CONVERT 0x0000000b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define FSF_DATADIR_DIF_READ_CONVERT 0X0000000c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* data protection control flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define FSF_APP_TAG_CHECK_ENABLE 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /* fc service class */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define FSF_CLASS_3 0x00000003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /* logging space behind QTCB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define FSF_QTCB_LOG_SIZE 1024
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) /* channel features */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define FSF_FEATURE_NOTIFICATION_LOST 0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define FSF_FEATURE_HBAAPI_MANAGEMENT 0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define FSF_FEATURE_ELS_CT_CHAINED_SBALS 0x00000020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define FSF_FEATURE_UPDATE_ALERT 0x00000100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define FSF_FEATURE_MEASUREMENT_DATA 0x00000200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define FSF_FEATURE_REQUEST_SFP_DATA 0x00000200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define FSF_FEATURE_REPORT_SFP_DATA 0x00000800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define FSF_FEATURE_FC_SECURITY 0x00001000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define FSF_FEATURE_DIF_PROT_TYPE1 0x00010000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define FSF_FEATURE_DIX_PROT_TCPIP 0x00020000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* host connection features */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define FSF_FEATURE_NPIV_MODE 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) /* option */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define FSF_OPEN_LUN_SUPPRESS_BOXING 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /* FC security algorithms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define FSF_FC_SECURITY_AUTH 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define FSF_FC_SECURITY_ENC_FCSP2 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define FSF_FC_SECURITY_ENC_ERAS 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct fsf_queue_designator {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) u8 cssid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) u8 chpid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) u8 hla;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) u8 ua;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) u32 res1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct fsf_bit_error_payload {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) u32 res1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) u32 link_failure_error_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) u32 loss_of_sync_error_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) u32 loss_of_signal_error_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) u32 primitive_sequence_error_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) u32 invalid_transmission_word_error_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) u32 crc_error_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) u32 primitive_sequence_event_timeout_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) u32 elastic_buffer_overrun_error_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) u32 fcal_arbitration_timeout_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) u32 advertised_receive_b2b_credit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) u32 current_receive_b2b_credit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) u32 advertised_transmit_b2b_credit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) u32 current_transmit_b2b_credit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct fsf_link_down_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) u32 error_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) u32 res1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) u8 res2[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) u8 primary_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) u8 ioerr_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) u8 action_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) u8 reason_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) u8 explanation_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) u8 vendor_specific_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) struct fsf_status_read_buffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) u32 status_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) u32 status_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) u32 length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) u32 res1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) struct fsf_queue_designator queue_designator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) u8 res2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) u8 d_id[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) u32 class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) u64 fcp_lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) u8 res3[24];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) u8 data[FSF_STATUS_READ_PAYLOAD_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) u32 word[FSF_STATUS_READ_PAYLOAD_SIZE/sizeof(u32)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) struct fsf_link_down_info link_down_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) struct fsf_bit_error_payload bit_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) } payload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct fsf_qual_version_error {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) u32 fsf_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) u32 res1[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) struct fsf_qual_sequence_error {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) u32 exp_req_seq_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) u32 res1[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) struct fsf_qual_latency_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) u32 channel_lat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) u32 fabric_lat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) u8 res1[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) union fsf_prot_status_qual {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) u32 word[FSF_PROT_STATUS_QUAL_SIZE / sizeof(u32)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) u64 doubleword[FSF_PROT_STATUS_QUAL_SIZE / sizeof(u64)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) struct fsf_qual_version_error version_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) struct fsf_qual_sequence_error sequence_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) struct fsf_link_down_info link_down_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) struct fsf_qual_latency_info latency_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) struct fsf_qtcb_prefix {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) u64 req_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) u32 qtcb_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) u32 ulp_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) u32 qtcb_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) u32 req_seq_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) u32 prot_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) union fsf_prot_status_qual prot_status_qual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) u8 res1[20];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) struct fsf_statistics_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) u64 input_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) u64 output_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) u64 control_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) u64 input_mb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) u64 output_mb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) u64 seconds_act;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) union fsf_status_qual {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) u8 byte[FSF_STATUS_QUALIFIER_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) u16 halfword[FSF_STATUS_QUALIFIER_SIZE / sizeof (u16)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) u32 word[FSF_STATUS_QUALIFIER_SIZE / sizeof (u32)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) u64 doubleword[FSF_STATUS_QUALIFIER_SIZE / sizeof(u64)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) struct fsf_queue_designator fsf_queue_designator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) struct fsf_link_down_info link_down_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) struct fsf_qtcb_header {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) u64 req_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) u32 fsf_command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) u32 res1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) u32 port_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) u32 lun_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) u32 res2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) u32 fsf_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) union fsf_status_qual fsf_status_qual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) u8 res3[28];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) u16 log_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) u16 log_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) u8 res4[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #define FSF_PLOGI_MIN_LEN 112
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #define FSF_FCP_CMND_SIZE 288
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) #define FSF_FCP_RSP_SIZE 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) struct fsf_qtcb_bottom_io {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) u32 data_direction;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) u32 service_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) u8 res1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) u8 data_prot_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) u16 app_tag_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) u32 ref_tag_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) u32 fcp_cmnd_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) u32 data_block_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) u32 prot_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) u8 res2[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) u8 byte[FSF_FCP_CMND_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) struct fcp_cmnd iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) } fcp_cmnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) u8 byte[FSF_FCP_RSP_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) struct fcp_resp_with_ext iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) } fcp_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) u8 res3[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) struct fsf_qtcb_bottom_support {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) u32 operation_subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) u8 res1[13];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) u8 d_id[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) u32 option;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) u64 fcp_lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) u64 res2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) u64 req_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) u32 service_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) u8 res3[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) u8 timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) u32 lun_access_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) u32 connection_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) u8 res4[176];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) u32 els1_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) u32 els2_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) u32 req_buf_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) u32 resp_buf_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) u8 els[256];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) #define ZFCP_FSF_TIMER_INT_MASK 0x3FFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) struct fsf_qtcb_bottom_config {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) u32 lic_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) u32 feature_selection;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) u32 high_qtcb_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) u32 low_qtcb_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) u32 max_qtcb_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) u32 max_data_transfer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) u32 adapter_features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) u32 connection_features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) u32 fc_topology;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) u32 fc_link_speed; /* one of ZFCP_FSF_PORTSPEED_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) u32 adapter_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) u8 res0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) u8 peer_d_id[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) u16 status_read_buf_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) u16 timer_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) u8 res2[9];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) u8 s_id[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) u8 nport_serv_param[128];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) u8 res3[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) u32 adapter_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) u32 hardware_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) u8 serial_number[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) u8 plogi_payload[112];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) struct fsf_statistics_info stat_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) u8 res4[112];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) struct fsf_qtcb_bottom_port {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) u64 wwpn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) u32 fc_port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) u32 port_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) u32 port_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) u32 class_of_service; /* should be 0x00000006 for class 2 and 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) u8 supported_fc4_types[32]; /* should be 0x00000100 for scsi fcp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) u8 active_fc4_types[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) u32 supported_speed; /* any combination of ZFCP_FSF_PORTSPEED_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) u32 maximum_frame_size; /* fixed value of 2112 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) u64 seconds_since_last_reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) u64 tx_frames;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) u64 tx_words;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) u64 rx_frames;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) u64 rx_words;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) u64 lip; /* 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) u64 nos; /* currently 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) u64 error_frames; /* currently 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) u64 dumped_frames; /* currently 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) u64 link_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) u64 loss_of_sync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) u64 loss_of_signal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) u64 psp_error_counts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) u64 invalid_tx_words;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) u64 invalid_crcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) u64 input_requests;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) u64 output_requests;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) u64 control_requests;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) u64 input_mb; /* where 1 MByte == 1.000.000 Bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) u64 output_mb; /* where 1 MByte == 1.000.000 Bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) u8 cp_util;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) u8 cb_util;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) u8 a_util;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) u8 res2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) s16 temperature;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) u16 vcc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) u16 tx_bias;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) u16 tx_power;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) u16 rx_power;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) u16 raw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) u16 fec_active :1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) u16:7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) u16 connector_type :2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) u16 sfp_invalid :1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) u16 optical_port :1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) u16 port_tx_type :4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) } sfp_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) u32 fc_security_algorithms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) u8 res3[236];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) union fsf_qtcb_bottom {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) struct fsf_qtcb_bottom_io io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) struct fsf_qtcb_bottom_support support;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) struct fsf_qtcb_bottom_config config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) struct fsf_qtcb_bottom_port port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) struct fsf_qtcb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) struct fsf_qtcb_prefix prefix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) struct fsf_qtcb_header header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) union fsf_qtcb_bottom bottom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) u8 log[FSF_QTCB_LOG_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) struct zfcp_blk_drv_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) #define ZFCP_BLK_DRV_DATA_MAGIC 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) u32 magic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) #define ZFCP_BLK_LAT_VALID 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) #define ZFCP_BLK_REQ_ERROR 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) u16 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) u8 inb_usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) u8 outb_usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) u64 channel_lat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) u64 fabric_lat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) * struct zfcp_fsf_ct_els - zfcp data for ct or els request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) * @req: scatter-gather list for request, points to &zfcp_fc_req.sg_req or BSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) * @resp: scatter-gather list for response, points to &zfcp_fc_req.sg_rsp or BSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) * @handler: handler function (called for response to the request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) * @handler_data: data passed to handler function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) * @port: Optional pointer to port for zfcp internal ELS (only test link ADISC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) * @status: used to pass error status to calling function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) * @d_id: Destination ID of either open WKA port for CT or of D_ID for ELS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) struct zfcp_fsf_ct_els {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) struct scatterlist *req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) struct scatterlist *resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) void (*handler)(void *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) void *handler_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) struct zfcp_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) u32 d_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) #endif /* FSF_H */