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