root/include/uapi/scsi/scsi_bsg_fc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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  */
  70 struct 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  */
  91 struct 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  */
 111 struct 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
 131 struct 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  */
 178 struct 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  */
 204 struct 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  */
 217 struct 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  */
 233 struct 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  */
 252 struct 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 */
 269 struct 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 */
 285 struct 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 

/* [<][>][^][v][top][bottom][index][help] */