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