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