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