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) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 #ifndef _SYS_SCSI_IMPL_SCSI_SAS_H
26 #define	_SYS_SCSI_IMPL_SCSI_SAS_H
27 
28 #include <sys/types.h>
29 #include <sys/scsi/impl/usmp.h>
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 #if defined(_KERNEL)
36 /*
37  * Phymap support
38  */
39 typedef struct __sas_phymap    sas_phymap_t;
40 typedef enum { PHYMAP_MODE_SIMPLE } sas_phymap_mode_t;
41 typedef void (*sas_phymap_activate_cb_t)
42 		(void *phymap_priv, char *ua, void **ua_privp);
43 typedef void (*sas_phymap_deactivate_cb_t)
44 		(void *phymap_priv, char *ua, void *ua_priv);
45 
46 extern int	sas_phymap_create(dev_info_t		*hba_dip,
47 				int			settle_usec,
48 				sas_phymap_mode_t	mode,
49 				void			*mode_argument,
50 				void			*phymap_priv,
51 				sas_phymap_activate_cb_t activate_cb,
52 				sas_phymap_deactivate_cb_t deactivate_cb,
53 				sas_phymap_t		**phymapp);
54 void		sas_phymap_destroy(sas_phymap_t		*phymap);
55 
56 extern int	sas_phymap_phy_add(sas_phymap_t		*phymap,
57 				int			phy,
58 				uint64_t		local_sas_address,
59 				uint64_t		remote_sas_address);
60 extern int	sas_phymap_phy_rem(sas_phymap_t		*phymap,
61 				int			phy);
62 
63 extern char	*sas_phymap_lookup_ua(sas_phymap_t	*phymap,
64 				uint64_t		local_sas_address,
65 				uint64_t		remote_sas_address);
66 extern void	*sas_phymap_lookup_uapriv(sas_phymap_t	*phymap,
67 				char			*ua);
68 
69 extern char	*sas_phymap_phy2ua(sas_phymap_t		*phymap,
70 				int			phy);
71 void		sas_phymap_ua_free(char	*);
72 
73 extern int	sas_phymap_uahasphys(sas_phymap_t	*phymap,
74 				char			*ua);
75 
76 typedef struct __sas_phymap_phys	sas_phymap_phys_t;
77 extern sas_phymap_phys_t *sas_phymap_ua2phys(sas_phymap_t *phymap,
78 				char			*ua);
79 extern int	sas_phymap_phys_next(sas_phymap_phys_t	*phys);
80 void		sas_phymap_phys_free(sas_phymap_phys_t	*phys);
81 #endif /* defined(_KERNEL) */
82 
83 
84 
85 #define	KSTAT_SAS_PHY_CLASS	"SAS_phy_stat"
86 /*
87  * Format of the ks_name field for SAS Phy Stat
88  *
89  * driver_name.initiator_port_SAS_address.initiator_port_instance_number.phyid
90  * Example: pmcs.5000c50000d756aa.2.0
91  *
92  * driver_name:
93  *     driver name from di_driver_name() on SAS initiator port devinfo node.
94  *
95  * initiator_port_SAS_address:
96  *     SAS address of the initiator port that phy stat is reported for.
97  *
98  * initiator_port_instance_number:
99  *     instance number of the initiator port that phy stat is reported for.
100  *
101  * phyid:
102  *     prop phyIdentifier under initiator port node.
103  */
104 
105 /* Port Protocol - kstat structure definition */
106 typedef struct sas_port_protocol_stats {
107 	kstat_named_t	seconds_since_last_reset;
108 	kstat_named_t	input_requests;
109 	kstat_named_t	output_requests;
110 	kstat_named_t	control_requests;
111 	kstat_named_t	input_megabytes;
112 	kstat_named_t	output_megabytes;
113 } sas_port_protocol_stats_t;
114 
115 /* Port - kstat structure definition */
116 typedef struct sas_port_stats {
117 	kstat_named_t	seconds_since_last_reset;
118 	kstat_named_t	tx_frames;
119 	kstat_named_t	tx_words;
120 	kstat_named_t	rx_frames;
121 	kstat_named_t	rx_words;
122 } sas_port_stats_t;
123 
124 /* PHY - kstat structure definition */
125 typedef struct sas_phy_stats {
126 	kstat_named_t	seconds_since_last_reset;
127 	kstat_named_t	tx_frames;
128 	kstat_named_t	tx_words;
129 	kstat_named_t	rx_frames;
130 	kstat_named_t	rx_words;
131 	kstat_named_t	invalid_dword_count;
132 	kstat_named_t	running_disparity_error_count;
133 	kstat_named_t	loss_of_dword_sync_count;
134 	kstat_named_t	phy_reset_problem_count;
135 } sas_phy_stats_t;
136 
137 /*
138  * Supported Protocol property
139  */
140 #define	SAS_PROTOCOL_SSP	0x00000001
141 #define	SAS_PROTOCOL_STP	0x00000010
142 #define	SAS_PROTOCOL_SMP	0x00000100
143 #define	SAS_PROTOCOL_SATA	0x00001000
144 
145 
146 /*
147  * Definition - Negotiated Physical Link Rate
148  * Based on Table 288 (Section 10.4.3.10) of the spec (SAS-2 r-15), these
149  * constants represent "Negotiated physical link rate"
150  * (and implicitly the State of the phy).
151  */
152 #define	SAS_LINK_RATE_UNKNOWN		0x0 /* Phy is enabled. */
153 					    /* Speed is unknown */
154 #define	SAS_LINK_RATE_DISABLED		0x1 /* Phy is disabled. */
155 					    /* Speed is undefined */
156 #define	SAS_LINK_RATE_FAILED		0x2 /* Phy is enabled. */
157 					    /* Failed speed negotiation. */
158 #define	SAS_LINK_RATE_SATASPINUP	0x3 /* Phy is enabled. */
159 					    /* Detected a SATA device and */
160 					    /* entered the SATA Spinup hold */
161 					    /* state */
162 #define	SAS_LINK_RATE_SATAPORTSEL	0x4 /* Phy enabled. */
163 					    /* The phy is attached to a */
164 					    /* Port Selector (SATA-2.6). */
165 #define	SAS_LINK_RATE_RESET_IN_PROGRESS	0x5 /* Phy is enabled. */
166 					    /* Expander is performing SMP */
167 					    /* PHY CONTROL Link/Hard Reset */
168 #define	SAS_LINK_RATE_PHY_UNSUPPORTED	0x6 /* Phy is enabled. */
169 					    /* Unsupported phy settings */
170 #define	SAS_LINK_RATE_RESERVED		0x7 /* Undefined. Reserved. */
171 #define	SAS_LINK_RATE_1_5GBIT		0x8 /* Phy enabled at 1.5 GBit/sec */
172 #define	SAS_LINK_RATE_3GBIT		0x9 /* Phy enabled at 3 GBit/sec */
173 #define	SAS_LINK_RATE_6GBIT		0xA /* Phy enabled at 6 GBit/sec. */
174 
175 
176 /*
177  * Definition - "phy-info" property
178  *
179  * The property is an nvlist_array that represents an array of the
180  * nvlists on a per HBA basis. The individual elements of the array
181  * (the nvlists) represent the following properties for each phy of the HBA
182  */
183 #define	SAS_PHY_INFO		"phy-info"		/* Phy property name */
184 #define	SAS_PHY_INFO_NVL	"phy-info-nvl"		/* NVL array name */
185 
186 #define	SAS_PHY_ID		"PhyIdentifier"		/* DATA_TYPE_UINT8 */
187 #define	SAS_NEG_LINK_RATE	"NegotiatedLinkRate"	/* DATA_TYPE_INT8 */
188 #define	SAS_PROG_MIN_LINK_RATE	"ProgrammedMinLinkRate"	/* DATA_TYPE_INT8 */
189 #define	SAS_HW_MIN_LINK_RATE	"HardwareMinLinkRate"	/* DATA_TYPE_INT8 */
190 #define	SAS_PROG_MAX_LINK_RATE	"ProgrammedMaxLinkRate"	/* DATA_TYPE_INT8 */
191 #define	SAS_HW_MAX_LINK_RATE	"HardwareMaxLinkRate"	/* DATA_TYPE_INT8 */
192 
193 
194 /*
195  * Phy-mask property names for the target port, attached port and receptacle
196  */
197 #define	SCSI_ADDR_PROP_TARGET_PORT_PM	"target-port-pm"
198 #define	SCSI_ADDR_PROP_ATTACHED_PORT_PM	"attached-port-pm"
199 #define	SCSI_HBA_PROP_RECEPTACLE_PM	"receptacle-pm"
200 
201 /*
202  * Target port depth property names - Indicates the number of expanders
203  * between the initiator port and the target port
204  */
205 #define	SCSI_ADDR_PROP_TARGET_PORT_DEPTH	"target-port-depth"
206 
207 
208 /*
209  * Event definitions
210  */
211 /* Event Class */
212 #define	EC_HBA				"EC_hba"
213 
214 /* Event Sub-Class */
215 #define	ESC_SAS_HBA_PORT_BROADCAST	"ESC_sas_hba_port_broadcast"
216 /* Event Types for above Subclass */
217 #define	SAS_PORT_BROADCAST_CHANGE	"port_broadcast_change"
218 #define	SAS_PORT_BROADCAST_SES		"port_broadcast_ses"
219 #define	SAS_PORT_BROADCAST_D24_0	"port_broadcast_d24_0"
220 #define	SAS_PORT_BROADCAST_D27_4	"port_broadcast_d27_4"
221 #define	SAS_PORT_BROADCAST_D01_4	"port_broadcast_d01_4"
222 #define	SAS_PORT_BROADCAST_D04_7	"port_broadcast_d04_7"
223 #define	SAS_PORT_BROADCAST_D16_7	"port_broadcast_d16_7"
224 #define	SAS_PORT_BROADCAST_D29_7	"port_broadcast_d29_7"
225 
226 /* Event Sub-Class */
227 #define	ESC_SAS_PHY_EVENT		"ESC_sas_phy_event"
228 /* Event Types for above Subclass */
229 #define	SAS_PHY_ONLINE			"port_online"
230 #define	SAS_PHY_OFFLINE			"port_offline"
231 #define	SAS_PHY_REMOVE			"port_remove"
232 
233 /* Event Payload Names */
234 #define	SAS_DRV_INST			"driver_instance"
235 #define	SAS_PORT_ADDR			"port_address"
236 #define	SAS_DEVFS_PATH			"devfs_path"
237 #define	SAS_EVENT_TYPE			"event_type"
238 #define	SAS_LINK_RATE			"link_rate"
239 /* SAS_PHY_ID - Defined Above */
240 
241 #ifdef	__cplusplus
242 }
243 #endif
244 
245 #endif	/* _SYS_SCSI_IMPL_SCSI_SAS_H */
246