1*291a2b48SSukumar Swaminathan /*
2*291a2b48SSukumar Swaminathan  * CDDL HEADER START
3*291a2b48SSukumar Swaminathan  *
4*291a2b48SSukumar Swaminathan  * The contents of this file are subject to the terms of the
5*291a2b48SSukumar Swaminathan  * Common Development and Distribution License (the "License").
6*291a2b48SSukumar Swaminathan  * You may not use this file except in compliance with the License.
7*291a2b48SSukumar Swaminathan  *
8*291a2b48SSukumar Swaminathan  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*291a2b48SSukumar Swaminathan  * or http://www.opensolaris.org/os/licensing.
10*291a2b48SSukumar Swaminathan  * See the License for the specific language governing permissions
11*291a2b48SSukumar Swaminathan  * and limitations under the License.
12*291a2b48SSukumar Swaminathan  *
13*291a2b48SSukumar Swaminathan  * When distributing Covered Code, include this CDDL HEADER in each
14*291a2b48SSukumar Swaminathan  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*291a2b48SSukumar Swaminathan  * If applicable, add the following below this CDDL HEADER, with the
16*291a2b48SSukumar Swaminathan  * fields enclosed by brackets "[]" replaced with your own identifying
17*291a2b48SSukumar Swaminathan  * information: Portions Copyright [yyyy] [name of copyright owner]
18*291a2b48SSukumar Swaminathan  *
19*291a2b48SSukumar Swaminathan  * CDDL HEADER END
20*291a2b48SSukumar Swaminathan  */
21*291a2b48SSukumar Swaminathan 
22*291a2b48SSukumar Swaminathan /*
23*291a2b48SSukumar Swaminathan  * Copyright 2009 Emulex.  All rights reserved.
24*291a2b48SSukumar Swaminathan  * Use is subject to License terms.
25*291a2b48SSukumar Swaminathan  */
26*291a2b48SSukumar Swaminathan 
27*291a2b48SSukumar Swaminathan 
28*291a2b48SSukumar Swaminathan #ifndef _EMLXS_SDAPI_H
29*291a2b48SSukumar Swaminathan #define	_EMLXS_SDAPI_H
30*291a2b48SSukumar Swaminathan 
31*291a2b48SSukumar Swaminathan #ifdef	__cplusplus
32*291a2b48SSukumar Swaminathan extern "C" {
33*291a2b48SSukumar Swaminathan #endif
34*291a2b48SSukumar Swaminathan 
35*291a2b48SSukumar Swaminathan /*
36*291a2b48SSukumar Swaminathan  * Although information in this file can be used by app, libdfc or driver,
37*291a2b48SSukumar Swaminathan  * its purpose is for communication between app and libdfc.
38*291a2b48SSukumar Swaminathan  * Its content come from the SAN Diag API Specification.
39*291a2b48SSukumar Swaminathan  */
40*291a2b48SSukumar Swaminathan 
41*291a2b48SSukumar Swaminathan 
42*291a2b48SSukumar Swaminathan /* Define for refering SCSI_IO_LATENCY */
43*291a2b48SSukumar Swaminathan #define	SD_SCSI_IO_LATENCY_TYPE		0x01
44*291a2b48SSukumar Swaminathan 
45*291a2b48SSukumar Swaminathan #define	SD_IO_LATENCY_MAX_BUCKETS	20	/* Size of array range */
46*291a2b48SSukumar Swaminathan 
47*291a2b48SSukumar Swaminathan /* Masks for ELS Commands */
48*291a2b48SSukumar Swaminathan #define	SD_ELS_SUBCATEGORY_PLOGI_RCV	0x01
49*291a2b48SSukumar Swaminathan #define	SD_ELS_SUBCATEGORY_PRLO_RCV	0x02
50*291a2b48SSukumar Swaminathan #define	SD_ELS_SUBCATEGORY_ADISC_RCV	0x04
51*291a2b48SSukumar Swaminathan #define	SD_ELS_SUBCATEGORY_LSRJT_RCV	0x08
52*291a2b48SSukumar Swaminathan #define	SD_ELS_SUBCATEGORY_LOGO_RCV	0x10
53*291a2b48SSukumar Swaminathan #define	SD_ELS_SUBCATEGORY_RSCN_RCV	0x20
54*291a2b48SSukumar Swaminathan 
55*291a2b48SSukumar Swaminathan /* Masks for Fabric events */
56*291a2b48SSukumar Swaminathan #define	SD_FABRIC_SUBCATEGORY_FABRIC_BUSY	0x01
57*291a2b48SSukumar Swaminathan #define	SD_FABRIC_SUBCATEGORY_PORT_BUSY		0x02
58*291a2b48SSukumar Swaminathan #define	SD_FABRIC_SUBCATEGORY_FCPRDCHKERR	0x04
59*291a2b48SSukumar Swaminathan 
60*291a2b48SSukumar Swaminathan /* Masks for SCSI events */
61*291a2b48SSukumar Swaminathan #define	SD_SCSI_SUBCATEGORY_QFULL			0x0001
62*291a2b48SSukumar Swaminathan #define	SD_SCSI_SUBCATEGORY_DEVBSY			0x0002
63*291a2b48SSukumar Swaminathan #define	SD_SCSI_SUBCATEGORY_CHECKCONDITION		0x0004
64*291a2b48SSukumar Swaminathan #define	SD_SCSI_SUBCATEGORY_LUNRESET			0x0008
65*291a2b48SSukumar Swaminathan #define	SD_SCSI_SUBCATEGORY_TGTRESET			0x0010
66*291a2b48SSukumar Swaminathan #define	SD_SCSI_SUBCATEGORY_BUSRESET			0x0020
67*291a2b48SSukumar Swaminathan #define	SD_SCSI_SUBCATEGORY_VARQUEDEPTH			0x0040
68*291a2b48SSukumar Swaminathan 
69*291a2b48SSukumar Swaminathan /* Masks for Board Events */
70*291a2b48SSukumar Swaminathan #define	SD_BOARD_SUBCATEGORY_PORTINTERR		0x01
71*291a2b48SSukumar Swaminathan #define	SD_BOARD_SUBCATEGORY_LINKATTE		0x02
72*291a2b48SSukumar Swaminathan 
73*291a2b48SSukumar Swaminathan /* Masks for Adapter Events */
74*291a2b48SSukumar Swaminathan #define	SD_ADAPTER_SUBCATEGORY_ARRIVAL		0x01
75*291a2b48SSukumar Swaminathan #define	SD_ADAPTER_SUBCATEGORY_DEPARTURE	0x02
76*291a2b48SSukumar Swaminathan 
77*291a2b48SSukumar Swaminathan /* Struct to hold SCSI IO Latency statistics per bucket */
78*291a2b48SSukumar Swaminathan struct SD_time_stats_v0 {
79*291a2b48SSukumar Swaminathan 	int sd_tstats_bucket_count;
80*291a2b48SSukumar Swaminathan };
81*291a2b48SSukumar Swaminathan 
82*291a2b48SSukumar Swaminathan /* Struct per target for SCSI IO Latency */
83*291a2b48SSukumar Swaminathan struct SD_IO_Latency_Response {
84*291a2b48SSukumar Swaminathan 	HBA_WWN sd_iolatency_target_wwpn;
85*291a2b48SSukumar Swaminathan 	/* Size of array depends on range size */
86*291a2b48SSukumar Swaminathan 	struct SD_time_stats_v0 sd_time_stats_array[SD_IO_LATENCY_MAX_BUCKETS];
87*291a2b48SSukumar Swaminathan };
88*291a2b48SSukumar Swaminathan 
89*291a2b48SSukumar Swaminathan /* Return Codes */
90*291a2b48SSukumar Swaminathan enum SD_RETURN_CODES {
91*291a2b48SSukumar Swaminathan 	SD_OK,
92*291a2b48SSukumar Swaminathan 	SD_ERROR_GENERIC,
93*291a2b48SSukumar Swaminathan 	SD_ERROR_ARG,
94*291a2b48SSukumar Swaminathan 	SD_ERROR_INVALID_BOARD_ID,
95*291a2b48SSukumar Swaminathan 	SD_ERROR_INVALID_VPORT,
96*291a2b48SSukumar Swaminathan 	SD_ERROR_NOT_SUPPORTED,
97*291a2b48SSukumar Swaminathan 	SD_ERROR_CATEGORY_NOT_SUPPORTED,
98*291a2b48SSukumar Swaminathan 	SD_ERROR_SUBCATEGORY_NOT_SUPPORTED,
99*291a2b48SSukumar Swaminathan 	SD_ERROR_MORE_DATA_AVAILABLE,
100*291a2b48SSukumar Swaminathan 	SD_ERROR_EVENT_ALREADY_REGISTERED,
101*291a2b48SSukumar Swaminathan 	SD_ERROR_NO_ACTIVE_REGISTRATION,
102*291a2b48SSukumar Swaminathan 	SD_ERROR_ARG_MISSING,
103*291a2b48SSukumar Swaminathan 	SD_ERROR_NO_MEMORY,
104*291a2b48SSukumar Swaminathan 	SD_ERROR_BUCKET_NOTSET,
105*291a2b48SSukumar Swaminathan 	SD_ERROR_REG_HANDLE,
106*291a2b48SSukumar Swaminathan 	SD_ERROR_INVALID_SEARCH_TYPE,
107*291a2b48SSukumar Swaminathan 	SD_ERROR_FUNCTION_NOT_SUPPORTED,
108*291a2b48SSukumar Swaminathan 	SD_ERROR_OUT_OF_HANDLES,
109*291a2b48SSukumar Swaminathan 	SD_ERROR_LIB_NOT_INIT,
110*291a2b48SSukumar Swaminathan 	SD_ERROR_DATA_COLLECTION_ACTIVE,
111*291a2b48SSukumar Swaminathan 	SD_ERROR_DATA_COLLECTION_NOT_ACTIVE,
112*291a2b48SSukumar Swaminathan 	SD_MAX_RETURN_CODES
113*291a2b48SSukumar Swaminathan };
114*291a2b48SSukumar Swaminathan 
115*291a2b48SSukumar Swaminathan 
116*291a2b48SSukumar Swaminathan #define	SD_SEARCH_LINEAR	0x01
117*291a2b48SSukumar Swaminathan #define	SD_SEARCH_POWER_2	0x02
118*291a2b48SSukumar Swaminathan 
119*291a2b48SSukumar Swaminathan 
120*291a2b48SSukumar Swaminathan extern uint32_t	DFC_SD_Get_Granularity(void);
121*291a2b48SSukumar Swaminathan 
122*291a2b48SSukumar Swaminathan extern int32_t	DFC_SD_Set_Bucket(uint16_t type,
123*291a2b48SSukumar Swaminathan 				uint16_t search_type,
124*291a2b48SSukumar Swaminathan 				uint32_t base,
125*291a2b48SSukumar Swaminathan 				uint32_t step);
126*291a2b48SSukumar Swaminathan 
127*291a2b48SSukumar Swaminathan extern int32_t	DFC_SD_Destroy_Bucket(uint16_t type);
128*291a2b48SSukumar Swaminathan 
129*291a2b48SSukumar Swaminathan extern int32_t	DFC_SD_Get_Bucket(uint16_t type,
130*291a2b48SSukumar Swaminathan 				uint16_t *search_type,
131*291a2b48SSukumar Swaminathan 				uint32_t *base,
132*291a2b48SSukumar Swaminathan 				uint32_t *step,
133*291a2b48SSukumar Swaminathan 				uint64_t *values);
134*291a2b48SSukumar Swaminathan 
135*291a2b48SSukumar Swaminathan extern int32_t	DFC_SD_Start_Data_Collection(uint32_t board,
136*291a2b48SSukumar Swaminathan 				HBA_WWN port_id,
137*291a2b48SSukumar Swaminathan 				uint16_t type,
138*291a2b48SSukumar Swaminathan 				void *arg);
139*291a2b48SSukumar Swaminathan 
140*291a2b48SSukumar Swaminathan extern int32_t	DFC_SD_Stop_Data_Collection(uint32_t board,
141*291a2b48SSukumar Swaminathan 				HBA_WWN port_id,
142*291a2b48SSukumar Swaminathan 				uint16_t type);
143*291a2b48SSukumar Swaminathan 
144*291a2b48SSukumar Swaminathan extern int32_t	DFC_SD_Reset_Data_Collection(uint32_t board,
145*291a2b48SSukumar Swaminathan 				HBA_WWN port_id,
146*291a2b48SSukumar Swaminathan 				uint16_t type);
147*291a2b48SSukumar Swaminathan 
148*291a2b48SSukumar Swaminathan extern int32_t	DFC_SD_Get_Data(uint32_t board,
149*291a2b48SSukumar Swaminathan 				HBA_WWN port_id,
150*291a2b48SSukumar Swaminathan 				uint16_t type,
151*291a2b48SSukumar Swaminathan 				uint16_t *target,
152*291a2b48SSukumar Swaminathan 				uint32_t buf_size,
153*291a2b48SSukumar Swaminathan 				void *buff);
154*291a2b48SSukumar Swaminathan 
155*291a2b48SSukumar Swaminathan #define	SD_REG_ELS_EVENT	0x01
156*291a2b48SSukumar Swaminathan #define	SD_REG_FABRIC_EVENT	0x02
157*291a2b48SSukumar Swaminathan #define	SD_REG_SCSI_EVENT	0x04
158*291a2b48SSukumar Swaminathan #define	SD_REG_BOARD_EVENT	0x08
159*291a2b48SSukumar Swaminathan #define	SD_REG_ADAPTER_EVENT	0x10
160*291a2b48SSukumar Swaminathan 
161*291a2b48SSukumar Swaminathan 
162*291a2b48SSukumar Swaminathan #define	SD_ELS_SUBCATEGORY_VALID_MASK	(SD_ELS_SUBCATEGORY_PLOGI_RCV | \
163*291a2b48SSukumar Swaminathan 	SD_ELS_SUBCATEGORY_PRLO_RCV | SD_ELS_SUBCATEGORY_ADISC_RCV | \
164*291a2b48SSukumar Swaminathan 	SD_ELS_SUBCATEGORY_LSRJT_RCV | SD_ELS_SUBCATEGORY_LOGO_RCV | \
165*291a2b48SSukumar Swaminathan 	SD_ELS_SUBCATEGORY_RSCN_RCV)
166*291a2b48SSukumar Swaminathan 
167*291a2b48SSukumar Swaminathan 
168*291a2b48SSukumar Swaminathan /* Generic Payload */
169*291a2b48SSukumar Swaminathan struct sd_event {
170*291a2b48SSukumar Swaminathan 	uint32_t	sd_evt_version;
171*291a2b48SSukumar Swaminathan 	size_t		sd_evt_size;
172*291a2b48SSukumar Swaminathan 	void		*sd_evt_payload;
173*291a2b48SSukumar Swaminathan };
174*291a2b48SSukumar Swaminathan 
175*291a2b48SSukumar Swaminathan 
176*291a2b48SSukumar Swaminathan struct sd_els_event_details_v0 {
177*291a2b48SSukumar Swaminathan 	uint32_t	sd_elsevt_version;
178*291a2b48SSukumar Swaminathan 	void		*sd_elsevt_payload;
179*291a2b48SSukumar Swaminathan };
180*291a2b48SSukumar Swaminathan 
181*291a2b48SSukumar Swaminathan 
182*291a2b48SSukumar Swaminathan struct sd_plogi_rcv_v0 {
183*291a2b48SSukumar Swaminathan 	uint32_t	sd_plogir_version;
184*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_plogir_portname;
185*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_plogir_nodename;
186*291a2b48SSukumar Swaminathan };
187*291a2b48SSukumar Swaminathan 
188*291a2b48SSukumar Swaminathan 
189*291a2b48SSukumar Swaminathan struct sd_prlo_rcv_v0 {
190*291a2b48SSukumar Swaminathan 	uint32_t	sd_prlor_version;
191*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_prlor_remoteport;
192*291a2b48SSukumar Swaminathan };
193*291a2b48SSukumar Swaminathan 
194*291a2b48SSukumar Swaminathan 
195*291a2b48SSukumar Swaminathan struct sd_lsrjt_rcv_v0 {
196*291a2b48SSukumar Swaminathan 	uint32_t	sd_lsrjtr_version;
197*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_lsrjtr_remoteport;
198*291a2b48SSukumar Swaminathan 	uint32_t	sd_lsrjtr_original_cmd;
199*291a2b48SSukumar Swaminathan 	uint32_t	sd_lsrjtr_reasoncode;
200*291a2b48SSukumar Swaminathan 	uint32_t	sd_lsrjtr_reasoncodeexpl;
201*291a2b48SSukumar Swaminathan };
202*291a2b48SSukumar Swaminathan 
203*291a2b48SSukumar Swaminathan 
204*291a2b48SSukumar Swaminathan struct sd_adisc_rcv_v0 {
205*291a2b48SSukumar Swaminathan 	uint32_t	sd_adiscr_version;
206*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_adiscr_portname;
207*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_adiscr_nodename;
208*291a2b48SSukumar Swaminathan };
209*291a2b48SSukumar Swaminathan 
210*291a2b48SSukumar Swaminathan 
211*291a2b48SSukumar Swaminathan #define	SD_FABRIC_SUBCATEGORY_VALID_MASK	(\
212*291a2b48SSukumar Swaminathan 	SD_FABRIC_SUBCATEGORY_FABRIC_BUSY | SD_FABRIC_SUBCATEGORY_PORT_BUSY | \
213*291a2b48SSukumar Swaminathan 	SD_FABRIC_SUBCATEGORY_FCPRDCHKERR)
214*291a2b48SSukumar Swaminathan 
215*291a2b48SSukumar Swaminathan 
216*291a2b48SSukumar Swaminathan struct sd_fabric_event_details_v0 {
217*291a2b48SSukumar Swaminathan 	uint32_t	sd_fabric_evt_version;
218*291a2b48SSukumar Swaminathan 	void		*sd_fabric_evt_payload;
219*291a2b48SSukumar Swaminathan };
220*291a2b48SSukumar Swaminathan 
221*291a2b48SSukumar Swaminathan 
222*291a2b48SSukumar Swaminathan struct sd_pbsy_rcv_v0 {
223*291a2b48SSukumar Swaminathan 	uint32_t	sd_pbsyr_evt_version;
224*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_pbsyr_rport;
225*291a2b48SSukumar Swaminathan };
226*291a2b48SSukumar Swaminathan 
227*291a2b48SSukumar Swaminathan 
228*291a2b48SSukumar Swaminathan struct sd_fcprdchkerr_v0 {
229*291a2b48SSukumar Swaminathan 	uint32_t	sd_fcprdchkerr_version;
230*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_fcprdchkerr_rport;
231*291a2b48SSukumar Swaminathan 	uint32_t	sd_fcprdchkerr_lun;
232*291a2b48SSukumar Swaminathan 	uint32_t	sd_fcprdchkerr_opcode;
233*291a2b48SSukumar Swaminathan 	uint32_t	sd_fcprdchkerr_fcpiparam;
234*291a2b48SSukumar Swaminathan };
235*291a2b48SSukumar Swaminathan 
236*291a2b48SSukumar Swaminathan 
237*291a2b48SSukumar Swaminathan #define	SD_SCSI_SUBCATEGORY_VALID_MASK	(\
238*291a2b48SSukumar Swaminathan 	SD_SCSI_SUBCATEGORY_QFULL | SD_SCSI_SUBCATEGORY_DEVBSY | \
239*291a2b48SSukumar Swaminathan 	SD_SCSI_SUBCATEGORY_CHECKCONDITION | SD_SCSI_SUBCATEGORY_LUNRESET | \
240*291a2b48SSukumar Swaminathan 	SD_SCSI_SUBCATEGORY_TGTRESET | SD_SCSI_SUBCATEGORY_BUSRESET | \
241*291a2b48SSukumar Swaminathan 	SD_SCSI_SUBCATEGORY_VARQUEDEPTH)
242*291a2b48SSukumar Swaminathan 
243*291a2b48SSukumar Swaminathan struct sd_scsi_event_details_v0 {
244*291a2b48SSukumar Swaminathan 	uint32_t	sd_scsi_evt_version;
245*291a2b48SSukumar Swaminathan 	void		*sd_scsi_evt_payload;
246*291a2b48SSukumar Swaminathan };
247*291a2b48SSukumar Swaminathan 
248*291a2b48SSukumar Swaminathan 
249*291a2b48SSukumar Swaminathan struct sd_scsi_generic_v0 {
250*291a2b48SSukumar Swaminathan 	uint32_t	sd_scsi_generic_version;
251*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_scsi_generic_rport;
252*291a2b48SSukumar Swaminathan 	int32_t		sd_scsi_generic_lun;
253*291a2b48SSukumar Swaminathan };
254*291a2b48SSukumar Swaminathan 
255*291a2b48SSukumar Swaminathan 
256*291a2b48SSukumar Swaminathan struct sd_scsi_checkcond_v0 {
257*291a2b48SSukumar Swaminathan 	uint32_t	sd_scsi_checkcond_version;
258*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_scsi_checkcond_rport;
259*291a2b48SSukumar Swaminathan 	uint32_t	sd_scsi_checkcond_lun;
260*291a2b48SSukumar Swaminathan 	uint32_t	sd_scsi_checkcond_cmdcode;
261*291a2b48SSukumar Swaminathan 	uint32_t	sd_scsi_checkcond_sensekey;
262*291a2b48SSukumar Swaminathan 	uint32_t	sd_scsi_checkcond_asc;
263*291a2b48SSukumar Swaminathan 	uint32_t	sd_scsi_checkcond_ascq;
264*291a2b48SSukumar Swaminathan };
265*291a2b48SSukumar Swaminathan 
266*291a2b48SSukumar Swaminathan 
267*291a2b48SSukumar Swaminathan struct sd_scsi_varquedepth_v0 {
268*291a2b48SSukumar Swaminathan 	uint32_t	sd_varquedepth_version;
269*291a2b48SSukumar Swaminathan 	HBA_WWN		sd_varquedepth_rport;
270*291a2b48SSukumar Swaminathan 	int32_t		sd_varquedepth_lun;
271*291a2b48SSukumar Swaminathan 	uint32_t	sd_varquedepth_oldval;
272*291a2b48SSukumar Swaminathan 	uint32_t	sd_varquedepth_newval;
273*291a2b48SSukumar Swaminathan };
274*291a2b48SSukumar Swaminathan 
275*291a2b48SSukumar Swaminathan 
276*291a2b48SSukumar Swaminathan /* Prototype for callback */
277*291a2b48SSukumar Swaminathan typedef void sd_callback(uint32_t board_id,
278*291a2b48SSukumar Swaminathan 			HBA_WWN 	ort_id,
279*291a2b48SSukumar Swaminathan 			uint32_t	category,
280*291a2b48SSukumar Swaminathan 			uint32_t	subcategory,
281*291a2b48SSukumar Swaminathan 			void		*context,
282*291a2b48SSukumar Swaminathan 			struct sd_event	*sd_data);
283*291a2b48SSukumar Swaminathan 
284*291a2b48SSukumar Swaminathan /* Register for event */
285*291a2b48SSukumar Swaminathan extern int32_t DFC_SD_RegisterForEvent(uint32_t board_id,
286*291a2b48SSukumar Swaminathan 				HBA_WWN		port_id,
287*291a2b48SSukumar Swaminathan 				uint32_t	category,
288*291a2b48SSukumar Swaminathan 				uint32_t	subcategory,
289*291a2b48SSukumar Swaminathan 				void		*context,
290*291a2b48SSukumar Swaminathan 				uint32_t	*reg_handle,
291*291a2b48SSukumar Swaminathan 				sd_callback	*func);
292*291a2b48SSukumar Swaminathan 
293*291a2b48SSukumar Swaminathan 
294*291a2b48SSukumar Swaminathan /* Deregister a event */
295*291a2b48SSukumar Swaminathan extern int32_t DFC_SD_unRegisterForEvent(uint32_t board_id,
296*291a2b48SSukumar Swaminathan 				HBA_WWN		vport_id,
297*291a2b48SSukumar Swaminathan 				uint32_t	reg_handle);
298*291a2b48SSukumar Swaminathan 
299*291a2b48SSukumar Swaminathan 
300*291a2b48SSukumar Swaminathan #ifdef	__cplusplus
301*291a2b48SSukumar Swaminathan }
302*291a2b48SSukumar Swaminathan #endif
303*291a2b48SSukumar Swaminathan 
304*291a2b48SSukumar Swaminathan #endif	/* _EMLXS_SDAPI_H */
305