xref: /freebsd/sys/cam/scsi/smp_all.h (revision 06e794928b98592d189ecfdf60b8dedcc5a475dc)
1*06e79492SKenneth D. Merry /*-
2*06e79492SKenneth D. Merry  * Copyright (c) 2010 Spectra Logic Corporation
3*06e79492SKenneth D. Merry  * All rights reserved.
4*06e79492SKenneth D. Merry  *
5*06e79492SKenneth D. Merry  * Redistribution and use in source and binary forms, with or without
6*06e79492SKenneth D. Merry  * modification, are permitted provided that the following conditions
7*06e79492SKenneth D. Merry  * are met:
8*06e79492SKenneth D. Merry  * 1. Redistributions of source code must retain the above copyright
9*06e79492SKenneth D. Merry  *    notice, this list of conditions, and the following disclaimer,
10*06e79492SKenneth D. Merry  *    without modification.
11*06e79492SKenneth D. Merry  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12*06e79492SKenneth D. Merry  *    substantially similar to the "NO WARRANTY" disclaimer below
13*06e79492SKenneth D. Merry  *    ("Disclaimer") and any redistribution must be conditioned upon
14*06e79492SKenneth D. Merry  *    including a substantially similar Disclaimer requirement for further
15*06e79492SKenneth D. Merry  *    binary redistribution.
16*06e79492SKenneth D. Merry  *
17*06e79492SKenneth D. Merry  * NO WARRANTY
18*06e79492SKenneth D. Merry  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19*06e79492SKenneth D. Merry  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20*06e79492SKenneth D. Merry  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
21*06e79492SKenneth D. Merry  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22*06e79492SKenneth D. Merry  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23*06e79492SKenneth D. Merry  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24*06e79492SKenneth D. Merry  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25*06e79492SKenneth D. Merry  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26*06e79492SKenneth D. Merry  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27*06e79492SKenneth D. Merry  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*06e79492SKenneth D. Merry  * POSSIBILITY OF SUCH DAMAGES.
29*06e79492SKenneth D. Merry  *
30*06e79492SKenneth D. Merry  * $Id: //depot/users/kenm/FreeBSD-test/sys/cam/scsi/smp_all.h#4 $
31*06e79492SKenneth D. Merry  * $FreeBSD$
32*06e79492SKenneth D. Merry  */
33*06e79492SKenneth D. Merry 
34*06e79492SKenneth D. Merry /*
35*06e79492SKenneth D. Merry  * Serial Management Protocol definitions.
36*06e79492SKenneth D. Merry  */
37*06e79492SKenneth D. Merry 
38*06e79492SKenneth D. Merry #ifndef	_SCSI_SMP_ALL_H
39*06e79492SKenneth D. Merry #define	_SCSI_SMP_ALL_H	1
40*06e79492SKenneth D. Merry 
41*06e79492SKenneth D. Merry #define	SMP_FRAME_TYPE_REQUEST	0x40
42*06e79492SKenneth D. Merry #define	SMP_FRAME_TYPE_RESPONSE	0x41
43*06e79492SKenneth D. Merry #define	SMP_WORD_LEN		4
44*06e79492SKenneth D. Merry #define	SMP_CRC_LEN		4
45*06e79492SKenneth D. Merry 
46*06e79492SKenneth D. Merry /*
47*06e79492SKenneth D. Merry  * SMP Functions (current as of SPL Revision 7)
48*06e79492SKenneth D. Merry  */
49*06e79492SKenneth D. Merry /* 0x00 to 0x7f: SMP input functions */
50*06e79492SKenneth D. Merry /* 0x00 to 0x0f: General SMP input functions */
51*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_GENERAL		0x00
52*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_MANUF_INFO	0x01
53*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_SC_STATUS	0x03
54*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_ZONE_PERM_TBL	0x04
55*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_ZONE_MAN_PWD	0x05
56*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_BROADCAST	0x06
57*06e79492SKenneth D. Merry 
58*06e79492SKenneth D. Merry /* 0x10 to 0x1f: Phy-based SMP input functions */
59*06e79492SKenneth D. Merry #define	SMP_FUNC_DISCOVER		0x10
60*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_PHY_ERR_LOG	0x11
61*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_PHY_SATA	0x12
62*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_ROUTE_INFO	0x13
63*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_PHY_EVENT	0x14
64*06e79492SKenneth D. Merry 
65*06e79492SKenneth D. Merry /* 0x20 to 0x2f: Descriptor list-based SMP input functions */
66*06e79492SKenneth D. Merry #define	SMP_FUNC_DISCOVER_LIST		0x20
67*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_PHY_EVENT_LIST	0x21
68*06e79492SKenneth D. Merry #define	SMP_FUNC_REPORT_EXP_RTL		0x22
69*06e79492SKenneth D. Merry 
70*06e79492SKenneth D. Merry /* 0x30 to 0x3f: Reserved for SMP input functions */
71*06e79492SKenneth D. Merry /* 0x40 to 0x7f: Vendor specific */
72*06e79492SKenneth D. Merry 
73*06e79492SKenneth D. Merry /* 0x80 to 0xff: SMP output functions */
74*06e79492SKenneth D. Merry /* 0x80 to 0x8f: General SMP output functions */
75*06e79492SKenneth D. Merry #define	SMP_FUNC_CONFIG_GENERAL		0x80
76*06e79492SKenneth D. Merry #define	SMP_FUNC_ENABLE_DISABLE_ZONING	0x81
77*06e79492SKenneth D. Merry #define	SMP_FUNC_ZONED_BROADCAST	0x85
78*06e79492SKenneth D. Merry #define	SMP_FUNC_ZONE_LOCK		0x86
79*06e79492SKenneth D. Merry #define	SMP_FUNC_ZONE_ACTIVATE		0x87
80*06e79492SKenneth D. Merry #define	SMP_FUNC_ZONE_UNLOCK		0x88
81*06e79492SKenneth D. Merry #define	SMP_FUNC_CONFIG_ZM_PWD		0x89
82*06e79492SKenneth D. Merry #define	SMP_FUNC_CONFIG_ZONE_PHY_INFO	0x8a
83*06e79492SKenneth D. Merry #define	SMP_FUNC_CONFIG_ZONE_PERM_TBL	0x8b
84*06e79492SKenneth D. Merry 
85*06e79492SKenneth D. Merry /* 0x90 to 0x9f: Phy-based SMP output functions */
86*06e79492SKenneth D. Merry #define	SMP_FUNC_CONFIG_ROUTE_INFO	0x90
87*06e79492SKenneth D. Merry #define	SMP_FUNC_PHY_CONTROL		0x91
88*06e79492SKenneth D. Merry #define	SMP_FUNC_PHY_TEST_FUNC		0x92
89*06e79492SKenneth D. Merry #define	SMP_FUNC_CONFIG_PHY_EVENT	0x93
90*06e79492SKenneth D. Merry 
91*06e79492SKenneth D. Merry /* 0xa0 to 0xbf: Reserved for SMP output functions */
92*06e79492SKenneth D. Merry /* 0xc0 to 0xff: Vendor specific */
93*06e79492SKenneth D. Merry 
94*06e79492SKenneth D. Merry /*
95*06e79492SKenneth D. Merry  * Function Results (current as of SPL Revision 7)
96*06e79492SKenneth D. Merry  */
97*06e79492SKenneth D. Merry #define	SMP_FR_ACCEPTED			0x00
98*06e79492SKenneth D. Merry #define	SMP_FR_UNKNOWN_FUNC		0x01
99*06e79492SKenneth D. Merry #define	SMP_FR_FUNCTION_FAILED		0x02
100*06e79492SKenneth D. Merry #define	SMP_FR_INVALID_REQ_FRAME_LEN	0x03
101*06e79492SKenneth D. Merry #define	SMP_FR_INVALID_EXP_CHG_CNT	0x04
102*06e79492SKenneth D. Merry #define	SMP_FR_BUSY			0x05
103*06e79492SKenneth D. Merry #define	SMP_FR_INCOMPLETE_DESC_LIST	0x06
104*06e79492SKenneth D. Merry #define	SMP_FR_PHY_DOES_NOT_EXIST	0x10
105*06e79492SKenneth D. Merry #define	SMP_FR_INDEX_DOES_NOT_EXIST	0x11
106*06e79492SKenneth D. Merry #define	SMP_FR_PHY_DOES_NOT_SUP_SATA	0x12
107*06e79492SKenneth D. Merry #define	SMP_FR_UNKNOWN_PHY_OP		0x13
108*06e79492SKenneth D. Merry #define	SMP_FR_UNKNOWN_PHY_TEST_FUNC	0x14
109*06e79492SKenneth D. Merry #define	SMP_FR_PHY_TEST_FUNC_INPROG	0x15
110*06e79492SKenneth D. Merry #define	SMP_FR_PHY_VACANT		0x16
111*06e79492SKenneth D. Merry #define	SMP_FR_UNKNOWN_PHY_EVENT_SRC	0x17
112*06e79492SKenneth D. Merry #define	SMP_FR_UNKNOWN_DESC_TYPE	0x18
113*06e79492SKenneth D. Merry #define	SMP_FR_UNKNOWN_PHY_FILTER	0x19
114*06e79492SKenneth D. Merry #define	SMP_FR_AFFILIATION_VIOLATION	0x1a
115*06e79492SKenneth D. Merry #define	SMP_FR_SMP_ZONE_VIOLATION	0x20
116*06e79492SKenneth D. Merry #define	SMP_FR_NO_MGMT_ACCESS_RIGHTS	0x21
117*06e79492SKenneth D. Merry #define	SMP_FR_UNKNOWN_ED_ZONING_VAL	0x22
118*06e79492SKenneth D. Merry #define	SMP_FR_ZONE_LOCK_VIOLATION	0x23
119*06e79492SKenneth D. Merry #define	SMP_FR_NOT_ACTIVATED		0x24
120*06e79492SKenneth D. Merry #define	SMP_FR_ZG_OUT_OF_RANGE		0x25
121*06e79492SKenneth D. Merry #define	SMP_FR_NO_PHYS_PRESENCE		0x26
122*06e79492SKenneth D. Merry #define	SMP_FR_SAVING_NOT_SUP		0x27
123*06e79492SKenneth D. Merry #define	SMP_FR_SRC_ZONE_DNE		0x28
124*06e79492SKenneth D. Merry #define	SMP_FR_DISABLED_PWD_NOT_SUP	0x29
125*06e79492SKenneth D. Merry 
126*06e79492SKenneth D. Merry /*
127*06e79492SKenneth D. Merry  * REPORT GENERAL request and response, current as of SPL Revision 7.
128*06e79492SKenneth D. Merry  */
129*06e79492SKenneth D. Merry struct smp_report_general_request
130*06e79492SKenneth D. Merry {
131*06e79492SKenneth D. Merry 	uint8_t	frame_type;
132*06e79492SKenneth D. Merry 	uint8_t	function;
133*06e79492SKenneth D. Merry 	uint8_t	response_len;
134*06e79492SKenneth D. Merry 	uint8_t	request_len;
135*06e79492SKenneth D. Merry 	uint8_t	crc[4];
136*06e79492SKenneth D. Merry };
137*06e79492SKenneth D. Merry 
138*06e79492SKenneth D. Merry struct smp_report_general_response
139*06e79492SKenneth D. Merry {
140*06e79492SKenneth D. Merry 	uint8_t	frame_type;
141*06e79492SKenneth D. Merry 	uint8_t	function;
142*06e79492SKenneth D. Merry 	uint8_t	function_result;
143*06e79492SKenneth D. Merry 	uint8_t	response_len;
144*06e79492SKenneth D. Merry #define	SMP_RG_RESPONSE_LEN		0x11
145*06e79492SKenneth D. Merry 	uint8_t	expander_change_count[2];
146*06e79492SKenneth D. Merry 	uint8_t	expander_route_indexes[2];
147*06e79492SKenneth D. Merry 	uint8_t	long_response;
148*06e79492SKenneth D. Merry #define	SMP_RG_LONG_RESPONSE		0x80
149*06e79492SKenneth D. Merry 	uint8_t	num_phys;
150*06e79492SKenneth D. Merry 	uint8_t	config_bits0;
151*06e79492SKenneth D. Merry #define	SMP_RG_TABLE_TO_TABLE_SUP	0x80
152*06e79492SKenneth D. Merry #define	SMP_RG_ZONE_CONFIGURING		0x40
153*06e79492SKenneth D. Merry #define	SMP_RG_SELF_CONFIGURING		0x20
154*06e79492SKenneth D. Merry #define	SMP_RG_STP_CONTINUE_AWT		0x10
155*06e79492SKenneth D. Merry #define	SMP_RG_OPEN_REJECT_RETRY_SUP	0x08
156*06e79492SKenneth D. Merry #define	SMP_RG_CONFIGURES_OTHERS	0x04
157*06e79492SKenneth D. Merry #define	SMP_RG_CONFIGURING		0x02
158*06e79492SKenneth D. Merry #define	SMP_RG_EXT_CONFIG_ROUTE_TABLE	0x01
159*06e79492SKenneth D. Merry 	uint8_t	reserved0;
160*06e79492SKenneth D. Merry 	uint8_t	encl_logical_id[8];
161*06e79492SKenneth D. Merry 	uint8_t	reserved1[8];
162*06e79492SKenneth D. Merry 	uint8_t	reserved2[2];
163*06e79492SKenneth D. Merry 	uint8_t	stp_bus_inact_time_limit[2];
164*06e79492SKenneth D. Merry 	uint8_t	stp_max_conn_time_limit[2];
165*06e79492SKenneth D. Merry 	uint8_t	stp_smp_it_nexus_loss_time[2];
166*06e79492SKenneth D. Merry 	uint8_t	config_bits1;
167*06e79492SKenneth D. Merry #define	SMP_RG_NUM_ZONE_GROUPS_MASK	0xc0
168*06e79492SKenneth D. Merry #define	SMP_RG_NUM_ZONE_GROUPS_SHIFT	6
169*06e79492SKenneth D. Merry #define	SMP_RG_ZONE_LOCKED		0x10
170*06e79492SKenneth D. Merry #define	SMP_RG_PP_SUPPORTED		0x08
171*06e79492SKenneth D. Merry #define	SMP_RG_PP_ASSERTED		0x04
172*06e79492SKenneth D. Merry #define	SMP_RG_ZONING_SUPPORTED		0x02
173*06e79492SKenneth D. Merry #define	SMP_RG_ZONING_ENABLED		0x01
174*06e79492SKenneth D. Merry 	uint8_t	config_bits2;
175*06e79492SKenneth D. Merry #define	SMP_RG_SAVING			0x10
176*06e79492SKenneth D. Merry #define	SMP_RG_SAVING_ZM_PWD_SUP	0x08
177*06e79492SKenneth D. Merry #define	SMP_RG_SAVING_PHY_INFO_SUP	0x04
178*06e79492SKenneth D. Merry #define	SMP_RG_SAVING_ZPERM_TAB_SUP	0x02
179*06e79492SKenneth D. Merry #define	SMP_RG_SAVING_ZENABLED_SUP	0x01
180*06e79492SKenneth D. Merry 	uint8_t	max_num_routed_addrs[2];
181*06e79492SKenneth D. Merry 	uint8_t	active_zm_address[8];
182*06e79492SKenneth D. Merry 	uint8_t	zone_lock_inact_time_limit[2];
183*06e79492SKenneth D. Merry 	uint8_t	reserved3[2];
184*06e79492SKenneth D. Merry 	uint8_t	reserved4;
185*06e79492SKenneth D. Merry 	uint8_t	first_encl_conn_el_index;
186*06e79492SKenneth D. Merry 	uint8_t	num_encl_conn_el_indexes;
187*06e79492SKenneth D. Merry 	uint8_t	reserved5;
188*06e79492SKenneth D. Merry 	uint8_t	reduced_functionality;
189*06e79492SKenneth D. Merry #define	SMP_RG_REDUCED_FUNCTIONALITY	0x80
190*06e79492SKenneth D. Merry 	uint8_t	time_to_reduced_func;
191*06e79492SKenneth D. Merry 	uint8_t	initial_time_to_reduced_func;
192*06e79492SKenneth D. Merry 	uint8_t	max_reduced_func_time;
193*06e79492SKenneth D. Merry 	uint8_t	last_sc_stat_desc_index[2];
194*06e79492SKenneth D. Merry 	uint8_t	max_sc_stat_descs[2];
195*06e79492SKenneth D. Merry 	uint8_t	last_phy_evl_desc_index[2];
196*06e79492SKenneth D. Merry 	uint8_t	max_stored_pel_descs[2];
197*06e79492SKenneth D. Merry 	uint8_t	stp_reject_to_open_limit[2];
198*06e79492SKenneth D. Merry 	uint8_t	reserved6[2];
199*06e79492SKenneth D. Merry 	uint8_t	crc[4];
200*06e79492SKenneth D. Merry };
201*06e79492SKenneth D. Merry 
202*06e79492SKenneth D. Merry /*
203*06e79492SKenneth D. Merry  * REPORT MANUFACTURER INFORMATION request and response, current as of SPL
204*06e79492SKenneth D. Merry  * Revision 7.
205*06e79492SKenneth D. Merry  */
206*06e79492SKenneth D. Merry struct smp_report_manuf_info_request
207*06e79492SKenneth D. Merry {
208*06e79492SKenneth D. Merry 	uint8_t	frame_type;
209*06e79492SKenneth D. Merry 	uint8_t	function;
210*06e79492SKenneth D. Merry 	uint8_t	response_len;
211*06e79492SKenneth D. Merry 	uint8_t	request_len;
212*06e79492SKenneth D. Merry #define	SMP_RMI_REQUEST_LEN		0x00
213*06e79492SKenneth D. Merry 	uint8_t	crc[4];
214*06e79492SKenneth D. Merry };
215*06e79492SKenneth D. Merry 
216*06e79492SKenneth D. Merry struct smp_report_manuf_info_response
217*06e79492SKenneth D. Merry {
218*06e79492SKenneth D. Merry 	uint8_t	frame_type;
219*06e79492SKenneth D. Merry 	uint8_t	function;
220*06e79492SKenneth D. Merry 	uint8_t	function_result;
221*06e79492SKenneth D. Merry 	uint8_t	response_len;
222*06e79492SKenneth D. Merry #define	SMP_RMI_RESPONSE_LEN		0x0e
223*06e79492SKenneth D. Merry 	uint8_t	expander_change_count[2];
224*06e79492SKenneth D. Merry 	uint8_t	reserved0[2];
225*06e79492SKenneth D. Merry 	uint8_t	sas_11_format;
226*06e79492SKenneth D. Merry #define	SMP_RMI_SAS11_FORMAT		0x01
227*06e79492SKenneth D. Merry 	uint8_t	reserved1[3];
228*06e79492SKenneth D. Merry 	uint8_t	vendor[8];
229*06e79492SKenneth D. Merry 	uint8_t	product[16];
230*06e79492SKenneth D. Merry 	uint8_t	revision[4];
231*06e79492SKenneth D. Merry 	uint8_t	comp_vendor[8];
232*06e79492SKenneth D. Merry 	uint8_t	comp_id[2];
233*06e79492SKenneth D. Merry 	uint8_t	comp_revision;
234*06e79492SKenneth D. Merry 	uint8_t	reserved2;
235*06e79492SKenneth D. Merry 	uint8_t	vendor_specific[8];
236*06e79492SKenneth D. Merry 	uint8_t	crc[4];
237*06e79492SKenneth D. Merry };
238*06e79492SKenneth D. Merry 
239*06e79492SKenneth D. Merry /*
240*06e79492SKenneth D. Merry  * DISCOVER request and response, current as of SPL Revision 7.
241*06e79492SKenneth D. Merry  */
242*06e79492SKenneth D. Merry struct smp_discover_request
243*06e79492SKenneth D. Merry {
244*06e79492SKenneth D. Merry 	uint8_t	frame_type;
245*06e79492SKenneth D. Merry 	uint8_t	function;
246*06e79492SKenneth D. Merry 	uint8_t response_len;
247*06e79492SKenneth D. Merry 	uint8_t request_len;
248*06e79492SKenneth D. Merry #define	SMP_DIS_REQUEST_LEN		0x02
249*06e79492SKenneth D. Merry 	uint8_t reserved0[4];
250*06e79492SKenneth D. Merry 	uint8_t	ignore_zone_group;
251*06e79492SKenneth D. Merry #define	SMP_DIS_IGNORE_ZONE_GROUP	0x01
252*06e79492SKenneth D. Merry 	uint8_t	phy;
253*06e79492SKenneth D. Merry 	uint8_t	reserved1[2];
254*06e79492SKenneth D. Merry 	uint8_t	crc[4];
255*06e79492SKenneth D. Merry };
256*06e79492SKenneth D. Merry 
257*06e79492SKenneth D. Merry struct smp_discover_response
258*06e79492SKenneth D. Merry {
259*06e79492SKenneth D. Merry 	uint8_t	frame_type;
260*06e79492SKenneth D. Merry 	uint8_t	function;
261*06e79492SKenneth D. Merry 	uint8_t	function_result;
262*06e79492SKenneth D. Merry 	uint8_t	response_len;
263*06e79492SKenneth D. Merry #define	SMP_DIS_RESPONSE_LEN		0x20
264*06e79492SKenneth D. Merry 	uint8_t	expander_change_count[2];
265*06e79492SKenneth D. Merry 	uint8_t	reserved0[3];
266*06e79492SKenneth D. Merry 	uint8_t	phy;
267*06e79492SKenneth D. Merry 	uint8_t	reserved1[2];
268*06e79492SKenneth D. Merry 	uint8_t	attached_device;
269*06e79492SKenneth D. Merry #define	SMP_DIS_AD_TYPE_MASK		0x70
270*06e79492SKenneth D. Merry #define	SMP_DIS_AD_TYPE_NONE		0x00
271*06e79492SKenneth D. Merry #define	SMP_DIS_AD_TYPE_SAS_SATA	0x10
272*06e79492SKenneth D. Merry #define	SMP_DIS_AD_TYPE_EXP		0x20
273*06e79492SKenneth D. Merry #define	SMP_DIS_AD_TYPE_EXP_OLD		0x30
274*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACH_REASON_MASK	0x0f
275*06e79492SKenneth D. Merry 	uint8_t	neg_logical_link_rate;
276*06e79492SKenneth D. Merry #define	SMP_DIS_LR_MASK			0x0f
277*06e79492SKenneth D. Merry #define	SMP_DIS_LR_DISABLED		0x01
278*06e79492SKenneth D. Merry #define	SMP_DIS_LR_PHY_RES_PROB		0x02
279*06e79492SKenneth D. Merry #define	SMP_DIS_LR_SPINUP_HOLD		0x03
280*06e79492SKenneth D. Merry #define	SMP_DIS_LR_PORT_SEL		0x04
281*06e79492SKenneth D. Merry #define	SMP_DIS_LR_RESET_IN_PROG	0x05
282*06e79492SKenneth D. Merry #define	SMP_DIS_LR_UNSUP_PHY_ATTACHED	0x06
283*06e79492SKenneth D. Merry #define	SMP_DIS_LR_G1_15GBPS		0x08
284*06e79492SKenneth D. Merry #define	SMP_DIS_LR_G2_30GBPS		0x09
285*06e79492SKenneth D. Merry #define	SMP_DIS_LR_G3_60GBPS		0x0a
286*06e79492SKenneth D. Merry 	uint8_t	config_bits0;
287*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACHED_SSP_INIT	0x08
288*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACHED_STP_INIT	0x04
289*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACHED_SMP_INIT	0x02
290*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACHED_SATA_HOST	0x01
291*06e79492SKenneth D. Merry 	uint8_t	config_bits1;
292*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACHED_SATA_PORTSEL	0x80
293*06e79492SKenneth D. Merry #define	SMP_DIS_STP_BUFFER_TOO_SMALL	0x10
294*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACHED_SSP_TARG	0x08
295*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACHED_STP_TARG	0x04
296*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACHED_SMP_TARG	0x02
297*06e79492SKenneth D. Merry #define	SMP_DIS_ATTACHED_SATA_DEV	0x01
298*06e79492SKenneth D. Merry 	uint8_t	sas_address[8];
299*06e79492SKenneth D. Merry 	uint8_t	attached_sas_address[8];
300*06e79492SKenneth D. Merry 	uint8_t	attached_phy_id;
301*06e79492SKenneth D. Merry 	uint8_t	config_bits2;
302*06e79492SKenneth D. Merry #define	SMP_DIS_ATT_SLUMB_CAP		0x10
303*06e79492SKenneth D. Merry #define	SMP_DIS_ATT_PAR_CAP		0x08
304*06e79492SKenneth D. Merry #define	SMP_DIS_ATT_IN_ZPSDS_PER	0x04
305*06e79492SKenneth D. Merry #define	SMP_DIS_ATT_REQ_IN_ZPSDS	0x02
306*06e79492SKenneth D. Merry #define	SMP_DIS_ATT_BREAK_RPL_CAP	0x01
307*06e79492SKenneth D. Merry 	uint8_t	reserved2[6];
308*06e79492SKenneth D. Merry 	uint8_t	link_rate0;
309*06e79492SKenneth D. Merry #define	SMP_DIS_PROG_MIN_LR_MASK	0xf0
310*06e79492SKenneth D. Merry #define	SMP_DIS_PROG_MIN_LR_SHIFT	4
311*06e79492SKenneth D. Merry #define	SMP_DIS_HARD_MIN_LR_MASK	0x0f
312*06e79492SKenneth D. Merry 	uint8_t	link_rate1;
313*06e79492SKenneth D. Merry #define	SMP_DIS_PROG_MAX_LR_MAX		0xf0
314*06e79492SKenneth D. Merry #define	SMP_DIS_PROG_MAX_LR_SHIFT	4
315*06e79492SKenneth D. Merry #define	SMP_DIS_HARD_MAX_LR_MASK	0x0f
316*06e79492SKenneth D. Merry 	uint8_t	phy_change_count;
317*06e79492SKenneth D. Merry 	uint8_t	pp_timeout;
318*06e79492SKenneth D. Merry #define	SMP_DIS_VIRTUAL_PHY		0x80
319*06e79492SKenneth D. Merry #define	SMP_DIS_PP_TIMEOUT_MASK		0x0f
320*06e79492SKenneth D. Merry 	uint8_t	routing_attr;
321*06e79492SKenneth D. Merry 	uint8_t	conn_type;
322*06e79492SKenneth D. Merry 	uint8_t	conn_el_index;
323*06e79492SKenneth D. Merry 	uint8_t	conn_phys_link;
324*06e79492SKenneth D. Merry 	uint8_t	config_bits3;
325*06e79492SKenneth D. Merry #define	SMP_DIS_PHY_POW_COND_MASK	0xc0
326*06e79492SKenneth D. Merry #define	SMP_DIS_PHY_POW_COND_SHIFT	6
327*06e79492SKenneth D. Merry #define	SMP_DIS_SAS_SLUMB_CAP		0x08
328*06e79492SKenneth D. Merry #define	SMP_DIS_SAS_PART_CAP		0x04
329*06e79492SKenneth D. Merry #define	SMP_DIS_SATA_SLUMB_CAP		0x02
330*06e79492SKenneth D. Merry #define	SMP_DIS_SATA_PART_CAP		0x01
331*06e79492SKenneth D. Merry 	uint8_t	config_bits4;
332*06e79492SKenneth D. Merry #define	SMP_DIS_SAS_SLUMB_ENB		0x08
333*06e79492SKenneth D. Merry #define	SMP_DIS_SAS_PART_ENB		0x04
334*06e79492SKenneth D. Merry #define	SMP_DIS_SATA_SLUMB_ENB		0x02
335*06e79492SKenneth D. Merry #define	SMP_DIS_SATA_PART_ENB		0x01
336*06e79492SKenneth D. Merry 	uint8_t	vendor_spec[2];
337*06e79492SKenneth D. Merry 	uint8_t	attached_dev_name[8];
338*06e79492SKenneth D. Merry 	uint8_t	config_bits5;
339*06e79492SKenneth D. Merry #define	SMP_DIS_REQ_IN_ZPSDS_CHG	0x40
340*06e79492SKenneth D. Merry #define	SMP_DIS_IN_ZPSDS_PER		0x20
341*06e79492SKenneth D. Merry #define	SMP_DIS_REQ_IN_ZPSDS		0x10
342*06e79492SKenneth D. Merry #define	SMP_DIS_ZG_PER			0x04
343*06e79492SKenneth D. Merry #define	SMP_DIS_IN_ZPSDS		0x02
344*06e79492SKenneth D. Merry #define	SMP_DIS_ZONING_ENB		0x01
345*06e79492SKenneth D. Merry 	uint8_t	reserved3[2];
346*06e79492SKenneth D. Merry 	uint8_t	zone_group;
347*06e79492SKenneth D. Merry 	uint8_t	self_config_status;
348*06e79492SKenneth D. Merry 	uint8_t	self_config_levels_comp;
349*06e79492SKenneth D. Merry 	uint8_t	reserved4[2];
350*06e79492SKenneth D. Merry 	uint8_t	self_config_sas_addr[8];
351*06e79492SKenneth D. Merry 	uint8_t	prog_phy_cap[4];
352*06e79492SKenneth D. Merry 	uint8_t	current_phy_cap[4];
353*06e79492SKenneth D. Merry 	uint8_t	attached_phy_cap[4];
354*06e79492SKenneth D. Merry 	uint8_t	reserved5[6];
355*06e79492SKenneth D. Merry 	uint8_t	neg_phys_link_rate;
356*06e79492SKenneth D. Merry #define	SMP_DIS_REASON_MASK		0xf0
357*06e79492SKenneth D. Merry #define	SMP_DIS_REASON_SHIFT		4
358*06e79492SKenneth D. Merry #define	SMP_DIS_PHYS_LR_MASK		0x0f
359*06e79492SKenneth D. Merry 	uint8_t	config_bits6;
360*06e79492SKenneth D. Merry #define	SMP_DIS_OPTICAL_MODE_ENB	0x04
361*06e79492SKenneth D. Merry #define	SMP_DIS_NEG_SSC			0x02
362*06e79492SKenneth D. Merry #define	SMP_DIS_HW_MUX_SUP		0x01
363*06e79492SKenneth D. Merry 	uint8_t	config_bits7;
364*06e79492SKenneth D. Merry #define	SMP_DIS_DEF_IN_ZPSDS_PER	0x20
365*06e79492SKenneth D. Merry #define	SMP_DIS_DEF_REQ_IN_ZPSDS	0x10
366*06e79492SKenneth D. Merry #define	SMP_DIS_DEF_ZG_PER		0x04
367*06e79492SKenneth D. Merry #define	SMP_DIS_DEF_ZONING_ENB		0x01
368*06e79492SKenneth D. Merry 	uint8_t	reserved6;
369*06e79492SKenneth D. Merry 	uint8_t	reserved7;
370*06e79492SKenneth D. Merry 	uint8_t	default_zone_group;
371*06e79492SKenneth D. Merry 	uint8_t	config_bits8;
372*06e79492SKenneth D. Merry #define	SMP_DIS_SAVED_IN_ZPSDS_PER	0x20
373*06e79492SKenneth D. Merry #define	SMP_DIS_SAVED_REQ_IN_SPSDS	0x10
374*06e79492SKenneth D. Merry #define	SMP_DIS_SAVED_ZG_PER		0x04
375*06e79492SKenneth D. Merry #define	SMP_DIS_SAVED_ZONING_ENB	0x01
376*06e79492SKenneth D. Merry 	uint8_t	reserved8;
377*06e79492SKenneth D. Merry 	uint8_t	reserved9;
378*06e79492SKenneth D. Merry 	uint8_t	saved_zone_group;
379*06e79492SKenneth D. Merry 	uint8_t	config_bits9;
380*06e79492SKenneth D. Merry #define	SMP_DIS_SHADOW_IN_ZPSDS_PER	0x20
381*06e79492SKenneth D. Merry #define	SMP_DIS_SHADOW_IN_REQ_IN_ZPSDS	0x10
382*06e79492SKenneth D. Merry #define	SMP_DIS_SHADOW_ZG_PER		0x04
383*06e79492SKenneth D. Merry 	uint8_t reserved10;
384*06e79492SKenneth D. Merry 	uint8_t reserved11;
385*06e79492SKenneth D. Merry 	uint8_t	shadow_zone_group;
386*06e79492SKenneth D. Merry 	uint8_t	device_slot_num;
387*06e79492SKenneth D. Merry 	uint8_t	device_slot_group_num;
388*06e79492SKenneth D. Merry 	uint8_t	device_slot_group_out_conn[6];
389*06e79492SKenneth D. Merry 	uint8_t	stp_buffer_size[2];
390*06e79492SKenneth D. Merry 	uint8_t	reserved12;
391*06e79492SKenneth D. Merry 	uint8_t	reserved13;
392*06e79492SKenneth D. Merry 	uint8_t	crc[4];
393*06e79492SKenneth D. Merry };
394*06e79492SKenneth D. Merry 
395*06e79492SKenneth D. Merry /*
396*06e79492SKenneth D. Merry  * PHY CONTROL request and response.  Current as of SPL Revision 7.
397*06e79492SKenneth D. Merry  */
398*06e79492SKenneth D. Merry struct smp_phy_control_request
399*06e79492SKenneth D. Merry {
400*06e79492SKenneth D. Merry 	uint8_t	frame_type;
401*06e79492SKenneth D. Merry 	uint8_t	function;
402*06e79492SKenneth D. Merry 	uint8_t response_len;
403*06e79492SKenneth D. Merry #define	SMP_PC_RESPONSE_LEN		0x00
404*06e79492SKenneth D. Merry 	uint8_t request_len;
405*06e79492SKenneth D. Merry #define	SMP_PC_REQUEST_LEN		0x09
406*06e79492SKenneth D. Merry 	uint8_t expected_exp_chg_cnt[2];
407*06e79492SKenneth D. Merry 	uint8_t reserved0[3];
408*06e79492SKenneth D. Merry 	uint8_t phy;
409*06e79492SKenneth D. Merry 	uint8_t phy_operation;
410*06e79492SKenneth D. Merry #define	SMP_PC_PHY_OP_NOP		0x00
411*06e79492SKenneth D. Merry #define	SMP_PC_PHY_OP_LINK_RESET	0x01
412*06e79492SKenneth D. Merry #define	SMP_PC_PHY_OP_HARD_RESET	0x02
413*06e79492SKenneth D. Merry #define	SMP_PC_PHY_OP_DISABLE		0x03
414*06e79492SKenneth D. Merry #define	SMP_PC_PHY_OP_CLEAR_ERR_LOG	0x05
415*06e79492SKenneth D. Merry #define	SMP_PC_PHY_OP_CLEAR_AFFILIATON	0x06
416*06e79492SKenneth D. Merry #define	SMP_PC_PHY_OP_TRANS_SATA_PSS	0x07
417*06e79492SKenneth D. Merry #define	SMP_PC_PHY_OP_CLEAR_STP_ITN_LS	0x08
418*06e79492SKenneth D. Merry #define	SMP_PC_PHY_OP_SET_ATT_DEV_NAME	0x09
419*06e79492SKenneth D. Merry 	uint8_t update_pp_timeout;
420*06e79492SKenneth D. Merry #define	SMP_PC_UPDATE_PP_TIMEOUT	0x01
421*06e79492SKenneth D. Merry 	uint8_t reserved1[12];
422*06e79492SKenneth D. Merry 	uint8_t attached_device_name[8];
423*06e79492SKenneth D. Merry 	uint8_t prog_min_phys_link_rate;
424*06e79492SKenneth D. Merry #define	SMP_PC_PROG_MIN_PL_RATE_MASK	0xf0
425*06e79492SKenneth D. Merry #define	SMP_PC_PROG_MIN_PL_RATE_SHIFT	4
426*06e79492SKenneth D. Merry 	uint8_t prog_max_phys_link_rate;
427*06e79492SKenneth D. Merry #define	SMP_PC_PROG_MAX_PL_RATE_MASK	0xf0
428*06e79492SKenneth D. Merry #define	SMP_PC_PROG_MAX_PL_RATE_SHIFT	4
429*06e79492SKenneth D. Merry 	uint8_t	config_bits0;
430*06e79492SKenneth D. Merry #define	SMP_PC_SP_NC			0x00
431*06e79492SKenneth D. Merry #define	SMP_PC_SP_DISABLE		0x02
432*06e79492SKenneth D. Merry #define	SMP_PC_SP_ENABLE		0x01
433*06e79492SKenneth D. Merry #define	SMP_PC_SAS_SLUMBER_NC		0x00
434*06e79492SKenneth D. Merry #define	SMP_PC_SAS_SLUMBER_DISABLE	0x80
435*06e79492SKenneth D. Merry #define	SMP_PC_SAS_SLUMBER_ENABLE	0x40
436*06e79492SKenneth D. Merry #define	SMP_PC_SAS_SLUMBER_MASK		0xc0
437*06e79492SKenneth D. Merry #define	SMP_PC_SAS_SLUMBER_SHIFT	6
438*06e79492SKenneth D. Merry #define	SMP_PC_SAS_PARTIAL_NC		0x00
439*06e79492SKenneth D. Merry #define	SMP_PC_SAS_PARTIAL_DISABLE	0x20
440*06e79492SKenneth D. Merry #define	SMP_PC_SAS_PARTIAL_ENABLE	0x10
441*06e79492SKenneth D. Merry #define	SMP_PC_SAS_PARTIAL_MASK		0x30
442*06e79492SKenneth D. Merry #define	SMP_PC_SAS_PARTIAL_SHIFT	4
443*06e79492SKenneth D. Merry #define	SMP_PC_SATA_SLUMBER_NC		0x00
444*06e79492SKenneth D. Merry #define	SMP_PC_SATA_SLUMBER_DISABLE	0x08
445*06e79492SKenneth D. Merry #define	SMP_PC_SATA_SLUMBER_ENABLE	0x04
446*06e79492SKenneth D. Merry #define	SMP_PC_SATA_SLUMBER_MASK	0x0c
447*06e79492SKenneth D. Merry #define	SMP_PC_SATA_SLUMBER_SHIFT	2
448*06e79492SKenneth D. Merry #define	SMP_PC_SATA_PARTIAL_NC		0x00
449*06e79492SKenneth D. Merry #define	SMP_PC_SATA_PARTIAL_DISABLE	0x02
450*06e79492SKenneth D. Merry #define	SMP_PC_SATA_PARTIAL_ENABLE	0x01
451*06e79492SKenneth D. Merry #define	SMP_PC_SATA_PARTIAL_MASK	0x03
452*06e79492SKenneth D. Merry #define	SMP_PC_SATA_PARTIAL_SHIFT	0
453*06e79492SKenneth D. Merry 	uint8_t	reserved2;
454*06e79492SKenneth D. Merry 	uint8_t	pp_timeout_value;
455*06e79492SKenneth D. Merry #define	SMP_PC_PP_TIMEOUT_MASK		0x0f
456*06e79492SKenneth D. Merry 	uint8_t reserved3[3];
457*06e79492SKenneth D. Merry 	uint8_t	crc[4];
458*06e79492SKenneth D. Merry };
459*06e79492SKenneth D. Merry 
460*06e79492SKenneth D. Merry struct smp_phy_control_response
461*06e79492SKenneth D. Merry {
462*06e79492SKenneth D. Merry 	uint8_t	frame_type;
463*06e79492SKenneth D. Merry 	uint8_t	function;
464*06e79492SKenneth D. Merry 	uint8_t	function_result;
465*06e79492SKenneth D. Merry 	uint8_t	response_len;
466*06e79492SKenneth D. Merry #define	SMP_PC_RESPONSE_LEN		0x00
467*06e79492SKenneth D. Merry 	uint8_t crc[4];
468*06e79492SKenneth D. Merry };
469*06e79492SKenneth D. Merry 
470*06e79492SKenneth D. Merry __BEGIN_DECLS
471*06e79492SKenneth D. Merry 
472*06e79492SKenneth D. Merry const char *smp_error_desc(int function_result);
473*06e79492SKenneth D. Merry const char *smp_command_desc(uint8_t cmd_num);
474*06e79492SKenneth D. Merry void smp_command_decode(uint8_t *smp_request, int request_len, struct sbuf *sb,
475*06e79492SKenneth D. Merry 			char *line_prefix, int first_line_len, int line_len);
476*06e79492SKenneth D. Merry void smp_command_sbuf(struct ccb_smpio *smpio, struct sbuf *sb,
477*06e79492SKenneth D. Merry 		      char *line_prefix, int first_line_len, int line_len);
478*06e79492SKenneth D. Merry 
479*06e79492SKenneth D. Merry #ifdef _KERNEL
480*06e79492SKenneth D. Merry void smp_error_sbuf(struct ccb_smpio *smpio, struct sbuf *sb);
481*06e79492SKenneth D. Merry #else /* !_KERNEL*/
482*06e79492SKenneth D. Merry void smp_error_sbuf(struct cam_device *device, struct ccb_smpio *smpio,
483*06e79492SKenneth D. Merry 		    struct sbuf *sb);
484*06e79492SKenneth D. Merry #endif /* _KERNEL/!_KERNEL */
485*06e79492SKenneth D. Merry 
486*06e79492SKenneth D. Merry void smp_report_general_sbuf(struct smp_report_general_response *response,
487*06e79492SKenneth D. Merry 			     int response_len, struct sbuf *sb);
488*06e79492SKenneth D. Merry 
489*06e79492SKenneth D. Merry void smp_report_manuf_info_sbuf(struct smp_report_manuf_info_response *response,
490*06e79492SKenneth D. Merry 				int response_len, struct sbuf *sb);
491*06e79492SKenneth D. Merry 
492*06e79492SKenneth D. Merry void smp_report_general(struct ccb_smpio *smpio, uint32_t retries,
493*06e79492SKenneth D. Merry 			void (*cbfcnp)(struct cam_periph *, union ccb *),
494*06e79492SKenneth D. Merry 			struct smp_report_general_request *request,
495*06e79492SKenneth D. Merry 			int request_len, uint8_t *response, int response_len,
496*06e79492SKenneth D. Merry 			int long_response, uint32_t timeout);
497*06e79492SKenneth D. Merry 
498*06e79492SKenneth D. Merry void smp_discover(struct ccb_smpio *smpio, uint32_t retries,
499*06e79492SKenneth D. Merry 		  void (*cbfcnp)(struct cam_periph *, union ccb *),
500*06e79492SKenneth D. Merry 		  struct smp_discover_request *request, int request_len,
501*06e79492SKenneth D. Merry 		  uint8_t *response, int response_len, int long_response,
502*06e79492SKenneth D. Merry 		  int ignore_zone_group, int phy, uint32_t timeout);
503*06e79492SKenneth D. Merry 
504*06e79492SKenneth D. Merry void smp_report_manuf_info(struct ccb_smpio *smpio, uint32_t retries,
505*06e79492SKenneth D. Merry 			   void (*cbfcnp)(struct cam_periph *, union ccb *),
506*06e79492SKenneth D. Merry 			   struct smp_report_manuf_info_request *request,
507*06e79492SKenneth D. Merry 			   int request_len, uint8_t *response, int response_len,
508*06e79492SKenneth D. Merry 			   int long_response, uint32_t timeout);
509*06e79492SKenneth D. Merry 
510*06e79492SKenneth D. Merry void smp_phy_control(struct ccb_smpio *smpio, uint32_t retries,
511*06e79492SKenneth D. Merry 		     void (*cbfcnp)(struct cam_periph *, union ccb *),
512*06e79492SKenneth D. Merry 		     struct smp_phy_control_request *request, int request_len,
513*06e79492SKenneth D. Merry 		     uint8_t *response, int response_len, int long_response,
514*06e79492SKenneth D. Merry 		     uint32_t expected_exp_change_count, int phy, int phy_op,
515*06e79492SKenneth D. Merry 		     int update_pp_timeout_val, uint64_t attached_device_name,
516*06e79492SKenneth D. Merry 		     int prog_min_prl, int prog_max_prl, int slumber_partial,
517*06e79492SKenneth D. Merry 		     int pp_timeout_value, uint32_t timeout);
518*06e79492SKenneth D. Merry __END_DECLS
519*06e79492SKenneth D. Merry 
520*06e79492SKenneth D. Merry #endif /*_SCSI_SMP_ALL_H*/
521