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