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 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _CS_H
27#define	_CS_H
28
29#ifdef	__cplusplus
30extern "C" {
31#endif
32
33/*
34 * PCMCIA Card Services header file
35 */
36
37/*
38 * XXX - This define really should be in a global header file
39 *	somewhere; we do this stunt here since a lot of
40 *	people include this header file but not necessarily
41 *	the header file in which this is defined.
42 */
43#ifndef	_VERSION
44#define	_VERSION(major, minor)	((major)<<16|(minor))
45#endif
46
47/*
48 * Define this version of CS - this should correspond to the PCMCIA
49 *	version number specified in the PCMCIA standard.
50 */
51#define	CS_VERSION	_VERSION(5, 2)
52
53/*
54 * CS_INTERNAL_REVISION_LEVEL is our internal revision level value returned
55 *	via GetCardServicesInfo in get_cardservices_info_t->Revision
56 */
57#define	CS_INTERNAL_REVISION_LEVEL	_VERSION(2, 0)
58
59#define	CS_GET_CARDSERVICES_INFO_VENDOR_STRING	"Solaris UNIX Card Services\n" \
60	"Copyright 2008 Sun Microsystems, Inc.  All rights reserved.\n" \
61	"Use is subject to license terms.\n" \
62	"@(#)cs.h	1.69 08/10/17 SMI\n" \
63	"Based on the PC Card Standard, February 1995\n"
64
65/*
66 * typedef for function pointers to quiet lint and cc -v
67 */
68typedef	int32_t (csfunction_t)(int32_t, ...);	/* for lint - cc -v quieting */
69
70/*
71 * CS_SUN_VENDOR_DESCRIPTION - can be returned by clients handling
72 *				the CS_EVENT_CLIENT_INFO event in the
73 *				client_info_t->VendorName member.
74 */
75#define	CS_SUN_VENDOR_DESCRIPTION	"Sun Microsystems, Inc. (c) 1996"
76
77/*
78 * Return codes from Card Services - these correspond to the PCMCIA
79 *	standard and also include some implementation-specific return
80 *	codes.
81 */
82#define	CS_SUCCESS		0x00	/* Request succeeded */
83#define	CS_BAD_ADAPTER		0x01	/* Specified adapter is invalid */
84#define	CS_BAD_ATTRIBUTE	0x02	/* Bad attribute value */
85#define	CS_BAD_BASE		0x03	/* System base address invalid */
86#define	CS_BAD_EDC		0x04	/* EDC generator is invalid */
87	/* RESERVED - 0x05 */
88#define	CS_BAD_IRQ		0x06	/* Invalid IRQ */
89#define	CS_BAD_OFFSET		0x07	/* Card offset invalid */
90#define	CS_BAD_PAGE		0x08	/* Card page invalid */
91#define	CS_READ_FAILURE		0x09	/* Unable to complete read request */
92#define	CS_BAD_SIZE		0x0a	/* Size is invalid */
93#define	CS_BAD_SOCKET		0x0b	/* Specified socket is invalid */
94	/* RESERVED - 0x0c */
95#define	CS_BAD_TYPE		0x0d	/* Window/interface type invalid */
96#define	CS_BAD_VCC		0x0e	/* Vcc value/index invalid */
97#define	CS_BAD_VPP		0x0f	/* Vpp value/index invalid */
98#define	CS_BAD_WINDOW		0x11	/* Specified window is invalid */
99#define	CS_WRITE_FAILURE	0x12	/* Unable to complete write request */
100	/* RESERVED - 0x13 */
101#define	CS_NO_CARD		0x14	/* No PC card in socket */
102#define	CS_UNSUPPORTED_FUNCTION	0x15	/* Unsupported function */
103#define	CS_UNSUPPORTED_MODE	0x16	/* Unsupported processor mode */
104#define	CS_BAD_SPEED		0x17	/* Specified speed is unavailable */
105#define	CS_BUSY			0x18	/* CS is busy - try again later */
106#define	CS_GENERAL_FAILURE	0x19	/* Undefined error */
107#define	CS_WRITE_PROTECTED	0x1a	/* Media is write protected */
108#define	CS_BAD_ARG_LENGTH	0x1b	/* Arg length invalid */
109#define	CS_BAD_ARGS		0x1c	/* Arg values invalid */
110#define	CS_CONFIGURATION_LOCKED	0x1d	/* This configuration is locked */
111#define	CS_IN_USE		0x1e	/* Requested resource in use */
112#define	CS_NO_MORE_ITEMS	0x1f	/* No more of requested item */
113#define	CS_OUT_OF_RESOURCE	0x20	/* Internal CS resources exhausted */
114#define	CS_BAD_HANDLE		0x21	/* client or window handle invalid */
115
116/*
117 * The following are Solaris-specific extended return codes
118 */
119#define	CS_NO_CIS		0x80	/* No CIS on card */
120#define	CS_BAD_CIS		0x81	/* Bad CIS on card */
121#define	CS_UNKNOWN_TUPLE	0x82	/* unknown tuple */
122#define	CS_BAD_VERSION		0x83	/* bad CS version */
123#define	CS_UNSUPPORTED_EVENT	0x84	/* Unsupported event in client */
124#define	CS_CSI_ERROR		0x85	/* error in csi driver protocol */
125#define	CS_CSI_NOT_INIT		0x86	/* csi library/driver not initialized */
126#define	CS_NO_TUPLE_PARSER	0x87	/* no tuple parser for this tuple */
127#define	CS_CARD_NOT_READY	0x88	/* card not ready */
128#define	CS_ERRORLIST_END	0x8000	/* end of error list */
129
130/*
131 * Card Services event codes - these do NOT correspond to the PCMCIA
132 *	standard event codes for CS since these events are encoded as
133 *	bit flags, while the PCMCIA standard event codes are encoded
134 *	as numerical values.  In practice, this shouldn't be a problem
135 *	since no one should be looking at the absolute value of the
136 *	event codes; these defines should be used.
137 *
138 * The numerical value of an event code determines in what order a client
139 *	will receive the event if other events are also pending for that
140 *	client. XXX - need to make event_t a 64-bit field.
141 *
142 * Card Services receives these events from Socket Services or by reading
143 *	the card's Pin Replacement Register.  In either case, the client
144 *	always gets the same type of notification.
145 */
146#define	CS_EVENT_REGISTRATION_COMPLETE	0x00000001 /* 0x82 */
147#define	CS_EVENT_PM_RESUME		0x00000002 /* 0x05 */
148#define	CS_EVENT_CARD_INSERTION		0x00000004 /* 0x0c */
149#define	CS_EVENT_CARD_READY		0x00000008 /* 0x01 */
150#define	CS_EVENT_BATTERY_LOW		0x00000010 /* 0x02 is also BVD2 */
151#define	CS_EVENT_BATTERY_DEAD		0x00000020 /* 0x40 is also BVD1 */
152#define	CS_EVENT_CARD_LOCK		0x00000040 /* 0x03 */
153#define	CS_EVENT_PM_SUSPEND		0x00000080 /* 0x04 */
154#define	CS_EVENT_CARD_RESET		0x00000100 /* 0x11 */
155#define	CS_EVENT_CARD_UNLOCK		0x00000200 /* 0x06 */
156#define	CS_EVENT_EJECTION_COMPLETE	0x00000400 /* 0x07 */
157#define	CS_EVENT_EJECTION_REQUEST	0x00000800 /* 0x08 */
158#define	CS_EVENT_ERASE_COMPLETE		0x00001000 /* 0x81 */
159#define	CS_EVENT_EXCLUSIVE_COMPLETE	0x00002000 /* 0x0d */
160#define	CS_EVENT_EXCLUSIVE_REQUEST	0x00004000 /* 0x0e */
161#define	CS_EVENT_INSERTION_COMPLETE	0x00008000 /* 0x09 */
162#define	CS_EVENT_INSERTION_REQUEST	0x00010000 /* 0x0a */
163#define	CS_EVENT_RESET_COMPLETE		0x00020000 /* 0x80 */
164#define	CS_EVENT_RESET_PHYSICAL		0x00040000 /* 0x0f */
165#define	CS_EVENT_RESET_REQUEST		0x00080000 /* 0x10 */
166#define	CS_EVENT_MTD_REQUEST		0x00100000 /* 0x12 */
167#define	CS_EVENT_CLIENT_INFO		0x00200000 /* 0x14 */
168#define	CS_EVENT_TIMER_EXPIRED		0x00400000 /* 0x15 */
169#define	CS_EVENT_WRITE_PROTECT		0x01000000 /* 0x17 */
170
171/*
172 * The CS_EVENT_SS_UPDATED event is generated when Socket Services
173 *	has completed parsing the CIS and has done any necessary
174 *	work to get the client driver loaded and attached.
175 */
176#define	CS_EVENT_SS_UPDATED		0x00800000 /* 0x16 */
177
178/*
179 * The CS_EVENT_STATUS_CHANGE event is generated by a Socket Services
180 *	PCE_CARD_STATUS_CHANGE event; this event gets converted to
181 *	the appropriate Card Services events when Card Services
182 *	reads the PRR.
183 */
184#define	CS_EVENT_STATUS_CHANGE		0x02000000 /* ?? */
185
186/*
187 * The CS_EVENT_CARD_REMOVAL is the last "real" CS event and must
188 *	have the highest value of all "real" CS events so that this
189 *	event is handed to the client after all other queued events
190 *	have been processed.
191 * If the client has set the CS_EVENT_CARD_REMOVAL_LOWP flag in
192 *	either of their event masks, then they will also receive
193 *	a CS_EVENT_CARD_REMOVAL at low (cs_event_thread) priority;
194 *	in this low priority removal event, the client can call
195 *	many CS functions that they can't call when they recieve
196 *	the high priority removal event.
197 */
198#define	CS_EVENT_CARD_REMOVAL		0x10000000 /* 0x0b */
199#define	CS_EVENT_CARD_REMOVAL_LOWP	0x20000000 /* ?? */
200/*
201 * The following are not events but they share the event flags field
202 *	and are used internally by CS.  These bit patterns will never
203 *	be seen by clients.
204 * CS_EVENT_ALL_CLIENTS can only be set by the super-client and by
205 *	the CSI clients; setting this bit causes the driver to
206 *	receive any events specified in their event masks whenever
207 *	any such events occur on the socket.
208 * CS_EVENT_READY_TIMEOUT is a CS-private flag and should never be
209 *	set by clients.
210 */
211#define	CS_EVENT_ALL_CLIENTS		0x40000000 /* ?? */
212#define	CS_EVENT_READY_TIMEOUT		0x80000000 /* ?? */
213
214/*
215 * CS_EVENT_CLIENT_EVENTS_MASK is a msk of events that only the framework
216 *	is allowed to manipulate.
217 */
218#define	CS_EVENT_CLIENT_EVENTS_MASK	~(CS_EVENT_SS_UPDATED |		\
219						CS_EVENT_ALL_CLIENTS |	\
220						CS_EVENT_CARD_REMOVAL_LOWP)
221
222/*
223 * client_info_t structure used by clients for a CS_EVENT_CLIENT_INFO
224 *	event and for the GetClientInfo function.
225 */
226#define	CS_CLIENT_INFO_MAX_NAME_LEN	80
227typedef struct client_info_t {
228	uint32_t	Attributes;
229	uint32_t	Revision;	/* BCD value of client revision */
230	uint32_t	CSLevel;	/* BCD value of CS release */
231	uint32_t	RevDate;	/* revision date */
232	char		ClientName[CS_CLIENT_INFO_MAX_NAME_LEN];
233	char		VendorName[CS_CLIENT_INFO_MAX_NAME_LEN];
234	char		DriverName[MODMAXNAMELEN];
235} client_info_t;
236
237/*
238 * Flags for client_info_t->Attributes
239 *
240 * The low order byte bit values are used to return the data passed
241 *	in to RegisterClient in the client_reg_t->Attributes member.
242 */
243#define	CS_CLIENT_INFO_SOCKET_SERVICES	INFO_SOCKET_SERVICES
244#define	CS_CLIENT_INFO_IO_CLIENT	INFO_IO_CLIENT
245#define	CS_CLIENT_INFO_MTD_CLIENT	INFO_MTD_CLIENT
246#define	CS_CLIENT_INFO_MEM_CLIENT	INFO_MEM_CLIENT
247#define	CS_CLIENT_INFO_CSI_CLIENT	INFO_CSI_CLIENT
248#define	CS_CLIENT_INFO_CARD_SHARE	INFO_CARD_SHARE
249#define	CS_CLIENT_INFO_CARD_EXCL	INFO_CARD_EXCL
250#define	CS_CLIENT_INFO_CLIENT_MASK	0x000000ff
251/*
252 * Control and status flags.
253 */
254#define	CS_CLIENT_INFO_VALID		0x00010000	/* client info valid */
255#define	CS_CLIENT_INFO_CLIENT_ACTIVE	0x00020000	/* client is for card */
256#define	CS_CLIENT_INFO_FLAGS_MASK	0xffff0000
257/*
258 * Client Info subservice flags and types.
259 */
260#define	CS_CLIENT_INFO_SUBSVC_CS	0x00000000	/* CS client data */
261#define	CS_CLIENT_INFO_SUBSVC_MASK	0x0000ff00	/* sub-service mask */
262#define	GET_CLIENT_INFO_SUBSVC(s)	(((s) & CS_CLIENT_INFO_SUBSVC_MASK)>>8)
263#define	SET_CLIENT_INFO_SUBSVC(s)	(((s)<<8) & CS_CLIENT_INFO_SUBSVC_MASK)
264
265/*
266 * CS_CLIENT_INFO_MAKE_DATE - Macro to make constructing the
267 *	client_info_t->RevDate member easier. Parameters are:
268 *
269 *	day - from 1 to 31
270 *	month - from 1 to 12
271 *	year - year relative to 1980
272 *			00 - 1980
273 *			06 - 1986
274 *			12 = 1992
275 *			16 - 1996, etc...
276 */
277#define	CS_CLIENT_INFO_MAKE_DATE(d, m, y)	(((d) & 0x01f) |	\
278						(((m) & 0x0f) << 5) |	\
279						(((y) & 0x7f) << 9))
280#define	CS_CLIENT_INFO_GET_DAY(d)		((d) & 0x1f)
281#define	CS_CLIENT_INFO_GET_MONTH(m)		(((m) >> 5) & 0x0f)
282#define	CS_CLIENT_INFO_GET_YEAR(y)		((((y) >> 9) & 0x7f) + 1980)
283#define	CS_CLIENT_INFO_GET_YEAR_OFFSET(y)	(((y) >> 9) & 0x7f)
284
285/*
286 * get_firstnext_client_t_t structure used for GetFirstClient and GetNextClient
287 */
288typedef struct get_firstnext_client_t {
289	uint32_t	Socket;
290	uint32_t	Attributes;
291	client_handle_t	client_handle;		/* returned client handle */
292	uint32_t	num_clients;
293} get_firstnext_client_t;
294
295/*
296 * Flags for get_firstnext_client_t->Attributes
297 */
298#define	CS_GET_FIRSTNEXT_CLIENT_ALL_CLIENTS	0x00000001
299#define	CS_GET_FIRSTNEXT_CLIENT_SOCKET_ONLY	0x00000002
300
301/*
302 * The client event callback argument structure - this is passed in to
303 *	the client event handler.  Most of these arguments are identical
304 *	to the PCMCIA-specified arguments.
305 */
306typedef struct event_callback_args_t {
307	client_handle_t	client_handle;
308	void		*info;
309	void		*mtdrequest;
310	void		*buffer;
311	void		*misc;
312	void		*client_data;
313	client_info_t	client_info;
314} event_callback_args_t;
315
316/*
317 * Event priority flag passed to the client's event handler; the client
318 *	uses this priority to determine which mutex to use.
319 */
320#define	CS_EVENT_PRI_LOW	0x0001
321#define	CS_EVENT_PRI_HIGH	0x0002
322#define	CS_EVENT_PRI_NONE	0x0004
323
324/*
325 * Event-specific event_callback_args_t->info values
326 *
327 * CS_EVENT_WRITE_PROTECT
328 *	CS_EVENT_WRITE_PROTECT_WPOFF - card is not write protected
329 *	CS_EVENT_WRITE_PROTECT_WPON - card is write protected
330 */
331#define	CS_EVENT_WRITE_PROTECT_WPOFF	0x0000
332#define	CS_EVENT_WRITE_PROTECT_WPON	0xffff
333
334/*
335 * Endinanness and data ordering Attribute bits common to both R2 and
336 *	CardBus windows and common to RequestIO, RequestWindow and
337 *	DupHandle.
338 */
339#define	WIN_ACC_ENDIAN_MASK	0x00300000	/* endian mask */
340#define	WIN_ACC_NEVER_SWAP	0x00000000	/* i/o access: no swap */
341#define	WIN_ACC_BIG_ENDIAN	0x00100000	/* big endian */
342#define	WIN_ACC_LITTLE_ENDIAN	0x00200000	/* little endian */
343
344#define	WIN_ACC_ORDER_MASK	0x00700000	/* order mask */
345#define	WIN_ACC_STRICT_ORDER	0x00000000	/* strict order */
346#define	WIN_ACC_UNORDERED_OK	0x00100000	/* may be re-ordered */
347#define	WIN_ACC_MERGING_OK	0x00200000	/* may merge i/o */
348#define	WIN_ACC_LOADCACHING_OK	0x00300000	/* may cache reads */
349#define	WIN_ACC_STORECACHING_OK	0x00400000	/* may cache all i/o */
350
351/*
352 * io_req_t structure used for RequestIO and ReleaseIO
353 */
354typedef struct io_req_t {
355	uint32_t	Socket;
356	baseaddru_t	BasePort1;
357	uint32_t	NumPorts1;	/* 1st IO range no. contiguous ports */
358	uint32_t	Attributes1;	/* 1st IO range attributes */
359	baseaddru_t	BasePort2;
360	uint32_t	NumPorts2;	/* 2nd IO range no. contiguous ports */
361	uint32_t	Attributes2;	/* 2nd IO range attributes */
362	uint32_t	IOAddrLines;	/* number of IO address lines decoded */
363} io_req_t;
364
365/*
366 * Flags for RequestIO and ReleaseIO
367 */
368#define	IO_DATA_WIDTH_MASK	0x00000001	/* data path width mask */
369#define	IO_DATA_WIDTH_8		0x00000000	/* 8 bit data path */
370#define	IO_DATA_WIDTH_16	0x00000001	/* 16 bit data path */
371
372/*
373 * The following flags are included for compatability with other versions of
374 *	Card Services, but they are not implemented in this version.  They
375 *	are assigned values as placeholders only.  If any of these flags
376 *	are set on a call to RequestIO, CS_BAD_ATTRIBUTE is returned.
377 */
378#define	IO_SHARED		0x00010000	/* for compatability only */
379#define	IO_FIRST_SHARED		0x00020000	/* for compatability only */
380#define	IO_FORCE_ALIAS_ACCESS	0x00040000	/* for compatability only */
381
382/*
383 * The following flags are private to Card Services and should never be set
384 *	by a client.  Doing so will cause the system to take a supervisor
385 *	trap at level twenty-nine.
386 */
387#define	IO_DEALLOCATE_WINDOW	0x10000000	/* CS private */
388#define	IO_DISABLE_WINDOW	0x20000000	/* CS private */
389
390/*
391 * win_req_t structure used for RequestWindow
392 *
393 * Note that the ReqOffset member is not defined in the current PCMCIA
394 *	spec but is included here to aid clients in determining the
395 *	optimum offset to give to MapMemPage.
396 */
397typedef struct win_req_t {
398	uint32_t	Socket;
399	uint32_t	Attributes;	/* window flags */
400	union {
401	    uint32_t		base;	/* requested window base address */
402	    acc_handle_t	handle;	/* access handle for base of window */
403	} Base;
404	uint32_t	Size;		/* window size requested/granted */
405	union {
406	    uint32_t		AccessSpeed;	/* window access speed */
407	    uint32_t		IOAddrLines;	/* for I/O windows only */
408	} win_params;
409	uint32_t	ReqOffset;	/* required window offest */
410} win_req_t;
411
412/*
413 * modify_win_t structure used for ModifyWindow
414 */
415typedef struct modify_win_t {
416	uint32_t	Attributes;	/* window flags */
417	uint32_t	AccessSpeed;	/* window access speed */
418} modify_win_t;
419
420/*
421 * Flags for RequestWindow and ModifyWindow
422 */
423#define	WIN_MEMORY_TYPE_MASK	0x00000021	/* window type mask */
424#define	WIN_MEMORY_TYPE_CM	0x00000000	/* window points to CM */
425#define	WIN_MEMORY_TYPE_AM	0x00000001	/* window points to AM */
426#define	WIN_MEMORY_TYPE_IO	0x00000020	/* window points to IO */
427
428#define	WIN_DATA_WIDTH_MASK	0x00000042	/* data path width mask */
429#define	WIN_DATA_WIDTH_8	0x00000000	/* 8-bit data path */
430#define	WIN_DATA_WIDTH_16	0x00000002	/* 16-bit data path */
431#define	WIN_DATA_WIDTH_32	0x00000040	/* 32-bit data path */
432
433#define	WIN_ENABLE		0x00000004	/* enable/disable window */
434#define	WIN_OFFSET_SIZE		0x00000008	/* card offsets window sized */
435#define	WIN_ACCESS_SPEED_VALID	0x00000010	/* speed valid (ModifyWindow) */
436
437#define	WIN_PREFETCH_CACHE_MASK	0x00000300	/* prefetch/cache mask */
438#define	WIN_PREFETCH		0x00000100	/* prefetchable not cacheable */
439#define	WIN_PREFETCH_CACHE	0x00000200	/* prefetchable and cacheable */
440
441#define	WIN_BAR_MASK		0x00007000	/* Base Address Register mask */
442#define	WIN_BAR_1		0x00001000	/* Base Address Register 1 */
443#define	WIN_BAR_2		0x00002000	/* Base Address Register 2 */
444#define	WIN_BAR_3		0x00003000	/* Base Address Register 3 */
445#define	WIN_BAR_4		0x00004000	/* Base Address Register 4 */
446#define	WIN_BAR_5		0x00005000	/* Base Address Register 5 */
447#define	WIN_BAR_6		0x00006000	/* Base Address Register 6 */
448#define	WIN_BAR_7		0x00007000	/* Base Address Register 7 */
449
450/*
451 * The following flag is used internally by Card Services and should never
452 *	be set by the caller.
453 */
454#define	WIN_DATA_WIDTH_VALID	0x00008000	/* CS internal */
455
456/*
457 * The following flags are included for compatability with other versions of
458 *	Card Services, but they are not implemented in this version.  They
459 *	are assigned values as placeholders only.  If any of these flags
460 *	are set on a call to RequestWindow, CS_BAD_ATTRIBUTE is returned.
461 */
462#define	WIN_PAGED		0x00010000	/* for compatability only */
463#define	WIN_SHARED		0x00020000	/* for compatability only */
464#define	WIN_FIRST_SHARED	0x00040000	/* for compatability only */
465#define	WIN_BINDING_SPECIFIC	0x00080000	/* for compatability only */
466
467/*
468 * The following flag is actually part of the AccessSpeed member
469 */
470#define	WIN_USE_WAIT		0x80	/* use window that supports WAIT */
471
472/*
473 * client_reg_t structure for RegisterClient
474 */
475typedef struct client_reg_t {
476	uint32_t		Attributes;
477	uint32_t		EventMask;
478	event_callback_args_t	event_callback_args;
479	uint32_t		Version;	/* CS version to expect */
480	csfunction_t		*event_handler;
481	/* DDI support */
482	ddi_iblock_cookie_t	*iblk_cookie;	/* event iblk cookie */
483	ddi_idevice_cookie_t	*idev_cookie;	/* event idev cookie */
484	dev_info_t		*dip;		/* client's dip */
485	char			driver_name[MODMAXNAMELEN];
486	/* CS private */
487	void			*priv;		/* CS private data */
488} client_reg_t;
489
490/*
491 * Flags for RegisterClient - some of these flags are also used internally
492 *	by CS to sequence the order of event callbacks and to allow Socket
493 *	Services to register as a "super" client.
494 *
495 * The client_reg_t->Attributes structure member uses these flags.
496 *
497 * The client_info_t->Attributes, client_types_t->type and client_t->flags
498 *	tructure members use these flags as well.
499 *
500 * Client types - mutually exclusive.
501 */
502#define	INFO_SOCKET_SERVICES	0x00000001
503#define	INFO_IO_CLIENT		0x00000002
504#define	INFO_MTD_CLIENT		0x00000004
505#define	INFO_MEM_CLIENT		0x00000008
506#define	INFO_CSI_CLIENT		0x00000010
507#define	INFO_CLIENT_TYPE_MASK	(INFO_SOCKET_SERVICES |		\
508					INFO_IO_CLIENT |	\
509					INFO_MTD_CLIENT	|	\
510					INFO_MEM_CLIENT |	\
511					INFO_CSI_CLIENT)
512#define	MAX_CLIENT_TYPES	3	/* doesn't include SS or CSI clients */
513
514/*
515 * The following two are for backwards-compatability with the PCMCIA spec.
516 *	We will give the client CARD_INSERTION and REGISTRATION_COMPLETE
517 *	if either of these two bits are set.  Normally, all IO and MEM
518 *	clients should set both of these bits.
519 */
520#define	INFO_CARD_SHARE		0x00000020
521#define	INFO_CARD_EXCL		0x00000040
522#define	INFO_CARD_FLAGS_MASK	(INFO_CARD_SHARE | INFO_CARD_EXCL)
523
524/*
525 * tuple_t struct used for GetFirstTuple, GetNextTuple, GetTupleData
526 *	and ParseTuple
527 *
528 * Note that the values for DesiredTuple are defined in the cis.h header
529 *	file.
530 */
531typedef struct tuple_t {
532	uint32_t	Socket;		/* socket number to get tuple from */
533	uint32_t	Attributes;	/* tuple return attributes */
534	cisdata_t	DesiredTuple;	/* tuple to search for or flags */
535	cisdata_t	TupleOffset;	/* offset in tuple data body */
536	uint32_t	Flags;		/* CS private */
537	cistpl_t	*LinkOffset;	/* CS private */
538	cistpl_t	*CISOffset;	/* CS private */
539	cisdata_t	TupleDataMax;	/* max size of tuple data area */
540	cisdata_t	TupleDataLen;	/* actual size of tuple data area */
541					/* tuple body data buffer */
542	cisdata_t	TupleData[CIS_MAX_TUPLE_DATA_LEN];
543	cisdata_t	TupleCode;	/* tuple type code */
544	cisdata_t	TupleLink;	/* tuple data body size */
545} tuple_t;
546
547/*
548 * Attribute flags definitions for CS tuple functions.
549 *
550 */
551#define	TUPLE_RETURN_LINK		0x00000002 /* return link tuples */
552#define	TUPLE_RETURN_IGNORED_TUPLES	0x00010000 /* return ignored tuples */
553#define	TUPLE_RETURN_NAME		0x00020000 /* return tuple name */
554
555/*
556 * cisinfo_t structure used for ValidateCIS
557 */
558typedef struct cisinfo_t {
559	uint32_t	Socket;		/* socket number to validate CIS on */
560	uint32_t	Chains;		/* number of tuple chains in CIS */
561	uint32_t	Tuples;		/* total number of tuples in CIS */
562} cisinfo_t;
563
564/*
565 * map_mem_page_t structure used for MapMemPage
566 */
567typedef struct map_mem_page_t {
568	uint32_t	CardOffset;	/* card offset */
569	uint32_t	Page;		/* page number */
570} map_mem_page_t;
571
572/*
573 * sockevent_t structure used for GetEventMask and SetEventMask
574 */
575typedef struct sockevent_t {
576	uint32_t	Attributes;	/* attribute flags for call */
577	uint32_t	EventMask;	/* event mask to set or return */
578	uint32_t	Socket;		/* socket number if necessary */
579} sockevent_t;
580
581/*
582 * request_socket_mask_t structure used for RequestSocketMask
583 */
584typedef struct request_socket_mask_t {
585	uint32_t	Socket;		/* socket number if necessary */
586	uint32_t	EventMask;	/* event mask to set or return */
587} request_socket_mask_t;
588
589/*
590 * release_socket_mask_t structure used for ReleaseSocketMask
591 */
592typedef struct release_socket_mask_t {
593	uint32_t	Socket;
594} release_socket_mask_t;
595
596/*
597 * Flags for GetEventMask and SetEventMask
598 */
599#define	CONF_EVENT_MASK_GLOBAL	0x00000000	/* global event mask */
600#define	CONF_EVENT_MASK_CLIENT	0x00000001	/* client event mask */
601#define	CONF_EVENT_MASK_VALID	0x00000001	/* client event mask */
602
603/*
604 * convert_speed_t structure used for ConvertSpeed
605 */
606typedef struct convert_speed_t {
607	uint32_t	Attributes;
608	uint32_t	nS;
609	uint32_t	devspeed;
610} convert_speed_t;
611
612/*
613 * Flags for ConvertSpeed
614 */
615#define	CONVERT_NS_TO_DEVSPEED	0x00000001
616#define	CONVERT_DEVSPEED_TO_NS	0x00000002
617
618/*
619 * convert_size_t structure used for ConvertSize
620 */
621typedef struct convert_size_t {
622	uint32_t	Attributes;
623	uint32_t	bytes;
624	uint32_t	devsize;
625} convert_size_t;
626
627/*
628 * Flags for ConvertSize
629 */
630#define	CONVERT_BYTES_TO_DEVSIZE	0x00000001
631#define	CONVERT_DEVSIZE_TO_BYTES	0x00000002
632
633#define	MAX_CS_EVENT_BUFSIZE		64	/* single event */
634#define	MAX_MULTI_EVENT_BUFSIZE		512	/* all events */
635
636#define	CS_EVENT_MAX_BUFSIZE	MAX_MULTI_EVENT_BUFSIZE
637#define	CS_ERROR_MAX_BUFSIZE	MAX_CS_EVENT_BUFSIZE
638
639/*
640 * event2text_t structure used for Event2Text
641 */
642typedef struct event2text_t {
643	event_t		event;		/* events */
644					/* buffer to return text strings */
645	char		text[CS_EVENT_MAX_BUFSIZE];
646} event2text_t;
647
648/*
649 * error2text_t structure used for Error2Text
650 */
651typedef struct error2text_t {
652	uint32_t	item;
653	char		text[CS_ERROR_MAX_BUFSIZE];
654} error2text_t;
655
656/*
657 * get_status_t structure used for GetStatus
658 *
659 * The values in the status members are the same as the CS_EVENT_XXX values.
660 */
661typedef struct get_status_t {
662	uint32_t	Socket;
663	uint32_t	CardState;	/* "live" card status for this client */
664	uint32_t	SocketState;	/* latched socket values */
665	uint32_t	raw_CardState;	/* raw live card status */
666} get_status_t;
667
668/*
669 * GetStatus returns card state using the same bit definitions
670 *	as the CS_EVENT_XXX bits. Some of the CS_EVENT_XXX bits
671 *	are not meaningful for GetStatus and are reused here for
672 *	status definitions.
673 *
674 * get_status_t->CardState and get_status_t->raw_CardState bits
675 */
676#define	CS_STATUS_WRITE_PROTECTED	CS_EVENT_WRITE_PROTECT
677#define	CS_STATUS_CARD_LOCKED		CS_EVENT_CARD_LOCK
678#define	CS_STATUS_EJECTION_REQUEST	CS_EVENT_EJECTION_REQUEST
679#define	CS_STATUS_INSERTION_REQUEST	CS_EVENT_INSERTION_REQUEST
680#define	CS_STATUS_BATTERY_DEAD		CS_EVENT_BATTERY_DEAD
681#define	CS_STATUS_BATTERY_LOW		CS_EVENT_BATTERY_LOW
682#define	CS_STATUS_CARD_READY		CS_EVENT_CARD_READY
683#define	CS_STATUS_CARD_INSERTED		CS_EVENT_CARD_INSERTION
684#define	CS_STATUS_RES_EVT1		0x00100000
685#define	CS_STATUS_RES_EVT2		0x00200000
686#define	CS_STATUS_RES_EVT3		0x00400000
687#define	CS_STATUS_VCC_50		0x10000000
688#define	CS_STATUS_VCC_33		0x20000000
689#define	CS_STATUS_VCC_XX		0x40000000
690#define	CS_STATUS_REQ_ATTN		0x80000000
691/*
692 * get_status_t->SocketState bits
693 */
694#define	CS_SOCK_STATUS_WRITE_PROTECT_CHANGE	CS_EVENT_WRITE_PROTECT
695#define	CS_SOCK_STATUS_CARD_LOCK_CHNAGE		CS_EVENT_CARD_LOCK
696#define	CS_SOCK_STATUS_EJECTION_PENDING		CS_EVENT_EJECTION_REQUEST
697#define	CS_SOCK_STATUS_INSERTION_PENDING	CS_EVENT_INSERTION_REQUEST
698#define	CS_SOCK_STATUS_BATTERY_DEAD_CHNAGE	CS_EVENT_BATTERY_DEAD
699#define	CS_SOCK_STATUS_BATTERY_LOW_CHNAGE	CS_EVENT_BATTERY_LOW
700#define	CS_SOCK_STATUS_CARD_READY_CHANGE	CS_EVENT_CARD_READY
701#define	CS_SOCK_STATUS_CARD_DETECT_CHNAGE	CS_EVENT_CARD_INSERTION
702
703/*
704 * map_log_socket_t structure used for MapLogSocket
705 */
706typedef struct map_log_socket_t {
707	uint32_t	LogSocket;	/* logical socket */
708	uint32_t	PhyAdapter;	/* physical adapter */
709	uint32_t	PhySocket;	/* physical socket */
710} map_log_socket_t;
711
712/*
713 * get_physical_adapter_info_t structure used for GetPhysicalAdapterInfo
714 */
715typedef struct get_physical_adapter_info_t {
716	uint32_t	LogSocket;	/* logical socket */
717	uint32_t	PhySocket;	/* physical socket */
718	uint32_t	flags;		/* adapter flags */
719	char		name[MODMAXNAMELEN]; /* adapter module name */
720	uint32_t	major;		/* adapter major number */
721	uint32_t	minor;		/* adapter minor number */
722	uint32_t	instance;	/* instance number of this adapter */
723	uint32_t	number;		/* canonical adapter number */
724	uint32_t	num_sockets;	/* # sockets on this adapter */
725	uint32_t	first_socket;	/* first socket # on this adapter */
726} get_physical_adapter_info_t;
727
728/*
729 * irq_req_t structure used for RequestIRQ and ReleaseIRQ
730 */
731typedef struct irq_req_t {
732	uint32_t		Socket;
733	uint32_t		Attributes;	/* IRQ attribute flags */
734	csfunction_t		*irq_handler;
735	void			*irq_handler_arg;
736	ddi_iblock_cookie_t	*iblk_cookie;	/* IRQ iblk cookie */
737	ddi_idevice_cookie_t	*idev_cookie;	/* IRQ idev cookie */
738} irq_req_t;
739
740/*
741 * Flags for RequestIRQ and ReleaseIRQ
742 */
743#define	IRQ_TYPE_EXCLUSIVE		0x00000002
744/*
745 * The following flags are included for compatability with other versions of
746 *	Card Services, but they are not implemented in this version.  They
747 *	are assigned values as placeholders only.  If any of these flags
748 *	are set on a call to RequestIRQ, CS_BAD_ATTRIBUTE is returned.
749 */
750#define	IRQ_FORCED_PULSE		0x00010000
751#define	IRQ_TYPE_TIME			0x00020000
752#define	IRQ_TYPE_DYNAMIC_SHARING	0x00040000
753#define	IRQ_FIRST_SHARED		0x00080000
754#define	IRQ_PULSE_ALLOCATED		0x00100000
755
756/*
757 * release_config_t structure used for ReleaseConfiguration
758 */
759typedef struct release_config_t {
760	uint32_t	Socket;
761} release_config_t;
762
763/*
764 * config_req_t structure used for RequestConfiguration
765 */
766typedef struct config_req_t {
767	uint32_t	Socket;
768	uint32_t	Attributes;	/* configuration attributes */
769	uint32_t	Vcc;		/* Vcc value */
770	uint32_t	Vpp1;		/* Vpp1 value */
771	uint32_t	Vpp2;		/* Vpp2 value */
772	uint32_t	IntType;	/* socket interface type - mem or IO */
773	uint32_t	ConfigBase;	/* offset from start of AM space */
774	uint32_t	Status;		/* value to write to STATUS register */
775	uint32_t	Pin;		/* value to write to PRR */
776	uint32_t	Copy;		/* value to write to COPY register */
777	uint32_t	ConfigIndex;	/* value to write to COR */
778	uint32_t	Present;	/* which config registers present */
779	uint32_t	ExtendedStatus;	/* value to write to EXSTAT register */
780} config_req_t;
781
782/*
783 * Flags for RequestConfiguration - note that the CONF_ENABLE_IRQ_STEERING
784 *	flag shares the same bit field as the Attributes flags for
785 *	ModifyConfiguration.
786 */
787#define	CONF_ENABLE_IRQ_STEERING	0x00010000
788/*
789 * The following flags are used for the IntType member to specify which
790 *	type of socket interface the client wants.
791 */
792#define	SOCKET_INTERFACE_MEMORY		0x00000001
793#define	SOCKET_INTERFACE_MEMORY_AND_IO	0x00000002
794/*
795 * The following flags are used for the Present member to specify which
796 *	configuration registers are present.  They may also be used by
797 *	clients for their internal state.
798 */
799#define	CONFIG_OPTION_REG_PRESENT	0x00000001 /* COR present */
800#define	CONFIG_STATUS_REG_PRESENT	0x00000002 /* STAT reg present */
801#define	CONFIG_PINREPL_REG_PRESENT	0x00000004 /* PRR present */
802#define	CONFIG_COPY_REG_PRESENT		0x00000008 /* COPY reg present */
803#define	CONFIG_EXSTAT_REG_PRESENT	0x00000010 /* EXSTAT reg present */
804#define	CONFIG_IOBASE0_REG_PRESENT	0x00000020 /* IOBASE0 reg present */
805#define	CONFIG_IOBASE1_REG_PRESENT	0x00000040 /* IOBASE1 reg present */
806#define	CONFIG_IOBASE2_REG_PRESENT	0x00000080 /* IOBASE2 reg present */
807#define	CONFIG_IOBASE3_REG_PRESENT	0x00000100 /* IOBASE3 reg present */
808#define	CONFIG_IOLIMIT_REG_PRESENT	0x00000200 /* IOLIMIT reg present */
809
810/*
811 * CONFIG_IOBASE_REG_MASK - mask of IO Base Port register present bits
812 * CONFIG_IOBASE_REG_SHIFT - shifts IO Base Port register present bits
813 */
814#define	CONFIG_IOBASE_REG_MASK		0x000001e0 /* IOBASEn present mask */
815#define	CONFIG_IOBASE_REG_SHIFT		5
816
817/*
818 * Bit definitions for configuration registers.
819 *
820 * Pin Replacement Register (PRR) bits - these are used for calls to
821 *	RequestConfiguration, AccessConfigurationRegister and
822 *	GetConfigurationInfo, as well as internally by clients
823 *	and Card Services.
824 * To inform Card Services that a particular bit in the PRR is valid on
825 *	a call to RequestConfiguration, both the XXX_STATUS and the
826 *	XXX_EVENT bits must be set.
827 */
828#define	PRR_WP_STATUS		0x01	/* R-WP state W-write WP Cbit */
829#define	PRR_READY_STATUS	0x02	/* R-READY state W-write READY Cbit */
830#define	PRR_BVD2_STATUS		0x04	/* R-BVD2 state W-write BVD2 Cbit */
831#define	PRR_BVD1_STATUS		0x08	/* R-BVD1 state W-write BVD1 Cbit */
832#define	PRR_WP_EVENT		0x10	/* WP changed */
833#define	PRR_READY_EVENT		0x20	/* READY changed */
834#define	PRR_BVD2_EVENT		0x40	/* BVD2 changed */
835#define	PRR_BVD1_EVENT		0x80	/* BVD1 changed */
836/*
837 * Configuration Option Register (COR) bits
838 */
839#define	COR_ENABLE_FUNCTION	0x01	/* enable function */
840#define	COR_ENABLE_BASE_LIMIT	0x02	/* enable base and limit registers */
841#define	COR_ENABLE_IREQ_ROUTING	0x04	/* enable IREQ routing */
842#define	COR_STATUS_CHANGE_MODE	0x08	/* status change mode */
843#define	COR_LEVEL_IRQ		0x40	/* set to enable level interrupts */
844#define	COR_SOFT_RESET		0x80	/* soft reset bit */
845/*
846 * Card Configuration Status Register (CCSR)
847 */
848#define	CCSR_INTR_ACK		0x01	/* interrupt acknowledge */
849#define	CCSR_INTR		0x02	/* interrupt pending */
850#define	CCSR_POWER_DOWN		0x04	/* power down card */
851#define	CCSR_AUDIO		0x08	/* enable Audio signal */
852#define	CCSR_IO_IS_8		0x20	/* only 8-bit IO data path */
853#define	CCSR_SIG_CHG		0x40	/* enable status changes */
854#define	CCSR_CHANGED		0x80	/* one of the PRR bits has changed */
855/*
856 * Macros to manipulate the Socket and Copy Register (SCR) values
857 */
858#define	SCR_GET_SOCKET(r)		((r)&0x0f)
859#define	SCR_GET_COPY(r)			(((r)>>4)&7)
860#define	SCR_SET_SOCKET(s)		((s)&0x0f)
861#define	SCR_SET_COPY(c)			(((c)&7)<<4)
862#define	SCR_SET_SOCKET_COPY(s, c)	(((s)&0x0f) | (((c)&7)<<4))
863
864/*
865 * modify_config_t structure used for ModifyConfiguration
866 */
867typedef struct modify_config_t {
868	uint32_t	Socket;
869	uint32_t	Attributes;	/* attributes to modify */
870	uint32_t	Vpp1;		/* Vpp1 value */
871	uint32_t	Vpp2;		/* Vpp2 value */
872} modify_config_t;
873
874/*
875 * Flags for ModifyConfiguration - note that the CONF_ENABLE_IRQ_STEERING
876 *	flag used with RequestConfiguration shares this bit field.
877 */
878#define	CONF_VPP1_CHANGE_VALID		0x00000002	/* Vpp1 is valid */
879#define	CONF_VPP2_CHANGE_VALID		0x00000004	/* Vpp2 is valid */
880#define	CONF_IRQ_CHANGE_VALID		0x00000008	/* IRQ is valid */
881
882/*
883 * access_config_reg_t structure used for AccessConfigurationRegister
884 */
885typedef struct access_config_reg_t {
886	uint32_t	Socket;
887	uint32_t	Action;		/* register access operation */
888	uint32_t	Offset;		/* config register offset */
889	uint32_t	Value;		/* value read or written */
890} access_config_reg_t;
891/*
892 * Flags for AccessConfigurationRegister
893 */
894#define	CONFIG_REG_READ		0x00000001	/* read config register */
895#define	CONFIG_REG_WRITE	0x00000002	/* write config register */
896/*
897 * The following offsets are used to specify the configuration register
898 *	offset to AccessConfigurationRegister
899 */
900#define	CONFIG_OPTION_REG_OFFSET	0x00	/* COR offset */
901#define	CONFIG_STATUS_REG_OFFSET	0x02	/* STAT reg offset */
902#define	CONFIG_PINREPL_REG_OFFSET	0x04	/* PRR offset */
903#define	CONFIG_COPY_REG_OFFSET		0x06	/* COPY reg offset */
904#define	CONFIG_EXSTAT_REG_OFFSET	0x08	/* EXSTAT reg offset */
905#define	CONFIG_IOBASE0_REG_OFFSET	0x0a	/* IOBASE0 reg offset */
906#define	CONFIG_IOBASE1_REG_OFFSET	0x0c	/* IOBASE1 reg offset */
907#define	CONFIG_IOBASE2_REG_OFFSET	0x0e	/* IOBASE2 reg offset */
908#define	CONFIG_IOBASE3_REG_OFFSET	0x10	/* IOBASE3 reg offset */
909#define	CONFIG_IOLIMIT_REG_OFFSET	0x12	/* IOLIMIT reg offset */
910
911/*
912 * reset_function_t structure used for ResetFunction
913 */
914typedef struct reset_function_t {
915	uint32_t	Socket;
916	uint32_t	Attributes;
917} reset_function_t;
918
919/*
920 * get_cardservices_info_t structure used for GetCardServicesInfo
921 */
922#define	CS_GET_CARDSERVICES_INFO_MAX_VS_LEN	512
923typedef struct get_cardservices_info_t {
924	char		Signature[2];	/* CS signature bytes */
925	uint32_t	NumSockets;	/* number of sockets */
926	uint32_t	Revision;	/* BCD value of CS revision */
927	uint32_t	CSLevel;	/* BCD value of CS release */
928	uint32_t	FuncsPerSocket;	/* max number of functions per socket */
929	char		VendorString[CS_GET_CARDSERVICES_INFO_MAX_VS_LEN];
930} get_cardservices_info_t;
931
932/*
933 * get_configuration_info_t structure used by GetConfigurationInfo
934 */
935typedef struct get_configuration_info_t {
936	uint32_t	Socket;		/* Socket/function to get info for */
937	uint32_t	Attributes;	/* configuration attributes */
938	uint32_t	Vcc;		/* Vcc value */
939	uint32_t	Vpp1;		/* Vpp1 value */
940	uint32_t	Vpp2;		/* Vpp2 value */
941	uint32_t	IntType;	/* memory only or memory and IO ifc */
942	uint32_t	ConfigBase;	/* offset from start of AM space */
943	uint32_t	Status;		/* value written to STATUS register */
944	uint32_t	Pin;		/* value written to PRR */
945	uint32_t	Copy;		/* value to written COPY register */
946	uint32_t	Option;		/* which written to COR */
947	uint32_t	Present;	/* which config registers present */
948	uint32_t	FirstDevType;	/* from CISTPL_DEVICE */
949	uint32_t	FuncCode;	/* from CISTPL_FUNCID */
950	uint32_t	SysInitMask;	/* from CISTPL_FUNCID */
951	uint32_t	ManufCode;	/* from CISTPL_MANFID */
952	uint32_t	ManufInfo;	/* from CISTPL_MANFID */
953	uint32_t	CardValues;	/* which config registers written */
954	uint32_t	AssignedIRQ;	/* IRQ assigned to card */
955	uint32_t	IRQ_Attributes;	/* IRQ attributes */
956	uint32_t	BasePort1;	/* address of 1st IO range */
957	uint32_t	NumPorts1;	/* 1st IO range no. contiguous ports */
958	uint32_t	Attributes1;	/* 1st IO range attributes */
959	uint32_t	BasePort2;	/* address of 2nd IO range */
960	uint32_t	NumPorts2;	/* 2nd IO range no. contiguous ports */
961	uint32_t	Attributes2;	/* 2nd IO range attributes */
962	uint32_t	IOAddrLines;	/* number of IO address lines decoded */
963	uint32_t	ExStat;		/* value written to EXSTAT register */
964	uint32_t	DMA_Attributes;	/* signals used for DMA */
965	uint32_t	DMA_Assign_Chan;	/* assigned DMA channel */
966	uint32_t	NumIOWindows;	/* number of IO windows in use */
967	uint32_t	NumMemWindows;	/* number of memory windows in use */
968} get_configuration_info_t;
969
970/*
971 * devnode_desc_t structure used in make_device_node_t and remove_device_node_t
972 *	for MakeDeviceNode and RemoveDeviceNode
973 */
974typedef struct devnode_desc_t {
975	char	*name;		/* device node path and name */
976	int32_t	spec_type;	/* dev special type (block or char) */
977	int32_t	minor_num;	/* device node minor number */
978	char	*node_type;	/* device node type */
979} devnode_desc_t;
980
981/*
982 * make_device_node_t structure used for MakeDeviceNode
983 */
984typedef struct make_device_node_t {
985	uint32_t	Action;		/* device operation */
986	uint32_t	NumDevNodes;	/* number of nodes to create */
987	devnode_desc_t	*devnode_desc;	/* description of device nodes */
988} make_device_node_t;
989/*
990 * Action values for MakeDeviceNode
991 */
992#define	CREATE_DEVICE_NODE		0x01	/* create device node */
993
994/*
995 * remove_device_node_t structure used for RemoveDeviceNode
996 */
997typedef struct remove_device_node_t {
998	uint32_t	Action;		/* device operation */
999	uint32_t	NumDevNodes;	/* number of nodes to remove */
1000	devnode_desc_t	*devnode_desc;	/* description of device nodes */
1001} remove_device_node_t;
1002/*
1003 * Action values for RemoveDeviceNode
1004 *
1005 * Note: The "Action" member for make_device_node_t and remove_device_node_t
1006 *		share the same set of values.
1007 */
1008#define	REMOVE_DEVICE_NODE		0x02	/* remove device node */
1009#define	REMOVE_ALL_DEVICE_NODES		0x03	/* remove all device nodes */
1010
1011/*
1012 * cs_ddi_info_t for CS_DDI_Info
1013 */
1014typedef struct cs_ddi_info_t {
1015	uint32_t	Socket;		/* socket number */
1016	char		*driver_name;	/* unique driver name */
1017	dev_info_t	*dip;		/* dip */
1018	int32_t		instance;	/* instance */
1019} cs_ddi_info_t;
1020
1021/*
1022 * cs_sys_ctl_t for CS_Sys_Ctl
1023 */
1024typedef struct cs_sys_ctl_t {
1025	uint32_t	Socket;
1026	uint32_t	Action;
1027	uint32_t	Flags;
1028	uint32_t	Events;
1029	client_handle_t	client_handle;
1030} cs_sys_ctl_t;
1031/*
1032 * cs_sys_ctl_t->Action defines
1033 *
1034 * CS_SYS_CTL_SEND_EVENT - send events in cs_sys_ctl_t->Events to clients
1035 */
1036#define	CS_SYS_CTL_SEND_EVENT	0x0001	/* simulate events */
1037/*
1038 * cs_sys_ctl_t->Flags defines
1039 *
1040 * CS_SYS_CTL_WAIT_SYNC - wait for operation to complete, otherwise
1041 *	return immediately
1042 * CS_SYS_CTL_EVENT_SOCKET - send events to all clients on specified
1043 *	socket
1044 * CS_SYS_CTL_EVENT_CLIENT - send events to client specified by
1045 *	cs_sys_ctl_t->client_handle
1046 */
1047#define	CS_SYS_CTL_WAIT_SYNC	0x00000001	/* synchornize with thread */
1048#define	CS_SYS_CTL_EVENT_SOCKET	0x00000002	/* to all clients on socket */
1049#define	CS_SYS_CTL_EVENT_CLIENT	0x00000004	/* to client specified */
1050
1051/*
1052 * Autoincrement control flags for RepPut8, RepPut16, RepPut32, RepPut32,
1053 *	RepGet8, RepGet16, RepGet32, RepGet64
1054 */
1055#define	CS_DEV_AUTOINCR		DDI_DEV_AUTOINCR
1056#define	CS_DEV_NO_AUTOINCR	DDI_DEV_NO_AUTOINCR
1057
1058/*
1059 * Card Services function prototypes
1060 */
1061int32_t csx_RegisterClient(client_handle_t *, client_reg_t *);
1062int32_t csx_DeregisterClient(client_handle_t);
1063int32_t csx_GetStatus(client_handle_t, get_status_t *);
1064int32_t csx_SetEventMask(client_handle_t, sockevent_t *);
1065int32_t csx_GetEventMask(client_handle_t, sockevent_t *);
1066int32_t csx_RequestIO(client_handle_t, io_req_t *);
1067int32_t csx_ReleaseIO(client_handle_t, io_req_t *);
1068int32_t csx_RequestIRQ(client_handle_t, irq_req_t *);
1069int32_t csx_ReleaseIRQ(client_handle_t, irq_req_t *);
1070int32_t csx_RequestWindow(client_handle_t, window_handle_t *, win_req_t *);
1071int32_t csx_ReleaseWindow(window_handle_t);
1072int32_t csx_ModifyWindow(window_handle_t, modify_win_t *);
1073int32_t csx_MapMemPage(window_handle_t, map_mem_page_t *);
1074int32_t csx_RequestSocketMask(client_handle_t, request_socket_mask_t *);
1075int32_t csx_ReleaseSocketMask(client_handle_t, release_socket_mask_t *);
1076int32_t csx_RequestConfiguration(client_handle_t, config_req_t *);
1077int32_t csx_ModifyConfiguration(client_handle_t, modify_config_t *);
1078int32_t csx_ReleaseConfiguration(client_handle_t, release_config_t *);
1079int32_t csx_AccessConfigurationRegister(client_handle_t, access_config_reg_t *);
1080int32_t csx_GetFirstTuple(client_handle_t, tuple_t *);
1081int32_t csx_GetNextTuple(client_handle_t, tuple_t *);
1082int32_t csx_GetTupleData(client_handle_t, tuple_t *);
1083int32_t csx_MapLogSocket(client_handle_t, map_log_socket_t *);
1084int32_t csx_ValidateCIS(client_handle_t, cisinfo_t *);
1085int32_t csx_MakeDeviceNode(client_handle_t, make_device_node_t *);
1086int32_t csx_RemoveDeviceNode(client_handle_t, remove_device_node_t *);
1087int32_t csx_ConvertSpeed(convert_speed_t *);
1088int32_t csx_ConvertSize(convert_size_t *);
1089int32_t csx_Event2Text(event2text_t *);
1090int32_t csx_Error2Text(error2text_t *);
1091int32_t csx_CS_DDI_Info(cs_ddi_info_t *);
1092int32_t csx_CS_Sys_Ctl(cs_sys_ctl_t *);
1093int32_t csx_ResetFunction(client_handle_t, reset_function_t *);
1094int32_t csx_GetFirstClient(get_firstnext_client_t *);
1095int32_t csx_GetNextClient(get_firstnext_client_t *);
1096int32_t csx_GetClientInfo(client_handle_t, client_info_t *);
1097int32_t csx_GetCardServicesInfo(client_handle_t, get_cardservices_info_t *);
1098int32_t csx_GetConfigurationInfo(client_handle_t *, get_configuration_info_t *);
1099int32_t csx_GetPhysicalAdapterInfo(client_handle_t,
1100					get_physical_adapter_info_t *);
1101
1102/*
1103 * CIS tuple parsing functions
1104 */
1105int32_t csx_Parse_CISTPL_CONFIG(client_handle_t, tuple_t *, cistpl_config_t *);
1106int32_t csx_Parse_CISTPL_DEVICE(client_handle_t, tuple_t *, cistpl_device_t *);
1107int32_t csx_Parse_CISTPL_DEVICE_A(client_handle_t, tuple_t *,
1108					cistpl_device_t *);
1109int32_t csx_Parse_CISTPL_DEVICE_OA(client_handle_t, tuple_t *,
1110					cistpl_device_t *);
1111int32_t csx_Parse_CISTPL_DEVICE_OC(client_handle_t, tuple_t *,
1112					cistpl_device_t *);
1113int32_t csx_Parse_CISTPL_VERS_1(client_handle_t, tuple_t *, cistpl_vers_1_t *);
1114int32_t csx_Parse_CISTPL_VERS_2(client_handle_t, tuple_t *, cistpl_vers_2_t *);
1115int32_t csx_Parse_CISTPL_JEDEC_A(client_handle_t, tuple_t *, cistpl_jedec_t *);
1116int32_t csx_Parse_CISTPL_JEDEC_C(client_handle_t, tuple_t *, cistpl_jedec_t *);
1117int32_t csx_Parse_CISTPL_FORMAT(client_handle_t, tuple_t *, cistpl_format_t *);
1118int32_t csx_Parse_CISTPL_FORMAT_A(client_handle_t, tuple_t *,
1119					cistpl_format_t *);
1120int32_t csx_Parse_CISTPL_GEOMETRY(client_handle_t, tuple_t *,
1121					cistpl_geometry_t *);
1122int32_t csx_Parse_CISTPL_BYTEORDER(client_handle_t, tuple_t *,
1123					cistpl_byteorder_t *);
1124int32_t csx_Parse_CISTPL_DATE(client_handle_t, tuple_t *, cistpl_date_t *);
1125int32_t csx_Parse_CISTPL_BATTERY(client_handle_t, tuple_t *,
1126					cistpl_battery_t *);
1127int32_t csx_Parse_CISTPL_ORG(client_handle_t, tuple_t *, cistpl_org_t *);
1128int32_t csx_Parse_CISTPL_MANFID(client_handle_t, tuple_t *, cistpl_manfid_t *);
1129int32_t csx_Parse_CISTPL_FUNCID(client_handle_t, tuple_t *, cistpl_funcid_t *);
1130int32_t csx_Parse_CISTPL_FUNCE(client_handle_t, tuple_t *, cistpl_funce_t *,
1131					uint32_t);
1132int32_t csx_Parse_CISTPL_CFTABLE_ENTRY(client_handle_t, tuple_t *,
1133					cistpl_cftable_entry_t *);
1134int32_t csx_Parse_CISTPL_LINKTARGET(client_handle_t, tuple_t *,
1135					cistpl_linktarget_t *);
1136int32_t csx_Parse_CISTPL_LONGLINK_A(client_handle_t, tuple_t *,
1137					cistpl_longlink_ac_t *);
1138int32_t csx_Parse_CISTPL_LONGLINK_C(client_handle_t, tuple_t *,
1139					cistpl_longlink_ac_t *);
1140int32_t csx_Parse_CISTPL_LONGLINK_MFC(client_handle_t, tuple_t *,
1141					cistpl_longlink_mfc_t *);
1142int32_t csx_Parse_CISTPL_SPCL(client_handle_t, tuple_t *,
1143					cistpl_spcl_t *);
1144int32_t csx_Parse_CISTPL_SWIL(client_handle_t, tuple_t *,
1145					cistpl_swil_t *);
1146int32_t csx_Parse_CISTPL_BAR(client_handle_t, tuple_t *,
1147					cistpl_bar_t *);
1148int32_t csx_Parse_CISTPL_DEVICEGEO(client_handle_t, tuple_t *,
1149					cistpl_devicegeo_t *);
1150int32_t csx_Parse_CISTPL_DEVICEGEO_A(client_handle_t, tuple_t *,
1151					cistpl_devicegeo_t *);
1152int32_t csx_Parse_CISTPL_LONGLINK_CB(client_handle_t, tuple_t *,
1153					cistpl_longlink_cb_t *);
1154int32_t csx_ParseTuple(client_handle_t, tuple_t *, cisparse_t *, uint32_t);
1155
1156/*
1157 * Data access functions
1158 */
1159void csx_Put8(acc_handle_t, uint32_t, uint8_t);
1160void csx_Put16(acc_handle_t, uint32_t, uint16_t);
1161void csx_Put32(acc_handle_t, uint32_t, uint32_t);
1162void csx_Put64(acc_handle_t, uint32_t, uint64_t);
1163uint8_t csx_Get8(acc_handle_t, uint32_t);
1164uint16_t csx_Get16(acc_handle_t, uint32_t);
1165uint32_t csx_Get32(acc_handle_t, uint32_t);
1166uint64_t csx_Get64(acc_handle_t, uint32_t);
1167void csx_RepPut8(acc_handle_t, uint8_t *, uint32_t, uint32_t, uint32_t);
1168void csx_RepPut16(acc_handle_t, uint16_t *, uint32_t, uint32_t, uint32_t);
1169void csx_RepPut32(acc_handle_t, uint32_t *, uint32_t, uint32_t, uint32_t);
1170void csx_RepPut64(acc_handle_t, uint64_t *, uint32_t, uint32_t, uint32_t);
1171void csx_RepGet8(acc_handle_t, uint8_t *, uint32_t, uint32_t, uint32_t);
1172void csx_RepGet16(acc_handle_t, uint16_t *, uint32_t, uint32_t, uint32_t);
1173void csx_RepGet32(acc_handle_t, uint32_t *, uint32_t, uint32_t, uint32_t);
1174void csx_RepGet64(acc_handle_t, uint64_t *, uint32_t, uint32_t, uint32_t);
1175
1176/*
1177 * Data access handle manipulation functions
1178 */
1179int32_t csx_GetMappedAddr(acc_handle_t, void **);
1180int32_t csx_GetPhysAddr(acc_handle_t, void **);
1181int32_t csx_DupHandle(acc_handle_t, acc_handle_t *, uint32_t);
1182int32_t csx_FreeHandle(acc_handle_t *);
1183int32_t csx_GetHandleOffset(acc_handle_t, uint32_t *);
1184int32_t csx_SetHandleOffset(acc_handle_t, uint32_t);
1185
1186/*
1187 * XXX - PCMCIA Shady Meadows Retirement Community
1188 *
1189 * The defines in this section should be retired once the PS drivers
1190 *	get updated.
1191 *
1192 * XXX This is an old version of WIN_DATA_WIDTH_MASK and should be
1193 *	retired soon. RETIRE
1194 */
1195#define	WIN_DATA_WIDTH		0x00000002	/* 16-bit data path */
1196/*
1197 * XXX The following are old versions of the IO_DATA_WIDTH_XXX names and
1198 *	should be retured soon. RETIRE
1199 */
1200#define	IO_DATA_PATH_WIDTH	0x00000001	/* 16 bit data path */
1201#define	IO_DATA_PATH_WIDTH_8	0x00000000	/* 8 bit data path */
1202#define	IO_DATA_PATH_WIDTH_16	0x00000001	/* 16 bit data path */
1203/*
1204 * XXX - REMOVAL_ALL_DEVICE_NODES typo, remove soon. RETIRE
1205 */
1206#define	REMOVAL_ALL_DEVICE_NODES	0x03	/* remove all device nodes */
1207
1208/*
1209 * The old name of the csx_RequestSocketMask structure was
1210 *	sockmask_t for some bizzare reason. This typedef
1211 *	keeps that old name around until we can fix
1212 *	the drivers.
1213 */
1214typedef struct request_socket_mask_t sockmask_t;	/* RETIRE */
1215
1216/* XXX - RETIRE and change to a typedef XXX */
1217struct devnode_desc {
1218    char	*name;		/* device node path and name */
1219    int32_t	spec_type;	/* dev special type (block or char) */
1220    int32_t	minor_num;	/* device node minor number */
1221    char	*node_type;	/* device node type */
1222};
1223
1224#ifdef	__cplusplus
1225}
1226#endif
1227
1228#endif	/* _CS_H */
1229