xref: /titanic_51/usr/src/uts/common/io/pcic.c (revision 87c5f7b3eef6309c168257f261ac6ace4581d234)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * PCIC device/interrupt handler
31  *	The "pcic" driver handles the Intel 82365SL, Cirrus Logic
32  *	and Toshiba (and possibly other clones) PCMCIA adapter chip
33  *	sets.  It implements a subset of Socket Services as defined
34  *	in the Solaris PCMCIA design documents
35  */
36 
37 /*
38  * currently defined "properties"
39  *
40  * clock-frequency		bus clock frequency
41  * smi				system management interrupt override
42  * need-mult-irq		need status IRQ for each pair of sockets
43  * disable-audio		don't route audio signal to speaker
44  */
45 
46 
47 #include <sys/types.h>
48 #include <sys/inttypes.h>
49 #include <sys/param.h>
50 #include <sys/systm.h>
51 #include <sys/user.h>
52 #include <sys/buf.h>
53 #include <sys/file.h>
54 #include <sys/uio.h>
55 #include <sys/conf.h>
56 #include <sys/stat.h>
57 #include <sys/autoconf.h>
58 #include <sys/vtoc.h>
59 #include <sys/dkio.h>
60 #include <sys/ddi.h>
61 #include <sys/sunddi.h>
62 #include <sys/sunndi.h>
63 #include <sys/var.h>
64 #include <sys/callb.h>
65 #include <sys/open.h>
66 #include <sys/ddidmareq.h>
67 #include <sys/dma_engine.h>
68 #include <sys/kstat.h>
69 #include <sys/kmem.h>
70 #include <sys/modctl.h>
71 #include <sys/pci.h>
72 #include <sys/pci_impl.h>
73 
74 #include <sys/pctypes.h>
75 #include <sys/pcmcia.h>
76 #include <sys/sservice.h>
77 
78 #include <sys/note.h>
79 
80 #include <sys/pcic_reg.h>
81 #include <sys/pcic_var.h>
82 
83 #if defined(__sparc)
84 #include <sys/pci/pci_nexus.h>
85 #endif
86 
87 #include <sys/hotplug/hpcsvc.h>
88 #include "cardbus/cardbus.h"
89 
90 #define	SOFTC_SIZE	(sizeof (anp_t))
91 
92 static int pcic_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
93 static int pcic_attach(dev_info_t *, ddi_attach_cmd_t);
94 static int pcic_detach(dev_info_t *, ddi_detach_cmd_t);
95 static uint_t pcic_intr(caddr_t, caddr_t);
96 static int pcic_do_io_intr(pcicdev_t *, uint32_t);
97 static int pcic_probe(dev_info_t *);
98 
99 static int pcic_open(dev_t *, int, int, cred_t *);
100 static int pcic_close(dev_t, int, int, cred_t *);
101 static int pcic_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
102 
103 typedef struct pcm_regs pcm_regs_t;
104 
105 static void pcic_init_assigned(dev_info_t *);
106 static int pcic_apply_avail_ranges(dev_info_t *, pcm_regs_t *,
107 	pci_regspec_t *, int);
108 int pci_resource_setup_avail(dev_info_t *, pci_regspec_t *, int);
109 
110 /*
111  * On x86 platforms the ddi_iobp_alloc(9F) and ddi_mem_alloc(9F) calls
112  * are xlated into DMA ctlops. To make this nexus work on x86, we
113  * need to have the default ddi_dma_mctl ctlops in the bus_ops
114  * structure, just to pass the request to the parent. The correct
115  * ctlops should be ddi_no_dma_mctl because so far we don't do DMA.
116  */
117 static
118 struct bus_ops pcmciabus_ops = {
119 	BUSO_REV,
120 	pcmcia_bus_map,
121 	NULL,
122 	NULL,
123 	NULL,
124 	i_ddi_map_fault,
125 	ddi_no_dma_map,
126 	ddi_no_dma_allochdl,
127 	ddi_no_dma_freehdl,
128 	ddi_no_dma_bindhdl,
129 	ddi_no_dma_unbindhdl,
130 	ddi_no_dma_flush,
131 	ddi_no_dma_win,
132 	ddi_dma_mctl,
133 	pcmcia_ctlops,
134 	pcmcia_prop_op,
135 	NULL,				/* (*bus_get_eventcookie)();	*/
136 	NULL,				/* (*bus_add_eventcall)();	*/
137 	NULL,				/* (*bus_remove_eventcall)();	*/
138 	NULL,				/* (*bus_post_event)();		*/
139 	NULL,				/* (*bus_intr_ctl)();		*/
140 	NULL,				/* (*bus_config)(); 		*/
141 	NULL,				/* (*bus_unconfig)(); 		*/
142 	NULL,				/* (*bus_fm_init)(); 		*/
143 	NULL,				/* (*bus_fm_fini)(); 		*/
144 	NULL,				/* (*bus_enter)()		*/
145 	NULL,				/* (*bus_exit)()		*/
146 	NULL,				/* (*bus_power)()		*/
147 	pcmcia_intr_ops			/* (*bus_intr_op)(); 		*/
148 };
149 
150 static struct cb_ops pcic_cbops = {
151 	pcic_open,
152 	pcic_close,
153 	nodev,
154 	nodev,
155 	nodev,
156 	nodev,
157 	nodev,
158 	pcic_ioctl,
159 	nodev,
160 	nodev,
161 	nodev,
162 	nochpoll,
163 	ddi_prop_op,
164 	NULL,
165 #ifdef CARDBUS
166 	D_NEW | D_MP | D_HOTPLUG
167 #else
168 	D_NEW | D_MP
169 #endif
170 };
171 
172 static struct dev_ops pcic_devops = {
173 	DEVO_REV,
174 	0,
175 	pcic_getinfo,
176 	nulldev,
177 	pcic_probe,
178 	pcic_attach,
179 	pcic_detach,
180 	nulldev,
181 	&pcic_cbops,
182 	&pcmciabus_ops,
183 	NULL
184 };
185 
186 void *pcic_soft_state_p = NULL;
187 static int pcic_maxinst = -1;
188 
189 int pcic_do_insertion = 1;
190 int pcic_do_removal = 1;
191 
192 struct irqmap {
193 	int irq;
194 	int count;
195 } pcic_irq_map[16];
196 
197 
198 int pcic_debug = 0x0;
199 static  void    pcic_err(dev_info_t *dip, int level, const char *fmt, ...);
200 extern void cardbus_dump_pci_config(dev_info_t *dip);
201 extern void cardbus_dump_socket(dev_info_t *dip);
202 extern int cardbus_validate_iline(dev_info_t *dip, ddi_acc_handle_t handle);
203 static void pcic_dump_debqueue(char *msg);
204 
205 #if defined(PCIC_DEBUG)
206 static void xxdmp_all_regs(pcicdev_t *, int, uint32_t);
207 
208 #define	pcic_mutex_enter(a)	\
209 	{ \
210 		pcic_err(NULL, 10, "Set lock at %d\n", __LINE__); \
211 		mutex_enter(a); \
212 	};
213 
214 #define	pcic_mutex_exit(a)	\
215 	{ \
216 		pcic_err(NULL, 10, "Clear lock at %d\n", __LINE__); \
217 		mutex_exit(a); \
218 	};
219 
220 #else
221 #define	pcic_mutex_enter(a)	mutex_enter(a)
222 #define	pcic_mutex_exit(a)	mutex_exit(a)
223 #endif
224 
225 #define	PCIC_VCC_3VLEVEL	1
226 #define	PCIC_VCC_5VLEVEL	2
227 #define	PCIC_VCC_12LEVEL	3
228 
229 /* bit patterns to select voltage levels */
230 int pcic_vpp_levels[13] = {
231 	0, 0, 0,
232 	1,	/* 3.3V */
233 	0,
234 	1,	/* 5V */
235 	0, 0, 0, 0, 0, 0,
236 	2	/* 12V */
237 };
238 
239 uint8_t pcic_cbv_levels[13] = {
240 	0, 0, 0,
241 	3,			/* 3.3V */
242 	0,
243 	2,			/* 5V */
244 	0, 0, 0, 0, 0, 0,
245 	1			/* 12V */
246 };
247 
248 struct power_entry pcic_power[4] = {
249 	{
250 		0, VCC|VPP1|VPP2
251 	},
252 	{
253 		33,		/* 3.3Volt */
254 		VCC|VPP1|VPP2
255 	},
256 	{
257 		5*10,		/* 5Volt */
258 		VCC|VPP1|VPP2	/* currently only know about this */
259 	},
260 	{
261 		12*10,		/* 12Volt */
262 		VPP1|VPP2
263 	}
264 };
265 
266 /*
267  * Base used to allocate ranges of PCI memory on x86 systems
268  * Each instance gets a chunk above the base that is used to map
269  * in the memory and I/O windows for that device.
270  * Pages below the base are also allocated for the EXCA registers,
271  * one per instance.
272  */
273 #define	PCIC_PCI_MEMCHUNK	0x1000000
274 
275 static int pcic_wait_insert_time = 5000000;	/* In micro-seconds */
276 static int pcic_debounce_time = 200000; /* In micro-seconds */
277 
278 struct debounce {
279 	pcic_socket_t *pcs;
280 	clock_t expire;
281 	struct debounce *next;
282 };
283 
284 static struct debounce *pcic_deb_queue = NULL;
285 static kmutex_t pcic_deb_mtx;
286 static kcondvar_t pcic_deb_cv;
287 static kthread_t *pcic_deb_threadid;
288 
289 static inthandler_t *pcic_handlers;
290 
291 static void pcic_setup_adapter(pcicdev_t *);
292 static int pcic_change(pcicdev_t *, int);
293 static int pcic_ll_reset(pcicdev_t *, int);
294 static void pcic_mswait(pcicdev_t *, int, int);
295 static boolean_t pcic_check_ready(pcicdev_t *, int);
296 static void pcic_set_cdtimers(pcicdev_t *, int, uint32_t, int);
297 static void pcic_ready_wait(pcicdev_t *, int);
298 extern int pcmcia_get_intr(dev_info_t *, int);
299 extern int pcmcia_return_intr(dev_info_t *, int);
300 extern void pcmcia_cb_suspended(int);
301 extern void pcmcia_cb_resumed(int);
302 
303 static int pcic_callback(dev_info_t *, int (*)(), int);
304 static int pcic_inquire_adapter(dev_info_t *, inquire_adapter_t *);
305 static int pcic_get_adapter(dev_info_t *, get_adapter_t *);
306 static int pcic_get_page(dev_info_t *, get_page_t *);
307 static int pcic_get_socket(dev_info_t *, get_socket_t *);
308 static int pcic_get_status(dev_info_t *, get_ss_status_t *);
309 static int pcic_get_window(dev_info_t *, get_window_t *);
310 static int pcic_inquire_socket(dev_info_t *, inquire_socket_t *);
311 static int pcic_inquire_window(dev_info_t *, inquire_window_t *);
312 static int pcic_reset_socket(dev_info_t *, int, int);
313 static int pcic_set_page(dev_info_t *, set_page_t *);
314 static int pcic_set_window(dev_info_t *, set_window_t *);
315 static int pcic_set_socket(dev_info_t *, set_socket_t *);
316 static int pcic_set_interrupt(dev_info_t *, set_irq_handler_t *);
317 static int pcic_clear_interrupt(dev_info_t *, clear_irq_handler_t *);
318 static void pcic_pm_detection(void *);
319 static void pcic_iomem_pci_ctl(ddi_acc_handle_t, uchar_t *, unsigned);
320 static int clext_reg_read(pcicdev_t *, int, uchar_t);
321 static void clext_reg_write(pcicdev_t *, int, uchar_t, uchar_t);
322 static int pcic_calc_speed(pcicdev_t *, uint32_t);
323 static int pcic_card_state(pcicdev_t *, pcic_socket_t *);
324 static int pcic_find_pci_type(pcicdev_t *);
325 static void pcic_82092_smiirq_ctl(pcicdev_t *, int, int, int);
326 static void pcic_handle_cd_change(pcicdev_t *, pcic_socket_t *, uint8_t);
327 static uint_t pcic_cd_softint(caddr_t, caddr_t);
328 static uint8_t pcic_getb(pcicdev_t *, int, int);
329 static void pcic_putb(pcicdev_t *, int, int, int8_t);
330 static int pcic_set_vcc_level(pcicdev_t *, set_socket_t *);
331 static uint_t pcic_softintr(caddr_t, caddr_t);
332 
333 static void pcic_debounce(pcic_socket_t *);
334 static void pcic_do_resume(pcicdev_t *);
335 static void *pcic_add_debqueue(pcic_socket_t *, int);
336 static void pcic_rm_debqueue(void *);
337 static void pcic_deb_thread();
338 
339 static boolean_t pcic_load_cardbus(pcicdev_t *pcic, const pcic_socket_t *sockp);
340 static void pcic_unload_cardbus(pcicdev_t *pcic, const pcic_socket_t *sockp);
341 static uint32_t pcic_getcb(pcicdev_t *pcic, int reg);
342 static void pcic_putcb(pcicdev_t *pcic, int reg, uint32_t value);
343 static void pcic_cb_enable_intr(dev_info_t *);
344 static void pcic_cb_disable_intr(dev_info_t *);
345 static void pcic_enable_io_intr(pcicdev_t *pcic, int socket, int irq);
346 static void pcic_disable_io_intr(pcicdev_t *pcic, int socket);
347 
348 static cb_nexus_cb_t pcic_cbnexus_ops = {
349 	pcic_cb_enable_intr,
350 	pcic_cb_disable_intr
351 };
352 
353 static int pcic_exca_powerctl(pcicdev_t *pcic, int socket, int powerlevel);
354 static int pcic_cbus_powerctl(pcicdev_t *pcic, int socket);
355 
356 #if defined(__sparc)
357 static int pcic_fault(enum pci_fault_ops op, void *arg);
358 #endif
359 
360 
361 /*
362  * pcmcia interface operations structure
363  * this is the private interface that is exported to the nexus
364  */
365 pcmcia_if_t pcic_if_ops = {
366 	PCIF_MAGIC,
367 	PCIF_VERSION,
368 	pcic_callback,
369 	pcic_get_adapter,
370 	pcic_get_page,
371 	pcic_get_socket,
372 	pcic_get_status,
373 	pcic_get_window,
374 	pcic_inquire_adapter,
375 	pcic_inquire_socket,
376 	pcic_inquire_window,
377 	pcic_reset_socket,
378 	pcic_set_page,
379 	pcic_set_window,
380 	pcic_set_socket,
381 	pcic_set_interrupt,
382 	pcic_clear_interrupt,
383 	NULL,
384 };
385 
386 /*
387  * chip type identification routines
388  * this list of functions is searched until one of them succeeds
389  * or all fail.  i82365SL is assumed if failed.
390  */
391 static int pcic_ci_cirrus(pcicdev_t *);
392 static int pcic_ci_vadem(pcicdev_t *);
393 static int pcic_ci_ricoh(pcicdev_t *);
394 
395 int (*pcic_ci_funcs[])(pcicdev_t *) = {
396 	pcic_ci_cirrus,
397 	pcic_ci_vadem,
398 	pcic_ci_ricoh,
399 	NULL
400 };
401 
402 static struct modldrv modldrv = {
403 	&mod_driverops,		/* Type of module. This one is a driver */
404 	"PCIC PCMCIA adapter driver %I%",	/* Name of the module. */
405 	&pcic_devops,		/* driver ops */
406 };
407 
408 static struct modlinkage modlinkage = {
409 	MODREV_1, (void *)&modldrv, NULL
410 };
411 
412 int
413 _init()
414 {
415 	int stat;
416 
417 	/* Allocate soft state */
418 	if ((stat = ddi_soft_state_init(&pcic_soft_state_p,
419 	    SOFTC_SIZE, 2)) != DDI_SUCCESS)
420 		return (stat);
421 
422 	if ((stat = mod_install(&modlinkage)) != 0)
423 		ddi_soft_state_fini(&pcic_soft_state_p);
424 
425 	return (stat);
426 }
427 
428 int
429 _fini()
430 {
431 	int stat = 0;
432 
433 	if ((stat = mod_remove(&modlinkage)) != 0)
434 		return (stat);
435 
436 	if (pcic_deb_threadid) {
437 		mutex_enter(&pcic_deb_mtx);
438 		pcic_deb_threadid = 0;
439 		while (!pcic_deb_threadid)
440 			cv_wait(&pcic_deb_cv, &pcic_deb_mtx);
441 		pcic_deb_threadid = 0;
442 		mutex_exit(&pcic_deb_mtx);
443 
444 		mutex_destroy(&pcic_deb_mtx);
445 		cv_destroy(&pcic_deb_cv);
446 	}
447 
448 	ddi_soft_state_fini(&pcic_soft_state_p);
449 
450 	return (stat);
451 }
452 
453 int
454 _info(struct modinfo *modinfop)
455 {
456 	return (mod_info(&modlinkage, modinfop));
457 }
458 
459 /*
460  * pcic_getinfo()
461  *	provide instance/device information about driver
462  */
463 /*ARGSUSED*/
464 static int
465 pcic_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
466 {
467 	anp_t *anp;
468 	int error = DDI_SUCCESS;
469 	minor_t minor;
470 
471 	switch (cmd) {
472 	    case DDI_INFO_DEVT2DEVINFO:
473 		minor = getminor((dev_t)arg);
474 		minor &= 0x7f;
475 		if (!(anp = ddi_get_soft_state(pcic_soft_state_p, minor)))
476 			*result = NULL;
477 		else
478 			*result = anp->an_dip;
479 		break;
480 	    case DDI_INFO_DEVT2INSTANCE:
481 		minor = getminor((dev_t)arg);
482 		minor &= 0x7f;
483 		*result = (void *)((long)minor);
484 		break;
485 	    default:
486 		error = DDI_FAILURE;
487 		break;
488 	}
489 	return (error);
490 }
491 
492 static int
493 pcic_probe(dev_info_t *dip)
494 {
495 	int value;
496 	ddi_device_acc_attr_t attr;
497 	ddi_acc_handle_t handle;
498 	uchar_t *index, *data;
499 
500 	if (ddi_dev_is_sid(dip) == DDI_SUCCESS)
501 	    return (DDI_PROBE_DONTCARE);
502 
503 	/*
504 	 * find a PCIC device (any vendor)
505 	 * while there can be up to 4 such devices in
506 	 * a system, we currently only look for 1
507 	 * per probe.  There will be up to 2 chips per
508 	 * instance since they share I/O space
509 	 */
510 	attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
511 	attr.devacc_attr_endian_flags = DDI_NEVERSWAP_ACC;
512 	attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
513 
514 	if (ddi_regs_map_setup(dip, PCIC_ISA_CONTROL_REG_NUM,
515 				(caddr_t *)&index,
516 				PCIC_ISA_CONTROL_REG_OFFSET,
517 				PCIC_ISA_CONTROL_REG_LENGTH,
518 				&attr, &handle) != DDI_SUCCESS)
519 	    return (DDI_PROBE_FAILURE);
520 
521 	data = index + 1;
522 
523 #if defined(PCIC_DEBUG)
524 	if (pcic_debug)
525 		cmn_err(CE_CONT, "pcic_probe: entered\n");
526 	if (pcic_debug)
527 		cmn_err(CE_CONT, "\tindex=%p\n", (void *)index);
528 #endif
529 	ddi_put8(handle, index, PCIC_CHIP_REVISION);
530 	ddi_put8(handle, data, 0);
531 	value = ddi_get8(handle, data);
532 #if defined(PCIC_DEBUG)
533 	if (pcic_debug)
534 		cmn_err(CE_CONT, "\tchip revision register = %x\n", value);
535 #endif
536 	if ((value & PCIC_REV_MASK) >= PCIC_REV_LEVEL_LOW &&
537 	    (value & 0x30) == 0) {
538 		/*
539 		 * we probably have a PCIC chip in the system
540 		 * do a little more checking.  If we find one,
541 		 * reset everything in case of softboot
542 		 */
543 		ddi_put8(handle, index, PCIC_MAPPING_ENABLE);
544 		ddi_put8(handle, data, 0);
545 		value = ddi_get8(handle, data);
546 #if defined(PCIC_DEBUG)
547 		if (pcic_debug)
548 			cmn_err(CE_CONT, "\tzero test = %x\n", value);
549 #endif
550 		/* should read back as zero */
551 		if (value == 0) {
552 			/*
553 			 * we do have one and it is off the bus
554 			 */
555 #if defined(PCIC_DEBUG)
556 			if (pcic_debug)
557 				cmn_err(CE_CONT, "pcic_probe: success\n");
558 #endif
559 			ddi_regs_map_free(&handle);
560 			return (DDI_PROBE_SUCCESS);
561 		}
562 	}
563 #if defined(PCIC_DEBUG)
564 	if (pcic_debug)
565 		cmn_err(CE_CONT, "pcic_probe: failed\n");
566 #endif
567 	ddi_regs_map_free(&handle);
568 	return (DDI_PROBE_FAILURE);
569 }
570 
571 /*
572  * These are just defaults they can also be changed via a property in the
573  * conf file.
574  */
575 static int pci_config_reg_num = PCIC_PCI_CONFIG_REG_NUM;
576 static int pci_control_reg_num = PCIC_PCI_CONTROL_REG_NUM;
577 static int pcic_do_pcmcia_sr = 1;
578 static int pcic_use_cbpwrctl = PCF_CBPWRCTL;
579 
580 /*
581  * enable insertion/removal interrupt for 32bit cards
582  */
583 static int
584 cardbus_enable_cd_intr(dev_info_t *dip)
585 {
586 	ddi_acc_handle_t	iohandle;
587 	caddr_t	ioaddr;
588 	ddi_device_acc_attr_t attr;
589 	attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
590 	attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
591 	attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
592 	(void) ddi_regs_map_setup(dip, 1,
593 				(caddr_t *)&ioaddr,
594 				0,
595 				4096,
596 				&attr, &iohandle);
597 
598 	/* CSC Interrupt: Card detect interrupt on */
599 	ddi_put32(iohandle, (uint32_t *)(ioaddr+CB_STATUS_MASK),
600 		ddi_get32(iohandle,
601 		(uint32_t *)(ioaddr+CB_STATUS_MASK)) | CB_SE_CCDMASK);
602 
603 	ddi_put32(iohandle, (uint32_t *)(ioaddr+CB_STATUS_EVENT),
604 		ddi_get32(iohandle, (uint32_t *)(ioaddr+CB_STATUS_EVENT)));
605 
606 	ddi_regs_map_free(&iohandle);
607 	return (1);
608 }
609 
610 /*
611  * pcic_attach()
612  *	attach the PCIC (Intel 82365SL/CirrusLogic/Toshiba) driver
613  *	to the system.  This is a child of "sysbus" since that is where
614  *	the hardware lives, but it provides services to the "pcmcia"
615  *	nexus driver.  It gives a pointer back via its private data
616  *	structure which contains both the dip and socket services entry
617  *	points
618  */
619 static int
620 pcic_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
621 {
622 	anp_t *pcic_nexus;
623 	pcicdev_t *pcic;
624 	int irqlevel, value;
625 	int pci_cfrn, pci_ctrn;
626 	int i, j, smi, actual;
627 	char *typename;
628 	char bus_type[16] = "(unknown)";
629 	int len = sizeof (bus_type);
630 	ddi_device_acc_attr_t attr;
631 	anp_t *anp = ddi_get_driver_private(dip);
632 	uint_t	pri;
633 
634 #if defined(PCIC_DEBUG)
635 	if (pcic_debug) {
636 		cmn_err(CE_CONT, "pcic_attach: entered\n");
637 	}
638 #endif
639 	switch (cmd) {
640 	case DDI_ATTACH:
641 		break;
642 	case DDI_RESUME:
643 		pcic = anp->an_private;
644 		/*
645 		 * for now, this is a simulated resume.
646 		 * a real one may need different things.
647 		 */
648 		if (pcic != NULL && pcic->pc_flags & PCF_SUSPENDED) {
649 			mutex_enter(&pcic->pc_lock);
650 			/* should probe for new sockets showing up */
651 			pcic_setup_adapter(pcic);
652 			pcic->pc_flags &= ~PCF_SUSPENDED;
653 			mutex_exit(&pcic->pc_lock);
654 			(void) pcmcia_begin_resume(dip);
655 
656 			pcic_do_resume(pcic);
657 #ifdef CARDBUS
658 			cardbus_restore_children(ddi_get_child(dip));
659 #endif
660 
661 			/*
662 			 * for complete implementation need END_RESUME (later)
663 			 */
664 			return (DDI_SUCCESS);
665 
666 		}
667 		return (DDI_SUCCESS);
668 	default:
669 		return (DDI_FAILURE);
670 	}
671 
672 	/*
673 	 * Allocate soft state associated with this instance.
674 	 */
675 	if (ddi_soft_state_zalloc(pcic_soft_state_p,
676 				ddi_get_instance(dip)) != DDI_SUCCESS) {
677 		cmn_err(CE_CONT, "pcic%d: Unable to alloc state\n",
678 			ddi_get_instance(dip));
679 		return (DDI_FAILURE);
680 	}
681 
682 	pcic_nexus = ddi_get_soft_state(pcic_soft_state_p,
683 	    ddi_get_instance(dip));
684 
685 	pcic = kmem_zalloc(sizeof (pcicdev_t), KM_SLEEP);
686 
687 	pcic->dip = dip;
688 	pcic_nexus->an_dip = dip;
689 	pcic_nexus->an_if = &pcic_if_ops;
690 	pcic_nexus->an_private = pcic;
691 	pcic->pc_numpower = sizeof (pcic_power)/sizeof (pcic_power[0]);
692 	pcic->pc_power = pcic_power;
693 
694 	pci_ctrn = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_CANSLEEP,
695 	    "pci-control-reg-number", pci_control_reg_num);
696 	pci_cfrn = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_CANSLEEP,
697 	    "pci-config-reg-number", pci_config_reg_num);
698 
699 	ddi_set_driver_private(dip, pcic_nexus);
700 
701 	/*
702 	 * pcic->pc_irq is really the IPL level we want to run at
703 	 * set the default values here and override from intr spec
704 	 */
705 	pcic->pc_irq = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_CANSLEEP,
706 					"interrupt-priorities", -1);
707 
708 	if (pcic->pc_irq == -1) {
709 		int			actual;
710 		uint_t			pri;
711 		ddi_intr_handle_t	hdl;
712 
713 		/* see if intrspec tells us different */
714 		if (ddi_intr_alloc(dip, &hdl, DDI_INTR_TYPE_FIXED,
715 		    0, 1, &actual, DDI_INTR_ALLOC_NORMAL) == DDI_SUCCESS) {
716 			if (ddi_intr_get_pri(hdl, &pri) == DDI_SUCCESS)
717 				pcic->pc_irq = pri;
718 			else
719 				pcic->pc_irq = LOCK_LEVEL + 1;
720 			(void) ddi_intr_free(hdl);
721 		}
722 	}
723 	pcic_nexus->an_ipl = pcic->pc_irq;
724 
725 	/*
726 	 * Check our parent bus type. We do different things based on which
727 	 * bus we're on.
728 	 */
729 	if (ddi_prop_op(DDI_DEV_T_ANY, ddi_get_parent(dip),
730 				PROP_LEN_AND_VAL_BUF, DDI_PROP_CANSLEEP,
731 				"device_type", (caddr_t)&bus_type[0], &len) !=
732 							DDI_PROP_SUCCESS) {
733 		if (ddi_prop_op(DDI_DEV_T_ANY, ddi_get_parent(dip),
734 				PROP_LEN_AND_VAL_BUF, DDI_PROP_CANSLEEP,
735 				"bus-type", (caddr_t)&bus_type[0], &len) !=
736 							DDI_PROP_SUCCESS) {
737 
738 			cmn_err(CE_CONT,
739 				"pcic%d: can't find parent bus type\n",
740 				ddi_get_instance(dip));
741 
742 			kmem_free(pcic, sizeof (pcicdev_t));
743 			ddi_soft_state_free(pcic_soft_state_p,
744 				ddi_get_instance(dip));
745 			return (DDI_FAILURE);
746 		}
747 	} /* ddi_prop_op("device_type") */
748 
749 	if (strcmp(bus_type, DEVI_PCI_NEXNAME) == 0 ||
750 		strcmp(bus_type, DEVI_PCIEX_NEXNAME) == 0) {
751 		pcic->pc_flags = PCF_PCIBUS;
752 	} else {
753 		cmn_err(CE_WARN, "!pcic%d: non-pci mode (%s) not supported, "
754 			"set BIOS to yenta mode if applicable\n",
755 			ddi_get_instance(dip), bus_type);
756 		kmem_free(pcic, sizeof (pcicdev_t));
757 		ddi_soft_state_free(pcic_soft_state_p,
758 			ddi_get_instance(dip));
759 		return (DDI_FAILURE);
760 	}
761 
762 	if ((pcic->bus_speed = ddi_getprop(DDI_DEV_T_ANY, ddi_get_parent(dip),
763 						DDI_PROP_CANSLEEP,
764 						"clock-frequency", 0)) == 0) {
765 		if (pcic->pc_flags & PCF_PCIBUS)
766 			pcic->bus_speed = PCIC_PCI_DEF_SYSCLK;
767 		else
768 			pcic->bus_speed = PCIC_ISA_DEF_SYSCLK;
769 	} else {
770 		/*
771 		 * OBP can declare the speed in Hz...
772 		 */
773 		if (pcic->bus_speed > 1000000)
774 			pcic->bus_speed /= 1000000;
775 	} /* ddi_prop_op("clock-frequency") */
776 
777 	pcic->pc_io_type = PCIC_IO_TYPE_82365SL; /* default mode */
778 
779 #ifdef	PCIC_DEBUG
780 	if (pcic_debug) {
781 		cmn_err(CE_CONT,
782 			"pcic%d: parent bus type = [%s], speed = %d MHz\n",
783 			ddi_get_instance(dip),
784 			bus_type, pcic->bus_speed);
785 	}
786 #endif
787 
788 	/*
789 	 * The reg properties on a PCI node are different than those
790 	 *	on a non-PCI node. Handle that difference here.
791 	 *	If it turns out to be a CardBus chip, we have even more
792 	 *	differences.
793 	 */
794 	if (pcic->pc_flags & PCF_PCIBUS) {
795 		int class_code;
796 #if defined(__i386) || defined(__amd64)
797 		pcic->pc_base = 0x1000000;
798 		pcic->pc_bound = (uint32_t)~0;
799 		pcic->pc_iobase = 0x1000;
800 		pcic->pc_iobound = 0xefff;
801 #elif defined(__sparc)
802 		pcic->pc_base = 0x0;
803 		pcic->pc_bound = (uint32_t)~0;
804 		pcic->pc_iobase = 0x00000;
805 		pcic->pc_iobound = 0xffff;
806 #endif
807 
808 		/* usually need to get at config space so map first */
809 		attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
810 		attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
811 		attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
812 
813 		if (ddi_regs_map_setup(dip, pci_cfrn,
814 					(caddr_t *)&pcic->cfgaddr,
815 					PCIC_PCI_CONFIG_REG_OFFSET,
816 					PCIC_PCI_CONFIG_REG_LENGTH,
817 					&attr,
818 					&pcic->cfg_handle) !=
819 		    DDI_SUCCESS) {
820 			cmn_err(CE_CONT,
821 				"pcic%d: unable to map config space"
822 				"regs\n",
823 				ddi_get_instance(dip));
824 
825 			kmem_free(pcic, sizeof (pcicdev_t));
826 			return (DDI_FAILURE);
827 		} /* ddi_regs_map_setup */
828 
829 		class_code = ddi_getprop(DDI_DEV_T_ANY, dip,
830 					DDI_PROP_CANSLEEP|DDI_PROP_DONTPASS,
831 					"class-code", -1);
832 #ifdef  PCIC_DEBUG
833 		if (pcic_debug) {
834 			cmn_err(CE_CONT, "pcic_attach class_code=%x\n",
835 			    class_code);
836 		}
837 #endif
838 
839 		switch (class_code) {
840 		case PCIC_PCI_CARDBUS:
841 			pcic->pc_flags |= PCF_CARDBUS;
842 			pcic->pc_io_type = PCIC_IO_TYPE_YENTA;
843 			/*
844 			 * Get access to the adapter registers on the
845 			 * PCI bus.  A 4K memory page
846 			 */
847 #if defined(PCIC_DEBUG)
848 			pcic_err(dip, 8, "Is Cardbus device\n");
849 			if (pcic_debug) {
850 				int nr;
851 				long rs;
852 				(void) ddi_dev_nregs(dip, &nr);
853 				pcic_err(dip, 9, "\tdev, cfgaddr 0x%p,"
854 				    "cfghndl 0x%p nregs %d",
855 				    (void *)pcic->cfgaddr,
856 				    (void *)pcic->cfg_handle, nr);
857 
858 				(void) ddi_dev_regsize(dip,
859 				    PCIC_PCI_CONTROL_REG_NUM, &rs);
860 
861 				pcic_err(dip, 9, "\tsize of reg %d is 0x%x\n",
862 				    PCIC_PCI_CONTROL_REG_NUM, (int)rs);
863 			}
864 #endif
865 			attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
866 			attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
867 			attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
868 
869 			if (ddi_regs_map_setup(dip, pci_ctrn,
870 						(caddr_t *)&pcic->ioaddr,
871 						PCIC_PCI_CONTROL_REG_OFFSET,
872 						PCIC_CB_CONTROL_REG_LENGTH,
873 						&attr, &pcic->handle) !=
874 			    DDI_SUCCESS) {
875 				cmn_err(CE_CONT,
876 					"pcic%d: unable to map PCI regs\n",
877 					ddi_get_instance(dip));
878 				ddi_regs_map_free(&pcic->cfg_handle);
879 				kmem_free(pcic, sizeof (pcicdev_t));
880 				return (DDI_FAILURE);
881 			} /* ddi_regs_map_setup */
882 
883 			/*
884 			 * Find out the chip type - If we're on a PCI bus,
885 			 *	the adapter has that information in the PCI
886 			 *	config space.
887 			 * Note that we call pcic_find_pci_type here since
888 			 *	it needs a valid mapped pcic->handle to
889 			 *	access some of the adapter registers in
890 			 *	some cases.
891 			 */
892 			if (pcic_find_pci_type(pcic) != DDI_SUCCESS) {
893 				ddi_regs_map_free(&pcic->handle);
894 				ddi_regs_map_free(&pcic->cfg_handle);
895 				kmem_free(pcic, sizeof (pcicdev_t));
896 				cmn_err(CE_WARN, "pcic: %s: unsupported "
897 								"bridge\n",
898 							ddi_get_name_addr(dip));
899 				return (DDI_FAILURE);
900 			}
901 			break;
902 
903 		default:
904 		case PCIC_PCI_PCMCIA:
905 			/*
906 			 * Get access to the adapter IO registers on the
907 			 * PCI bus config space.
908 			 */
909 			attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
910 			attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
911 			attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
912 
913 			/*
914 			 * We need a default mapping to the adapter's IO
915 			 *	control register space. For most adapters
916 			 *	that are of class PCIC_PCI_PCMCIA (or of
917 			 *	a default class) the control registers
918 			 *	will be using the 82365-type control/data
919 			 *	format.
920 			 */
921 			if (ddi_regs_map_setup(dip, pci_ctrn,
922 						(caddr_t *)&pcic->ioaddr,
923 						PCIC_PCI_CONTROL_REG_OFFSET,
924 						PCIC_PCI_CONTROL_REG_LENGTH,
925 						&attr,
926 						&pcic->handle) != DDI_SUCCESS) {
927 				cmn_err(CE_CONT,
928 					"pcic%d: unable to map PCI regs\n",
929 					ddi_get_instance(dip));
930 				ddi_regs_map_free(&pcic->cfg_handle);
931 				kmem_free(pcic, sizeof (pcicdev_t));
932 				return (DDI_FAILURE);
933 			} /* ddi_regs_map_setup */
934 
935 			/*
936 			 * Find out the chip type - If we're on a PCI bus,
937 			 *	the adapter has that information in the PCI
938 			 *	config space.
939 			 * Note that we call pcic_find_pci_type here since
940 			 *	it needs a valid mapped pcic->handle to
941 			 *	access some of the adapter registers in
942 			 *	some cases.
943 			 */
944 			if (pcic_find_pci_type(pcic) != DDI_SUCCESS) {
945 				ddi_regs_map_free(&pcic->handle);
946 				ddi_regs_map_free(&pcic->cfg_handle);
947 				kmem_free(pcic, sizeof (pcicdev_t));
948 				cmn_err(CE_WARN, "pcic: %s: unsupported "
949 								"bridge\n",
950 							ddi_get_name_addr(dip));
951 				return (DDI_FAILURE);
952 			}
953 
954 			/*
955 			 * Some PCI-PCMCIA(R2) adapters are Yenta-compliant
956 			 *	for extended registers even though they are
957 			 *	not CardBus adapters. For those adapters,
958 			 *	re-map pcic->handle to be large enough to
959 			 *	encompass the Yenta registers.
960 			 */
961 			switch (pcic->pc_type) {
962 			    case PCIC_TI_PCI1031:
963 				ddi_regs_map_free(&pcic->handle);
964 
965 				if (ddi_regs_map_setup(dip,
966 						PCIC_PCI_CONTROL_REG_NUM,
967 						(caddr_t *)&pcic->ioaddr,
968 						PCIC_PCI_CONTROL_REG_OFFSET,
969 						PCIC_CB_CONTROL_REG_LENGTH,
970 						&attr,
971 						&pcic->handle) != DDI_SUCCESS) {
972 					cmn_err(CE_CONT,
973 						"pcic%d: unable to map "
974 								"PCI regs\n",
975 						ddi_get_instance(dip));
976 					ddi_regs_map_free(&pcic->cfg_handle);
977 					kmem_free(pcic, sizeof (pcicdev_t));
978 					return (DDI_FAILURE);
979 				} /* ddi_regs_map_setup */
980 				break;
981 			    default:
982 				break;
983 			} /* switch (pcic->pc_type) */
984 			break;
985 		} /* switch (class_code) */
986 	} else {
987 		/*
988 		 * We're not on a PCI bus, so assume an ISA bus type
989 		 * register property. Get access to the adapter IO
990 		 * registers on a non-PCI bus.
991 		 */
992 		attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
993 		attr.devacc_attr_endian_flags = DDI_NEVERSWAP_ACC;
994 		attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
995 		pcic->mem_reg_num = PCIC_ISA_MEM_REG_NUM;
996 		pcic->io_reg_num = PCIC_ISA_IO_REG_NUM;
997 
998 		if (ddi_regs_map_setup(dip, PCIC_ISA_CONTROL_REG_NUM,
999 					(caddr_t *)&pcic->ioaddr,
1000 					PCIC_ISA_CONTROL_REG_OFFSET,
1001 					PCIC_ISA_CONTROL_REG_LENGTH,
1002 					&attr,
1003 					&pcic->handle) != DDI_SUCCESS) {
1004 			cmn_err(CE_CONT,
1005 				"pcic%d: unable to map ISA registers\n",
1006 				ddi_get_instance(dip));
1007 
1008 			kmem_free(pcic, sizeof (pcicdev_t));
1009 			return (DDI_FAILURE);
1010 		} /* ddi_regs_map_setup */
1011 
1012 		/* ISA bus is limited to 24-bits, but not first 640K */
1013 		pcic->pc_base = 0xd0000;
1014 		pcic->pc_bound = (uint32_t)~0;
1015 		pcic->pc_iobase = 0x1000;
1016 		pcic->pc_iobound = 0xefff;
1017 	} /* !PCF_PCIBUS */
1018 
1019 #ifdef  PCIC_DEBUG
1020 	if (pcic_debug) {
1021 		cmn_err(CE_CONT, "pcic_attach pc_flags=%x pc_type=%x\n",
1022 		    pcic->pc_flags, pcic->pc_type);
1023 	}
1024 #endif
1025 
1026 	/*
1027 	 * Setup various adapter registers for the PCI case. For the
1028 	 * non-PCI case, find out the chip type.
1029 	 */
1030 	if (pcic->pc_flags & PCF_PCIBUS) {
1031 		int iline;
1032 #if defined(__sparc)
1033 		iline = 0;
1034 #else
1035 		iline = cardbus_validate_iline(dip, pcic->cfg_handle);
1036 #endif
1037 
1038 		/* set flags and socket counts based on chip type */
1039 		switch (pcic->pc_type) {
1040 			uint32_t cfg;
1041 		case PCIC_INTEL_i82092:
1042 			cfg = ddi_get8(pcic->cfg_handle,
1043 					pcic->cfgaddr + PCIC_82092_PCICON);
1044 			/* we can only support 4 Socket version */
1045 			if (cfg & PCIC_82092_4_SOCKETS) {
1046 			    pcic->pc_numsockets = 4;
1047 			    pcic->pc_type = PCIC_INTEL_i82092;
1048 			    if (iline != 0xFF)
1049 				    pcic->pc_intr_mode = PCIC_INTR_MODE_PCI_1;
1050 			    else
1051 				    pcic->pc_intr_mode = PCIC_INTR_MODE_ISA;
1052 			} else {
1053 			    cmn_err(CE_CONT,
1054 				    "pcic%d: Intel 82092 adapter "
1055 				    "in unsupported configuration: 0x%x",
1056 				    ddi_get_instance(pcic->dip), cfg);
1057 			    pcic->pc_numsockets = 0;
1058 			} /* PCIC_82092_4_SOCKETS */
1059 			break;
1060 		case PCIC_CL_PD6730:
1061 		case PCIC_CL_PD6729:
1062 			pcic->pc_intr_mode = PCIC_INTR_MODE_PCI_1;
1063 			cfg = ddi_getprop(DDI_DEV_T_ANY, dip,
1064 						DDI_PROP_CANSLEEP,
1065 						"interrupts", 0);
1066 			/* if not interrupt pin then must use ISA style IRQs */
1067 			if (cfg == 0 || iline == 0xFF)
1068 				pcic->pc_intr_mode = PCIC_INTR_MODE_ISA;
1069 			else {
1070 				/*
1071 				 * we have the option to use PCI interrupts.
1072 				 * this might not be optimal but in some cases
1073 				 * is the only thing possible (sparc case).
1074 				 * we now deterine what is possible.
1075 				 */
1076 				pcic->pc_intr_mode = PCIC_INTR_MODE_PCI_1;
1077 			}
1078 			pcic->pc_numsockets = 2;
1079 			pcic->pc_flags |= PCF_IO_REMAP;
1080 			break;
1081 		case PCIC_TI_PCI1031:
1082 			/* this chip doesn't do CardBus but looks like one */
1083 			pcic->pc_flags &= ~PCF_CARDBUS;
1084 			/* FALLTHROUGH */
1085 		default:
1086 			pcic->pc_flags |= PCF_IO_REMAP;
1087 			/* FALLTHROUGH */
1088 			/* indicate feature even if not supported */
1089 			pcic->pc_flags |= PCF_DMA | PCF_ZV;
1090 			/* Not sure if these apply to all these chips */
1091 			pcic->pc_flags |= (PCF_VPPX|PCF_33VCAP);
1092 			pcic->pc_flags |= pcic_use_cbpwrctl;
1093 
1094 			pcic->pc_numsockets = 1; /* one per function */
1095 			if (iline != 0xFF) {
1096 				uint8_t cfg;
1097 				pcic->pc_intr_mode = PCIC_INTR_MODE_PCI_1;
1098 
1099 				cfg = ddi_get8(pcic->cfg_handle,
1100 					(pcic->cfgaddr + PCIC_BRIDGE_CTL_REG));
1101 				cfg &= (~PCIC_FUN_INT_MOD_ISA);
1102 				ddi_put8(pcic->cfg_handle, (pcic->cfgaddr +
1103 					PCIC_BRIDGE_CTL_REG), cfg);
1104 			}
1105 			else
1106 				pcic->pc_intr_mode = PCIC_INTR_MODE_ISA;
1107 			pcic->pc_io_type = PCIC_IOTYPE_YENTA;
1108 			break;
1109 		}
1110 	} else {
1111 		/*
1112 		 * We're not on a PCI bus so do some more
1113 		 *	checking for adapter type here.
1114 		 * For the non-PCI bus case:
1115 		 * It could be any one of a number of different chips
1116 		 * If we can't determine anything else, it is assumed
1117 		 * to be an Intel 82365SL.  The Cirrus Logic PD6710
1118 		 * has an extension register that provides unique
1119 		 * identification. Toshiba chip isn't detailed as yet.
1120 		 */
1121 
1122 		/* Init the CL id mode */
1123 		pcic_putb(pcic, 0, PCIC_CHIP_INFO, 0);
1124 		value = pcic_getb(pcic, 0, PCIC_CHIP_INFO);
1125 
1126 		/* default to Intel i82365SL and then refine */
1127 		pcic->pc_type = PCIC_I82365SL;
1128 		pcic->pc_chipname = PCIC_TYPE_I82365SL;
1129 		for (value = 0; pcic_ci_funcs[value] != NULL; value++) {
1130 			/* go until one succeeds or none left */
1131 			if (pcic_ci_funcs[value](pcic))
1132 				break;
1133 		}
1134 
1135 		/* any chip specific flags get set here */
1136 		switch (pcic->pc_type) {
1137 		case PCIC_CL_PD6722:
1138 			pcic->pc_flags |= PCF_DMA;
1139 		}
1140 
1141 		for (i = 0; i < PCIC_MAX_SOCKETS; i++) {
1142 			/*
1143 			 * look for total number of sockets.
1144 			 * basically check each possible socket for
1145 			 * presence like in probe
1146 			 */
1147 
1148 			/* turn all windows off */
1149 			pcic_putb(pcic, i, PCIC_MAPPING_ENABLE, 0);
1150 			value = pcic_getb(pcic, i, PCIC_MAPPING_ENABLE);
1151 
1152 			/*
1153 			 * if a zero is read back, then this socket
1154 			 * might be present. It would be except for
1155 			 * some systems that map the secondary PCIC
1156 			 * chip space back to the first.
1157 			 */
1158 			if (value != 0) {
1159 				/* definitely not so skip */
1160 				/* note: this is for Compaq support */
1161 				continue;
1162 			}
1163 
1164 			/* further tests */
1165 			value = pcic_getb(pcic, i, PCIC_CHIP_REVISION) &
1166 				PCIC_REV_MASK;
1167 			if (!(value >= PCIC_REV_LEVEL_LOW &&
1168 				value <= PCIC_REV_LEVEL_HI))
1169 				break;
1170 
1171 			pcic_putb(pcic, i, PCIC_SYSMEM_0_STARTLOW, 0xaa);
1172 			pcic_putb(pcic, i, PCIC_SYSMEM_1_STARTLOW, 0x55);
1173 			value = pcic_getb(pcic, i, PCIC_SYSMEM_0_STARTLOW);
1174 
1175 			j = pcic_getb(pcic, i, PCIC_SYSMEM_1_STARTLOW);
1176 			if (value != 0xaa || j != 0x55)
1177 				break;
1178 
1179 			/*
1180 			 * at this point we know if we have hardware
1181 			 * of some type and not just the bus holding
1182 			 * a pattern for us. We still have to determine
1183 			 * the case where more than 2 sockets are
1184 			 * really the same due to peculiar mappings of
1185 			 * hardware.
1186 			 */
1187 			j = pcic->pc_numsockets++;
1188 			pcic->pc_sockets[j].pcs_flags = 0;
1189 			pcic->pc_sockets[j].pcs_io = pcic->ioaddr;
1190 			pcic->pc_sockets[j].pcs_socket = i;
1191 
1192 			/* put PC Card into RESET, just in case */
1193 			value = pcic_getb(pcic, i, PCIC_INTERRUPT);
1194 			pcic_putb(pcic, i, PCIC_INTERRUPT,
1195 					value & ~PCIC_RESET);
1196 		}
1197 
1198 #if defined(PCIC_DEBUG)
1199 		if (pcic_debug)
1200 			cmn_err(CE_CONT, "num sockets = %d\n",
1201 				pcic->pc_numsockets);
1202 #endif
1203 		if (pcic->pc_numsockets == 0) {
1204 			ddi_regs_map_free(&pcic->handle);
1205 			kmem_free(pcic, sizeof (pcicdev_t));
1206 			return (DDI_FAILURE);
1207 		}
1208 
1209 		/*
1210 		 * need to think this through again in light of
1211 		 * Compaq not following the model that all the
1212 		 * chip vendors recommend.  IBM 755 seems to be
1213 		 * afflicted as well.  Basically, if the vendor
1214 		 * wired things wrong, socket 0 responds for socket 2
1215 		 * accesses, etc.
1216 		 */
1217 		if (pcic->pc_numsockets > 2) {
1218 			int count = pcic->pc_numsockets / 4;
1219 			for (i = 0; i < count; i++) {
1220 				/* put pattern into socket 0 */
1221 				pcic_putb(pcic, i,
1222 						PCIC_SYSMEM_0_STARTLOW, 0x11);
1223 
1224 				/* put pattern into socket 2 */
1225 				pcic_putb(pcic, i + 2,
1226 						PCIC_SYSMEM_0_STARTLOW, 0x33);
1227 
1228 				/* read back socket 0 */
1229 				value = pcic_getb(pcic, i,
1230 						    PCIC_SYSMEM_0_STARTLOW);
1231 
1232 				/* read back chip 1 socket 0 */
1233 				j = pcic_getb(pcic, i + 2,
1234 						PCIC_SYSMEM_0_STARTLOW);
1235 				if (j == value) {
1236 					pcic->pc_numsockets -= 2;
1237 				}
1238 			}
1239 		}
1240 
1241 		smi = 0xff;	/* no more override */
1242 
1243 		if (ddi_getprop(DDI_DEV_T_NONE, dip,
1244 				DDI_PROP_DONTPASS, "need-mult-irq",
1245 				0xffff) != 0xffff)
1246 			pcic->pc_flags |= PCF_MULT_IRQ;
1247 
1248 	} /* !PCF_PCIBUS */
1249 
1250 	/*
1251 	 * some platforms/busses need to have resources setup
1252 	 * this is temporary until a real resource allocator is
1253 	 * implemented.
1254 	 */
1255 
1256 	pcic_init_assigned(dip);
1257 
1258 	typename = pcic->pc_chipname;
1259 
1260 #ifdef	PCIC_DEBUG
1261 	if (pcic_debug) {
1262 		int nregs, nintrs;
1263 
1264 		if (ddi_dev_nregs(dip, &nregs) != DDI_SUCCESS)
1265 			nregs = 0;
1266 
1267 		if (ddi_dev_nintrs(dip, &nintrs) != DDI_SUCCESS)
1268 			nintrs = 0;
1269 
1270 		cmn_err(CE_CONT,
1271 			"pcic%d: %d register sets, %d interrupts\n",
1272 			ddi_get_instance(dip), nregs, nintrs);
1273 
1274 		nintrs = 0;
1275 		while (nregs--) {
1276 			off_t size;
1277 
1278 			if (ddi_dev_regsize(dip, nintrs, &size) ==
1279 			    DDI_SUCCESS) {
1280 				cmn_err(CE_CONT,
1281 					"\tregnum %d size %ld (0x%lx)"
1282 					"bytes",
1283 					nintrs, size, size);
1284 				if (nintrs ==
1285 				    (pcic->pc_io_type == PCIC_IO_TYPE_82365SL ?
1286 				    PCIC_ISA_CONTROL_REG_NUM :
1287 				    PCIC_PCI_CONTROL_REG_NUM))
1288 					cmn_err(CE_CONT,
1289 						" mapped at: 0x%p\n",
1290 						(void *)pcic->ioaddr);
1291 				else
1292 					cmn_err(CE_CONT, "\n");
1293 			} else {
1294 				cmn_err(CE_CONT,
1295 					"\tddi_dev_regsize(rnumber"
1296 					"= %d) returns DDI_FAILURE\n",
1297 					nintrs);
1298 			}
1299 			nintrs++;
1300 		} /* while */
1301 	} /* if (pcic_debug) */
1302 #endif
1303 
1304 	cv_init(&pcic->pm_cv, NULL, CV_DRIVER, NULL);
1305 
1306 	if (!ddi_getprop(DDI_DEV_T_NONE, dip, DDI_PROP_DONTPASS,
1307 						"disable-audio", 0))
1308 		pcic->pc_flags |= PCF_AUDIO;
1309 
1310 	if (ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_CANSLEEP,
1311 	    "disable-cardbus", 0))
1312 		pcic->pc_flags &= ~PCF_CARDBUS;
1313 
1314 	(void) ddi_prop_update_string(DDI_DEV_T_NONE, dip, PCICPROP_CTL,
1315 	    typename);
1316 
1317 	/*
1318 	 * Init all socket SMI levels to 0 (no SMI)
1319 	 */
1320 	for (i = 0; i < PCIC_MAX_SOCKETS; i++) {
1321 	    pcic->pc_sockets[i].pcs_smi = 0;
1322 	    pcic->pc_sockets[i].pcs_debounce_id = 0;
1323 	    pcic->pc_sockets[i].pcs_pcic = pcic;
1324 	}
1325 	pcic->pc_lastreg = -1; /* just to make sure we are in sync */
1326 
1327 	/*
1328 	 * Setup the IRQ handler(s)
1329 	 */
1330 	switch (pcic->pc_intr_mode) {
1331 		int xx;
1332 	case PCIC_INTR_MODE_ISA:
1333 	/*
1334 	 * On a non-PCI bus, we just use whatever SMI IRQ level was
1335 	 *	specified above, and the IO IRQ levels are allocated
1336 	 *	dynamically.
1337 	 */
1338 		for (xx = 15, smi = 0; xx >= 0; xx--) {
1339 			if (PCIC_IRQ(xx) &
1340 			    PCIC_AVAIL_IRQS) {
1341 				smi = pcmcia_get_intr(dip, xx);
1342 				if (smi >= 0)
1343 					break;
1344 			}
1345 		}
1346 #if defined(PCIC_DEBUG)
1347 		if (pcic_debug)
1348 			cmn_err(CE_NOTE, "\tselected IRQ %d as SMI\n", smi);
1349 #endif
1350 		/* init to same so share is easy */
1351 		for (i = 0; i < pcic->pc_numsockets; i++)
1352 			pcic->pc_sockets[i].pcs_smi = smi;
1353 		/* any special handling of IRQ levels */
1354 		if (pcic->pc_flags & PCF_MULT_IRQ) {
1355 			for (i = 2; i < pcic->pc_numsockets; i++) {
1356 				if ((i & 1) == 0) {
1357 					int xx;
1358 					for (xx = 15, smi = 0; xx >= 0; xx--) {
1359 						if (PCIC_IRQ(xx) &
1360 						    PCIC_AVAIL_IRQS) {
1361 							smi =
1362 							    pcmcia_get_intr(dip,
1363 									    xx);
1364 							if (smi >= 0)
1365 								break;
1366 						}
1367 					}
1368 				}
1369 				if (smi >= 0)
1370 					pcic->pc_sockets[i].pcs_smi = smi;
1371 			}
1372 		}
1373 		pcic->pc_intr_htblp = kmem_alloc(pcic->pc_numsockets *
1374 		    sizeof (ddi_intr_handle_t), KM_SLEEP);
1375 		for (i = 0, irqlevel = -1; i < pcic->pc_numsockets; i++) {
1376 			struct intrspec *ispecp;
1377 			struct ddi_parent_private_data *pdp;
1378 
1379 			if (irqlevel == pcic->pc_sockets[i].pcs_smi)
1380 				continue;
1381 			else {
1382 				irqlevel = pcic->pc_sockets[i].pcs_smi;
1383 			}
1384 			/*
1385 			 * now convert the allocated IRQ into an intrspec
1386 			 * and ask our parent to add it.  Don't use
1387 			 * the ddi_add_intr since we don't have a
1388 			 * default intrspec in all cases.
1389 			 *
1390 			 * note: this sort of violates DDI but we don't
1391 			 *	 get hardware intrspecs for many of the devices.
1392 			 *	 at the same time, we know how to allocate them
1393 			 *	 so we do the right thing.
1394 			 */
1395 			if (ddi_intr_alloc(dip, &pcic->pc_intr_htblp[i],
1396 			    DDI_INTR_TYPE_FIXED, 0, 1, &actual,
1397 			    DDI_INTR_ALLOC_NORMAL) != DDI_SUCCESS) {
1398 				cmn_err(CE_WARN, "%s: ddi_intr_alloc failed",
1399 				    ddi_get_name(dip));
1400 				goto isa_exit1;
1401 			}
1402 
1403 			/*
1404 			 * See earlier note:
1405 			 * Since some devices don't have 'intrspec'
1406 			 * we make one up in rootnex.
1407 			 *
1408 			 * However, it is not properly initialized as
1409 			 * the data it needs is present in this driver
1410 			 * and there is no interface to pass that up.
1411 			 * Specially 'irqlevel' is very important and
1412 			 * it is part of pcic struct.
1413 			 *
1414 			 * Set 'intrspec' up here; otherwise adding the
1415 			 * interrupt will fail.
1416 			 */
1417 			pdp = ddi_get_parent_data(dip);
1418 			ispecp = (struct intrspec *)&pdp->par_intr[0];
1419 			ispecp->intrspec_vec = irqlevel;
1420 			ispecp->intrspec_pri = pcic->pc_irq;
1421 
1422 			/* Stay compatible w/ PCMCIA */
1423 			pcic->pc_pri = (ddi_iblock_cookie_t)
1424 			    (uintptr_t)pcic->pc_irq;
1425 			pcic->pc_dcookie.idev_priority =
1426 			    (uintptr_t)pcic->pc_pri;
1427 			pcic->pc_dcookie.idev_vector = (ushort_t)irqlevel;
1428 
1429 			(void) ddi_intr_set_pri(pcic->pc_intr_htblp[i],
1430 			    pcic->pc_irq);
1431 
1432 			if (i == 0) {
1433 				mutex_init(&pcic->intr_lock, NULL, MUTEX_DRIVER,
1434 				    DDI_INTR_PRI(pcic->pc_irq));
1435 				mutex_init(&pcic->pc_lock, NULL, MUTEX_DRIVER,
1436 				    NULL);
1437 			}
1438 
1439 			if (ddi_intr_add_handler(pcic->pc_intr_htblp[i],
1440 			    pcic_intr, (caddr_t)pcic, NULL)) {
1441 				cmn_err(CE_WARN,
1442 				    "%s: ddi_intr_add_handler failed",
1443 				    ddi_get_name(dip));
1444 				goto isa_exit2;
1445 			}
1446 
1447 			if (ddi_intr_enable(pcic->pc_intr_htblp[i])) {
1448 				cmn_err(CE_WARN, "%s: ddi_intr_enable failed",
1449 				    ddi_get_name(dip));
1450 				for (j = i; j < 0; j--)
1451 					(void) ddi_intr_remove_handler(
1452 					    pcic->pc_intr_htblp[j]);
1453 				goto isa_exit2;
1454 			}
1455 		}
1456 		break;
1457 	case PCIC_INTR_MODE_PCI_1:
1458 	case PCIC_INTR_MODE_PCI:
1459 		/*
1460 		 * If we're on a PCI bus, we route all interrupts, both SMI
1461 		 * and IO interrupts, through a single interrupt line.
1462 		 * Assign the SMI IRQ level to the IO IRQ level here.
1463 		 */
1464 		pcic->pc_pci_intr_hdlp = kmem_alloc(sizeof (ddi_intr_handle_t),
1465 		    KM_SLEEP);
1466 		if (ddi_intr_alloc(dip, pcic->pc_pci_intr_hdlp,
1467 		    DDI_INTR_TYPE_FIXED, 0, 1, &actual,
1468 		    DDI_INTR_ALLOC_NORMAL) != DDI_SUCCESS)
1469 			goto pci_exit1;
1470 
1471 		if (ddi_intr_get_pri(pcic->pc_pci_intr_hdlp[0],
1472 		    &pri) != DDI_SUCCESS) {
1473 			(void) ddi_intr_free(pcic->pc_pci_intr_hdlp[0]);
1474 			goto pci_exit1;
1475 		}
1476 
1477 		pcic->pc_pri = (void *)(uintptr_t)pri;
1478 		mutex_init(&pcic->intr_lock, NULL, MUTEX_DRIVER, pcic->pc_pri);
1479 		mutex_init(&pcic->pc_lock, NULL, MUTEX_DRIVER, NULL);
1480 
1481 		if (ddi_intr_add_handler(pcic->pc_pci_intr_hdlp[0],
1482 		    pcic_intr, (caddr_t)pcic, NULL))
1483 			goto pci_exit2;
1484 
1485 		if (ddi_intr_enable(pcic->pc_pci_intr_hdlp[0])) {
1486 			(void) ddi_intr_remove_handler(
1487 			    pcic->pc_pci_intr_hdlp[0]);
1488 			goto pci_exit2;
1489 		}
1490 
1491 		/* Stay compatible w/ PCMCIA */
1492 		pcic->pc_dcookie.idev_priority = (ushort_t)pri;
1493 
1494 		/* init to same (PCI) so share is easy */
1495 		for (i = 0; i < pcic->pc_numsockets; i++)
1496 			pcic->pc_sockets[i].pcs_smi = 0xF; /* any valid */
1497 		break;
1498 	}
1499 
1500 	/*
1501 	 * Setup the adapter hardware to some reasonable defaults.
1502 	 */
1503 	mutex_enter(&pcic->pc_lock);
1504 	/* mark the driver state as attached */
1505 	pcic->pc_flags |= PCF_ATTACHED;
1506 	pcic_setup_adapter(pcic);
1507 
1508 	for (j = 0; j < pcic->pc_numsockets; j++)
1509 		if (ddi_intr_add_softint(dip,
1510 		    &pcic->pc_sockets[j].pcs_cd_softint_hdl,
1511 		    PCIC_SOFTINT_PRI_VAL, pcic_cd_softint,
1512 		    (caddr_t)&pcic->pc_sockets[j]) != DDI_SUCCESS)
1513 			goto pci_exit2;
1514 
1515 #if defined(PCIC_DEBUG)
1516 	if (pcic_debug)
1517 		cmn_err(CE_CONT, "type = %s sockets = %d\n", typename,
1518 						pcic->pc_numsockets);
1519 #endif
1520 
1521 	pcic_nexus->an_iblock = &pcic->pc_pri;
1522 	pcic_nexus->an_idev = &pcic->pc_dcookie;
1523 
1524 	mutex_exit(&pcic->pc_lock);
1525 
1526 #ifdef CARDBUS
1527 	(void) cardbus_enable_cd_intr(dip);
1528 	if (pcic_debug) {
1529 
1530 		cardbus_dump_pci_config(dip);
1531 		cardbus_dump_socket(dip);
1532 	}
1533 
1534 	/*
1535 	 * Give the Cardbus misc module a chance to do it's per-adapter
1536 	 * instance setup. Note that there is no corresponding detach()
1537 	 * call.
1538 	 */
1539 	if (pcic->pc_flags & PCF_CARDBUS)
1540 		if (cardbus_attach(dip, &pcic_cbnexus_ops) != DDI_SUCCESS) {
1541 			cmn_err(CE_CONT,
1542 			    "pcic_attach: cardbus_attach failed\n");
1543 			goto pci_exit2;
1544 		}
1545 #endif
1546 
1547 	/*
1548 	 * Give the PCMCIA misc module a chance to do it's per-adapter
1549 	 *	instance setup.
1550 	 */
1551 	if ((i = pcmcia_attach(dip, pcic_nexus)) != DDI_SUCCESS)
1552 		goto pci_exit2;
1553 
1554 	if (pcic_maxinst == -1) {
1555 		/* This assumes that all instances run at the same IPL. */
1556 		mutex_init(&pcic_deb_mtx, NULL, MUTEX_DRIVER, NULL);
1557 		cv_init(&pcic_deb_cv, NULL, CV_DRIVER, NULL);
1558 		pcic_deb_threadid = thread_create((caddr_t)NULL, 0,
1559 		    pcic_deb_thread, (caddr_t)NULL, 0, &p0, TS_RUN,
1560 		    v.v_maxsyspri - 2);
1561 	}
1562 	pcic_maxinst = max(pcic_maxinst, ddi_get_instance(dip));
1563 	/*
1564 	 * Setup a debounce timeout to do an initial card detect
1565 	 * and enable interrupts.
1566 	 */
1567 	for (j = 0; j < pcic->pc_numsockets; j++) {
1568 		pcic->pc_sockets[j].pcs_debounce_id =
1569 		    pcic_add_debqueue(&pcic->pc_sockets[j],
1570 			drv_usectohz(pcic_debounce_time));
1571 	}
1572 
1573 	return (i);
1574 
1575 isa_exit2:
1576 	mutex_destroy(&pcic->intr_lock);
1577 	mutex_destroy(&pcic->pc_lock);
1578 	for (j = i; j < 0; j--)
1579 		(void) ddi_intr_free(pcic->pc_intr_htblp[j]);
1580 isa_exit1:
1581 	(void) pcmcia_return_intr(dip, pcic->pc_sockets[i].pcs_smi);
1582 	ddi_regs_map_free(&pcic->handle);
1583 	if (pcic->pc_flags & PCF_PCIBUS)
1584 		ddi_regs_map_free(&pcic->cfg_handle);
1585 	kmem_free(pcic->pc_intr_htblp, pcic->pc_numsockets *
1586 	    sizeof (ddi_intr_handle_t));
1587 	kmem_free(pcic, sizeof (pcicdev_t));
1588 		return (DDI_FAILURE);
1589 
1590 pci_exit2:
1591 	mutex_destroy(&pcic->intr_lock);
1592 	mutex_destroy(&pcic->pc_lock);
1593 	(void) ddi_intr_free(pcic->pc_pci_intr_hdlp[0]);
1594 pci_exit1:
1595 	ddi_regs_map_free(&pcic->handle);
1596 	if (pcic->pc_flags & PCF_PCIBUS)
1597 		ddi_regs_map_free(&pcic->cfg_handle);
1598 	kmem_free(pcic->pc_pci_intr_hdlp, sizeof (ddi_intr_handle_t));
1599 	kmem_free(pcic, sizeof (pcicdev_t));
1600 	return (DDI_FAILURE);
1601 }
1602 
1603 /*
1604  * pcic_detach()
1605  *	request to detach from the system
1606  */
1607 static int
1608 pcic_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
1609 {
1610 	anp_t *anp = ddi_get_driver_private(dip);
1611 	pcicdev_t *pcic = anp->an_private;
1612 	int i;
1613 
1614 	switch (cmd) {
1615 	case DDI_DETACH:
1616 		/* don't detach if the nexus still talks to us */
1617 		if (pcic->pc_callback != NULL)
1618 			return (DDI_FAILURE);
1619 
1620 		/* kill off the pm simulation */
1621 		if (pcic->pc_pmtimer)
1622 			(void) untimeout(pcic->pc_pmtimer);
1623 
1624 		/* turn everything off for all sockets and chips */
1625 		for (i = 0; i < pcic->pc_numsockets; i++) {
1626 			if (pcic->pc_sockets[i].pcs_debounce_id)
1627 				pcic_rm_debqueue(
1628 				    pcic->pc_sockets[i].pcs_debounce_id);
1629 			pcic->pc_sockets[i].pcs_debounce_id = 0;
1630 
1631 			pcic_putb(pcic, i, PCIC_MANAGEMENT_INT, 0);
1632 			pcic_putb(pcic, i, PCIC_CARD_DETECT, 0);
1633 			pcic_putb(pcic, i, PCIC_MAPPING_ENABLE, 0);
1634 			/* disable interrupts and put card into RESET */
1635 			pcic_putb(pcic, i, PCIC_INTERRUPT, 0);
1636 		}
1637 		(void) ddi_intr_disable(pcic->pc_pci_intr_hdlp[0]);
1638 		(void) ddi_intr_remove_handler(pcic->pc_pci_intr_hdlp[0]);
1639 		(void) ddi_intr_free(pcic->pc_pci_intr_hdlp[0]);
1640 		kmem_free(pcic->pc_pci_intr_hdlp, sizeof (ddi_intr_handle_t));
1641 		pcic->pc_flags = 0;
1642 		mutex_destroy(&pcic->pc_lock);
1643 		mutex_destroy(&pcic->intr_lock);
1644 		cv_destroy(&pcic->pm_cv);
1645 		if (pcic->pc_flags & PCF_PCIBUS)
1646 		    ddi_regs_map_free(&pcic->cfg_handle);
1647 		if (pcic->handle)
1648 		    ddi_regs_map_free(&pcic->handle);
1649 		kmem_free(pcic, sizeof (pcicdev_t));
1650 		ddi_soft_state_free(pcic_soft_state_p, ddi_get_instance(dip));
1651 		return (DDI_SUCCESS);
1652 
1653 	case DDI_SUSPEND:
1654 	case DDI_PM_SUSPEND:
1655 		/*
1656 		 * we got a suspend event (either real or imagined)
1657 		 * so notify the nexus proper that all existing cards
1658 		 * should go away.
1659 		 */
1660 		mutex_enter(&pcic->pc_lock);
1661 #ifdef CARDBUS
1662 		if (pcic->pc_flags & PCF_CARDBUS) {
1663 			for (i = 0; i < pcic->pc_numsockets; i++) {
1664 				if ((pcic->pc_sockets[i].pcs_flags &
1665 				    (PCS_CARD_PRESENT|PCS_CARD_ISCARDBUS)) ==
1666 				    (PCS_CARD_PRESENT|PCS_CARD_ISCARDBUS)) {
1667 
1668 					pcmcia_cb_suspended(
1669 						pcic->pc_sockets[i].pcs_socket);
1670 				}
1671 			}
1672 
1673 			cardbus_save_children(ddi_get_child(dip));
1674 		}
1675 #endif
1676 		/* turn everything off for all sockets and chips */
1677 		for (i = 0; i < pcic->pc_numsockets; i++) {
1678 			if (pcic->pc_sockets[i].pcs_debounce_id)
1679 				pcic_rm_debqueue(
1680 				    pcic->pc_sockets[i].pcs_debounce_id);
1681 			pcic->pc_sockets[i].pcs_debounce_id = 0;
1682 
1683 			pcic_putb(pcic, i, PCIC_MANAGEMENT_INT, 0);
1684 			pcic_putb(pcic, i, PCIC_CARD_DETECT, 0);
1685 			pcic_putb(pcic, i, PCIC_MAPPING_ENABLE, 0);
1686 			/* disable interrupts and put card into RESET */
1687 			pcic_putb(pcic, i, PCIC_INTERRUPT, 0);
1688 			pcic_putb(pcic, i, PCIC_POWER_CONTROL, 0);
1689 			if (pcic->pc_flags & PCF_CBPWRCTL)
1690 				pcic_putcb(pcic, CB_CONTROL, 0);
1691 
1692 			if (pcic->pc_sockets[i].pcs_flags & PCS_CARD_PRESENT) {
1693 				pcic->pc_sockets[i].pcs_flags = PCS_STARTING;
1694 				/*
1695 				 * Because we are half way through a save
1696 				 * all this does is schedule a removal event
1697 				 * to cs for when the system comes back.
1698 				 * This doesn't actually matter.
1699 				 */
1700 				if (!pcic_do_pcmcia_sr && pcic_do_removal &&
1701 				    pcic->pc_callback) {
1702 					PC_CALLBACK(pcic->dip, pcic->pc_cb_arg,
1703 					    PCE_CARD_REMOVAL,
1704 					    pcic->pc_sockets[i].pcs_socket);
1705 				}
1706 			}
1707 		}
1708 
1709 		pcic->pc_flags |= PCF_SUSPENDED;
1710 		mutex_exit(&pcic->pc_lock);
1711 
1712 		/*
1713 		 * when true power management exists, save the adapter
1714 		 * state here to enable a recovery.  For the emulation
1715 		 * condition, the state is gone
1716 		 */
1717 		return (DDI_SUCCESS);
1718 
1719 	default:
1720 		return (EINVAL);
1721 	}
1722 }
1723 
1724 static uint32_t pcic_tisysctl_onbits = ((1<<27) | (1<<15) | (1<<14));
1725 static uint32_t pcic_tisysctl_offbits = 0;
1726 static uint32_t pcic_default_latency = 0x40;
1727 
1728 static void
1729 pcic_setup_adapter(pcicdev_t *pcic)
1730 {
1731 	int i;
1732 	int value, flags;
1733 
1734 	if (pcic->pc_flags & PCF_PCIBUS) {
1735 		/*
1736 		 * all PCI-to-PCMCIA bus bridges need memory and I/O enabled
1737 		 */
1738 		flags = (PCIC_ENABLE_IO | PCIC_ENABLE_MEM);
1739 		pcic_iomem_pci_ctl(pcic->cfg_handle, pcic->cfgaddr, flags);
1740 	}
1741 	/* enable each socket */
1742 	for (i = 0; i < pcic->pc_numsockets; i++) {
1743 		pcic->pc_sockets[i].pcs_flags = 0;
1744 		/* find out the socket capabilities (I/O vs memory) */
1745 		value = pcic_getb(pcic, i,
1746 					PCIC_CHIP_REVISION) & PCIC_REV_ID_MASK;
1747 		if (value == PCIC_REV_ID_IO || value == PCIC_REV_ID_BOTH)
1748 			pcic->pc_sockets[i].pcs_flags |= PCS_SOCKET_IO;
1749 
1750 		/* disable all windows just in case */
1751 		pcic_putb(pcic, i, PCIC_MAPPING_ENABLE, 0);
1752 
1753 		switch (pcic->pc_type) {
1754 			uint32_t cfg32;
1755 			uint16_t cfg16;
1756 			uint8_t cfg;
1757 
1758 		    /* enable extended registers for Vadem */
1759 		    case PCIC_VADEM_VG469:
1760 		    case PCIC_VADEM:
1761 
1762 			/* enable card status change interrupt for socket */
1763 			break;
1764 
1765 		    case PCIC_I82365SL:
1766 			break;
1767 
1768 		    case PCIC_CL_PD6710:
1769 			pcic_putb(pcic, 0, PCIC_MISC_CTL_2, PCIC_LED_ENABLE);
1770 			break;
1771 
1772 			/*
1773 			 * On the CL_6730, we need to set up the interrupt
1774 			 * signalling mode (PCI mode) and set the SMI and
1775 			 * IRQ interrupt lines to PCI/level-mode.
1776 			 */
1777 		    case PCIC_CL_PD6730:
1778 			switch (pcic->pc_intr_mode) {
1779 			case PCIC_INTR_MODE_PCI_1:
1780 				clext_reg_write(pcic, i, PCIC_CLEXT_MISC_CTL_3,
1781 						((clext_reg_read(pcic, i,
1782 						PCIC_CLEXT_MISC_CTL_3) &
1783 						~PCIC_CLEXT_INT_PCI) |
1784 						PCIC_CLEXT_INT_PCI));
1785 				clext_reg_write(pcic, i, PCIC_CLEXT_EXT_CTL_1,
1786 						(PCIC_CLEXT_IRQ_LVL_MODE |
1787 						PCIC_CLEXT_SMI_LVL_MODE));
1788 				cfg = PCIC_CL_LP_DYN_MODE;
1789 				pcic_putb(pcic, i, PCIC_MISC_CTL_2, cfg);
1790 				break;
1791 			case PCIC_INTR_MODE_ISA:
1792 				break;
1793 			}
1794 			break;
1795 			/*
1796 			 * On the CL_6729, we set the SMI and IRQ interrupt
1797 			 *	lines to PCI/level-mode. as well as program the
1798 			 *	correct clock speed divider bit.
1799 			 */
1800 		    case PCIC_CL_PD6729:
1801 			switch (pcic->pc_intr_mode) {
1802 			case PCIC_INTR_MODE_PCI_1:
1803 				clext_reg_write(pcic, i, PCIC_CLEXT_EXT_CTL_1,
1804 						(PCIC_CLEXT_IRQ_LVL_MODE |
1805 						PCIC_CLEXT_SMI_LVL_MODE));
1806 
1807 				break;
1808 			case PCIC_INTR_MODE_ISA:
1809 				break;
1810 			}
1811 			if (pcic->bus_speed > PCIC_PCI_25MHZ && i == 0) {
1812 				cfg = 0;
1813 				cfg |= PCIC_CL_TIMER_CLK_DIV;
1814 				pcic_putb(pcic, i, PCIC_MISC_CTL_2, cfg);
1815 			}
1816 			break;
1817 		    case PCIC_INTEL_i82092:
1818 			cfg = PCIC_82092_EN_TIMING;
1819 			if (pcic->bus_speed < PCIC_SYSCLK_33MHZ)
1820 			    cfg |= PCIC_82092_PCICLK_25MHZ;
1821 			ddi_put8(pcic->cfg_handle, pcic->cfgaddr +
1822 						PCIC_82092_PCICON, cfg);
1823 			break;
1824 		    case PCIC_TI_PCI1130:
1825 		    case PCIC_TI_PCI1131:
1826 		    case PCIC_TI_PCI1250:
1827 		    case PCIC_TI_PCI1031:
1828 			cfg = ddi_get8(pcic->cfg_handle,
1829 					pcic->cfgaddr + PCIC_DEVCTL_REG);
1830 			cfg &= ~PCIC_DEVCTL_INTR_MASK;
1831 			switch (pcic->pc_intr_mode) {
1832 			case PCIC_INTR_MODE_ISA:
1833 				cfg |= PCIC_DEVCTL_INTR_ISA;
1834 				break;
1835 			}
1836 #ifdef PCIC_DEBUG
1837 			if (pcic_debug) {
1838 				cmn_err(CE_CONT, "pcic_setup_adapter: "
1839 				    "write reg 0x%x=%x \n",
1840 				    PCIC_DEVCTL_REG, cfg);
1841 			}
1842 #endif
1843 			ddi_put8(pcic->cfg_handle,
1844 					pcic->cfgaddr + PCIC_DEVCTL_REG,
1845 					cfg);
1846 
1847 			cfg = ddi_get8(pcic->cfg_handle,
1848 					pcic->cfgaddr + PCIC_CRDCTL_REG);
1849 			cfg &= ~(PCIC_CRDCTL_PCIINTR|PCIC_CRDCTL_PCICSC|
1850 					PCIC_CRDCTL_PCIFUNC);
1851 			switch (pcic->pc_intr_mode) {
1852 			case PCIC_INTR_MODE_PCI_1:
1853 				cfg |= PCIC_CRDCTL_PCIINTR |
1854 					PCIC_CRDCTL_PCICSC |
1855 					PCIC_CRDCTL_PCIFUNC;
1856 				pcic->pc_flags |= PCF_USE_SMI;
1857 				break;
1858 			}
1859 #ifdef PCIC_DEBUG
1860 			if (pcic_debug) {
1861 				cmn_err(CE_CONT, "pcic_setup_adapter: "
1862 				    " write reg 0x%x=%x \n",
1863 				    PCIC_CRDCTL_REG, cfg);
1864 			}
1865 #endif
1866 			ddi_put8(pcic->cfg_handle,
1867 					pcic->cfgaddr + PCIC_CRDCTL_REG,
1868 					cfg);
1869 			break;
1870 		    case PCIC_TI_PCI1221:
1871 		    case PCIC_TI_PCI1225:
1872 			cfg = ddi_get8(pcic->cfg_handle,
1873 			    pcic->cfgaddr + PCIC_DEVCTL_REG);
1874 			cfg |= (PCIC_DEVCTL_INTR_DFLT | PCIC_DEVCTL_3VCAPABLE);
1875 #ifdef PCIC_DEBUG
1876 			if (pcic_debug) {
1877 				cmn_err(CE_CONT, "pcic_setup_adapter: "
1878 				    " write reg 0x%x=%x \n",
1879 				    PCIC_DEVCTL_REG, cfg);
1880 			}
1881 #endif
1882 			ddi_put8(pcic->cfg_handle,
1883 			    pcic->cfgaddr + PCIC_DEVCTL_REG, cfg);
1884 
1885 			cfg = ddi_get8(pcic->cfg_handle,
1886 			    pcic->cfgaddr + PCIC_DIAG_REG);
1887 			if (pcic->pc_type == PCIC_TI_PCI1225) {
1888 				cfg |= (PCIC_DIAG_CSC | PCIC_DIAG_ASYNC);
1889 			} else {
1890 				cfg |= PCIC_DIAG_ASYNC;
1891 			}
1892 			pcic->pc_flags |= PCF_USE_SMI;
1893 #ifdef PCIC_DEBUG
1894 			if (pcic_debug) {
1895 				cmn_err(CE_CONT, "pcic_setup_adapter: "
1896 				    " write reg 0x%x=%x \n",
1897 				    PCIC_DIAG_REG, cfg);
1898 			}
1899 #endif
1900 			ddi_put8(pcic->cfg_handle,
1901 			    pcic->cfgaddr + PCIC_DIAG_REG, cfg);
1902 			break;
1903 		    case PCIC_TI_PCI1520:
1904 		    case PCIC_TI_PCI1510:
1905 		    case PCIC_TI_VENDOR:
1906 			if (pcic->pc_intr_mode == PCIC_INTR_MODE_ISA) {
1907 				cfg = ddi_get8(pcic->cfg_handle,
1908 					pcic->cfgaddr + PCIC_BRIDGE_CTL_REG);
1909 				cfg |= PCIC_FUN_INT_MOD_ISA;
1910 				ddi_put8(pcic->cfg_handle,
1911 					pcic->cfgaddr + PCIC_BRIDGE_CTL_REG,
1912 					cfg);
1913 			}
1914 			cfg = ddi_get8(pcic->cfg_handle,
1915 					pcic->cfgaddr + PCIC_DEVCTL_REG);
1916 			cfg &= ~PCIC_DEVCTL_INTR_MASK;
1917 			if (pcic->pc_intr_mode == PCIC_INTR_MODE_ISA)
1918 				cfg |= PCIC_DEVCTL_INTR_ISA;
1919 			ddi_put8(pcic->cfg_handle,
1920 					pcic->cfgaddr + PCIC_DEVCTL_REG,
1921 					cfg);
1922 
1923 			/* tie INTA and INTB together */
1924 			cfg = ddi_get8(pcic->cfg_handle,
1925 				(pcic->cfgaddr + PCIC_SYSCTL_REG + 3));
1926 			cfg |= PCIC_SYSCTL_INTRTIE;
1927 			ddi_put8(pcic->cfg_handle, (pcic->cfgaddr +
1928 				PCIC_SYSCTL_REG + 3), cfg);
1929 			cfg = ddi_get8(pcic->cfg_handle,
1930 			    pcic->cfgaddr + PCIC_DIAG_REG);
1931 			cfg |= (PCIC_DIAG_CSC | PCIC_DIAG_ASYNC);
1932 			ddi_put8(pcic->cfg_handle,
1933 			    pcic->cfgaddr + PCIC_DIAG_REG, cfg);
1934 			break;
1935 		    case PCIC_TI_PCI1410:
1936 			cfg = ddi_get8(pcic->cfg_handle,
1937 			    pcic->cfgaddr + PCIC_DIAG_REG);
1938 			cfg |= (PCIC_DIAG_CSC | PCIC_DIAG_ASYNC);
1939 			ddi_put8(pcic->cfg_handle,
1940 			    pcic->cfgaddr + PCIC_DIAG_REG, cfg);
1941 			break;
1942 		    case PCIC_TOSHIBA_TOPIC100:
1943 		    case PCIC_TOSHIBA_TOPIC95:
1944 		    case PCIC_TOSHIBA_VENDOR:
1945 			cfg = ddi_get8(pcic->cfg_handle, pcic->cfgaddr +
1946 				PCIC_TOSHIBA_SLOT_CTL_REG);
1947 			cfg |= (PCIC_TOSHIBA_SCR_SLOTON |
1948 				PCIC_TOSHIBA_SCR_SLOTEN);
1949 			cfg &= (~PCIC_TOSHIBA_SCR_PRT_MASK);
1950 			cfg |= PCIC_TOSHIBA_SCR_PRT_3E2;
1951 			ddi_put8(pcic->cfg_handle, pcic->cfgaddr +
1952 				PCIC_TOSHIBA_SLOT_CTL_REG, cfg);
1953 			cfg = ddi_get8(pcic->cfg_handle, pcic->cfgaddr +
1954 				PCIC_TOSHIBA_INTR_CTL_REG);
1955 			switch (pcic->pc_intr_mode) {
1956 			case PCIC_INTR_MODE_ISA:
1957 				cfg &= ~PCIC_TOSHIBA_ICR_SRC;
1958 				ddi_put8(pcic->cfg_handle,
1959 					pcic->cfgaddr +
1960 					PCIC_TOSHIBA_INTR_CTL_REG, cfg);
1961 
1962 				cfg = ddi_get8(pcic->cfg_handle,
1963 					pcic->cfgaddr + PCIC_BRIDGE_CTL_REG);
1964 				cfg |= PCIC_FUN_INT_MOD_ISA;
1965 				ddi_put8(pcic->cfg_handle,
1966 					pcic->cfgaddr + PCIC_BRIDGE_CTL_REG,
1967 					cfg);
1968 				break;
1969 			case PCIC_INTR_MODE_PCI_1:
1970 				cfg |= PCIC_TOSHIBA_ICR_SRC;
1971 				cfg &= (~PCIC_TOSHIBA_ICR_PIN_MASK);
1972 				cfg |= PCIC_TOSHIBA_ICR_PIN_INTA;
1973 				ddi_put8(pcic->cfg_handle,
1974 					pcic->cfgaddr +
1975 					PCIC_TOSHIBA_INTR_CTL_REG, cfg);
1976 				break;
1977 			}
1978 			break;
1979 		    case PCIC_O2MICRO_VENDOR:
1980 			cfg32 = ddi_get32(pcic->cfg_handle,
1981 				(uint32_t *)(pcic->cfgaddr +
1982 				PCIC_O2MICRO_MISC_CTL));
1983 			switch (pcic->pc_intr_mode) {
1984 			case PCIC_INTR_MODE_ISA:
1985 				cfg32 |= (PCIC_O2MICRO_ISA_LEGACY |
1986 					PCIC_O2MICRO_INT_MOD_PCI);
1987 				ddi_put32(pcic->cfg_handle,
1988 					(uint32_t *)(pcic->cfgaddr +
1989 					PCIC_O2MICRO_MISC_CTL),
1990 					cfg32);
1991 				cfg = ddi_get8(pcic->cfg_handle,
1992 					pcic->cfgaddr + PCIC_BRIDGE_CTL_REG);
1993 				cfg |= PCIC_FUN_INT_MOD_ISA;
1994 				ddi_put8(pcic->cfg_handle,
1995 					pcic->cfgaddr + PCIC_BRIDGE_CTL_REG,
1996 					cfg);
1997 				break;
1998 			case PCIC_INTR_MODE_PCI_1:
1999 				cfg32 &= ~PCIC_O2MICRO_ISA_LEGACY;
2000 				cfg32 |= PCIC_O2MICRO_INT_MOD_PCI;
2001 				ddi_put32(pcic->cfg_handle,
2002 					(uint32_t *)(pcic->cfgaddr +
2003 					PCIC_O2MICRO_MISC_CTL),
2004 					cfg32);
2005 				break;
2006 			}
2007 			break;
2008 		    case PCIC_RICOH_VENDOR:
2009 			if (pcic->pc_intr_mode == PCIC_INTR_MODE_ISA) {
2010 				cfg16 = ddi_get16(pcic->cfg_handle,
2011 					(uint16_t *)(pcic->cfgaddr +
2012 					PCIC_RICOH_MISC_CTL_2));
2013 				cfg16 |= (PCIC_RICOH_CSC_INT_MOD |
2014 					PCIC_RICOH_FUN_INT_MOD);
2015 				ddi_put16(pcic->cfg_handle,
2016 					(uint16_t *)(pcic->cfgaddr +
2017 					PCIC_RICOH_MISC_CTL_2),
2018 					cfg16);
2019 
2020 				cfg16 = ddi_get16(pcic->cfg_handle,
2021 					(uint16_t *)(pcic->cfgaddr +
2022 					PCIC_RICOH_MISC_CTL));
2023 				cfg16 |= PCIC_RICOH_SIRQ_EN;
2024 				ddi_put16(pcic->cfg_handle,
2025 					(uint16_t *)(pcic->cfgaddr +
2026 					PCIC_RICOH_MISC_CTL),
2027 					cfg16);
2028 
2029 				cfg = ddi_get8(pcic->cfg_handle,
2030 					pcic->cfgaddr + PCIC_BRIDGE_CTL_REG);
2031 				cfg |= PCIC_FUN_INT_MOD_ISA;
2032 				ddi_put8(pcic->cfg_handle,
2033 					pcic->cfgaddr + PCIC_BRIDGE_CTL_REG,
2034 					cfg);
2035 			}
2036 			break;
2037 		    default:
2038 			break;
2039 		} /* switch */
2040 
2041 		/*
2042 		 * The default value in the EEPROM (loaded on reset) for
2043 		 * MFUNC0/MFUNC1 may be incorrect. Here we make sure that
2044 		 * MFUNC0 is connected to INTA, and MFUNC1 is connected to
2045 		 * INTB. This applies to all TI CardBus controllers.
2046 		 */
2047 		if ((pcic->pc_type >> 16) == PCIC_TI_VENDORID &&
2048 			pcic->pc_intr_mode == PCIC_INTR_MODE_PCI_1) {
2049 			value = ddi_get32(pcic->cfg_handle,
2050 			    (uint32_t *)(pcic->cfgaddr + PCIC_MFROUTE_REG));
2051 			value &= ~0xff;
2052 			ddi_put32(pcic->cfg_handle, (uint32_t *)(pcic->cfgaddr +
2053 			    PCIC_MFROUTE_REG), value|PCIC_TI_MFUNC_SEL);
2054 		}
2055 
2056 		/* setup general card status change interrupt */
2057 		switch (pcic->pc_type) {
2058 			case PCIC_TI_PCI1225:
2059 			case PCIC_TI_PCI1221:
2060 			case PCIC_TI_PCI1031:
2061 			case PCIC_TI_PCI1520:
2062 			case PCIC_TI_PCI1410:
2063 				pcic_putb(pcic, i, PCIC_MANAGEMENT_INT,
2064 				    PCIC_CHANGE_DEFAULT);
2065 				break;
2066 			default:
2067 				if (pcic->pc_intr_mode ==
2068 					PCIC_INTR_MODE_PCI_1) {
2069 					pcic_putb(pcic, i, PCIC_MANAGEMENT_INT,
2070 						PCIC_CHANGE_DEFAULT);
2071 					break;
2072 				} else {
2073 					pcic_putb(pcic, i, PCIC_MANAGEMENT_INT,
2074 						PCIC_CHANGE_DEFAULT |
2075 					(pcic->pc_sockets[i].pcs_smi << 4));
2076 					break;
2077 				}
2078 		}
2079 
2080 		pcic->pc_flags |= PCF_INTRENAB;
2081 
2082 		/* take card out of RESET */
2083 		pcic_putb(pcic, i, PCIC_INTERRUPT, PCIC_RESET);
2084 		/* turn power off and let CS do this */
2085 		pcic_putb(pcic, i, PCIC_POWER_CONTROL, 0);
2086 
2087 		/* final chip specific initialization */
2088 		switch (pcic->pc_type) {
2089 		    case PCIC_VADEM:
2090 			pcic_putb(pcic, i, PCIC_VG_CONTROL,
2091 					PCIC_VC_DELAYENABLE);
2092 			pcic->pc_flags |= PCF_DEBOUNCE;
2093 			/* FALLTHROUGH */
2094 		    case PCIC_I82365SL:
2095 			pcic_putb(pcic, i, PCIC_GLOBAL_CONTROL,
2096 					PCIC_GC_CSC_WRITE);
2097 			/* clear any pending interrupts */
2098 			value = pcic_getb(pcic, i, PCIC_CARD_STATUS_CHANGE);
2099 			pcic_putb(pcic, i, PCIC_CARD_STATUS_CHANGE, value);
2100 			break;
2101 		    /* The 82092 uses PCI config space to enable interrupts */
2102 		    case PCIC_INTEL_i82092:
2103 			pcic_82092_smiirq_ctl(pcic, i, PCIC_82092_CTL_SMI,
2104 							PCIC_82092_INT_ENABLE);
2105 			break;
2106 		    case PCIC_CL_PD6729:
2107 			if (pcic->bus_speed >= PCIC_PCI_DEF_SYSCLK && i == 0) {
2108 				value = pcic_getb(pcic, i, PCIC_MISC_CTL_2);
2109 				pcic_putb(pcic, i, PCIC_MISC_CTL_2,
2110 						value | PCIC_CL_TIMER_CLK_DIV);
2111 			}
2112 			break;
2113 		} /* switch */
2114 
2115 #if defined(PCIC_DEBUG)
2116 		if (pcic_debug)
2117 			cmn_err(CE_CONT,
2118 				"socket %d value=%x, flags = %x (%s)\n",
2119 				i, value, pcic->pc_sockets[i].pcs_flags,
2120 				(pcic->pc_sockets[i].pcs_flags &
2121 					PCS_CARD_PRESENT) ?
2122 						"card present" : "no card");
2123 #endif
2124 	}
2125 }
2126 
2127 /*
2128  * pcic_intr(caddr_t, caddr_t)
2129  *	interrupt handler for the PCIC style adapter
2130  *	handles all basic interrupts and also checks
2131  *	for status changes and notifies the nexus if
2132  *	necessary
2133  *
2134  *	On PCI bus adapters, also handles all card
2135  *	IO interrupts.
2136  */
2137 /*ARGSUSED*/
2138 uint32_t
2139 pcic_intr(caddr_t arg1, caddr_t arg2)
2140 {
2141 	pcicdev_t *pcic = (pcicdev_t *)arg1;
2142 	int value = 0, i, ret = DDI_INTR_UNCLAIMED;
2143 	uint8_t status;
2144 	uint_t io_ints;
2145 
2146 #if defined(PCIC_DEBUG)
2147 	pcic_err(pcic->dip, 0xf,
2148 		"pcic_intr: enter pc_flags=0x%x PCF_ATTACHED=0x%x"
2149 		" pc_numsockets=%d \n",
2150 		pcic->pc_flags, PCF_ATTACHED, pcic->pc_numsockets);
2151 #endif
2152 
2153 	if (!(pcic->pc_flags & PCF_ATTACHED))
2154 	    return (DDI_INTR_UNCLAIMED);
2155 
2156 	mutex_enter(&pcic->intr_lock);
2157 
2158 	if (pcic->pc_flags & PCF_SUSPENDED) {
2159 		mutex_exit(&pcic->intr_lock);
2160 		return (ret);
2161 	}
2162 
2163 	/*
2164 	 * need to change to only ACK and touch the slot that
2165 	 * actually caused the interrupt.  Currently everything
2166 	 * is acked
2167 	 *
2168 	 * we need to look at all known sockets to determine
2169 	 * what might have happened, so step through the list
2170 	 * of them
2171 	 */
2172 
2173 	/*
2174 	 * Set the bitmask for IO interrupts to initially include all sockets
2175 	 */
2176 	io_ints = (1 << pcic->pc_numsockets) - 1;
2177 
2178 	for (i = 0; i < pcic->pc_numsockets; i++) {
2179 		int card_type;
2180 		pcic_socket_t *sockp;
2181 		int value_cb = 0;
2182 
2183 		sockp = &pcic->pc_sockets[i];
2184 		/* get the socket's I/O addresses */
2185 
2186 		if (sockp->pcs_flags & PCS_WAITING) {
2187 			io_ints &= ~(1 << i);
2188 			continue;
2189 		}
2190 
2191 		if (sockp->pcs_flags & PCS_CARD_IO)
2192 			card_type = IF_IO;
2193 		else
2194 			card_type = IF_MEMORY;
2195 
2196 		if (pcic->pc_io_type == PCIC_IO_TYPE_YENTA)
2197 			value_cb = pcic_getcb(pcic, CB_STATUS_EVENT);
2198 
2199 		value = pcic_change(pcic, i);
2200 
2201 		if ((value != 0) || (value_cb != 0)) {
2202 			int x = pcic->pc_cb_arg;
2203 
2204 			ret = DDI_INTR_CLAIMED;
2205 
2206 #if defined(PCIC_DEBUG)
2207 			pcic_err(pcic->dip, 0x9,
2208 			    "card_type = %d, value_cb = 0x%x\n",
2209 			    card_type,
2210 			    value_cb ? value_cb :
2211 				pcic_getcb(pcic, CB_STATUS_EVENT));
2212 			if (pcic_debug)
2213 				cmn_err(CE_CONT,
2214 					"\tchange on socket %d (%x)\n", i,
2215 					value);
2216 #endif
2217 			/* find out what happened */
2218 			status = pcic_getb(pcic, i, PCIC_INTERFACE_STATUS);
2219 
2220 			/* acknowledge the interrupt */
2221 			if (value_cb)
2222 				pcic_putcb(pcic, CB_STATUS_EVENT, value_cb);
2223 
2224 			if (value)
2225 				pcic_putb(pcic, i, PCIC_CARD_STATUS_CHANGE,
2226 				    value);
2227 
2228 			if (pcic->pc_callback == NULL) {
2229 				/* if not callback handler, nothing to do */
2230 				continue;
2231 			}
2232 
2233 			/* Card Detect */
2234 			if (value & PCIC_CD_DETECT ||
2235 			    value_cb & CB_PS_CCDMASK) {
2236 				uint8_t irq;
2237 #if defined(PCIC_DEBUG)
2238 				if (pcic_debug)
2239 					cmn_err(CE_CONT,
2240 						"\tcd_detect: status=%x,"
2241 						" flags=%x\n",
2242 						status, sockp->pcs_flags);
2243 #else
2244 #ifdef lint
2245 				if (status == 0)
2246 				    status++;
2247 #endif
2248 #endif
2249 				/*
2250 				 * Turn off all interrupts for this socket here.
2251 				 */
2252 				irq = pcic_getb(pcic, sockp->pcs_socket,
2253 				    PCIC_MANAGEMENT_INT);
2254 				irq &= ~PCIC_CHANGE_MASK;
2255 				pcic_putb(pcic, sockp->pcs_socket,
2256 				    PCIC_MANAGEMENT_INT, irq);
2257 
2258 				pcic_putcb(pcic, CB_STATUS_MASK, 0x0);
2259 
2260 				/*
2261 				 * Put the socket in debouncing state so that
2262 				 * the leaf driver won't receive interrupts.
2263 				 * Crucial for handling surprise-removal.
2264 				 */
2265 				sockp->pcs_flags |= PCS_DEBOUNCING;
2266 
2267 				if (!sockp->pcs_cd_softint_flg) {
2268 					sockp->pcs_cd_softint_flg = 1;
2269 					(void) ddi_intr_trigger_softint(
2270 					    sockp->pcs_cd_softint_hdl, NULL);
2271 				}
2272 
2273 				io_ints &= ~(1 << i);
2274 			} /* PCIC_CD_DETECT */
2275 
2276 			/* Ready/Change Detect */
2277 			sockp->pcs_state ^= SBM_RDYBSY;
2278 			if (card_type == IF_MEMORY && value & PCIC_RD_DETECT) {
2279 				sockp->pcs_flags |= PCS_READY;
2280 				PC_CALLBACK(pcic->dip, x, PCE_CARD_READY, i);
2281 			}
2282 
2283 			/* Battery Warn Detect */
2284 			if (card_type == IF_MEMORY &&
2285 			    value & PCIC_BW_DETECT &&
2286 			    !(sockp->pcs_state & SBM_BVD2)) {
2287 				sockp->pcs_state |= SBM_BVD2;
2288 				PC_CALLBACK(pcic->dip, x,
2289 						PCE_CARD_BATTERY_WARN, i);
2290 			}
2291 
2292 			/* Battery Dead Detect */
2293 			if (value & PCIC_BD_DETECT) {
2294 				/*
2295 				 * need to work out event if RI not enabled
2296 				 * and card_type == IF_IO
2297 				 */
2298 				if (card_type == IF_MEMORY &&
2299 					!(sockp->pcs_state & SBM_BVD1)) {
2300 					sockp->pcs_state |= SBM_BVD1;
2301 					PC_CALLBACK(pcic->dip, x,
2302 							PCE_CARD_BATTERY_DEAD,
2303 							i);
2304 				} else {
2305 					/*
2306 					 * information in pin replacement
2307 					 * register if one is available
2308 					 */
2309 					PC_CALLBACK(pcic->dip, x,
2310 							PCE_CARD_STATUS_CHANGE,
2311 							i);
2312 				} /* IF_MEMORY */
2313 			} /* PCIC_BD_DETECT */
2314 		} /* if pcic_change */
2315 		/*
2316 		 * for any controllers that we can detect whether a socket
2317 		 * had an interrupt for the PC Card, we should sort that out
2318 		 * here.
2319 		 */
2320 	} /* for pc_numsockets */
2321 
2322 	/*
2323 	 * If we're on a PCI bus, we may need to cycle through each IO
2324 	 *	interrupt handler that is registered since they all
2325 	 *	share the same interrupt line.
2326 	 */
2327 
2328 
2329 #if defined(PCIC_DEBUG)
2330 	pcic_err(pcic->dip, 0xf,
2331 	    "pcic_intr: pc_intr_mode=%d pc_type=%x io_ints=0x%x\n",
2332 	    pcic->pc_intr_mode, pcic->pc_type, io_ints);
2333 #endif
2334 
2335 	if (io_ints) {
2336 		if (pcic_do_io_intr(pcic, io_ints) == DDI_INTR_CLAIMED)
2337 			ret = DDI_INTR_CLAIMED;
2338 	}
2339 
2340 	mutex_exit(&pcic->intr_lock);
2341 
2342 #if defined(PCIC_DEBUG)
2343 	pcic_err(pcic->dip, 0xf,
2344 	    "pcic_intr: ret=%d value=%d DDI_INTR_CLAIMED=%d\n",
2345 	    ret, value, DDI_INTR_CLAIMED);
2346 #endif
2347 
2348 	return (ret);
2349 }
2350 
2351 /*
2352  * pcic_change()
2353  *	check to see if this socket had a change in state
2354  *	by checking the status change register
2355  */
2356 static int
2357 pcic_change(pcicdev_t *pcic, int socket)
2358 {
2359 	return (pcic_getb(pcic, socket, PCIC_CARD_STATUS_CHANGE));
2360 }
2361 
2362 /*
2363  * pcic_do_io_intr - calls client interrupt handlers
2364  */
2365 static int
2366 pcic_do_io_intr(pcicdev_t *pcic, uint32_t sockets)
2367 {
2368 	inthandler_t *tmp;
2369 	int ret = DDI_INTR_UNCLAIMED;
2370 
2371 #if defined(PCIC_DEBUG)
2372 	pcic_err(pcic->dip, 0xf,
2373 		"pcic_do_io_intr: pcic=%p sockets=%d irq_top=%p\n",
2374 		(void *)pcic, (int)sockets, (void *)pcic->irq_top);
2375 #endif
2376 
2377 	if (pcic->irq_top != NULL) {
2378 	    tmp = pcic->irq_current;
2379 
2380 	    do {
2381 		int cur = pcic->irq_current->socket;
2382 		pcic_socket_t *sockp =
2383 				&pcic->pc_sockets[cur];
2384 
2385 #if defined(PCIC_DEBUG)
2386 		pcic_err(pcic->dip, 0xf,
2387 		    "\t pcs_flags=0x%x PCS_CARD_PRESENT=0x%x\n",
2388 		    sockp->pcs_flags, PCS_CARD_PRESENT);
2389 		pcic_err(pcic->dip, 0xf,
2390 		    "\t sockets=%d cur=%d intr=%p arg1=%p "
2391 		    "arg2=%p\n",
2392 		    sockets, cur, (void *)pcic->irq_current->intr,
2393 		    pcic->irq_current->arg1,
2394 		    pcic->irq_current->arg2);
2395 #endif
2396 		if ((sockp->pcs_flags & PCS_CARD_PRESENT) &&
2397 		    !(sockp->pcs_flags & PCS_DEBOUNCING) &&
2398 		    (sockets & (1 << cur))) {
2399 
2400 			if ((*pcic->irq_current->intr)(pcic->irq_current->arg1,
2401 			    pcic->irq_current->arg2) == DDI_INTR_CLAIMED)
2402 				ret = DDI_INTR_CLAIMED;
2403 
2404 #if defined(PCIC_DEBUG)
2405 			pcic_err(pcic->dip, 0xf,
2406 			    "\t ret=%d DDI_INTR_CLAIMED=%d\n",
2407 			    ret, DDI_INTR_CLAIMED);
2408 #endif
2409 		}
2410 
2411 
2412 		if ((pcic->irq_current = pcic->irq_current->next) == NULL)
2413 					pcic->irq_current = pcic->irq_top;
2414 
2415 	    } while (pcic->irq_current != tmp);
2416 
2417 	    if ((pcic->irq_current = pcic->irq_current->next) == NULL)
2418 					pcic->irq_current = pcic->irq_top;
2419 
2420 	} else {
2421 		ret = DDI_INTR_UNCLAIMED;
2422 	}
2423 
2424 #if defined(PCIC_DEBUG)
2425 	pcic_err(pcic->dip, 0xf,
2426 		"pcic_do_io_intr: exit ret=%d DDI_INTR_CLAIMED=%d\n",
2427 		ret, DDI_INTR_CLAIMED);
2428 #endif
2429 
2430 	return (ret);
2431 
2432 }
2433 
2434 /*
2435  * pcic_inquire_adapter()
2436  *	SocketServices InquireAdapter function
2437  *	get characteristics of the physical adapter
2438  */
2439 /*ARGSUSED*/
2440 static int
2441 pcic_inquire_adapter(dev_info_t *dip, inquire_adapter_t *config)
2442 {
2443 	anp_t *anp = ddi_get_driver_private(dip);
2444 	pcicdev_t *pcic = anp->an_private;
2445 
2446 	config->NumSockets = pcic->pc_numsockets;
2447 	config->NumWindows = pcic->pc_numsockets * PCIC_NUMWINSOCK;
2448 	config->NumEDCs = 0;
2449 	config->AdpCaps = 0;
2450 	config->ActiveHigh = 0;
2451 	config->ActiveLow = PCIC_AVAIL_IRQS;
2452 	config->NumPower = pcic->pc_numpower;
2453 	config->power_entry = pcic->pc_power; /* until we resolve this */
2454 #if defined(PCIC_DEBUG)
2455 	if (pcic_debug) {
2456 		cmn_err(CE_CONT, "pcic_inquire_adapter:\n");
2457 		cmn_err(CE_CONT, "\tNumSockets=%d\n", config->NumSockets);
2458 		cmn_err(CE_CONT, "\tNumWindows=%d\n", config->NumWindows);
2459 	}
2460 #endif
2461 	config->ResourceFlags = 0;
2462 	switch (pcic->pc_intr_mode) {
2463 	case PCIC_INTR_MODE_PCI_1:
2464 		config->ResourceFlags |= RES_OWN_IRQ | RES_IRQ_NEXUS |
2465 			RES_IRQ_SHAREABLE;
2466 		break;
2467 	}
2468 	return (SUCCESS);
2469 }
2470 
2471 /*
2472  * pcic_callback()
2473  *	The PCMCIA nexus calls us via this function
2474  *	in order to set the callback function we are
2475  *	to call the nexus with
2476  */
2477 /*ARGSUSED*/
2478 static int
2479 pcic_callback(dev_info_t *dip, int (*handler)(), int arg)
2480 {
2481 	anp_t *anp = ddi_get_driver_private(dip);
2482 	pcicdev_t *pcic = anp->an_private;
2483 
2484 	if (handler != NULL) {
2485 		pcic->pc_callback = handler;
2486 		pcic->pc_cb_arg  = arg;
2487 		pcic->pc_flags |= PCF_CALLBACK;
2488 	} else {
2489 		pcic->pc_callback = NULL;
2490 		pcic->pc_cb_arg = 0;
2491 		pcic->pc_flags &= ~PCF_CALLBACK;
2492 	}
2493 	/*
2494 	 * we're now registered with the nexus
2495 	 * it is acceptable to do callbacks at this point.
2496 	 * don't call back from here though since it could block
2497 	 */
2498 	return (PC_SUCCESS);
2499 }
2500 
2501 /*
2502  * pcic_calc_speed (pcicdev_t *pcic, uint32_t speed)
2503  *	calculate the speed bits from the specified memory speed
2504  *	there may be more to do here
2505  */
2506 
2507 static int
2508 pcic_calc_speed(pcicdev_t *pcic, uint32_t speed)
2509 {
2510 	uint32_t wspeed = 1;	/* assume 1 wait state when unknown */
2511 	uint32_t bspeed = PCIC_ISA_DEF_SYSCLK;
2512 
2513 	switch (pcic->pc_type) {
2514 	    case PCIC_I82365SL:
2515 	    case PCIC_VADEM:
2516 	    case PCIC_VADEM_VG469:
2517 	    default:
2518 		/* Intel chip wants it in waitstates */
2519 		wspeed = mhztons(PCIC_ISA_DEF_SYSCLK) * 3;
2520 		if (speed <= wspeed)
2521 			wspeed = 0;
2522 		else if (speed <= (wspeed += mhztons(bspeed)))
2523 			wspeed = 1;
2524 		else if (speed <= (wspeed += mhztons(bspeed)))
2525 			wspeed = 2;
2526 		else
2527 			wspeed = 3;
2528 		wspeed <<= 6; /* put in right bit positions */
2529 		break;
2530 
2531 	    case PCIC_INTEL_i82092:
2532 		wspeed = SYSMEM_82092_80NS;
2533 		if (speed > 80)
2534 		    wspeed = SYSMEM_82092_100NS;
2535 		if (speed > 100)
2536 		    wspeed = SYSMEM_82092_150NS;
2537 		if (speed > 150)
2538 		    wspeed = SYSMEM_82092_200NS;
2539 		if (speed > 200)
2540 		    wspeed = SYSMEM_82092_250NS;
2541 		if (speed > 250)
2542 		    wspeed = SYSMEM_82092_600NS;
2543 		wspeed <<= 5;	/* put in right bit positions */
2544 		break;
2545 
2546 	} /* switch */
2547 
2548 	return (wspeed);
2549 }
2550 
2551 /*
2552  * These values are taken from the PC Card Standard Electrical Specification.
2553  * Generally the larger value is taken if 2 are possible.
2554  */
2555 static struct pcic_card_times {
2556 	uint16_t cycle;	/* Speed as found in the atribute space of he card. */
2557 	uint16_t setup;	/* Corresponding address setup time. */
2558 	uint16_t width;	/* Corresponding width, OE or WE. */
2559 	uint16_t hold;	/* Corresponding data or address hold time. */
2560 } pcic_card_times[] = {
2561 
2562 /*
2563  * Note: The rounded up times for 250, 200 & 150 have been increased
2564  * due to problems with the 3-Com ethernet cards (pcelx) on UBIIi.
2565  * See BugID 00663.
2566  */
2567 
2568 /*
2569  * Rounded up times           Original times from
2570  * that add up to the         the PCMCIA Spec.
2571  * cycle time.
2572  */
2573 	{600, 180, 370, 140},	/* 100, 300,  70 */
2574 	{400, 120, 300, 90},	/* Made this one up */
2575 	{250, 100, 190, 70},	/*  30, 150,  30 */
2576 	{200, 80, 170, 70},	/*  20, 120,  30 */
2577 	{150, 50, 110, 40},	/*  20,  80,  20 */
2578 	{100, 40, 80, 40},	/*  10,  60,  15 */
2579 	{0, 10, 60, 15}		/*  10,  60,  15 */
2580 };
2581 
2582 /*
2583  * pcic_set_cdtimers
2584  *	This is specific to several Cirrus Logic chips
2585  */
2586 static void
2587 pcic_set_cdtimers(pcicdev_t *pcic, int socket, uint32_t speed, int tset)
2588 {
2589 	int cmd, set, rec, offset, clk_pulse;
2590 	struct pcic_card_times *ctp;
2591 
2592 	if ((tset == IOMEM_CLTIMER_SET_1) || (tset == SYSMEM_CLTIMER_SET_1))
2593 		offset = 3;
2594 	else
2595 		offset = 0;
2596 
2597 	clk_pulse = mhztons(pcic->bus_speed);
2598 	for (ctp = pcic_card_times; speed < ctp->cycle; ctp++);
2599 
2600 	/*
2601 	 * Add (clk_pulse/2) and an extra 1 to account for rounding errors.
2602 	 */
2603 	set = ((ctp->setup + 10 + 1 + (clk_pulse/2))/clk_pulse) - 1;
2604 	if (set < 0)
2605 		set = 0;
2606 
2607 	cmd = ((ctp->width + 10 + 1 + (clk_pulse/2))/clk_pulse) - 1;
2608 	if (cmd < 0)
2609 		cmd = 0;
2610 
2611 	rec = ((ctp->hold + 10 + 1 + (clk_pulse/2))/clk_pulse) - 2;
2612 	if (rec < 0)
2613 		rec = 0;
2614 
2615 #if defined(PCIC_DEBUG)
2616 	pcic_err(pcic->dip, 8, "pcic_set_cdtimers(%d, Timer Set %d)\n"
2617 	    "ct=%d, cp=%d, cmd=0x%x, setup=0x%x, rec=0x%x\n",
2618 	    (unsigned)speed, offset == 3 ? 1 : 0,
2619 	    ctp->cycle, clk_pulse, cmd, set, rec);
2620 #endif
2621 
2622 	pcic_putb(pcic, socket, PCIC_TIME_COMMAND_0 + offset, cmd);
2623 	pcic_putb(pcic, socket, PCIC_TIME_SETUP_0 + offset, set);
2624 	pcic_putb(pcic, socket, PCIC_TIME_RECOVER_0 + offset, rec);
2625 }
2626 
2627 /*
2628  * pcic_set_window
2629  *	essentially the same as the Socket Services specification
2630  *	We use socket and not adapter since they are identifiable
2631  *	but the rest is the same
2632  *
2633  *	dip	pcic driver's device information
2634  *	window	parameters for the request
2635  */
2636 static int
2637 pcic_set_window(dev_info_t *dip, set_window_t *window)
2638 {
2639 	anp_t *anp = ddi_get_driver_private(dip);
2640 	pcicdev_t *pcic = anp->an_private;
2641 	int select;
2642 	int socket, pages, which, ret;
2643 	pcic_socket_t *sockp = &pcic->pc_sockets[window->socket];
2644 	ra_return_t res;
2645 	ndi_ra_request_t req;
2646 	uint32_t base = window->base;
2647 
2648 #if defined(PCIC_DEBUG)
2649 	if (pcic_debug) {
2650 		cmn_err(CE_CONT, "pcic_set_window: entered\n");
2651 		cmn_err(CE_CONT,
2652 			"\twindow=%d, socket=%d, WindowSize=%d, speed=%d\n",
2653 			window->window, window->socket, window->WindowSize,
2654 			window->speed);
2655 		cmn_err(CE_CONT,
2656 			"\tbase=%x, state=%x\n", (unsigned)window->base,
2657 			(unsigned)window->state);
2658 	}
2659 #endif
2660 
2661 	/*
2662 	 * do some basic sanity checking on what we support
2663 	 * we don't do paged mode
2664 	 */
2665 	if (window->state & WS_PAGED) {
2666 		cmn_err(CE_WARN, "pcic_set_window: BAD_ATTRIBUTE\n");
2667 		return (BAD_ATTRIBUTE);
2668 	}
2669 
2670 	/*
2671 	 * we don't care about previous mappings.
2672 	 * Card Services will deal with that so don't
2673 	 * even check
2674 	 */
2675 
2676 	socket = window->socket;
2677 
2678 	if (!(window->state & WS_IO)) {
2679 		int win, tmp;
2680 		pcs_memwin_t *memp;
2681 #if defined(PCIC_DEBUG)
2682 		if (pcic_debug)
2683 			cmn_err(CE_CONT, "\twindow type is memory\n");
2684 #endif
2685 		/* this is memory window mapping */
2686 		win = window->window % PCIC_NUMWINSOCK;
2687 		tmp = window->window / PCIC_NUMWINSOCK;
2688 
2689 		/* only windows 2-6 can do memory mapping */
2690 		if (tmp != window->socket || win < PCIC_IOWINDOWS) {
2691 			cmn_err(CE_CONT,
2692 				"\tattempt to map to non-mem window\n");
2693 			return (BAD_WINDOW);
2694 		}
2695 
2696 		if (window->WindowSize == 0)
2697 			window->WindowSize = MEM_MIN;
2698 		else if ((window->WindowSize & (PCIC_PAGE-1)) != 0) {
2699 			cmn_err(CE_WARN, "pcic_set_window: BAD_SIZE\n");
2700 			return (BAD_SIZE);
2701 		}
2702 
2703 		mutex_enter(&pcic->pc_lock); /* protect the registers */
2704 
2705 		memp = &sockp->pcs_windows[win].mem;
2706 		memp->pcw_speed = window->speed;
2707 
2708 		win -= PCIC_IOWINDOWS; /* put in right range */
2709 
2710 		if (window->WindowSize != memp->pcw_len)
2711 			which = memp->pcw_len;
2712 		else
2713 			which = 0;
2714 
2715 		if (window->state & WS_ENABLED) {
2716 			uint32_t wspeed;
2717 #if defined(PCIC_DEBUG)
2718 			if (pcic_debug) {
2719 				cmn_err(CE_CONT,
2720 					"\tbase=%x, win=%d\n", (unsigned)base,
2721 					win);
2722 				if (which)
2723 					cmn_err(CE_CONT,
2724 						"\tneed to remap window\n");
2725 			}
2726 #endif
2727 
2728 			if (which && (memp->pcw_status & PCW_MAPPED)) {
2729 				ddi_regs_map_free(&memp->pcw_handle);
2730 				res.ra_addr_lo = memp->pcw_base;
2731 				res.ra_len = memp->pcw_len;
2732 				(void) pcmcia_free_mem(memp->res_dip, &res);
2733 				memp->pcw_status &= ~(PCW_MAPPED|PCW_ENABLED);
2734 				memp->pcw_hostmem = NULL;
2735 				memp->pcw_base = NULL;
2736 				memp->pcw_len = 0;
2737 			}
2738 
2739 			which = window->WindowSize >> PAGE_SHIFT;
2740 
2741 			if (!(memp->pcw_status & PCW_MAPPED)) {
2742 				ret = 0;
2743 
2744 				memp->pcw_base = base;
2745 				bzero(&req, sizeof (req));
2746 				req.ra_len = which << PAGE_SHIFT;
2747 				req.ra_addr = (uint64_t)memp->pcw_base;
2748 				req.ra_boundbase = pcic->pc_base;
2749 				req.ra_boundlen  = pcic->pc_bound;
2750 				req.ra_flags = (memp->pcw_base ?
2751 					NDI_RA_ALLOC_SPECIFIED : 0) |
2752 					NDI_RA_ALLOC_BOUNDED;
2753 				req.ra_align_mask =
2754 					(PAGESIZE - 1) | (PCIC_PAGE - 1);
2755 #if defined(PCIC_DEBUG)
2756 				    pcic_err(dip, 8,
2757 					    "\tlen 0x%"PRIx64
2758 					    "addr 0x%"PRIx64"bbase 0x%"PRIx64
2759 					    " blen 0x%"PRIx64" flags 0x%x"
2760 					    " algn 0x%"PRIx64"\n",
2761 					    req.ra_len, req.ra_addr,
2762 					    req.ra_boundbase,
2763 					    req.ra_boundlen, req.ra_flags,
2764 					    req.ra_align_mask);
2765 #endif
2766 
2767 				ret = pcmcia_alloc_mem(dip, &req, &res,
2768 					&memp->res_dip);
2769 				if (ret == DDI_FAILURE) {
2770 					mutex_exit(&pcic->pc_lock);
2771 					cmn_err(CE_WARN,
2772 					"\tpcmcia_alloc_mem() failed\n");
2773 					return (BAD_SIZE);
2774 				}
2775 				memp->pcw_base = res.ra_addr_lo;
2776 				base = memp->pcw_base;
2777 
2778 #if defined(PCIC_DEBUG)
2779 				if (pcic_debug)
2780 					cmn_err(CE_CONT,
2781 						"\tsetwindow: new base=%x\n",
2782 						(unsigned)memp->pcw_base);
2783 #endif
2784 				memp->pcw_len = window->WindowSize;
2785 
2786 				which = pcmcia_map_reg(pcic->dip,
2787 						window->child,
2788 						&res,
2789 						(uint32_t)(window->state &
2790 						    0xffff) |
2791 						    (window->socket << 16),
2792 						(caddr_t *)&memp->pcw_hostmem,
2793 						&memp->pcw_handle,
2794 						&window->attr, NULL);
2795 
2796 				if (which != DDI_SUCCESS) {
2797 
2798 					cmn_err(CE_WARN, "\tpcmcia_map_reg() "
2799 						"failed\n");
2800 
2801 				    res.ra_addr_lo = memp->pcw_base;
2802 				    res.ra_len = memp->pcw_len;
2803 				    (void) pcmcia_free_mem(memp->res_dip, &res);
2804 
2805 				    mutex_exit(&pcic->pc_lock);
2806 
2807 				    return (BAD_WINDOW);
2808 				}
2809 				memp->pcw_status |= PCW_MAPPED;
2810 #if defined(PCIC_DEBUG)
2811 				if (pcic_debug)
2812 					cmn_err(CE_CONT,
2813 						"\tmap=%x, hostmem=%p\n",
2814 						which,
2815 						(void *)memp->pcw_hostmem);
2816 #endif
2817 			} else {
2818 				base = memp->pcw_base;
2819 			}
2820 
2821 			/* report the handle back to caller */
2822 			window->handle = memp->pcw_handle;
2823 
2824 #if defined(PCIC_DEBUG)
2825 			if (pcic_debug) {
2826 				cmn_err(CE_CONT,
2827 					"\twindow mapped to %x@%x len=%d\n",
2828 					(unsigned)window->base,
2829 					(unsigned)memp->pcw_base,
2830 					memp->pcw_len);
2831 			}
2832 #endif
2833 
2834 			/* find the register set offset */
2835 			select = win * PCIC_MEM_1_OFFSET;
2836 #if defined(PCIC_DEBUG)
2837 			if (pcic_debug)
2838 				cmn_err(CE_CONT, "\tselect=%x\n", select);
2839 #endif
2840 
2841 			/*
2842 			 * at this point, the register window indicator has
2843 			 * been converted to be an offset from the first
2844 			 * set of registers that are used for programming
2845 			 * the window mapping and the offset used to select
2846 			 * the correct set of registers to access the
2847 			 * specified socket.  This allows basing everything
2848 			 * off the _0 window
2849 			 */
2850 
2851 			/* map the physical page base address */
2852 			which = (window->state & WS_16BIT) ? SYSMEM_DATA_16 : 0;
2853 			which |= (window->speed <= MEM_SPEED_MIN) ?
2854 				SYSMEM_ZERO_WAIT : 0;
2855 
2856 			/* need to select register set */
2857 			select = PCIC_MEM_1_OFFSET * win;
2858 
2859 			pcic_putb(pcic, socket,
2860 					PCIC_SYSMEM_0_STARTLOW + select,
2861 					SYSMEM_LOW(base));
2862 			pcic_putb(pcic, socket,
2863 					PCIC_SYSMEM_0_STARTHI + select,
2864 					SYSMEM_HIGH(base) | which);
2865 
2866 			/*
2867 			 * Some adapters can decode window addresses greater
2868 			 * than 16-bits worth, so handle them here.
2869 			 */
2870 			switch (pcic->pc_type) {
2871 			case PCIC_INTEL_i82092:
2872 				pcic_putb(pcic, socket,
2873 						PCIC_82092_CPAGE,
2874 						SYSMEM_EXT(base));
2875 				break;
2876 			case PCIC_CL_PD6729:
2877 			case PCIC_CL_PD6730:
2878 				clext_reg_write(pcic, socket,
2879 						PCIC_CLEXT_MMAP0_UA + win,
2880 						SYSMEM_EXT(base));
2881 				break;
2882 			case PCIC_TI_PCI1130:
2883 				/*
2884 				 * Note that the TI chip has one upper byte
2885 				 * per socket so all windows get bound to a
2886 				 * 16MB segment.  This must be detected and
2887 				 * handled appropriately.  We can detect that
2888 				 * it is done by seeing if the pc_base has
2889 				 * changed and changing when the register
2890 				 * is first set.  This will force the bounds
2891 				 * to be correct.
2892 				 */
2893 				if (pcic->pc_bound == 0xffffffff) {
2894 					pcic_putb(pcic, socket,
2895 						    PCIC_TI_WINDOW_PAGE_PCI,
2896 						    SYSMEM_EXT(base));
2897 					pcic->pc_base = SYSMEM_EXT(base) << 24;
2898 					pcic->pc_bound = 0x1000000;
2899 				}
2900 				break;
2901 			case PCIC_TI_PCI1031:
2902 			case PCIC_TI_PCI1131:
2903 			case PCIC_TI_PCI1250:
2904 			case PCIC_TI_PCI1225:
2905 			case PCIC_TI_PCI1221:
2906 			case PCIC_SMC_34C90:
2907 			case PCIC_CL_PD6832:
2908 			case PCIC_RICOH_RL5C466:
2909 			case PCIC_TI_PCI1410:
2910 			case PCIC_ENE_1410:
2911 			case PCIC_TI_PCI1510:
2912 			case PCIC_TI_PCI1520:
2913 			case PCIC_O2_OZ6912:
2914 			case PCIC_TI_PCI1420:
2915 			case PCIC_ENE_1420:
2916 			case PCIC_TI_VENDOR:
2917 			case PCIC_TOSHIBA_TOPIC100:
2918 			case PCIC_TOSHIBA_TOPIC95:
2919 			case PCIC_TOSHIBA_VENDOR:
2920 			case PCIC_RICOH_VENDOR:
2921 			case PCIC_O2MICRO_VENDOR:
2922 				pcic_putb(pcic, socket,
2923 						PCIC_YENTA_MEM_PAGE + win,
2924 						SYSMEM_EXT(base));
2925 				break;
2926 			default:
2927 				cmn_err(CE_NOTE, "pcic_set_window: unknown "
2928 						"cardbus vendor:0x%X\n",
2929 						pcic->pc_type);
2930 				pcic_putb(pcic, socket,
2931 						PCIC_YENTA_MEM_PAGE + win,
2932 						SYSMEM_EXT(base));
2933 
2934 				break;
2935 			} /* switch */
2936 
2937 			/*
2938 			 * specify the length of the mapped range
2939 			 * we convert to pages (rounding up) so that
2940 			 * the hardware gets the right thing
2941 			 */
2942 			pages = (window->WindowSize+PCIC_PAGE-1)/PCIC_PAGE;
2943 
2944 			/*
2945 			 * Setup this window's timing.
2946 			 */
2947 			switch (pcic->pc_type) {
2948 			case PCIC_CL_PD6729:
2949 			case PCIC_CL_PD6730:
2950 			case PCIC_CL_PD6710:
2951 			case PCIC_CL_PD6722:
2952 				wspeed = SYSMEM_CLTIMER_SET_0;
2953 				pcic_set_cdtimers(pcic, socket,
2954 							window->speed,
2955 							wspeed);
2956 				break;
2957 
2958 			case PCIC_INTEL_i82092:
2959 			default:
2960 				wspeed = pcic_calc_speed(pcic, window->speed);
2961 				break;
2962 			} /* switch */
2963 
2964 #if defined(PCIC_DEBUG)
2965 			if (pcic_debug)
2966 				cmn_err(CE_CONT,
2967 					"\twindow %d speed bits = %x for "
2968 					"%dns\n",
2969 					win, (unsigned)wspeed, window->speed);
2970 #endif
2971 
2972 			pcic_putb(pcic, socket, PCIC_SYSMEM_0_STOPLOW + select,
2973 					SYSMEM_LOW(base +
2974 						    (pages * PCIC_PAGE)-1));
2975 
2976 			wspeed |= SYSMEM_HIGH(base + (pages * PCIC_PAGE)-1);
2977 			pcic_putb(pcic, socket, PCIC_SYSMEM_0_STOPHI + select,
2978 					wspeed);
2979 
2980 			/*
2981 			 * now map the card's memory pages - we start with page
2982 			 * 0
2983 			 * we also default to AM -- set page might change it
2984 			 */
2985 			base = memp->pcw_base;
2986 			pcic_putb(pcic, socket,
2987 					PCIC_CARDMEM_0_LOW + select,
2988 					CARDMEM_LOW(0 - (uint32_t)base));
2989 
2990 			pcic_putb(pcic, socket,
2991 					PCIC_CARDMEM_0_HI + select,
2992 					CARDMEM_HIGH(0 - (uint32_t)base) |
2993 					CARDMEM_REG_ACTIVE);
2994 
2995 			/*
2996 			 * enable the window even though redundant
2997 			 * and SetPage may do it again.
2998 			 */
2999 			select = pcic_getb(pcic, socket,
3000 					PCIC_MAPPING_ENABLE);
3001 			select |= SYSMEM_WINDOW(win);
3002 			pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, select);
3003 			memp->pcw_offset = 0;
3004 			memp->pcw_status |= PCW_ENABLED;
3005 		} else {
3006 			/*
3007 			 * not only do we unmap the memory, the
3008 			 * window has been turned off.
3009 			 */
3010 			if (which && memp->pcw_status & PCW_MAPPED) {
3011 				ddi_regs_map_free(&memp->pcw_handle);
3012 				res.ra_addr_lo = memp->pcw_base;
3013 				res.ra_len = memp->pcw_len;
3014 				(void) pcmcia_free_mem(memp->res_dip, &res);
3015 				memp->pcw_hostmem = NULL;
3016 				memp->pcw_status &= ~PCW_MAPPED;
3017 			}
3018 
3019 			/* disable current mapping */
3020 			select = pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE);
3021 			select &= ~SYSMEM_WINDOW(win);
3022 			pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, select);
3023 			memp->pcw_status &= ~PCW_ENABLED;
3024 		}
3025 		memp->pcw_len = window->WindowSize;
3026 		window->handle = memp->pcw_handle;
3027 #if defined(PCIC_DEBUG)
3028 		if (pcic_debug)
3029 			xxdmp_all_regs(pcic, window->socket, -1);
3030 #endif
3031 	} else {
3032 		/*
3033 		 * This is a request for an IO window
3034 		 */
3035 		int win, tmp;
3036 		pcs_iowin_t *winp;
3037 				/* I/O windows */
3038 #if defined(PCIC_DEBUG)
3039 		if (pcic_debug)
3040 			cmn_err(CE_CONT, "\twindow type is I/O\n");
3041 #endif
3042 
3043 		/* only windows 0 and 1 can do I/O */
3044 		win = window->window % PCIC_NUMWINSOCK;
3045 		tmp = window->window / PCIC_NUMWINSOCK;
3046 
3047 		if (win >= PCIC_IOWINDOWS || tmp != window->socket) {
3048 			cmn_err(CE_WARN,
3049 				"\twindow is out of range (%d)\n",
3050 				window->window);
3051 			return (BAD_WINDOW);
3052 		}
3053 
3054 		mutex_enter(&pcic->pc_lock); /* protect the registers */
3055 
3056 		winp = &sockp->pcs_windows[win].io;
3057 		winp->pcw_speed = window->speed;
3058 		if (window->WindowSize != 1 && window->WindowSize & 1) {
3059 			/* we don't want an odd-size window */
3060 			window->WindowSize++;
3061 		}
3062 		winp->pcw_len = window->WindowSize;
3063 
3064 		if (window->state & WS_ENABLED) {
3065 			if (winp->pcw_status & PCW_MAPPED) {
3066 				ddi_regs_map_free(&winp->pcw_handle);
3067 				res.ra_addr_lo = winp->pcw_base;
3068 				res.ra_len = winp->pcw_len;
3069 				(void) pcmcia_free_io(winp->res_dip, &res);
3070 				winp->pcw_status &= ~(PCW_MAPPED|PCW_ENABLED);
3071 			}
3072 
3073 			/*
3074 			 * if the I/O address wasn't allocated, allocate
3075 			 *	it now. If it was allocated, it better
3076 			 *	be free to use.
3077 			 * The winp->pcw_offset value is set and used
3078 			 *	later on if the particular adapter
3079 			 *	that we're running on has the ability
3080 			 *	to translate IO accesses to the card
3081 			 *	(such as some adapters  in the Cirrus
3082 			 *	Logic family).
3083 			 */
3084 			winp->pcw_offset = 0;
3085 
3086 			/*
3087 			 * Setup the request parameters for the
3088 			 *	requested base and length. If
3089 			 *	we're on an adapter that has
3090 			 *	IO window offset registers, then
3091 			 *	we don't need a specific base
3092 			 *	address, just a length, and then
3093 			 *	we'll cause the correct IO address
3094 			 *	to be generated on the socket by
3095 			 *	setting up the IO window offset
3096 			 *	registers.
3097 			 * For adapters that support this capability, we
3098 			 *	always use the IO window offset registers,
3099 			 *	even if the passed base/length would be in
3100 			 *	range.
3101 			 */
3102 			base = window->base;
3103 			bzero(&req, sizeof (req));
3104 			req.ra_len = window->WindowSize;
3105 
3106 			req.ra_addr = (uint64_t)
3107 				((pcic->pc_flags & PCF_IO_REMAP) ? 0 : base);
3108 			req.ra_flags = (req.ra_addr) ?
3109 						NDI_RA_ALLOC_SPECIFIED : 0;
3110 
3111 			req.ra_flags |= NDI_RA_ALIGN_SIZE;
3112 			/* need to rethink this */
3113 			req.ra_boundbase = pcic->pc_iobase;
3114 			req.ra_boundlen = pcic->pc_iobound;
3115 			req.ra_flags |= NDI_RA_ALLOC_BOUNDED;
3116 
3117 #if defined(PCIC_DEBUG)
3118 			    pcic_err(dip, 8,
3119 					"\tlen 0x%"PRIx64" addr 0x%"PRIx64
3120 					"bbase 0x%"PRIx64
3121 					"blen 0x%"PRIx64" flags 0x%x algn 0x%"
3122 					PRIx64"\n",
3123 					req.ra_len, (uint64_t)req.ra_addr,
3124 					req.ra_boundbase,
3125 					req.ra_boundlen, req.ra_flags,
3126 					req.ra_align_mask);
3127 #endif
3128 
3129 			/*
3130 			 * Try to allocate the space. If we fail this,
3131 			 *	return the appropriate error depending
3132 			 *	on whether the caller specified a
3133 			 *	specific base address or not.
3134 			 */
3135 			if (pcmcia_alloc_io(dip, &req, &res,
3136 					&winp->res_dip) == DDI_FAILURE) {
3137 				winp->pcw_status &= ~PCW_ENABLED;
3138 				mutex_exit(&pcic->pc_lock);
3139 				cmn_err(CE_WARN, "Failed to alloc I/O:\n"
3140 					"\tlen 0x%" PRIx64 " addr 0x%" PRIx64
3141 					"bbase 0x%" PRIx64
3142 					"blen 0x%" PRIx64 "flags 0x%x"
3143 					"algn 0x%" PRIx64 "\n",
3144 					req.ra_len, req.ra_addr,
3145 					req.ra_boundbase,
3146 					req.ra_boundlen, req.ra_flags,
3147 					req.ra_align_mask);
3148 
3149 				return (base?BAD_BASE:BAD_SIZE);
3150 			} /* pcmcia_alloc_io */
3151 
3152 			/*
3153 			 * Don't change the original base. Either we use
3154 			 * the offset registers below (PCF_IO_REMAP is set)
3155 			 * or it was allocated correctly anyway.
3156 			 */
3157 			winp->pcw_base = res.ra_addr_lo;
3158 
3159 #if defined(PCIC_DEBUG)
3160 			    pcic_err(dip, 8,
3161 				    "\tsetwindow: new base=%x orig base 0x%x\n",
3162 				    (unsigned)winp->pcw_base, base);
3163 #endif
3164 
3165 			if ((which = pcmcia_map_reg(pcic->dip,
3166 						window->child,
3167 						&res,
3168 						(uint32_t)(window->state &
3169 						    0xffff) |
3170 						    (window->socket << 16),
3171 						(caddr_t *)&winp->pcw_hostmem,
3172 						&winp->pcw_handle,
3173 						&window->attr,
3174 						base)) != DDI_SUCCESS) {
3175 
3176 					cmn_err(CE_WARN, "pcmcia_map_reg()"
3177 						"failed\n");
3178 
3179 				    res.ra_addr_lo = winp->pcw_base;
3180 				    res.ra_len = winp->pcw_len;
3181 				    (void) pcmcia_free_io(winp->res_dip, &res);
3182 
3183 				    mutex_exit(&pcic->pc_lock);
3184 				    return (BAD_WINDOW);
3185 			}
3186 
3187 			window->handle = winp->pcw_handle;
3188 			winp->pcw_status |= PCW_MAPPED;
3189 
3190 			/* find the register set offset */
3191 			select = win * PCIC_IO_OFFSET;
3192 
3193 #if defined(PCIC_DEBUG)
3194 			if (pcic_debug) {
3195 				cmn_err(CE_CONT,
3196 					"\tenable: window=%d, select=%x, "
3197 					"base=%x, handle=%p\n",
3198 					win, select,
3199 					(unsigned)window->base,
3200 					(void *)window->handle);
3201 			}
3202 #endif
3203 			/*
3204 			 * at this point, the register window indicator has
3205 			 * been converted to be an offset from the first
3206 			 * set of registers that are used for programming
3207 			 * the window mapping and the offset used to select
3208 			 * the correct set of registers to access the
3209 			 * specified socket.  This allows basing everything
3210 			 * off the _0 window
3211 			 */
3212 
3213 			/* map the I/O base in */
3214 			pcic_putb(pcic, socket,
3215 					PCIC_IO_ADDR_0_STARTLOW + select,
3216 					LOW_BYTE((uint32_t)winp->pcw_base));
3217 			pcic_putb(pcic, socket,
3218 					PCIC_IO_ADDR_0_STARTHI + select,
3219 					HIGH_BYTE((uint32_t)winp->pcw_base));
3220 
3221 			pcic_putb(pcic, socket,
3222 					PCIC_IO_ADDR_0_STOPLOW + select,
3223 					LOW_BYTE((uint32_t)winp->pcw_base +
3224 						window->WindowSize - 1));
3225 			pcic_putb(pcic, socket,
3226 					PCIC_IO_ADDR_0_STOPHI + select,
3227 					HIGH_BYTE((uint32_t)winp->pcw_base +
3228 						window->WindowSize - 1));
3229 
3230 			/*
3231 			 * We've got the requested IO space, now see if we
3232 			 *	need to adjust the IO window offset registers
3233 			 *	so that the correct IO address is generated
3234 			 *	at the socket. If this window doesn't have
3235 			 *	this capability, then we're all done setting
3236 			 *	up the IO resources.
3237 			 */
3238 			if (pcic->pc_flags & PCF_IO_REMAP) {
3239 
3240 
3241 				/*
3242 				 * Note that only 16 bits are used to program
3243 				 * the registers but leave 32 bits on pcw_offset
3244 				 * so that we can generate the original base
3245 				 * in get_window()
3246 				 */
3247 				winp->pcw_offset = (base - winp->pcw_base);
3248 
3249 				pcic_putb(pcic, socket,
3250 					PCIC_IO_OFFSET_LOW +
3251 					(win * PCIC_IO_OFFSET_OFFSET),
3252 					winp->pcw_offset & 0x0ff);
3253 				pcic_putb(pcic, socket,
3254 					PCIC_IO_OFFSET_HI +
3255 					(win * PCIC_IO_OFFSET_OFFSET),
3256 					(winp->pcw_offset >> 8) & 0x0ff);
3257 
3258 			} /* PCF_IO_REMAP */
3259 
3260 			/* now get the other details (size, etc) right */
3261 
3262 			/*
3263 			 * Set the data size control bits here. Most of the
3264 			 *	adapters will ignore IOMEM_16BIT when
3265 			 *	IOMEM_IOCS16 is set, except for the Intel
3266 			 *	82092, which only pays attention to the
3267 			 *	IOMEM_16BIT bit. Sigh... Intel can't even
3268 			 *	make a proper clone of their own chip.
3269 			 * The 82092 also apparently can't set the timing
3270 			 *	of I/O windows.
3271 			 */
3272 			which = (window->state & WS_16BIT) ?
3273 					(IOMEM_16BIT | IOMEM_IOCS16) : 0;
3274 
3275 			switch (pcic->pc_type) {
3276 			case PCIC_CL_PD6729:
3277 			case PCIC_CL_PD6730:
3278 			case PCIC_CL_PD6710:
3279 			case PCIC_CL_PD6722:
3280 			case PCIC_CL_PD6832:
3281 				/*
3282 				 * Select Timer Set 1 - this will take
3283 				 *	effect when the PCIC_IO_CONTROL
3284 				 *	register is written to later on;
3285 				 *	the call to pcic_set_cdtimers
3286 				 *	just sets up the timer itself.
3287 				 */
3288 				which |= IOMEM_CLTIMER_SET_1;
3289 				pcic_set_cdtimers(pcic, socket,
3290 							window->speed,
3291 							IOMEM_CLTIMER_SET_1);
3292 				which |= IOMEM_IOCS16;
3293 				break;
3294 			case PCIC_TI_PCI1031:
3295 
3296 				if (window->state & WS_16BIT)
3297 				    which |= IOMEM_WAIT16;
3298 
3299 				break;
3300 			case PCIC_TI_PCI1130:
3301 
3302 				if (window->state & WS_16BIT)
3303 				    which |= IOMEM_WAIT16;
3304 
3305 				break;
3306 			case PCIC_INTEL_i82092:
3307 				break;
3308 			default:
3309 				if (window->speed >
3310 						mhztons(pcic->bus_speed) * 3)
3311 				    which |= IOMEM_WAIT16;
3312 #ifdef notdef
3313 				if (window->speed <
3314 						mhztons(pcic->bus_speed) * 6)
3315 				    which |= IOMEM_ZERO_WAIT;
3316 #endif
3317 				break;
3318 			} /* switch (pc_type) */
3319 
3320 			/*
3321 			 * Setup the data width and timing
3322 			 */
3323 			select = pcic_getb(pcic, socket, PCIC_IO_CONTROL);
3324 			select &= ~(PCIC_IO_WIN_MASK << (win * 4));
3325 			select |= IOMEM_SETWIN(win, which);
3326 			pcic_putb(pcic, socket, PCIC_IO_CONTROL, select);
3327 
3328 			/*
3329 			 * Enable the IO window
3330 			 */
3331 			select = pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE);
3332 			pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE,
3333 						select | IOMEM_WINDOW(win));
3334 
3335 			winp->pcw_status |= PCW_ENABLED;
3336 
3337 #if defined(PCIC_DEBUG)
3338 			if (pcic_debug) {
3339 				cmn_err(CE_CONT,
3340 					"\twhich = %x, select = %x (%x)\n",
3341 					which, select,
3342 					IOMEM_SETWIN(win, which));
3343 				xxdmp_all_regs(pcic, window->socket * 0x40, 24);
3344 			}
3345 #endif
3346 		} else {
3347 			/*
3348 			 * not only do we unmap the IO space, the
3349 			 * window has been turned off.
3350 			 */
3351 			if (winp->pcw_status & PCW_MAPPED) {
3352 				ddi_regs_map_free(&winp->pcw_handle);
3353 				res.ra_addr_lo = winp->pcw_base;
3354 				res.ra_len = winp->pcw_len;
3355 				(void) pcmcia_free_io(winp->res_dip, &res);
3356 				winp->pcw_status &= ~PCW_MAPPED;
3357 			}
3358 
3359 			/* disable current mapping */
3360 			select = pcic_getb(pcic, socket,
3361 						PCIC_MAPPING_ENABLE);
3362 			pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE,
3363 					select &= ~IOMEM_WINDOW(win));
3364 			winp->pcw_status &= ~PCW_ENABLED;
3365 
3366 			winp->pcw_base = 0;
3367 			winp->pcw_len = 0;
3368 			winp->pcw_offset = 0;
3369 			window->base = 0;
3370 			/* now make sure we don't accidentally re-enable */
3371 			/* find the register set offset */
3372 			select = win * PCIC_IO_OFFSET;
3373 			pcic_putb(pcic, socket,
3374 					PCIC_IO_ADDR_0_STARTLOW + select, 0);
3375 			pcic_putb(pcic, socket,
3376 					PCIC_IO_ADDR_0_STARTHI + select, 0);
3377 			pcic_putb(pcic, socket,
3378 					PCIC_IO_ADDR_0_STOPLOW + select, 0);
3379 			pcic_putb(pcic, socket,
3380 					PCIC_IO_ADDR_0_STOPHI + select, 0);
3381 		}
3382 	}
3383 	mutex_exit(&pcic->pc_lock);
3384 
3385 	return (SUCCESS);
3386 }
3387 
3388 /*
3389  * pcic_card_state()
3390  *	compute the instantaneous Card State information
3391  */
3392 static int
3393 pcic_card_state(pcicdev_t *pcic, pcic_socket_t *sockp)
3394 {
3395 	int value, result;
3396 #if defined(PCIC_DEBUG)
3397 	int orig_value;
3398 #endif
3399 
3400 	mutex_enter(&pcic->pc_lock); /* protect the registers */
3401 
3402 	value = pcic_getb(pcic, sockp->pcs_socket, PCIC_INTERFACE_STATUS);
3403 
3404 #if defined(PCIC_DEBUG)
3405 	orig_value = value;
3406 	if (pcic_debug >= 8)
3407 		cmn_err(CE_CONT, "pcic_card_state(%p) if status = %b for %d\n",
3408 			(void *)sockp,
3409 			value,
3410 			"\020\1BVD1\2BVD2\3CD1\4CD2\5WP\6RDY\7PWR\10~GPI",
3411 			sockp->pcs_socket);
3412 #endif
3413 	/*
3414 	 * Lie to socket services if we are not ready.
3415 	 * This is when we are starting up or during debounce timeouts
3416 	 * or if the card is a cardbus card.
3417 	 */
3418 	if (!(sockp->pcs_flags & (PCS_STARTING|PCS_CARD_ISCARDBUS)) &&
3419 	    !sockp->pcs_debounce_id &&
3420 	    (value & PCIC_ISTAT_CD_MASK) == PCIC_CD_PRESENT_OK) {
3421 		result = SBM_CD;
3422 
3423 		if (value & PCIC_WRITE_PROTECT || !(value & PCIC_POWER_ON))
3424 			result |= SBM_WP;
3425 		if (value & PCIC_POWER_ON) {
3426 			if (value & PCIC_READY)
3427 				result |= SBM_RDYBSY;
3428 			value = (~value) & (PCIC_BVD1 | PCIC_BVD2);
3429 			if (value & PCIC_BVD1)
3430 				result |= SBM_BVD1;
3431 			if (value & PCIC_BVD2)
3432 				result |= SBM_BVD2;
3433 		}
3434 	} else
3435 		result = 0;
3436 
3437 	mutex_exit(&pcic->pc_lock);
3438 
3439 #if defined(PCIC_DEBUG)
3440 	pcic_err(pcic->dip, 8,
3441 	    "pcic_card_state(%p) if status = %b for %d (rval=0x%x)\n",
3442 	    (void *) sockp, orig_value,
3443 	    "\020\1BVD1\2BVD2\3CD1\4CD2\5WP\6RDY\7PWR\10~GPI",
3444 	    sockp->pcs_socket, result);
3445 #endif
3446 
3447 	return (result);
3448 }
3449 
3450 /*
3451  * pcic_set_page()
3452  *	SocketServices SetPage function
3453  *	set the page of PC Card memory that should be in the mapped
3454  *	window
3455  */
3456 /*ARGSUSED*/
3457 static int
3458 pcic_set_page(dev_info_t *dip, set_page_t *page)
3459 {
3460 	anp_t *anp = ddi_get_driver_private(dip);
3461 	pcicdev_t *pcic = anp->an_private;
3462 	int select;
3463 	int which, socket, window;
3464 	uint32_t base;
3465 	pcs_memwin_t *memp;
3466 
3467 	/* get real socket/window numbers */
3468 	window = page->window % PCIC_NUMWINSOCK;
3469 	socket = page->window / PCIC_NUMWINSOCK;
3470 
3471 #if defined(PCIC_DEBUG)
3472 	if (pcic_debug) {
3473 		cmn_err(CE_CONT,
3474 			"pcic_set_page: window=%d, socket=%d, page=%d\n",
3475 			window, socket, page->page);
3476 	}
3477 #endif
3478 	/* only windows 2-6 work on memory */
3479 	if (window < PCIC_IOWINDOWS)
3480 		return (BAD_WINDOW);
3481 
3482 	/* only one page supported (but any size) */
3483 	if (page->page != 0)
3484 		return (BAD_PAGE);
3485 
3486 	mutex_enter(&pcic->pc_lock); /* protect the registers */
3487 
3488 	memp = &pcic->pc_sockets[socket].pcs_windows[window].mem;
3489 	window -= PCIC_IOWINDOWS;
3490 
3491 #if defined(PCIC_DEBUG)
3492 	if (pcic_debug)
3493 		cmn_err(CE_CONT, "\tpcw_base=%x, pcw_hostmem=%p, pcw_len=%x\n",
3494 			(uint32_t)memp->pcw_base,
3495 			(void *)memp->pcw_hostmem, memp->pcw_len);
3496 #endif
3497 
3498 	/* window must be enabled */
3499 	if (!(memp->pcw_status & PCW_ENABLED))
3500 		return (BAD_ATTRIBUTE);
3501 
3502 	/* find the register set offset */
3503 	select = window * PCIC_MEM_1_OFFSET;
3504 #if defined(PCIC_DEBUG)
3505 	if (pcic_debug)
3506 		cmn_err(CE_CONT, "\tselect=%x\n", select);
3507 #endif
3508 
3509 	/*
3510 	 * now map the card's memory pages - we start with page 0
3511 	 */
3512 
3513 	which = 0;		/* assume simple case */
3514 	if (page->state & PS_ATTRIBUTE) {
3515 		which |= CARDMEM_REG_ACTIVE;
3516 		memp->pcw_status |= PCW_ATTRIBUTE;
3517 	} else {
3518 		memp->pcw_status &= ~PCW_ATTRIBUTE;
3519 	}
3520 
3521 	/*
3522 	 * if caller says Write Protect, enforce it.
3523 	 */
3524 	if (page->state & PS_WP) {
3525 		which |= CARDMEM_WRITE_PROTECT;
3526 		memp->pcw_status |= PCW_WP;
3527 	} else {
3528 		memp->pcw_status &= ~PCW_WP;
3529 	}
3530 #if defined(PCIC_DEBUG)
3531 	if (pcic_debug) {
3532 		cmn_err(CE_CONT, "\tmemory type = %s\n",
3533 			(which & CARDMEM_REG_ACTIVE) ? "attribute" : "common");
3534 		if (which & CARDMEM_WRITE_PROTECT)
3535 			cmn_err(CE_CONT, "\twrite protect\n");
3536 		cmn_err(CE_CONT, "\tpage offset=%x pcw_base=%x (%x)\n",
3537 			(unsigned)page->offset,
3538 			(unsigned)memp->pcw_base,
3539 			(int)page->offset - (int)memp->pcw_base & 0xffffff);
3540 	}
3541 #endif
3542 	/* address computation based on 64MB range and not larger */
3543 	base = (uint32_t)memp->pcw_base & 0x3ffffff;
3544 	pcic_putb(pcic, socket, PCIC_CARDMEM_0_LOW + select,
3545 	    CARDMEM_LOW((int)page->offset - (int)base));
3546 	(void) pcic_getb(pcic, socket, PCIC_CARDMEM_0_LOW + select);
3547 	pcic_putb(pcic, socket, PCIC_CARDMEM_0_HI + select,
3548 	    CARDMEM_HIGH((int)page->offset - base) | which);
3549 	(void) pcic_getb(pcic, socket, PCIC_CARDMEM_0_HI + select);
3550 
3551 	/*
3552 	 * while not really necessary, this just makes sure
3553 	 * nothing turned the window off behind our backs
3554 	 */
3555 	which = pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE);
3556 	which |= SYSMEM_WINDOW(window);
3557 	pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, which);
3558 	(void) pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE);
3559 
3560 	memp->pcw_offset = (off_t)page->offset;
3561 
3562 #if defined(PCIC_DEBUG)
3563 	if (pcic_debug) {
3564 		cmn_err(CE_CONT, "\tbase=%p, *base=%x\n",
3565 			(void *)memp->pcw_hostmem,
3566 			(uint32_t)*memp->pcw_hostmem);
3567 
3568 		xxdmp_all_regs(pcic, socket, -1);
3569 
3570 		cmn_err(CE_CONT, "\tbase=%p, *base=%x\n",
3571 			(void *)memp->pcw_hostmem,
3572 			(uint32_t)*memp->pcw_hostmem);
3573 	}
3574 #endif
3575 
3576 	if (which & PCW_ATTRIBUTE)
3577 		pcic_mswait(pcic, socket, 2);
3578 
3579 	mutex_exit(&pcic->pc_lock);
3580 
3581 	return (SUCCESS);
3582 }
3583 
3584 /*
3585  * pcic_set_vcc_level()
3586  *
3587  *	set voltage based on adapter information
3588  *
3589  *	this routine implements a limited solution for support of 3.3v cards.
3590  *	the general solution, which would fully support the pcmcia spec
3591  *	as far as allowing client drivers to request which voltage levels
3592  *	to be set, requires more framework support and driver changes - ess
3593  */
3594 static int
3595 pcic_set_vcc_level(pcicdev_t *pcic, set_socket_t *socket)
3596 {
3597 	uint32_t socket_present_state;
3598 
3599 #if defined(PCIC_DEBUG)
3600 	if (pcic_debug) {
3601 		cmn_err(CE_CONT,
3602 			"pcic_set_vcc_level(pcic=%p, VccLevel=%d)\n",
3603 			(void *)pcic, socket->VccLevel);
3604 	}
3605 #endif
3606 
3607 	/*
3608 	 * check VccLevel
3609 	 * if this is zero, power is being turned off
3610 	 * if it is non-zero, power is being turned on.
3611 	 */
3612 	if (socket->VccLevel == 0) {
3613 		return (0);
3614 	}
3615 
3616 	/*
3617 	 * range checking for sanity's sake
3618 	 */
3619 	if (socket->VccLevel >= pcic->pc_numpower) {
3620 		return (BAD_VCC);
3621 	}
3622 
3623 	switch (pcic->pc_io_type) {
3624 	/*
3625 	 * Yenta-compliant adapters have vcc info in the extended registers
3626 	 * Other adapters can be added as needed, but the 'default' case
3627 	 * has been left as it was previously so as not to break existing
3628 	 * adapters.
3629 	 */
3630 	case PCIC_IO_TYPE_YENTA:
3631 		/*
3632 		 * Here we ignore the VccLevel passed in and read the
3633 		 * card type from the adapter socket present state register
3634 		 */
3635 		socket_present_state =
3636 			ddi_get32(pcic->handle, (uint32_t *)(pcic->ioaddr +
3637 				PCIC_PRESENT_STATE_REG));
3638 #if defined(PCIC_DEBUG)
3639 		if (pcic_debug) {
3640 			cmn_err(CE_CONT,
3641 				"socket present state = 0x%x\n",
3642 				socket_present_state);
3643 		}
3644 #endif
3645 		switch (socket_present_state & PCIC_VCC_MASK) {
3646 			case PCIC_VCC_3VCARD:
3647 				/* fall through */
3648 			case PCIC_VCC_3VCARD|PCIC_VCC_5VCARD:
3649 				socket->VccLevel = PCIC_VCC_3VLEVEL;
3650 				return
3651 				    (POWER_3VCARD_ENABLE|POWER_OUTPUT_ENABLE);
3652 			case PCIC_VCC_5VCARD:
3653 				socket->VccLevel = PCIC_VCC_5VLEVEL;
3654 				return
3655 				    (POWER_CARD_ENABLE|POWER_OUTPUT_ENABLE);
3656 			default:
3657 				/*
3658 				 * if no card is present, this can be the
3659 				 * case of a client making a SetSocket call
3660 				 * after card removal. In this case we return
3661 				 * the current power level
3662 				 */
3663 				return ((unsigned)ddi_get8(pcic->handle,
3664 				    pcic->ioaddr + CB_R2_OFFSET +
3665 					PCIC_POWER_CONTROL));
3666 		}
3667 
3668 	default:
3669 
3670 		switch (socket->VccLevel) {
3671 		case PCIC_VCC_3VLEVEL:
3672 			return (BAD_VCC);
3673 		case PCIC_VCC_5VLEVEL:
3674 			/* enable Vcc */
3675 			return (POWER_CARD_ENABLE|POWER_OUTPUT_ENABLE);
3676 		default:
3677 			return (BAD_VCC);
3678 		}
3679 	}
3680 }
3681 
3682 
3683 /*
3684  * pcic_set_socket()
3685  *	Socket Services SetSocket call
3686  *	sets basic socket configuration
3687  */
3688 static int
3689 pcic_set_socket(dev_info_t *dip, set_socket_t *socket)
3690 {
3691 	anp_t *anp = ddi_get_driver_private(dip);
3692 	pcicdev_t *pcic = anp->an_private;
3693 	pcic_socket_t *sockp = &pcic->pc_sockets[socket->socket];
3694 	int irq, interrupt, mirq;
3695 	int powerlevel = 0;
3696 	int ind, value, orig_pwrctl;
3697 
3698 #if defined(PCIC_DEBUG)
3699 	if (pcic_debug) {
3700 		cmn_err(CE_CONT,
3701 		    "pcic_set_socket(dip=%p, socket=%d)"
3702 		    " Vcc=%d Vpp1=%d Vpp2=%d\n", (void *)dip,
3703 		    socket->socket, socket->VccLevel, socket->Vpp1Level,
3704 		    socket->Vpp2Level);
3705 	}
3706 #endif
3707 	/*
3708 	 * check VccLevel, etc. before setting mutex
3709 	 * if this is zero, power is being turned off
3710 	 * if it is non-zero, power is being turned on.
3711 	 * the default case is to assume Vcc only.
3712 	 */
3713 
3714 	/* this appears to be very implementation specific */
3715 
3716 	if (socket->Vpp1Level != socket->Vpp2Level)
3717 		return (BAD_VPP);
3718 
3719 	if (socket->VccLevel == 0 || !(sockp->pcs_flags & PCS_CARD_PRESENT)) {
3720 		powerlevel = 0;
3721 		sockp->pcs_vcc = 0;
3722 		sockp->pcs_vpp1 = 0;
3723 		sockp->pcs_vpp2 = 0;
3724 	} else {
3725 #if defined(PCIC_DEBUG)
3726 		pcic_err(dip, 9, "\tVcc=%d Vpp1Level=%d, Vpp2Level=%d\n",
3727 		    socket->VccLevel, socket->Vpp1Level, socket->Vpp2Level);
3728 #endif
3729 		/* valid Vcc power level? */
3730 		if (socket->VccLevel >= pcic->pc_numpower)
3731 			return (BAD_VCC);
3732 
3733 		switch (pcic_power[socket->VccLevel].PowerLevel) {
3734 		case 33:	/* 3.3V */
3735 		case 60:	/* for bad CIS in Option GPRS card */
3736 			if (!(pcic->pc_flags & PCF_33VCAP)) {
3737 				cmn_err(CE_WARN,
3738 				    "%s%d: Bad Request for 3.3V "
3739 				    "(Controller incapable)\n",
3740 				    ddi_get_name(pcic->dip),
3741 				    ddi_get_instance(pcic->dip));
3742 				return (BAD_VCC);
3743 			}
3744 			/* FALLTHROUGH */
3745 		case 50:	/* 5V */
3746 			if ((pcic->pc_io_type == PCIC_IO_TYPE_YENTA) &&
3747 			    pcic_getcb(pcic, CB_PRESENT_STATE) &
3748 			    CB_PS_33VCARD) {
3749 				/*
3750 				 * This is actually a 3.3V card.
3751 				 * Solaris Card Services
3752 				 * doesn't understand 3.3V
3753 				 * so we cheat and change
3754 				 * the setting to the one appropriate to 3.3V.
3755 				 * Note that this is the entry number
3756 				 * in the pcic_power[] array.
3757 				 */
3758 				sockp->pcs_vcc = PCIC_VCC_3VLEVEL;
3759 			} else
3760 				sockp->pcs_vcc = socket->VccLevel;
3761 			break;
3762 		default:
3763 			return (BAD_VCC);
3764 		}
3765 
3766 		/* enable Vcc */
3767 		powerlevel = POWER_CARD_ENABLE;
3768 
3769 #if defined(PCIC_DEBUG)
3770 		if (pcic_debug) {
3771 			cmn_err(CE_CONT, "\tVcc=%d powerlevel=%x\n",
3772 			    socket->VccLevel, powerlevel);
3773 		}
3774 #endif
3775 		ind = 0;		/* default index to 0 power */
3776 		if ((int)socket->Vpp1Level >= 0 &&
3777 		    socket->Vpp1Level < pcic->pc_numpower) {
3778 			if (!(pcic_power[socket->Vpp1Level].ValidSignals
3779 			    & VPP1)) {
3780 				return (BAD_VPP);
3781 			}
3782 			ind = pcic_power[socket->Vpp1Level].PowerLevel/10;
3783 			powerlevel |= pcic_vpp_levels[ind];
3784 			sockp->pcs_vpp1 = socket->Vpp1Level;
3785 		}
3786 		if ((int)socket->Vpp2Level >= 0 &&
3787 		    socket->Vpp2Level < pcic->pc_numpower) {
3788 			if (!(pcic_power[socket->Vpp2Level].ValidSignals
3789 			    & VPP2)) {
3790 				return (BAD_VPP);
3791 			}
3792 			ind = pcic_power[socket->Vpp2Level].PowerLevel/10;
3793 			powerlevel |= (pcic_vpp_levels[ind] << 2);
3794 			sockp->pcs_vpp2 = socket->Vpp2Level;
3795 		}
3796 
3797 		if (pcic->pc_flags & PCF_VPPX) {
3798 			/*
3799 			 * this adapter doesn't allow separate Vpp1/Vpp2
3800 			 * if one is turned on, both are turned on and only
3801 			 * the Vpp1 bits should be set
3802 			 */
3803 			if (sockp->pcs_vpp2 != sockp->pcs_vpp1) {
3804 				/* must be the same if one not zero */
3805 				if (sockp->pcs_vpp1 != 0 &&
3806 				    sockp->pcs_vpp2 != 0) {
3807 					cmn_err(CE_WARN,
3808 					    "%s%d: Bad Power Request "
3809 					    "(Vpp1/2 not the same)\n",
3810 					    ddi_get_name(pcic->dip),
3811 					    ddi_get_instance(pcic->dip));
3812 					return (BAD_VPP);
3813 				}
3814 			}
3815 			powerlevel &= ~(3<<2);
3816 		}
3817 
3818 #if defined(PCIC_DEBUG)
3819 		if (pcic_debug) {
3820 			cmn_err(CE_CONT, "\tpowerlevel=%x, ind=%x\n",
3821 			    powerlevel, ind);
3822 		}
3823 #endif
3824 	}
3825 	mutex_enter(&pcic->pc_lock); /* protect the registers */
3826 
3827 	/* turn socket->IREQRouting off while programming */
3828 	interrupt = pcic_getb(pcic, socket->socket, PCIC_INTERRUPT);
3829 	interrupt &= ~PCIC_INTR_MASK;
3830 	if (pcic->pc_flags & PCF_USE_SMI)
3831 		interrupt |= PCIC_INTR_ENABLE;
3832 	pcic_putb(pcic, socket->socket, PCIC_INTERRUPT, interrupt);
3833 
3834 	switch (pcic->pc_type) {
3835 	    case PCIC_INTEL_i82092:
3836 		pcic_82092_smiirq_ctl(pcic, socket->socket, PCIC_82092_CTL_IRQ,
3837 						PCIC_82092_INT_DISABLE);
3838 		break;
3839 	    default:
3840 		break;
3841 	} /* switch */
3842 
3843 	/* the SCIntMask specifies events to detect */
3844 	mirq = pcic_getb(pcic, socket->socket, PCIC_MANAGEMENT_INT);
3845 
3846 #if defined(PCIC_DEBUG)
3847 	if (pcic_debug)
3848 		cmn_err(CE_CONT,
3849 			"\tSCIntMask=%x, interrupt=%x, mirq=%x\n",
3850 			socket->SCIntMask, interrupt, mirq);
3851 #endif
3852 	mirq &= ~(PCIC_BD_DETECT|PCIC_BW_DETECT|PCIC_RD_DETECT);
3853 	pcic_putb(pcic, socket->socket, PCIC_MANAGEMENT_INT,
3854 	    mirq & ~PCIC_CHANGE_MASK);
3855 
3856 	/* save the mask we want to use */
3857 	sockp->pcs_intmask = socket->SCIntMask;
3858 
3859 	/*
3860 	 * Until there is a card present it's not worth enabling
3861 	 * any interrupts except "Card detect". This is done
3862 	 * elsewhere in the driver so don't change things if
3863 	 * there is no card!
3864 	 */
3865 	if (sockp->pcs_flags & PCS_CARD_PRESENT) {
3866 
3867 		/* now update the hardware to reflect events desired */
3868 		if (sockp->pcs_intmask & SBM_BVD1 || socket->IFType == IF_IO)
3869 			mirq |= PCIC_BD_DETECT;
3870 
3871 		if (sockp->pcs_intmask & SBM_BVD2)
3872 			mirq |= PCIC_BW_DETECT;
3873 
3874 		if (sockp->pcs_intmask & SBM_RDYBSY)
3875 			mirq |= PCIC_RD_DETECT;
3876 
3877 		if (sockp->pcs_intmask & SBM_CD)
3878 			mirq |= PCIC_CD_DETECT;
3879 	}
3880 
3881 	if (sockp->pcs_flags & PCS_READY) {
3882 		/*
3883 		 * card just came ready.
3884 		 * make sure enough time elapses
3885 		 * before touching it.
3886 		 */
3887 		sockp->pcs_flags &= ~PCS_READY;
3888 		pcic_mswait(pcic, socket->socket, 10);
3889 	}
3890 
3891 #if defined(PCIC_DEBUG)
3892 	if (pcic_debug) {
3893 		cmn_err(CE_CONT, "\tstatus change set to %x\n", mirq);
3894 	}
3895 #endif
3896 
3897 	switch (pcic->pc_type) {
3898 	    case PCIC_I82365SL:
3899 	    case PCIC_VADEM:
3900 	    case PCIC_VADEM_VG469:
3901 		/*
3902 		 * The Intel version has different options. This is a
3903 		 * special case of GPI which might be used for eject
3904 		 */
3905 
3906 		irq = pcic_getb(pcic, socket->socket, PCIC_CARD_DETECT);
3907 		if (sockp->pcs_intmask & (SBM_EJECT|SBM_INSERT) &&
3908 		    pcic->pc_flags & PCF_GPI_EJECT) {
3909 			irq |= PCIC_GPI_ENABLE;
3910 		} else {
3911 			irq &= ~PCIC_GPI_ENABLE;
3912 		}
3913 		pcic_putb(pcic, socket->socket, PCIC_CARD_DETECT, irq);
3914 		break;
3915 	    case PCIC_CL_PD6710:
3916 	    case PCIC_CL_PD6722:
3917 		if (socket->IFType == IF_IO) {
3918 			pcic_putb(pcic, socket->socket, PCIC_MISC_CTL_2, 0x0);
3919 			value = pcic_getb(pcic, socket->socket,
3920 						PCIC_MISC_CTL_1);
3921 			if (pcic->pc_flags & PCF_AUDIO)
3922 				value |= PCIC_MC_SPEAKER_ENB;
3923 			pcic_putb(pcic, socket->socket, PCIC_MISC_CTL_1,
3924 					value);
3925 		} else {
3926 			value = pcic_getb(pcic, socket->socket,
3927 						PCIC_MISC_CTL_1);
3928 			value &= ~PCIC_MC_SPEAKER_ENB;
3929 			pcic_putb(pcic, socket->socket, PCIC_MISC_CTL_1,
3930 					value);
3931 		}
3932 		break;
3933 	    case PCIC_CL_PD6729:
3934 	    case PCIC_CL_PD6730:
3935 	    case PCIC_CL_PD6832:
3936 		value = pcic_getb(pcic, socket->socket, PCIC_MISC_CTL_1);
3937 		if ((socket->IFType == IF_IO) && (pcic->pc_flags & PCF_AUDIO)) {
3938 		    value |= PCIC_MC_SPEAKER_ENB;
3939 		} else {
3940 		    value &= ~PCIC_MC_SPEAKER_ENB;
3941 		}
3942 
3943 		if (pcic_power[sockp->pcs_vcc].PowerLevel == 33)
3944 			value |= PCIC_MC_3VCC;
3945 		else
3946 			value &= ~PCIC_MC_3VCC;
3947 
3948 		pcic_putb(pcic, socket->socket, PCIC_MISC_CTL_1, value);
3949 		break;
3950 
3951 	    case PCIC_O2_OZ6912:
3952 		value = pcic_getcb(pcic, CB_MISCCTRL);
3953 		if ((socket->IFType == IF_IO) && (pcic->pc_flags & PCF_AUDIO))
3954 			value |= (1<<25);
3955 		else
3956 			value &= ~(1<<25);
3957 		pcic_putcb(pcic, CB_MISCCTRL, value);
3958 		if (pcic_power[sockp->pcs_vcc].PowerLevel == 33)
3959 			powerlevel |= 0x08;
3960 		break;
3961 
3962 	    case PCIC_TI_PCI1250:
3963 	    case PCIC_TI_PCI1221:
3964 	    case PCIC_TI_PCI1225:
3965 	    case PCIC_TI_PCI1410:
3966 	    case PCIC_ENE_1410:
3967 	    case PCIC_TI_PCI1510:
3968 	    case PCIC_TI_PCI1520:
3969 	    case PCIC_TI_PCI1420:
3970 	    case PCIC_ENE_1420:
3971 		value = ddi_get8(pcic->cfg_handle,
3972 		    pcic->cfgaddr + PCIC_CRDCTL_REG);
3973 		if ((socket->IFType == IF_IO) && (pcic->pc_flags & PCF_AUDIO)) {
3974 			value |= PCIC_CRDCTL_SPKR_ENBL;
3975 		} else {
3976 			value &= ~PCIC_CRDCTL_SPKR_ENBL;
3977 		}
3978 		ddi_put8(pcic->cfg_handle,
3979 		    pcic->cfgaddr + PCIC_CRDCTL_REG, value);
3980 		if (pcic_power[sockp->pcs_vcc].PowerLevel == 33)
3981 			powerlevel |= 0x08;
3982 		break;
3983 	}
3984 
3985 	/*
3986 	 * ctlind processing -- we can ignore this
3987 	 * there aren't any outputs on the chip for this and
3988 	 * the GUI will display what it thinks is correct
3989 	 */
3990 
3991 	/*
3992 	 * If outputs are enabled and the power is going off
3993 	 * turn off outputs first.
3994 	 */
3995 
3996 	/* power setup -- if necessary */
3997 	orig_pwrctl = pcic_getb(pcic, socket->socket, PCIC_POWER_CONTROL);
3998 	if ((orig_pwrctl & POWER_OUTPUT_ENABLE) && sockp->pcs_vcc == 0) {
3999 		orig_pwrctl &= ~POWER_OUTPUT_ENABLE;
4000 		pcic_putb(pcic, socket->socket,
4001 		    PCIC_POWER_CONTROL, orig_pwrctl);
4002 		(void) pcic_getb(pcic, socket->socket, PCIC_POWER_CONTROL);
4003 	}
4004 
4005 	if (pcic->pc_flags & PCF_CBPWRCTL) {
4006 		value = pcic_cbus_powerctl(pcic, socket->socket);
4007 		powerlevel = 0;
4008 	} else
4009 		value = pcic_exca_powerctl(pcic, socket->socket, powerlevel);
4010 
4011 	if (value != SUCCESS) {
4012 		mutex_exit(&pcic->pc_lock);
4013 		return (value);
4014 	}
4015 
4016 	/*
4017 	 * If outputs were disabled and the power is going on
4018 	 * turn on outputs afterwards.
4019 	 */
4020 	if (!(orig_pwrctl & POWER_OUTPUT_ENABLE) && sockp->pcs_vcc != 0) {
4021 		orig_pwrctl = pcic_getb(pcic, socket->socket,
4022 		    PCIC_POWER_CONTROL);
4023 		orig_pwrctl |= POWER_OUTPUT_ENABLE;
4024 		pcic_putb(pcic, socket->socket,
4025 		    PCIC_POWER_CONTROL, orig_pwrctl);
4026 		(void) pcic_getb(pcic, socket->socket, PCIC_POWER_CONTROL);
4027 	}
4028 
4029 	/*
4030 	 * Once we have done the power stuff can re-enable management
4031 	 * interrupts.
4032 	 */
4033 	pcic_putb(pcic, socket->socket, PCIC_MANAGEMENT_INT, mirq);
4034 
4035 #if defined(PCIC_DEBUG)
4036 	pcic_err(dip, 8, "\tmanagement int set to %x pwrctl to 0x%x "
4037 	    "cbctl 0x%x\n",
4038 	    mirq, pcic_getb(pcic, socket->socket, PCIC_POWER_CONTROL),
4039 	    pcic_getcb(pcic, CB_CONTROL));
4040 #endif
4041 
4042 	/* irq processing */
4043 	if (socket->IFType == IF_IO) {
4044 		/* IRQ only for I/O */
4045 		irq = socket->IREQRouting & PCIC_INTR_MASK;
4046 		value = pcic_getb(pcic, socket->socket, PCIC_INTERRUPT);
4047 		value &= ~PCIC_INTR_MASK;
4048 
4049 		/* to enable I/O operation */
4050 		value |= PCIC_IO_CARD | PCIC_RESET;
4051 		sockp->pcs_flags |= PCS_CARD_IO;
4052 		if (irq != sockp->pcs_irq) {
4053 			if (sockp->pcs_irq != 0)
4054 				cmn_err(CE_CONT,
4055 					"SetSocket: IRQ mismatch %x != %x!\n",
4056 					irq, sockp->pcs_irq);
4057 			else
4058 				sockp->pcs_irq = irq;
4059 		}
4060 		irq = sockp->pcs_irq;
4061 
4062 		pcic_putb(pcic, socket->socket, PCIC_INTERRUPT, value);
4063 		if (socket->IREQRouting & IRQ_ENABLE) {
4064 			pcic_enable_io_intr(pcic, socket->socket, irq);
4065 			sockp->pcs_flags |= PCS_IRQ_ENABLED;
4066 		} else {
4067 			pcic_disable_io_intr(pcic, socket->socket);
4068 			sockp->pcs_flags &= ~PCS_IRQ_ENABLED;
4069 		}
4070 #if defined(PCIC_DEBUG)
4071 		if (pcic_debug) {
4072 			cmn_err(CE_CONT,
4073 				"\tsocket type is I/O and irq %x is %s\n", irq,
4074 				(socket->IREQRouting & IRQ_ENABLE) ?
4075 				"enabled" : "not enabled");
4076 			xxdmp_all_regs(pcic, socket->socket, 20);
4077 		}
4078 #endif
4079 	} else {
4080 		/* make sure I/O mode is off */
4081 
4082 		sockp->pcs_irq = 0;
4083 
4084 		value = pcic_getb(pcic, socket->socket, PCIC_INTERRUPT);
4085 		value &= ~PCIC_IO_CARD;
4086 		pcic_putb(pcic, socket->socket, PCIC_INTERRUPT, value);
4087 		pcic_disable_io_intr(pcic, socket->socket);
4088 		sockp->pcs_flags &= ~(PCS_CARD_IO|PCS_IRQ_ENABLED);
4089 	}
4090 
4091 	sockp->pcs_state &= ~socket->State;
4092 
4093 	mutex_exit(&pcic->pc_lock);
4094 	return (SUCCESS);
4095 }
4096 
4097 /*
4098  * pcic_inquire_socket()
4099  *	SocketServices InquireSocket function
4100  *	returns basic characteristics of the socket
4101  */
4102 /*ARGSUSED*/
4103 static int
4104 pcic_inquire_socket(dev_info_t *dip, inquire_socket_t *socket)
4105 {
4106 	anp_t *anp = ddi_get_driver_private(dip);
4107 	pcicdev_t *pcic = anp->an_private;
4108 	int value;
4109 
4110 	socket->SCIntCaps = PCIC_DEFAULT_INT_CAPS;
4111 	socket->SCRptCaps = PCIC_DEFAULT_RPT_CAPS;
4112 	socket->CtlIndCaps = PCIC_DEFAULT_CTL_CAPS;
4113 	value = pcic->pc_sockets[socket->socket].pcs_flags;
4114 	socket->SocketCaps = (value & PCS_SOCKET_IO) ? IF_IO : IF_MEMORY;
4115 	socket->ActiveHigh = 0;
4116 	/* these are the usable IRQs */
4117 	socket->ActiveLow = 0xfff0;
4118 	return (SUCCESS);
4119 }
4120 
4121 /*
4122  * pcic_inquire_window()
4123  *	SocketServices InquireWindow function
4124  *	returns detailed characteristics of the window
4125  *	this is where windows get tied to sockets
4126  */
4127 /*ARGSUSED*/
4128 static int
4129 pcic_inquire_window(dev_info_t *dip, inquire_window_t *window)
4130 {
4131 	int type, socket;
4132 
4133 	type = window->window % PCIC_NUMWINSOCK;
4134 	socket = window->window / PCIC_NUMWINSOCK;
4135 
4136 #if defined(PCIC_DEBUG)
4137 	if (pcic_debug >= 8)
4138 		cmn_err(CE_CONT,
4139 			"pcic_inquire_window: window = %d/%d socket=%d\n",
4140 			window->window, type, socket);
4141 #endif
4142 	if (type < PCIC_IOWINDOWS) {
4143 		window->WndCaps = WC_IO|WC_WAIT;
4144 		type = IF_IO;
4145 	} else {
4146 		window->WndCaps = WC_COMMON|WC_ATTRIBUTE|WC_WAIT;
4147 		type = IF_MEMORY;
4148 	}
4149 
4150 	/* initialize the socket map - one socket per window */
4151 	PR_ZERO(window->Sockets);
4152 	PR_SET(window->Sockets, socket);
4153 
4154 	if (type == IF_IO) {
4155 		iowin_char_t *io;
4156 		io = &window->iowin_char;
4157 		io->IOWndCaps = WC_BASE|WC_SIZE|WC_WENABLE|WC_8BIT|
4158 			WC_16BIT;
4159 		io->FirstByte = (baseaddr_t)IOMEM_FIRST;
4160 		io->LastByte = (baseaddr_t)IOMEM_LAST;
4161 		io->MinSize = IOMEM_MIN;
4162 		io->MaxSize = IOMEM_MAX;
4163 		io->ReqGran = IOMEM_GRAN;
4164 		io->AddrLines = IOMEM_DECODE;
4165 		io->EISASlot = 0;
4166 	} else {
4167 		mem_win_char_t *mem;
4168 		mem = &window->mem_win_char;
4169 		mem->MemWndCaps = WC_BASE|WC_SIZE|WC_WENABLE|WC_8BIT|
4170 			WC_16BIT|WC_WP;
4171 
4172 		mem->FirstByte = (baseaddr_t)MEM_FIRST;
4173 		mem->LastByte = (baseaddr_t)MEM_LAST;
4174 
4175 		mem->MinSize = MEM_MIN;
4176 		mem->MaxSize = MEM_MAX;
4177 		mem->ReqGran = PCIC_PAGE;
4178 		mem->ReqBase = 0;
4179 		mem->ReqOffset = PCIC_PAGE;
4180 		mem->Slowest = MEM_SPEED_MAX;
4181 		mem->Fastest = MEM_SPEED_MIN;
4182 	}
4183 	return (SUCCESS);
4184 }
4185 
4186 /*
4187  * pcic_get_adapter()
4188  *	SocketServices GetAdapter function
4189  *	this is nearly a no-op.
4190  */
4191 /*ARGSUSED*/
4192 static int
4193 pcic_get_adapter(dev_info_t *dip, get_adapter_t *adapt)
4194 {
4195 	anp_t *anp = ddi_get_driver_private(dip);
4196 	pcicdev_t *pcic = anp->an_private;
4197 
4198 	if (pcic->pc_flags & PCF_INTRENAB)
4199 		adapt->SCRouting = IRQ_ENABLE;
4200 	adapt->state = 0;
4201 	return (SUCCESS);
4202 }
4203 
4204 /*
4205  * pcic_get_page()
4206  *	SocketServices GetPage function
4207  *	returns info about the window
4208  */
4209 /*ARGSUSED*/
4210 static int
4211 pcic_get_page(dev_info_t *dip, get_page_t *page)
4212 {
4213 	anp_t *anp = ddi_get_driver_private(dip);
4214 	pcicdev_t *pcic = anp->an_private;
4215 	int socket, window;
4216 	pcs_memwin_t *winp;
4217 
4218 	socket = page->window / PCIC_NUMWINSOCK;
4219 	window = page->window % PCIC_NUMWINSOCK;
4220 
4221 	/* I/O windows are the first two */
4222 	if (window < PCIC_IOWINDOWS || socket >= pcic->pc_numsockets) {
4223 		return (BAD_WINDOW);
4224 	}
4225 
4226 	winp = &pcic->pc_sockets[socket].pcs_windows[window].mem;
4227 
4228 	if (page->page != 0)
4229 		return (BAD_PAGE);
4230 
4231 	page->state = 0;
4232 	if (winp->pcw_status & PCW_ENABLED)
4233 		page->state |= PS_ENABLED;
4234 	if (winp->pcw_status & PCW_ATTRIBUTE)
4235 		page->state |= PS_ATTRIBUTE;
4236 	if (winp->pcw_status & PCW_WP)
4237 		page->state |= PS_WP;
4238 
4239 	page->offset = (off_t)winp->pcw_offset;
4240 
4241 	return (SUCCESS);
4242 }
4243 
4244 /*
4245  * pcic_get_socket()
4246  *	SocketServices GetSocket
4247  *	returns information about the current socket setting
4248  */
4249 /*ARGSUSED*/
4250 static int
4251 pcic_get_socket(dev_info_t *dip, get_socket_t *socket)
4252 {
4253 	anp_t *anp = ddi_get_driver_private(dip);
4254 	pcicdev_t *pcic = anp->an_private;
4255 	int socknum, irq_enabled;
4256 	pcic_socket_t *sockp;
4257 
4258 	socknum = socket->socket;
4259 	sockp = &pcic->pc_sockets[socknum];
4260 
4261 	socket->SCIntMask = sockp->pcs_intmask;
4262 	sockp->pcs_state = pcic_card_state(pcic, sockp);
4263 
4264 	socket->state = sockp->pcs_state;
4265 	if (socket->state & SBM_CD) {
4266 		socket->VccLevel = sockp->pcs_vcc;
4267 		socket->Vpp1Level = sockp->pcs_vpp1;
4268 		socket->Vpp2Level = sockp->pcs_vpp2;
4269 		irq_enabled = (sockp->pcs_flags & PCS_IRQ_ENABLED) ?
4270 		    IRQ_ENABLE : 0;
4271 		socket->IRQRouting = sockp->pcs_irq | irq_enabled;
4272 		socket->IFType = (sockp->pcs_flags & PCS_CARD_IO) ?
4273 		    IF_IO : IF_MEMORY;
4274 	} else {
4275 		socket->VccLevel = 0;
4276 		socket->Vpp1Level = 0;
4277 		socket->Vpp2Level = 0;
4278 		socket->IRQRouting = 0;
4279 		socket->IFType = IF_MEMORY;
4280 	}
4281 	socket->CtlInd = 0;	/* no indicators */
4282 
4283 	return (SUCCESS);
4284 }
4285 
4286 /*
4287  * pcic_get_status()
4288  *	SocketServices GetStatus
4289  *	returns status information about the PC Card in
4290  *	the selected socket
4291  */
4292 /*ARGSUSED*/
4293 static int
4294 pcic_get_status(dev_info_t *dip, get_ss_status_t *status)
4295 {
4296 	anp_t *anp = ddi_get_driver_private(dip);
4297 	pcicdev_t *pcic = anp->an_private;
4298 	int socknum, irq_enabled;
4299 	pcic_socket_t *sockp;
4300 
4301 	socknum = status->socket;
4302 	sockp = &pcic->pc_sockets[socknum];
4303 
4304 	status->CardState = pcic_card_state(pcic, sockp);
4305 	status->SocketState = sockp->pcs_state;
4306 	status->CtlInd = 0;	/* no indicators */
4307 
4308 	if (sockp->pcs_flags & PCS_CARD_PRESENT)
4309 		status->SocketState |= SBM_CD;
4310 	if (status->CardState & SBM_CD) {
4311 		irq_enabled = (sockp->pcs_flags & PCS_CARD_ENABLED) ?
4312 		    IRQ_ENABLE : 0;
4313 		status->IRQRouting = sockp->pcs_irq | irq_enabled;
4314 		status->IFType = (sockp->pcs_flags & PCS_CARD_IO) ?
4315 		    IF_IO : IF_MEMORY;
4316 	} else {
4317 		status->IRQRouting = 0;
4318 		status->IFType = IF_MEMORY;
4319 	}
4320 
4321 #if defined(PCIC_DEBUG)
4322 	if (pcic_debug >= 8)
4323 		cmn_err(CE_CONT, "pcic_get_status: socket=%d, CardState=%x,"
4324 			"SocketState=%x\n",
4325 			socknum, status->CardState, status->SocketState);
4326 #endif
4327 	switch (pcic->pc_type) {
4328 	uint32_t present_state;
4329 	case PCIC_TI_PCI1410:
4330 	case PCIC_TI_PCI1520:
4331 	case PCIC_TI_PCI1420:
4332 	case PCIC_ENE_1420:
4333 	case PCIC_TOSHIBA_TOPIC100:
4334 	case PCIC_TOSHIBA_TOPIC95:
4335 	case PCIC_TOSHIBA_VENDOR:
4336 	case PCIC_O2MICRO_VENDOR:
4337 	case PCIC_TI_VENDOR:
4338 	case PCIC_RICOH_VENDOR:
4339 		present_state = pcic_getcb(pcic, CB_PRESENT_STATE);
4340 		if (present_state & PCIC_CB_CARD)
4341 			status->IFType = IF_CARDBUS;
4342 #if defined(PCIC_DEBUG)
4343 		if (pcic_debug >= 8)
4344 		    cmn_err(CE_CONT, "pcic_get_status: present_state=0x%x\n",
4345 			present_state);
4346 #endif
4347 		break;
4348 	default:
4349 		break;
4350 	}
4351 
4352 	return (SUCCESS);
4353 }
4354 
4355 /*
4356  * pcic_get_window()
4357  *	SocketServices GetWindow function
4358  *	returns state information about the specified window
4359  */
4360 /*ARGSUSED*/
4361 static int
4362 pcic_get_window(dev_info_t *dip, get_window_t *window)
4363 {
4364 	anp_t *anp = ddi_get_driver_private(dip);
4365 	pcicdev_t *pcic = anp->an_private;
4366 	int socket, win;
4367 	pcic_socket_t *sockp;
4368 	pcs_memwin_t *winp;
4369 
4370 	socket = window->window / PCIC_NUMWINSOCK;
4371 	win = window->window % PCIC_NUMWINSOCK;
4372 #if defined(PCIC_DEBUG)
4373 	if (pcic_debug) {
4374 		cmn_err(CE_CONT, "pcic_get_window(socket=%d, window=%d)\n",
4375 			socket, win);
4376 	}
4377 #endif
4378 
4379 	if (socket > pcic->pc_numsockets)
4380 		return (BAD_WINDOW);
4381 
4382 	sockp = &pcic->pc_sockets[socket];
4383 	winp = &sockp->pcs_windows[win].mem;
4384 
4385 	window->socket = socket;
4386 	window->size = winp->pcw_len;
4387 	window->speed = winp->pcw_speed;
4388 	window->handle = (ddi_acc_handle_t)winp->pcw_handle;
4389 	window->base = (uint32_t)winp->pcw_base + winp->pcw_offset;
4390 
4391 	if (win >= PCIC_IOWINDOWS) {
4392 		window->state = 0;
4393 	} else {
4394 		window->state = WS_IO;
4395 	}
4396 	if (winp->pcw_status & PCW_ENABLED)
4397 		window->state |= WS_ENABLED;
4398 
4399 	if (winp->pcw_status & PCS_CARD_16BIT)
4400 		window->state |= WS_16BIT;
4401 #if defined(PCIC_DEBUG)
4402 	if (pcic_debug)
4403 		cmn_err(CE_CONT, "\tsize=%d, speed=%d, base=%p, state=%x\n",
4404 			window->size, (unsigned)window->speed,
4405 			(void *)window->handle, window->state);
4406 #endif
4407 
4408 	return (SUCCESS);
4409 }
4410 
4411 /*
4412  * pcic_ll_reset
4413  *	low level reset
4414  *	separated out so it can be called when already locked
4415  *
4416  *	There are two variables that control the RESET timing:
4417  *		pcic_prereset_time - time in mS before asserting RESET
4418  *		pcic_reset_time - time in mS to assert RESET
4419  *
4420  */
4421 int pcic_prereset_time = 1;
4422 int pcic_reset_time = 10;
4423 int pcic_postreset_time = 20;
4424 int pcic_vpp_is_vcc_during_reset = 0;
4425 
4426 static int
4427 pcic_ll_reset(pcicdev_t *pcic, int socket)
4428 {
4429 	int windowbits, iobits;
4430 	uint32_t pwr;
4431 
4432 	/* save windows that were on */
4433 	windowbits = pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE);
4434 	if (pcic_reset_time == 0)
4435 	    return (windowbits);
4436 	/* turn all windows off */
4437 	pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, 0);
4438 
4439 #if defined(PCIC_DEBUG)
4440 	pcic_err(pcic->dip, 6,
4441 		"pcic_ll_reset(socket %d) powerlevel=%x cbctl 0x%x cbps 0x%x\n",
4442 		socket, pcic_getb(pcic, socket, PCIC_POWER_CONTROL),
4443 		pcic_getcb(pcic, CB_CONTROL),
4444 		pcic_getcb(pcic, CB_PRESENT_STATE));
4445 #endif
4446 
4447 	if (pcic_vpp_is_vcc_during_reset) {
4448 
4449 	/*
4450 	 * Set VPP to VCC for the duration of the reset - for aironet
4451 	 * card.
4452 	 */
4453 	    if (pcic->pc_flags & PCF_CBPWRCTL) {
4454 		pwr = pcic_getcb(pcic, CB_CONTROL);
4455 		pcic_putcb(pcic, CB_CONTROL, (pwr&~CB_C_VPPMASK)|CB_C_VPPVCC);
4456 		(void) pcic_getcb(pcic, CB_CONTROL);
4457 	    } else {
4458 		pwr = pcic_getb(pcic, socket, PCIC_POWER_CONTROL);
4459 		pcic_putb(pcic, socket, PCIC_POWER_CONTROL,
4460 		    pwr | 1);
4461 		(void) pcic_getb(pcic, socket, PCIC_POWER_CONTROL);
4462 	    }
4463 	}
4464 
4465 	if (pcic_prereset_time > 0) {
4466 		pcic_err(pcic->dip, 8, "pcic_ll_reset pre_wait %d mS\n",
4467 		    pcic_prereset_time);
4468 		pcic_mswait(pcic, socket, pcic_prereset_time);
4469 	}
4470 
4471 	/* turn interrupts off and start a reset */
4472 	pcic_err(pcic->dip, 8,
4473 		"pcic_ll_reset turn interrupts off and start a reset\n");
4474 	iobits = pcic_getb(pcic, socket, PCIC_INTERRUPT);
4475 	iobits &= ~(PCIC_INTR_MASK | PCIC_RESET);
4476 	pcic_putb(pcic, socket, PCIC_INTERRUPT, iobits);
4477 	(void) pcic_getb(pcic, socket, PCIC_INTERRUPT);
4478 
4479 	switch (pcic->pc_type) {
4480 	    case PCIC_INTEL_i82092:
4481 		pcic_82092_smiirq_ctl(pcic, socket, PCIC_82092_CTL_IRQ,
4482 						PCIC_82092_INT_DISABLE);
4483 		break;
4484 	    default:
4485 		break;
4486 	} /* switch */
4487 
4488 	pcic->pc_sockets[socket].pcs_state = 0;
4489 
4490 	if (pcic_reset_time > 0) {
4491 		pcic_err(pcic->dip, 8, "pcic_ll_reset reset_wait %d mS\n",
4492 		    pcic_reset_time);
4493 		pcic_mswait(pcic, socket, pcic_reset_time);
4494 	}
4495 
4496 	pcic_err(pcic->dip, 8, "pcic_ll_reset take it out of reset now\n");
4497 
4498 	/* take it out of RESET now */
4499 	pcic_putb(pcic, socket, PCIC_INTERRUPT, PCIC_RESET | iobits);
4500 	(void) pcic_getb(pcic, socket, PCIC_INTERRUPT);
4501 
4502 	/*
4503 	 * can't access the card for 20ms, but we really don't
4504 	 * want to sit around that long. The pcic is still usable.
4505 	 * memory accesses must wait for RDY to come up.
4506 	 */
4507 	if (pcic_postreset_time > 0) {
4508 		pcic_err(pcic->dip, 8, "pcic_ll_reset post_wait %d mS\n",
4509 		    pcic_postreset_time);
4510 		pcic_mswait(pcic, socket, pcic_postreset_time);
4511 	}
4512 
4513 	if (pcic_vpp_is_vcc_during_reset > 1) {
4514 
4515 	/*
4516 	 * Return VPP power to whatever it was before.
4517 	 */
4518 	    if (pcic->pc_flags & PCF_CBPWRCTL) {
4519 		pcic_putcb(pcic, CB_CONTROL, pwr);
4520 		(void) pcic_getcb(pcic, CB_CONTROL);
4521 	    } else {
4522 		pcic_putb(pcic, socket, PCIC_POWER_CONTROL, pwr);
4523 		(void) pcic_getb(pcic, socket, PCIC_POWER_CONTROL);
4524 	    }
4525 	}
4526 
4527 	pcic_err(pcic->dip, 7, "pcic_ll_reset returning 0x%x\n", windowbits);
4528 
4529 	return (windowbits);
4530 }
4531 
4532 /*
4533  * pcic_reset_socket()
4534  *	SocketServices ResetSocket function
4535  *	puts the PC Card in the socket into the RESET state
4536  *	and then takes it out after the the cycle time
4537  *	The socket is back to initial state when done
4538  */
4539 static int
4540 pcic_reset_socket(dev_info_t *dip, int socket, int mode)
4541 {
4542 	anp_t *anp = ddi_get_driver_private(dip);
4543 	pcicdev_t *pcic = anp->an_private;
4544 	int value;
4545 	int i, mint;
4546 	pcic_socket_t *sockp;
4547 
4548 #if defined(PCIC_DEBUG)
4549 	if (pcic_debug >= 8)
4550 		cmn_err(CE_CONT, "pcic_reset_socket(%p, %d, %d/%s)\n",
4551 		    (void *)dip, socket, mode,
4552 			mode == RESET_MODE_FULL ? "full" : "partial");
4553 #endif
4554 
4555 	mutex_enter(&pcic->pc_lock); /* protect the registers */
4556 
4557 	/* Turn off management interupts. */
4558 	mint = pcic_getb(pcic, socket, PCIC_MANAGEMENT_INT);
4559 	pcic_putb(pcic, socket, PCIC_MANAGEMENT_INT, mint & ~PCIC_CHANGE_MASK);
4560 
4561 	sockp = &pcic->pc_sockets[socket];
4562 
4563 	value = pcic_ll_reset(pcic, socket);
4564 	if (mode == RESET_MODE_FULL) {
4565 		/* disable and unmap all mapped windows */
4566 		for (i = 0; i < PCIC_NUMWINSOCK; i++) {
4567 			if (i < PCIC_IOWINDOWS) {
4568 				if (sockp->pcs_windows[i].io.pcw_status &
4569 				    PCW_MAPPED) {
4570 					pcs_iowin_t *io;
4571 					io = &sockp->pcs_windows[i].io;
4572 					io->pcw_status &= ~PCW_ENABLED;
4573 				}
4574 			} else {
4575 				if (sockp->pcs_windows[i].mem.pcw_status &
4576 				    PCW_MAPPED) {
4577 					pcs_memwin_t *mem;
4578 					mem = &sockp->pcs_windows[i].mem;
4579 					mem->pcw_status &= ~PCW_ENABLED;
4580 				}
4581 			}
4582 		}
4583 	} else {
4584 				/* turn windows back on */
4585 		pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, value);
4586 		/* wait the rest of the time here */
4587 		pcic_mswait(pcic, socket, 10);
4588 	}
4589 	pcic_putb(pcic, socket, PCIC_MANAGEMENT_INT, mint);
4590 	mutex_exit(&pcic->pc_lock);
4591 	return (SUCCESS);
4592 }
4593 
4594 /*
4595  * pcic_set_interrupt()
4596  *	SocketServices SetInterrupt function
4597  */
4598 static int
4599 pcic_set_interrupt(dev_info_t *dip, set_irq_handler_t *handler)
4600 {
4601 	anp_t *anp = ddi_get_driver_private(dip);
4602 	pcicdev_t *pcic = anp->an_private;
4603 	int value = DDI_SUCCESS;
4604 	inthandler_t *intr;
4605 
4606 #if defined(PCIC_DEBUG)
4607 	if (pcic_debug) {
4608 		cmn_err(CE_CONT,
4609 			"pcic_set_interrupt: entered pc_intr_mode=0x%x\n",
4610 			pcic->pc_intr_mode);
4611 		cmn_err(CE_CONT,
4612 			"\t irq_top=%p handler=%p handler_id=%x\n",
4613 			(void *)pcic->irq_top, (void *)handler->handler,
4614 			handler->handler_id);
4615 	}
4616 #endif
4617 
4618 	/*
4619 	 * If we're on a PCI bus, we route all IO IRQs through a single
4620 	 *	PCI interrupt (typically INT A#) so we don't have to do
4621 	 *	much other than add the caller to general interrupt handler
4622 	 *	and set some state.
4623 	 */
4624 
4625 	intr = kmem_zalloc(sizeof (inthandler_t), KM_NOSLEEP);
4626 	if (intr == NULL)
4627 		return (NO_RESOURCE);
4628 
4629 	switch (pcic->pc_intr_mode) {
4630 	case PCIC_INTR_MODE_PCI_1:
4631 		/*
4632 		 * We only allow above-lock-level IO IRQ handlers
4633 		 *	in the PCI bus case.
4634 		 */
4635 
4636 		mutex_enter(&pcic->intr_lock);
4637 
4638 		if (pcic->irq_top == NULL) {
4639 		    pcic->irq_top = intr;
4640 		    pcic->irq_current = pcic->irq_top;
4641 		} else {
4642 		    while (pcic->irq_current->next != NULL)
4643 			pcic->irq_current = pcic->irq_current->next;
4644 		    pcic->irq_current->next = intr;
4645 		    pcic->irq_current = pcic->irq_current->next;
4646 		}
4647 
4648 		pcic->irq_current->intr =
4649 		    (ddi_intr_handler_t *)handler->handler;
4650 		pcic->irq_current->handler_id = handler->handler_id;
4651 		pcic->irq_current->arg1 = handler->arg1;
4652 		pcic->irq_current->arg2 = handler->arg2;
4653 		pcic->irq_current->socket = handler->socket;
4654 
4655 		mutex_exit(&pcic->intr_lock);
4656 
4657 		handler->iblk_cookie = &pcic->pc_pri;
4658 		handler->idev_cookie = &pcic->pc_dcookie;
4659 		break;
4660 
4661 	default:
4662 		intr->intr = (ddi_intr_handler_t *)handler->handler;
4663 		intr->handler_id = handler->handler_id;
4664 		intr->arg1 = handler->arg1;
4665 		intr->arg2 = handler->arg2;
4666 		intr->socket = handler->socket;
4667 		intr->irq = handler->irq;
4668 
4669 		/*
4670 		 * need to revisit this to see if interrupts can be
4671 		 * shared someday. Note that IRQ is set in the common
4672 		 * code.
4673 		 */
4674 		mutex_enter(&pcic->pc_lock);
4675 		if (pcic->pc_handlers == NULL) {
4676 			pcic->pc_handlers = intr;
4677 			intr->next = intr->prev = intr;
4678 		} else {
4679 			insque(intr, pcic->pc_handlers);
4680 		}
4681 		mutex_exit(&pcic->pc_lock);
4682 
4683 		break;
4684 	}
4685 
4686 	/*
4687 	 * need to fill in cookies in event of multiple high priority
4688 	 * interrupt handlers on same IRQ
4689 	 */
4690 
4691 #if defined(PCIC_DEBUG)
4692 	if (pcic_debug) {
4693 		cmn_err(CE_CONT,
4694 			"pcic_set_interrupt: exit irq_top=%p value=%d\n",
4695 			(void *)pcic->irq_top, value);
4696 	}
4697 #endif
4698 
4699 	if (value == DDI_SUCCESS) {
4700 		return (SUCCESS);
4701 	} else {
4702 		return (BAD_IRQ);
4703 	}
4704 }
4705 
4706 /*
4707  * pcic_clear_interrupt()
4708  *	SocketServices ClearInterrupt function
4709  *
4710  *	Interrupts for PCIC are complicated by the fact that we must
4711  *	follow several different models for interrupts.
4712  *	ISA: there is an interrupt per adapter and per socket and
4713  *		they can't be shared.
4714  *	PCI: some adapters have one PCI interrupt available while others
4715  *		have up to 4.  Solaris may or may not allow us to use more
4716  *		than 1 so we essentially share them all at this point.
4717  *	Hybrid: PCI bridge but interrupts wired to host interrupt controller.
4718  *		This is like ISA but we have to fudge and create an intrspec
4719  *		that PCI's parent understands and bypass the PCI nexus.
4720  *	multifunction: this requires sharing the interrupts on a per-socket
4721  *		basis.
4722  */
4723 static int
4724 pcic_clear_interrupt(dev_info_t *dip, clear_irq_handler_t *handler)
4725 {
4726 	anp_t *anp = ddi_get_driver_private(dip);
4727 	pcicdev_t *pcic = anp->an_private;
4728 	inthandler_t *intr, *prev, *current;
4729 	int i;
4730 
4731 	/*
4732 	 * If we're on a PCI bus, we route all IO IRQs through a single
4733 	 *	PCI interrupt (typically INT A#) so we don't have to do
4734 	 *	much other than remove the caller from the general
4735 	 *	interrupt handler callout list.
4736 	 */
4737 
4738 #if defined(PCIC_DEBUG)
4739 	if (pcic_debug) {
4740 		cmn_err(CE_CONT,
4741 			"pcic_clear_interrupt: entered pc_intr_mode=0x%x\n",
4742 			pcic->pc_intr_mode);
4743 		cmn_err(CE_CONT,
4744 			"\t irq_top=%p handler=%p handler_id=%x\n",
4745 			(void *)pcic->irq_top, (void *)handler->handler,
4746 			handler->handler_id);
4747 	}
4748 #endif
4749 
4750 	switch (pcic->pc_intr_mode) {
4751 	case PCIC_INTR_MODE_PCI_1:
4752 
4753 		mutex_enter(&pcic->intr_lock);
4754 		if (pcic->irq_top == NULL) {
4755 			mutex_exit(&pcic->intr_lock);
4756 			return (BAD_IRQ);
4757 		}
4758 
4759 		intr = NULL;
4760 		pcic->irq_current = pcic->irq_top;
4761 
4762 		while ((pcic->irq_current != NULL) &&
4763 				(pcic->irq_current->handler_id !=
4764 						handler->handler_id)) {
4765 			intr = pcic->irq_current;
4766 			pcic->irq_current = pcic->irq_current->next;
4767 		}
4768 
4769 		if (pcic->irq_current == NULL) {
4770 			mutex_exit(&pcic->intr_lock);
4771 			return (BAD_IRQ);
4772 		}
4773 
4774 		if (intr != NULL) {
4775 			intr->next = pcic->irq_current->next;
4776 		} else {
4777 			pcic->irq_top = pcic->irq_current->next;
4778 		}
4779 
4780 		current = pcic->irq_current;
4781 		pcic->irq_current = pcic->irq_top;
4782 		mutex_exit(&pcic->intr_lock);
4783 		kmem_free(current, sizeof (inthandler_t));
4784 
4785 		break;
4786 
4787 	default:
4788 
4789 		mutex_enter(&pcic->pc_lock);
4790 		intr = pcic_handlers;
4791 		prev = (inthandler_t *)&pcic_handlers;
4792 
4793 		while (intr != NULL) {
4794 		    if (intr->handler_id == handler->handler_id) {
4795 			i = intr->irq & PCIC_INTR_MASK;
4796 			if (--pcic_irq_map[i].count == 0) {
4797 				/* multi-handler form */
4798 				(void) ddi_intr_disable(pcic->pc_intr_htblp[i]);
4799 				(void) ddi_intr_remove_handler(
4800 				    pcic->pc_intr_htblp[i]);
4801 				(void) ddi_intr_free(pcic->pc_intr_htblp[i]);
4802 				(void) pcmcia_return_intr(pcic->dip, i);
4803 #if defined(PCIC_DEBUG)
4804 				if (pcic_debug) {
4805 					cmn_err(CE_CONT,
4806 						"removing interrupt %d at %s "
4807 						"priority\n", i, "high");
4808 					cmn_err(CE_CONT,
4809 						"ddi_remove_intr(%p, %x, %p)\n",
4810 						(void *)dip,
4811 						0,
4812 						(void *)intr->iblk_cookie);
4813 				}
4814 #endif
4815 			}
4816 			prev->next = intr->next;
4817 			kmem_free(intr, sizeof (inthandler_t));
4818 			intr = prev->next;
4819 		    } else {
4820 			prev = intr;
4821 			intr = intr->next;
4822 		    } /* if (handler_id) */
4823 		} /* while */
4824 
4825 		mutex_exit(&pcic->pc_lock);
4826 	}
4827 
4828 #if defined(PCIC_DEBUG)
4829 	if (pcic_debug) {
4830 		cmn_err(CE_CONT,
4831 		"pcic_clear_interrupt: exit irq_top=%p\n",
4832 		(void *)pcic->irq_top);
4833 	}
4834 #endif
4835 
4836 
4837 	return (SUCCESS);
4838 }
4839 
4840 struct intel_regs {
4841 	char *name;
4842 	int   off;
4843 	char *fmt;
4844 } iregs[] = {
4845 	{"ident     ", 0},
4846 	{"if-status ", 1, "\020\1BVD1\2BVD2\3CD1\4CD2\5WP\6RDY\7PWR\10~GPI"},
4847 	{"power     ", 2, "\020\1Vpp1c0\2Vpp1c1\3Vpp2c0\4Vpp2c1\5PE\6AUTO"
4848 		"\7DRD\10OE"},
4849 	{"cardstatus", 4, "\020\1BD\2BW\3RC\4CD\5GPI\6R1\7R2\010R3"},
4850 	{"enable    ", 6, "\020\1MW0\2MW1\3MW2\4MW3\5MW4\6MEM16\7IO0\10IO1"},
4851 	{"cd-gcr    ", 0x16, "\020\1MDI16\2CRE\3GPIE\4GPIT\5CDR\6S/W"},
4852 	{"GCR       ", 0x1e, "\020\1PD\2LEVEL\3WCSC\4PLS14"},
4853 	{"int-gcr   ", 3, "\020\5INTR\6IO\7~RST\10RI"},
4854 	{"management", 5, "\020\1BDE\2BWE\3RE\4CDE"},
4855 	{"volt-sense", 0x1f, "\020\1A_VS1\2A_VS2\3B_VS1\4B_VS2"},
4856 	{"volt-sel  ", 0x2f, "\020\5EXTCONF\6BUSSELECT\7MIXEDV\10ISAV"},
4857 	{"VG ext A  ", 0x3c, "\20\3IVS\4CABLE\5CSTEP\6TEST\7RIO"},
4858 	{"io-ctrl   ", 7, "\020\1DS0\2IOCS0\3ZWS0\4WS0\5DS1\6IOS1\7ZWS1\10WS1"},
4859 	{"io0-slow  ", 8},
4860 	{"io0-shi   ", 9},
4861 	{"io0-elow  ", 0xa},
4862 	{"io0-ehi   ", 0xb},
4863 	{"io1-slow  ", 0xc},
4864 	{"io1-shi   ", 0xd},
4865 	{"io1-elow  ", 0xe},
4866 	{"io1-ehi   ", 0xf},
4867 	{"mem0-slow ", 0x10},
4868 	{"mem0-shi  ", 0x11, "\020\7ZW\10DS"},
4869 	{"mem0-elow ", 0x12},
4870 	{"mem0-ehi  ", 0x13, "\020\7WS0\10WS1"},
4871 	{"card0-low ", 0x14},
4872 	{"card0-hi  ", 0x15, "\020\7AM\10WP"},
4873 	{"mem1-slow ", 0x18},
4874 	{"mem1-shi  ", 0x19, "\020\7ZW\10DS"},
4875 	{"mem1-elow ", 0x1a},
4876 	{"mem1-ehi  ", 0x1b, "\020\7WS0\10WS1"},
4877 	{"card1-low ", 0x1c},
4878 	{"card1-hi  ", 0x1d, "\020\7AM\10WP"},
4879 	{"mem2-slow ", 0x20},
4880 	{"mem2-shi  ", 0x21, "\020\7ZW\10DS"},
4881 	{"mem2-elow ", 0x22},
4882 	{"mem2-ehi  ", 0x23, "\020\7WS0\10WS1"},
4883 	{"card2-low ", 0x24},
4884 	{"card2-hi  ", 0x25, "\020\7AM\10WP"},
4885 	{"mem3-slow ", 0x28},
4886 	{"mem3-shi  ", 0x29, "\020\7ZW\10DS"},
4887 	{"mem3-elow ", 0x2a},
4888 	{"mem3-ehi  ", 0x2b, "\020\7WS0\10WS1"},
4889 	{"card3-low ", 0x2c},
4890 	{"card3-hi  ", 0x2d, "\020\7AM\10WP"},
4891 
4892 	{"mem4-slow ", 0x30},
4893 	{"mem4-shi  ", 0x31, "\020\7ZW\10DS"},
4894 	{"mem4-elow ", 0x32},
4895 	{"mem4-ehi  ", 0x33, "\020\7WS0\10WS1"},
4896 	{"card4-low ", 0x34},
4897 	{"card4-hi  ", 0x35, "\020\7AM\10WP"},
4898 	{"mpage0    ", 0x40},
4899 	{"mpage1    ", 0x41},
4900 	{"mpage2    ", 0x42},
4901 	{"mpage3    ", 0x43},
4902 	{"mpage4    ", 0x44},
4903 	{NULL},
4904 };
4905 
4906 static struct intel_regs cregs[] = {
4907 	{"misc-ctl1 ", 0x16, "\20\2VCC3\3PMI\4PSI\5SPKR\10INPACK"},
4908 	{"fifo      ", 0x17, "\20\6DIOP\7DMEMP\10EMPTY"},
4909 	{"misc-ctl2 ", 0x1e, "\20\1XCLK\2LOW\3SUSP\4CORE5V\5TCD\10RIOUT"},
4910 	{"chip-info ", 0x1f, "\20\6DUAL"},
4911 	{"IO-offlow0", 0x36},
4912 	{"IO-offhi0 ", 0x37},
4913 	{"IO-offlow1", 0x38},
4914 	{"IO-offhi1 ", 0x39},
4915 	NULL,
4916 };
4917 
4918 static struct intel_regs cxregs[] = {
4919 	{"ext-ctl-1 ", 0x03,
4920 		"\20\1VCCLCK\2AUTOCLR\3LED\4INVIRQC\5INVIRQM\6PUC"},
4921 	{"misc-ctl3 ", 0x25, "\20\5HWSUSP"},
4922 	{"mem0-up   ", 0x05},
4923 	{"mem1-up   ", 0x06},
4924 	{"mem2-up   ", 0x07},
4925 	{"mem3-up   ", 0x08},
4926 	{"mem4-up   ", 0x09},
4927 	{NULL}
4928 };
4929 
4930 void
4931 xxdmp_cl_regs(pcicdev_t *pcic, int socket, uint32_t len)
4932 {
4933 	int i, value, j;
4934 	char buff[256];
4935 	char *fmt;
4936 
4937 	cmn_err(CE_CONT, "--------- Cirrus Logic Registers --------\n");
4938 	for (buff[0] = '\0', i = 0; cregs[i].name != NULL && len-- != 0; i++) {
4939 		int sval;
4940 		if (cregs[i].off == PCIC_MISC_CTL_2)
4941 			sval = 0;
4942 		else
4943 			sval = socket;
4944 		value = pcic_getb(pcic, sval, cregs[i].off);
4945 		if (i & 1) {
4946 			if (cregs[i].fmt)
4947 				fmt = "%s\t%s\t%b\n";
4948 			else
4949 				fmt = "%s\t%s\t%x\n";
4950 			cmn_err(CE_CONT, fmt, buff,
4951 				cregs[i].name, value, cregs[i].fmt);
4952 			buff[0] = '\0';
4953 		} else {
4954 			if (cregs[i].fmt)
4955 				fmt = "\t%s\t%b";
4956 			else
4957 				fmt = "\t%s\t%x";
4958 			(void) sprintf(buff, fmt,
4959 				cregs[i].name, value, cregs[i].fmt);
4960 			for (j = strlen(buff); j < 40; j++)
4961 				buff[j] = ' ';
4962 			buff[40] = '\0';
4963 		}
4964 	}
4965 	cmn_err(CE_CONT, "%s\n", buff);
4966 
4967 	i = pcic_getb(pcic, socket, PCIC_TIME_SETUP_0);
4968 	j = pcic_getb(pcic, socket, PCIC_TIME_SETUP_1);
4969 	cmn_err(CE_CONT, "\tsetup-tim0\t%x\tsetup-tim1\t%x\n", i, j);
4970 
4971 	i = pcic_getb(pcic, socket, PCIC_TIME_COMMAND_0);
4972 	j = pcic_getb(pcic, socket, PCIC_TIME_COMMAND_1);
4973 	cmn_err(CE_CONT, "\tcmd-tim0  \t%x\tcmd-tim1  \t%x\n", i, j);
4974 
4975 	i = pcic_getb(pcic, socket, PCIC_TIME_RECOVER_0);
4976 	j = pcic_getb(pcic, socket, PCIC_TIME_RECOVER_1);
4977 	cmn_err(CE_CONT, "\trcvr-tim0 \t%x\trcvr-tim1 \t%x\n", i, j);
4978 
4979 	cmn_err(CE_CONT, "--------- Extended Registers  --------\n");
4980 
4981 	for (buff[0] = '\0', i = 0; cxregs[i].name != NULL && len-- != 0; i++) {
4982 		value = clext_reg_read(pcic, socket, cxregs[i].off);
4983 		if (i & 1) {
4984 			if (cxregs[i].fmt)
4985 				fmt = "%s\t%s\t%b\n";
4986 			else
4987 				fmt = "%s\t%s\t%x\n";
4988 			cmn_err(CE_CONT, fmt, buff,
4989 				cxregs[i].name, value, cxregs[i].fmt);
4990 			buff[0] = '\0';
4991 		} else {
4992 			if (cxregs[i].fmt)
4993 				fmt = "\t%s\t%b";
4994 			else
4995 				fmt = "\t%s\t%x";
4996 			(void) sprintf(buff, fmt,
4997 				cxregs[i].name, value, cxregs[i].fmt);
4998 			for (j = strlen(buff); j < 40; j++)
4999 				buff[j] = ' ';
5000 			buff[40] = '\0';
5001 		}
5002 	}
5003 }
5004 
5005 #if defined(PCIC_DEBUG)
5006 static void
5007 xxdmp_all_regs(pcicdev_t *pcic, int socket, uint32_t len)
5008 {
5009 	int i, value, j;
5010 	char buff[256];
5011 	char *fmt;
5012 
5013 #if defined(PCIC_DEBUG)
5014 	if (pcic_debug < 2)
5015 		return;
5016 #endif
5017 	cmn_err(CE_CONT,
5018 		"----------- PCIC Registers for socket %d---------\n",
5019 		socket);
5020 	cmn_err(CE_CONT,
5021 		"\tname       value                        name       value\n");
5022 
5023 	for (buff[0] = '\0', i = 0; iregs[i].name != NULL && len-- != 0; i++) {
5024 		value = pcic_getb(pcic, socket, iregs[i].off);
5025 		if (i & 1) {
5026 			if (iregs[i].fmt)
5027 				fmt = "%s\t%s\t%b\n";
5028 			else
5029 				fmt = "%s\t%s\t%x\n";
5030 			cmn_err(CE_CONT, fmt, buff,
5031 				iregs[i].name, value, iregs[i].fmt);
5032 			buff[0] = '\0';
5033 		} else {
5034 			if (iregs[i].fmt)
5035 				fmt = "\t%s\t%b";
5036 			else
5037 				fmt = "\t%s\t%x";
5038 			(void) sprintf(buff, fmt,
5039 				iregs[i].name, value, iregs[i].fmt);
5040 			for (j = strlen(buff); j < 40; j++)
5041 				buff[j] = ' ';
5042 			buff[40] = '\0';
5043 		}
5044 	}
5045 	switch (pcic->pc_type) {
5046 	case PCIC_CL_PD6710:
5047 	case PCIC_CL_PD6722:
5048 	case PCIC_CL_PD6729:
5049 	case PCIC_CL_PD6832:
5050 		(void) xxdmp_cl_regs(pcic, socket, 0xFFFF);
5051 		break;
5052 	}
5053 	cmn_err(CE_CONT, "%s\n", buff);
5054 }
5055 #endif
5056 
5057 /*
5058  * pcic_mswait(ms)
5059  *	sleep ms milliseconds
5060  *	call drv_usecwait once for each ms
5061  */
5062 static void
5063 pcic_mswait(pcicdev_t *pcic, int socket, int ms)
5064 {
5065 	if (ms) {
5066 		pcic->pc_sockets[socket].pcs_flags |= PCS_WAITING;
5067 		pcic_mutex_exit(&pcic->pc_lock);
5068 		delay(drv_usectohz(ms*1000));
5069 		pcic_mutex_enter(&pcic->pc_lock);
5070 		pcic->pc_sockets[socket].pcs_flags &= ~PCS_WAITING;
5071 	}
5072 }
5073 
5074 /*
5075  * pcic_check_ready(pcic, index, off)
5076  *      Wait for card to come ready
5077  *      We only wait if the card is NOT in RESET
5078  *      and power is on.
5079  */
5080 static boolean_t
5081 pcic_check_ready(pcicdev_t *pcic, int socket)
5082 {
5083 	int ifstate, intstate;
5084 
5085 	intstate = pcic_getb(pcic, socket, PCIC_INTERRUPT);
5086 	ifstate = pcic_getb(pcic, socket, PCIC_INTERFACE_STATUS);
5087 
5088 	if ((intstate & PCIC_RESET) &&
5089 	    ((ifstate & (PCIC_READY|PCIC_POWER_ON|PCIC_ISTAT_CD_MASK)) ==
5090 	    (PCIC_READY|PCIC_POWER_ON|PCIC_CD_PRESENT_OK)))
5091 		return (B_TRUE);
5092 
5093 #ifdef  PCIC_DEBUG
5094 	pcic_err(NULL, 5, "pcic_check_read: Card not ready, intstate = 0x%x, "
5095 	    "ifstate = 0x%x\n", intstate, ifstate);
5096 	if (pcic_debug) {
5097 		pcic_debug += 4;
5098 		xxdmp_all_regs(pcic, socket, -1);
5099 		pcic_debug -= 4;
5100 	}
5101 #endif
5102 	return (B_FALSE);
5103 }
5104 
5105 /*
5106  * Cirrus Logic extended register read/write routines
5107  */
5108 static int
5109 clext_reg_read(pcicdev_t *pcic, int sn, uchar_t ext_reg)
5110 {
5111 	int val;
5112 
5113 	switch (pcic->pc_io_type) {
5114 	case PCIC_IO_TYPE_YENTA:
5115 		val = ddi_get8(pcic->handle,
5116 		    pcic->ioaddr + CB_CLEXT_OFFSET + ext_reg);
5117 		break;
5118 	default:
5119 		pcic_putb(pcic, sn, PCIC_CL_EXINDEX, ext_reg);
5120 		val = pcic_getb(pcic, sn, PCIC_CL_EXINDEX + 1);
5121 		break;
5122 	}
5123 
5124 	return (val);
5125 }
5126 
5127 static void
5128 clext_reg_write(pcicdev_t *pcic, int sn, uchar_t ext_reg, uchar_t value)
5129 {
5130 	switch (pcic->pc_io_type) {
5131 	case PCIC_IO_TYPE_YENTA:
5132 		ddi_put8(pcic->handle,
5133 		    pcic->ioaddr + CB_CLEXT_OFFSET + ext_reg, value);
5134 		break;
5135 	default:
5136 		pcic_putb(pcic, sn, PCIC_CL_EXINDEX, ext_reg);
5137 		pcic_putb(pcic, sn, PCIC_CL_EXINDEX + 1, value);
5138 		break;
5139 	}
5140 }
5141 
5142 /*
5143  * Misc PCI functions
5144  */
5145 static void
5146 pcic_iomem_pci_ctl(ddi_acc_handle_t handle, uchar_t *cfgaddr, unsigned flags)
5147 {
5148 	unsigned cmd;
5149 
5150 	if (flags & (PCIC_ENABLE_IO | PCIC_ENABLE_MEM)) {
5151 		cmd = ddi_get16(handle, (ushort_t *)(cfgaddr + 4));
5152 		if ((cmd & (PCI_COMM_IO|PCI_COMM_MAE)) ==
5153 		    (PCI_COMM_IO|PCI_COMM_MAE))
5154 			return;
5155 
5156 		if (flags & PCIC_ENABLE_IO)
5157 		    cmd |= PCI_COMM_IO;
5158 
5159 		if (flags & PCIC_ENABLE_MEM)
5160 		    cmd |= PCI_COMM_MAE;
5161 
5162 		ddi_put16(handle, (ushort_t *)(cfgaddr + 4), cmd);
5163 	} /* if (PCIC_ENABLE_IO | PCIC_ENABLE_MEM) */
5164 }
5165 
5166 /*
5167  * pcic_find_pci_type - Find and return PCI-PCMCIA adapter type
5168  */
5169 static int
5170 pcic_find_pci_type(pcicdev_t *pcic)
5171 {
5172 	uint32_t vend, device;
5173 
5174 	vend = ddi_getprop(DDI_DEV_T_ANY, pcic->dip,
5175 				DDI_PROP_CANSLEEP|DDI_PROP_DONTPASS,
5176 				"vendor-id", -1);
5177 	device = ddi_getprop(DDI_DEV_T_ANY, pcic->dip,
5178 				DDI_PROP_CANSLEEP|DDI_PROP_DONTPASS,
5179 				"device-id", -1);
5180 
5181 	device = PCI_ID(vend, device);
5182 	pcic->pc_type = device;
5183 	pcic->pc_chipname = "PCI:unknown";
5184 
5185 	switch (device) {
5186 	case PCIC_INTEL_i82092:
5187 		pcic->pc_chipname = PCIC_TYPE_i82092;
5188 		break;
5189 	case PCIC_CL_PD6729:
5190 		pcic->pc_chipname = PCIC_TYPE_PD6729;
5191 		/*
5192 		 * Some 6730's incorrectly identify themselves
5193 		 *	as a 6729, so we need to do some more tests
5194 		 *	here to see if the device that's claiming
5195 		 *	to be a 6729 is really a 6730.
5196 		 */
5197 		if ((clext_reg_read(pcic, 0, PCIC_CLEXT_MISC_CTL_3) &
5198 			PCIC_CLEXT_MISC_CTL_3_REV_MASK) ==
5199 				0) {
5200 			pcic->pc_chipname = PCIC_TYPE_PD6730;
5201 			pcic->pc_type = PCIC_CL_PD6730;
5202 		}
5203 		break;
5204 	case PCIC_CL_PD6730:
5205 		pcic->pc_chipname = PCIC_TYPE_PD6730;
5206 		break;
5207 	case PCIC_CL_PD6832:
5208 		pcic->pc_chipname = PCIC_TYPE_PD6832;
5209 		break;
5210 	case PCIC_SMC_34C90:
5211 		pcic->pc_chipname = PCIC_TYPE_34C90;
5212 		break;
5213 	case PCIC_TOSHIBA_TOPIC95:
5214 		pcic->pc_chipname = PCIC_TYPE_TOPIC95;
5215 		break;
5216 	case PCIC_TOSHIBA_TOPIC100:
5217 		pcic->pc_chipname = PCIC_TYPE_TOPIC100;
5218 		break;
5219 	case PCIC_TI_PCI1031:
5220 		pcic->pc_chipname = PCIC_TYPE_PCI1031;
5221 		break;
5222 	case PCIC_TI_PCI1130:
5223 		pcic->pc_chipname = PCIC_TYPE_PCI1130;
5224 		break;
5225 	case PCIC_TI_PCI1131:
5226 		pcic->pc_chipname = PCIC_TYPE_PCI1131;
5227 		break;
5228 	case PCIC_TI_PCI1250:
5229 		pcic->pc_chipname = PCIC_TYPE_PCI1250;
5230 		break;
5231 	case PCIC_TI_PCI1225:
5232 		pcic->pc_chipname = PCIC_TYPE_PCI1225;
5233 		break;
5234 	case PCIC_TI_PCI1410:
5235 		pcic->pc_chipname = PCIC_TYPE_PCI1410;
5236 		break;
5237 	case PCIC_TI_PCI1510:
5238 		pcic->pc_chipname = PCIC_TYPE_PCI1510;
5239 		break;
5240 	case PCIC_TI_PCI1520:
5241 		pcic->pc_chipname = PCIC_TYPE_PCI1520;
5242 		break;
5243 	case PCIC_TI_PCI1221:
5244 		pcic->pc_chipname = PCIC_TYPE_PCI1221;
5245 		break;
5246 	case PCIC_TI_PCI1050:
5247 		pcic->pc_chipname = PCIC_TYPE_PCI1050;
5248 		break;
5249 	case PCIC_ENE_1410:
5250 		pcic->pc_chipname = PCIC_TYPE_1410;
5251 		break;
5252 	case PCIC_O2_OZ6912:
5253 		pcic->pc_chipname = PCIC_TYPE_OZ6912;
5254 		break;
5255 	case PCIC_RICOH_RL5C466:
5256 		pcic->pc_chipname = PCIC_TYPE_RL5C466;
5257 		break;
5258 	case PCIC_TI_PCI1420:
5259 		pcic->pc_chipname = PCIC_TYPE_PCI1420;
5260 		break;
5261 	case PCIC_ENE_1420:
5262 		pcic->pc_chipname = PCIC_TYPE_1420;
5263 		break;
5264 	default:
5265 		switch (PCI_ID(vend, (uint32_t)0)) {
5266 		case PCIC_TOSHIBA_VENDOR:
5267 			pcic->pc_chipname = PCIC_TYPE_TOSHIBA;
5268 			pcic->pc_type = PCIC_TOSHIBA_VENDOR;
5269 			break;
5270 		case PCIC_TI_VENDOR:
5271 			pcic->pc_chipname = PCIC_TYPE_TI;
5272 			pcic->pc_type = PCIC_TI_VENDOR;
5273 			break;
5274 		case PCIC_O2MICRO_VENDOR:
5275 			pcic->pc_chipname = PCIC_TYPE_O2MICRO;
5276 			pcic->pc_type = PCIC_O2MICRO_VENDOR;
5277 			break;
5278 		case PCIC_RICOH_VENDOR:
5279 			pcic->pc_chipname = PCIC_TYPE_RICOH;
5280 			pcic->pc_type = PCIC_RICOH_VENDOR;
5281 			break;
5282 		default:
5283 			if (!(pcic->pc_flags & PCF_CARDBUS))
5284 				return (DDI_FAILURE);
5285 			pcic->pc_chipname = PCIC_TYPE_YENTA;
5286 			break;
5287 		}
5288 	}
5289 	return (DDI_SUCCESS);
5290 }
5291 
5292 static void
5293 pcic_82092_smiirq_ctl(pcicdev_t *pcic, int socket, int intr, int state)
5294 {
5295 	uchar_t ppirr = ddi_get8(pcic->cfg_handle,
5296 					pcic->cfgaddr + PCIC_82092_PPIRR);
5297 	uchar_t val;
5298 
5299 	if (intr == PCIC_82092_CTL_SMI) {
5300 		val = PCIC_82092_SMI_CTL(socket,
5301 						PCIC_82092_INT_DISABLE);
5302 		ppirr &= ~val;
5303 		val = PCIC_82092_SMI_CTL(socket, state);
5304 		ppirr |= val;
5305 	} else {
5306 		val = PCIC_82092_IRQ_CTL(socket,
5307 						PCIC_82092_INT_DISABLE);
5308 		ppirr &= ~val;
5309 		val = PCIC_82092_IRQ_CTL(socket, state);
5310 		ppirr |= val;
5311 	}
5312 	ddi_put8(pcic->cfg_handle, pcic->cfgaddr + PCIC_82092_PPIRR,
5313 			ppirr);
5314 }
5315 
5316 static uint_t
5317 pcic_cd_softint(caddr_t arg1, caddr_t arg2)
5318 {
5319 	pcic_socket_t *sockp = (pcic_socket_t *)arg1;
5320 	uint_t rc = DDI_INTR_UNCLAIMED;
5321 
5322 	_NOTE(ARGUNUSED(arg2))
5323 
5324 	mutex_enter(&sockp->pcs_pcic->pc_lock);
5325 	if (sockp->pcs_cd_softint_flg) {
5326 		uint8_t status;
5327 		sockp->pcs_cd_softint_flg = 0;
5328 		rc = DDI_INTR_CLAIMED;
5329 		status = pcic_getb(sockp->pcs_pcic, sockp->pcs_socket,
5330 			PCIC_INTERFACE_STATUS);
5331 		pcic_handle_cd_change(sockp->pcs_pcic, sockp, status);
5332 	}
5333 	mutex_exit(&sockp->pcs_pcic->pc_lock);
5334 	return (rc);
5335 }
5336 
5337 int pcic_debounce_cnt = PCIC_REM_DEBOUNCE_CNT;
5338 int pcic_debounce_intr_time = PCIC_REM_DEBOUNCE_TIME;
5339 int pcic_debounce_cnt_ok = PCIC_DEBOUNCE_OK_CNT;
5340 
5341 #ifdef CARDBUS
5342 static uint32_t pcic_cbps_on = 0;
5343 static uint32_t pcic_cbps_off = CB_PS_NOTACARD | CB_PS_CCDMASK |
5344 				CB_PS_XVCARD | CB_PS_YVCARD;
5345 #else
5346 static uint32_t pcic_cbps_on = CB_PS_16BITCARD;
5347 static uint32_t pcic_cbps_off = CB_PS_NOTACARD | CB_PS_CCDMASK |
5348 				CB_PS_CBCARD |
5349 				CB_PS_XVCARD | CB_PS_YVCARD;
5350 #endif
5351 static void
5352 pcic_handle_cd_change(pcicdev_t *pcic, pcic_socket_t *sockp, uint8_t status)
5353 {
5354 	boolean_t	do_debounce = B_FALSE;
5355 	int		debounce_time = drv_usectohz(pcic_debounce_time);
5356 	uint8_t		irq;
5357 	timeout_id_t	debounce;
5358 
5359 	/*
5360 	 * Always reset debounce but may need to check original state later.
5361 	 */
5362 	debounce = sockp->pcs_debounce_id;
5363 	sockp->pcs_debounce_id = 0;
5364 
5365 	/*
5366 	 * Check to see whether a card is present or not. There are
5367 	 *	only two states that we are concerned with - the state
5368 	 *	where both CD pins are asserted, which means that the
5369 	 *	card is fully seated, and the state where neither CD
5370 	 *	pin is asserted, which means that the card is not
5371 	 *	present.
5372 	 * The CD signals are generally very noisy and cause a lot of
5373 	 *	contact bounce as the card is being inserted and
5374 	 *	removed, so we need to do some software debouncing.
5375 	 */
5376 
5377 #ifdef PCIC_DEBUG
5378 	    pcic_err(pcic->dip, 6,
5379 		    "pcic%d handle_cd_change: socket %d card status 0x%x"
5380 		    " deb 0x%p\n", ddi_get_instance(pcic->dip),
5381 		    sockp->pcs_socket, status, debounce);
5382 #endif
5383 	switch (status & PCIC_ISTAT_CD_MASK) {
5384 	case PCIC_CD_PRESENT_OK:
5385 	    sockp->pcs_flags &= ~(PCS_CARD_REMOVED|PCS_CARD_CBREM);
5386 	    if (!(sockp->pcs_flags & PCS_CARD_PRESENT)) {
5387 		uint32_t cbps;
5388 #ifdef PCIC_DEBUG
5389 		pcic_err(pcic->dip, 8, "New card (0x%x)\n", sockp->pcs_flags);
5390 #endif
5391 		cbps = pcic_getcb(pcic, CB_PRESENT_STATE);
5392 #ifdef PCIC_DEBUG
5393 		pcic_err(pcic->dip, 8, "CBus PS (0x%x)\n", cbps);
5394 #endif
5395 		/*
5396 		 * Check the CB bits are sane.
5397 		 */
5398 		if ((cbps & pcic_cbps_on) != pcic_cbps_on ||
5399 		    cbps & pcic_cbps_off) {
5400 		    cmn_err(CE_WARN,
5401 			    "%s%d: Odd Cardbus Present State 0x%x\n",
5402 			    ddi_get_name(pcic->dip),
5403 			    ddi_get_instance(pcic->dip),
5404 			    cbps);
5405 		    pcic_putcb(pcic, CB_EVENT_FORCE, CB_EF_CVTEST);
5406 		    debounce = 0;
5407 		    debounce_time = drv_usectohz(1000000);
5408 		}
5409 		if (debounce) {
5410 		    sockp->pcs_flags |= PCS_CARD_PRESENT;
5411 		    if (pcic_do_insertion) {
5412 
5413 			cbps = pcic_getcb(pcic, CB_PRESENT_STATE);
5414 
5415 			if (cbps & CB_PS_16BITCARD) {
5416 			    pcic_err(pcic->dip, 8, "16 bit card inserted\n");
5417 			    sockp->pcs_flags |= PCS_CARD_IS16BIT;
5418 			    /* calls pcm_adapter_callback() */
5419 			    if (pcic->pc_callback) {
5420 
5421 				(void) ddi_prop_update_string(DDI_DEV_T_NONE,
5422 					pcic->dip, PCM_DEVICETYPE,
5423 					"pccard");
5424 				PC_CALLBACK(pcic->dip, pcic->pc_cb_arg,
5425 					    PCE_CARD_INSERT,
5426 					    sockp->pcs_socket);
5427 			    }
5428 			} else if (cbps & CB_PS_CBCARD) {
5429 			    pcic_err(pcic->dip, 8, "32 bit card inserted\n");
5430 
5431 			    if (pcic->pc_flags & PCF_CARDBUS) {
5432 				sockp->pcs_flags |= PCS_CARD_ISCARDBUS;
5433 #ifdef CARDBUS
5434 				if (!pcic_load_cardbus(pcic, sockp)) {
5435 				    pcic_unload_cardbus(pcic, sockp);
5436 				}
5437 
5438 #else
5439 				cmn_err(CE_NOTE,
5440 					"32 bit Cardbus not supported in"
5441 					" this device driver\n");
5442 #endif
5443 			    } else {
5444 				/*
5445 				 * Ignore the card
5446 				 */
5447 				cmn_err(CE_NOTE,
5448 					"32 bit Cardbus not supported on this"
5449 					" device\n");
5450 			    }
5451 			} else {
5452 			    cmn_err(CE_NOTE,
5453 				"Unsupported PCMCIA card inserted\n");
5454 			}
5455 		    }
5456 		} else {
5457 		    do_debounce = B_TRUE;
5458 		}
5459 	    } else {
5460 		/*
5461 		 * It is possible to come through here if the system
5462 		 * starts up with cards already inserted. Do nothing
5463 		 * and don't worry about it.
5464 		 */
5465 #ifdef PCIC_DEBUG
5466 		pcic_err(pcic->dip, 5,
5467 			"pcic%d: Odd card insertion indication on socket %d\n",
5468 			ddi_get_instance(pcic->dip),
5469 			sockp->pcs_socket);
5470 #endif
5471 	    }
5472 	    break;
5473 
5474 	default:
5475 	    if (!(sockp->pcs_flags & PCS_CARD_PRESENT)) {
5476 		/*
5477 		 * Someone has started to insert a card so delay a while.
5478 		 */
5479 		do_debounce = B_TRUE;
5480 		break;
5481 	    }
5482 		/*
5483 		 * Otherwise this is basically the same as not present
5484 		 * so fall through.
5485 		 */
5486 
5487 		/* FALLTHRU */
5488 	case 0:
5489 	    if (sockp->pcs_flags & PCS_CARD_PRESENT) {
5490 		if (pcic->pc_flags & PCF_CBPWRCTL) {
5491 		    pcic_putcb(pcic, CB_CONTROL, 0);
5492 		} else {
5493 		    pcic_putb(pcic, sockp->pcs_socket, PCIC_POWER_CONTROL, 0);
5494 		    (void) pcic_getb(pcic, sockp->pcs_socket,
5495 			PCIC_POWER_CONTROL);
5496 		}
5497 #ifdef PCIC_DEBUG
5498 		pcic_err(pcic->dip, 8, "Card removed\n");
5499 #endif
5500 		sockp->pcs_flags &= ~PCS_CARD_PRESENT;
5501 
5502 		if (sockp->pcs_flags & PCS_CARD_IS16BIT) {
5503 		    sockp->pcs_flags &= ~PCS_CARD_IS16BIT;
5504 		    if (pcic_do_removal && pcic->pc_callback) {
5505 			PC_CALLBACK(pcic->dip, pcic->pc_cb_arg,
5506 				    PCE_CARD_REMOVAL, sockp->pcs_socket);
5507 		    }
5508 		}
5509 		if (sockp->pcs_flags & PCS_CARD_ISCARDBUS) {
5510 		    sockp->pcs_flags &= ~PCS_CARD_ISCARDBUS;
5511 		    sockp->pcs_flags |= PCS_CARD_CBREM;
5512 		}
5513 		sockp->pcs_flags |= PCS_CARD_REMOVED;
5514 
5515 		do_debounce = B_TRUE;
5516 	    }
5517 	    if (debounce && (sockp->pcs_flags & PCS_CARD_REMOVED)) {
5518 		if (sockp->pcs_flags & PCS_CARD_CBREM) {
5519 		/*
5520 		 * Ensure that we do the unloading in the
5521 		 * debounce handler, that way we're not doing
5522 		 * nasty things in an interrupt handler. e.g.
5523 		 * a USB device will wait for data which will
5524 		 * obviously never come because we've
5525 		 * unplugged the device, but the wait will
5526 		 * wait forever because no interrupts can
5527 		 * come in...
5528 		 */
5529 #ifdef CARDBUS
5530 		    pcic_unload_cardbus(pcic, sockp);
5531 		    /* pcic_dump_all(pcic); */
5532 #endif
5533 		    sockp->pcs_flags &= ~PCS_CARD_CBREM;
5534 		}
5535 		sockp->pcs_flags &= ~PCS_CARD_REMOVED;
5536 	    }
5537 	    break;
5538 	} /* switch */
5539 
5540 	if (do_debounce) {
5541 	/*
5542 	 * Delay doing
5543 	 * anything for a while so that things can settle
5544 	 * down a little. Interrupts are already disabled.
5545 	 * Reset the state and we'll reevaluate the
5546 	 * whole kit 'n kaboodle when the timeout fires
5547 	 */
5548 #ifdef PCIC_DEBUG
5549 		pcic_err(pcic->dip, 8, "Queueing up debounce timeout for "
5550 			"socket %d.%d\n",
5551 			ddi_get_instance(pcic->dip),
5552 			sockp->pcs_socket);
5553 #endif
5554 	    sockp->pcs_debounce_id = pcic_add_debqueue(sockp, debounce_time);
5555 
5556 	/*
5557 	 * We bug out here without re-enabling interrupts. They will
5558 	 * be re-enabled when the debounce timeout swings through
5559 	 * here.
5560 	 */
5561 	    return;
5562 	}
5563 
5564 	/*
5565 	 * Turn on Card detect interrupts. Other interrupts will be
5566 	 * enabled during set_socket calls.
5567 	 *
5568 	 * Note that set_socket only changes interrupt settings when there
5569 	 * is a card present.
5570 	 */
5571 	irq = pcic_getb(pcic, sockp->pcs_socket, PCIC_MANAGEMENT_INT);
5572 	irq |= PCIC_CD_DETECT;
5573 	pcic_putb(pcic, sockp->pcs_socket, PCIC_MANAGEMENT_INT, irq);
5574 	pcic_putcb(pcic, CB_STATUS_MASK, CB_SE_CCDMASK);
5575 
5576 	/* Out from debouncing state */
5577 	sockp->pcs_flags &= ~PCS_DEBOUNCING;
5578 
5579 	pcic_err(pcic->dip, 7, "Leaving pcic_handle_cd_change\n");
5580 }
5581 
5582 /*
5583  * pcic_getb()
5584  *	get an I/O byte based on the yardware decode method
5585  */
5586 static uint8_t
5587 pcic_getb(pcicdev_t *pcic, int socket, int reg)
5588 {
5589 	int work;
5590 
5591 #if defined(PCIC_DEBUG)
5592 	if (pcic_debug == 0x7fff) {
5593 		cmn_err(CE_CONT, "pcic_getb0: pcic=%p socket=%d reg=%d\n",
5594 			(void *)pcic, socket, reg);
5595 		cmn_err(CE_CONT, "pcic_getb1: type=%d handle=%p ioaddr=%p \n",
5596 			pcic->pc_io_type, (void *)pcic->handle,
5597 			(void *)pcic->ioaddr);
5598 	}
5599 #endif
5600 
5601 	switch (pcic->pc_io_type) {
5602 	case PCIC_IO_TYPE_YENTA:
5603 		return (ddi_get8(pcic->handle,
5604 		    pcic->ioaddr + CB_R2_OFFSET + reg));
5605 	default:
5606 		work = (socket * PCIC_SOCKET_1) | reg;
5607 		ddi_put8(pcic->handle, pcic->ioaddr, work);
5608 		return (ddi_get8(pcic->handle, pcic->ioaddr + 1));
5609 	}
5610 }
5611 
5612 static void
5613 pcic_putb(pcicdev_t *pcic, int socket, int reg, int8_t value)
5614 {
5615 	int work;
5616 
5617 #if defined(PCIC_DEBUG)
5618 	if (pcic_debug == 0x7fff) {
5619 		cmn_err(CE_CONT,
5620 			"pcic_putb0: pcic=%p socket=%d reg=%d value=%x \n",
5621 			(void *)pcic, socket, reg, value);
5622 		cmn_err(CE_CONT,
5623 			"pcic_putb1: type=%d handle=%p ioaddr=%p \n",
5624 			pcic->pc_io_type, (void *)pcic->handle,
5625 			(void *)pcic->ioaddr);
5626 	}
5627 #endif
5628 
5629 
5630 	switch (pcic->pc_io_type) {
5631 	case PCIC_IO_TYPE_YENTA:
5632 		ddi_put8(pcic->handle, pcic->ioaddr + CB_R2_OFFSET + reg,
5633 				value);
5634 		break;
5635 	default:
5636 		work = (socket * PCIC_SOCKET_1) | reg;
5637 		ddi_put8(pcic->handle, pcic->ioaddr, work);
5638 		ddi_put8(pcic->handle, pcic->ioaddr + 1, value);
5639 		break;
5640 	}
5641 }
5642 
5643 /*
5644  * chip identification functions
5645  */
5646 
5647 /*
5648  * chip identification: Cirrus Logic PD6710/6720/6722
5649  */
5650 static int
5651 pcic_ci_cirrus(pcicdev_t *pcic)
5652 {
5653 	int value1, value2;
5654 
5655 	/* Init the CL id mode */
5656 	value1 = pcic_getb(pcic, 0, PCIC_CHIP_INFO);
5657 	pcic_putb(pcic, 0, PCIC_CHIP_INFO, 0);
5658 	value1 = pcic_getb(pcic, 0, PCIC_CHIP_INFO);
5659 	value2 = pcic_getb(pcic, 0, PCIC_CHIP_INFO);
5660 
5661 	if ((value1 & PCIC_CI_ID) == PCIC_CI_ID &&
5662 	    (value2 & PCIC_CI_ID) == 0) {
5663 		/* chip is a Cirrus Logic and not Intel */
5664 		pcic->pc_type = PCIC_CL_PD6710;
5665 		if (value1 & PCIC_CI_SLOTS)
5666 			pcic->pc_chipname = PCIC_TYPE_PD6720;
5667 		else
5668 			pcic->pc_chipname = PCIC_TYPE_PD6710;
5669 		/* now fine tune things just in case a 6722 */
5670 		value1 = clext_reg_read(pcic, 0, PCIC_CLEXT_DMASK_0);
5671 		if (value1 == 0) {
5672 			clext_reg_write(pcic, 0, PCIC_CLEXT_SCRATCH, 0x55);
5673 			value1 = clext_reg_read(pcic, 0, PCIC_CLEXT_SCRATCH);
5674 			if (value1 == 0x55) {
5675 				pcic->pc_chipname = PCIC_TYPE_PD6722;
5676 				pcic->pc_type = PCIC_CL_PD6722;
5677 				clext_reg_write(pcic, 0, PCIC_CLEXT_SCRATCH, 0);
5678 			}
5679 		}
5680 		return (1);
5681 	}
5682 	return (0);
5683 }
5684 
5685 /*
5686  * chip identification: Vadem (VG365/465/468/469)
5687  */
5688 
5689 static void
5690 pcic_vadem_enable(pcicdev_t *pcic)
5691 {
5692 	ddi_put8(pcic->handle, pcic->ioaddr, PCIC_VADEM_P1);
5693 	ddi_put8(pcic->handle, pcic->ioaddr, PCIC_VADEM_P2);
5694 	ddi_put8(pcic->handle, pcic->ioaddr, pcic->pc_lastreg);
5695 }
5696 
5697 static int
5698 pcic_ci_vadem(pcicdev_t *pcic)
5699 {
5700 	int value;
5701 
5702 	pcic_vadem_enable(pcic);
5703 	value = pcic_getb(pcic, 0, PCIC_CHIP_REVISION);
5704 	pcic_putb(pcic, 0, PCIC_CHIP_REVISION, 0xFF);
5705 	if (pcic_getb(pcic, 0, PCIC_CHIP_REVISION) ==
5706 	    (value | PCIC_VADEM_D3) ||
5707 	    (pcic_getb(pcic, 0, PCIC_CHIP_REVISION) & PCIC_REV_MASK) ==
5708 	    PCIC_VADEM_469) {
5709 		int vadem, new;
5710 		pcic_vadem_enable(pcic);
5711 		vadem = pcic_getb(pcic, 0, PCIC_VG_DMA) &
5712 			~(PCIC_V_UNLOCK | PCIC_V_VADEMREV);
5713 		new = vadem | (PCIC_V_VADEMREV|PCIC_V_UNLOCK);
5714 		pcic_putb(pcic, 0, PCIC_VG_DMA, new);
5715 		value = pcic_getb(pcic, 0, PCIC_CHIP_REVISION);
5716 
5717 		/* want to lock but leave mouse or other on */
5718 		pcic_putb(pcic, 0, PCIC_VG_DMA, vadem);
5719 		switch (value & PCIC_REV_MASK) {
5720 		case PCIC_VADEM_365:
5721 			pcic->pc_chipname = PCIC_VG_365;
5722 			pcic->pc_type = PCIC_VADEM;
5723 			break;
5724 		case PCIC_VADEM_465:
5725 			pcic->pc_chipname = PCIC_VG_465;
5726 			pcic->pc_type = PCIC_VADEM;
5727 			pcic->pc_flags |= PCF_1SOCKET;
5728 			break;
5729 		case PCIC_VADEM_468:
5730 			pcic->pc_chipname = PCIC_VG_468;
5731 			pcic->pc_type = PCIC_VADEM;
5732 			break;
5733 		case PCIC_VADEM_469:
5734 			pcic->pc_chipname = PCIC_VG_469;
5735 			pcic->pc_type = PCIC_VADEM_VG469;
5736 			break;
5737 		}
5738 		return (1);
5739 	}
5740 	return (0);
5741 }
5742 
5743 /*
5744  * chip identification: Ricoh
5745  */
5746 static int
5747 pcic_ci_ricoh(pcicdev_t *pcic)
5748 {
5749 	int value;
5750 
5751 	value = pcic_getb(pcic, 0, PCIC_RF_CHIP_IDENT);
5752 	switch (value) {
5753 	case PCIC_RF_296:
5754 		pcic->pc_type = PCIC_RICOH;
5755 		pcic->pc_chipname = PCIC_TYPE_RF5C296;
5756 		return (1);
5757 	case PCIC_RF_396:
5758 		pcic->pc_type = PCIC_RICOH;
5759 		pcic->pc_chipname = PCIC_TYPE_RF5C396;
5760 		return (1);
5761 	}
5762 	return (0);
5763 }
5764 
5765 
5766 /*
5767  * set up available address spaces in busra
5768  */
5769 static void
5770 pcic_init_assigned(dev_info_t *dip)
5771 {
5772 	pcm_regs_t *pcic_avail_p;
5773 	pci_regspec_t *pci_avail_p, *regs;
5774 	int len, entries, rlen;
5775 	dev_info_t *pdip;
5776 
5777 	if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
5778 	    "available", (caddr_t)&pcic_avail_p, &len) == DDI_PROP_SUCCESS) {
5779 		/*
5780 		 * found "available" property at the cardbus/pcmcia node
5781 		 * need to translate address space entries from pcmcia
5782 		 * format to pci format
5783 		 */
5784 		entries = len / sizeof (pcm_regs_t);
5785 		pci_avail_p = kmem_alloc(sizeof (pci_regspec_t) * entries,
5786 			KM_SLEEP);
5787 		if (pcic_apply_avail_ranges(dip, pcic_avail_p, pci_avail_p,
5788 		    entries) == DDI_SUCCESS)
5789 			(void) pci_resource_setup_avail(dip, pci_avail_p,
5790 				entries);
5791 		kmem_free(pcic_avail_p, len);
5792 		kmem_free(pci_avail_p, entries * sizeof (pci_regspec_t));
5793 		return;
5794 	}
5795 
5796 	/*
5797 	 * "legacy" platforms will have "available" property in pci node
5798 	 */
5799 	for (pdip = ddi_get_parent(dip); pdip; pdip = ddi_get_parent(pdip)) {
5800 		if (ddi_getlongprop(DDI_DEV_T_ANY, pdip, DDI_PROP_DONTPASS,
5801 		    "available", (caddr_t)&pci_avail_p, &len) ==
5802 		    DDI_PROP_SUCCESS) {
5803 			/* (void) pci_resource_setup(pdip); */
5804 			kmem_free(pci_avail_p, len);
5805 			break;
5806 		}
5807 	}
5808 
5809 	if (pdip == NULL) {
5810 		int len;
5811 		char bus_type[16] = "(unknown)";
5812 		dev_info_t *par;
5813 
5814 		cmn_err(CE_CONT,
5815 		    "?pcic_init_assigned: no available property for pcmcia\n");
5816 
5817 		/*
5818 		 * This code is taken from pci_resource_setup() but does
5819 		 * not attempt to use the "available" property to populate
5820 		 * the ndi maps that are created.
5821 		 * The fact that we will actually
5822 		 * free some resource below (that was allocated by OBP)
5823 		 * should be enough to be going on with.
5824 		 */
5825 		for (par = dip; par != NULL; par = ddi_get_parent(par)) {
5826 			len = sizeof (bus_type);
5827 
5828 			if ((ddi_prop_op(DDI_DEV_T_ANY, par,
5829 			    PROP_LEN_AND_VAL_BUF,
5830 			    DDI_PROP_CANSLEEP | DDI_PROP_DONTPASS,
5831 			    "device_type",
5832 			    (caddr_t)&bus_type, &len) == DDI_SUCCESS) &&
5833 			    (strcmp(bus_type, DEVI_PCI_NEXNAME) == 0 ||
5834 				strcmp(bus_type, DEVI_PCIEX_NEXNAME) == 0))
5835 				break;
5836 		}
5837 		if (par != NULL &&
5838 		    (ndi_ra_map_setup(par, NDI_RA_TYPE_MEM) != NDI_SUCCESS ||
5839 		    ndi_ra_map_setup(par, NDI_RA_TYPE_IO) != NDI_SUCCESS))
5840 			par = NULL;
5841 	} else {
5842 #ifdef CARDBUS
5843 		cardbus_bus_range_t *bus_range;
5844 		int k;
5845 
5846 		if (ddi_getlongprop(DDI_DEV_T_ANY, pdip, 0, "bus-range",
5847 		    (caddr_t)&bus_range, &k) == DDI_PROP_SUCCESS) {
5848 			if (bus_range->lo != bus_range->hi)
5849 				pcic_err(pdip, 9, "allowable bus range is "
5850 				    "%u->%u\n", bus_range->lo, bus_range->hi);
5851 			else {
5852 				pcic_err(pdip, 0,
5853 				    "!No spare PCI bus numbers, range is "
5854 				    "%u->%u, cardbus isn't usable\n",
5855 				    bus_range->lo, bus_range->hi);
5856 			}
5857 			kmem_free(bus_range, k);
5858 		} else
5859 			pcic_err(pdip, 0, "!No bus-range property seems to "
5860 			    "have been set up\n");
5861 #endif
5862 		/*
5863 		 * Have a valid parent with the "available" property
5864 		 */
5865 		(void) pci_resource_setup(pdip);
5866 	}
5867 
5868 	if ((strcmp(ddi_get_name(dip), "pcma") == 0) &&
5869 	    ddi_getlongprop(DDI_DEV_T_NONE, dip, DDI_PROP_DONTPASS,
5870 	    "assigned-addresses",
5871 	    (caddr_t)&regs, &rlen) == DDI_SUCCESS) {
5872 		ra_return_t ra;
5873 
5874 		/*
5875 		 * On the UltraBook IIi the ranges are assigned under
5876 		 * openboot. If we don't free them here the first I/O
5877 		 * space that can be used is up above 0x10000 which
5878 		 * doesn't work for this driver due to restrictions
5879 		 * on the PCI I/O addresses the controllers can cope with.
5880 		 * They are never going to be used by anything else
5881 		 * so free them up to the general pool. AG.
5882 		 */
5883 		pcic_err(dip, 1, "Free assigned addresses\n");
5884 
5885 		if ((PCI_REG_ADDR_G(regs[0].pci_phys_hi) ==
5886 		    PCI_REG_ADDR_G(PCI_ADDR_MEM32)) &&
5887 		    regs[0].pci_size_low == 0x1000000) {
5888 			ra.ra_addr_lo = regs[0].pci_phys_low;
5889 			ra.ra_len = regs[0].pci_size_low;
5890 			(void) pcmcia_free_mem(dip, &ra);
5891 		}
5892 		if ((PCI_REG_ADDR_G(regs[1].pci_phys_hi) ==
5893 		    PCI_REG_ADDR_G(PCI_ADDR_IO)) &&
5894 		    (regs[1].pci_size_low == 0x8000 ||
5895 		    regs[1].pci_size_low == 0x4000))   /* UB-IIi || UB-I */
5896 		{
5897 			ra.ra_addr_lo = regs[1].pci_phys_low;
5898 			ra.ra_len = regs[1].pci_size_low;
5899 			(void) pcmcia_free_io(dip, &ra);
5900 		}
5901 		kmem_free((caddr_t)regs, rlen);
5902 	}
5903 }
5904 
5905 /*
5906  * translate "available" from pcmcia format to pci format
5907  */
5908 static int
5909 pcic_apply_avail_ranges(dev_info_t *dip, pcm_regs_t *pcic_p,
5910     pci_regspec_t *pci_p, int entries)
5911 {
5912 	int i, range_len, range_entries;
5913 	pcic_ranges_t *pcic_range_p;
5914 
5915 	if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "ranges",
5916 		    (caddr_t)&pcic_range_p, &range_len) != DDI_PROP_SUCCESS) {
5917 		cmn_err(CE_CONT, "?pcic_apply_avail_ranges: "
5918 			"no ranges property for pcmcia\n");
5919 		return (DDI_FAILURE);
5920 	}
5921 
5922 	range_entries = range_len / sizeof (pcic_ranges_t);
5923 
5924 	/* for each "available" entry to be translated */
5925 	for (i = 0; i < entries; i++, pcic_p++, pci_p++) {
5926 		int j;
5927 		pcic_ranges_t *range_p = pcic_range_p;
5928 		pci_p->pci_phys_hi = -1u; /* default invalid value */
5929 
5930 		/* for each "ranges" entry to be searched */
5931 		for (j = 0; j < range_entries; j++, range_p++) {
5932 			uint64_t range_end = range_p->pcic_range_caddrlo +
5933 				range_p->pcic_range_size;
5934 			uint64_t avail_end = pcic_p->phys_lo + pcic_p->phys_len;
5935 
5936 			if ((range_p->pcic_range_caddrhi != pcic_p->phys_hi) ||
5937 			    (range_p->pcic_range_caddrlo > pcic_p->phys_lo) ||
5938 			    (range_end < avail_end))
5939 				continue;
5940 
5941 			pci_p->pci_phys_hi = range_p->pcic_range_paddrhi;
5942 			pci_p->pci_phys_mid = range_p->pcic_range_paddrmid;
5943 			pci_p->pci_phys_low = range_p->pcic_range_paddrlo
5944 			    + (pcic_p->phys_lo - range_p->pcic_range_caddrlo);
5945 			pci_p->pci_size_hi = 0;
5946 			pci_p->pci_size_low = pcic_p->phys_len;
5947 		}
5948 	}
5949 	kmem_free(pcic_range_p, range_len);
5950 	return (DDI_SUCCESS);
5951 }
5952 
5953 static int
5954 pcic_open(dev_t *dev, int flag, int otyp, cred_t *cred)
5955 {
5956 #ifdef CARDBUS
5957 	if (cardbus_is_cb_minor(*dev))
5958 		return (cardbus_open(dev, flag, otyp, cred));
5959 #endif
5960 	return (EINVAL);
5961 }
5962 
5963 static int
5964 pcic_close(dev_t dev, int flag, int otyp, cred_t *cred)
5965 {
5966 #ifdef CARDBUS
5967 	if (cardbus_is_cb_minor(dev))
5968 		return (cardbus_close(dev, flag, otyp, cred));
5969 #endif
5970 	return (EINVAL);
5971 }
5972 
5973 static int
5974 pcic_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred,
5975 	int *rval)
5976 {
5977 #ifdef CARDBUS
5978 	if (cardbus_is_cb_minor(dev))
5979 		return (cardbus_ioctl(dev, cmd, arg, mode, cred, rval));
5980 #endif
5981 	return (EINVAL);
5982 }
5983 
5984 
5985 static boolean_t
5986 pcic_load_cardbus(pcicdev_t *pcic, const pcic_socket_t *sockp)
5987 {
5988 	uint32_t present_state;
5989 	dev_info_t *dip = pcic->dip;
5990 	set_socket_t s;
5991 	get_socket_t g;
5992 	boolean_t retval;
5993 	unsigned vccLevel;
5994 
5995 	pcic_err(dip, 8, "entering pcic_load_cardbus\n");
5996 
5997 	pcic_mutex_exit(&pcic->pc_lock);
5998 
5999 	bzero(&s, sizeof (set_socket_t));
6000 	s.socket = sockp->pcs_socket;
6001 	s.SCIntMask = SBM_CD|SBM_RDYBSY;
6002 	s.IFType = IF_CARDBUS;
6003 	s.State = (unsigned)~0;
6004 
6005 	present_state = pcic_getcb(pcic, CB_PRESENT_STATE);
6006 	if (present_state & PCIC_VCC_3VCARD)
6007 		s.VccLevel = PCIC_VCC_3VLEVEL;
6008 	else if (present_state & PCIC_VCC_5VCARD)
6009 		s.VccLevel = PCIC_VCC_5VLEVEL;
6010 	else {
6011 		cmn_err(CE_CONT,
6012 		    "pcic_load_cardbus: unsupported card voltage\n");
6013 		goto failure;
6014 	}
6015 	vccLevel = s.VccLevel;
6016 	s.Vpp1Level = s.Vpp2Level = 0;
6017 
6018 	if (pcic_set_socket(dip, &s) != SUCCESS)
6019 		goto failure;
6020 
6021 	if (pcic_reset_socket(dip, sockp->pcs_socket,
6022 	    RESET_MODE_CARD_ONLY) != SUCCESS)
6023 		goto failure;
6024 
6025 	bzero(&g, sizeof (get_socket_t));
6026 	g.socket = sockp->pcs_socket;
6027 	if (pcic_get_socket(dip, &g) != SUCCESS)
6028 		goto failure;
6029 
6030 	bzero(&s, sizeof (set_socket_t));
6031 	s.socket = sockp->pcs_socket;
6032 	s.SCIntMask = SBM_CD;
6033 	s.IREQRouting = g.IRQRouting;
6034 	s.IFType = g.IFType;
6035 	s.CtlInd = g.CtlInd;
6036 	s.State = (unsigned)~0;
6037 	s.VccLevel = vccLevel;
6038 	s.Vpp1Level = s.Vpp2Level = 0;
6039 
6040 	retval = pcic_set_socket(dip, &s);
6041 	pcmcia_cb_resumed(s.socket);
6042 	if (retval != SUCCESS)
6043 		goto failure;
6044 
6045 	retval = cardbus_load_cardbus(dip, sockp->pcs_socket, pcic->pc_base);
6046 	goto exit;
6047 
6048 failure:
6049 	retval = B_FALSE;
6050 
6051 exit:
6052 	pcic_mutex_enter(&pcic->pc_lock);
6053 	pcic_err(dip, 8, "exit pcic_load_cardbus (%s)\n",
6054 	    retval ? "success" : "failure");
6055 	return (retval);
6056 }
6057 
6058 static void
6059 pcic_unload_cardbus(pcicdev_t *pcic, const pcic_socket_t *sockp)
6060 {
6061 	dev_info_t *dip = pcic->dip;
6062 	set_socket_t s;
6063 
6064 	pcic_mutex_exit(&pcic->pc_lock);
6065 
6066 	cardbus_unload_cardbus(dip);
6067 
6068 	bzero(&s, sizeof (set_socket_t));
6069 	s.socket = sockp->pcs_socket;
6070 	s.SCIntMask = SBM_CD|SBM_RDYBSY;
6071 	s.IREQRouting = 0;
6072 	s.IFType = IF_MEMORY;
6073 	s.CtlInd = 0;
6074 	s.State = 0;
6075 	s.VccLevel = s.Vpp1Level = s.Vpp2Level = 0;
6076 
6077 	(void) pcic_set_socket(dip, &s);
6078 
6079 	pcic_mutex_enter(&pcic->pc_lock);
6080 }
6081 
6082 static uint32_t
6083 pcic_getcb(pcicdev_t *pcic, int reg)
6084 {
6085 	ASSERT(pcic->pc_io_type == PCIC_IO_TYPE_YENTA);
6086 
6087 	return (ddi_get32(pcic->handle,
6088 	    (uint32_t *)(pcic->ioaddr + CB_CB_OFFSET + reg)));
6089 }
6090 
6091 static void
6092 pcic_putcb(pcicdev_t *pcic, int reg, uint32_t value)
6093 {
6094 	ASSERT(pcic->pc_io_type == PCIC_IO_TYPE_YENTA);
6095 
6096 	ddi_put32(pcic->handle,
6097 	    (uint32_t *)(pcic->ioaddr + CB_CB_OFFSET + reg), value);
6098 }
6099 
6100 static void
6101 pcic_enable_io_intr(pcicdev_t *pcic, int socket, int irq)
6102 {
6103 	uint8_t value;
6104 	uint16_t brdgctl;
6105 
6106 	value = pcic_getb(pcic, socket, PCIC_INTERRUPT) & ~PCIC_INTR_MASK;
6107 	pcic_putb(pcic, socket, PCIC_INTERRUPT, value | irq);
6108 
6109 	switch (pcic->pc_type) {
6110 	case PCIC_INTEL_i82092:
6111 		pcic_82092_smiirq_ctl(pcic, socket, PCIC_82092_CTL_IRQ,
6112 		    PCIC_82092_INT_ENABLE);
6113 		break;
6114 	case PCIC_O2_OZ6912:
6115 		value = pcic_getb(pcic, 0, PCIC_CENTDMA);
6116 		value |= 0x8;
6117 		pcic_putb(pcic, 0, PCIC_CENTDMA, value);
6118 		break;
6119 	case PCIC_CL_PD6832:
6120 	case PCIC_TI_PCI1250:
6121 	case PCIC_TI_PCI1221:
6122 	case PCIC_TI_PCI1225:
6123 	case PCIC_TI_PCI1410:
6124 	case PCIC_ENE_1410:
6125 	case PCIC_TI_PCI1510:
6126 	case PCIC_TI_PCI1520:
6127 	case PCIC_TI_PCI1420:
6128 	case PCIC_ENE_1420:
6129 		/* route card functional interrupts to PCI interrupts */
6130 		brdgctl = ddi_get16(pcic->cfg_handle,
6131 		    (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL));
6132 		pcic_err(NULL, 1,
6133 		    "pcic_enable_io_intr brdgctl(0x%x) was: 0x%x\n",
6134 		    PCI_CBUS_BRIDGE_CTRL, brdgctl);
6135 		brdgctl &= ~PCIC_BRDGCTL_INTR_MASK;
6136 		ddi_put16(pcic->cfg_handle,
6137 		    (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL),
6138 		    brdgctl);
6139 		/* Flush the write */
6140 		(void) ddi_get16(pcic->cfg_handle,
6141 		    (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL));
6142 		break;
6143 	default:
6144 		break;
6145 	}
6146 }
6147 
6148 static void
6149 pcic_disable_io_intr(pcicdev_t *pcic, int socket)
6150 {
6151 	uint8_t value;
6152 	uint16_t brdgctl;
6153 
6154 	value = pcic_getb(pcic, socket, PCIC_INTERRUPT) & ~PCIC_INTR_MASK;
6155 	pcic_putb(pcic, socket, PCIC_INTERRUPT, value);
6156 
6157 	switch (pcic->pc_type) {
6158 	case PCIC_INTEL_i82092:
6159 		pcic_82092_smiirq_ctl(pcic, socket, PCIC_82092_CTL_IRQ,
6160 		    PCIC_82092_INT_DISABLE);
6161 		break;
6162 	case PCIC_O2_OZ6912:
6163 		value = pcic_getb(pcic, 0, PCIC_CENTDMA);
6164 		value &= ~0x8;
6165 		pcic_putb(pcic, 0, PCIC_CENTDMA, value);
6166 		/* Flush the write */
6167 		(void) pcic_getb(pcic, 0, PCIC_CENTDMA);
6168 		break;
6169 	case PCIC_CL_PD6832:
6170 	case PCIC_TI_PCI1250:
6171 	case PCIC_TI_PCI1221:
6172 	case PCIC_TI_PCI1225:
6173 	case PCIC_TI_PCI1410:
6174 	case PCIC_ENE_1410:
6175 	case PCIC_TI_PCI1510:
6176 	case PCIC_TI_PCI1520:
6177 	case PCIC_TI_PCI1420:
6178 	case PCIC_ENE_1420:
6179 		/*
6180 		 * This maps I/O interrupts to ExCA which
6181 		 * have been turned off by the write to
6182 		 * PCIC_INTERRUPT above. It would appear to
6183 		 * be the only way to actually turn I/O Ints off
6184 		 * while retaining CS Ints.
6185 		 */
6186 		brdgctl = ddi_get16(pcic->cfg_handle,
6187 		    (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL));
6188 		pcic_err(NULL, 1,
6189 		    "pcic_disable_io_intr brdgctl(0x%x) was: 0x%x\n",
6190 		    PCI_CBUS_BRIDGE_CTRL, brdgctl);
6191 		brdgctl |= PCIC_BRDGCTL_INTR_MASK;
6192 		ddi_put16(pcic->cfg_handle,
6193 		    (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL),
6194 		    brdgctl);
6195 		/* Flush the write */
6196 		(void) ddi_get16(pcic->cfg_handle,
6197 		    (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL));
6198 		break;
6199 	default:
6200 		break;
6201 	}
6202 }
6203 
6204 static void
6205 pcic_cb_enable_intr(dev_info_t *dip)
6206 {
6207 	anp_t *anp = ddi_get_driver_private(dip);
6208 	pcicdev_t *pcic = anp->an_private;
6209 
6210 	mutex_enter(&pcic->pc_lock);
6211 	pcic_enable_io_intr(pcic, 0, pcic->pc_sockets[0].pcs_irq);
6212 	mutex_exit(&pcic->pc_lock);
6213 }
6214 
6215 static void
6216 pcic_cb_disable_intr(dev_info_t *dip)
6217 {
6218 	anp_t *anp = ddi_get_driver_private(dip);
6219 	pcicdev_t *pcic = anp->an_private;
6220 
6221 	mutex_enter(&pcic->pc_lock);
6222 	pcic_disable_io_intr(pcic, 0);
6223 	mutex_exit(&pcic->pc_lock);
6224 }
6225 
6226 static int
6227 log_pci_cfg_err(ushort_t e, int bridge_secondary)
6228 {
6229 	int	nerr = 0;
6230 	if (e & PCI_STAT_PERROR) {
6231 		nerr++;
6232 		cmn_err(CE_CONT, "detected parity error.\n");
6233 	}
6234 	if (e & PCI_STAT_S_SYSERR) {
6235 		nerr++;
6236 		if (bridge_secondary)
6237 			cmn_err(CE_CONT, "received system error.\n");
6238 		else
6239 			cmn_err(CE_CONT, "signalled system error.\n");
6240 	}
6241 	if (e & PCI_STAT_R_MAST_AB) {
6242 		nerr++;
6243 		cmn_err(CE_CONT, "received master abort.\n");
6244 	}
6245 	if (e & PCI_STAT_R_TARG_AB)
6246 		cmn_err(CE_CONT, "received target abort.\n");
6247 	if (e & PCI_STAT_S_TARG_AB)
6248 		cmn_err(CE_CONT, "signalled target abort\n");
6249 	if (e & PCI_STAT_S_PERROR) {
6250 		nerr++;
6251 		cmn_err(CE_CONT, "signalled parity error\n");
6252 	}
6253 	return (nerr);
6254 }
6255 
6256 #if defined(__sparc)
6257 static int
6258 pcic_fault(enum pci_fault_ops op, void *arg)
6259 {
6260 	pcicdev_t *pcic = (pcicdev_t *)arg;
6261 	ushort_t pci_cfg_stat =
6262 	    pci_config_get16(pcic->cfg_handle, PCI_CONF_STAT);
6263 	ushort_t pci_cfg_sec_stat =
6264 	    pci_config_get16(pcic->cfg_handle, 0x16);
6265 	char	nm[24];
6266 	int	nerr = 0;
6267 
6268 	cardbus_dump_pci_config(pcic->dip);
6269 
6270 	switch (op) {
6271 	case FAULT_LOG:
6272 		(void) sprintf(nm, "%s-%d", ddi_driver_name(pcic->dip),
6273 		    ddi_get_instance(pcic->dip));
6274 
6275 		cmn_err(CE_WARN, "%s: PCIC fault log start:\n", nm);
6276 		cmn_err(CE_WARN, "%s: primary err (%x):\n", nm, pci_cfg_stat);
6277 		nerr += log_pci_cfg_err(pci_cfg_stat, 0);
6278 		cmn_err(CE_WARN, "%s: sec err (%x):\n", nm, pci_cfg_sec_stat);
6279 		nerr += log_pci_cfg_err(pci_cfg_sec_stat, 1);
6280 		cmn_err(CE_CONT, "%s: PCI fault log end.\n", nm);
6281 		return (nerr);
6282 	case FAULT_POKEFINI:
6283 	case FAULT_RESET:
6284 		pci_config_put16(pcic->cfg_handle,
6285 		    PCI_CONF_STAT, pci_cfg_stat);
6286 		pci_config_put16(pcic->cfg_handle, 0x16, pci_cfg_sec_stat);
6287 		break;
6288 	case FAULT_POKEFLT:
6289 		if (!(pci_cfg_stat & PCI_STAT_S_SYSERR))
6290 			return (1);
6291 		if (!(pci_cfg_sec_stat & PCI_STAT_R_MAST_AB))
6292 			return (1);
6293 		break;
6294 	default:
6295 		break;
6296 	}
6297 	return (DDI_SUCCESS);
6298 }
6299 #endif
6300 
6301 static void
6302 pcic_do_resume(pcicdev_t *pcic)
6303 {
6304 	int	i, interrupt;
6305 	uint8_t cfg;
6306 
6307 
6308 #if defined(PCIC_DEBUG)
6309 	pcic_err(NULL, 6, "pcic_do_resume(): entered\n");
6310 #endif
6311 
6312 	pcic_mutex_enter(&pcic->pc_lock); /* protect the registers */
6313 	for (i = 0; i < pcic->pc_numsockets; i++) {
6314 		/* Enable interrupts  on PCI if needs be */
6315 		interrupt = pcic_getb(pcic, i, PCIC_INTERRUPT);
6316 		if (pcic->pc_flags & PCF_USE_SMI)
6317 			interrupt |= PCIC_INTR_ENABLE;
6318 		pcic_putb(pcic, i, PCIC_INTERRUPT,
6319 		    PCIC_RESET | interrupt);
6320 		pcic->pc_sockets[i].pcs_debounce_id =
6321 		    pcic_add_debqueue(&pcic->pc_sockets[i],
6322 		    drv_usectohz(pcic_debounce_time));
6323 	}
6324 	pcic_mutex_exit(&pcic->pc_lock); /* protect the registers */
6325 	if (pcic_do_pcmcia_sr)
6326 		(void) pcmcia_wait_insert(pcic->dip);
6327 	/*
6328 	 * The CardBus controller may be in RESET state after the
6329 	 * system is resumed from sleeping. The RESET bit is in
6330 	 * the Bridge Control register. This is true for all(TI,
6331 	 * Toshiba ToPIC95/97, RICOH, and O2Micro) CardBus
6332 	 * controllers. Need to clear the RESET bit explicitly.
6333 	 */
6334 	cfg = ddi_get8(pcic->cfg_handle,
6335 		pcic->cfgaddr + PCIC_BRIDGE_CTL_REG);
6336 	if (cfg & (1<<6)) {
6337 		cfg &= ~(1<<6);
6338 		ddi_put8(pcic->cfg_handle,
6339 			pcic->cfgaddr + PCIC_BRIDGE_CTL_REG,
6340 			cfg);
6341 		cfg = ddi_get8(pcic->cfg_handle,
6342 			pcic->cfgaddr + PCIC_BRIDGE_CTL_REG);
6343 		if (cfg & (1<<6)) {
6344 		    pcic_err(pcic->dip, 1, "Failed to take pcic out of reset");
6345 		}
6346 	}
6347 
6348 }
6349 
6350 static void
6351 pcic_debounce(pcic_socket_t *pcs)
6352 {
6353 	uint8_t status, stschng;
6354 
6355 	pcic_mutex_enter(&pcs->pcs_pcic->pc_lock);
6356 	pcs->pcs_flags &= ~PCS_STARTING;
6357 	stschng = pcic_getb(pcs->pcs_pcic, pcs->pcs_socket,
6358 	    PCIC_CARD_STATUS_CHANGE);
6359 	status = pcic_getb(pcs->pcs_pcic, pcs->pcs_socket,
6360 	    PCIC_INTERFACE_STATUS);
6361 #ifdef PCIC_DEBUG
6362 	pcic_err(pcs->pcs_pcic->dip, 8,
6363 	    "pcic_debounce(0x%p, dip=0x%p) socket %d st 0x%x "
6364 	    "chg 0x%x flg 0x%x\n",
6365 	    (void *)pcs, (void *) pcs->pcs_pcic->dip, pcs->pcs_socket,
6366 	    status, stschng, pcs->pcs_flags);
6367 #endif
6368 
6369 	pcic_putb(pcs->pcs_pcic, pcs->pcs_socket, PCIC_CARD_STATUS_CHANGE,
6370 	    PCIC_CD_DETECT);
6371 	pcic_handle_cd_change(pcs->pcs_pcic, pcs, status);
6372 	pcic_mutex_exit(&pcs->pcs_pcic->pc_lock);
6373 }
6374 
6375 static void
6376 pcic_deb_thread()
6377 {
6378 	callb_cpr_t cprinfo;
6379 	struct debounce *debp;
6380 	clock_t lastt;
6381 
6382 	CALLB_CPR_INIT(&cprinfo, &pcic_deb_mtx,
6383 	    callb_generic_cpr, "pcic debounce thread");
6384 	mutex_enter(&pcic_deb_mtx);
6385 	while (pcic_deb_threadid) {
6386 		while (pcic_deb_queue) {
6387 #ifdef PCIC_DEBUG
6388 			pcic_dump_debqueue("Thread");
6389 #endif
6390 			debp = pcic_deb_queue;
6391 			(void) drv_getparm(LBOLT, &lastt);
6392 			if (lastt >= debp->expire) {
6393 				pcic_deb_queue = debp->next;
6394 				mutex_exit(&pcic_deb_mtx);
6395 				pcic_debounce(debp->pcs);
6396 				mutex_enter(&pcic_deb_mtx);
6397 				kmem_free(debp, sizeof (*debp));
6398 			} else {
6399 				(void) cv_timedwait(&pcic_deb_cv,
6400 				    &pcic_deb_mtx, debp->expire);
6401 			}
6402 		}
6403 		CALLB_CPR_SAFE_BEGIN(&cprinfo);
6404 		cv_wait(&pcic_deb_cv, &pcic_deb_mtx);
6405 		CALLB_CPR_SAFE_END(&cprinfo, &pcic_deb_mtx);
6406 	}
6407 	pcic_deb_threadid = (kthread_t *)1;
6408 	cv_signal(&pcic_deb_cv);
6409 	CALLB_CPR_EXIT(&cprinfo);	/* Also exits the mutex */
6410 	thread_exit();
6411 }
6412 
6413 static void *
6414 pcic_add_debqueue(pcic_socket_t *pcs, int clocks)
6415 {
6416 	clock_t lbolt;
6417 	struct debounce *dbp, **dbpp = &pcic_deb_queue;
6418 
6419 	(void) drv_getparm(LBOLT, &lbolt);
6420 	dbp = kmem_alloc(sizeof (struct debounce), KM_SLEEP);
6421 
6422 	dbp->expire = lbolt + clocks;
6423 	dbp->pcs = pcs;
6424 	mutex_enter(&pcic_deb_mtx);
6425 	while (*dbpp) {
6426 		if (dbp->expire > (*dbpp)->expire)
6427 			dbpp = &((*dbpp)->next);
6428 		else
6429 			break;
6430 	}
6431 	dbp->next = *dbpp;
6432 	*dbpp = dbp;
6433 #ifdef PCIC_DEBUG
6434 	pcic_dump_debqueue("Add");
6435 #endif
6436 	cv_signal(&pcic_deb_cv);
6437 	mutex_exit(&pcic_deb_mtx);
6438 	return (dbp);
6439 }
6440 
6441 static void
6442 pcic_rm_debqueue(void *id)
6443 {
6444 	struct debounce *dbp, **dbpp = &pcic_deb_queue;
6445 
6446 	dbp = (struct debounce *)id;
6447 	mutex_enter(&pcic_deb_mtx);
6448 	while (*dbpp) {
6449 		if (*dbpp == dbp) {
6450 			*dbpp = dbp->next;
6451 			kmem_free(dbp, sizeof (*dbp));
6452 #ifdef PCIC_DEBUG
6453 			pcic_dump_debqueue("Remove");
6454 #endif
6455 			cv_signal(&pcic_deb_cv);
6456 			mutex_exit(&pcic_deb_mtx);
6457 			return;
6458 		}
6459 		dbpp = &((*dbpp)->next);
6460 	}
6461 	pcic_err(NULL, 6, "pcic: Failed to find debounce id 0x%p\n", id);
6462 	mutex_exit(&pcic_deb_mtx);
6463 }
6464 
6465 
6466 static int	pcic_powerdelay = 0;
6467 
6468 static int
6469 pcic_exca_powerctl(pcicdev_t *pcic, int socket, int powerlevel)
6470 {
6471 	int	ind, value, orig_pwrctl;
6472 
6473 	/* power setup -- if necessary */
6474 	orig_pwrctl = pcic_getb(pcic, socket, PCIC_POWER_CONTROL);
6475 
6476 #if defined(PCIC_DEBUG)
6477 	pcic_err(pcic->dip, 6,
6478 	    "pcic_exca_powerctl(socket %d) powerlevel=%x orig 0x%x\n",
6479 	    socket, powerlevel, orig_pwrctl);
6480 #endif
6481 	/* Preserve the PCIC_OUTPUT_ENABLE (control lines output enable) bit. */
6482 	powerlevel = (powerlevel & ~POWER_OUTPUT_ENABLE) |
6483 	    (orig_pwrctl & POWER_OUTPUT_ENABLE);
6484 	if (powerlevel != orig_pwrctl) {
6485 		if (powerlevel & ~POWER_OUTPUT_ENABLE) {
6486 			int	ifs;
6487 			/*
6488 			 * set power to socket
6489 			 * note that the powerlevel was calculated earlier
6490 			 */
6491 			pcic_putb(pcic, socket, PCIC_POWER_CONTROL, powerlevel);
6492 			(void) pcic_getb(pcic, socket, PCIC_POWER_CONTROL);
6493 
6494 			/*
6495 			 * this second write to the power control register
6496 			 * is needed to resolve a problem on
6497 			 * the IBM ThinkPad 750
6498 			 * where the first write doesn't latch.
6499 			 * The second write appears to always work and
6500 			 * doesn't hurt the operation of other chips
6501 			 * so we can just use it -- this is good since we can't
6502 			 * determine what chip the 750 actually uses
6503 			 * (I suspect an early Ricoh).
6504 			 */
6505 			pcic_putb(pcic, socket, PCIC_POWER_CONTROL, powerlevel);
6506 
6507 			value = pcic_getb(pcic, socket, PCIC_POWER_CONTROL);
6508 			pcic_mswait(pcic, socket, pcic_powerdelay);
6509 #if defined(PCIC_DEBUG)
6510 			pcic_err(pcic->dip, 8,
6511 			    "\tpowerlevel reg = %x (ifs %x)\n",
6512 			    value, pcic_getb(pcic, socket,
6513 			    PCIC_INTERFACE_STATUS));
6514 			pcic_err(pcic->dip, 8,
6515 			    "CBus regs: PS 0x%x, Control 0x%x\n",
6516 			    pcic_getcb(pcic, CB_PRESENT_STATE),
6517 			    pcic_getcb(pcic, CB_CONTROL));
6518 #endif
6519 			/*
6520 			 * since power was touched, make sure it says it
6521 			 * is on.  This lets it become stable.
6522 			 */
6523 			for (ind = 0; ind < 20; ind++) {
6524 				ifs = pcic_getb(pcic, socket,
6525 				    PCIC_INTERFACE_STATUS);
6526 				if (ifs & PCIC_POWER_ON)
6527 					break;
6528 				else {
6529 					pcic_putb(pcic, socket,
6530 					    PCIC_POWER_CONTROL, 0);
6531 					(void) pcic_getb(pcic, socket,
6532 					    PCIC_POWER_CONTROL);
6533 					pcic_mswait(pcic, socket, 40);
6534 					if (ind == 10) {
6535 						pcic_putcb(pcic, CB_EVENT_FORCE,
6536 						    CB_EF_CVTEST);
6537 						pcic_mswait(pcic, socket, 100);
6538 					}
6539 					pcic_putb(pcic, socket,
6540 					    PCIC_POWER_CONTROL,
6541 					    powerlevel & ~POWER_OUTPUT_ENABLE);
6542 					(void) pcic_getb(pcic, socket,
6543 					    PCIC_POWER_CONTROL);
6544 					pcic_mswait(pcic, socket,
6545 					    pcic_powerdelay);
6546 					pcic_putb(pcic, socket,
6547 					    PCIC_POWER_CONTROL, powerlevel);
6548 					(void) pcic_getb(pcic, socket,
6549 					    PCIC_POWER_CONTROL);
6550 					pcic_mswait(pcic, socket,
6551 					    pcic_powerdelay);
6552 				}
6553 			}
6554 
6555 			if (!(ifs & PCIC_POWER_ON)) {
6556 				cmn_err(CE_WARN,
6557 				    "pcic socket %d: Power didn't get turned"
6558 				    "on!\nif status 0x%x pwrc 0x%x(x%x) "
6559 				    "misc1 0x%x igc 0x%x ind %d\n",
6560 				    socket, ifs,
6561 				    pcic_getb(pcic, socket, PCIC_POWER_CONTROL),
6562 				    orig_pwrctl,
6563 				    pcic_getb(pcic, socket, PCIC_MISC_CTL_1),
6564 				    pcic_getb(pcic, socket, PCIC_INTERRUPT),
6565 				    ind);
6566 				return (BAD_VCC);
6567 			}
6568 #if defined(PCIC_DEBUG)
6569 			pcic_err(pcic->dip, 8,
6570 			    "\tind = %d, if status %x pwrc 0x%x "
6571 			    "misc1 0x%x igc 0x%x\n",
6572 			    ind, ifs,
6573 			    pcic_getb(pcic, socket, PCIC_POWER_CONTROL),
6574 			    pcic_getb(pcic, socket, PCIC_MISC_CTL_1),
6575 			    pcic_getb(pcic, socket, PCIC_INTERRUPT));
6576 #endif
6577 		} else {
6578 			/* explicitly turned off the power */
6579 			pcic_putb(pcic, socket, PCIC_POWER_CONTROL, powerlevel);
6580 			(void) pcic_getb(pcic, socket, PCIC_POWER_CONTROL);
6581 		}
6582 	}
6583 	return (SUCCESS);
6584 }
6585 
6586 static int pcic_cbdoreset_during_poweron = 1;
6587 static int
6588 pcic_cbus_powerctl(pcicdev_t *pcic, int socket)
6589 {
6590 	uint32_t cbctl = 0, orig_cbctl, cbstev, cbps;
6591 	int ind, iobits;
6592 	pcic_socket_t *sockp = &pcic->pc_sockets[socket];
6593 
6594 	pcic_putcb(pcic, CB_STATUS_EVENT, CB_SE_POWER_CYCLE);
6595 
6596 	ind = pcic_power[sockp->pcs_vpp1].PowerLevel/10;
6597 	cbctl |= pcic_cbv_levels[ind];
6598 
6599 	ind = pcic_power[sockp->pcs_vcc].PowerLevel/10;
6600 	cbctl |= (pcic_cbv_levels[ind]<<4);
6601 
6602 	orig_cbctl = pcic_getcb(pcic, CB_CONTROL);
6603 
6604 #if defined(PCIC_DEBUG)
6605 	pcic_err(pcic->dip, 6,
6606 	    "pcic_cbus_powerctl(socket %d) vcc %d vpp1 %d "
6607 	    "cbctl 0x%x->0x%x\n",
6608 	    socket, sockp->pcs_vcc, sockp->pcs_vpp1, orig_cbctl, cbctl);
6609 #endif
6610 	if (cbctl != orig_cbctl) {
6611 	    if (pcic_cbdoreset_during_poweron &&
6612 		(orig_cbctl & (CB_C_VCCMASK|CB_C_VPPMASK)) == 0) {
6613 		iobits = pcic_getb(pcic, socket, PCIC_INTERRUPT);
6614 		pcic_putb(pcic, socket, PCIC_INTERRUPT, iobits & ~PCIC_RESET);
6615 	    }
6616 	    pcic_putcb(pcic, CB_CONTROL, cbctl);
6617 
6618 	    if ((cbctl & CB_C_VCCMASK) == (orig_cbctl & CB_C_VCCMASK)) {
6619 		pcic_mswait(pcic, socket, pcic_powerdelay);
6620 		return (SUCCESS);
6621 	    }
6622 	    for (ind = 0; ind < 20; ind++) {
6623 		cbstev = pcic_getcb(pcic, CB_STATUS_EVENT);
6624 
6625 		if (cbstev & CB_SE_POWER_CYCLE) {
6626 
6627 		/*
6628 		 * delay 400 ms: though the standard defines that the Vcc
6629 		 * set-up time is 20 ms, some PC-Card bridge requires longer
6630 		 * duration.
6631 		 * Note: We should check the status AFTER the delay to give time
6632 		 * for things to stabilize.
6633 		 */
6634 		    pcic_mswait(pcic, socket, 400);
6635 
6636 		    cbps = pcic_getcb(pcic, CB_PRESENT_STATE);
6637 		    if (cbctl && !(cbps & CB_PS_POWER_CYCLE)) {
6638 			/* break; */
6639 			cmn_err(CE_WARN, "cbus_powerctl: power off??\n");
6640 		    }
6641 		    if (cbctl & CB_PS_BADVCC) {
6642 			cmn_err(CE_WARN, "cbus_powerctl: bad power request\n");
6643 			break;
6644 		    }
6645 
6646 #if defined(PCIC_DEBUG)
6647 		    pcic_err(pcic->dip, 8,
6648 			"cbstev = 0x%x cbps = 0x%x cbctl 0x%x(0x%x)",
6649 			cbstev, pcic_getcb(pcic, CB_PRESENT_STATE),
6650 			cbctl, orig_cbctl);
6651 #endif
6652 		    if (pcic_cbdoreset_during_poweron &&
6653 			(orig_cbctl & (CB_C_VCCMASK|CB_C_VPPMASK)) == 0) {
6654 			pcic_putb(pcic, socket, PCIC_INTERRUPT, iobits);
6655 		    }
6656 		    return (SUCCESS);
6657 		}
6658 		pcic_mswait(pcic, socket, 40);
6659 	    }
6660 	    if (pcic_cbdoreset_during_poweron &&
6661 		(orig_cbctl & (CB_C_VCCMASK|CB_C_VPPMASK)) == 0) {
6662 		pcic_putb(pcic, socket, PCIC_INTERRUPT, iobits);
6663 	    }
6664 	    cmn_err(CE_WARN,
6665 		    "pcic socket %d: Power didn't get turned on/off!\n"
6666 		    "cbstev = 0x%x cbps = 0x%x cbctl 0x%x(0x%x) "
6667 		    "vcc %d vpp1 %d", socket, cbstev,
6668 		    pcic_getcb(pcic, CB_PRESENT_STATE),
6669 		    cbctl, orig_cbctl, sockp->pcs_vcc, sockp->pcs_vpp1);
6670 	    return (BAD_VCC);
6671 	}
6672 	return (SUCCESS);
6673 }
6674 
6675 static int	pcic_do_pprintf = 0;
6676 
6677 static void
6678 pcic_dump_debqueue(char *msg)
6679 {
6680 	struct debounce *debp = pcic_deb_queue;
6681 	clock_t lbolt;
6682 
6683 	(void) drv_getparm(LBOLT, &lbolt);
6684 	pcic_err(NULL, 6, debp ? "pcic debounce list (%s) lbolt 0x%x:\n" :
6685 	    "pcic debounce_list (%s) EMPTY lbolt 0x%x\n", msg, lbolt);
6686 	while (debp) {
6687 		pcic_err(NULL, 6, "%p: exp 0x%x next 0x%p id 0x%p\n",
6688 		    (void *) debp, (int)debp->expire, (void *) debp->next,
6689 		    debp->pcs->pcs_debounce_id);
6690 		debp = debp->next;
6691 	}
6692 }
6693 
6694 
6695 /* PRINTFLIKE3 */
6696 static void
6697 pcic_err(dev_info_t *dip, int level, const char *fmt, ...)
6698 {
6699 	if (pcic_debug && (level <= pcic_debug)) {
6700 		va_list adx;
6701 		int	instance;
6702 		char	buf[256];
6703 		const char	*name;
6704 #if !defined(PCIC_DEBUG)
6705 		int	ce;
6706 		char	qmark = 0;
6707 
6708 		if (level <= 3)
6709 			ce = CE_WARN;
6710 		else
6711 			ce = CE_CONT;
6712 		if (level == 4)
6713 			qmark = 1;
6714 #endif
6715 
6716 		if (dip) {
6717 			instance = ddi_get_instance(dip);
6718 			/* name = ddi_binding_name(dip); */
6719 			name = ddi_driver_name(dip);
6720 		} else {
6721 			instance = 0;
6722 			name = "";
6723 		}
6724 
6725 		va_start(adx, fmt);
6726 		(void) vsprintf(buf, fmt, adx);
6727 		va_end(adx);
6728 
6729 #if defined(PCIC_DEBUG)
6730 		if (pcic_do_pprintf) {
6731 			if (dip) {
6732 				if (instance >= 0)
6733 					prom_printf("%s(%d),0x%p: %s", name,
6734 					    instance, dip, buf);
6735 				else
6736 					prom_printf("%s,0x%p: %s",
6737 					    name, dip, buf);
6738 			} else
6739 				prom_printf(buf);
6740 		} else {
6741 			if (dip) {
6742 				if (instance >= 0)
6743 					cmn_err(CE_CONT, "%s(%d),0x%p: %s",
6744 					    name, instance, (void *) dip, buf);
6745 				else
6746 					cmn_err(CE_CONT, "%s,0x%p: %s",
6747 					    name, (void *) dip, buf);
6748 			} else
6749 				cmn_err(CE_CONT, buf);
6750 		}
6751 #else
6752 		if (dip)
6753 			cmn_err(ce, qmark ? "?%s%d: %s" : "%s%d: %s", name,
6754 			    instance, buf);
6755 		else
6756 			cmn_err(ce, qmark ? "?%s" : buf, buf);
6757 #endif
6758 	}
6759 }
6760