1 /* $NetBSD: isp_stds.h,v 1.6 2021/12/12 09:00:07 andvar Exp $ */
2 /*-
3  *  Copyright (c) 1997-2008 by Matthew Jacob
4  *  All rights reserved.
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions
8  *  are met:
9  *
10  *  1. Redistributions of source code must retain the above copyright
11  *     notice, this list of conditions and the following disclaimer.
12  *  2. Redistributions in binary form must reproduce the above copyright
13  *     notice, this list of conditions and the following disclaimer in the
14  *     documentation and/or other materials provided with the distribution.
15  *
16  *  THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *  ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
20  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  *  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  *  SUCH DAMAGE.
27  *
28  *
29  *  Matthew Jacob
30  *  Feral Software
31  *  421 Laurel Avenue
32  *  Menlo Park, CA 94025
33  *  USA
34  *
35  *  gplbsd at feral com
36  */
37 /*
38  * Structures that derive directly from public standards.
39  */
40 #ifndef   _ISP_STDS_H
41 #define   _ISP_STDS_H
42 
43 /*
44  * FC Frame Header
45  *
46  * Source: dpANS-X3.xxx-199x, section 18 (AKA FC-PH-2)
47  *
48  */
49 typedef struct {
50           uint8_t             r_ctl;
51           uint8_t             d_id[3];
52           uint8_t             cs_ctl;
53           uint8_t             s_id[3];
54           uint8_t             type;
55           uint8_t             f_ctl[3];
56           uint8_t             seq_id;
57           uint8_t             df_ctl;
58           uint16_t  seq_cnt;
59           uint16_t  ox_id;
60           uint16_t  rx_id;
61           uint32_t  parameter;
62 } fc_hdr_t;
63 
64 /*
65  * FCP_CMND_IU Payload
66  *
67  * Source: NICTS T10, Project 1144D, Revision 07a, Section 9 (AKA fcp2-r07a)
68  *
69  * Notes:
70  *        When additional cdb length is defined in fcp_cmnd_alen_datadir,
71  *        bits 2..7, the actual cdb length is 16 + ((fcp_cmnd_alen_datadir>>2)*4),
72  *        with the datalength following in MSB format just after.
73  */
74 typedef struct {
75           uint8_t             fcp_cmnd_lun[8];
76           uint8_t             fcp_cmnd_crn;
77           uint8_t             fcp_cmnd_task_attribute;
78           uint8_t             fcp_cmnd_task_management;
79           uint8_t             fcp_cmnd_alen_datadir;
80           union {
81                     struct {
82                               uint8_t             fcp_cmnd_cdb[16];
83                               uint32_t  fcp_cmnd_dl;
84                     } sf;
85                     struct {
86                               uint8_t             fcp_cmnd_cdb[1];
87                     } lf;
88           } cdb_dl;
89 } fcp_cmnd_iu_t;
90 
91 
92 #define   FCP_CMND_TASK_ATTR_SIMPLE     0x00
93 #define   FCP_CMND_TASK_ATTR_HEAD                 0x01
94 #define   FCP_CMND_TASK_ATTR_ORDERED    0x02
95 #define   FCP_CMND_TASK_ATTR_ACA                  0x04
96 #define   FCP_CMND_TASK_ATTR_UNTAGGED   0x05
97 #define   FCP_CMND_TASK_ATTR_MASK                 0x07
98 
99 #define   FCP_CMND_ADDTL_CDBLEN_SHIFT   2
100 
101 #define   FCP_CMND_DATA_WRITE           0x01
102 #define   FCP_CMND_DATA_READ            0x02
103 
104 #define   FCP_CMND_DATA_DIR_MASK                  0x03
105 
106 #define   FCP_CMND_TMF_CLEAR_ACA                  0x40
107 #define   FCP_CMND_TMF_TGT_RESET                  0x20
108 #define   FCP_CMND_TMF_LUN_RESET                  0x10
109 #define   FCP_CMND_TMF_CLEAR_TASK_SET   0x04
110 #define   FCP_CMND_TMF_ABORT_TASK_SET   0x02
111 
112 /*
113  * Basic CT IU Header
114  *
115  * Source: X3.288-199x Generic Services 2 Rev 5.3 (FC-GS-2) Section 4.3.1
116  */
117 
118 typedef struct {
119           uint8_t             ct_revision;
120           uint8_t             ct_in_id[3];
121           uint8_t             ct_fcs_type;
122           uint8_t             ct_fcs_subtype;
123           uint8_t             ct_options;
124           uint8_t             ct_reserved0;
125           uint16_t  ct_cmd_resp;
126           uint16_t  ct_bcnt_resid;
127           uint8_t             ct_reserved1;
128           uint8_t             ct_reason;
129           uint8_t             ct_explanation;
130           uint8_t             ct_vunique;
131 } ct_hdr_t;
132 #define   CT_REVISION                   1
133 #define   CT_FC_TYPE_FC                 0xFC
134 #define CT_FC_SUBTYPE_NS      0x02
135 
136 /*
137  * RFT_ID Request CT_IU
138  *
139  * Source: NCITS xxx-200x Generic Services- 5 Rev 8.5 Section 5.2.5.30
140  */
141 typedef struct {
142           ct_hdr_t  rftid_hdr;
143           uint8_t             rftid_reserved;
144           uint8_t             rftid_portid[3];
145           uint32_t  rftid_fc4types[8];
146 } rft_id_t;
147 
148 /*
149  * FCP Response IU Bits of interest
150  * Source: NCITS T10, Project 1144D, Revision 08 (aka FCP2r08)
151  */
152 #define   FCP_CONF_REQ                            0x10
153 #define   FCP_RESID_UNDERFLOW           0x08
154 #define   FCP_RESID_OVERFLOW            0x04
155 #define   FCP_SNSLEN_VALID              0x02
156 #define   FCP_RSPLEN_VALID              0x01
157 
158 #define FCP_MAX_RSPLEN                            0x08
159 /*
160  * FCP Response Code Definitions
161  * Source: NCITS T10, Project 1144D, Revision 08 (aka FCP2r08)
162  */
163 #define   FCP_RSPNS_CODE_OFFSET                   3
164 
165 #define   FCP_RSPNS_TMF_DONE            0
166 #define   FCP_RSPNS_DLBRSTX             1
167 #define   FCP_RSPNS_BADCMND             2
168 #define   FCP_RSPNS_EROFS                         3
169 #define   FCP_RSPNS_TMF_REJECT                    4
170 #define   FCP_RSPNS_TMF_FAILED                    5
171 #define   FCP_RSPNS_TMF_SUCCEEDED                 8
172 #define   FCP_RSPNS_TMF_INCORRECT_LUN   9
173 
174 
175 /* unconverted miscellany */
176 /*
177  * Basic FC Link Service defines
178  */
179 /*
180  * These are in the R_CTL field.
181  */
182 #define   ABTS                          0x81
183 #define   BA_ACC                        0x84      /* of ABORT SEQUENCE */
184 #define   BA_RJT                        0x85      /* of ABORT SEQUENCE */
185 
186 /*
187  * Link Service Accept/Reject
188  */
189 #define   LS_ACC                        0x8002
190 #define   LS_RJT                        0x8001
191 
192 /*
193  * FC ELS Codes- bits 31-24 of the first payload word of an ELS frame.
194  */
195 #define   PLOGI                         0x03
196 #define   FLOGI                         0x04
197 #define   LOGO                          0x05
198 #define   ABTX                          0x06
199 #define   PRLI                          0x20
200 #define   PRLO                          0x21
201 #define   SCN                           0x22
202 #define   TPRLO                         0x24
203 #define   PDISC                         0x50
204 #define   ADISC                         0x52
205 #define   RNC                           0x53
206 
207 /*
208  * FC4 defines
209  */
210 #define   FC4_IP              5         /* ISO/EEC 8802-2 LLC/SNAP */
211 #define   FC4_SCSI  8         /* SCSI-3 via Fibre Channel Protocol (FCP) */
212 #define   FC4_FC_SVC          0x20      /* Fibre Channel Services */
213 
214 #ifndef   MSG_ABORT
215 #define   MSG_ABORT           0x06
216 #endif
217 #ifndef   MSG_BUS_DEV_RESET
218 #define   MSG_BUS_DEV_RESET   0x0c
219 #endif
220 #ifndef   MSG_ABORT_TAG
221 #define   MSG_ABORT_TAG                 0x0d
222 #endif
223 #ifndef   MSG_CLEAR_QUEUE
224 #define   MSG_CLEAR_QUEUE               0x0e
225 #endif
226 #ifndef   MSG_REL_RECOVERY
227 #define   MSG_REL_RECOVERY    0x10
228 #endif
229 #ifndef   MSG_TERM_IO_PROC
230 #define   MSG_TERM_IO_PROC    0x11
231 #endif
232 #ifndef   MSG_LUN_RESET
233 #define   MSG_LUN_RESET                 0x17
234 #endif
235 
236 #endif    /* _ISP_STDS_H */
237