176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _GPXE_SRP_H
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _GPXE_SRP_H
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SCSI RDMA Protocol
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( BSD2 );
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h>
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <byteswap.h>
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/iobuf.h>
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/xfer.h>
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/scsi.h>
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Common fields
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP information unit tag */
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_tag {
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t dwords[2];
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP port ID */
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_port_id {
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t bytes[16];
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP port ID pair */
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_port_ids {
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Initiator port ID */
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_port_id initiator;
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Target port ID */
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_port_id target;
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** SRP information unit common fields */
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_common {
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type */
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[7];
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Login request
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP login request information unit */
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_login_req {
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_LOGIN_REQ
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[7];
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Requested maximum initiator to target IU length */
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t max_i_t_iu_len;
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved1[4];
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Required buffer formats
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of one or more @c
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * SRP_LOGIN_REQ_FMT_XXX constants.
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t required_buffer_formats;
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Flags
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of zero or more @c
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * SRP_LOGIN_REQ_FLAG_XXX and @c SRP_LOGIN_REQ_MCA_XXX
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * constants.
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t flags;
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved2[5];
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Initiator and target port identifiers */
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_port_ids port_ids;
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP login request */
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ 0x00
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Require indirect data buffer descriptor format */
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FMT_IDBD 0x04
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Require direct data buffer descriptor format */
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FMT_DDBD 0x02
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for asynchronous events */
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FLAG_AESOLNT 0x40
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for credit request */
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FLAG_CRSOLNT 0x20
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for logouts */
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FLAG_LOSOLNT 0x10
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multi-channel action mask */
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_MCA_MASK 0x03
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Single RDMA channel operation */
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_MCA_SINGLE_CHANNEL 0x00
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiple independent RDMA channel operation */
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_MCA_MULTIPLE_CHANNELS 0x01
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Login response
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP login response */
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_login_rsp {
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_LOGIN_RSP
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[3];
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Request limit delta */
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t request_limit_delta;
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Maximum initiator to target IU length */
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t max_i_t_iu_len;
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Maximum target to initiator IU length */
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t max_t_i_iu_len;
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Supported buffer formats
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of one or more @c
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * SRP_LOGIN_RSP_FMT_XXX constants.
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t supported_buffer_formats;
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Flags
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of zero or more @c
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * SRP_LOGIN_RSP_FLAG_XXX and @c SRP_LOGIN_RSP_MCR_XXX
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * constants.
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t flags;
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved1[25];
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP login response */
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP 0xc0
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Indirect data buffer descriptor format supported */
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_FMT_IDBD 0x04
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Direct data buffer descriptor format supported */
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_FMT_DDBD 0x02
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Solicited notification is supported */
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_FLAG_SOLNTSUP 0x10
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multi-channel result mask */
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_MCR_MASK 0x03
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** No existing RDMA channels were associated with the same I_T nexus */
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_MCR_NO_EXISTING_CHANNELS 0x00
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** One or more existing RDMA channels were terminated */
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_MCR_EXISTING_CHANNELS_TERMINATED 0x01
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** One or more existing RDMA channels continue to operate independently */
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_MCR_EXISTING_CHANNELS_CONTINUE 0x02
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Login rejection
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP login rejection */
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_login_rej {
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_LOGIN_REJ
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[3];
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reason
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is a @c SRP_LOGIN_REJ_REASON_XXX constant.
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t reason;
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved1[8];
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Supported buffer formats
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of one or more @c
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * SRP_LOGIN_REJ_FMT_XXX constants.
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t supported_buffer_formats;
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved2[6];
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP login rejection */
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ 0xc2
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Unable to establish RDMA channel, no reason specified */
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_UNKNOWN 0x00010000UL
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Insufficient RDMA channel resources */
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_INSUFFICIENT_RESOURCES 0x00010001UL
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Requested maximum initiator to target IU length value too large */
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_BAD_MAX_I_T_IU_LEN 0x00010002UL
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Unable to associate RDMA channel with specified I_T nexus */
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_CANNOT_ASSOCIATE 0x00010003UL
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** One or more requested data buffer descriptor formats are not supported */
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_UNSUPPORTED_BUFFER_FORMAT 0x00010004UL
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** SRP target port does not support multiple RDMA channels per I_T nexus */
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_NO_MULTIPLE_CHANNELS 0x00010005UL
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** RDMA channel limit reached for this initiator */
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_NO_MORE_CHANNELS 0x00010006UL
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Indirect data buffer descriptor format supported */
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_FMT_IDBD 0x04
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Direct data buffer descriptor format supported */
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_FMT_DDBD 0x02
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Initiator logout
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP initiator logout request */
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_i_logout {
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_I_LOGOUT
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[7];
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP initiator logout request */
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_I_LOGOUT 0x03
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Target logout
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP target logout request */
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_t_logout {
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_T_LOGOUT
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Flags
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of zero or more @c
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * SRP_T_LOGOUT_FLAG_XXX constants.
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t flags;
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[2];
29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reason
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is a @c SRP_T_LOGOUT_REASON_XXX constant.
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t reason;
30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP target logout request */
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT 0x80
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The initiator specified solicited notification of logouts */
30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_FLAG_SOLNT 0x01
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** No reason specified */
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_UNKNOWN 0x00000000UL
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Inactive RDMA channel (reclaiming resources) */
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_INACTIVE 0x00000001UL
31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Invalid information unit type code received by SRP target port */
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_INVALID_TYPE 0x00000002UL
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** SRP initiator port sent response with no corresponding request */
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_SPURIOUS_RESPONSE 0x00000003UL
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** RDMA channel disconnected due to multi-channel action code in new login */
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_MCA 0x00000004UL
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Unsuppported format code value specified in data-out buffer descriptor */
32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_UNSUPPORTED_DATA_OUT_FORMAT 0x00000005UL
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Unsuppported format code value specified in data-in buffer descriptor */
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_UNSUPPORTED_DATA_IN_FORMAT 0x00000006UL
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Invalid length for IU type */
33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_INVALID_IU_LEN 0x00000008UL
33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Task management
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP task management request */
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_tsk_mgmt {
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_TSK_MGMT
34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Flags
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of zero or more
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * @c SRP_TSK_MGMT_FLAG_XXX constants.
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t flags;
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[6];
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved1[4];
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Logical unit number */
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct scsi_lun lun;
36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved2[2];
36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Task management function
36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is a @c SRP_TASK_MGMT_FUNC_XXX constant
36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t function;
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved3[1];
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag of task to be managed */
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag managed_tag;
37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved4[8];
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP task management request */
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT 0x01
38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for unsuccessful completions */
38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FLAG_UCSOLNT 0x04
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for successful completions */
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FLAG_SCSOLNT 0x02
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform an ABORT TASK function */
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_ABORT_TASK 0x01
38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform an ABORT TASK SET function */
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_ABORT_TASK_SET 0x02
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform a CLEAR TASK SET function */
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_CLEAR_TASK_SET 0x04
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform a LOGICAL UNIT RESET function */
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_LOGICAL_UNIT_RESET 0x08
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform a CLEAR ACA function */
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_CLEAR_ACA 0x40
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SCSI command
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP SCSI command */
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_cmd {
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_CMD
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Flags
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of zero or more @c SRP_CMD_FLAG_XXX
41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * constants.
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t flags;
42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[3];
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Data buffer descriptor formats
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of one @c SRP_CMD_DO_FMT_XXX and one @c
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * SRP_CMD_DI_FMT_XXX constant.
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t data_buffer_formats;
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Data-out buffer descriptor count */
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t data_out_buffer_count;
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Data-in buffer descriptor count */
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t data_in_buffer_count;
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved1[4];
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Logical unit number */
43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct scsi_lun lun;
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved2[1];
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Task attribute
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is a @c SRP_CMD_TASK_ATTR_XXX constant.
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t task_attr;
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved3[1];
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Additional CDB length */
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t additional_cdb_len;
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Command data block */
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union scsi_cdb cdb;
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP SCSI command */
45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD 0x02
45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for unsuccessful completions */
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_FLAG_UCSOLNT 0x04
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for successful completions */
46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_FLAG_SCSOLNT 0x02
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-out buffer format mask */
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DO_FMT_MASK 0xf0
46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Direct data-out buffer format */
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DO_FMT_DIRECT 0x10
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Indirect data-out buffer format */
47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DO_FMT_INDIRECT 0x20
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-in buffer format mask */
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DI_FMT_MASK 0x0f
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Direct data-in buffer format */
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DI_FMT_DIRECT 0x01
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Indirect data-in buffer format */
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DI_FMT_INDIRECT 0x02
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use the rules for a simple task attribute */
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_TASK_ATTR_SIMPLE 0x00
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use the rules for a head of queue task attribute */
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_TASK_ATTR_QUEUE_HEAD 0x01
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use the rules for an ordered task attribute */
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_TASK_ATTR_ORDERED 0x02
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use the rules for an automatic contingent allegiance task attribute */
49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_TASK_ATTR_AUTOMATIC_CONTINGENT_ALLEGIANCE 0x08
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP memory descriptor */
49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_memory_descriptor {
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Virtual address */
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint64_t address;
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Memory handle */
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t handle;
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Data length */
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t len;
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SCSI response
50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP SCSI response */
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_rsp {
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_RSP
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Flags
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of zero or more @c SRP_RSP_FLAG_XXX
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * constants.
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t flags;
52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[2];
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Request limit delta */
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t request_limit_delta;
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved1[2];
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Valid fields
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of zero or more @c SRP_RSP_VALID_XXX
53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * constants.
53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t valid;
53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Status
53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the SCSI status code.
54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t status;
54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Data-out residual count */
54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t data_out_residual_count;
54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Data-in residual count */
54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t data_in_residual_count;
54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Sense data list length */
54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t sense_data_len;
54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Response data list length */
55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t response_data_len;
55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP SCSI response */
55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP 0xc1
55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The initiator specified solicited notification of this response */
55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_FLAG_SOLNT 0x01
55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-in residual count field is valid and represents an underflow */
56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_DIUNDER 0x20
56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-in residual count field is valid and represents an overflow */
56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_DIOVER 0x10
56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-out residual count field is valid and represents an underflow */
56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_DOUNDER 0x08
56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-out residual count field is valid and represents an overflow */
56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_DOOVER 0x04
57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Sense data list length field is valid */
57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_SNSVALID 0x02
57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Response data list length field is valid */
57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_RSPVALID 0x01
57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get response data portion of SCSI response
57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v rsp			SCSI response
58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret response_data		Response data, or NULL if not present
58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void * srp_rsp_response_data ( struct srp_rsp *rsp ) {
58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return ( ( rsp->valid & SRP_RSP_VALID_RSPVALID ) ?
58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		 ( ( ( void * ) rsp ) + sizeof ( *rsp ) ) : NULL );
58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get length of response data portion of SCSI response
59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v rsp			SCSI response
59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret response_data_len	Response data length
59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline size_t srp_rsp_response_data_len ( struct srp_rsp *rsp ) {
59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return ( ( rsp->valid & SRP_RSP_VALID_RSPVALID ) ?
59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		 ntohl ( rsp->response_data_len ) : 0 );
59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get sense data portion of SCSI response
60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v rsp			SCSI response
60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret sense_data		Sense data, or NULL if not present
60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void * srp_rsp_sense_data ( struct srp_rsp *rsp ) {
60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return ( ( rsp->valid & SRP_RSP_VALID_SNSVALID ) ?
60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		 ( ( ( void * ) rsp ) + sizeof ( *rsp ) +
60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		   srp_rsp_response_data_len ( rsp ) ) : NULL );
60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get length of sense data portion of SCSI response
61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v rsp			SCSI response
61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret sense_data_len		Sense data length
61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline size_t srp_rsp_sense_data_len ( struct srp_rsp *rsp ) {
61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return ( ( rsp->valid & SRP_RSP_VALID_SNSVALID ) ?
61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		 ntohl ( rsp->sense_data_len ) : 0 );
62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Credit request
62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP credit request */
63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_cred_req {
63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_CRED_REQ
63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Flags
63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of zero or more
63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * @c SRP_CRED_REQ_FLAG_XXX constants.
64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t flags;
64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[2];
64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Request limit delta */
64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t request_limit_delta;
64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP credit request */
65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CRED_REQ 0x81
65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The initiator specified solicited notification of credit requests */
65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CRED_REQ_FLAG_SOLNT 0x01
65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Credit response
65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
66076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP credit response */
66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_cred_rsp {
66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_CRED_RSP
66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[7];
67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
67376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP credit response */
67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CRED_RSP 0x41
67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Asynchronous event request
68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
68676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP asynchronous event request */
68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_aer_req {
68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_AER_REQ
69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
69376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Flags
69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise OR of zero or more @c
69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * SRP_AER_REQ_FLAG_XXX constants.
69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t flags;
69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
70076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[2];
70176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Request limit delta */
70276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t request_limit_delta;
70376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
70476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
70576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
70676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved1[4];
70776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Logical unit number */
70876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct scsi_lun lun;
70976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Sense data list length */
71076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t sense_data_len;
71176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
71276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved2[4];
71376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
71476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
71576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP asynchronous event request */
71676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_AER_REQ 0x82
71776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
71876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The initiator specified solicited notification of asynchronous events */
71976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_AER_REQ_FLAG_SOLNT 0x01
72076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
72176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
72276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get sense data portion of asynchronous event request
72376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
72476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v aer_req			SRP asynchronous event request
72576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret sense_data		Sense data
72676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
72776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __always_inline void *
72876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansrp_aer_req_sense_data ( struct srp_aer_req *aer_req ) {
72976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return ( ( ( void * ) aer_req ) + sizeof ( *aer_req ) );
73076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
73176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
73276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
73376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get length of sense data portion of asynchronous event request
73476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
73576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v aer_req			SRP asynchronous event request
73676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret sense_data_len		Sense data length
73776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
73876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __always_inline size_t
73976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansrp_aer_req_sense_data_len ( struct srp_aer_req *aer_req ) {
74076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return ( ntohl ( aer_req->sense_data_len ) );
74176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
74276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
74376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
74476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
74576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Asynchronous event response
74676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
74776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
74876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
74976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP asynchronous event response */
75176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_aer_rsp {
75276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information unit type
75376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
75476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This must be @c SRP_AER_RSP
75576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
75676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t type;
75776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reserved */
75876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint8_t reserved0[7];
75976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Tag */
76076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_tag tag;
76176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed ));
76276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP asynchronous event response */
76476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_AER_RSP 0x42
76576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
76776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
76876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Information units
76976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
77076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
77176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
77276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
77376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum length of any initiator-to-target IU that we will send
77476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
77576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The longest IU is a SRP_CMD with no additional CDB and two direct
77676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * data buffer descriptors, which comes to 80 bytes.
77776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
77876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_MAX_I_T_IU_LEN 80
77976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
78076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*****************************************************************************
78176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
78276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP device
78376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
78476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *****************************************************************************
78576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
78676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
78776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_device;
78876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
78976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP transport type */
79076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_transport_type {
79176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Length of transport private data */
79276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	size_t priv_len;
79376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Parse root path
79476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
79576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * @v srp		SRP device
79676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * @v root_path		Root path
79776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * @ret 		Return status code
79876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
79976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	int ( * parse_root_path ) ( struct srp_device *srp,
80076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				    const char *root_path );
80176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Connect SRP session
80276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
80376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * @v srp		SRP device
80476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * @ret rc		Return status code
80576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
80676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This method should open the underlying socket.
80776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
80876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	int ( * connect ) ( struct srp_device *srp );
80976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
81076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP device */
81276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_device {
81376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reference count */
81476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct refcnt refcnt;
81576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Initiator and target port IDs */
81776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_port_ids port_ids;
81876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Logical unit number */
81976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct scsi_lun lun;
82076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Memory handle */
82176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t memory_handle;
82276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
82376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Current state
82476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
82576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is the bitwise-OR of zero or more @c SRP_STATE_XXX
82676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * flags.
82776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
82876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	unsigned int state;
82976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Retry counter */
83076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	unsigned int retry_count;
83176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Current SCSI command */
83276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct scsi_command *command;
83376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
83476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Underlying data transfer interface */
83576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct xfer_interface socket;
83676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
83776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Transport type */
83876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct srp_transport_type *transport;
83976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Transport private data */
84076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	char transport_priv[0];
84176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
84276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
84376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
84476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get SRP transport private data
84576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
84676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v srp		SRP device
84776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret priv		SRP transport private data
84876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
84976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __always_inline void *
85076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansrp_transport_priv ( struct srp_device *srp ) {
85176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return ( ( void * ) srp->transport_priv );
85276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
85376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
85476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** SRP state flags */
85576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum srp_state {
85676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Underlying socket is open */
85776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	SRP_STATE_SOCKET_OPEN = 0x0001,
85876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Session is logged in */
85976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	SRP_STATE_LOGGED_IN = 0x0002,
86076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
86176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
86276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum number of SRP retry attempts */
86376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_MAX_RETRIES 3
86476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
86576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int srp_attach ( struct scsi_device *scsi, const char *root_path );
86676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern void srp_detach ( struct scsi_device *scsi );
86776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
86876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _GPXE_SRP_H */
869