1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 #ifndef _SYS_SCSI_GENERIC_SMP_FRAMES_H
26 #define	_SYS_SCSI_GENERIC_SMP_FRAMES_H
27 
28 #ifdef	__cplusplus
29 extern "C" {
30 #endif
31 
32 #include <sys/sysmacros.h>
33 
34 /*
35  * The definitions of smp frame types and functions conforming to SAS-1.1 and
36  * SAS-2.  Consumers are expected to determine protocol support by examining
37  * the response to the REPORT GENERAL function.
38  */
39 
40 typedef enum smp_frame_type {
41 	SMP_FRAME_TYPE_REQUEST		= 0x40,
42 	SMP_FRAME_TYPE_RESPONSE		= 0x41
43 } smp_frame_type_t;
44 
45 typedef enum smp_function {
46 	SMP_FUNC_REPORT_GENERAL			= 0x00,
47 	SMP_FUNC_REPORT_MANUFACTURER_INFO	= 0x01,
48 	SMP_FUNC_READ_GPIO_REGISTER		= 0x02,
49 	SMP_FUNC_REPORT_SELF_CONFIG_STATUS	= 0x03,
50 	SMP_FUNC_REPORT_ZONE_PERM_TABLE		= 0x04,
51 	SMP_FUNC_REPORT_ZONE_MANAGER_PASSWORD	= 0x05,
52 	SMP_FUNC_REPORT_BROADCAST		= 0x06,
53 	SMP_FUNC_DISCOVER			= 0x10,
54 	SMP_FUNC_REPORT_PHY_ERROR_LOG		= 0x11,
55 	SMP_FUNC_REPORT_PHY_SATA		= 0x12,
56 	SMP_FUNC_REPORT_ROUTE_INFO		= 0x13,
57 	SMP_FUNC_REPORT_PHY_EVENT		= 0x14,
58 	SMP_FUNC_DISCOVER_LIST			= 0x20,
59 	SMP_FUNC_REPORT_PHY_EVENT_LIST		= 0x21,
60 	SMP_FUNC_REPORT_EXP_ROUTE_TABLE_LIST	= 0x22,
61 	SMP_FUNC_CONFIG_GENERAL			= 0x80,
62 	SMP_FUNC_ENABLE_DISABLE_ZONING		= 0x81,
63 	SMP_FUNC_WRITE_GPIO_REGISTER		= 0x82,
64 	SMP_FUNC_ZONED_BROADCAST		= 0x85,
65 	SMP_FUNC_ZONE_LOCK			= 0x86,
66 	SMP_FUNC_ZONE_ACTIVATE			= 0x87,
67 	SMP_FUNC_ZONE_UNLOCK			= 0x88,
68 	SMP_FUNC_CONFIG_ZONE_MANAGER_PASSWORD	= 0x89,
69 	SMP_FUNC_CONFIG_ZONE_PHY_INFO		= 0x8A,
70 	SMP_FUNC_CONFIG_ZONE_PERM_TABLE		= 0x8B,
71 	SMP_FUNC_CONFIG_ROUTE_INFO		= 0x90,
72 	SMP_FUNC_PHY_CONTROL			= 0x91,
73 	SMP_FUNC_PHY_TEST_FUNCTION		= 0x92,
74 	SMP_FUNC_CONFIG_PHY_EVENT		= 0x93
75 } smp_function_t;
76 
77 typedef enum smp_result {
78 	SMP_RES_FUNCTION_ACCEPTED		= 0x00,
79 	SMP_RES_UNKNOWN_FUNCTION		= 0x01,
80 	SMP_RES_FUNCTION_FAILED			= 0x02,
81 	SMP_RES_INVALID_REQUEST_FRAME_LENGTH	= 0x03,
82 	SMP_RES_INVALID_EXPANDER_CHANGE_COUNT	= 0x04,
83 	SMP_RES_BUSY				= 0x05,
84 	SMP_RES_INCOMPLETE_DESCRIPTOR_LIST	= 0x06,
85 	SMP_RES_PHY_DOES_NOT_EXIST		= 0x10,
86 	SMP_RES_INDEX_DOES_NOT_EXIST		= 0x11,
87 	SMP_RES_PHY_DOES_NOT_SUPPORT_SATA	= 0x12,
88 	SMP_RES_UNKNOWN_PHY_OPERATION		= 0x13,
89 	SMP_RES_UNKNOWN_PHY_TEST_FUNCTION	= 0x14,
90 	SMP_RES_PHY_TEST_IN_PROGRESS		= 0x15,
91 	SMP_RES_PHY_VACANT			= 0x16,
92 	SMP_RES_UNKNOWN_PHY_EVENT_SOURCE	= 0x17,
93 	SMP_RES_UNKNOWN_DESCRIPTOR_TYPE		= 0x18,
94 	SMP_RES_UNKNOWN_PHY_FILTER		= 0x19,
95 	SMP_RES_AFFILIATION_VIOLATION		= 0x1A,
96 	SMP_RES_ZONE_VIOLATION			= 0x20,
97 	SMP_RES_NO_MANAGEMENT_ACCESS_RIGHTS	= 0x21,
98 	SMP_RES_UNKNOWN_ENABLE_DISABLE_ZONING	= 0x22,
99 	SMP_RES_ZONE_LOCK_VIOLATION		= 0x23,
100 	SMP_RES_NOT_ACTIVATED			= 0x24,
101 	SMP_RES_ZONE_GROUP_OUT_OF_RANGE		= 0x25,
102 	SMP_RES_NO_PHYSICAL_PRESENCE		= 0x26,
103 	SMP_RES_SAVING_NOT_SUPPORTED		= 0x27,
104 	SMP_RES_SOURCE_ZONE_GROUP_DNE		= 0x28,
105 	SMP_RES_DISABLED_PW_NOT_SUPPORTED	= 0x29,
106 	SMP_RES_NONE				= -1
107 } smp_result_t;
108 
109 #pragma	pack(1)
110 
111 /*
112  * SAS-2 10.4.3.2 request frame format
113  */
114 typedef struct smp_request_frame {
115 	uint8_t srf_frame_type;
116 	uint8_t srf_function;
117 	uint8_t srf_allocated_response_len;	/* reserved in SAS-1 */
118 	uint8_t srf_request_len;
119 	uint8_t srf_data[1];
120 } smp_request_frame_t;
121 
122 /*
123  * SAS-2 10.4.3.3 response frame format
124  */
125 typedef struct smp_response_frame {
126 	uint8_t srf_frame_type;
127 	uint8_t srf_function;
128 	uint8_t srf_result;
129 	uint8_t srf_response_len;	/* reserved in SAS-1 */
130 	uint8_t srf_data[1];
131 } smp_response_frame_t;
132 
133 typedef uint8_t smp_crc_t[4];
134 
135 #ifdef offsetof
136 #define	SMP_REQ_MINLEN	\
137 	(offsetof(smp_request_frame_t, srf_data[0]) + sizeof (smp_crc_t))
138 #define	SMP_RESP_MINLEN	\
139 	(offsetof(smp_response_frame_t, srf_data[0]) + sizeof (smp_crc_t))
140 #endif	/* offsetof */
141 
142 /*
143  * SAS-2 10.4.3.4 REPORT GENERAL (no additional request bytes)
144  */
145 typedef struct smp_report_general_resp {
146 	uint16_t srgr_exp_change_count;
147 	uint16_t srgr_exp_route_indexes;
148 	DECL_BITFIELD2(
149 	    _reserved1		:7,
150 	    srgr_long_response	:1);
151 	uint8_t srgr_number_of_phys;
152 	DECL_BITFIELD7(
153 	    srgr_externally_configurable_route_table	:1,
154 	    srgr_configuring				:1,
155 	    srgr_configures_others			:1,
156 	    srgr_open_reject_retry_supported		:1,
157 	    srgr_stp_continue_awt			:1,
158 	    _reserved2					:2,
159 	    srgr_table_to_table_supported		:1);
160 	uint8_t _reserved3;
161 	uint64_t srgr_enclosure_logical_identifier;
162 	uint8_t _reserved4[8];
163 	uint8_t _reserved5[2];
164 	uint16_t srgr_stp_bus_inactivity_time_limit;
165 	uint16_t srgr_stp_maximum_connect_time_limit;
166 	uint16_t srgr_stp_smp_nexus_loss_time;
167 	DECL_BITFIELD7(
168 	    srgr_zoning_enabled				:1,
169 	    srgr_zoning_supported			:1,
170 	    srgr_physical_presence_asserted		:1,
171 	    srgr_physical_presence_supported		:1,
172 	    srgr_zone_locked				:1,
173 	    _reserved6					:1,
174 	    srgr_number_of_zone_grps			:2);
175 	DECL_BITFIELD6(
176 	    srgr_saving_zoning_enabled_supported	:1,
177 	    srgr_saving_zone_perm_table_supported	:1,
178 	    srgr_saving_zone_phy_info_supported		:1,
179 	    srgr_saving_zone_mgr_password_supported	:1,
180 	    srgr_saving					:1,
181 	    _reserved7					:3);
182 	uint16_t srgr_max_routed_sas_addrs;
183 	uint64_t srgr_active_zm_sas_addr;
184 	uint16_t srgr_zone_lock_inactivity_limit;
185 	uint8_t _reserved8[2];
186 	uint8_t _reserved9;
187 	uint8_t srgr_first_encl_conn_elem_idx;
188 	uint8_t srgr_number_encl_conn_elem_idxs;
189 	uint8_t _reserved10;
190 	DECL_BITFIELD2(
191 	    _reserved11					:7,
192 	    srgr_reduced_functionality			:1);
193 	uint8_t srgr_time_to_reduced_functionality;
194 	uint8_t srgr_initial_time_to_reduced_functionality;
195 	uint8_t srgr_max_reduced_functionality_time;
196 	uint16_t srgr_last_self_conf_status_descr_idx;
197 	uint16_t srgr_max_stored_self_config_status_descrs;
198 	uint16_t srgr_last_phy_event_list_descr_idx;
199 	uint16_t srgr_max_stored_phy_event_list_descrs;
200 	uint16_t srgr_stp_reject_to_open_limit;
201 	uint8_t _reserved12[2];
202 } smp_report_general_resp_t;
203 
204 typedef enum smp_n_zone_grps {
205 	SMP_ZONE_GROUPS_128	= 0x0,
206 	SMP_ZONE_GROUPS_256	= 0x1
207 } smp_n_zone_grps_t;
208 
209 /*
210  * SAS-2 10.4.3.5 REPORT MANUFACTURER INFORMATION (no additional request bytes)
211  */
212 typedef struct smp_report_manufacturer_info_resp {
213 	uint16_t srmir_exp_change_count;
214 	uint8_t _reserved1[2];
215 	DECL_BITFIELD2(
216 	    srmir_sas_1_1_format	:1,
217 	    _reserved2			:7);
218 	uint8_t _reserved3[3];
219 	char srmir_vendor_identification[8];
220 	char srmir_product_identification[16];
221 	char srmir_product_revision_level[4];
222 	char srmir_component_vendor_identification[8];
223 	uint16_t srmir_component_id;
224 	uint8_t srmir_component_revision_level;
225 	uint8_t _reserved4;
226 	uint8_t srmir_vs_52[8];
227 } smp_report_manufacturer_info_resp_t;
228 
229 /*
230  * SAS-2 10.4.3.6 REPORT SELF_CONFIGURATION STATUS
231  */
232 typedef struct smp_report_self_config_status_req {
233 	uint8_t _reserved1[2];
234 	uint16_t srscsr_starting_self_config_status_descr_idx;
235 } smp_report_self_config_status_req_t;
236 
237 typedef struct smp_report_self_config_status_resp {
238 	uint16_t srscsr_exp_change_count;
239 	uint16_t srscsr_starting_self_config_status_descr_idx;
240 	uint16_t srscsr_number_self_config_status_descrs;
241 	uint16_t srscsr_last_self_config_status_descr_idx;
242 	uint8_t srscsr_self_config_status_descr_len;
243 	uint8_t _reserved1[3];
244 	uint8_t srscsr_descrs[1];
245 } smp_report_self_config_status_resp_t;
246 
247 typedef struct smp_self_config_status_descr {
248 	uint8_t sscsd_status_type;
249 	DECL_BITFIELD2(
250 	    sscsd_final		:1,
251 	    _reserved1		:7);
252 	uint8_t _reserved2;
253 	uint8_t sscsd_phy_identifier;
254 	uint8_t _reserved3[4];
255 	uint64_t sscsd_sas_addr;
256 } smp_self_config_status_descr_t;
257 
258 typedef enum smp_self_config_status_type {
259 	SMP_SCST_NONSPECIFIC_ERROR	= 0x01,
260 	SMP_SCST_CONNECTION		= 0x02,
261 	SMP_SCST_ROUTE_TABLE_FULL	= 0x03,
262 	SMP_SCST_NOMEM			= 0x04,
263 	SMP_SCST_PHY_LAYER_ERROR	= 0x20,
264 	SMP_SCST_LOST_SYNC		= 0x21,
265 	SMP_SCST_LINK_LAYER_ERROR	= 0x40,
266 	SMP_SCST_OPEN_TIMEOUT		= 0x41,
267 	SMP_SCST_ABANDON_OPEN_REJECT	= 0x42,
268 	SMP_SCST_RETRY_OPEN_REJECTS	= 0x43,
269 	SMP_SCST_NEXUS_LOSS		= 0x44,
270 	SMP_SCST_BREAK			= 0x45,
271 	SMP_SCST_CRC_ERROR		= 0x46,
272 	SMP_SCST_PORT_LAYER_ERROR	= 0x60,
273 	SMP_SCST_RESPONSE_TIMEOUT	= 0x61,
274 	SMP_SCST_TRANSPORT_LAYER_ERROR	= 0x80,
275 	SMP_SCST_APP_LAYER_ERROR	= 0xA0,
276 	SMP_SCST_RESPONSE_TOO_SHORT	= 0xA1,
277 	SMP_SCST_UNSUPPORTED_VALUES	= 0xA2,
278 	SMP_SCST_INCONSISTENT		= 0xA3,
279 	SMP_SCST_CONFIGURING		= 0xA4
280 } smp_self_config_status_type_t;
281 
282 /*
283  * SAS-2 10.4.3.7 REPORT ZONE PERMISSION TABLE
284  */
285 typedef struct smp_report_zone_perm_table_req {
286 	DECL_BITFIELD2(
287 	    srzptr_report_type		:2,
288 	    _reserved1			:6);
289 	uint8_t _reserved2;
290 	uint8_t srzptr_starting_src_zone_grp;
291 	uint8_t srzptr_max_zone_perm_descrs;
292 } smp_report_zone_perm_table_req_t;
293 
294 typedef enum smp_zone_perm_table_report_type {
295 	SMP_ZPTRT_CURRENT		= 0x0,
296 	SMP_ZPTRT_SHADOW		= 0x1,
297 	SMP_ZPTRT_SAVED			= 0x2,
298 	SMP_ZPTRT_DEFAULT		= 0x3
299 } smp_zone_perm_table_report_type_t;
300 
301 typedef struct smp_report_zone_perm_table_resp {
302 	uint16_t srzptr_exp_change_count;
303 	DECL_BITFIELD3(
304 	    srzptr_report_type		:2,
305 	    _reserved1			:5,
306 	    srzptr_zone_locked		:1);
307 	DECL_BITFIELD2(
308 	    _reserved2			:6,
309 	    srzptr_number_zone_grps	:2);
310 	uint8_t _reserved3[6];
311 	uint8_t srzptr_starting_src_zone_grp;
312 	uint8_t srzptr_number_zone_perm_descrs;
313 	uint8_t srzptr_descrs[1];
314 } smp_report_zone_perm_table_resp_t;
315 
316 typedef uint8_t smp_zone_perm_descr128_t[16];
317 typedef uint8_t smp_zone_perm_descr256_t[32];
318 
319 #define	SMP_ZONE_PERM_BIT128(__d, __z)	\
320 	((__d)[15 - ((__z) >> 3)] & (1 << ((__z) & 7)))
321 
322 #define	SMP_ZONE_PERM_SET128(__d, __z)	\
323 	((__d)[15 - ((__z) >> 3)] |= (1 << ((__z) & 7)))
324 
325 #define	SMP_ZONE_PERM_CLR128(__d, __z)	\
326 	((__d)[15 - ((__z) >> 3)] &= ~(1 << ((__z) & 7)))
327 
328 #define	SMP_ZONE_PERM_BIT256(__d, __z)	\
329 	((__d)[31 - ((__z) >> 3)] & (1 << ((__z) & 7)))
330 
331 #define	SMP_ZONE_PERM_SET256(__d, __z)	\
332 	((__d)[31 - ((__z) >> 3)] |= (1 << ((__z) & 7)))
333 
334 #define	SMP_ZONE_PERM_CLR256(__d, __z)	\
335 	((__d)[31 - ((__z) >> 3)] &= ~(1 << ((__z) & 7)))
336 
337 /*
338  * SAS-2 10.4.3.8 REPORT ZONE MANAGER PASSWORD
339  */
340 typedef enum smp_report_zmp_report_type {
341 	SMP_ZMP_TYPE_CURRENT		= 0x0,
342 	SMP_ZMP_TYPE_SAVED		= 0x2,
343 	SMP_ZMP_TYPE_DEFAULT		= 0x3
344 } smp_report_zmp_report_type_t;
345 
346 typedef struct smp_report_zone_mgr_password_req {
347 	DECL_BITFIELD2(
348 	    srzmpr_rpt_type		:2,
349 	    _reserved1			:6);
350 	uint8_t _reserved2[2];
351 } smp_report_zone_mgr_password_req_t;
352 
353 typedef struct smp_report_zone_mgr_password_resp {
354 	uint16_t srzmpr_exp_change_count;
355 	DECL_BITFIELD2(
356 	    srzmpr_rpt_type		:2,
357 	    _reserved1			:6);
358 	uint8_t _reserved2;
359 	uint8_t srzmpr_zone_mgr_password[32];
360 } smp_report_zone_mgr_password_resp_t;
361 
362 /*
363  * SAS-2 10.4.3.9 REPORT BROADCAST
364  */
365 typedef struct smp_report_broadcast_req {
366 	DECL_BITFIELD2(
367 	    srbr_broadcast_type		:4,
368 	    _reserved1			:4);
369 	uint8_t _reserved2[3];
370 } smp_report_broadcast_req_t;
371 
372 typedef enum smp_broadcast_type {
373 	SMP_BROADCAST_CHANGE		= 0x0,
374 	SMP_BROADCAST_RESERVED_CHANGE_0	= 0x1,
375 	SMP_BROADCAST_RESERVED_CHANGE_1	= 0x2,
376 	SMP_BROADCAST_SES		= 0x3,
377 	SMP_BROADCAST_EXPANDER		= 0x4,
378 	SMP_BROADCAST_ASYNC_EVENT	= 0x5,
379 	SMP_BROADCAST_RESERVED_3	= 0x6,
380 	SMP_BROADCAST_RESERVED_4	= 0x7,
381 	SMP_BROADCAST_ZONE_ACTIVATE	= 0x8
382 } smp_broadcast_type_t;
383 
384 typedef struct smp_broadcast_descr {
385 	DECL_BITFIELD2(
386 	    sbd_broadcast_type		:4,
387 	    _reserved1			:4);
388 	uint8_t sbd_phy_identifier;
389 	DECL_BITFIELD2(
390 	    sbd_broadcast_reason	:4,
391 	    _reserved2			:4);
392 	uint16_t sbd_broadcast_count;
393 	uint8_t _reserved3[10];
394 } smp_broadcast_descr_t;
395 
396 typedef struct smp_report_broadcast_resp {
397 	uint16_t srbr_exp_change_count;
398 	DECL_BITFIELD2(
399 	    srbr_broadcast_type		:4,
400 	    _reserved1			:4);
401 	uint8_t srbr_number_broadcast_descrs;
402 	smp_broadcast_descr_t srbr_descrs[1];
403 } smp_report_broadcast_resp_t;
404 
405 /*
406  * SAS-2 10.4.3.10 DISCOVER
407  */
408 typedef struct smp_discover_req {
409 	uint8_t _reserved1[4];
410 	DECL_BITFIELD2(
411 	    sdr_ignore_zone_grp		:1,
412 	    _reserved2			:7);
413 	uint8_t sdr_phy_identifier;
414 	uint8_t _reserved3[2];
415 } smp_discover_req_t;
416 
417 typedef struct smp_snw3_phy_cap {
418 	DECL_BITFIELD4(
419 	    sspc_requested_logical_link_rate	:4,	/* smp_link_rate_t */
420 	    _reserved1				:2,
421 	    sspc_tx_ssc_type			:1,
422 	    sspc_start				:1);
423 	DECL_BITFIELD7(
424 	    _reserved2				:2,
425 	    sspc_g3_ssc				:1,
426 	    sspc_g3_no_ssc			:1,
427 	    sspc_g2_ssc				:1,
428 	    sspc_g2_no_ssc			:1,
429 	    sspc_g1_ssc				:1,
430 	    sspc_g1_no_ssc			:1);
431 	uint8_t _reserved3;
432 	DECL_BITFIELD2(
433 	    sspc_parity		:1,
434 	    _reserved4		:7);
435 } smp_snw3_phy_cap_t;
436 
437 typedef struct smp_discover_resp {
438 	uint16_t sdr_exp_change_count;
439 	uint8_t _reserved1[3];
440 	uint8_t sdr_phy_identifier;
441 	uint8_t _reserved2[2];
442 	DECL_BITFIELD3(
443 	    sdr_attached_reason		:4,
444 	    sdr_attached_device_type	:3,
445 	    _reserved3			:1);
446 	DECL_BITFIELD2(
447 	    sdr_negotiated_logical_link_rate	:4,	/* smp_link_rate_t */
448 	    _reserved4				:4);
449 	DECL_BITFIELD5(
450 	    sdr_attached_sata_host	:1,
451 	    sdr_attached_smp_initiator	:1,
452 	    sdr_attached_stp_initiator	:1,
453 	    sdr_attached_ssp_initiator	:1,
454 	    _reserved5			:4);
455 	DECL_BITFIELD6(
456 	    sdr_attached_sata_device		:1,
457 	    sdr_attached_smp_target		:1,
458 	    sdr_attached_stp_target		:1,
459 	    sdr_attached_ssp_target		:1,
460 	    _reserved6				:3,
461 	    sdr_attached_sata_port_selector	:1);
462 	uint64_t sdr_sas_addr;
463 	uint64_t sdr_attached_sas_addr;
464 	uint8_t sdr_attached_phy_identifier;
465 	DECL_BITFIELD4(
466 	    sdr_attached_break_reply_capable		:1,
467 	    sdr_attached_requested_inside_zpsds		:1,
468 	    sdr_attached_inside_zpsds_persistent	:1,
469 	    _reserved7					:5);
470 	uint8_t _reserved8[6];
471 	DECL_BITFIELD2(
472 	    sdr_hw_min_phys_link_rate	:4,	/* smp_link_rate_t */
473 	    sdr_prog_min_phys_link_rate	:4);	/* smp_link_rate_t */
474 	DECL_BITFIELD2(
475 	    sdr_hw_max_phys_link_rate	:4,	/* smp_link_rate_t */
476 	    sdr_prog_max_phys_link_rate	:4);	/* smp_link_rate_t */
477 	uint8_t sdr_phy_change_count;
478 	DECL_BITFIELD3(
479 	    sdr_partial_pwy_timeout	:4,
480 	    _reserved9			:3,
481 	    sdr_virtual_phy		:1);
482 	DECL_BITFIELD2(
483 	    sdr_routing_attr		:4,	/* smp_routing_attr_t */
484 	    _reserved10			:4);
485 	DECL_BITFIELD2(
486 	    sdr_connector_type		:7,
487 	    _reserved11			:1);
488 	uint8_t sdr_connector_element_index;
489 	uint8_t sdr_connector_physical_link;
490 	uint8_t _reserved12[2];
491 	uint8_t sdr_vendor[2];
492 	uint64_t sdr_attached_device_name;
493 	DECL_BITFIELD8(
494 	    sdr_zoning_enabled				:1,
495 	    sdr_inside_zpsds				:1,
496 	    sdr_zone_group_persistent			:1,
497 	    _reserved13					:1,
498 	    sdr_requested_inside_zpsds			:1,
499 	    sdr_inside_zpsds_persistent			:1,
500 	    sdr_requested_inside_zpsds_changed_by_exp	:1,
501 	    _reserved14					:1);
502 	uint8_t _reserved15[2];
503 	uint8_t sdr_zone_group;
504 	uint8_t sdr_self_config_status;
505 	uint8_t sdr_self_config_levels_completed;
506 	uint8_t _reserved16[2];
507 	uint64_t sdr_self_config_sas_addr;
508 	smp_snw3_phy_cap_t sdr_prog_phy_cap;
509 	smp_snw3_phy_cap_t sdr_current_phy_cap;
510 	smp_snw3_phy_cap_t sdr_attached_phy_cap;
511 	uint8_t _reserved17[6];
512 	DECL_BITFIELD2(
513 	    sdr_negotiated_phys_link_rate	:4,	/* smp_link_rate_t */
514 	    sdr_reason				:4);
515 	DECL_BITFIELD3(
516 	    sdr_hw_muxing_supported	:1,
517 	    sdr_negotiated_ssc		:1,
518 	    _reserved18			:6);
519 	DECL_BITFIELD7(
520 	    sdr_default_zoning_enabled		:1,
521 	    _reserved19				:1,
522 	    sdr_default_zone_group_persistent	:1,
523 	    _reserved20				:1,
524 	    sdr_default_requested_inside_zpsds	:1,
525 	    sdr_default_inside_zpsds_persistent	:1,
526 	    _reserved21				:2);
527 	uint8_t _reserved22[2];
528 	uint8_t sdr_default_zone_group;
529 	DECL_BITFIELD7(
530 	    sdr_saved_zoning_enabled		:1,
531 	    _reserved23				:1,
532 	    sdr_saved_zone_group_persistent	:1,
533 	    _reserved24				:1,
534 	    sdr_saved_requested_inside_zpsds	:1,
535 	    sdr_saved_inside_zpsds_persistent	:1,
536 	    _reserved25				:2);
537 	uint8_t _reserved26[2];
538 	uint8_t saved_zone_group;
539 	DECL_BITFIELD6(
540 	    _reserved27				:2,
541 	    sdr_shadow_zone_group_persistent	:1,
542 	    _reserved28				:1,
543 	    sdr_shadow_requested_inside_zpsds	:1,
544 	    sdr_shadow_inside_zpsds_persistent	:1,
545 	    _reserved29				:2);
546 	uint8_t _reserved30[2];
547 	uint8_t sdr_shadow_zone_group;
548 } smp_discover_resp_t;
549 
550 typedef enum smp_link_rate {
551 	SMP_LINK_RATE_NO_CHANGE = 0x0,
552 	SMP_LINK_RATE_DISABLED = 0x1,
553 	SMP_LINK_RATE_RESET_PROBLEM = 0x2,
554 	SMP_LINK_RATE_SPINUP_HOLD = 0x3,
555 	SMP_LINK_RATE_PORT_SELECTOR = 0x4,
556 	SMP_LINK_RATE_RESET = 0x5,
557 	SMP_LINK_RATE_UNSUPPORTED = 0x6,
558 	SMP_LINK_RATE_1_5 = 0x8,
559 	SMP_LINK_RATE_3 = 0x9,
560 	SMP_LINK_RATE_6 = 0xA
561 } smp_link_rate_t;
562 
563 typedef enum smp_device_type {
564 	SMP_DEV_NONE = 0x0,
565 	SMP_DEV_SAS_SATA = 0x1,
566 	SMP_DEV_EXPANDER = 0x2,
567 	SMP_DEV_EXPANDER_OLD = 0x3
568 } smp_device_type_t;
569 
570 typedef enum smp_routing_attr {
571 	SMP_ROUTING_DIRECT = 0x0,
572 	SMP_ROUTING_SUBTRACTIVE = 0x1,
573 	SMP_ROUTING_TABLE = 0x2
574 } smp_routing_attr_t;
575 
576 /*
577  * SAS-2 10.4.3.11 REPORT PHY ERROR LOG
578  */
579 typedef struct smp_report_phy_error_log_req {
580 	uint8_t _reserved1[5];
581 	uint8_t srpelr_phy_identifier;
582 	uint8_t _reserved2[2];
583 } smp_report_phy_error_log_req_t;
584 
585 typedef struct smp_report_phy_error_log_resp {
586 	uint16_t srpelr_exp_change_count;
587 	uint8_t _reserved1[3];
588 	uint8_t srpelr_phy_identifier;
589 	uint8_t _reserved2[2];
590 	uint32_t srpelr_invalid_dword_count;
591 	uint32_t srpelr_running_disparity_error_count;
592 	uint32_t srpelr_loss_dword_sync_count;
593 	uint32_t srpelr_phy_reset_problem_count;
594 } smp_report_phy_error_log_resp_t;
595 
596 /*
597  * SAS-2 10.4.3.12 REPORT PHY SATA
598  */
599 typedef struct smp_report_phy_sata_req {
600 	uint8_t _reserved1[5];
601 	uint8_t srpsr_phy_identifier;
602 	uint8_t srpsr_affiliation_context;
603 	uint8_t _reserved2;
604 } smp_report_phy_sata_req_t;
605 
606 typedef struct smp_report_phy_sata_resp {
607 	uint16_t srpsr_exp_change_count;
608 	uint8_t _reserved1[3];
609 	uint8_t srpsr_phy_identifier;
610 	uint8_t _reserved2;
611 	DECL_BITFIELD4(
612 	    srpsr_affiliation_valid		:1,
613 	    srpsr_affiliations_supported	:1,
614 	    srpsr_stp_nexus_loss		:1,
615 	    _reserved3				:5);
616 	uint8_t _reserved4[4];
617 	uint64_t srpsr_stp_sas_addr;
618 	uint8_t srpsr_register_device_host_fis[20];
619 	uint8_t _reserved5[4];
620 	uint64_t srpsr_affiliated_stp_init_sas_addr;
621 	uint64_t srpsr_stp_nexus_loss_sas_addr;
622 	uint8_t _reserved6;
623 	uint8_t srpsr_affiliation_context;
624 	uint8_t srpsr_current_affiliation_contexts;
625 	uint8_t srpsr_max_affiliation_contexts;
626 } smp_report_phy_sata_resp_t;
627 
628 /*
629  * SAS-2 10.4.3.13 REPORT ROUTE INFORMATION
630  */
631 typedef struct smp_report_route_info_req {
632 	uint8_t _reserved1[2];
633 	uint16_t srrir_exp_route_index;
634 	uint8_t _reserved2;
635 	uint8_t srrir_phy_identifier;
636 	uint8_t _reserved3[2];
637 } smp_report_route_info_req_t;
638 
639 typedef struct smp_report_route_info_resp {
640 	uint16_t srrir_exp_change_count;
641 	uint16_t srrir_exp_route_index;
642 	uint8_t _reserved1;
643 	uint8_t srrir_phy_identifier;
644 	uint8_t _reserved2[2];
645 	DECL_BITFIELD2(
646 	    _reserved3				:7,
647 	    srrir_exp_route_entry_disabled	:1);
648 	uint8_t _reserved4[3];
649 	uint64_t srrir_routed_sas_addr;
650 	uint8_t _reserved5[16];
651 } smp_report_route_info_resp_t;
652 
653 /*
654  * SAS-2 10.4.3.14 SAS-2 REPORT PHY EVENT
655  */
656 typedef enum smp_phy_event_source {
657 	SMP_PHY_EVENT_NO_EVENT				= 0x00,
658 	SMP_PHY_EVENT_INVALID_DWORD_COUNT		= 0x01,
659 	SMP_PHY_EVENT_RUNNING_DISPARITY_ERROR_COUNT	= 0x02,
660 	SMP_PHY_EVENT_LOSS_OF_DWORD_SYNC_COUNT		= 0x03,
661 	SMP_PHY_EVENT_PHY_RESET_PROBLEM_COUNT		= 0x04,
662 	SMP_PHY_EVENT_ELASTICITY_BUFFER_OVERFLOW_COUNT	= 0x05,
663 	SMP_PHY_EVENT_RX_ERROR_COUNT			= 0x06,
664 	SMP_PHY_EVENT_RX_ADDR_FRAME_ERROR_COUNT		= 0x20,
665 	SMP_PHY_EVENT_TX_ABANDON_CLASS_OPEN_REJ_COUNT	= 0x21,
666 	SMP_PHY_EVENT_RX_ABANDON_CLASS_OPEN_REJ_COUNT	= 0x22,
667 	SMP_PHY_EVENT_TX_RETRY_CLASS_OPEN_REJ_COUNT	= 0x23,
668 	SMP_PHY_EVENT_RX_RETRY_CLASS_OPEN_REJ_COUNT	= 0x24,
669 	SMP_PHY_EVENT_RX_AIP_W_O_PARTIAL_COUNT		= 0x25,
670 	SMP_PHY_EVENT_RX_AIP_W_O_CONN_COUNT		= 0x26,
671 	SMP_PHY_EVENT_TX_BREAK_COUNT			= 0x27,
672 	SMP_PHY_EVENT_RX_BREAK_COUNT			= 0x28,
673 	SMP_PHY_EVENT_BREAK_TIMEOUT_COUNT		= 0x29,
674 	SMP_PHY_EVENT_CONNECTION_COUNT			= 0x2A,
675 	SMP_PHY_EVENT_PEAK_TX_PATHWAY_BLOCKED_COUNT	= 0x2B,
676 	SMP_PHY_EVENT_PEAK_TX_ARB_WAIT_TIME		= 0x2C,
677 	SMP_PHY_EVENT_PEAK_ARB_TIME			= 0x2D,
678 	SMP_PHY_EVENT_PEAK_CONNECTION_TIME		= 0x2E,
679 	SMP_PHY_EVENT_TX_SSP_FRAME_COUNT		= 0x40,
680 	SMP_PHY_EVENT_RX_SSP_FRAME_COUNT		= 0x41,
681 	SMP_PHY_EVENT_TX_SSP_FRAME_ERROR_COUNT		= 0x42,
682 	SMP_PHY_EVENT_RX_SSP_FRAME_ERROR_COUNT		= 0x43,
683 	SMP_PHY_EVENT_TX_CREDIT_BLOCKED_COUNT		= 0x44,
684 	SMP_PHY_EVENT_RX_CREDIT_BLOCKED_COUNT		= 0x45,
685 	SMP_PHY_EVENT_TX_SATA_FRAME_COUNT		= 0x50,
686 	SMP_PHY_EVENT_RX_SATA_FRAME_COUNT		= 0x51,
687 	SMP_PHY_EVENT_SATA_FLOW_CTRL_BUF_OVERFLOW_COUNT	= 0x52,
688 	SMP_PHY_EVENT_TX_SMP_FRAME_COUNT		= 0x60,
689 	SMP_PHY_EVENT_RX_SMP_FRAME_COUNT		= 0x61,
690 	SMP_PHY_EVENT_RX_SMP_FRAME_ERROR_COUNT		= 0x63
691 } smp_phy_event_source_t;
692 
693 typedef struct smp_report_phy_event_req {
694 	uint8_t _reserved1;
695 	uint8_t _reserved2[4];
696 	uint8_t srper_phy_identifier;
697 	uint8_t _reserved3[2];
698 } smp_report_phy_event_req_t;
699 
700 typedef struct smp_phy_event_report_descr {
701 	uint8_t _reserved1[3];
702 	uint8_t sped_phy_event_source;
703 	uint32_t sped_phy_event;
704 	uint32_t sped_peak_detector_threshold;
705 } smp_phy_event_report_descr_t;
706 
707 typedef struct smp_report_phy_event_resp {
708 	uint16_t srper_exp_change_count;
709 	uint8_t _reserved1[3];
710 	uint8_t srper_phy_identifier;
711 	uint8_t _reserved2[5];
712 	uint8_t srper_n_phy_event_descrs;
713 	smp_phy_event_report_descr_t srper_phy_event_descrs[1];
714 } smp_report_phy_event_resp_t;
715 
716 /*
717  * SAS-2 10.4.3.15 SAS-2 DISCOVER LIST
718  */
719 typedef struct smp_discover_list_req {
720 	uint8_t _reserved1[4];
721 	uint8_t sdlr_starting_phy_identifier;
722 	uint8_t sdlr_max_descrs;
723 	DECL_BITFIELD3(
724 	    sdlr_phy_filter		:4,
725 	    _reserved2			:3,
726 	    sdlr_ignore_zone_group	:1);
727 	DECL_BITFIELD2(
728 	    sdlr_descr_type		:4,
729 	    _reserved3			:4);
730 	uint8_t _reserved4[4];
731 	uint8_t sdlr_vendor[12];
732 } smp_discover_list_req_t;
733 
734 typedef struct smp_discover_short_descr {
735 	uint8_t sdsd_phy_identifier;
736 	uint8_t sdsd_function_result;
737 	DECL_BITFIELD3(
738 	    sdsd_attached_reason	:4,
739 	    sdsd_attached_device_type	:3,
740 	    _restricted1		:1);
741 	DECL_BITFIELD2(
742 	    sdsd_negotiated_logical_link_rate	:4,	/* smp_link_rate_t */
743 	    _restricted2			:4);
744 	DECL_BITFIELD5(
745 	    sdsd_attached_sata_host	:1,
746 	    sdsd_attached_smp_initiator	:1,
747 	    sdsd_attached_stp_initiator	:1,
748 	    sdsd_attached_ssp_initiator	:1,
749 	    _restricted3		:4);
750 	DECL_BITFIELD6(
751 	    sdsd_attached_sata_device		:1,
752 	    sdsd_attached_smp_target		:1,
753 	    sdsd_attached_stp_target		:1,
754 	    sdsd_attached_ssp_target		:1,
755 	    _restricted4			:3,
756 	    sdsd_attached_sata_port_selector	:1);
757 	DECL_BITFIELD3(
758 	    sdsd_routing_attribute	:4,		/* smp_routing_attr_t */
759 	    _reserved1			:3,
760 	    sdsd_virtual_phy		:1);
761 	DECL_BITFIELD2(
762 	    _reserved2			:4,
763 	    sdsd_reason			:4);
764 	uint8_t sdsd_zone_group;
765 	DECL_BITFIELD7(
766 	    _reserved3				:1,
767 	    sdsd_inside_zpsds			:1,
768 	    sdsd_zone_group_persistent		:1,
769 	    _reserved4				:1,
770 	    sdsd_requested_insize_zpsds		:1,
771 	    sdsd_inside_zpsds_persistent	:1,
772 	    _restricted5			:2);
773 	uint8_t sdsd_attached_phy_identifier;
774 	uint8_t sdsd_phy_change_count;
775 	uint64_t sdsd_attached_sas_addr;
776 	uint8_t _reserved5[4];
777 } smp_discover_short_descr_t;
778 
779 typedef struct smp_discover_long_descr {
780 	uint8_t _reserved1[2];
781 	uint8_t sdld_function_result;
782 	uint8_t _reserved2[1];
783 	smp_discover_resp_t sdld_response;
784 } smp_discover_long_descr_t;
785 
786 #define	SMP_DISCOVER_RESP(_ld)	\
787 	(((smp_discover_long_descr_t *)(_ld))->sdld_function_result ==	\
788 	SMP_FUNCTION_ACCEPTED ?	\
789 	&((smp_discover_long_descr_t *)(_ld))->sdld_response :	\
790 	NULL)
791 
792 typedef struct smp_discover_list_resp {
793 	uint16_t sdlr_exp_change_count;
794 	uint8_t _reserved1[2];
795 	uint8_t sdlr_starting_phy_identifier;
796 	uint8_t sdlr_n_descrs;
797 	DECL_BITFIELD2(
798 	    sdlr_phy_filter		:4,
799 	    _reserved2			:4);
800 	DECL_BITFIELD2(
801 	    sdlr_descr_type		:4,
802 	    _reserved3			:4);
803 	uint8_t sdlr_descr_length;
804 	uint8_t _reserved4[3];
805 	DECL_BITFIELD5(
806 	    sdlr_externally_configurable_route_table	:1,
807 	    sdlr_configuring				:1,
808 	    _reserved5					:4,
809 	    sdlr_zoning_enabled				:1,
810 	    sdlr_zoning_supported			:1);
811 	uint8_t _reserved6;
812 	uint16_t sdlr_last_sc_status_descr_index;
813 	uint16_t sdlr_last_phy_event_list_descr_index;
814 	uint8_t _reserved7[10];
815 	uint8_t sdlr_vendor[16];
816 	uint8_t sdlr_descrs[1];	/* short or long format */
817 } smp_discover_list_resp_t;
818 
819 /*
820  * SAS-2 10.4.3.16 REPORT PHY EVENT LIST
821  */
822 typedef struct smp_report_phy_event_list_req {
823 	uint8_t _reserved1[2];
824 	uint16_t srpelr_starting_descr_index;
825 } smp_report_phy_event_list_req_t;
826 
827 typedef struct smp_phy_event_list_descr {
828 	uint8_t _reserved1[2];
829 	uint8_t speld_phy_identifier;
830 	uint8_t speld_phy_event_source;
831 	uint32_t speld_phy_event;
832 	uint32_t speld_peak_detector_threshold;
833 } smp_phy_event_list_descr_t;
834 
835 typedef struct smp_report_phy_event_list_resp {
836 	uint16_t srpelr_exp_change_count;
837 	uint16_t srpelr_starting_descr_index;
838 	uint16_t srpelr_last_descr_index;
839 	uint8_t srpelr_phy_event_list_descr_length;
840 	uint8_t _reserved1[3];
841 	uint8_t srpelr_n_descrs;
842 	smp_phy_event_list_descr_t srpelr_descrs[1];
843 } smp_report_phy_event_list_resp_t;
844 
845 /*
846  * SAS-2 10.4.3.17 REPORT EXPANDER ROUTE TABLE LIST
847  */
848 typedef struct smp_report_exp_route_table_list_req {
849 	uint8_t _reserved1[4];
850 	uint16_t srertlr_max_descrs;
851 	uint16_t srertlr_starting_routed_sas_addr_index;
852 	uint8_t _reserved2[7];
853 	uint8_t srertlr_starting_phy_identifier;
854 	uint8_t _reserved3[8];
855 } smp_report_exp_route_table_list_req_t;
856 
857 typedef struct smp_route_table_descr {
858 	uint64_t srtd_routed_sas_addr;
859 	uint8_t srtd_phy_bitmap[6];
860 	DECL_BITFIELD2(
861 	    _reserved1			:7,
862 	    srtd_zone_group_valid	:1);
863 	uint8_t srtd_zone_group;
864 } smp_route_table_descr_t;
865 
866 #define	SMP_ROUTE_PHY(_d, _s, _i)	\
867 	((_d)->srtd_phy_bitmap[(48 - (_i) + (_s)) >> 3] & \
868 	(1 << ((48 - (_i) + (_s)) & 7)))
869 
870 typedef struct smp_report_exp_route_table_list_resp {
871 	uint16_t srertlr_exp_change_count;
872 	uint16_t srertlr_route_table_change_count;
873 	DECL_BITFIELD5(
874 	    srertlr_zoning_enabled	:1,
875 	    srertlr_configuring		:1,
876 	    srertlr_zone_configuring	:1,
877 	    srertlr_self_configuring	:1,
878 	    _reserved2			:4);
879 	uint8_t _reserved3;
880 	uint8_t srertlr_descr_length;
881 	uint8_t srertlr_n_descrs;
882 	uint16_t srertlr_first_routed_sas_addr_index;
883 	uint16_t srertlr_last_routed_sas_addr_index;
884 	uint8_t _reserved4[3];
885 	uint8_t srertlr_starting_phy_identifier;
886 	uint8_t _reserved5[12];
887 	smp_route_table_descr_t srertlr_descrs[1];
888 } smp_report_exp_route_table_list_resp_t;
889 
890 /*
891  * SAS-2 10.4.3.18 CONFIGURE GENERAL (no additional response)
892  */
893 typedef struct smp_config_general_req {
894 	uint16_t scgr_expected_exp_change_count;
895 	uint8_t _reserved1[2];
896 	DECL_BITFIELD6(
897 	    scgr_update_stp_bus_inactivity			:1,
898 	    scgr_update_stp_max_conn				:1,
899 	    scgr_update_stp_smp_nexus_loss			:1,
900 	    scgr_update_initial_time_to_reduced_functionality	:1,
901 	    scgr_update_stp_reject_to_open			:1,
902 	    _reserved2						:3);
903 	uint8_t _reserved3;
904 	uint16_t scgr_stp_bus_inactivity;
905 	uint16_t scgr_stp_max_conn;
906 	uint16_t scgr_stp_smp_nexus_loss;
907 	uint8_t scgr_initial_time_to_reduced_functionality;
908 	uint8_t _reserved4;
909 	uint16_t scgr_stp_reject_to_open;
910 } smp_config_general_req_t;
911 
912 /*
913  * SAS-2 10.4.3.19 ENABLE DISABLE ZONING (no additional response)
914  */
915 typedef struct smp_enable_disable_zoning_req {
916 	uint16_t sedzr_expected_exp_change_count;
917 	DECL_BITFIELD2(
918 	    sedzr_save	:2,		/* smp_zoning_save_t */
919 	    _reserved1	:6);
920 	uint8_t _reserved2;
921 	DECL_BITFIELD2(
922 	    sedzr_enable_disable_zoning	:2,
923 	    _reserved3			:6);
924 	uint8_t _reserved4[3];
925 } smp_enable_disable_zoning_req_t;
926 
927 typedef enum smp_zoning_save {
928 	SMP_ZONING_SAVE_CURRENT = 0x0,
929 	SMP_ZONING_SAVE_SAVED = 0x1,
930 	SMP_ZONING_SAVE_BOTH_IF_SUPP = 0x2,
931 	SMP_ZONING_SAVE_BOTH = 0x3
932 } smp_zoning_save_t;
933 
934 typedef enum smp_zoning_enable_op {
935 	SMP_ZONING_ENABLE_OP_NONE = 0x0,
936 	SMP_ZONING_ENABLE_OP_ENABLE = 0x1,
937 	SMP_ZONING_ENABLE_OP_DISABLE = 0x2
938 } smp_zoning_enable_op_t;
939 
940 /*
941  * SAS-2 10.4.3.20 ZONED BROADCAST (no additional response)
942  */
943 typedef struct smp_zoned_broadcast_req {
944 	uint8_t _restricted1[2];
945 	DECL_BITFIELD2(
946 	    szbr_broadcast_type	:4,
947 	    _reserved		:4);
948 	uint8_t szbr_n_broadcast_source_zone_groups;
949 	uint8_t szbr_broadcast_source_zone_groups[1];
950 } smp_zoned_broadcast_req_t;
951 
952 /*
953  * SAS-2 10.4.3.21 ZONE LOCK
954  */
955 typedef struct smp_zone_lock_req {
956 	uint16_t szlr_expected_exp_change_count;
957 	uint16_t szlr_zone_lock_inactivity_timeout;
958 	uint8_t szlr_zone_manager_password[32];
959 } smp_zone_lock_req_t;
960 
961 typedef struct smp_zone_lock_resp {
962 	uint8_t _reserved1[4];
963 	uint64_t szlr_active_zone_manager_sas_addr;
964 } smp_zone_lock_resp_t;
965 
966 /*
967  * SAS-2 10.4.3.22 ZONE ACTIVATE (no additional response)
968  */
969 typedef struct smp_zone_activate_req {
970 	uint16_t szar_expected_exp_change_count;
971 	uint8_t _reserved1[2];
972 } smp_zone_activate_req_t;
973 
974 /*
975  * SAS-2 10.4.3.23 ZONE UNLOCK (no additional response)
976  */
977 typedef struct smp_zone_unlock_req {
978 	uint8_t _restricted1[2];
979 	DECL_BITFIELD2(
980 	    szur_activate_required	:1,
981 	    _reserved1			:7);
982 	uint8_t _reserved2;
983 } smp_zone_unlock_req_t;
984 
985 /*
986  * SAS-2 10.4.3.24 CONFIGURE ZONE MANAGER PASSWORD (no additional response)
987  */
988 typedef struct smp_config_zone_manager_password_req {
989 	uint16_t sczmpr_expected_exp_change_count;
990 	DECL_BITFIELD2(
991 	    sczmpr_save		:2,		/* smp_zoning_save_t */
992 	    _reserved1		:6);
993 	uint8_t _reserved2;
994 	uint8_t sczmpr_zone_manager_password[32];
995 	uint8_t sczmpr_new_zone_manager_password[32];
996 } smp_config_zone_manager_password_req_t;
997 
998 /*
999  * SAS-2 10.4.3.25 CONFIGURE ZONE PHY INFORMATION (no additional response)
1000  */
1001 typedef struct smp_zone_phy_config_descr {
1002 	uint8_t szpcd_phy_identifier;
1003 	DECL_BITFIELD6(
1004 	    _reserved1				:2,
1005 	    szpcd_zone_group_persistent		:1,
1006 	    _reserved2				:1,
1007 	    szpcd_requested_inside_zpsds	:1,
1008 	    szpcd_inside_zpsds_persistent	:1,
1009 	    _reserved3				:2);
1010 	uint8_t _reserved4;
1011 	uint8_t szpcd_zone_group;
1012 } smp_zone_phy_config_descr_t;
1013 
1014 typedef struct smp_config_zone_phy_info_req {
1015 	uint16_t sczpir_expected_exp_change_count;
1016 	DECL_BITFIELD2(
1017 	    sczpir_save		:2,		/* smp_zoning_save_t */
1018 	    _reserved1		:6);
1019 	uint8_t sczpir_n_descrs;
1020 	smp_zone_phy_config_descr_t sczpir_descrs[1];
1021 } smp_config_zone_phy_info_req_t;
1022 
1023 /*
1024  * SAS-2 10.4.3.26 CONFIGURE ZONE PERMISSION TABLE (no additional response)
1025  */
1026 typedef struct smp_config_zone_perm_table_req {
1027 	uint16_t sczptr_expected_exp_change_count;
1028 	uint8_t sczptr_starting_source_zone_group;
1029 	uint8_t sczptr_n_descrs;
1030 	DECL_BITFIELD3(
1031 	    sczptr_save			:2,	/* smp_zoning_save_t */
1032 	    _reserved1			:4,
1033 	    sczptr_n_zone_groups	:2);	/* smp_n_zone_grps_t */
1034 	uint8_t _reserved2[7];
1035 	uint8_t sczptr_descrs[1];	/* smp_zone_perm_descrXXX_t */
1036 } smp_config_zone_perm_table_req_t;
1037 
1038 /*
1039  * SAS-2 10.4.3.27 CONFIGURE ROUTE INFORMATION (no additional response)
1040  */
1041 typedef struct smp_config_route_info_req {
1042 	uint16_t scrir_expected_exp_change_count;
1043 	uint16_t scrir_exp_route_index;
1044 	uint8_t _reserved1;
1045 	uint8_t scrir_phy_identifier;
1046 	uint8_t _reserved2[2];
1047 	DECL_BITFIELD2(
1048 	    _reserved3				:7,
1049 	    scrir_disable_exp_route_entry	:1);
1050 	uint8_t _reserved4[3];
1051 	uint64_t scrir_routed_sas_addr;
1052 	uint8_t _reserved5[16];
1053 } smp_config_route_info_req_t;
1054 
1055 /*
1056  * SAS-2 10.4.3.28 PHY CONTROL (no additional response)
1057  */
1058 typedef struct smp_phy_control_req {
1059 	uint16_t spcr_expected_exp_change_count;
1060 	uint8_t _reserved1[3];
1061 	uint8_t spcr_phy_identifier;
1062 	uint8_t spcr_phy_operation;
1063 	DECL_BITFIELD2(
1064 	    spcr_update_partial_pwy_timeout	:1,
1065 	    _reserved2				:7);
1066 	uint8_t _reserved3[12];
1067 	uint64_t spcr_attached_device_name;
1068 	DECL_BITFIELD2(
1069 	    _reserved4				:4,
1070 	    spcr_prog_min_phys_link_rate	:4);	/* smp_link_rate_t */
1071 	DECL_BITFIELD2(
1072 	    _reserved5				:4,
1073 	    spcr_prog_max_phys_link_rate	:4);	/* smp_link_rate_t */
1074 	uint8_t _reserved6[2];
1075 	DECL_BITFIELD2(
1076 	    spcr_partial_pwy_timeout	:4,
1077 	    _reserved7			:4);
1078 	uint8_t _reserved8[3];
1079 } smp_phy_control_req_t;
1080 
1081 typedef enum smp_phy_op {
1082 	SMP_PHY_OP_NOP = 0x00,
1083 	SMP_PHY_OP_LINK_RESET = 0x01,
1084 	SMP_PHY_OP_HARD_RESET = 0x02,
1085 	SMP_PHY_OP_DISABLE = 0x03,
1086 	SMP_PHY_OP_CLEAR_ERROR_LOG = 0x05,
1087 	SMP_PHY_OP_CLEAR_AFFILIATION = 0x06,
1088 	SMP_PHY_OP_TRANSMIT_SATA_PORT_SELECTION_SIGNAL = 0x07,
1089 	SMP_PHY_OP_CLEAR_STP_NEXUS_LOSS = 0x08,
1090 	SMP_PHY_OP_SET_ATTACHED_DEVICE_NAME = 0x09
1091 } smp_phy_op_t;
1092 
1093 /*
1094  * SAS-2 10.4.3.29 PHY TEST FUNCTION (no additional response)
1095  */
1096 typedef struct smp_phy_test_function_req {
1097 	uint16_t sptfr_expected_exp_change_count;
1098 	uint8_t _reserved1[3];
1099 	uint8_t sptfr_phy_identifier;
1100 	uint8_t sptfr_phy_test_function;
1101 	uint8_t sptfr_phy_test_pattern;		/* smp_phy_test_function_t */
1102 	uint8_t _reserved2[3];
1103 	DECL_BITFIELD4(
1104 	    sptfr_test_pattern_phys_link_rate	:4,	/* smp_link_rate_t */
1105 	    sptfr_test_pattern_ssc		:2,
1106 	    sptfr_test_pattern_sata		:1,
1107 	    _reserved3				:1);
1108 	uint8_t _reserved4[3];
1109 	uint8_t sptfr_phy_test_pattern_dwords_ctl;
1110 	uint8_t sptfr_phy_test_pattern_dwords[8];
1111 	uint8_t _reserved5[12];
1112 } smp_phy_test_function_req_t;
1113 
1114 typedef enum smp_phy_test_function {
1115 	SMP_PHY_TEST_FN_STOP = 0x00,
1116 	SMP_PHY_TEST_FN_TRANSMIT_PATTERN = 0x01
1117 } smp_phy_test_function_t;
1118 
1119 /*
1120  * SAS-2 10.4.3.30 CONFIGURE PHY EVENT (no additional response)
1121  */
1122 typedef struct smp_phy_event_config_descr {
1123 	uint8_t _reserved1[3];
1124 	uint8_t specd_phy_event_source;
1125 	uint32_t specd_peak_value_detector_threshold;
1126 } smp_phy_event_config_descr_t;
1127 
1128 typedef struct smp_config_phy_event_req {
1129 	uint16_t scper_expected_exp_change_count;
1130 	DECL_BITFIELD2(
1131 	    scper_clear_peaks	:1,
1132 	    _reserved1		:7);
1133 	uint8_t _reserved2[2];
1134 	uint8_t scper_phy_identifier;
1135 	uint8_t _reserved3;
1136 	uint8_t scper_n_descrs;
1137 	smp_phy_event_config_descr_t scper_descrs[1];
1138 } smp_config_phy_event_req_t;
1139 
1140 #pragma	pack()
1141 
1142 #ifdef	__cplusplus
1143 }
1144 #endif
1145 
1146 #endif	/* _SYS_SCSI_GENERIC_SMP_FRAMES_H */
1147