xref: /illumos-gate/usr/src/uts/common/sys/sservice.h (revision d3d50737e566cade9a08d73d2af95105ac7cd960)
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 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SSERVICE_H
27 #define	_SSERVICE_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 typedef int(f_tt)(int, ...);	/* for lint - cc -v quieting */
36 
37 /*
38  * identifiers for all SS functions implemented
39  */
40 #define	SS_GetAdapter		0
41 #define	SS_GetPage		1
42 #define	SS_GetSocket		2
43 #define	SS_GetStatus		3
44 #define	SS_GetWindow		4
45 #define	SS_InquireAdapter	5
46 #define	SS_InquireSocket	6
47 #define	SS_InquireWindow	7
48 #define	SS_ResetSocket		8
49 #define	SS_SetPage		9
50 #define	SS_SetAdapter		10
51 #define	SS_SetSocket		11
52 #define	SS_SetWindow		12
53 #define	SS_SetIRQHandler	13
54 #define	SS_ClearIRQHandler	14
55 #define	CSGetActiveDip		98
56 #define	CSInitDev		99
57 #define	CSRegister		100
58 #define	CSCISInit		101
59 #define	CSUnregister		102
60 
61 /*
62  * XXX
63  */
64 #define	CISGetAddress		103
65 #define	CISSetAddress		104
66 #define	CSCardRemoved		105
67 #define	CSGetCookiesAndDip	106
68 
69 /*
70  * returns a la Socket Services
71  */
72 
73 #define	SUCCESS		0x00
74 #define	BAD_ADAPTER		0x01
75 #define	BAD_ATTRIBUTE	0x02
76 #define	BAD_BASE		0x03
77 #define	BAD_EDC		0x04
78 #define	BAD_IRQ		0x06
79 #define	BAD_OFFSET		0x07
80 #define	BAD_PAGE		0x08
81 #define	READ_FAILURE		0x09
82 #define	BAD_SIZE		0x0a
83 #define	BAD_SOCKET		0x0b
84 #define	BAD_TYPE		0x0d
85 #define	BAD_VCC		0x0e
86 #define	BAD_VPP		0x0f
87 #define	BAD_WINDOW		0x11
88 #define	WRITE_FAILURE	0x12
89 #define	NO_CARD		0x14
90 #define	BAD_FUNCTION		0x15
91 #define	BAD_MODE		0x16
92 #define	BAD_SPEED		0x17
93 #define	BUSY			0x18
94 #define	NO_RESOURCE		0x20
95 
96 /* events for callback */
97 				/* card related events */
98 #define	PCE_CARD_REMOVAL	0 /* card removed */
99 #define	PCE_CARD_INSERT		1 /* card inserted */
100 #define	PCE_CARD_READY		2 /* ready state changed */
101 #define	PCE_CARD_BATTERY_WARN	3 /* battery is getting low */
102 #define	PCE_CARD_BATTERY_DEAD	4 /* battery is dead */
103 #define	PCE_CARD_STATUS_CHANGE	5 /* card status change for I/O card */
104 #define	PCE_CARD_WRITE_PROTECT	6 /* card write protect status change */
105 #define	PCE_CARD_RESET		7 /* client requested reset complete */
106 #define	PCE_CARD_UNLOCK		8 /* lock has been unlocked (opt) */
107 #define	PCE_CLIENT_INFO		9 /* someone wants client information */
108 #define	PCE_EJECTION_COMPLETE	10 /* Motor has finished ejecting card */
109 #define	PCE_EJECTION_REQUEST	11 /* request to eject card */
110 #define	PCE_ERASE_COMPLETE	12 /* a Flash Erase request completed */
111 #define	PCE_EXCLUSIVE_COMPLETE	13
112 #define	PCE_EXCLUSIVE_REQUEST	14
113 #define	PCE_INSERTION_COMPLETE	15
114 #define	PCE_INSERTION_REQUEST	16
115 #define	PCE_REGISTRATION_COMPLETE	17
116 #define	PCE_RESET_COMPLETE	18
117 #define	PCE_RESET_PHYSICAL	19
118 #define	PCE_RESET_REQUEST	20
119 #define	PCE_TIMER_EXPIRED	21
120 
121 /* added for SPARC CPR support */
122 #define	PCE_PM_RESUME		22
123 #define	PCE_PM_SUSPEND		23
124 
125 /* added for dynamic nexus registration */
126 #define	PCE_SS_INIT_STATE	24 /* SS init state */
127 #define	PCE_ADD_SOCKET		25 /* add a new socket */
128 #define	PCE_DROP_SOCKET		26 /* drop an existing socket */
129 
130 #define	PCE_DEV_IDENT		30 /* The nexus has identified the device */
131 #define	PCE_INIT_DEV		31 /* asking for a device */
132 
133 #define	PCE_E2M(event)		(1 << (event))
134 
135 /* event callback uses an indirect call -- make it look like a function */
136 #define	CS_EVENT(event, socket, arg)	(*pcmcia_cs_event) (event, socket, arg)
137 
138 /* values for "socket number" field for PCE_SS_INIT_STATE event */
139 #define	PCE_SS_STATE_INIT	0x0001  /* SS ready for callbacks */
140 #define	PCE_SS_STATE_DEINIT	0x0002  /* SS not ready for callbacks */
141 
142 /*
143  * The following structure is to support CSRegister
144  */
145 typedef struct csregister {
146 	uint32_t	cs_magic;		/* magic number */
147 	uint32_t		cs_version;		/* CS version number */
148 						/* CS entry point */
149 	int		(*cs_card_services)(int, ...);
150 						/* CS event entry point */
151 	f_tt		*cs_event;
152 } csregister_t;
153 
154 /* GetAdapter(get_adapter_t) */
155 
156 typedef struct get_adapter {
157 	unsigned	state;		/* adapter hardware state */
158 	irq_t		SCRouting;	/* status change IRQ routing */
159 } get_adapter_t;
160 
161 /* IRQ definitions */
162 #define	IRQ_ENABLE	0x8000
163 
164 /* GetPage(get_page_t) */
165 
166 typedef struct get_page {
167 	unsigned	window;		/* window number */
168 	unsigned	page;		/* page number within window */
169 	unsigned	state;		/* page state: */
170 					/*
171 					 * PS_ATTRIBUTE
172 					 * PS_COMMON
173 					 * PS_IO (for DoRight?)
174 					 * PS_ENABLED
175 					 * PS_WP
176 					 */
177 	off_t		offset;		/* PC card's memory offset */
178 } get_page_t;
179 
180 /*
181  * PS flags
182  */
183 
184 #define	PS_ATTRIBUTE	0x01
185 #define	PS_ENABLED	0x02
186 #define	PS_WP		0x04
187 #define	PS_IO		0x08	/* needed? for DoRight */
188 
189 /* GetSocket(get_socket_t) */
190 
191 typedef struct get_socket {
192 	unsigned	socket;		/* socket number */
193 	unsigned	SCIntMask;	/* status change interrupt mask */
194 	unsigned	VccLevel;	/* VCC voltage in 1/10 volt */
195 	unsigned	Vpp1Level;	/* VPP1 voltage in 1/10 volt */
196 	unsigned	Vpp2Level;	/* VPP2 voltage in 1/10 volt */
197 	unsigned	state;		/* latched status change signals */
198 	unsigned	CtlInd;		/* controls and indicators */
199 	irq_t		IRQRouting;	/* I/O IRQ routing */
200 	unsigned	IFType;		/* memory-only or memory & I/O */
201 } get_socket_t;
202 
203 /* GetStatus(get_ss_status_t) */
204 
205 typedef struct get_ss_status {
206 	unsigned	socket;		/* socket number */
207 	unsigned	CardState;	/* real-time card state */
208 	unsigned	SocketState;	/* latched status change signals */
209 	unsigned	CtlInd;		/* controls and indicators */
210 	irq_t		IRQRouting;	/* I/O IRQ routing */
211 	unsigned	IFType;		/* memory-only or memory & I/O */
212 } get_ss_status_t;
213 
214 /*
215  * Socket specific flags and capabilities
216  */
217 
218 #define	SBM_WP		0x01
219 #define	SBM_LOCKED	0x02
220 #define	SBM_EJECT	0x04
221 #define	SBM_INSERT	0x08
222 #define	SBM_BVD1	0x10
223 #define	SBM_BVD2	0x20
224 #define	SBM_RDYBSY	0x40
225 #define	SBM_CD		0x80
226 
227 				/* capabilities only */
228 #define	SBM_LOCK	0x10
229 #define	SBM_BATT	0x20
230 #define	SBM_BUSY	0x40
231 #define	SBM_XID		0x80
232 
233 /* GetWindow(get_window_t) */
234 typedef uint32_t speed_t;	/* memory speed in nanoseconds */
235 
236 typedef struct get_window {
237 	unsigned		window;	/* window number */
238 	unsigned		socket;	/* socket this window is assigned to */
239 	unsigned		size;	/* size in bytes */
240 	unsigned		state;	/* current state of window hardware */
241 	uint_t			speed;	/* speed in nanoseconds */
242 	uint_t			base;
243 	ddi_acc_handle_t	handle;		/* base addr in host space */
244 } get_window_t;
245 
246 /*
247  * window flags (state and capabilities)
248  */
249 #define	WS_IO		0x01
250 #define	WS_ENABLED	0x02
251 #define	WS_16BIT	0x04
252 #define	WS_PAGED	0x80
253 #define	WS_EISA		0x10
254 #define	WS_CENABLE	0x20
255 #define	WS_EXACT_MAPIN	0x40	/* map exactly what's asked for */
256 
257 /* Inquire Adapter(inquire_adapter_t) */
258 
259 typedef struct inquire_adapter {
260 	unsigned	NumSockets;	/* number of sockets */
261 	unsigned	NumWindows;	/* number of windows */
262 	unsigned	NumEDCs;	/* number of EDCs */
263 
264 	unsigned	AdpCaps;	/* adapter power capabilities */
265 	irq_t		ActiveHigh;	/* active high status change IRQ */
266 	irq_t		ActiveLow;	/* active low status change IRQ */
267 	int		NumPower;	/* number of power entries */
268 	struct power_entry {
269 		unsigned	PowerLevel;	/* voltage in 1/10 volt */
270 		unsigned	ValidSignals;	/* voltage is valid for: */
271 						/*
272 						 * VCC
273 						 * VPP1
274 						 * VPP2
275 						 * if none are set, this is end
276 						 * of list
277 						 */
278 	} *power_entry;
279 	int		NumInterrupts; /* number of interrupts supportable */
280 	struct intr_entry {
281 		int	pri;
282 		int	intr;
283 	}		*AvailInterrupts; /* array of intrs, one per intr */
284 	uint_t		ResourceFlags; /* resource allocation requirements */
285 } inquire_adapter_t;
286 
287 #define	VCC	0x80
288 #define	VPP1	0x40
289 #define	VPP2	0x20
290 #define	V_MASK	(VCC|VPP1|VPP2)
291 
292 #define	RES_OWN_IRQ	0x0001	/* adapter owns own IRQ resources */
293 #define	RES_OWN_IO	0x0002	/* adapter owns own I/O resources */
294 #define	RES_OWN_MEM	0x0004	/* adapter owns own memory resources */
295 #define	RES_IRQ_NEXUS	0x0008	/* adapter/nexus must multiplex IRQs */
296 #define	RES_IRQ_SHAREABLE	0x0010 /* IRQ can be shared */
297 
298 /* InquireSocket(inquire_socket_t) */
299 
300 typedef struct inquire_socket {
301 	unsigned	socket;		/* socket number */
302 	unsigned	SCIntCaps;	/* status change interrupt events */
303 	unsigned	SCRptCaps;	/* reportable status change events */
304 	unsigned	CtlIndCaps;	/* controls and indicators */
305 	unsigned	SocketCaps;	/* socket capabilities */
306 	irq_t		ActiveHigh;	/* active high status change IRQ */
307 	irq_t		ActiveLow;	/* active low status change IRQ */
308 } inquire_socket_t;
309 
310 /* InquireWindow(inquire_window_t) */
311 
312 typedef struct memwin_char {
313 	unsigned	MemWndCaps;	/* memory window characteristcs */
314 	baseaddr_t	FirstByte;	/* first byte in host space */
315 	baseaddr_t	LastByte;	/* last byte in host space */
316 	unsigned	MinSize;	/* minimum window size */
317 	unsigned	MaxSize;	/* maximum window size */
318 	unsigned	ReqGran;	/* window size constraints */
319 	unsigned	ReqBase;	/* base address alignment boundry */
320 	unsigned	ReqOffset;	/* offset alignment boundry */
321 	unsigned	Slowest;	/* slowest speed in nanoseconds */
322 	unsigned	Fastest;	/* fastest speed in nanoseconds */
323 } mem_win_char_t;
324 
325 typedef struct iowin_char {
326 	unsigned	IOWndCaps;	/* I/O window characteristcs */
327 	baseaddr_t	FirstByte;	/* first byte in host space */
328 	baseaddr_t	LastByte;	/* last byte in host space */
329 	unsigned	MinSize;	/* minimum window size */
330 	unsigned	MaxSize;	/* maximum window size */
331 	unsigned	ReqGran;	/* window size constraints */
332 	unsigned	AddrLines;	/* number of address lines decoded */
333 	unsigned	EISASlot;	/* EISA I/O address decoding */
334 } iowin_char_t;
335 
336 typedef struct inquire_window {
337 	unsigned	window;		/* window number */
338 	unsigned	WndCaps;	/* window capabilities */
339 	socket_enum_t	Sockets;	/* window<->socket assignment mask */
340 	/* note that we always declare both forms */
341 	mem_win_char_t	mem_win_char;
342 	iowin_char_t	iowin_char;
343 } inquire_window_t;
344 
345 
346 /* interface definitions */
347 #define	IF_CARDBUS	0x00	/* CardBus interface */
348 #define	IF_IO		0x01	/* IO + memory */
349 #define	IF_MEMORY	0x02	/* memory only */
350 #define	IF_TYPE_MASK	0x03
351 
352 #define	DREQ_MASK	0x0c
353 #define	DREQ_NONE	0x00
354 #define	DREQ_SPKR	0x04
355 #define	DREQ_IOIS16	0x08
356 #define	DREQ_INPACK	0x0c
357 
358 #define	DMA_CHAN_MASK	0xf0
359 #define	DMA_GET_CHAN(x) (((x) >> 4) & 0xF)
360 #define	DMA_SET_CHAN(x, y) (((x) & 0xF) | ((y) & ~DMA_CHAN_MASK))
361 
362 #define	IF_CB		0x04
363 #define	IF_DMA		0x08
364 #define	IF_VSKEY	0x10
365 #define	IF_33VC		0x20
366 #define	IF_XXVCC	0x40
367 
368 
369 #define	PC_PAGESIZE	0x4000	/* 16K page size */
370 
371 /* window capabilities */
372 				/* generic */
373 #define	WC_IO		0x0004
374 #define	WC_WAIT		0x0080
375 #define	WC_COMMON	0x0001
376 #define	WC_ATTRIBUTE	0x0002
377 				/* I/O and memory */
378 #define	WC_BASE		0x0001
379 #define	WC_SIZE		0x0002
380 #define	WC_WENABLE	0x0004
381 #define	WC_8BIT		0x0008
382 #define	WC_16BIT	0x0010
383 #define	WC_BALIGN	0x0020
384 #define	WC_POW2		0x0040
385 				/* memory only */
386 #define	WC_CALIGN	0x0080
387 #define	WC_PAVAIL	0x0100
388 #define	WC_PSHARED	0x0200
389 #define	WC_PENABLE	0x0400
390 #define	WC_WP		0x0800
391 				/* I/O only */
392 #define	WC_INPACK	0x0080
393 #define	WC_EISA		0x0100
394 #define	WC_CENABLE	0x0200
395 				/* Solaris/SPARC */
396 #define	WC_IO_RANGE_PER_WINDOW	0x8000 /* I/O range unique for each window */
397 
398 /* SetPage(set_page_t *) */
399 typedef struct set_page {
400 	unsigned	window;	/* window number */
401 	unsigned	page;	/* page number */
402 	unsigned	state;	/* page state */
403 	off_t		offset;	/* offset in PC card space */
404 } set_page_t;
405 
406 /* SetSocket(set_socket_t) */
407 
408 typedef struct set_socket {
409 	unsigned	socket;	/* socket number */
410 	unsigned	SCIntMask; /* status change enables */
411 	unsigned	Vcontrol; /* power control flags */
412 	unsigned	VccLevel; /* Vcc power index level */
413 	unsigned	Vpp1Level; /* Vpp1 power index level */
414 	unsigned	Vpp2Level; /* Vpp2 power index level */
415 	unsigned	State;
416 	unsigned	CtlInd;	/* control and indicator bits */
417 	irq_t		IREQRouting; /* I/O IRQ routing */
418 	unsigned	IFType;	/* interface type (mem/IO) */
419 } set_socket_t;
420 
421 #define	VCTL_CISREAD	0x01	/* controlled by Vcc/Vpp sense pins */
422 #define	VCTL_OVERRIDE	0x02	/* 16-bit cards, ignore the sense pins */
423 
424 /* SetIRQHandler(set_irq_handler_t) */
425 
426 typedef struct set_irq_handler {
427 	unsigned	socket;	/* associate with a socket for now */
428 	unsigned	irq;
429 	unsigned	handler_id;	/* ID of this client's handler */
430 	f_tt		*handler;	/* client IO IRQ handler entry point */
431 	void		*arg1;		/* arg to call client handler with */
432 	void		*arg2;		/* arg to call client handler with */
433 	ddi_iblock_cookie_t	*iblk_cookie;	/* iblk cookie pointer */
434 	ddi_idevice_cookie_t	*idev_cookie;	/* idev cookie pointer */
435 } set_irq_handler_t;
436 
437 #define	IRQ_ANY		0x0
438 
439 /* interrupt priority levels */
440 #define	PRIORITY_LOW	0x00
441 #define	PRIORITY_HIGH	0x10
442 
443 /* ClearIRQHandler(clear_irq_handler_t) */
444 
445 typedef struct clear_irq_handler {
446 	unsigned	socket;
447 	unsigned	handler_id;	/* client handler ID to remove */
448 	f_tt		*handler;	/* client IO IRQ handler entry point */
449 } clear_irq_handler_t;
450 
451 /* SetWindow(set_window_t) */
452 
453 typedef struct set_window {
454 	unsigned		window;		/* window number */
455 	unsigned		socket;		/* socket number */
456 	unsigned		WindowSize;	/* window size in bytes */
457 	unsigned		state;		/* window state */
458 	unsigned		speed;		/* window speed, nanoseconds */
459 	uint_t			base;
460 	ddi_acc_handle_t	handle;		/* base addr in host space */
461 	dev_info_t		*child;		/* child's dip */
462 	ddi_device_acc_attr_t	attr;
463 } set_window_t;
464 
465 /* CSInitDev */
466 typedef
467 struct ss_make_device_node {
468 	uint32_t		flags;		/* operation flags */
469 	dev_info_t	*dip;		/* dip for this client */
470 	char		*name;		/* device node path and name */
471 	char		*slot;		/* slot name string */
472 	char		*busaddr;	/* bus addr name string */
473 	int		spec_type;	/* dev special type (block/char) */
474 	int		minor_num;	/* device node minor number */
475 	char		*node_type;	/* device node type */
476 } ss_make_device_node_t;
477 
478 #define	SS_CSINITDEV_CREATE_DEVICE	0x01	/* create device node */
479 #define	SS_CSINITDEV_REMOVE_DEVICE	0x02	/* remove device node */
480 #define	SS_CSINITDEV_USE_SLOT		0x04	/* use slot name from caller */
481 #define	SS_CSINITDEV_USE_BUSADDR	0x08	/* use bus addr from caller */
482 #define	SS_CSINITDEV_MORE_DEVICES	0x10	/* send PCE_INIT_DEV */
483 #define	SS_CSINITDEV_SEND_DEV_EVENT	0x10	/* send PCE_INIT_DEV */
484 
485 /*
486  * csss_adapter_info_t - provides additional per-socket adapter info
487  */
488 typedef struct csss_adapter_info_t {
489 	char	name[MODMAXNAMELEN];	/* adapter name */
490 	int	major;			/* adapter major number */
491 	int	minor;			/* adapter minor number */
492 	int	number;			/* canonical adapter number */
493 	int	num_sockets;		/* # sockets on this adapter */
494 	int	first_socket;		/* first socket # on this adapter */
495 } csss_adapter_info_t;
496 
497 /* CSGetCookiesAndDip */
498 typedef struct get_cookies_and_dip_t {
499 	unsigned		socket;		/* socket number */
500 	dev_info_t		*dip;		/* adapter instance dip */
501 	ddi_iblock_cookie_t	*iblock;	/* for event handler */
502 	ddi_idevice_cookie_t	*idevice;	/* for event handler */
503 	csss_adapter_info_t	adapter_info;	/* adapter info for socket */
504 } get_cookies_and_dip_t;
505 
506 /* ResetSocket */
507 #define	RESET_MODE_FULL		0 /* Reset to SocketServices Specification */
508 #define	RESET_MODE_CARD_ONLY	1 /* only reset the card itself */
509 
510 /* union of all exported functions functions */
511 typedef
512 union sservice {
513 	get_adapter_t	get_adapter;
514 	get_page_t	get_page;
515 	get_socket_t	get_socket;
516 	get_window_t	get_window;
517 	get_ss_status_t	get_ss_status;
518 	inquire_adapter_t	inquire_adapter;
519 	inquire_socket_t	inquire_socket;
520 	inquire_window_t	inquire_window;
521 	set_page_t	set_page;
522 	set_socket_t	set_socket;
523 	set_irq_handler_t	set_irq_handler;
524 	set_window_t	set_window;
525 	get_cookies_and_dip_t get_cookies;
526 	ss_make_device_node_t make_device;
527 } sservice_t;
528 
529 /* event manager structures */
530 struct pcm_make_dev {
531 	int	socket;
532 	int	flags;
533 	int	op;
534 	dev_t	dev;
535 	int	type;
536 	char	driver[MODMAXNAMELEN];
537 	char	path[MAXPATHLEN];
538 };
539 
540 #define	PCM_EVENT_MORE		0x0001	/* more events of this type coming */
541 
542 #ifdef	_KERNEL
543 
544 #include <sys/sunndi.h>
545 
546 /*
547  * prototypes for nexi
548  */
549 
550 int pcmcia_attach(dev_info_t *, struct pcmcia_adapter_nexus_private *);
551 int pcmcia_ctlops(dev_info_t *, dev_info_t *, ddi_ctl_enum_t, void *, void *);
552 int pcmcia_prop_op(dev_t, dev_info_t *, dev_info_t *, ddi_prop_op_t,
553 			int, char *, caddr_t, int *);
554 int pcmcia_intr_ops(dev_info_t *dip, dev_info_t *rdip, ddi_intr_op_t intr_op,
555     ddi_intr_handle_impl_t *hdlp, void *result);
556 
557 int pcmcia_open(dev_t *, int, int, cred_t *);
558 int pcmcia_close(dev_t, int, int, cred_t *);
559 int pcmcia_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
560 int pcmcia_power(dev_info_t *, int, int);
561 void pcmcia_begin_resume(dev_info_t *);
562 void pcmcia_wait_insert(dev_info_t *);
563 
564 
565 /* resource allocation functions and structure */
566 typedef struct ra_return {
567 	uint_t	ra_addr_hi;
568 	uint_t	ra_addr_lo;
569 	uint_t	ra_len;
570 } ra_return_t;
571 
572 int pcmcia_alloc_mem(dev_info_t *, ndi_ra_request_t *, ra_return_t *,
573 		dev_info_t **);
574 int pcmcia_alloc_io(dev_info_t *, ndi_ra_request_t *, ra_return_t *,
575 		dev_info_t **);
576 int pcmcia_free_mem(dev_info_t *, ra_return_t *);
577 int pcmcia_free_io(dev_info_t *, ra_return_t *);
578 int pcmcia_map_reg(dev_info_t *, dev_info_t *, ra_return_t *,
579 			uint32_t, caddr_t *, ddi_acc_handle_t *,
580 			ddi_device_acc_attr_t *, uint32_t);
581 int pcmcia_bus_map(dev_info_t *, dev_info_t *, ddi_map_req_t *,
582 	off_t, off_t, caddr_t *);
583 
584 #endif /* _KERNEL */
585 
586 #ifdef	__cplusplus
587 }
588 #endif
589 
590 #endif	/* _SSERVICE_H */
591