xref: /openbmc/linux/include/scsi/fc/fc_fcp.h (revision f032c2f7cdaae0e8907cd3b26426fc651dc5c275)
1*f032c2f7SRobert Love /*
2*f032c2f7SRobert Love  * Copyright(c) 2007 Intel Corporation. All rights reserved.
3*f032c2f7SRobert Love  *
4*f032c2f7SRobert Love  * This program is free software; you can redistribute it and/or modify it
5*f032c2f7SRobert Love  * under the terms and conditions of the GNU General Public License,
6*f032c2f7SRobert Love  * version 2, as published by the Free Software Foundation.
7*f032c2f7SRobert Love  *
8*f032c2f7SRobert Love  * This program is distributed in the hope it will be useful, but WITHOUT
9*f032c2f7SRobert Love  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10*f032c2f7SRobert Love  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11*f032c2f7SRobert Love  * more details.
12*f032c2f7SRobert Love  *
13*f032c2f7SRobert Love  * You should have received a copy of the GNU General Public License along with
14*f032c2f7SRobert Love  * this program; if not, write to the Free Software Foundation, Inc.,
15*f032c2f7SRobert Love  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
16*f032c2f7SRobert Love  *
17*f032c2f7SRobert Love  * Maintained at www.Open-FCoE.org
18*f032c2f7SRobert Love  */
19*f032c2f7SRobert Love 
20*f032c2f7SRobert Love #ifndef _FC_FCP_H_
21*f032c2f7SRobert Love #define	_FC_FCP_H_
22*f032c2f7SRobert Love 
23*f032c2f7SRobert Love /*
24*f032c2f7SRobert Love  * Fibre Channel Protocol for SCSI.
25*f032c2f7SRobert Love  * From T10 FCP-3, T10 project 1560-D Rev 4, Sept. 13, 2005.
26*f032c2f7SRobert Love  */
27*f032c2f7SRobert Love 
28*f032c2f7SRobert Love /*
29*f032c2f7SRobert Love  * fc/fs.h defines FC_TYPE_FCP.
30*f032c2f7SRobert Love  */
31*f032c2f7SRobert Love 
32*f032c2f7SRobert Love /*
33*f032c2f7SRobert Love  * Service parameter page parameters (word 3 bits) for Process Login.
34*f032c2f7SRobert Love  */
35*f032c2f7SRobert Love #define	FCP_SPPF_TASK_RETRY_ID	0x0200	/* task retry ID requested */
36*f032c2f7SRobert Love #define	FCP_SPPF_RETRY		0x0100	/* retry supported */
37*f032c2f7SRobert Love #define	FCP_SPPF_CONF_COMPL	0x0080	/* confirmed completion allowed */
38*f032c2f7SRobert Love #define	FCP_SPPF_OVLY_ALLOW	0x0040	/* data overlay allowed */
39*f032c2f7SRobert Love #define	FCP_SPPF_INIT_FCN	0x0020	/* initiator function */
40*f032c2f7SRobert Love #define	FCP_SPPF_TARG_FCN	0x0010	/* target function */
41*f032c2f7SRobert Love #define	FCP_SPPF_RD_XRDY_DIS	0x0002	/* disable XFER_RDY for reads */
42*f032c2f7SRobert Love #define	FCP_SPPF_WR_XRDY_DIS	0x0001	/* disable XFER_RDY for writes */
43*f032c2f7SRobert Love 
44*f032c2f7SRobert Love /*
45*f032c2f7SRobert Love  * FCP_CMND IU Payload.
46*f032c2f7SRobert Love  */
47*f032c2f7SRobert Love struct fcp_cmnd {
48*f032c2f7SRobert Love 	__u8		fc_lun[8];	/* logical unit number */
49*f032c2f7SRobert Love 	__u8		fc_cmdref;	/* commmand reference number */
50*f032c2f7SRobert Love 	__u8		fc_pri_ta;	/* priority and task attribute */
51*f032c2f7SRobert Love 	__u8		fc_tm_flags;	/* task management flags */
52*f032c2f7SRobert Love 	__u8		fc_flags;	/* additional len & flags */
53*f032c2f7SRobert Love 	__u8		fc_cdb[16];	/* base CDB */
54*f032c2f7SRobert Love 	__be32		fc_dl;		/* data length (must follow fc_cdb) */
55*f032c2f7SRobert Love };
56*f032c2f7SRobert Love 
57*f032c2f7SRobert Love #define	FCP_CMND_LEN	32	/* expected length of structure */
58*f032c2f7SRobert Love 
59*f032c2f7SRobert Love struct fcp_cmnd32 {
60*f032c2f7SRobert Love 	__u8		fc_lun[8];	/* logical unit number */
61*f032c2f7SRobert Love 	__u8		fc_cmdref;	/* commmand reference number */
62*f032c2f7SRobert Love 	__u8		fc_pri_ta;	/* priority and task attribute */
63*f032c2f7SRobert Love 	__u8		fc_tm_flags;	/* task management flags */
64*f032c2f7SRobert Love 	__u8		fc_flags;	/* additional len & flags */
65*f032c2f7SRobert Love 	__u8		fc_cdb[32];	/* base CDB */
66*f032c2f7SRobert Love 	__be32		fc_dl;		/* data length (must follow fc_cdb) */
67*f032c2f7SRobert Love };
68*f032c2f7SRobert Love 
69*f032c2f7SRobert Love #define	FCP_CMND32_LEN	    48	/* expected length of structure */
70*f032c2f7SRobert Love #define	FCP_CMND32_ADD_LEN  (16 / 4)	/* Additional cdb length */
71*f032c2f7SRobert Love 
72*f032c2f7SRobert Love /*
73*f032c2f7SRobert Love  * fc_pri_ta.
74*f032c2f7SRobert Love  */
75*f032c2f7SRobert Love #define	FCP_PTA_SIMPLE	    0	/* simple task attribute */
76*f032c2f7SRobert Love #define	FCP_PTA_HEADQ	    1	/* head of queue task attribute */
77*f032c2f7SRobert Love #define	FCP_PTA_ORDERED     2	/* ordered task attribute */
78*f032c2f7SRobert Love #define	FCP_PTA_ACA	    4	/* auto. contigent allegiance */
79*f032c2f7SRobert Love #define	FCP_PRI_SHIFT	    3	/* priority field starts in bit 3 */
80*f032c2f7SRobert Love #define	FCP_PRI_RESVD_MASK  0x80	/* reserved bits in priority field */
81*f032c2f7SRobert Love 
82*f032c2f7SRobert Love /*
83*f032c2f7SRobert Love  * fc_tm_flags - task management flags field.
84*f032c2f7SRobert Love  */
85*f032c2f7SRobert Love #define	FCP_TMF_CLR_ACA		0x40	/* clear ACA condition */
86*f032c2f7SRobert Love #define	FCP_TMF_LUN_RESET	0x10	/* logical unit reset task management */
87*f032c2f7SRobert Love #define	FCP_TMF_CLR_TASK_SET	0x04	/* clear task set */
88*f032c2f7SRobert Love #define	FCP_TMF_ABT_TASK_SET	0x02	/* abort task set */
89*f032c2f7SRobert Love 
90*f032c2f7SRobert Love /*
91*f032c2f7SRobert Love  * fc_flags.
92*f032c2f7SRobert Love  *  Bits 7:2 are the additional FCP_CDB length / 4.
93*f032c2f7SRobert Love  */
94*f032c2f7SRobert Love #define	FCP_CFL_LEN_MASK	0xfc	/* mask for additional length */
95*f032c2f7SRobert Love #define	FCP_CFL_LEN_SHIFT	2	/* shift bits for additional length */
96*f032c2f7SRobert Love #define	FCP_CFL_RDDATA		0x02	/* read data */
97*f032c2f7SRobert Love #define	FCP_CFL_WRDATA		0x01	/* write data */
98*f032c2f7SRobert Love 
99*f032c2f7SRobert Love /*
100*f032c2f7SRobert Love  * FCP_TXRDY IU - transfer ready payload.
101*f032c2f7SRobert Love  */
102*f032c2f7SRobert Love struct fcp_txrdy {
103*f032c2f7SRobert Love 	__be32		ft_data_ro;	/* data relative offset */
104*f032c2f7SRobert Love 	__be32		ft_burst_len;	/* burst length */
105*f032c2f7SRobert Love 	__u8		_ft_resvd[4];	/* reserved */
106*f032c2f7SRobert Love };
107*f032c2f7SRobert Love 
108*f032c2f7SRobert Love #define	FCP_TXRDY_LEN	12	/* expected length of structure */
109*f032c2f7SRobert Love 
110*f032c2f7SRobert Love /*
111*f032c2f7SRobert Love  * FCP_RESP IU - response payload.
112*f032c2f7SRobert Love  *
113*f032c2f7SRobert Love  * The response payload comes in three parts: the flags/status, the
114*f032c2f7SRobert Love  * sense/response lengths and the sense data/response info section.
115*f032c2f7SRobert Love  *
116*f032c2f7SRobert Love  * From FCP3r04, note 6 of section 9.5.13:
117*f032c2f7SRobert Love  *
118*f032c2f7SRobert Love  * Some early implementations presented the FCP_RSP IU without the FCP_RESID,
119*f032c2f7SRobert Love  * FCP_SNS_LEN, and FCP_RSP_LEN fields if the FCP_RESID_UNDER, FCP_RESID_OVER,
120*f032c2f7SRobert Love  * FCP_SNS_LEN_VALID, and FCP_RSP_LEN_VALID bits were all set to zero. This
121*f032c2f7SRobert Love  * non-standard behavior should be tolerated.
122*f032c2f7SRobert Love  *
123*f032c2f7SRobert Love  * All response frames will always contain the fcp_resp template.  Some
124*f032c2f7SRobert Love  * will also include the fcp_resp_len template.
125*f032c2f7SRobert Love  */
126*f032c2f7SRobert Love struct fcp_resp {
127*f032c2f7SRobert Love 	__u8		_fr_resvd[8];	/* reserved */
128*f032c2f7SRobert Love 	__be16		fr_retry_delay;	/* retry delay timer */
129*f032c2f7SRobert Love 	__u8		fr_flags;	/* flags */
130*f032c2f7SRobert Love 	__u8		fr_status;	/* SCSI status code */
131*f032c2f7SRobert Love };
132*f032c2f7SRobert Love 
133*f032c2f7SRobert Love #define	FCP_RESP_LEN	12	/* expected length of structure */
134*f032c2f7SRobert Love 
135*f032c2f7SRobert Love struct fcp_resp_ext {
136*f032c2f7SRobert Love 	__be32		fr_resid;	/* Residual value */
137*f032c2f7SRobert Love 	__be32		fr_sns_len;	/* SCSI Sense length */
138*f032c2f7SRobert Love 	__be32		fr_rsp_len;	/* Response Info length */
139*f032c2f7SRobert Love 
140*f032c2f7SRobert Love 	/*
141*f032c2f7SRobert Love 	 * Optionally followed by RSP info and/or SNS info and/or
142*f032c2f7SRobert Love 	 * bidirectional read residual length, if any.
143*f032c2f7SRobert Love 	 */
144*f032c2f7SRobert Love };
145*f032c2f7SRobert Love 
146*f032c2f7SRobert Love #define FCP_RESP_EXT_LEN    12  /* expected length of the structure */
147*f032c2f7SRobert Love 
148*f032c2f7SRobert Love struct fcp_resp_rsp_info {
149*f032c2f7SRobert Love     __u8      _fr_resvd[3];       /* reserved */
150*f032c2f7SRobert Love     __u8      rsp_code;           /* Response Info Code */
151*f032c2f7SRobert Love     __u8      _fr_resvd2[4];      /* reserved */
152*f032c2f7SRobert Love };
153*f032c2f7SRobert Love 
154*f032c2f7SRobert Love struct fcp_resp_with_ext {
155*f032c2f7SRobert Love 	struct fcp_resp resp;
156*f032c2f7SRobert Love 	struct fcp_resp_ext ext;
157*f032c2f7SRobert Love };
158*f032c2f7SRobert Love 
159*f032c2f7SRobert Love #define	FCP_RESP_WITH_EXT   (FCP_RESP_LEN + FCP_RESP_EXT_LEN)
160*f032c2f7SRobert Love 
161*f032c2f7SRobert Love /*
162*f032c2f7SRobert Love  * fr_flags.
163*f032c2f7SRobert Love  */
164*f032c2f7SRobert Love #define	FCP_BIDI_RSP	    0x80	/* bidirectional read response */
165*f032c2f7SRobert Love #define	FCP_BIDI_READ_UNDER 0x40	/* bidir. read less than requested */
166*f032c2f7SRobert Love #define	FCP_BIDI_READ_OVER  0x20	/* DL insufficient for full transfer */
167*f032c2f7SRobert Love #define	FCP_CONF_REQ	    0x10	/* confirmation requested */
168*f032c2f7SRobert Love #define	FCP_RESID_UNDER     0x08	/* transfer shorter than expected */
169*f032c2f7SRobert Love #define	FCP_RESID_OVER	    0x04	/* DL insufficient for full transfer */
170*f032c2f7SRobert Love #define	FCP_SNS_LEN_VAL     0x02	/* SNS_LEN field is valid */
171*f032c2f7SRobert Love #define	FCP_RSP_LEN_VAL     0x01	/* RSP_LEN field is valid */
172*f032c2f7SRobert Love 
173*f032c2f7SRobert Love /*
174*f032c2f7SRobert Love  * rsp_codes
175*f032c2f7SRobert Love  */
176*f032c2f7SRobert Love enum fcp_resp_rsp_codes {
177*f032c2f7SRobert Love 	FCP_TMF_CMPL = 0,
178*f032c2f7SRobert Love 	FCP_DATA_LEN_INVALID = 1,
179*f032c2f7SRobert Love 	FCP_CMND_FIELDS_INVALID = 2,
180*f032c2f7SRobert Love 	FCP_DATA_PARAM_MISMATCH = 3,
181*f032c2f7SRobert Love 	FCP_TMF_REJECTED = 4,
182*f032c2f7SRobert Love 	FCP_TMF_FAILED = 5,
183*f032c2f7SRobert Love 	FCP_TMF_INVALID_LUN = 9,
184*f032c2f7SRobert Love };
185*f032c2f7SRobert Love 
186*f032c2f7SRobert Love /*
187*f032c2f7SRobert Love  * FCP SRR Link Service request - Sequence Retransmission Request.
188*f032c2f7SRobert Love  */
189*f032c2f7SRobert Love struct fcp_srr {
190*f032c2f7SRobert Love 	__u8		srr_op;		/* opcode ELS_SRR */
191*f032c2f7SRobert Love 	__u8		srr_resvd[3];	/* opcode / reserved - must be zero */
192*f032c2f7SRobert Love 	__be16		srr_ox_id;	/* OX_ID of failed command */
193*f032c2f7SRobert Love 	__be16		srr_rx_id;	/* RX_ID of failed command */
194*f032c2f7SRobert Love 	__be32		srr_rel_off;	/* relative offset */
195*f032c2f7SRobert Love 	__u8		srr_r_ctl;	/* r_ctl for the information unit */
196*f032c2f7SRobert Love 	__u8		srr_resvd2[3];	/* reserved */
197*f032c2f7SRobert Love };
198*f032c2f7SRobert Love 
199*f032c2f7SRobert Love #endif /* _FC_FCP_H_ */
200