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 */ 1229