scsi_ioctl.h 0000644 00000002443 14751150150 0007052 0 ustar 00 /* Copyright (C) 1999-2018 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SCSI_IOCTL_H
#define _SCSI_IOCTL_H
/* IOCTLs for SCSI. */
#define SCSI_IOCTL_SEND_COMMAND 1 /* Send a command to the SCSI host. */
#define SCSI_IOCTL_TEST_UNIT_READY 2 /* Test if unit is ready. */
#define SCSI_IOCTL_BENCHMARK_COMMAND 3
#define SCSI_IOCTL_SYNC 4 /* Request synchronous parameters. */
#define SCSI_IOCTL_START_UNIT 5
#define SCSI_IOCTL_STOP_UNIT 6
#define SCSI_IOCTL_DOORLOCK 0x5380 /* Lock the eject mechanism. */
#define SCSI_IOCTL_DOORUNLOCK 0x5381 /* Unlock the mechanism. */
#endif
scsi_bsg_fc.h 0000644 00000021161 14751150150 0007161 0 ustar 00 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
/*
* FC Transport BSG Interface
*
* Copyright (C) 2008 James Smart, Emulex Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef SCSI_BSG_FC_H
#define SCSI_BSG_FC_H
/*
* This file intended to be included by both kernel and user space
*/
/*
* FC Transport SGIO v4 BSG Message Support
*/
/* Default BSG request timeout (in seconds) */
#define FC_DEFAULT_BSG_TIMEOUT (10 * HZ)
/*
* Request Message Codes supported by the FC Transport
*/
/* define the class masks for the message codes */
#define FC_BSG_CLS_MASK 0xF0000000 /* find object class */
#define FC_BSG_HST_MASK 0x80000000 /* fc host class */
#define FC_BSG_RPT_MASK 0x40000000 /* fc rport class */
/* fc_host Message Codes */
#define FC_BSG_HST_ADD_RPORT (FC_BSG_HST_MASK | 0x00000001)
#define FC_BSG_HST_DEL_RPORT (FC_BSG_HST_MASK | 0x00000002)
#define FC_BSG_HST_ELS_NOLOGIN (FC_BSG_HST_MASK | 0x00000003)
#define FC_BSG_HST_CT (FC_BSG_HST_MASK | 0x00000004)
#define FC_BSG_HST_VENDOR (FC_BSG_HST_MASK | 0x000000FF)
/* fc_rport Message Codes */
#define FC_BSG_RPT_ELS (FC_BSG_RPT_MASK | 0x00000001)
#define FC_BSG_RPT_CT (FC_BSG_RPT_MASK | 0x00000002)
/*
* FC Address Identifiers in Message Structures :
*
* Whenever a command payload contains a FC Address Identifier
* (aka port_id), the value is effectively in big-endian
* order, thus the array elements are decoded as follows:
* element [0] is bits 23:16 of the FC Address Identifier
* element [1] is bits 15:8 of the FC Address Identifier
* element [2] is bits 7:0 of the FC Address Identifier
*/
/*
* FC Host Messages
*/
/* FC_BSG_HST_ADDR_PORT : */
/* Request:
* This message requests the FC host to login to the remote port
* at the specified N_Port_Id. The remote port is to be enumerated
* with the transport upon completion of the login.
*/
struct fc_bsg_host_add_rport {
uint8_t reserved;
/* FC Address Identier of the remote port to login to */
uint8_t port_id[3];
};
/* Response:
* There is no additional response data - fc_bsg_reply->result is sufficient
*/
/* FC_BSG_HST_DEL_RPORT : */
/* Request:
* This message requests the FC host to remove an enumerated
* remote port and to terminate the login to it.
*
* Note: The driver is free to reject this request if it desires to
* remain logged in with the remote port.
*/
struct fc_bsg_host_del_rport {
uint8_t reserved;
/* FC Address Identier of the remote port to logout of */
uint8_t port_id[3];
};
/* Response:
* There is no additional response data - fc_bsg_reply->result is sufficient
*/
/* FC_BSG_HST_ELS_NOLOGIN : */
/* Request:
* This message requests the FC_Host to send an ELS to a specific
* N_Port_ID. The host does not need to log into the remote port,
* nor does it need to enumerate the rport for further traffic
* (although, the FC host is free to do so if it desires).
*/
struct fc_bsg_host_els {
/*
* ELS Command Code being sent (must be the same as byte 0
* of the payload)
*/
uint8_t command_code;
/* FC Address Identier of the remote port to send the ELS to */
uint8_t port_id[3];
};
/* Response:
*/
/* fc_bsg_ctels_reply->status values */
#define FC_CTELS_STATUS_OK 0x00000000
#define FC_CTELS_STATUS_REJECT 0x00000001
#define FC_CTELS_STATUS_P_RJT 0x00000002
#define FC_CTELS_STATUS_F_RJT 0x00000003
#define FC_CTELS_STATUS_P_BSY 0x00000004
#define FC_CTELS_STATUS_F_BSY 0x00000006
struct fc_bsg_ctels_reply {
/*
* Note: An ELS LS_RJT may be reported in 2 ways:
* a) A status of FC_CTELS_STATUS_OK is returned. The caller
* is to look into the ELS receive payload to determine
* LS_ACC or LS_RJT (by contents of word 0). The reject
* data will be in word 1.
* b) A status of FC_CTELS_STATUS_REJECT is returned, The
* rjt_data field will contain valid data.
*
* Note: ELS LS_ACC is determined by an FC_CTELS_STATUS_OK, and
* the receive payload word 0 indicates LS_ACC
* (e.g. value is 0x02xxxxxx).
*
* Note: Similarly, a CT Reject may be reported in 2 ways:
* a) A status of FC_CTELS_STATUS_OK is returned. The caller
* is to look into the CT receive payload to determine
* Accept or Reject (by contents of word 2). The reject
* data will be in word 3.
* b) A status of FC_CTELS_STATUS_REJECT is returned, The
* rjt_data field will contain valid data.
*
* Note: x_RJT/BSY status will indicae that the rjt_data field
* is valid and contains the reason/explanation values.
*/
uint32_t status; /* See FC_CTELS_STATUS_xxx */
/* valid if status is not FC_CTELS_STATUS_OK */
struct {
uint8_t action; /* fragment_id for CT REJECT */
uint8_t reason_code;
uint8_t reason_explanation;
uint8_t vendor_unique;
} rjt_data;
};
/* FC_BSG_HST_CT : */
/* Request:
* This message requests that a CT Request be performed with the
* indicated N_Port_ID. The driver is responsible for logging in with
* the fabric and/or N_Port_ID, etc as per FC rules. This request does
* not mandate that the driver must enumerate the destination in the
* transport. The driver is allowed to decide whether to enumerate it,
* and whether to tear it down after the request.
*/
struct fc_bsg_host_ct {
uint8_t reserved;
/* FC Address Identier of the remote port to send the ELS to */
uint8_t port_id[3];
/*
* We need words 0-2 of the generic preamble for the LLD's
*/
uint32_t preamble_word0; /* revision & IN_ID */
uint32_t preamble_word1; /* GS_Type, GS_SubType, Options, Rsvd */
uint32_t preamble_word2; /* Cmd Code, Max Size */
};
/* Response:
*
* The reply structure is an fc_bsg_ctels_reply structure
*/
/* FC_BSG_HST_VENDOR : */
/* Request:
* Note: When specifying vendor_id, be sure to read the Vendor Type and ID
* formatting requirements specified in scsi_netlink.h
*/
struct fc_bsg_host_vendor {
/*
* Identifies the vendor that the message is formatted for. This
* should be the recipient of the message.
*/
uint64_t vendor_id;
/* start of vendor command area */
uint32_t vendor_cmd[0];
};
/* Response:
*/
struct fc_bsg_host_vendor_reply {
/* start of vendor response area */
uint32_t vendor_rsp[0];
};
/*
* FC Remote Port Messages
*/
/* FC_BSG_RPT_ELS : */
/* Request:
* This message requests that an ELS be performed with the rport.
*/
struct fc_bsg_rport_els {
/*
* ELS Command Code being sent (must be the same as
* byte 0 of the payload)
*/
uint8_t els_code;
};
/* Response:
*
* The reply structure is an fc_bsg_ctels_reply structure
*/
/* FC_BSG_RPT_CT : */
/* Request:
* This message requests that a CT Request be performed with the rport.
*/
struct fc_bsg_rport_ct {
/*
* We need words 0-2 of the generic preamble for the LLD's
*/
uint32_t preamble_word0; /* revision & IN_ID */
uint32_t preamble_word1; /* GS_Type, GS_SubType, Options, Rsvd */
uint32_t preamble_word2; /* Cmd Code, Max Size */
};
/* Response:
*
* The reply structure is an fc_bsg_ctels_reply structure
*/
/* request (CDB) structure of the sg_io_v4 */
struct fc_bsg_request {
uint32_t msgcode;
union {
struct fc_bsg_host_add_rport h_addrport;
struct fc_bsg_host_del_rport h_delrport;
struct fc_bsg_host_els h_els;
struct fc_bsg_host_ct h_ct;
struct fc_bsg_host_vendor h_vendor;
struct fc_bsg_rport_els r_els;
struct fc_bsg_rport_ct r_ct;
} rqst_data;
} __attribute__((packed));
/* response (request sense data) structure of the sg_io_v4 */
struct fc_bsg_reply {
/*
* The completion result. Result exists in two forms:
* if negative, it is an -Exxx system errno value. There will
* be no further reply information supplied.
* else, it's the 4-byte scsi error result, with driver, host,
* msg and status fields. The per-msgcode reply structure
* will contain valid data.
*/
uint32_t result;
/* If there was reply_payload, how much was recevied ? */
uint32_t reply_payload_rcv_len;
union {
struct fc_bsg_host_vendor_reply vendor_reply;
struct fc_bsg_ctels_reply ctels_reply;
} reply_data;
};
#endif /* SCSI_BSG_FC_H */
fc/fc_fs.h 0000644 00000030117 14751150150 0006366 0 ustar 00 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
* Copyright(c) 2007 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Maintained at www.Open-FCoE.org
*/
#ifndef _FC_FS_H_
#define _FC_FS_H_
#include <linux/types.h>
/*
* Fibre Channel Framing and Signalling definitions.
* From T11 FC-FS-2 Rev 0.90 - 9 August 2005.
*/
/*
* Frame header
*/
struct fc_frame_header {
__u8 fh_r_ctl; /* routing control */
__u8 fh_d_id[3]; /* Destination ID */
__u8 fh_cs_ctl; /* class of service control / pri */
__u8 fh_s_id[3]; /* Source ID */
__u8 fh_type; /* see enum fc_fh_type below */
__u8 fh_f_ctl[3]; /* frame control */
__u8 fh_seq_id; /* sequence ID */
__u8 fh_df_ctl; /* data field control */
__be16 fh_seq_cnt; /* sequence count */
__be16 fh_ox_id; /* originator exchange ID */
__be16 fh_rx_id; /* responder exchange ID */
__be32 fh_parm_offset; /* parameter or relative offset */
};
#define FC_FRAME_HEADER_LEN 24 /* expected length of structure */
#define FC_MAX_PAYLOAD 2112U /* max payload length in bytes */
#define FC_MIN_MAX_PAYLOAD 256U /* lower limit on max payload */
#define FC_MAX_FRAME (FC_MAX_PAYLOAD + FC_FRAME_HEADER_LEN)
#define FC_MIN_MAX_FRAME (FC_MIN_MAX_PAYLOAD + FC_FRAME_HEADER_LEN)
/*
* fh_r_ctl - Routing control definitions.
*/
/*
* FC-4 device_data.
*/
enum fc_rctl {
FC_RCTL_DD_UNCAT = 0x00, /* uncategorized information */
FC_RCTL_DD_SOL_DATA = 0x01, /* solicited data */
FC_RCTL_DD_UNSOL_CTL = 0x02, /* unsolicited control */
FC_RCTL_DD_SOL_CTL = 0x03, /* solicited control or reply */
FC_RCTL_DD_UNSOL_DATA = 0x04, /* unsolicited data */
FC_RCTL_DD_DATA_DESC = 0x05, /* data descriptor */
FC_RCTL_DD_UNSOL_CMD = 0x06, /* unsolicited command */
FC_RCTL_DD_CMD_STATUS = 0x07, /* command status */
#define FC_RCTL_ILS_REQ FC_RCTL_DD_UNSOL_CTL /* ILS request */
#define FC_RCTL_ILS_REP FC_RCTL_DD_SOL_CTL /* ILS reply */
/*
* Extended Link_Data
*/
FC_RCTL_ELS_REQ = 0x22, /* extended link services request */
FC_RCTL_ELS_REP = 0x23, /* extended link services reply */
FC_RCTL_ELS4_REQ = 0x32, /* FC-4 ELS request */
FC_RCTL_ELS4_REP = 0x33, /* FC-4 ELS reply */
/*
* Optional Extended Headers
*/
FC_RCTL_VFTH = 0x50, /* virtual fabric tagging header */
FC_RCTL_IFRH = 0x51, /* inter-fabric routing header */
FC_RCTL_ENCH = 0x52, /* encapsulation header */
/*
* Basic Link Services fh_r_ctl values.
*/
FC_RCTL_BA_NOP = 0x80, /* basic link service NOP */
FC_RCTL_BA_ABTS = 0x81, /* basic link service abort */
FC_RCTL_BA_RMC = 0x82, /* remove connection */
FC_RCTL_BA_ACC = 0x84, /* basic accept */
FC_RCTL_BA_RJT = 0x85, /* basic reject */
FC_RCTL_BA_PRMT = 0x86, /* dedicated connection preempted */
/*
* Link Control Information.
*/
FC_RCTL_ACK_1 = 0xc0, /* acknowledge_1 */
FC_RCTL_ACK_0 = 0xc1, /* acknowledge_0 */
FC_RCTL_P_RJT = 0xc2, /* port reject */
FC_RCTL_F_RJT = 0xc3, /* fabric reject */
FC_RCTL_P_BSY = 0xc4, /* port busy */
FC_RCTL_F_BSY = 0xc5, /* fabric busy to data frame */
FC_RCTL_F_BSYL = 0xc6, /* fabric busy to link control frame */
FC_RCTL_LCR = 0xc7, /* link credit reset */
FC_RCTL_END = 0xc9, /* end */
};
/* incomplete list of definitions */
/*
* R_CTL names initializer.
* Please keep this matching the above definitions.
*/
#define FC_RCTL_NAMES_INIT { \
[FC_RCTL_DD_UNCAT] = "uncat", \
[FC_RCTL_DD_SOL_DATA] = "sol data", \
[FC_RCTL_DD_UNSOL_CTL] = "unsol ctl", \
[FC_RCTL_DD_SOL_CTL] = "sol ctl/reply", \
[FC_RCTL_DD_UNSOL_DATA] = "unsol data", \
[FC_RCTL_DD_DATA_DESC] = "data desc", \
[FC_RCTL_DD_UNSOL_CMD] = "unsol cmd", \
[FC_RCTL_DD_CMD_STATUS] = "cmd status", \
[FC_RCTL_ELS_REQ] = "ELS req", \
[FC_RCTL_ELS_REP] = "ELS rep", \
[FC_RCTL_ELS4_REQ] = "FC-4 ELS req", \
[FC_RCTL_ELS4_REP] = "FC-4 ELS rep", \
[FC_RCTL_BA_NOP] = "BLS NOP", \
[FC_RCTL_BA_ABTS] = "BLS abort", \
[FC_RCTL_BA_RMC] = "BLS remove connection", \
[FC_RCTL_BA_ACC] = "BLS accept", \
[FC_RCTL_BA_RJT] = "BLS reject", \
[FC_RCTL_BA_PRMT] = "BLS dedicated connection preempted", \
[FC_RCTL_ACK_1] = "LC ACK_1", \
[FC_RCTL_ACK_0] = "LC ACK_0", \
[FC_RCTL_P_RJT] = "LC port reject", \
[FC_RCTL_F_RJT] = "LC fabric reject", \
[FC_RCTL_P_BSY] = "LC port busy", \
[FC_RCTL_F_BSY] = "LC fabric busy to data frame", \
[FC_RCTL_F_BSYL] = "LC fabric busy to link control frame",\
[FC_RCTL_LCR] = "LC link credit reset", \
[FC_RCTL_END] = "LC end", \
}
/*
* Well-known fabric addresses.
*/
enum fc_well_known_fid {
FC_FID_NONE = 0x000000, /* No destination */
FC_FID_BCAST = 0xffffff, /* broadcast */
FC_FID_FLOGI = 0xfffffe, /* fabric login */
FC_FID_FCTRL = 0xfffffd, /* fabric controller */
FC_FID_DIR_SERV = 0xfffffc, /* directory server */
FC_FID_TIME_SERV = 0xfffffb, /* time server */
FC_FID_MGMT_SERV = 0xfffffa, /* management server */
FC_FID_QOS = 0xfffff9, /* QoS Facilitator */
FC_FID_ALIASES = 0xfffff8, /* alias server (FC-PH2) */
FC_FID_SEC_KEY = 0xfffff7, /* Security key dist. server */
FC_FID_CLOCK = 0xfffff6, /* clock synch server */
FC_FID_MCAST_SERV = 0xfffff5, /* multicast server */
};
#define FC_FID_WELL_KNOWN_MAX 0xffffff /* highest well-known fabric ID */
#define FC_FID_WELL_KNOWN_BASE 0xfffff5 /* start of well-known fabric ID */
/*
* Other well-known addresses, outside the above contiguous range.
*/
#define FC_FID_DOM_MGR 0xfffc00 /* domain manager base */
/*
* Fabric ID bytes.
*/
#define FC_FID_DOMAIN 0
#define FC_FID_PORT 1
#define FC_FID_LINK 2
/*
* fh_type codes
*/
enum fc_fh_type {
FC_TYPE_BLS = 0x00, /* basic link service */
FC_TYPE_ELS = 0x01, /* extended link service */
FC_TYPE_IP = 0x05, /* IP over FC, RFC 4338 */
FC_TYPE_FCP = 0x08, /* SCSI FCP */
FC_TYPE_CT = 0x20, /* Fibre Channel Services (FC-CT) */
FC_TYPE_ILS = 0x22, /* internal link service */
FC_TYPE_NVME = 0x28, /* FC-NVME */
};
/*
* FC_TYPE names initializer.
* Please keep this matching the above definitions.
*/
#define FC_TYPE_NAMES_INIT { \
[FC_TYPE_BLS] = "BLS", \
[FC_TYPE_ELS] = "ELS", \
[FC_TYPE_IP] = "IP", \
[FC_TYPE_FCP] = "FCP", \
[FC_TYPE_CT] = "CT", \
[FC_TYPE_ILS] = "ILS", \
[FC_TYPE_NVME] = "NVME", \
}
/*
* Exchange IDs.
*/
#define FC_XID_UNKNOWN 0xffff /* unknown exchange ID */
#define FC_XID_MIN 0x0 /* supported min exchange ID */
#define FC_XID_MAX 0xfffe /* supported max exchange ID */
/*
* fh_f_ctl - Frame control flags.
*/
#define FC_FC_EX_CTX (1 << 23) /* sent by responder to exchange */
#define FC_FC_SEQ_CTX (1 << 22) /* sent by responder to sequence */
#define FC_FC_FIRST_SEQ (1 << 21) /* first sequence of this exchange */
#define FC_FC_LAST_SEQ (1 << 20) /* last sequence of this exchange */
#define FC_FC_END_SEQ (1 << 19) /* last frame of sequence */
#define FC_FC_END_CONN (1 << 18) /* end of class 1 connection pending */
#define FC_FC_RES_B17 (1 << 17) /* reserved */
#define FC_FC_SEQ_INIT (1 << 16) /* transfer of sequence initiative */
#define FC_FC_X_ID_REASS (1 << 15) /* exchange ID has been changed */
#define FC_FC_X_ID_INVAL (1 << 14) /* exchange ID invalidated */
#define FC_FC_ACK_1 (1 << 12) /* 13:12 = 1: ACK_1 expected */
#define FC_FC_ACK_N (2 << 12) /* 13:12 = 2: ACK_N expected */
#define FC_FC_ACK_0 (3 << 12) /* 13:12 = 3: ACK_0 expected */
#define FC_FC_RES_B11 (1 << 11) /* reserved */
#define FC_FC_RES_B10 (1 << 10) /* reserved */
#define FC_FC_RETX_SEQ (1 << 9) /* retransmitted sequence */
#define FC_FC_UNI_TX (1 << 8) /* unidirectional transmit (class 1) */
#define FC_FC_CONT_SEQ(i) ((i) << 6)
#define FC_FC_ABT_SEQ(i) ((i) << 4)
#define FC_FC_REL_OFF (1 << 3) /* parameter is relative offset */
#define FC_FC_RES2 (1 << 2) /* reserved */
#define FC_FC_FILL(i) ((i) & 3) /* 1:0: bytes of trailing fill */
/*
* BA_ACC payload.
*/
struct fc_ba_acc {
__u8 ba_seq_id_val; /* SEQ_ID validity */
#define FC_BA_SEQ_ID_VAL 0x80
__u8 ba_seq_id; /* SEQ_ID of seq last deliverable */
__u8 ba_resvd[2]; /* reserved */
__be16 ba_ox_id; /* OX_ID for aborted seq or exch */
__be16 ba_rx_id; /* RX_ID for aborted seq or exch */
__be16 ba_low_seq_cnt; /* low SEQ_CNT of aborted seq */
__be16 ba_high_seq_cnt; /* high SEQ_CNT of aborted seq */
};
/*
* BA_RJT: Basic Reject payload.
*/
struct fc_ba_rjt {
__u8 br_resvd; /* reserved */
__u8 br_reason; /* reason code */
__u8 br_explan; /* reason explanation */
__u8 br_vendor; /* vendor unique code */
};
/*
* BA_RJT reason codes.
* From FS-2.
*/
enum fc_ba_rjt_reason {
FC_BA_RJT_NONE = 0, /* in software this means no reject */
FC_BA_RJT_INVL_CMD = 0x01, /* invalid command code */
FC_BA_RJT_LOG_ERR = 0x03, /* logical error */
FC_BA_RJT_LOG_BUSY = 0x05, /* logical busy */
FC_BA_RJT_PROTO_ERR = 0x07, /* protocol error */
FC_BA_RJT_UNABLE = 0x09, /* unable to perform request */
FC_BA_RJT_VENDOR = 0xff, /* vendor-specific (see br_vendor) */
};
/*
* BA_RJT reason code explanations.
*/
enum fc_ba_rjt_explan {
FC_BA_RJT_EXP_NONE = 0x00, /* no additional expanation */
FC_BA_RJT_INV_XID = 0x03, /* invalid OX_ID-RX_ID combination */
FC_BA_RJT_ABT = 0x05, /* sequence aborted, no seq info */
};
/*
* P_RJT or F_RJT: Port Reject or Fabric Reject parameter field.
*/
struct fc_pf_rjt {
__u8 rj_action; /* reserved */
__u8 rj_reason; /* reason code */
__u8 rj_resvd; /* reserved */
__u8 rj_vendor; /* vendor unique code */
};
/*
* P_RJT and F_RJT reject reason codes.
*/
enum fc_pf_rjt_reason {
FC_RJT_NONE = 0, /* non-reject (reserved by standard) */
FC_RJT_INVL_DID = 0x01, /* invalid destination ID */
FC_RJT_INVL_SID = 0x02, /* invalid source ID */
FC_RJT_P_UNAV_T = 0x03, /* port unavailable, temporary */
FC_RJT_P_UNAV = 0x04, /* port unavailable, permanent */
FC_RJT_CLS_UNSUP = 0x05, /* class not supported */
FC_RJT_DEL_USAGE = 0x06, /* delimiter usage error */
FC_RJT_TYPE_UNSUP = 0x07, /* type not supported */
FC_RJT_LINK_CTL = 0x08, /* invalid link control */
FC_RJT_R_CTL = 0x09, /* invalid R_CTL field */
FC_RJT_F_CTL = 0x0a, /* invalid F_CTL field */
FC_RJT_OX_ID = 0x0b, /* invalid originator exchange ID */
FC_RJT_RX_ID = 0x0c, /* invalid responder exchange ID */
FC_RJT_SEQ_ID = 0x0d, /* invalid sequence ID */
FC_RJT_DF_CTL = 0x0e, /* invalid DF_CTL field */
FC_RJT_SEQ_CNT = 0x0f, /* invalid SEQ_CNT field */
FC_RJT_PARAM = 0x10, /* invalid parameter field */
FC_RJT_EXCH_ERR = 0x11, /* exchange error */
FC_RJT_PROTO = 0x12, /* protocol error */
FC_RJT_LEN = 0x13, /* incorrect length */
FC_RJT_UNEXP_ACK = 0x14, /* unexpected ACK */
FC_RJT_FAB_CLASS = 0x15, /* class unsupported by fabric entity */
FC_RJT_LOGI_REQ = 0x16, /* login required */
FC_RJT_SEQ_XS = 0x17, /* excessive sequences attempted */
FC_RJT_EXCH_EST = 0x18, /* unable to establish exchange */
FC_RJT_FAB_UNAV = 0x1a, /* fabric unavailable */
FC_RJT_VC_ID = 0x1b, /* invalid VC_ID (class 4) */
FC_RJT_CS_CTL = 0x1c, /* invalid CS_CTL field */
FC_RJT_INSUF_RES = 0x1d, /* insuff. resources for VC (Class 4) */
FC_RJT_INVL_CLS = 0x1f, /* invalid class of service */
FC_RJT_PREEMT_RJT = 0x20, /* preemption request rejected */
FC_RJT_PREEMT_DIS = 0x21, /* preemption not enabled */
FC_RJT_MCAST_ERR = 0x22, /* multicast error */
FC_RJT_MCAST_ET = 0x23, /* multicast error terminate */
FC_RJT_PRLI_REQ = 0x24, /* process login required */
FC_RJT_INVL_ATT = 0x25, /* invalid attachment */
FC_RJT_VENDOR = 0xff, /* vendor specific reject */
};
/* default timeout values */
#define FC_DEF_E_D_TOV 2000UL
#define FC_DEF_R_A_TOV 10000UL
#endif /* _FC_FS_H_ */
fc/fc_gs.h 0000644 00000005517 14751150150 0006375 0 ustar 00 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
* Copyright(c) 2007 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Maintained at www.Open-FCoE.org
*/
#ifndef _FC_GS_H_
#define _FC_GS_H_
#include <linux/types.h>
/*
* Fibre Channel Services - Common Transport.
* From T11.org FC-GS-2 Rev 5.3 November 1998.
*/
struct fc_ct_hdr {
__u8 ct_rev; /* revision */
__u8 ct_in_id[3]; /* N_Port ID of original requestor */
__u8 ct_fs_type; /* type of fibre channel service */
__u8 ct_fs_subtype; /* subtype */
__u8 ct_options;
__u8 _ct_resvd1;
__be16 ct_cmd; /* command / response code */
__be16 ct_mr_size; /* maximum / residual size */
__u8 _ct_resvd2;
__u8 ct_reason; /* reject reason */
__u8 ct_explan; /* reason code explanation */
__u8 ct_vendor; /* vendor unique data */
};
#define FC_CT_HDR_LEN 16 /* expected sizeof (struct fc_ct_hdr) */
enum fc_ct_rev {
FC_CT_REV = 1 /* common transport revision */
};
/*
* ct_fs_type values.
*/
enum fc_ct_fs_type {
FC_FST_ALIAS = 0xf8, /* alias service */
FC_FST_MGMT = 0xfa, /* management service */
FC_FST_TIME = 0xfb, /* time service */
FC_FST_DIR = 0xfc, /* directory service */
};
/*
* ct_cmd: Command / response codes
*/
enum fc_ct_cmd {
FC_FS_RJT = 0x8001, /* reject */
FC_FS_ACC = 0x8002, /* accept */
};
/*
* FS_RJT reason codes.
*/
enum fc_ct_reason {
FC_FS_RJT_CMD = 0x01, /* invalid command code */
FC_FS_RJT_VER = 0x02, /* invalid version level */
FC_FS_RJT_LOG = 0x03, /* logical error */
FC_FS_RJT_IUSIZ = 0x04, /* invalid IU size */
FC_FS_RJT_BSY = 0x05, /* logical busy */
FC_FS_RJT_PROTO = 0x07, /* protocol error */
FC_FS_RJT_UNABL = 0x09, /* unable to perform command request */
FC_FS_RJT_UNSUP = 0x0b, /* command not supported */
};
/*
* FS_RJT reason code explanations.
*/
enum fc_ct_explan {
FC_FS_EXP_NONE = 0x00, /* no additional explanation */
FC_FS_EXP_PID = 0x01, /* port ID not registered */
FC_FS_EXP_PNAM = 0x02, /* port name not registered */
FC_FS_EXP_NNAM = 0x03, /* node name not registered */
FC_FS_EXP_COS = 0x04, /* class of service not registered */
FC_FS_EXP_FTNR = 0x07, /* FC-4 types not registered */
/* definitions not complete */
};
#endif /* _FC_GS_H_ */
fc/fc_ns.h 0000644 00000011565 14751150150 0006404 0 ustar 00 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
* Copyright(c) 2007 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Maintained at www.Open-FCoE.org
*/
#ifndef _FC_NS_H_
#define _FC_NS_H_
#include <linux/types.h>
/*
* Fibre Channel Services - Name Service (dNS)
* From T11.org FC-GS-2 Rev 5.3 November 1998.
*/
/*
* Common-transport sub-type for Name Server.
*/
#define FC_NS_SUBTYPE 2 /* fs_ct_hdr.ct_fs_subtype */
/*
* Name server Requests.
* Note: this is an incomplete list, some unused requests are omitted.
*/
enum fc_ns_req {
FC_NS_GA_NXT = 0x0100, /* get all next */
FC_NS_GI_A = 0x0101, /* get identifiers - scope */
FC_NS_GPN_ID = 0x0112, /* get port name by ID */
FC_NS_GNN_ID = 0x0113, /* get node name by ID */
FC_NS_GSPN_ID = 0x0118, /* get symbolic port name */
FC_NS_GID_PN = 0x0121, /* get ID for port name */
FC_NS_GID_NN = 0x0131, /* get IDs for node name */
FC_NS_GID_FT = 0x0171, /* get IDs by FC4 type */
FC_NS_GPN_FT = 0x0172, /* get port names by FC4 type */
FC_NS_GID_PT = 0x01a1, /* get IDs by port type */
FC_NS_RPN_ID = 0x0212, /* reg port name for ID */
FC_NS_RNN_ID = 0x0213, /* reg node name for ID */
FC_NS_RFT_ID = 0x0217, /* reg FC4 type for ID */
FC_NS_RSPN_ID = 0x0218, /* reg symbolic port name */
FC_NS_RFF_ID = 0x021f, /* reg FC4 Features for ID */
FC_NS_RSNN_NN = 0x0239, /* reg symbolic node name */
};
/*
* Port type values.
*/
enum fc_ns_pt {
FC_NS_UNID_PORT = 0x00, /* unidentified */
FC_NS_N_PORT = 0x01, /* N port */
FC_NS_NL_PORT = 0x02, /* NL port */
FC_NS_FNL_PORT = 0x03, /* F/NL port */
FC_NS_NX_PORT = 0x7f, /* Nx port */
FC_NS_F_PORT = 0x81, /* F port */
FC_NS_FL_PORT = 0x82, /* FL port */
FC_NS_E_PORT = 0x84, /* E port */
FC_NS_B_PORT = 0x85, /* B port */
};
/*
* Port type object.
*/
struct fc_ns_pt_obj {
__u8 pt_type;
};
/*
* Port ID object
*/
struct fc_ns_fid {
__u8 fp_flags; /* flags for responses only */
__u8 fp_fid[3];
};
/*
* fp_flags in port ID object, for responses only.
*/
#define FC_NS_FID_LAST 0x80 /* last object */
/*
* FC4-types object.
*/
#define FC_NS_TYPES 256 /* number of possible FC-4 types */
#define FC_NS_BPW 32 /* bits per word in bitmap */
struct fc_ns_fts {
__be32 ff_type_map[FC_NS_TYPES / FC_NS_BPW]; /* bitmap of FC-4 types */
};
/*
* FC4-features object.
*/
struct fc_ns_ff {
__be32 fd_feat[FC_NS_TYPES * 4 / FC_NS_BPW]; /* 4-bits per FC-type */
};
/*
* GID_PT request.
*/
struct fc_ns_gid_pt {
__u8 fn_pt_type;
__u8 fn_domain_id_scope;
__u8 fn_area_id_scope;
__u8 fn_resvd;
};
/*
* GID_FT or GPN_FT request.
*/
struct fc_ns_gid_ft {
__u8 fn_resvd;
__u8 fn_domain_id_scope;
__u8 fn_area_id_scope;
__u8 fn_fc4_type;
};
/*
* GPN_FT response.
*/
struct fc_gpn_ft_resp {
__u8 fp_flags; /* see fp_flags definitions above */
__u8 fp_fid[3]; /* port ID */
__be32 fp_resvd;
__be64 fp_wwpn; /* port name */
};
/*
* GID_PN request
*/
struct fc_ns_gid_pn {
__be64 fn_wwpn; /* port name */
};
/*
* GID_PN response or GSPN_ID request
*/
struct fc_gid_pn_resp {
__u8 fp_resvd;
__u8 fp_fid[3]; /* port ID */
};
/*
* GSPN_ID response
*/
struct fc_gspn_resp {
__u8 fp_name_len;
char fp_name[];
};
/*
* RFT_ID request - register FC-4 types for ID.
*/
struct fc_ns_rft_id {
struct fc_ns_fid fr_fid; /* port ID object */
struct fc_ns_fts fr_fts; /* FC-4 types object */
};
/*
* RPN_ID request - register port name for ID.
* RNN_ID request - register node name for ID.
*/
struct fc_ns_rn_id {
struct fc_ns_fid fr_fid; /* port ID object */
__be64 fr_wwn; /* node name or port name */
} __attribute__((__packed__));
/*
* RSNN_NN request - register symbolic node name
*/
struct fc_ns_rsnn {
__be64 fr_wwn; /* node name */
__u8 fr_name_len;
char fr_name[];
} __attribute__((__packed__));
/*
* RSPN_ID request - register symbolic port name
*/
struct fc_ns_rspn {
struct fc_ns_fid fr_fid; /* port ID object */
__u8 fr_name_len;
char fr_name[];
} __attribute__((__packed__));
/*
* RFF_ID request - register FC-4 Features for ID.
*/
struct fc_ns_rff_id {
struct fc_ns_fid fr_fid; /* port ID object */
__u8 fr_resvd[2];
__u8 fr_feat; /* FC-4 Feature bits */
__u8 fr_type; /* FC-4 type */
} __attribute__((__packed__));
#endif /* _FC_NS_H_ */
fc/fc_els.h 0000644 00000115256 14751150150 0006551 0 ustar 00 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
* Copyright(c) 2007 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Maintained at www.Open-FCoE.org
*/
#ifndef _FC_ELS_H_
#define _FC_ELS_H_
#include <linux/types.h>
#include <asm/byteorder.h>
/*
* Fibre Channel Switch - Enhanced Link Services definitions.
* From T11 FC-LS Rev 1.2 June 7, 2005.
*/
/*
* ELS Command codes - byte 0 of the frame payload
*/
enum fc_els_cmd {
ELS_LS_RJT = 0x01, /* ESL reject */
ELS_LS_ACC = 0x02, /* ESL Accept */
ELS_PLOGI = 0x03, /* N_Port login */
ELS_FLOGI = 0x04, /* F_Port login */
ELS_LOGO = 0x05, /* Logout */
ELS_ABTX = 0x06, /* Abort exchange - obsolete */
ELS_RCS = 0x07, /* read connection status */
ELS_RES = 0x08, /* read exchange status block */
ELS_RSS = 0x09, /* read sequence status block */
ELS_RSI = 0x0a, /* read sequence initiative */
ELS_ESTS = 0x0b, /* establish streaming */
ELS_ESTC = 0x0c, /* estimate credit */
ELS_ADVC = 0x0d, /* advise credit */
ELS_RTV = 0x0e, /* read timeout value */
ELS_RLS = 0x0f, /* read link error status block */
ELS_ECHO = 0x10, /* echo */
ELS_TEST = 0x11, /* test */
ELS_RRQ = 0x12, /* reinstate recovery qualifier */
ELS_REC = 0x13, /* read exchange concise */
ELS_SRR = 0x14, /* sequence retransmission request */
ELS_FPIN = 0x16, /* Fabric Performance Impact Notification */
ELS_EDC = 0x17, /* Exchange Diagnostic Capabilities */
ELS_RDP = 0x18, /* Read Diagnostic Parameters */
ELS_RDF = 0x19, /* Register Diagnostic Functions */
ELS_PRLI = 0x20, /* process login */
ELS_PRLO = 0x21, /* process logout */
ELS_SCN = 0x22, /* state change notification */
ELS_TPLS = 0x23, /* test process login state */
ELS_TPRLO = 0x24, /* third party process logout */
ELS_LCLM = 0x25, /* login control list mgmt (obs) */
ELS_GAID = 0x30, /* get alias_ID */
ELS_FACT = 0x31, /* fabric activate alias_id */
ELS_FDACDT = 0x32, /* fabric deactivate alias_id */
ELS_NACT = 0x33, /* N-port activate alias_id */
ELS_NDACT = 0x34, /* N-port deactivate alias_id */
ELS_QOSR = 0x40, /* quality of service request */
ELS_RVCS = 0x41, /* read virtual circuit status */
ELS_PDISC = 0x50, /* discover N_port service params */
ELS_FDISC = 0x51, /* discover F_port service params */
ELS_ADISC = 0x52, /* discover address */
ELS_RNC = 0x53, /* report node cap (obs) */
ELS_FARP_REQ = 0x54, /* FC ARP request */
ELS_FARP_REPL = 0x55, /* FC ARP reply */
ELS_RPS = 0x56, /* read port status block */
ELS_RPL = 0x57, /* read port list */
ELS_RPBC = 0x58, /* read port buffer condition */
ELS_FAN = 0x60, /* fabric address notification */
ELS_RSCN = 0x61, /* registered state change notification */
ELS_SCR = 0x62, /* state change registration */
ELS_RNFT = 0x63, /* report node FC-4 types */
ELS_CSR = 0x68, /* clock synch. request */
ELS_CSU = 0x69, /* clock synch. update */
ELS_LINIT = 0x70, /* loop initialize */
ELS_LSTS = 0x72, /* loop status */
ELS_RNID = 0x78, /* request node ID data */
ELS_RLIR = 0x79, /* registered link incident report */
ELS_LIRR = 0x7a, /* link incident record registration */
ELS_SRL = 0x7b, /* scan remote loop */
ELS_SBRP = 0x7c, /* set bit-error reporting params */
ELS_RPSC = 0x7d, /* report speed capabilities */
ELS_QSA = 0x7e, /* query security attributes */
ELS_EVFP = 0x7f, /* exchange virt. fabrics params */
ELS_LKA = 0x80, /* link keep-alive */
ELS_AUTH_ELS = 0x90, /* authentication ELS */
};
/*
* Initializer useful for decoding table.
* Please keep this in sync with the above definitions.
*/
#define FC_ELS_CMDS_INIT { \
[ELS_LS_RJT] = "LS_RJT", \
[ELS_LS_ACC] = "LS_ACC", \
[ELS_PLOGI] = "PLOGI", \
[ELS_FLOGI] = "FLOGI", \
[ELS_LOGO] = "LOGO", \
[ELS_ABTX] = "ABTX", \
[ELS_RCS] = "RCS", \
[ELS_RES] = "RES", \
[ELS_RSS] = "RSS", \
[ELS_RSI] = "RSI", \
[ELS_ESTS] = "ESTS", \
[ELS_ESTC] = "ESTC", \
[ELS_ADVC] = "ADVC", \
[ELS_RTV] = "RTV", \
[ELS_RLS] = "RLS", \
[ELS_ECHO] = "ECHO", \
[ELS_TEST] = "TEST", \
[ELS_RRQ] = "RRQ", \
[ELS_REC] = "REC", \
[ELS_SRR] = "SRR", \
[ELS_FPIN] = "FPIN", \
[ELS_EDC] = "EDC", \
[ELS_RDP] = "RDP", \
[ELS_RDF] = "RDF", \
[ELS_PRLI] = "PRLI", \
[ELS_PRLO] = "PRLO", \
[ELS_SCN] = "SCN", \
[ELS_TPLS] = "TPLS", \
[ELS_TPRLO] = "TPRLO", \
[ELS_LCLM] = "LCLM", \
[ELS_GAID] = "GAID", \
[ELS_FACT] = "FACT", \
[ELS_FDACDT] = "FDACDT", \
[ELS_NACT] = "NACT", \
[ELS_NDACT] = "NDACT", \
[ELS_QOSR] = "QOSR", \
[ELS_RVCS] = "RVCS", \
[ELS_PDISC] = "PDISC", \
[ELS_FDISC] = "FDISC", \
[ELS_ADISC] = "ADISC", \
[ELS_RNC] = "RNC", \
[ELS_FARP_REQ] = "FARP_REQ", \
[ELS_FARP_REPL] = "FARP_REPL", \
[ELS_RPS] = "RPS", \
[ELS_RPL] = "RPL", \
[ELS_RPBC] = "RPBC", \
[ELS_FAN] = "FAN", \
[ELS_RSCN] = "RSCN", \
[ELS_SCR] = "SCR", \
[ELS_RNFT] = "RNFT", \
[ELS_CSR] = "CSR", \
[ELS_CSU] = "CSU", \
[ELS_LINIT] = "LINIT", \
[ELS_LSTS] = "LSTS", \
[ELS_RNID] = "RNID", \
[ELS_RLIR] = "RLIR", \
[ELS_LIRR] = "LIRR", \
[ELS_SRL] = "SRL", \
[ELS_SBRP] = "SBRP", \
[ELS_RPSC] = "RPSC", \
[ELS_QSA] = "QSA", \
[ELS_EVFP] = "EVFP", \
[ELS_LKA] = "LKA", \
[ELS_AUTH_ELS] = "AUTH_ELS", \
}
/*
* LS_ACC payload.
*/
struct fc_els_ls_acc {
__u8 la_cmd; /* command code ELS_LS_ACC */
__u8 la_resv[3]; /* reserved */
};
/*
* ELS reject payload.
*/
struct fc_els_ls_rjt {
__u8 er_cmd; /* command code ELS_LS_RJT */
__u8 er_resv[4]; /* reserved must be zero */
__u8 er_reason; /* reason (enum fc_els_rjt_reason below) */
__u8 er_explan; /* explanation (enum fc_els_rjt_explan below) */
__u8 er_vendor; /* vendor specific code */
};
/*
* ELS reject reason codes (er_reason).
*/
enum fc_els_rjt_reason {
ELS_RJT_NONE = 0, /* no reject - not to be sent */
ELS_RJT_INVAL = 0x01, /* invalid ELS command code */
ELS_RJT_LOGIC = 0x03, /* logical error */
ELS_RJT_BUSY = 0x05, /* logical busy */
ELS_RJT_PROT = 0x07, /* protocol error */
ELS_RJT_UNAB = 0x09, /* unable to perform command request */
ELS_RJT_UNSUP = 0x0b, /* command not supported */
ELS_RJT_INPROG = 0x0e, /* command already in progress */
ELS_RJT_FIP = 0x20, /* FIP error */
ELS_RJT_VENDOR = 0xff, /* vendor specific error */
};
/*
* reason code explanation (er_explan).
*/
enum fc_els_rjt_explan {
ELS_EXPL_NONE = 0x00, /* No additional explanation */
ELS_EXPL_SPP_OPT_ERR = 0x01, /* service parameter error - options */
ELS_EXPL_SPP_ICTL_ERR = 0x03, /* service parm error - initiator ctl */
ELS_EXPL_AH = 0x11, /* invalid association header */
ELS_EXPL_AH_REQ = 0x13, /* association_header required */
ELS_EXPL_SID = 0x15, /* invalid originator S_ID */
ELS_EXPL_OXID_RXID = 0x17, /* invalid OX_ID-RX_ID combination */
ELS_EXPL_INPROG = 0x19, /* Request already in progress */
ELS_EXPL_PLOGI_REQD = 0x1e, /* N_Port login required */
ELS_EXPL_INSUF_RES = 0x29, /* insufficient resources */
ELS_EXPL_UNAB_DATA = 0x2a, /* unable to supply requested data */
ELS_EXPL_UNSUPR = 0x2c, /* Request not supported */
ELS_EXPL_INV_LEN = 0x2d, /* Invalid payload length */
ELS_EXPL_NOT_NEIGHBOR = 0x62, /* VN2VN_Port not in neighbor set */
/* TBD - above definitions incomplete */
};
/*
* Link Service TLV Descriptor Tag Values
*/
enum fc_ls_tlv_dtag {
ELS_DTAG_LS_REQ_INFO = 0x00000001,
/* Link Service Request Information Descriptor */
ELS_DTAG_LNK_FAULT_CAP = 0x0001000D,
/* Link Fault Capability Descriptor */
ELS_DTAG_CG_SIGNAL_CAP = 0x0001000F,
/* Congestion Signaling Capability Descriptor */
ELS_DTAG_LNK_INTEGRITY = 0x00020001,
/* Link Integrity Notification Descriptor */
ELS_DTAG_DELIVERY = 0x00020002,
/* Delivery Notification Descriptor */
ELS_DTAG_PEER_CONGEST = 0x00020003,
/* Peer Congestion Notification Descriptor */
ELS_DTAG_CONGESTION = 0x00020004,
/* Congestion Notification Descriptor */
ELS_DTAG_FPIN_REGISTER = 0x00030001,
/* FPIN Registration Descriptor */
};
/*
* Initializer useful for decoding table.
* Please keep this in sync with the above definitions.
*/
#define FC_LS_TLV_DTAG_INIT { \
{ ELS_DTAG_LS_REQ_INFO, "Link Service Request Information" }, \
{ ELS_DTAG_LNK_FAULT_CAP, "Link Fault Capability" }, \
{ ELS_DTAG_CG_SIGNAL_CAP, "Congestion Signaling Capability" }, \
{ ELS_DTAG_LNK_INTEGRITY, "Link Integrity Notification" }, \
{ ELS_DTAG_DELIVERY, "Delivery Notification Present" }, \
{ ELS_DTAG_PEER_CONGEST, "Peer Congestion Notification" }, \
{ ELS_DTAG_CONGESTION, "Congestion Notification" }, \
{ ELS_DTAG_FPIN_REGISTER, "FPIN Registration" }, \
}
/*
* Generic Link Service TLV Descriptor format
*
* This structure, as it defines no payload, will also be referred to
* as the "tlv header" - which contains the tag and len fields.
*/
struct fc_tlv_desc {
__be32 desc_tag; /* Notification Descriptor Tag */
__be32 desc_len; /* Length of Descriptor (in bytes).
* Size of descriptor excluding
* desc_tag and desc_len fields.
*/
__u8 desc_value[0]; /* Descriptor Value */
};
/* Descriptor tag and len fields are considered the mandatory header
* for a descriptor
*/
#define FC_TLV_DESC_HDR_SZ sizeof(struct fc_tlv_desc)
/*
* Macro, used when initializing payloads, to return the descriptor length.
* Length is size of descriptor minus the tag and len fields.
*/
#define FC_TLV_DESC_LENGTH_FROM_SZ(desc) \
(sizeof(desc) - FC_TLV_DESC_HDR_SZ)
/* Macro, used on received payloads, to return the descriptor length */
#define FC_TLV_DESC_SZ_FROM_LENGTH(tlv) \
(__be32_to_cpu((tlv)->desc_len) + FC_TLV_DESC_HDR_SZ)
/*
* This helper is used to walk descriptors in a descriptor list.
* Given the address of the current descriptor, which minimally contains a
* tag and len field, calculate the address of the next descriptor based
* on the len field.
*/
static __inline__ void *fc_tlv_next_desc(void *desc)
{
struct fc_tlv_desc *tlv = desc;
return (desc + FC_TLV_DESC_SZ_FROM_LENGTH(tlv));
}
/*
* Link Service Request Information Descriptor
*/
struct fc_els_lsri_desc {
__be32 desc_tag; /* descriptor tag (0x0000 0001) */
__be32 desc_len; /* Length of Descriptor (in bytes) (4).
* Size of descriptor excluding
* desc_tag and desc_len fields.
*/
struct {
__u8 cmd; /* ELS cmd byte */
__u8 bytes[3]; /* bytes 1..3 */
} rqst_w0; /* Request word 0 */
};
/*
* Common service parameters (N ports).
*/
struct fc_els_csp {
__u8 sp_hi_ver; /* highest version supported (obs.) */
__u8 sp_lo_ver; /* highest version supported (obs.) */
__be16 sp_bb_cred; /* buffer-to-buffer credits */
__be16 sp_features; /* common feature flags */
__be16 sp_bb_data; /* b-b state number and data field sz */
union {
struct {
__be16 _sp_tot_seq; /* total concurrent sequences */
__be16 _sp_rel_off; /* rel. offset by info cat */
} sp_plogi;
struct {
__be32 _sp_r_a_tov; /* resource alloc. timeout msec */
} sp_flogi_acc;
} sp_u;
__be32 sp_e_d_tov; /* error detect timeout value */
};
#define sp_tot_seq sp_u.sp_plogi._sp_tot_seq
#define sp_rel_off sp_u.sp_plogi._sp_rel_off
#define sp_r_a_tov sp_u.sp_flogi_acc._sp_r_a_tov
#define FC_SP_BB_DATA_MASK 0xfff /* mask for data field size in sp_bb_data */
/*
* Minimum and maximum values for max data field size in service parameters.
*/
#define FC_SP_MIN_MAX_PAYLOAD FC_MIN_MAX_PAYLOAD
#define FC_SP_MAX_MAX_PAYLOAD FC_MAX_PAYLOAD
/*
* sp_features
*/
#define FC_SP_FT_NPIV 0x8000 /* multiple N_Port_ID support (FLOGI) */
#define FC_SP_FT_CIRO 0x8000 /* continuously increasing rel off (PLOGI) */
#define FC_SP_FT_CLAD 0x8000 /* clean address (in FLOGI LS_ACC) */
#define FC_SP_FT_RAND 0x4000 /* random relative offset */
#define FC_SP_FT_VAL 0x2000 /* valid vendor version level */
#define FC_SP_FT_NPIV_ACC 0x2000 /* NPIV assignment (FLOGI LS_ACC) */
#define FC_SP_FT_FPORT 0x1000 /* F port (1) vs. N port (0) */
#define FC_SP_FT_ABB 0x0800 /* alternate BB_credit management */
#define FC_SP_FT_EDTR 0x0400 /* E_D_TOV Resolution is nanoseconds */
#define FC_SP_FT_MCAST 0x0200 /* multicast */
#define FC_SP_FT_BCAST 0x0100 /* broadcast */
#define FC_SP_FT_HUNT 0x0080 /* hunt group */
#define FC_SP_FT_SIMP 0x0040 /* dedicated simplex */
#define FC_SP_FT_SEC 0x0020 /* reserved for security */
#define FC_SP_FT_CSYN 0x0010 /* clock synch. supported */
#define FC_SP_FT_RTTOV 0x0008 /* R_T_TOV value 100 uS, else 100 mS */
#define FC_SP_FT_HALF 0x0004 /* dynamic half duplex */
#define FC_SP_FT_SEQC 0x0002 /* SEQ_CNT */
#define FC_SP_FT_PAYL 0x0001 /* FLOGI payload length 256, else 116 */
/*
* Class-specific service parameters.
*/
struct fc_els_cssp {
__be16 cp_class; /* class flags */
__be16 cp_init; /* initiator flags */
__be16 cp_recip; /* recipient flags */
__be16 cp_rdfs; /* receive data field size */
__be16 cp_con_seq; /* concurrent sequences */
__be16 cp_ee_cred; /* N-port end-to-end credit */
__u8 cp_resv1; /* reserved */
__u8 cp_open_seq; /* open sequences per exchange */
__u8 _cp_resv2[2]; /* reserved */
};
/*
* cp_class flags.
*/
#define FC_CPC_VALID 0x8000 /* class valid */
#define FC_CPC_IMIX 0x4000 /* intermix mode */
#define FC_CPC_SEQ 0x0800 /* sequential delivery */
#define FC_CPC_CAMP 0x0200 /* camp-on */
#define FC_CPC_PRI 0x0080 /* priority */
/*
* cp_init flags.
* (TBD: not all flags defined here).
*/
#define FC_CPI_CSYN 0x0010 /* clock synch. capable */
/*
* cp_recip flags.
*/
#define FC_CPR_CSYN 0x0008 /* clock synch. capable */
/*
* NFC_ELS_FLOGI: Fabric login request.
* NFC_ELS_PLOGI: Port login request (same format).
*/
struct fc_els_flogi {
__u8 fl_cmd; /* command */
__u8 _fl_resvd[3]; /* must be zero */
struct fc_els_csp fl_csp; /* common service parameters */
__be64 fl_wwpn; /* port name */
__be64 fl_wwnn; /* node name */
struct fc_els_cssp fl_cssp[4]; /* class 1-4 service parameters */
__u8 fl_vend[16]; /* vendor version level */
} __attribute__((__packed__));
/*
* Process login service parameter page.
*/
struct fc_els_spp {
__u8 spp_type; /* type code or common service params */
__u8 spp_type_ext; /* type code extension */
__u8 spp_flags;
__u8 _spp_resvd;
__be32 spp_orig_pa; /* originator process associator */
__be32 spp_resp_pa; /* responder process associator */
__be32 spp_params; /* service parameters */
};
/*
* spp_flags.
*/
#define FC_SPP_OPA_VAL 0x80 /* originator proc. assoc. valid */
#define FC_SPP_RPA_VAL 0x40 /* responder proc. assoc. valid */
#define FC_SPP_EST_IMG_PAIR 0x20 /* establish image pair */
#define FC_SPP_RESP_MASK 0x0f /* mask for response code (below) */
/*
* SPP response code in spp_flags - lower 4 bits.
*/
enum fc_els_spp_resp {
FC_SPP_RESP_ACK = 1, /* request executed */
FC_SPP_RESP_RES = 2, /* unable due to lack of resources */
FC_SPP_RESP_INIT = 3, /* initialization not complete */
FC_SPP_RESP_NO_PA = 4, /* unknown process associator */
FC_SPP_RESP_CONF = 5, /* configuration precludes image pair */
FC_SPP_RESP_COND = 6, /* request completed conditionally */
FC_SPP_RESP_MULT = 7, /* unable to handle multiple SPPs */
FC_SPP_RESP_INVL = 8, /* SPP is invalid */
};
/*
* ELS_RRQ - Reinstate Recovery Qualifier
*/
struct fc_els_rrq {
__u8 rrq_cmd; /* command (0x12) */
__u8 rrq_zero[3]; /* specified as zero - part of cmd */
__u8 rrq_resvd; /* reserved */
__u8 rrq_s_id[3]; /* originator FID */
__be16 rrq_ox_id; /* originator exchange ID */
__be16 rrq_rx_id; /* responders exchange ID */
};
/*
* ELS_REC - Read exchange concise.
*/
struct fc_els_rec {
__u8 rec_cmd; /* command (0x13) */
__u8 rec_zero[3]; /* specified as zero - part of cmd */
__u8 rec_resvd; /* reserved */
__u8 rec_s_id[3]; /* originator FID */
__be16 rec_ox_id; /* originator exchange ID */
__be16 rec_rx_id; /* responders exchange ID */
};
/*
* ELS_REC LS_ACC payload.
*/
struct fc_els_rec_acc {
__u8 reca_cmd; /* accept (0x02) */
__u8 reca_zero[3]; /* specified as zero - part of cmd */
__be16 reca_ox_id; /* originator exchange ID */
__be16 reca_rx_id; /* responders exchange ID */
__u8 reca_resvd1; /* reserved */
__u8 reca_ofid[3]; /* originator FID */
__u8 reca_resvd2; /* reserved */
__u8 reca_rfid[3]; /* responder FID */
__be32 reca_fc4value; /* FC4 value */
__be32 reca_e_stat; /* ESB (exchange status block) status */
};
/*
* ELS_PRLI - Process login request and response.
*/
struct fc_els_prli {
__u8 prli_cmd; /* command */
__u8 prli_spp_len; /* length of each serv. parm. page */
__be16 prli_len; /* length of entire payload */
/* service parameter pages follow */
};
/*
* ELS_PRLO - Process logout request and response.
*/
struct fc_els_prlo {
__u8 prlo_cmd; /* command */
__u8 prlo_obs; /* obsolete, but shall be set to 10h */
__be16 prlo_len; /* payload length */
};
/*
* ELS_ADISC payload
*/
struct fc_els_adisc {
__u8 adisc_cmd;
__u8 adisc_resv[3];
__u8 adisc_resv1;
__u8 adisc_hard_addr[3];
__be64 adisc_wwpn;
__be64 adisc_wwnn;
__u8 adisc_resv2;
__u8 adisc_port_id[3];
} __attribute__((__packed__));
/*
* ELS_LOGO - process or fabric logout.
*/
struct fc_els_logo {
__u8 fl_cmd; /* command code */
__u8 fl_zero[3]; /* specified as zero - part of cmd */
__u8 fl_resvd; /* reserved */
__u8 fl_n_port_id[3];/* N port ID */
__be64 fl_n_port_wwn; /* port name */
};
/*
* ELS_RTV - read timeout value.
*/
struct fc_els_rtv {
__u8 rtv_cmd; /* command code 0x0e */
__u8 rtv_zero[3]; /* specified as zero - part of cmd */
};
/*
* LS_ACC for ELS_RTV - read timeout value.
*/
struct fc_els_rtv_acc {
__u8 rtv_cmd; /* command code 0x02 */
__u8 rtv_zero[3]; /* specified as zero - part of cmd */
__be32 rtv_r_a_tov; /* resource allocation timeout value */
__be32 rtv_e_d_tov; /* error detection timeout value */
__be32 rtv_toq; /* timeout qualifier (see below) */
};
/*
* rtv_toq bits.
*/
#define FC_ELS_RTV_EDRES (1 << 26) /* E_D_TOV resolution is nS else mS */
#define FC_ELS_RTV_RTTOV (1 << 19) /* R_T_TOV is 100 uS else 100 mS */
/*
* ELS_SCR - state change registration payload.
*/
struct fc_els_scr {
__u8 scr_cmd; /* command code */
__u8 scr_resv[6]; /* reserved */
__u8 scr_reg_func; /* registration function (see below) */
};
enum fc_els_scr_func {
ELS_SCRF_FAB = 1, /* fabric-detected registration */
ELS_SCRF_NPORT = 2, /* Nx_Port-detected registration */
ELS_SCRF_FULL = 3, /* full registration */
ELS_SCRF_CLEAR = 255, /* remove any current registrations */
};
/*
* ELS_RSCN - registered state change notification payload.
*/
struct fc_els_rscn {
__u8 rscn_cmd; /* RSCN opcode (0x61) */
__u8 rscn_page_len; /* page length (4) */
__be16 rscn_plen; /* payload length including this word */
/* followed by 4-byte generic affected Port_ID pages */
};
struct fc_els_rscn_page {
__u8 rscn_page_flags; /* event and address format */
__u8 rscn_fid[3]; /* fabric ID */
};
#define ELS_RSCN_EV_QUAL_BIT 2 /* shift count for event qualifier */
#define ELS_RSCN_EV_QUAL_MASK 0xf /* mask for event qualifier */
#define ELS_RSCN_ADDR_FMT_BIT 0 /* shift count for address format */
#define ELS_RSCN_ADDR_FMT_MASK 0x3 /* mask for address format */
enum fc_els_rscn_ev_qual {
ELS_EV_QUAL_NONE = 0, /* unspecified */
ELS_EV_QUAL_NS_OBJ = 1, /* changed name server object */
ELS_EV_QUAL_PORT_ATTR = 2, /* changed port attribute */
ELS_EV_QUAL_SERV_OBJ = 3, /* changed service object */
ELS_EV_QUAL_SW_CONFIG = 4, /* changed switch configuration */
ELS_EV_QUAL_REM_OBJ = 5, /* removed object */
};
enum fc_els_rscn_addr_fmt {
ELS_ADDR_FMT_PORT = 0, /* rscn_fid is a port address */
ELS_ADDR_FMT_AREA = 1, /* rscn_fid is a area address */
ELS_ADDR_FMT_DOM = 2, /* rscn_fid is a domain address */
ELS_ADDR_FMT_FAB = 3, /* anything on fabric may have changed */
};
/*
* ELS_RNID - request Node ID.
*/
struct fc_els_rnid {
__u8 rnid_cmd; /* RNID opcode (0x78) */
__u8 rnid_resv[3]; /* reserved */
__u8 rnid_fmt; /* data format */
__u8 rnid_resv2[3]; /* reserved */
};
/*
* Node Identification Data formats (rnid_fmt)
*/
enum fc_els_rnid_fmt {
ELS_RNIDF_NONE = 0, /* no specific identification data */
ELS_RNIDF_GEN = 0xdf, /* general topology discovery format */
};
/*
* ELS_RNID response.
*/
struct fc_els_rnid_resp {
__u8 rnid_cmd; /* response code (LS_ACC) */
__u8 rnid_resv[3]; /* reserved */
__u8 rnid_fmt; /* data format */
__u8 rnid_cid_len; /* common ID data length */
__u8 rnid_resv2; /* reserved */
__u8 rnid_sid_len; /* specific ID data length */
};
struct fc_els_rnid_cid {
__be64 rnid_wwpn; /* N port name */
__be64 rnid_wwnn; /* node name */
};
struct fc_els_rnid_gen {
__u8 rnid_vend_id[16]; /* vendor-unique ID */
__be32 rnid_atype; /* associated type (see below) */
__be32 rnid_phys_port; /* physical port number */
__be32 rnid_att_nodes; /* number of attached nodes */
__u8 rnid_node_mgmt; /* node management (see below) */
__u8 rnid_ip_ver; /* IP version (see below) */
__be16 rnid_prot_port; /* UDP / TCP port number */
__be32 rnid_ip_addr[4]; /* IP address */
__u8 rnid_resvd[2]; /* reserved */
__be16 rnid_vend_spec; /* vendor-specific field */
};
enum fc_els_rnid_atype {
ELS_RNIDA_UNK = 0x01, /* unknown */
ELS_RNIDA_OTHER = 0x02, /* none of the following */
ELS_RNIDA_HUB = 0x03,
ELS_RNIDA_SWITCH = 0x04,
ELS_RNIDA_GATEWAY = 0x05,
ELS_RNIDA_CONV = 0x06, /* Obsolete, do not use this value */
ELS_RNIDA_HBA = 0x07, /* Obsolete, do not use this value */
ELS_RNIDA_PROXY = 0x08, /* Obsolete, do not use this value */
ELS_RNIDA_STORAGE = 0x09,
ELS_RNIDA_HOST = 0x0a,
ELS_RNIDA_SUBSYS = 0x0b, /* storage subsystem (e.g., RAID) */
ELS_RNIDA_ACCESS = 0x0e, /* access device (e.g. media changer) */
ELS_RNIDA_NAS = 0x11, /* NAS server */
ELS_RNIDA_BRIDGE = 0x12, /* bridge */
ELS_RNIDA_VIRT = 0x13, /* virtualization device */
ELS_RNIDA_MF = 0xff, /* multifunction device (bits below) */
ELS_RNIDA_MF_HUB = 1UL << 31, /* hub */
ELS_RNIDA_MF_SW = 1UL << 30, /* switch */
ELS_RNIDA_MF_GW = 1UL << 29, /* gateway */
ELS_RNIDA_MF_ST = 1UL << 28, /* storage */
ELS_RNIDA_MF_HOST = 1UL << 27, /* host */
ELS_RNIDA_MF_SUB = 1UL << 26, /* storage subsystem */
ELS_RNIDA_MF_ACC = 1UL << 25, /* storage access dev */
ELS_RNIDA_MF_WDM = 1UL << 24, /* wavelength division mux */
ELS_RNIDA_MF_NAS = 1UL << 23, /* NAS server */
ELS_RNIDA_MF_BR = 1UL << 22, /* bridge */
ELS_RNIDA_MF_VIRT = 1UL << 21, /* virtualization device */
};
enum fc_els_rnid_mgmt {
ELS_RNIDM_SNMP = 0,
ELS_RNIDM_TELNET = 1,
ELS_RNIDM_HTTP = 2,
ELS_RNIDM_HTTPS = 3,
ELS_RNIDM_XML = 4, /* HTTP + XML */
};
enum fc_els_rnid_ipver {
ELS_RNIDIP_NONE = 0, /* no IP support or node mgmt. */
ELS_RNIDIP_V4 = 1, /* IPv4 */
ELS_RNIDIP_V6 = 2, /* IPv6 */
};
/*
* ELS RPL - Read Port List.
*/
struct fc_els_rpl {
__u8 rpl_cmd; /* command */
__u8 rpl_resv[5]; /* reserved - must be zero */
__be16 rpl_max_size; /* maximum response size or zero */
__u8 rpl_resv1; /* reserved - must be zero */
__u8 rpl_index[3]; /* starting index */
};
/*
* Port number block in RPL response.
*/
struct fc_els_pnb {
__be32 pnb_phys_pn; /* physical port number */
__u8 pnb_resv; /* reserved */
__u8 pnb_port_id[3]; /* port ID */
__be64 pnb_wwpn; /* port name */
};
/*
* RPL LS_ACC response.
*/
struct fc_els_rpl_resp {
__u8 rpl_cmd; /* ELS_LS_ACC */
__u8 rpl_resv1; /* reserved - must be zero */
__be16 rpl_plen; /* payload length */
__u8 rpl_resv2; /* reserved - must be zero */
__u8 rpl_llen[3]; /* list length */
__u8 rpl_resv3; /* reserved - must be zero */
__u8 rpl_index[3]; /* starting index */
struct fc_els_pnb rpl_pnb[1]; /* variable number of PNBs */
};
/*
* Link Error Status Block.
*/
struct fc_els_lesb {
__be32 lesb_link_fail; /* link failure count */
__be32 lesb_sync_loss; /* loss of synchronization count */
__be32 lesb_sig_loss; /* loss of signal count */
__be32 lesb_prim_err; /* primitive sequence error count */
__be32 lesb_inv_word; /* invalid transmission word count */
__be32 lesb_inv_crc; /* invalid CRC count */
};
/*
* ELS RPS - Read Port Status Block request.
*/
struct fc_els_rps {
__u8 rps_cmd; /* command */
__u8 rps_resv[2]; /* reserved - must be zero */
__u8 rps_flag; /* flag - see below */
__be64 rps_port_spec; /* port selection */
};
enum fc_els_rps_flag {
FC_ELS_RPS_DID = 0x00, /* port identified by D_ID of req. */
FC_ELS_RPS_PPN = 0x01, /* port_spec is physical port number */
FC_ELS_RPS_WWPN = 0x02, /* port_spec is port WWN */
};
/*
* ELS RPS LS_ACC response.
*/
struct fc_els_rps_resp {
__u8 rps_cmd; /* command - LS_ACC */
__u8 rps_resv[2]; /* reserved - must be zero */
__u8 rps_flag; /* flag - see below */
__u8 rps_resv2[2]; /* reserved */
__be16 rps_status; /* port status - see below */
struct fc_els_lesb rps_lesb; /* link error status block */
};
enum fc_els_rps_resp_flag {
FC_ELS_RPS_LPEV = 0x01, /* L_port extension valid */
};
enum fc_els_rps_resp_status {
FC_ELS_RPS_PTP = 1 << 5, /* point-to-point connection */
FC_ELS_RPS_LOOP = 1 << 4, /* loop mode */
FC_ELS_RPS_FAB = 1 << 3, /* fabric present */
FC_ELS_RPS_NO_SIG = 1 << 2, /* loss of signal */
FC_ELS_RPS_NO_SYNC = 1 << 1, /* loss of synchronization */
FC_ELS_RPS_RESET = 1 << 0, /* in link reset protocol */
};
/*
* ELS LIRR - Link Incident Record Registration request.
*/
struct fc_els_lirr {
__u8 lirr_cmd; /* command */
__u8 lirr_resv[3]; /* reserved - must be zero */
__u8 lirr_func; /* registration function */
__u8 lirr_fmt; /* FC-4 type of RLIR requested */
__u8 lirr_resv2[2]; /* reserved - must be zero */
};
enum fc_els_lirr_func {
ELS_LIRR_SET_COND = 0x01, /* set - conditionally receive */
ELS_LIRR_SET_UNCOND = 0x02, /* set - unconditionally receive */
ELS_LIRR_CLEAR = 0xff /* clear registration */
};
/*
* ELS SRL - Scan Remote Loop request.
*/
struct fc_els_srl {
__u8 srl_cmd; /* command */
__u8 srl_resv[3]; /* reserved - must be zero */
__u8 srl_flag; /* flag - see below */
__u8 srl_flag_param[3]; /* flag parameter */
};
enum fc_els_srl_flag {
FC_ELS_SRL_ALL = 0x00, /* scan all FL ports */
FC_ELS_SRL_ONE = 0x01, /* scan specified loop */
FC_ELS_SRL_EN_PER = 0x02, /* enable periodic scanning (param) */
FC_ELS_SRL_DIS_PER = 0x03, /* disable periodic scanning */
};
/*
* ELS RLS - Read Link Error Status Block request.
*/
struct fc_els_rls {
__u8 rls_cmd; /* command */
__u8 rls_resv[4]; /* reserved - must be zero */
__u8 rls_port_id[3]; /* port ID */
};
/*
* ELS RLS LS_ACC Response.
*/
struct fc_els_rls_resp {
__u8 rls_cmd; /* ELS_LS_ACC */
__u8 rls_resv[3]; /* reserved - must be zero */
struct fc_els_lesb rls_lesb; /* link error status block */
};
/*
* ELS RLIR - Registered Link Incident Report.
* This is followed by the CLIR and the CLID, described below.
*/
struct fc_els_rlir {
__u8 rlir_cmd; /* command */
__u8 rlir_resv[3]; /* reserved - must be zero */
__u8 rlir_fmt; /* format (FC4-type if type specific) */
__u8 rlir_clr_len; /* common link incident record length */
__u8 rlir_cld_len; /* common link incident desc. length */
__u8 rlir_slr_len; /* spec. link incident record length */
};
/*
* CLIR - Common Link Incident Record Data. - Sent via RLIR.
*/
struct fc_els_clir {
__be64 clir_wwpn; /* incident port name */
__be64 clir_wwnn; /* incident port node name */
__u8 clir_port_type; /* incident port type */
__u8 clir_port_id[3]; /* incident port ID */
__be64 clir_conn_wwpn; /* connected port name */
__be64 clir_conn_wwnn; /* connected node name */
__be64 clir_fab_name; /* fabric name */
__be32 clir_phys_port; /* physical port number */
__be32 clir_trans_id; /* transaction ID */
__u8 clir_resv[3]; /* reserved */
__u8 clir_ts_fmt; /* time stamp format */
__be64 clir_timestamp; /* time stamp */
};
/*
* CLIR clir_ts_fmt - time stamp format values.
*/
enum fc_els_clir_ts_fmt {
ELS_CLIR_TS_UNKNOWN = 0, /* time stamp field unknown */
ELS_CLIR_TS_SEC_FRAC = 1, /* time in seconds and fractions */
ELS_CLIR_TS_CSU = 2, /* time in clock synch update format */
};
/*
* Common Link Incident Descriptor - sent via RLIR.
*/
struct fc_els_clid {
__u8 clid_iq; /* incident qualifier flags */
__u8 clid_ic; /* incident code */
__be16 clid_epai; /* domain/area of ISL */
};
/*
* CLID incident qualifier flags.
*/
enum fc_els_clid_iq {
ELS_CLID_SWITCH = 0x20, /* incident port is a switch node */
ELS_CLID_E_PORT = 0x10, /* incident is an ISL (E) port */
ELS_CLID_SEV_MASK = 0x0c, /* severity 2-bit field mask */
ELS_CLID_SEV_INFO = 0x00, /* report is informational */
ELS_CLID_SEV_INOP = 0x08, /* link not operational */
ELS_CLID_SEV_DEG = 0x04, /* link degraded but operational */
ELS_CLID_LASER = 0x02, /* subassembly is a laser */
ELS_CLID_FRU = 0x01, /* format can identify a FRU */
};
/*
* CLID incident code.
*/
enum fc_els_clid_ic {
ELS_CLID_IC_IMPL = 1, /* implicit incident */
ELS_CLID_IC_BER = 2, /* bit-error-rate threshold exceeded */
ELS_CLID_IC_LOS = 3, /* loss of synch or signal */
ELS_CLID_IC_NOS = 4, /* non-operational primitive sequence */
ELS_CLID_IC_PST = 5, /* primitive sequence timeout */
ELS_CLID_IC_INVAL = 6, /* invalid primitive sequence */
ELS_CLID_IC_LOOP_TO = 7, /* loop initialization time out */
ELS_CLID_IC_LIP = 8, /* receiving LIP */
};
/*
* Link Integrity event types
*/
enum fc_fpin_li_event_types {
FPIN_LI_UNKNOWN = 0x0,
FPIN_LI_LINK_FAILURE = 0x1,
FPIN_LI_LOSS_OF_SYNC = 0x2,
FPIN_LI_LOSS_OF_SIG = 0x3,
FPIN_LI_PRIM_SEQ_ERR = 0x4,
FPIN_LI_INVALID_TX_WD = 0x5,
FPIN_LI_INVALID_CRC = 0x6,
FPIN_LI_DEVICE_SPEC = 0xF,
};
/*
* Initializer useful for decoding table.
* Please keep this in sync with the above definitions.
*/
#define FC_FPIN_LI_EVT_TYPES_INIT { \
{ FPIN_LI_UNKNOWN, "Unknown" }, \
{ FPIN_LI_LINK_FAILURE, "Link Failure" }, \
{ FPIN_LI_LOSS_OF_SYNC, "Loss of Synchronization" }, \
{ FPIN_LI_LOSS_OF_SIG, "Loss of Signal" }, \
{ FPIN_LI_PRIM_SEQ_ERR, "Primitive Sequence Protocol Error" }, \
{ FPIN_LI_INVALID_TX_WD, "Invalid Transmission Word" }, \
{ FPIN_LI_INVALID_CRC, "Invalid CRC" }, \
{ FPIN_LI_DEVICE_SPEC, "Device Specific" }, \
}
/*
* Delivery event types
*/
enum fc_fpin_deli_event_types {
FPIN_DELI_UNKNOWN = 0x0,
FPIN_DELI_TIMEOUT = 0x1,
FPIN_DELI_UNABLE_TO_ROUTE = 0x2,
FPIN_DELI_DEVICE_SPEC = 0xF,
};
/*
* Initializer useful for decoding table.
* Please keep this in sync with the above definitions.
*/
#define FC_FPIN_DELI_EVT_TYPES_INIT { \
{ FPIN_DELI_UNKNOWN, "Unknown" }, \
{ FPIN_DELI_TIMEOUT, "Timeout" }, \
{ FPIN_DELI_UNABLE_TO_ROUTE, "Unable to Route" }, \
{ FPIN_DELI_DEVICE_SPEC, "Device Specific" }, \
}
/*
* Congestion event types
*/
enum fc_fpin_congn_event_types {
FPIN_CONGN_CLEAR = 0x0,
FPIN_CONGN_LOST_CREDIT = 0x1,
FPIN_CONGN_CREDIT_STALL = 0x2,
FPIN_CONGN_OVERSUBSCRIPTION = 0x3,
FPIN_CONGN_DEVICE_SPEC = 0xF,
};
/*
* Initializer useful for decoding table.
* Please keep this in sync with the above definitions.
*/
#define FC_FPIN_CONGN_EVT_TYPES_INIT { \
{ FPIN_CONGN_CLEAR, "Clear" }, \
{ FPIN_CONGN_LOST_CREDIT, "Lost Credit" }, \
{ FPIN_CONGN_CREDIT_STALL, "Credit Stall" }, \
{ FPIN_CONGN_OVERSUBSCRIPTION, "Oversubscription" }, \
{ FPIN_CONGN_DEVICE_SPEC, "Device Specific" }, \
}
enum fc_fpin_congn_severity_types {
FPIN_CONGN_SEVERITY_WARNING = 0xF1,
FPIN_CONGN_SEVERITY_ERROR = 0xF7,
};
/*
* Link Integrity Notification Descriptor
*/
struct fc_fn_li_desc {
__be32 desc_tag; /* Descriptor Tag (0x00020001) */
__be32 desc_len; /* Length of Descriptor (in bytes).
* Size of descriptor excluding
* desc_tag and desc_len fields.
*/
__be64 detecting_wwpn; /* Port Name that detected event */
__be64 attached_wwpn; /* Port Name of device attached to
* detecting Port Name
*/
__be16 event_type; /* see enum fc_fpin_li_event_types */
__be16 event_modifier; /* Implementation specific value
* describing the event type
*/
__be32 event_threshold;/* duration in ms of the link
* integrity detection cycle
*/
__be32 event_count; /* minimum number of event
* occurrences during the event
* threshold to caause the LI event
*/
__be32 pname_count; /* number of portname_list elements */
__be64 pname_list[0]; /* list of N_Port_Names accessible
* through the attached port
*/
};
/*
* Delivery Notification Descriptor
*/
struct fc_fn_deli_desc {
__be32 desc_tag; /* Descriptor Tag (0x00020002) */
__be32 desc_len; /* Length of Descriptor (in bytes).
* Size of descriptor excluding
* desc_tag and desc_len fields.
*/
__be64 detecting_wwpn; /* Port Name that detected event */
__be64 attached_wwpn; /* Port Name of device attached to
* detecting Port Name
*/
__be32 deli_reason_code;/* see enum fc_fpin_deli_event_types */
};
/*
* Peer Congestion Notification Descriptor
*/
struct fc_fn_peer_congn_desc {
__be32 desc_tag; /* Descriptor Tag (0x00020003) */
__be32 desc_len; /* Length of Descriptor (in bytes).
* Size of descriptor excluding
* desc_tag and desc_len fields.
*/
__be64 detecting_wwpn; /* Port Name that detected event */
__be64 attached_wwpn; /* Port Name of device attached to
* detecting Port Name
*/
__be16 event_type; /* see enum fc_fpin_congn_event_types */
__be16 event_modifier; /* Implementation specific value
* describing the event type
*/
__be32 event_period; /* duration (ms) of the detected
* congestion event
*/
__be32 pname_count; /* number of portname_list elements */
__be64 pname_list[0]; /* list of N_Port_Names accessible
* through the attached port
*/
};
/*
* Congestion Notification Descriptor
*/
struct fc_fn_congn_desc {
__be32 desc_tag; /* Descriptor Tag (0x00020004) */
__be32 desc_len; /* Length of Descriptor (in bytes).
* Size of descriptor excluding
* desc_tag and desc_len fields.
*/
__be16 event_type; /* see enum fc_fpin_congn_event_types */
__be16 event_modifier; /* Implementation specific value
* describing the event type
*/
__be32 event_period; /* duration (ms) of the detected
* congestion event
*/
__u8 severity; /* command */
__u8 resv[3]; /* reserved - must be zero */
};
/*
* ELS_FPIN - Fabric Performance Impact Notification
*/
struct fc_els_fpin {
__u8 fpin_cmd; /* command (0x16) */
__u8 fpin_zero[3]; /* specified as zero - part of cmd */
__be32 desc_len; /* Length of Descriptor List (in bytes).
* Size of ELS excluding fpin_cmd,
* fpin_zero and desc_len fields.
*/
struct fc_tlv_desc fpin_desc[0]; /* Descriptor list */
};
/* Diagnostic Function Descriptor - FPIN Registration */
struct fc_df_desc_fpin_reg {
__be32 desc_tag; /* FPIN Registration (0x00030001) */
__be32 desc_len; /* Length of Descriptor (in bytes).
* Size of descriptor excluding
* desc_tag and desc_len fields.
*/
__be32 count; /* Number of desc_tags elements */
__be32 desc_tags[0]; /* Array of Descriptor Tags.
* Each tag indicates a function
* supported by the N_Port (request)
* or by the N_Port and Fabric
* Controller (reply; may be a subset
* of the request).
* See ELS_FN_DTAG_xxx for tag values.
*/
};
/*
* ELS_RDF - Register Diagnostic Functions
*/
struct fc_els_rdf {
__u8 fpin_cmd; /* command (0x19) */
__u8 fpin_zero[3]; /* specified as zero - part of cmd */
__be32 desc_len; /* Length of Descriptor List (in bytes).
* Size of ELS excluding fpin_cmd,
* fpin_zero and desc_len fields.
*/
struct fc_tlv_desc desc[0]; /* Descriptor list */
};
/*
* ELS RDF LS_ACC Response.
*/
struct fc_els_rdf_resp {
struct fc_els_ls_acc acc_hdr;
__be32 desc_list_len; /* Length of response (in
* bytes). Excludes acc_hdr
* and desc_list_len fields.
*/
struct fc_els_lsri_desc lsri;
struct fc_tlv_desc desc[0]; /* Supported Descriptor list */
};
/*
* Diagnostic Capability Descriptors for EDC ELS
*/
/*
* Diagnostic: Link Fault Capability Descriptor
*/
struct fc_diag_lnkflt_desc {
__be32 desc_tag; /* Descriptor Tag (0x0001000D) */
__be32 desc_len; /* Length of Descriptor (in bytes).
* Size of descriptor excluding
* desc_tag and desc_len fields.
* 12 bytes
*/
__be32 degrade_activate_threshold;
__be32 degrade_deactivate_threshold;
__be32 fec_degrade_interval;
};
enum fc_edc_cg_signal_cap_types {
/* Note: Capability: bits 31:4 Rsvd; bits 3:0 are capabilities */
EDC_CG_SIG_NOTSUPPORTED = 0x00, /* neither supported */
EDC_CG_SIG_WARN_ONLY = 0x01,
EDC_CG_SIG_WARN_ALARM = 0x02, /* both supported */
};
/*
* Initializer useful for decoding table.
* Please keep this in sync with the above definitions.
*/
#define FC_EDC_CG_SIGNAL_CAP_TYPES_INIT { \
{ EDC_CG_SIG_NOTSUPPORTED, "Signaling Not Supported" }, \
{ EDC_CG_SIG_WARN_ONLY, "Warning Signal" }, \
{ EDC_CG_SIG_WARN_ALARM, "Warning and Alarm Signals" }, \
}
enum fc_diag_cg_sig_freq_types {
EDC_CG_SIGFREQ_CNT_MIN = 1, /* Min Frequency Count */
EDC_CG_SIGFREQ_CNT_MAX = 999, /* Max Frequency Count */
EDC_CG_SIGFREQ_SEC = 0x1, /* Units: seconds */
EDC_CG_SIGFREQ_MSEC = 0x2, /* Units: milliseconds */
};
struct fc_diag_cg_sig_freq {
__be16 count; /* Time between signals
* note: upper 6 bits rsvd
*/
__be16 units; /* Time unit for count
* note: upper 12 bits rsvd
*/
};
/*
* Diagnostic: Congestion Signaling Capability Descriptor
*/
struct fc_diag_cg_sig_desc {
__be32 desc_tag; /* Descriptor Tag (0x0001000F) */
__be32 desc_len; /* Length of Descriptor (in bytes).
* Size of descriptor excluding
* desc_tag and desc_len fields.
* 16 bytes
*/
__be32 xmt_signal_capability;
struct fc_diag_cg_sig_freq xmt_signal_frequency;
__be32 rcv_signal_capability;
struct fc_diag_cg_sig_freq rcv_signal_frequency;
};
/*
* ELS_EDC - Exchange Diagnostic Capabilities
*/
struct fc_els_edc {
__u8 edc_cmd; /* command (0x17) */
__u8 edc_zero[3]; /* specified as zero - part of cmd */
__be32 desc_len; /* Length of Descriptor List (in bytes).
* Size of ELS excluding edc_cmd,
* edc_zero and desc_len fields.
*/
struct fc_tlv_desc desc[0];
/* Diagnostic Descriptor list */
};
/*
* ELS EDC LS_ACC Response.
*/
struct fc_els_edc_resp {
struct fc_els_ls_acc acc_hdr;
__be32 desc_list_len; /* Length of response (in
* bytes). Excludes acc_hdr
* and desc_list_len fields.
*/
struct fc_els_lsri_desc lsri;
struct fc_tlv_desc desc[0];
/* Supported Diagnostic Descriptor list */
};
#endif /* _FC_ELS_H_ */
scsi_netlink.h 0000644 00000007122 14751150150 0007403 0 ustar 00 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
/*
* SCSI Transport Netlink Interface
* Used for the posting of outbound SCSI transport events
*
* Copyright (C) 2006 James Smart, Emulex Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef SCSI_NETLINK_H
#define SCSI_NETLINK_H
#include <linux/netlink.h>
#include <linux/types.h>
/*
* This file intended to be included by both kernel and user space
*/
/* Single Netlink Message type to send all SCSI Transport messages */
#define SCSI_TRANSPORT_MSG NLMSG_MIN_TYPE + 1
/* SCSI Transport Broadcast Groups */
/* leaving groups 0 and 1 unassigned */
#define SCSI_NL_GRP_FC_EVENTS (1<<2) /* Group 2 */
#define SCSI_NL_GRP_CNT 3
/* SCSI_TRANSPORT_MSG event message header */
struct scsi_nl_hdr {
uint8_t version;
uint8_t transport;
uint16_t magic;
uint16_t msgtype;
uint16_t msglen;
} __attribute__((aligned(sizeof(uint64_t))));
/* scsi_nl_hdr->version value */
#define SCSI_NL_VERSION 1
/* scsi_nl_hdr->magic value */
#define SCSI_NL_MAGIC 0xA1B2
/* scsi_nl_hdr->transport value */
#define SCSI_NL_TRANSPORT 0
#define SCSI_NL_TRANSPORT_FC 1
#define SCSI_NL_MAX_TRANSPORTS 2
/* Transport-based scsi_nl_hdr->msgtype values are defined in each transport */
/*
* GENERIC SCSI scsi_nl_hdr->msgtype Values
*/
/* kernel -> user */
#define SCSI_NL_SHOST_VENDOR 0x0001
/* user -> kernel */
/* SCSI_NL_SHOST_VENDOR msgtype is kernel->user and user->kernel */
/*
* Message Structures :
*/
/* macro to round up message lengths to 8byte boundary */
#define SCSI_NL_MSGALIGN(len) (((len) + 7) & ~7)
/*
* SCSI HOST Vendor Unique messages :
* SCSI_NL_SHOST_VENDOR
*
* Note: The Vendor Unique message payload will begin directly after
* this structure, with the length of the payload per vmsg_datalen.
*
* Note: When specifying vendor_id, be sure to read the Vendor Type and ID
* formatting requirements specified below
*/
struct scsi_nl_host_vendor_msg {
struct scsi_nl_hdr snlh; /* must be 1st element ! */
uint64_t vendor_id;
uint16_t host_no;
uint16_t vmsg_datalen;
} __attribute__((aligned(sizeof(uint64_t))));
/*
* Vendor ID:
* If transports post vendor-unique events, they must pass a well-known
* 32-bit vendor identifier. This identifier consists of 8 bits indicating
* the "type" of identifier contained, and 24 bits of id data.
*
* Identifiers for each type:
* PCI : ID data is the 16 bit PCI Registered Vendor ID
*/
#define SCSI_NL_VID_TYPE_SHIFT 56
#define SCSI_NL_VID_TYPE_MASK ((__u64)0xFF << SCSI_NL_VID_TYPE_SHIFT)
#define SCSI_NL_VID_TYPE_PCI ((__u64)0x01 << SCSI_NL_VID_TYPE_SHIFT)
#define SCSI_NL_VID_ID_MASK (~ SCSI_NL_VID_TYPE_MASK)
#define INIT_SCSI_NL_HDR(hdr, t, mtype, mlen) \
{ \
(hdr)->version = SCSI_NL_VERSION; \
(hdr)->transport = t; \
(hdr)->magic = SCSI_NL_MAGIC; \
(hdr)->msgtype = mtype; \
(hdr)->msglen = mlen; \
}
#endif /* SCSI_NETLINK_H */
scsi_netlink_fc.h 0000644 00000003711 14751150150 0010053 0 ustar 00 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
/*
* FC Transport Netlink Interface
*
* Copyright (C) 2006 James Smart, Emulex Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef SCSI_NETLINK_FC_H
#define SCSI_NETLINK_FC_H
#include <scsi/scsi_netlink.h>
/*
* This file intended to be included by both kernel and user space
*/
/*
* FC Transport Message Types
*/
/* kernel -> user */
#define FC_NL_ASYNC_EVENT 0x0100
/* user -> kernel */
/* none */
/*
* Message Structures :
*/
/* macro to round up message lengths to 8byte boundary */
#define FC_NL_MSGALIGN(len) (((len) + 7) & ~7)
/*
* FC Transport Broadcast Event Message :
* FC_NL_ASYNC_EVENT
*
* Note: if Vendor Unique message, &event_data will be start of
* vendor unique payload, and the length of the payload is
* per event_datalen
*
* Note: When specifying vendor_id, be sure to read the Vendor Type and ID
* formatting requirements specified in scsi_netlink.h
*/
struct fc_nl_event {
struct scsi_nl_hdr snlh; /* must be 1st element ! */
uint64_t seconds;
uint64_t vendor_id;
uint16_t host_no;
uint16_t event_datalen;
uint32_t event_num;
uint32_t event_code;
uint32_t event_data;
} __attribute__((aligned(sizeof(uint64_t))));
#endif /* SCSI_NETLINK_FC_H */
scsi.h 0000644 00000015471 14751150150 0005665 0 ustar 00 /* Copyright (C) 1998-2018 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/*
* This header file contains public constants and structures used by
* the scsi code for linux.
*/
#ifndef _SCSI_SCSI_H
#define _SCSI_SCSI_H 1
#include <features.h>
/*
* SCSI opcodes
*/
#define TEST_UNIT_READY 0x00
#define REZERO_UNIT 0x01
#define REQUEST_SENSE 0x03
#define FORMAT_UNIT 0x04
#define READ_BLOCK_LIMITS 0x05
#define REASSIGN_BLOCKS 0x07
#define READ_6 0x08
#define WRITE_6 0x0a
#define SEEK_6 0x0b
#define READ_REVERSE 0x0f
#define WRITE_FILEMARKS 0x10
#define SPACE 0x11
#define INQUIRY 0x12
#define RECOVER_BUFFERED_DATA 0x14
#define MODE_SELECT 0x15
#define RESERVE 0x16
#define RELEASE 0x17
#define COPY 0x18
#define ERASE 0x19
#define MODE_SENSE 0x1a
#define START_STOP 0x1b
#define RECEIVE_DIAGNOSTIC 0x1c
#define SEND_DIAGNOSTIC 0x1d
#define ALLOW_MEDIUM_REMOVAL 0x1e
#define SET_WINDOW 0x24
#define READ_CAPACITY 0x25
#define READ_10 0x28
#define WRITE_10 0x2a
#define SEEK_10 0x2b
#define WRITE_VERIFY 0x2e
#define VERIFY 0x2f
#define SEARCH_HIGH 0x30
#define SEARCH_EQUAL 0x31
#define SEARCH_LOW 0x32
#define SET_LIMITS 0x33
#define PRE_FETCH 0x34
#define READ_POSITION 0x34
#define SYNCHRONIZE_CACHE 0x35
#define LOCK_UNLOCK_CACHE 0x36
#define READ_DEFECT_DATA 0x37
#define MEDIUM_SCAN 0x38
#define COMPARE 0x39
#define COPY_VERIFY 0x3a
#define WRITE_BUFFER 0x3b
#define READ_BUFFER 0x3c
#define UPDATE_BLOCK 0x3d
#define READ_LONG 0x3e
#define WRITE_LONG 0x3f
#define CHANGE_DEFINITION 0x40
#define WRITE_SAME 0x41
#define READ_TOC 0x43
#define LOG_SELECT 0x4c
#define LOG_SENSE 0x4d
#define MODE_SELECT_10 0x55
#define RESERVE_10 0x56
#define RELEASE_10 0x57
#define MODE_SENSE_10 0x5a
#define PERSISTENT_RESERVE_IN 0x5e
#define PERSISTENT_RESERVE_OUT 0x5f
#define MOVE_MEDIUM 0xa5
#define READ_12 0xa8
#define WRITE_12 0xaa
#define WRITE_VERIFY_12 0xae
#define SEARCH_HIGH_12 0xb0
#define SEARCH_EQUAL_12 0xb1
#define SEARCH_LOW_12 0xb2
#define READ_ELEMENT_STATUS 0xb8
#define SEND_VOLUME_TAG 0xb6
#define WRITE_LONG_2 0xea
/*
* Status codes
*/
#define GOOD 0x00
#define CHECK_CONDITION 0x01
#define CONDITION_GOOD 0x02
#define BUSY 0x04
#define INTERMEDIATE_GOOD 0x08
#define INTERMEDIATE_C_GOOD 0x0a
#define RESERVATION_CONFLICT 0x0c
#define COMMAND_TERMINATED 0x11
#define QUEUE_FULL 0x14
#define STATUS_MASK 0x3e
/*
* SENSE KEYS
*/
#define NO_SENSE 0x00
#define RECOVERED_ERROR 0x01
#define NOT_READY 0x02
#define MEDIUM_ERROR 0x03
#define HARDWARE_ERROR 0x04
#define ILLEGAL_REQUEST 0x05
#define UNIT_ATTENTION 0x06
#define DATA_PROTECT 0x07
#define BLANK_CHECK 0x08
#define COPY_ABORTED 0x0a
#define ABORTED_COMMAND 0x0b
#define VOLUME_OVERFLOW 0x0d
#define MISCOMPARE 0x0e
/*
* DEVICE TYPES
*/
#define TYPE_DISK 0x00
#define TYPE_TAPE 0x01
#define TYPE_PROCESSOR 0x03 /* HP scanners use this */
#define TYPE_WORM 0x04 /* Treated as ROM by our system */
#define TYPE_ROM 0x05
#define TYPE_SCANNER 0x06
#define TYPE_MOD 0x07 /* Magneto-optical disk -
* - treated as TYPE_DISK */
#define TYPE_MEDIUM_CHANGER 0x08
#define TYPE_ENCLOSURE 0x0d /* Enclosure Services Device */
#define TYPE_NO_LUN 0x7f
/*
* standard mode-select header prepended to all mode-select commands
*
* moved here from cdrom.h -- kraxel
*/
struct ccs_modesel_head
{
unsigned char _r1; /* reserved. */
unsigned char medium; /* device-specific medium type. */
unsigned char _r2; /* reserved. */
unsigned char block_desc_length; /* block descriptor length. */
unsigned char density; /* device-specific density code. */
unsigned char number_blocks_hi; /* number of blocks in this block
desc. */
unsigned char number_blocks_med;
unsigned char number_blocks_lo;
unsigned char _r3;
unsigned char block_length_hi; /* block length for blocks in this
desc. */
unsigned char block_length_med;
unsigned char block_length_lo;
};
/*
* MESSAGE CODES
*/
#define COMMAND_COMPLETE 0x00
#define EXTENDED_MESSAGE 0x01
#define EXTENDED_MODIFY_DATA_POINTER 0x00
#define EXTENDED_SDTR 0x01
#define EXTENDED_EXTENDED_IDENTIFY 0x02 /* SCSI-I only */
#define EXTENDED_WDTR 0x03
#define SAVE_POINTERS 0x02
#define RESTORE_POINTERS 0x03
#define DISCONNECT 0x04
#define INITIATOR_ERROR 0x05
#define ABORT 0x06
#define MESSAGE_REJECT 0x07
#define NOP 0x08
#define MSG_PARITY_ERROR 0x09
#define LINKED_CMD_COMPLETE 0x0a
#define LINKED_FLG_CMD_COMPLETE 0x0b
#define BUS_DEVICE_RESET 0x0c
#define INITIATE_RECOVERY 0x0f /* SCSI-II only */
#define RELEASE_RECOVERY 0x10 /* SCSI-II only */
#define SIMPLE_QUEUE_TAG 0x20
#define HEAD_OF_QUEUE_TAG 0x21
#define ORDERED_QUEUE_TAG 0x22
/*
* Here are some scsi specific ioctl commands which are sometimes useful.
*/
/* These are a few other constants only used by scsi devices. */
#define SCSI_IOCTL_GET_IDLUN 0x5382
/* Used to turn on and off tagged queuing for scsi devices. */
#define SCSI_IOCTL_TAGGED_ENABLE 0x5383
#define SCSI_IOCTL_TAGGED_DISABLE 0x5384
/* Used to obtain the host number of a device. */
#define SCSI_IOCTL_PROBE_HOST 0x5385
/* Used to get the bus number for a device. */
#define SCSI_IOCTL_GET_BUS_NUMBER 0x5386
#endif /* scsi/scsi.h */
sg.h 0000644 00000026615 14751150150 0005337 0 ustar 00 /* Copyright (C) 1997-2018 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/*
History:
Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user
process control of SCSI devices.
Development Sponsored by Killy Corp. NY NY
*/
#ifndef _SCSI_SG_H
#define _SCSI_SG_H 1
#include <features.h>
#define __need_size_t
#include <stddef.h>
/* New interface introduced in the 3.x SG drivers follows */
/* Same structure as used by readv() Linux system call. It defines one
scatter-gather element. */
typedef struct sg_iovec
{
void * iov_base; /* Starting address */
size_t iov_len; /* Length in bytes */
} sg_iovec_t;
typedef struct sg_io_hdr
{
int interface_id; /* [i] 'S' for SCSI generic (required) */
int dxfer_direction; /* [i] data transfer direction */
unsigned char cmd_len; /* [i] SCSI command length ( <= 16 bytes) */
unsigned char mx_sb_len; /* [i] max length to write to sbp */
unsigned short int iovec_count; /* [i] 0 implies no scatter gather */
unsigned int dxfer_len; /* [i] byte count of data transfer */
void * dxferp; /* [i], [*io] points to data transfer memory
or scatter gather list */
unsigned char * cmdp; /* [i], [*i] points to command to perform */
unsigned char * sbp; /* [i], [*o] points to sense_buffer memory */
unsigned int timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */
unsigned int flags; /* [i] 0 -> default, see SG_FLAG... */
int pack_id; /* [i->o] unused internally (normally) */
void * usr_ptr; /* [i->o] unused internally */
unsigned char status; /* [o] scsi status */
unsigned char masked_status;/* [o] shifted, masked scsi status */
unsigned char msg_status; /* [o] messaging level data (optional) */
unsigned char sb_len_wr; /* [o] byte count actually written to sbp */
unsigned short int host_status; /* [o] errors from host adapter */
unsigned short int driver_status;/* [o] errors from software driver */
int resid; /* [o] dxfer_len - actual_transferred */
unsigned int duration; /* [o] time taken by cmd (unit: millisec) */
unsigned int info; /* [o] auxiliary information */
} sg_io_hdr_t;
/* Use negative values to flag difference from original sg_header structure. */
#define SG_DXFER_NONE -1 /* e.g. a SCSI Test Unit Ready command */
#define SG_DXFER_TO_DEV -2 /* e.g. a SCSI WRITE command */
#define SG_DXFER_FROM_DEV -3 /* e.g. a SCSI READ command */
#define SG_DXFER_TO_FROM_DEV -4 /* treated like SG_DXFER_FROM_DEV with the
additional property than during indirect
IO the user buffer is copied into the
kernel buffers before the transfer */
/* following flag values can be "or"-ed together */
#define SG_FLAG_DIRECT_IO 1 /* default is indirect IO */
#define SG_FLAG_LUN_INHIBIT 2 /* default is to put device's lun into */
/* the 2nd byte of SCSI command */
#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
/* user space (debug indirect IO) */
/* The following 'info' values are "or"-ed together. */
#define SG_INFO_OK_MASK 0x1
#define SG_INFO_OK 0x0 /* no sense, host nor driver "noise" */
#define SG_INFO_CHECK 0x1 /* something abnormal happened */
#define SG_INFO_DIRECT_IO_MASK 0x6
#define SG_INFO_INDIRECT_IO 0x0 /* data xfer via kernel buffers (or no xfer) */
#define SG_INFO_DIRECT_IO 0x2 /* direct IO requested and performed */
#define SG_INFO_MIXED_IO 0x4 /* part direct, part indirect IO */
/* Request information about a specific SG device, used by
SG_GET_SCSI_ID ioctl (). */
struct sg_scsi_id {
/* Host number as in "scsi<n>" where 'n' is one of 0, 1, 2 etc. */
int host_no;
int channel;
/* SCSI id of target device. */
int scsi_id;
int lun;
/* TYPE_... defined in <scsi/scsi.h>. */
int scsi_type;
/* Host (adapter) maximum commands per lun. */
short int h_cmd_per_lun;
/* Device (or adapter) maximum queue length. */
short int d_queue_depth;
/* Unused, set to 0 for now. */
int unused[2];
};
/* Used by SG_GET_REQUEST_TABLE ioctl(). */
typedef struct sg_req_info {
char req_state; /* 0 -> not used, 1 -> written, 2 -> ready to read */
char orphan; /* 0 -> normal request, 1 -> from interruped SG_IO */
char sg_io_owned; /* 0 -> complete with read(), 1 -> owned by SG_IO */
char problem; /* 0 -> no problem detected, 1 -> error to report */
int pack_id; /* pack_id associated with request */
void * usr_ptr; /* user provided pointer (in new interface) */
unsigned int duration; /* millisecs elapsed since written (req_state==1)
or request duration (req_state==2) */
int unused;
} sg_req_info_t;
/* IOCTLs: Those ioctls that are relevant to the SG 3.x drivers follow.
[Those that only apply to the SG 2.x drivers are at the end of the file.]
(_GET_s yield result via 'int *' 3rd argument unless otherwise indicated) */
#define SG_EMULATED_HOST 0x2203 /* true for emulated host adapter (ATAPI) */
/* Used to configure SCSI command transformation layer for ATAPI devices */
/* Only supported by the ide-scsi driver */
#define SG_SET_TRANSFORM 0x2204 /* N.B. 3rd arg is not pointer but value: */
/* 3rd arg = 0 to disable transform, 1 to enable it */
#define SG_GET_TRANSFORM 0x2205
#define SG_SET_RESERVED_SIZE 0x2275 /* request a new reserved buffer size */
#define SG_GET_RESERVED_SIZE 0x2272 /* actual size of reserved buffer */
/* The following ioctl has a 'sg_scsi_id_t *' object as its 3rd argument. */
#define SG_GET_SCSI_ID 0x2276 /* Yields fd's bus, chan, dev, lun + type */
/* SCSI id information can also be obtained from SCSI_IOCTL_GET_IDLUN */
/* Override host setting and always DMA using low memory ( <16MB on i386) */
#define SG_SET_FORCE_LOW_DMA 0x2279 /* 0-> use adapter setting, 1-> force */
#define SG_GET_LOW_DMA 0x227a /* 0-> use all ram for dma; 1-> low dma ram */
/* When SG_SET_FORCE_PACK_ID set to 1, pack_id is input to read() which
tries to fetch a packet with a matching pack_id, waits, or returns EAGAIN.
If pack_id is -1 then read oldest waiting. When ...FORCE_PACK_ID set to 0
then pack_id ignored by read() and oldest readable fetched. */
#define SG_SET_FORCE_PACK_ID 0x227b
#define SG_GET_PACK_ID 0x227c /* Yields oldest readable pack_id (or -1) */
#define SG_GET_NUM_WAITING 0x227d /* Number of commands awaiting read() */
/* Yields max scatter gather tablesize allowed by current host adapter */
#define SG_GET_SG_TABLESIZE 0x227F /* 0 implies can't do scatter gather */
#define SG_GET_VERSION_NUM 0x2282 /* Example: version 2.1.34 yields 20134 */
/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */
#define SG_SCSI_RESET 0x2284
/* Associated values that can be given to SG_SCSI_RESET follow */
#define SG_SCSI_RESET_NOTHING 0
#define SG_SCSI_RESET_DEVICE 1
#define SG_SCSI_RESET_BUS 2
#define SG_SCSI_RESET_HOST 3
/* synchronous SCSI command ioctl, (only in version 3 interface) */
#define SG_IO 0x2285 /* similar effect as write() followed by read() */
#define SG_GET_REQUEST_TABLE 0x2286 /* yields table of active requests */
/* How to treat EINTR during SG_IO ioctl(), only in SG 3.x series */
#define SG_SET_KEEP_ORPHAN 0x2287 /* 1 -> hold for read(), 0 -> drop (def) */
#define SG_GET_KEEP_ORPHAN 0x2288
#define SG_SCATTER_SZ (8 * 4096) /* PAGE_SIZE not available to user */
/* Largest size (in bytes) a single scatter-gather list element can have.
The value must be a power of 2 and <= (PAGE_SIZE * 32) [131072 bytes on
i386]. The minimum value is PAGE_SIZE. If scatter-gather not supported
by adapter then this value is the largest data block that can be
read/written by a single scsi command. The user can find the value of
PAGE_SIZE by calling getpagesize() defined in unistd.h . */
#define SG_DEFAULT_RETRIES 1
/* Defaults, commented if they differ from original sg driver */
#define SG_DEF_FORCE_LOW_DMA 0 /* was 1 -> memory below 16MB on i386 */
#define SG_DEF_FORCE_PACK_ID 0
#define SG_DEF_KEEP_ORPHAN 0
#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ /* load time option */
/* maximum outstanding requests, write() yields EDOM if exceeded */
#define SG_MAX_QUEUE 16
#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE /* for backward compatibility */
/* Alternate style type names, "..._t" variants preferred */
typedef struct sg_io_hdr Sg_io_hdr;
typedef struct sg_io_vec Sg_io_vec;
typedef struct sg_scsi_id Sg_scsi_id;
typedef struct sg_req_info Sg_req_info;
/* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
/* The older SG interface based on the 'sg_header' structure follows. */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
#define SG_MAX_SENSE 16 /* this only applies to the sg_header interface */
struct sg_header
{
/* Length of incoming packet (including header). */
int pack_len;
/* Maximal length of expected reply. */
int reply_len;
/* Id number of packet. */
int pack_id;
/* 0==ok, otherwise error number. */
int result;
/* Force 12 byte command length for group 6 & 7 commands. */
unsigned int twelve_byte:1;
/* SCSI status from target. */
unsigned int target_status:5;
/* Host status (see "DID" codes). */
unsigned int host_status:8;
/* Driver status+suggestion. */
unsigned int driver_status:8;
/* Unused. */
unsigned int other_flags:10;
/* Output in 3 cases:
when target_status is CHECK_CONDITION or
when target_status is COMMAND_TERMINATED or
when (driver_status & DRIVER_SENSE) is true. */
unsigned char sense_buffer[SG_MAX_SENSE];
};
/* IOCTLs: The following are not required (or ignored) when the sg_io_hdr_t
interface is used. They are kept for backward compatibility with
the original and version 2 drivers. */
#define SG_SET_TIMEOUT 0x2201 /* Set timeout; *(int *)arg==timeout. */
#define SG_GET_TIMEOUT 0x2202 /* Get timeout; return timeout. */
/* Get/set command queuing state per fd (default is SG_DEF_COMMAND_Q). */
#define SG_GET_COMMAND_Q 0x2270 /* Yields 0 (queuing off) or 1 (on). */
#define SG_SET_COMMAND_Q 0x2271 /* Change queuing state with 0 or 1. */
/* Turn on error sense trace (1..8), dump this device to log/console (9)
or dump all sg device states ( >9 ) to log/console. */
#define SG_SET_DEBUG 0x227e /* 0 -> turn off debug */
#define SG_NEXT_CMD_LEN 0x2283 /* Override SCSI command length with given
number on the next write() on this file
descriptor. */
/* Defaults, commented if they differ from original sg driver */
#define SG_DEFAULT_TIMEOUT (60*HZ) /* HZ == 'jiffies in 1 second' */
#define SG_DEF_COMMAND_Q 0 /* command queuing is always on when
the new interface is used */
#define SG_DEF_UNDERRUN_FLAG 0
#endif /* scsi/sg.h */
scsi_bsg_mpi3mr.h 0000644 00000036250 14751150150 0010005 0 ustar 00 /* SPDX-License-Identifier: GPL-2.0-or-later WITH Linux-syscall-note */
/*
* Driver for Broadcom MPI3 Storage Controllers
*
* Copyright (C) 2017-2022 Broadcom Inc.
* (mailto: mpi3mr-linuxdrv.pdl@broadcom.com)
*
*/
#ifndef SCSI_BSG_MPI3MR_H_INCLUDED
#define SCSI_BSG_MPI3MR_H_INCLUDED
#include <linux/types.h>
/* Definitions for BSG commands */
#define MPI3MR_IOCTL_VERSION 0x06
#define MPI3MR_APP_DEFAULT_TIMEOUT (60) /*seconds*/
#define MPI3MR_BSG_ADPTYPE_UNKNOWN 0
#define MPI3MR_BSG_ADPTYPE_AVGFAMILY 1
#define MPI3MR_BSG_ADPSTATE_UNKNOWN 0
#define MPI3MR_BSG_ADPSTATE_OPERATIONAL 1
#define MPI3MR_BSG_ADPSTATE_FAULT 2
#define MPI3MR_BSG_ADPSTATE_IN_RESET 3
#define MPI3MR_BSG_ADPSTATE_UNRECOVERABLE 4
#define MPI3MR_BSG_ADPRESET_UNKNOWN 0
#define MPI3MR_BSG_ADPRESET_SOFT 1
#define MPI3MR_BSG_ADPRESET_DIAG_FAULT 2
#define MPI3MR_BSG_LOGDATA_MAX_ENTRIES 400
#define MPI3MR_BSG_LOGDATA_ENTRY_HEADER_SZ 4
#define MPI3MR_DRVBSG_OPCODE_UNKNOWN 0
#define MPI3MR_DRVBSG_OPCODE_ADPINFO 1
#define MPI3MR_DRVBSG_OPCODE_ADPRESET 2
#define MPI3MR_DRVBSG_OPCODE_ALLTGTDEVINFO 4
#define MPI3MR_DRVBSG_OPCODE_GETCHGCNT 5
#define MPI3MR_DRVBSG_OPCODE_LOGDATAENABLE 6
#define MPI3MR_DRVBSG_OPCODE_PELENABLE 7
#define MPI3MR_DRVBSG_OPCODE_GETLOGDATA 8
#define MPI3MR_DRVBSG_OPCODE_QUERY_HDB 9
#define MPI3MR_DRVBSG_OPCODE_REPOST_HDB 10
#define MPI3MR_DRVBSG_OPCODE_UPLOAD_HDB 11
#define MPI3MR_DRVBSG_OPCODE_REFRESH_HDB_TRIGGERS 12
#define MPI3MR_BSG_BUFTYPE_UNKNOWN 0
#define MPI3MR_BSG_BUFTYPE_RAIDMGMT_CMD 1
#define MPI3MR_BSG_BUFTYPE_RAIDMGMT_RESP 2
#define MPI3MR_BSG_BUFTYPE_DATA_IN 3
#define MPI3MR_BSG_BUFTYPE_DATA_OUT 4
#define MPI3MR_BSG_BUFTYPE_MPI_REPLY 5
#define MPI3MR_BSG_BUFTYPE_ERR_RESPONSE 6
#define MPI3MR_BSG_BUFTYPE_MPI_REQUEST 0xFE
#define MPI3MR_BSG_MPI_REPLY_BUFTYPE_UNKNOWN 0
#define MPI3MR_BSG_MPI_REPLY_BUFTYPE_STATUS 1
#define MPI3MR_BSG_MPI_REPLY_BUFTYPE_ADDRESS 2
#define MPI3MR_HDB_BUFTYPE_UNKNOWN 0
#define MPI3MR_HDB_BUFTYPE_TRACE 1
#define MPI3MR_HDB_BUFTYPE_FIRMWARE 2
#define MPI3MR_HDB_BUFTYPE_RESERVED 3
#define MPI3MR_HDB_BUFSTATUS_UNKNOWN 0
#define MPI3MR_HDB_BUFSTATUS_NOT_ALLOCATED 1
#define MPI3MR_HDB_BUFSTATUS_POSTED_UNPAUSED 2
#define MPI3MR_HDB_BUFSTATUS_POSTED_PAUSED 3
#define MPI3MR_HDB_BUFSTATUS_RELEASED 4
#define MPI3MR_HDB_TRIGGER_TYPE_UNKNOWN 0
#define MPI3MR_HDB_TRIGGER_TYPE_DIAGFAULT 1
#define MPI3MR_HDB_TRIGGER_TYPE_ELEMENT 2
#define MPI3MR_HDB_TRIGGER_TYPE_MASTER 3
/* Supported BSG commands */
enum command {
MPI3MR_DRV_CMD = 1,
MPI3MR_MPT_CMD = 2,
};
/**
* struct mpi3_driver_info_layout - Information about driver
*
* @information_length: Length of this structure in bytes
* @driver_signature: Driver Vendor name
* @os_name: Operating System Name
* @driver_name: Driver name
* @driver_version: Driver version
* @driver_release_date: Driver release date
* @driver_capabilities: Driver capabilities
*/
struct mpi3_driver_info_layout {
__le32 information_length;
__u8 driver_signature[12];
__u8 os_name[16];
__u8 os_version[12];
__u8 driver_name[20];
__u8 driver_version[32];
__u8 driver_release_date[20];
__le32 driver_capabilities;
};
/**
* struct mpi3mr_bsg_in_adpinfo - Adapter information request
* data returned by the driver.
*
* @adp_type: Adapter type
* @rsvd1: Reserved
* @pci_dev_id: PCI device ID of the adapter
* @pci_dev_hw_rev: PCI revision of the adapter
* @pci_subsys_dev_id: PCI subsystem device ID of the adapter
* @pci_subsys_ven_id: PCI subsystem vendor ID of the adapter
* @pci_dev: PCI device
* @pci_func: PCI function
* @pci_bus: PCI bus
* @rsvd2: Reserved
* @pci_seg_id: PCI segment ID
* @app_intfc_ver: version of the application interface definition
* @rsvd3: Reserved
* @rsvd4: Reserved
* @rsvd5: Reserved
* @driver_info: Driver Information (Version/Name)
*/
struct mpi3mr_bsg_in_adpinfo {
__u32 adp_type;
__u32 rsvd1;
__u32 pci_dev_id;
__u32 pci_dev_hw_rev;
__u32 pci_subsys_dev_id;
__u32 pci_subsys_ven_id;
__u32 pci_dev:5;
__u32 pci_func:3;
__u32 pci_bus:8;
__u16 rsvd2;
__u32 pci_seg_id;
__u32 app_intfc_ver;
__u8 adp_state;
__u8 rsvd3;
__u16 rsvd4;
__u32 rsvd5[2];
struct mpi3_driver_info_layout driver_info;
};
/**
* struct mpi3mr_bsg_adp_reset - Adapter reset request
* payload data to the driver.
*
* @reset_type: Reset type
* @rsvd1: Reserved
* @rsvd2: Reserved
*/
struct mpi3mr_bsg_adp_reset {
__u8 reset_type;
__u8 rsvd1;
__u16 rsvd2;
};
/**
* struct mpi3mr_change_count - Topology change count
* returned by the driver.
*
* @change_count: Topology change count
* @rsvd: Reserved
*/
struct mpi3mr_change_count {
__u16 change_count;
__u16 rsvd;
};
/**
* struct mpi3mr_device_map_info - Target device mapping
* information
*
* @handle: Firmware device handle
* @perst_id: Persistent ID assigned by the firmware
* @target_id: Target ID assigned by the driver
* @bus_id: Bus ID assigned by the driver
* @rsvd1: Reserved
* @rsvd2: Reserved
*/
struct mpi3mr_device_map_info {
__u16 handle;
__u16 perst_id;
__u32 target_id;
__u8 bus_id;
__u8 rsvd1;
__u16 rsvd2;
};
/**
* struct mpi3mr_all_tgt_info - Target device mapping
* information returned by the driver
*
* @num_devices: The number of devices in driver's inventory
* @rsvd1: Reserved
* @rsvd2: Reserved
* @dmi: Variable length array of mapping information of targets
*/
struct mpi3mr_all_tgt_info {
__u16 num_devices;
__u16 rsvd1;
__u32 rsvd2;
struct mpi3mr_device_map_info dmi[1];
};
/**
* struct mpi3mr_logdata_enable - Number of log data
* entries saved by the driver returned as payload data for
* enable logdata BSG request by the driver.
*
* @max_entries: Number of log data entries cached by the driver
* @rsvd: Reserved
*/
struct mpi3mr_logdata_enable {
__u16 max_entries;
__u16 rsvd;
};
/**
* struct mpi3mr_bsg_out_pel_enable - PEL enable request payload
* data to the driver.
*
* @pel_locale: PEL locale to the firmware
* @pel_class: PEL class to the firmware
* @rsvd: Reserved
*/
struct mpi3mr_bsg_out_pel_enable {
__u16 pel_locale;
__u8 pel_class;
__u8 rsvd;
};
/**
* struct mpi3mr_logdata_entry - Log data entry cached by the
* driver.
*
* @valid_entry: Is the entry valid
* @rsvd1: Reserved
* @rsvd2: Reserved
* @data: Variable length Log entry data
*/
struct mpi3mr_logdata_entry {
__u8 valid_entry;
__u8 rsvd1;
__u16 rsvd2;
__u8 data[1]; /* Variable length Array */
};
/**
* struct mpi3mr_bsg_in_log_data - Log data entries saved by
* the driver returned as payload data for Get logdata request
* by the driver.
*
* @entry: Variable length Log data entry array
*/
struct mpi3mr_bsg_in_log_data {
struct mpi3mr_logdata_entry entry[1];
};
/**
* struct mpi3mr_hdb_entry - host diag buffer entry.
*
* @buf_type: Buffer type
* @status: Buffer status
* @trigger_type: Trigger type
* @rsvd1: Reserved
* @size: Buffer size
* @rsvd2: Reserved
* @trigger_data: Trigger specific data
* @rsvd3: Reserved
* @rsvd4: Reserved
*/
struct mpi3mr_hdb_entry {
__u8 buf_type;
__u8 status;
__u8 trigger_type;
__u8 rsvd1;
__u16 size;
__u16 rsvd2;
__u64 trigger_data;
__u32 rsvd3;
__u32 rsvd4;
};
/**
* struct mpi3mr_bsg_in_hdb_status - This structure contains
* return data for the BSG request to retrieve the number of host
* diagnostic buffers supported by the driver and their current
* status and additional status specific data if any in forms of
* multiple hdb entries.
*
* @num_hdb_types: Number of host diag buffer types supported
* @rsvd1: Reserved
* @rsvd2: Reserved
* @rsvd3: Reserved
* @entry: Variable length Diag buffer status entry array
*/
struct mpi3mr_bsg_in_hdb_status {
__u8 num_hdb_types;
__u8 rsvd1;
__u16 rsvd2;
__u32 rsvd3;
struct mpi3mr_hdb_entry entry[1];
};
/**
* struct mpi3mr_bsg_out_repost_hdb - Repost host diagnostic
* buffer request payload data to the driver.
*
* @buf_type: Buffer type
* @rsvd1: Reserved
* @rsvd2: Reserved
*/
struct mpi3mr_bsg_out_repost_hdb {
__u8 buf_type;
__u8 rsvd1;
__u16 rsvd2;
};
/**
* struct mpi3mr_bsg_out_upload_hdb - Upload host diagnostic
* buffer request payload data to the driver.
*
* @buf_type: Buffer type
* @rsvd1: Reserved
* @rsvd2: Reserved
* @start_offset: Start offset of the buffer from where to copy
* @length: Length of the buffer to copy
*/
struct mpi3mr_bsg_out_upload_hdb {
__u8 buf_type;
__u8 rsvd1;
__u16 rsvd2;
__u32 start_offset;
__u32 length;
};
/**
* struct mpi3mr_bsg_out_refresh_hdb_triggers - Refresh host
* diagnostic buffer triggers request payload data to the driver.
*
* @page_type: Page type
* @rsvd1: Reserved
* @rsvd2: Reserved
*/
struct mpi3mr_bsg_out_refresh_hdb_triggers {
__u8 page_type;
__u8 rsvd1;
__u16 rsvd2;
};
/**
* struct mpi3mr_bsg_drv_cmd - Generic bsg data
* structure for all driver specific requests.
*
* @mrioc_id: Controller ID
* @opcode: Driver specific opcode
* @rsvd1: Reserved
* @rsvd2: Reserved
*/
struct mpi3mr_bsg_drv_cmd {
__u8 mrioc_id;
__u8 opcode;
__u16 rsvd1;
__u32 rsvd2[4];
};
/**
* struct mpi3mr_bsg_in_reply_buf - MPI reply buffer returned
* for MPI Passthrough request .
*
* @mpi_reply_type: Type of MPI reply
* @rsvd1: Reserved
* @rsvd2: Reserved
* @reply_buf: Variable Length buffer based on mpirep type
*/
struct mpi3mr_bsg_in_reply_buf {
__u8 mpi_reply_type;
__u8 rsvd1;
__u16 rsvd2;
__u8 reply_buf[1];
};
/**
* struct mpi3mr_buf_entry - User buffer descriptor for MPI
* Passthrough requests.
*
* @buf_type: Buffer type
* @rsvd1: Reserved
* @rsvd2: Reserved
* @buf_len: Buffer length
*/
struct mpi3mr_buf_entry {
__u8 buf_type;
__u8 rsvd1;
__u16 rsvd2;
__u32 buf_len;
};
/**
* struct mpi3mr_bsg_buf_entry_list - list of user buffer
* descriptor for MPI Passthrough requests.
*
* @num_of_entries: Number of buffer descriptors
* @rsvd1: Reserved
* @rsvd2: Reserved
* @rsvd3: Reserved
* @buf_entry: Variable length array of buffer descriptors
*/
struct mpi3mr_buf_entry_list {
__u8 num_of_entries;
__u8 rsvd1;
__u16 rsvd2;
__u32 rsvd3;
struct mpi3mr_buf_entry buf_entry[1];
};
/**
* struct mpi3mr_bsg_mptcmd - Generic bsg data
* structure for all MPI Passthrough requests .
*
* @mrioc_id: Controller ID
* @rsvd1: Reserved
* @timeout: MPI request timeout
* @buf_entry_list: Buffer descriptor list
*/
struct mpi3mr_bsg_mptcmd {
__u8 mrioc_id;
__u8 rsvd1;
__u16 timeout;
__u32 rsvd2;
struct mpi3mr_buf_entry_list buf_entry_list;
};
/**
* struct mpi3mr_bsg_packet - Generic bsg data
* structure for all supported requests .
*
* @cmd_type: represents drvrcmd or mptcmd
* @rsvd1: Reserved
* @rsvd2: Reserved
* @drvrcmd: driver request structure
* @mptcmd: mpt request structure
*/
struct mpi3mr_bsg_packet {
__u8 cmd_type;
__u8 rsvd1;
__u16 rsvd2;
__u32 rsvd3;
union {
struct mpi3mr_bsg_drv_cmd drvrcmd;
struct mpi3mr_bsg_mptcmd mptcmd;
} cmd;
};
/* MPI3: NVMe Encasulation related definitions */
#ifndef MPI3_NVME_ENCAP_CMD_MAX
#define MPI3_NVME_ENCAP_CMD_MAX (1)
#endif
struct mpi3_nvme_encapsulated_request {
__le16 host_tag;
__u8 ioc_use_only02;
__u8 function;
__le16 ioc_use_only04;
__u8 ioc_use_only06;
__u8 msg_flags;
__le16 change_count;
__le16 dev_handle;
__le16 encapsulated_command_length;
__le16 flags;
__le32 data_length;
__le32 reserved14[3];
__le32 command[MPI3_NVME_ENCAP_CMD_MAX];
};
struct mpi3_nvme_encapsulated_error_reply {
__le16 host_tag;
__u8 ioc_use_only02;
__u8 function;
__le16 ioc_use_only04;
__u8 ioc_use_only06;
__u8 msg_flags;
__le16 ioc_use_only08;
__le16 ioc_status;
__le32 ioc_log_info;
__le32 nvme_completion_entry[4];
};
#define MPI3MR_NVME_PRP_SIZE 8 /* PRP size */
#define MPI3MR_NVME_CMD_PRP1_OFFSET 24 /* PRP1 offset in NVMe cmd */
#define MPI3MR_NVME_CMD_PRP2_OFFSET 32 /* PRP2 offset in NVMe cmd */
#define MPI3MR_NVME_CMD_SGL_OFFSET 24 /* SGL offset in NVMe cmd */
#define MPI3MR_NVME_DATA_FORMAT_PRP 0
#define MPI3MR_NVME_DATA_FORMAT_SGL1 1
#define MPI3MR_NVME_DATA_FORMAT_SGL2 2
/* MPI3: task management related definitions */
struct mpi3_scsi_task_mgmt_request {
__le16 host_tag;
__u8 ioc_use_only02;
__u8 function;
__le16 ioc_use_only04;
__u8 ioc_use_only06;
__u8 msg_flags;
__le16 change_count;
__le16 dev_handle;
__le16 task_host_tag;
__u8 task_type;
__u8 reserved0f;
__le16 task_request_queue_id;
__le16 reserved12;
__le32 reserved14;
__u8 lun[8];
};
#define MPI3_SCSITASKMGMT_MSGFLAGS_DO_NOT_SEND_TASK_IU (0x08)
#define MPI3_SCSITASKMGMT_TASKTYPE_ABORT_TASK (0x01)
#define MPI3_SCSITASKMGMT_TASKTYPE_ABORT_TASK_SET (0x02)
#define MPI3_SCSITASKMGMT_TASKTYPE_TARGET_RESET (0x03)
#define MPI3_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET (0x05)
#define MPI3_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET (0x06)
#define MPI3_SCSITASKMGMT_TASKTYPE_QUERY_TASK (0x07)
#define MPI3_SCSITASKMGMT_TASKTYPE_CLEAR_ACA (0x08)
#define MPI3_SCSITASKMGMT_TASKTYPE_QUERY_TASK_SET (0x09)
#define MPI3_SCSITASKMGMT_TASKTYPE_QUERY_ASYNC_EVENT (0x0a)
#define MPI3_SCSITASKMGMT_TASKTYPE_I_T_NEXUS_RESET (0x0b)
struct mpi3_scsi_task_mgmt_reply {
__le16 host_tag;
__u8 ioc_use_only02;
__u8 function;
__le16 ioc_use_only04;
__u8 ioc_use_only06;
__u8 msg_flags;
__le16 ioc_use_only08;
__le16 ioc_status;
__le32 ioc_log_info;
__le32 termination_count;
__le32 response_data;
__le32 reserved18;
};
#define MPI3_SCSITASKMGMT_RSPCODE_TM_COMPLETE (0x00)
#define MPI3_SCSITASKMGMT_RSPCODE_INVALID_FRAME (0x02)
#define MPI3_SCSITASKMGMT_RSPCODE_TM_FUNCTION_NOT_SUPPORTED (0x04)
#define MPI3_SCSITASKMGMT_RSPCODE_TM_FAILED (0x05)
#define MPI3_SCSITASKMGMT_RSPCODE_TM_SUCCEEDED (0x08)
#define MPI3_SCSITASKMGMT_RSPCODE_TM_INVALID_LUN (0x09)
#define MPI3_SCSITASKMGMT_RSPCODE_TM_OVERLAPPED_TAG (0x0a)
#define MPI3_SCSITASKMGMT_RSPCODE_IO_QUEUED_ON_IOC (0x80)
#define MPI3_SCSITASKMGMT_RSPCODE_TM_NVME_DENIED (0x81)
/* MPI3: PEL related definitions */
#define MPI3_PEL_LOCALE_FLAGS_NON_BLOCKING_BOOT_EVENT (0x0200)
#define MPI3_PEL_LOCALE_FLAGS_BLOCKING_BOOT_EVENT (0x0100)
#define MPI3_PEL_LOCALE_FLAGS_PCIE (0x0080)
#define MPI3_PEL_LOCALE_FLAGS_CONFIGURATION (0x0040)
#define MPI3_PEL_LOCALE_FLAGS_CONTROLER (0x0020)
#define MPI3_PEL_LOCALE_FLAGS_SAS (0x0010)
#define MPI3_PEL_LOCALE_FLAGS_EPACK (0x0008)
#define MPI3_PEL_LOCALE_FLAGS_ENCLOSURE (0x0004)
#define MPI3_PEL_LOCALE_FLAGS_PD (0x0002)
#define MPI3_PEL_LOCALE_FLAGS_VD (0x0001)
#define MPI3_PEL_CLASS_DEBUG (0x00)
#define MPI3_PEL_CLASS_PROGRESS (0x01)
#define MPI3_PEL_CLASS_INFORMATIONAL (0x02)
#define MPI3_PEL_CLASS_WARNING (0x03)
#define MPI3_PEL_CLASS_CRITICAL (0x04)
#define MPI3_PEL_CLASS_FATAL (0x05)
#define MPI3_PEL_CLASS_FAULT (0x06)
/* MPI3: Function definitions */
#define MPI3_BSG_FUNCTION_MGMT_PASSTHROUGH (0x0a)
#define MPI3_BSG_FUNCTION_SCSI_IO (0x20)
#define MPI3_BSG_FUNCTION_SCSI_TASK_MGMT (0x21)
#define MPI3_BSG_FUNCTION_SMP_PASSTHROUGH (0x22)
#define MPI3_BSG_FUNCTION_NVME_ENCAPSULATED (0x24)
#endif
cxlflash_ioctl.h 0000644 00000023670 14751150150 0007722 0 ustar 00 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
/*
* CXL Flash Device Driver
*
* Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
* Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
*
* Copyright (C) 2015 IBM Corporation
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#ifndef _CXLFLASH_IOCTL_H
#define _CXLFLASH_IOCTL_H
#include <linux/types.h>
/*
* Structure and definitions for all CXL Flash ioctls
*/
#define CXLFLASH_WWID_LEN 16
/*
* Structure and flag definitions CXL Flash superpipe ioctls
*/
#define DK_CXLFLASH_VERSION_0 0
struct dk_cxlflash_hdr {
__u16 version; /* Version data */
__u16 rsvd[3]; /* Reserved for future use */
__u64 flags; /* Input flags */
__u64 return_flags; /* Returned flags */
};
/*
* Return flag definitions available to all superpipe ioctls
*
* Similar to the input flags, these are grown from the bottom-up with the
* intention that ioctl-specific return flag definitions would grow from the
* top-down, allowing the two sets to co-exist. While not required/enforced
* at this time, this provides future flexibility.
*/
#define DK_CXLFLASH_ALL_PORTS_ACTIVE 0x0000000000000001ULL
#define DK_CXLFLASH_APP_CLOSE_ADAP_FD 0x0000000000000002ULL
#define DK_CXLFLASH_CONTEXT_SQ_CMD_MODE 0x0000000000000004ULL
/*
* General Notes:
* -------------
* The 'context_id' field of all ioctl structures contains the context
* identifier for a context in the lower 32-bits (upper 32-bits are not
* to be used when identifying a context to the AFU). That said, the value
* in its entirety (all 64-bits) is to be treated as an opaque cookie and
* should be presented as such when issuing ioctls.
*/
/*
* DK_CXLFLASH_ATTACH Notes:
* ------------------------
* Read/write access permissions are specified via the O_RDONLY, O_WRONLY,
* and O_RDWR flags defined in the fcntl.h header file.
*
* A valid adapter file descriptor (fd >= 0) is only returned on the initial
* attach (successful) of a context. When a context is shared(reused), the user
* is expected to already 'know' the adapter file descriptor associated with the
* context.
*/
#define DK_CXLFLASH_ATTACH_REUSE_CONTEXT 0x8000000000000000ULL
struct dk_cxlflash_attach {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u64 num_interrupts; /* Requested number of interrupts */
__u64 context_id; /* Returned context */
__u64 mmio_size; /* Returned size of MMIO area */
__u64 block_size; /* Returned block size, in bytes */
__u64 adap_fd; /* Returned adapter file descriptor */
__u64 last_lba; /* Returned last LBA on the device */
__u64 max_xfer; /* Returned max transfer size, blocks */
__u64 reserved[8]; /* Reserved for future use */
};
struct dk_cxlflash_detach {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u64 context_id; /* Context to detach */
__u64 reserved[8]; /* Reserved for future use */
};
struct dk_cxlflash_udirect {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u64 context_id; /* Context to own physical resources */
__u64 rsrc_handle; /* Returned resource handle */
__u64 last_lba; /* Returned last LBA on the device */
__u64 reserved[8]; /* Reserved for future use */
};
#define DK_CXLFLASH_UVIRTUAL_NEED_WRITE_SAME 0x8000000000000000ULL
struct dk_cxlflash_uvirtual {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u64 context_id; /* Context to own virtual resources */
__u64 lun_size; /* Requested size, in 4K blocks */
__u64 rsrc_handle; /* Returned resource handle */
__u64 last_lba; /* Returned last LBA of LUN */
__u64 reserved[8]; /* Reserved for future use */
};
struct dk_cxlflash_release {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u64 context_id; /* Context owning resources */
__u64 rsrc_handle; /* Resource handle to release */
__u64 reserved[8]; /* Reserved for future use */
};
struct dk_cxlflash_resize {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u64 context_id; /* Context owning resources */
__u64 rsrc_handle; /* Resource handle of LUN to resize */
__u64 req_size; /* New requested size, in 4K blocks */
__u64 last_lba; /* Returned last LBA of LUN */
__u64 reserved[8]; /* Reserved for future use */
};
struct dk_cxlflash_clone {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u64 context_id_src; /* Context to clone from */
__u64 context_id_dst; /* Context to clone to */
__u64 adap_fd_src; /* Source context adapter fd */
__u64 reserved[8]; /* Reserved for future use */
};
#define DK_CXLFLASH_VERIFY_SENSE_LEN 18
#define DK_CXLFLASH_VERIFY_HINT_SENSE 0x8000000000000000ULL
struct dk_cxlflash_verify {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u64 context_id; /* Context owning resources to verify */
__u64 rsrc_handle; /* Resource handle of LUN */
__u64 hint; /* Reasons for verify */
__u64 last_lba; /* Returned last LBA of device */
__u8 sense_data[DK_CXLFLASH_VERIFY_SENSE_LEN]; /* SCSI sense data */
__u8 pad[6]; /* Pad to next 8-byte boundary */
__u64 reserved[8]; /* Reserved for future use */
};
#define DK_CXLFLASH_RECOVER_AFU_CONTEXT_RESET 0x8000000000000000ULL
struct dk_cxlflash_recover_afu {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u64 reason; /* Reason for recovery request */
__u64 context_id; /* Context to recover / updated ID */
__u64 mmio_size; /* Returned size of MMIO area */
__u64 adap_fd; /* Returned adapter file descriptor */
__u64 reserved[8]; /* Reserved for future use */
};
#define DK_CXLFLASH_MANAGE_LUN_WWID_LEN CXLFLASH_WWID_LEN
#define DK_CXLFLASH_MANAGE_LUN_ENABLE_SUPERPIPE 0x8000000000000000ULL
#define DK_CXLFLASH_MANAGE_LUN_DISABLE_SUPERPIPE 0x4000000000000000ULL
#define DK_CXLFLASH_MANAGE_LUN_ALL_PORTS_ACCESSIBLE 0x2000000000000000ULL
struct dk_cxlflash_manage_lun {
struct dk_cxlflash_hdr hdr; /* Common fields */
__u8 wwid[DK_CXLFLASH_MANAGE_LUN_WWID_LEN]; /* Page83 WWID, NAA-6 */
__u64 reserved[8]; /* Rsvd, future use */
};
union cxlflash_ioctls {
struct dk_cxlflash_attach attach;
struct dk_cxlflash_detach detach;
struct dk_cxlflash_udirect udirect;
struct dk_cxlflash_uvirtual uvirtual;
struct dk_cxlflash_release release;
struct dk_cxlflash_resize resize;
struct dk_cxlflash_clone clone;
struct dk_cxlflash_verify verify;
struct dk_cxlflash_recover_afu recover_afu;
struct dk_cxlflash_manage_lun manage_lun;
};
#define MAX_CXLFLASH_IOCTL_SZ (sizeof(union cxlflash_ioctls))
#define CXL_MAGIC 0xCA
#define CXL_IOWR(_n, _s) _IOWR(CXL_MAGIC, _n, struct _s)
/*
* CXL Flash superpipe ioctls start at base of the reserved CXL_MAGIC
* region (0x80) and grow upwards.
*/
#define DK_CXLFLASH_ATTACH CXL_IOWR(0x80, dk_cxlflash_attach)
#define DK_CXLFLASH_USER_DIRECT CXL_IOWR(0x81, dk_cxlflash_udirect)
#define DK_CXLFLASH_RELEASE CXL_IOWR(0x82, dk_cxlflash_release)
#define DK_CXLFLASH_DETACH CXL_IOWR(0x83, dk_cxlflash_detach)
#define DK_CXLFLASH_VERIFY CXL_IOWR(0x84, dk_cxlflash_verify)
#define DK_CXLFLASH_RECOVER_AFU CXL_IOWR(0x85, dk_cxlflash_recover_afu)
#define DK_CXLFLASH_MANAGE_LUN CXL_IOWR(0x86, dk_cxlflash_manage_lun)
#define DK_CXLFLASH_USER_VIRTUAL CXL_IOWR(0x87, dk_cxlflash_uvirtual)
#define DK_CXLFLASH_VLUN_RESIZE CXL_IOWR(0x88, dk_cxlflash_resize)
#define DK_CXLFLASH_VLUN_CLONE CXL_IOWR(0x89, dk_cxlflash_clone)
/*
* Structure and flag definitions CXL Flash host ioctls
*/
#define HT_CXLFLASH_VERSION_0 0
struct ht_cxlflash_hdr {
__u16 version; /* Version data */
__u16 subcmd; /* Sub-command */
__u16 rsvd[2]; /* Reserved for future use */
__u64 flags; /* Input flags */
__u64 return_flags; /* Returned flags */
};
/*
* Input flag definitions available to all host ioctls
*
* These are grown from the bottom-up with the intention that ioctl-specific
* input flag definitions would grow from the top-down, allowing the two sets
* to co-exist. While not required/enforced at this time, this provides future
* flexibility.
*/
#define HT_CXLFLASH_HOST_READ 0x0000000000000000ULL
#define HT_CXLFLASH_HOST_WRITE 0x0000000000000001ULL
#define HT_CXLFLASH_LUN_PROVISION_SUBCMD_CREATE_LUN 0x0001
#define HT_CXLFLASH_LUN_PROVISION_SUBCMD_DELETE_LUN 0x0002
#define HT_CXLFLASH_LUN_PROVISION_SUBCMD_QUERY_PORT 0x0003
struct ht_cxlflash_lun_provision {
struct ht_cxlflash_hdr hdr; /* Common fields */
__u16 port; /* Target port for provision request */
__u16 reserved16[3]; /* Reserved for future use */
__u64 size; /* Size of LUN (4K blocks) */
__u64 lun_id; /* SCSI LUN ID */
__u8 wwid[CXLFLASH_WWID_LEN];/* Page83 WWID, NAA-6 */
__u64 max_num_luns; /* Maximum number of LUNs provisioned */
__u64 cur_num_luns; /* Current number of LUNs provisioned */
__u64 max_cap_port; /* Total capacity for port (4K blocks) */
__u64 cur_cap_port; /* Current capacity for port (4K blocks) */
__u64 reserved[8]; /* Reserved for future use */
};
#define HT_CXLFLASH_AFU_DEBUG_MAX_DATA_LEN 262144 /* 256K */
#define HT_CXLFLASH_AFU_DEBUG_SUBCMD_LEN 12
struct ht_cxlflash_afu_debug {
struct ht_cxlflash_hdr hdr; /* Common fields */
__u8 reserved8[4]; /* Reserved for future use */
__u8 afu_subcmd[HT_CXLFLASH_AFU_DEBUG_SUBCMD_LEN]; /* AFU subcommand,
* (pass through)
*/
__u64 data_ea; /* Data buffer effective address */
__u32 data_len; /* Data buffer length */
__u32 reserved32; /* Reserved for future use */
__u64 reserved[8]; /* Reserved for future use */
};
union cxlflash_ht_ioctls {
struct ht_cxlflash_lun_provision lun_provision;
struct ht_cxlflash_afu_debug afu_debug;
};
#define MAX_HT_CXLFLASH_IOCTL_SZ (sizeof(union cxlflash_ht_ioctls))
/*
* CXL Flash host ioctls start at the top of the reserved CXL_MAGIC
* region (0xBF) and grow downwards.
*/
#define HT_CXLFLASH_LUN_PROVISION CXL_IOWR(0xBF, ht_cxlflash_lun_provision)
#define HT_CXLFLASH_AFU_DEBUG CXL_IOWR(0xBE, ht_cxlflash_afu_debug)
#endif /* ifndef _CXLFLASH_IOCTL_H */