scsi_bsg_fc.h (8027B)
1/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ 2/* 3 * FC Transport BSG Interface 4 * 5 * Copyright (C) 2008 James Smart, Emulex Corporation 6 */ 7 8#ifndef SCSI_BSG_FC_H 9#define SCSI_BSG_FC_H 10 11#include <linux/types.h> 12 13/* 14 * This file intended to be included by both kernel and user space 15 */ 16 17/* 18 * FC Transport SGIO v4 BSG Message Support 19 */ 20 21/* Default BSG request timeout (in seconds) */ 22#define FC_DEFAULT_BSG_TIMEOUT (10 * HZ) 23 24 25/* 26 * Request Message Codes supported by the FC Transport 27 */ 28 29/* define the class masks for the message codes */ 30#define FC_BSG_CLS_MASK 0xF0000000 /* find object class */ 31#define FC_BSG_HST_MASK 0x80000000 /* fc host class */ 32#define FC_BSG_RPT_MASK 0x40000000 /* fc rport class */ 33 34 /* fc_host Message Codes */ 35#define FC_BSG_HST_ADD_RPORT (FC_BSG_HST_MASK | 0x00000001) 36#define FC_BSG_HST_DEL_RPORT (FC_BSG_HST_MASK | 0x00000002) 37#define FC_BSG_HST_ELS_NOLOGIN (FC_BSG_HST_MASK | 0x00000003) 38#define FC_BSG_HST_CT (FC_BSG_HST_MASK | 0x00000004) 39#define FC_BSG_HST_VENDOR (FC_BSG_HST_MASK | 0x000000FF) 40 41 /* fc_rport Message Codes */ 42#define FC_BSG_RPT_ELS (FC_BSG_RPT_MASK | 0x00000001) 43#define FC_BSG_RPT_CT (FC_BSG_RPT_MASK | 0x00000002) 44 45 46 47/* 48 * FC Address Identifiers in Message Structures : 49 * 50 * Whenever a command payload contains a FC Address Identifier 51 * (aka port_id), the value is effectively in big-endian 52 * order, thus the array elements are decoded as follows: 53 * element [0] is bits 23:16 of the FC Address Identifier 54 * element [1] is bits 15:8 of the FC Address Identifier 55 * element [2] is bits 7:0 of the FC Address Identifier 56 */ 57 58 59/* 60 * FC Host Messages 61 */ 62 63/* FC_BSG_HST_ADDR_PORT : */ 64 65/* Request: 66 * This message requests the FC host to login to the remote port 67 * at the specified N_Port_Id. The remote port is to be enumerated 68 * with the transport upon completion of the login. 69 */ 70struct fc_bsg_host_add_rport { 71 __u8 reserved; 72 73 /* FC Address Identier of the remote port to login to */ 74 __u8 port_id[3]; 75}; 76 77/* Response: 78 * There is no additional response data - fc_bsg_reply->result is sufficient 79 */ 80 81 82/* FC_BSG_HST_DEL_RPORT : */ 83 84/* Request: 85 * This message requests the FC host to remove an enumerated 86 * remote port and to terminate the login to it. 87 * 88 * Note: The driver is free to reject this request if it desires to 89 * remain logged in with the remote port. 90 */ 91struct fc_bsg_host_del_rport { 92 __u8 reserved; 93 94 /* FC Address Identier of the remote port to logout of */ 95 __u8 port_id[3]; 96}; 97 98/* Response: 99 * There is no additional response data - fc_bsg_reply->result is sufficient 100 */ 101 102 103/* FC_BSG_HST_ELS_NOLOGIN : */ 104 105/* Request: 106 * This message requests the FC_Host to send an ELS to a specific 107 * N_Port_ID. The host does not need to log into the remote port, 108 * nor does it need to enumerate the rport for further traffic 109 * (although, the FC host is free to do so if it desires). 110 */ 111struct fc_bsg_host_els { 112 /* 113 * ELS Command Code being sent (must be the same as byte 0 114 * of the payload) 115 */ 116 __u8 command_code; 117 118 /* FC Address Identier of the remote port to send the ELS to */ 119 __u8 port_id[3]; 120}; 121 122/* Response: 123 */ 124/* fc_bsg_ctels_reply->status values */ 125#define FC_CTELS_STATUS_OK 0x00000000 126#define FC_CTELS_STATUS_REJECT 0x00000001 127#define FC_CTELS_STATUS_P_RJT 0x00000002 128#define FC_CTELS_STATUS_F_RJT 0x00000003 129#define FC_CTELS_STATUS_P_BSY 0x00000004 130#define FC_CTELS_STATUS_F_BSY 0x00000006 131struct fc_bsg_ctels_reply { 132 /* 133 * Note: An ELS LS_RJT may be reported in 2 ways: 134 * a) A status of FC_CTELS_STATUS_OK is returned. The caller 135 * is to look into the ELS receive payload to determine 136 * LS_ACC or LS_RJT (by contents of word 0). The reject 137 * data will be in word 1. 138 * b) A status of FC_CTELS_STATUS_REJECT is returned, The 139 * rjt_data field will contain valid data. 140 * 141 * Note: ELS LS_ACC is determined by an FC_CTELS_STATUS_OK, and 142 * the receive payload word 0 indicates LS_ACC 143 * (e.g. value is 0x02xxxxxx). 144 * 145 * Note: Similarly, a CT Reject may be reported in 2 ways: 146 * a) A status of FC_CTELS_STATUS_OK is returned. The caller 147 * is to look into the CT receive payload to determine 148 * Accept or Reject (by contents of word 2). The reject 149 * data will be in word 3. 150 * b) A status of FC_CTELS_STATUS_REJECT is returned, The 151 * rjt_data field will contain valid data. 152 * 153 * Note: x_RJT/BSY status will indicae that the rjt_data field 154 * is valid and contains the reason/explanation values. 155 */ 156 __u32 status; /* See FC_CTELS_STATUS_xxx */ 157 158 /* valid if status is not FC_CTELS_STATUS_OK */ 159 struct { 160 __u8 action; /* fragment_id for CT REJECT */ 161 __u8 reason_code; 162 __u8 reason_explanation; 163 __u8 vendor_unique; 164 } rjt_data; 165}; 166 167 168/* FC_BSG_HST_CT : */ 169 170/* Request: 171 * This message requests that a CT Request be performed with the 172 * indicated N_Port_ID. The driver is responsible for logging in with 173 * the fabric and/or N_Port_ID, etc as per FC rules. This request does 174 * not mandate that the driver must enumerate the destination in the 175 * transport. The driver is allowed to decide whether to enumerate it, 176 * and whether to tear it down after the request. 177 */ 178struct fc_bsg_host_ct { 179 __u8 reserved; 180 181 /* FC Address Identier of the remote port to send the ELS to */ 182 __u8 port_id[3]; 183 184 /* 185 * We need words 0-2 of the generic preamble for the LLD's 186 */ 187 __u32 preamble_word0; /* revision & IN_ID */ 188 __u32 preamble_word1; /* GS_Type, GS_SubType, Options, Rsvd */ 189 __u32 preamble_word2; /* Cmd Code, Max Size */ 190 191}; 192/* Response: 193 * 194 * The reply structure is an fc_bsg_ctels_reply structure 195 */ 196 197 198/* FC_BSG_HST_VENDOR : */ 199 200/* Request: 201 * Note: When specifying vendor_id, be sure to read the Vendor Type and ID 202 * formatting requirements specified in scsi_netlink.h 203 */ 204struct fc_bsg_host_vendor { 205 /* 206 * Identifies the vendor that the message is formatted for. This 207 * should be the recipient of the message. 208 */ 209 __u64 vendor_id; 210 211 /* start of vendor command area */ 212 __u32 vendor_cmd[0]; 213}; 214 215/* Response: 216 */ 217struct fc_bsg_host_vendor_reply { 218 /* start of vendor response area */ 219 __u32 vendor_rsp[0]; 220}; 221 222 223 224/* 225 * FC Remote Port Messages 226 */ 227 228/* FC_BSG_RPT_ELS : */ 229 230/* Request: 231 * This message requests that an ELS be performed with the rport. 232 */ 233struct fc_bsg_rport_els { 234 /* 235 * ELS Command Code being sent (must be the same as 236 * byte 0 of the payload) 237 */ 238 __u8 els_code; 239}; 240 241/* Response: 242 * 243 * The reply structure is an fc_bsg_ctels_reply structure 244 */ 245 246 247/* FC_BSG_RPT_CT : */ 248 249/* Request: 250 * This message requests that a CT Request be performed with the rport. 251 */ 252struct fc_bsg_rport_ct { 253 /* 254 * We need words 0-2 of the generic preamble for the LLD's 255 */ 256 __u32 preamble_word0; /* revision & IN_ID */ 257 __u32 preamble_word1; /* GS_Type, GS_SubType, Options, Rsvd */ 258 __u32 preamble_word2; /* Cmd Code, Max Size */ 259}; 260/* Response: 261 * 262 * The reply structure is an fc_bsg_ctels_reply structure 263 */ 264 265 266 267 268/* request (CDB) structure of the sg_io_v4 */ 269struct fc_bsg_request { 270 __u32 msgcode; 271 union { 272 struct fc_bsg_host_add_rport h_addrport; 273 struct fc_bsg_host_del_rport h_delrport; 274 struct fc_bsg_host_els h_els; 275 struct fc_bsg_host_ct h_ct; 276 struct fc_bsg_host_vendor h_vendor; 277 278 struct fc_bsg_rport_els r_els; 279 struct fc_bsg_rport_ct r_ct; 280 } rqst_data; 281} __attribute__((packed)); 282 283 284/* response (request sense data) structure of the sg_io_v4 */ 285struct fc_bsg_reply { 286 /* 287 * The completion result. Result exists in two forms: 288 * if negative, it is an -Exxx system errno value. There will 289 * be no further reply information supplied. 290 * else, it's the 4-byte scsi error result, with driver, host, 291 * msg and status fields. The per-msgcode reply structure 292 * will contain valid data. 293 */ 294 __u32 result; 295 296 /* If there was reply_payload, how much was recevied ? */ 297 __u32 reply_payload_rcv_len; 298 299 union { 300 struct fc_bsg_host_vendor_reply vendor_reply; 301 302 struct fc_bsg_ctels_reply ctels_reply; 303 } reply_data; 304}; 305 306 307#endif /* SCSI_BSG_FC_H */ 308