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, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #pragma ident   "%Z%%M% %I%     %E% SMI"
  28 
  29 /*
  30  * This is the PCMCIA Card Services kernel stubs module. It provides
  31  *      the various PCMCIA kernel framework entry points.
  32  */
  33 
  34 #if defined(DEBUG)
  35 #define CS_STUBS_DEBUG
  36 #endif
  37 
  38 #include <sys/types.h>
  39 #include <sys/systm.h>
  40 #include <sys/user.h>
  41 #include <sys/buf.h>
  42 #include <sys/file.h>
  43 #include <sys/uio.h>
  44 #include <sys/conf.h>
  45 #include <sys/stat.h>
  46 #include <sys/autoconf.h>
  47 #include <sys/vtoc.h>
  48 #include <sys/dkio.h>
  49 #include <sys/ddi.h>
  50 #include <sys/sunddi.h>
  51 #include <sys/debug.h>
  52 #include <sys/varargs.h>
  53 #include <sys/var.h>
  54 #include <sys/proc.h>
  55 #include <sys/thread.h>
  56 #include <sys/utsname.h>
  57 #include <sys/vtrace.h>
  58 #include <sys/kstat.h>
  59 #include <sys/kmem.h>
  60 #include <sys/modctl.h>
  61 #include <sys/kobj.h>
  62 #include <sys/callb.h>
  63 
  64 #include <sys/pctypes.h>
  65 #include <pcmcia/sys/cs_types.h>
  66 #include <sys/pcmcia.h>
  67 #include <sys/sservice.h>
  68 #include <pcmcia/sys/cis.h>
  69 #include <pcmcia/sys/cis_handlers.h>
  70 #include <pcmcia/sys/cs.h>
  71 #include <pcmcia/sys/cs_priv.h>
  72 #include <pcmcia/sys/cs_stubs.h>
  73 
  74 #ifdef  CS_STUBS_DEBUG
  75 int cs_stubs_debug = 0;
  76 #endif
  77 
  78 static csfunction_t *cardservices = NULL;
  79 static int do_cs_call = 0;
  80 static int cs_no_carservices(void);
  81 
  82 #define CardServices    (do_cs_call ? (*cardservices) :         \
  83                         ((csfunction_t *)cs_no_carservices))
  84 
  85 #ifdef  USE_CS_STUBS_MODULE
  86 
  87 /*
  88  * Module linkage information for the kernel.
  89  */
  90 static struct modlmisc modlmisc = {
  91         &mod_miscops,
  92         "PCMCIA Card Services stub module"
  93 };
  94 
  95 static struct modlinkage modlinkage = {
  96         MODREV_1,
  97         (void *)&modlmisc,
  98         NULL
  99 };
 100 
 101 int
 102 _init(void)
 103 {
 104         return (mod_install(&modlinkage));
 105 }
 106 
 107 int
 108 _fini(void)
 109 {
 110         if (!do_cs_call)
 111             return (mod_remove(&modlinkage));
 112         else
 113             return (EBUSY);
 114 }
 115 
 116 int
 117 _info(struct modinfo *modinfop)
 118 {
 119         return (mod_info(&modlinkage, modinfop));
 120 }
 121 #endif  /* USE_CS_STUBS_MODULE */
 122 
 123 /*
 124  * csx_register_cardservices - The Card Services loadable module
 125  *      calls this runction to register it's entry point.
 126  *
 127  * Returns:     CS_SUCCESS - if operation sucessful
 128  *              CS_UNSUPPORTED_FUNCTION - if invalid function code
 129  *              CS_BAD_HANDLE - if Card Services is not registered
 130  */
 131 int32_t
 132 csx_register_cardservices(cs_register_cardservices_t *rcs)
 133 {
 134 #ifdef  CS_STUBS_DEBUG
 135         if (cs_stubs_debug > 2)
 136             cmn_err(CE_CONT, "csx_register_cardservices: "
 137                 "magic: 0x%x function: 0x%x cardservices: 0x%p\n",
 138                 rcs->magic, rcs->function, (void *)rcs->cardservices);
 139 #endif
 140 
 141         if (rcs->magic != CS_STUBS_MAGIC)
 142             return (CS_BAD_ARGS);
 143 
 144         switch (rcs->function) {
 145             case CS_ENTRY_REGISTER:
 146                 cardservices = rcs->cardservices;
 147                 do_cs_call = 1;
 148 #ifdef  CS_STUBS_DEBUG
 149         if (cs_stubs_debug > 2)
 150             cmn_err(CE_CONT, "csx_register_cardservices: CS_ENTRY_REGISTER\n");
 151 #endif
 152 
 153                 return (CS_SUCCESS);
 154 
 155             case CS_ENTRY_DEREGISTER:
 156                 do_cs_call = 0;
 157                 cardservices = (csfunction_t *)cs_no_carservices;
 158 #ifdef  CS_STUBS_DEBUG
 159         if (cs_stubs_debug > 2)
 160             cmn_err(CE_CONT,
 161                 "csx_register_cardservices: CS_ENTRY_DEREGISTER\n");
 162 #endif
 163                 return (CS_UNSUPPORTED_FUNCTION);
 164 
 165             case CS_ENTRY_INQUIRE:
 166                 rcs->cardservices = cardservices;
 167 #ifdef  CS_STUBS_DEBUG
 168         if (cs_stubs_debug > 2)
 169             cmn_err(CE_CONT, "csx_register_cardservices: CS_ENTRY_INQUIRE\n");
 170 #endif
 171 
 172                 if (do_cs_call)
 173                     return (CS_SUCCESS);
 174                 else
 175                     return (CS_BAD_HANDLE);
 176 
 177             default:
 178 #ifdef  CS_STUBS_DEBUG
 179         if (cs_stubs_debug > 2)
 180             cmn_err(CE_CONT, "csx_register_cardservices: (unknown function)\n");
 181 #endif
 182                 return (CS_UNSUPPORTED_FUNCTION);
 183         }
 184 
 185 }
 186 
 187 int32_t
 188 csx_RegisterClient(client_handle_t *ch, client_reg_t *cr)
 189 {
 190 #ifdef  CS_STUBS_DEBUG
 191         if (cs_stubs_debug > 3)
 192             cmn_err(CE_CONT, "csx_RegisterClient: (no handle yet)\n");
 193 #endif
 194         return (CardServices(RegisterClient, ch, cr));
 195 }
 196 
 197 int32_t
 198 csx_DeregisterClient(client_handle_t ch)
 199 {
 200 #ifdef  CS_STUBS_DEBUG
 201         if (cs_stubs_debug > 3)
 202             cmn_err(CE_CONT, "csx_DeregisterClient: handle: 0x%x\n", ch);
 203 #endif
 204         return (CardServices(DeregisterClient, ch));
 205 }
 206 
 207 int32_t
 208 csx_GetStatus(client_handle_t ch, get_status_t *gs)
 209 {
 210 #ifdef  CS_STUBS_DEBUG
 211         if (cs_stubs_debug > 3)
 212             cmn_err(CE_CONT, "csx_GetStatus: handle: 0x%x\n", ch);
 213 #endif
 214         return (CardServices(GetStatus, ch, gs));
 215 }
 216 
 217 int32_t
 218 csx_SetEventMask(client_handle_t ch, sockevent_t *se)
 219 {
 220 #ifdef  CS_STUBS_DEBUG
 221         if (cs_stubs_debug > 3)
 222             cmn_err(CE_CONT, "csx_SetEventMask: handle: 0x%x\n", ch);
 223 #endif
 224         return (CardServices(SetEventMask, ch, se));
 225 }
 226 
 227 int32_t
 228 csx_GetEventMask(client_handle_t ch, sockevent_t *se)
 229 {
 230 #ifdef  CS_STUBS_DEBUG
 231         if (cs_stubs_debug > 3)
 232             cmn_err(CE_CONT, "csx_GetEventMask: handle: 0x%x\n", ch);
 233 #endif
 234         return (CardServices(GetEventMask, ch, se));
 235 }
 236 
 237 int32_t
 238 csx_RequestIO(client_handle_t ch, io_req_t *ior)
 239 {
 240 #ifdef  CS_STUBS_DEBUG
 241         if (cs_stubs_debug > 3)
 242             cmn_err(CE_CONT, "csx_RequestIO: handle: 0x%x\n", ch);
 243 #endif
 244         return (CardServices(RequestIO, ch, ior));
 245 }
 246 
 247 int32_t
 248 csx_ReleaseIO(client_handle_t ch, io_req_t *ior)
 249 {
 250 #ifdef  CS_STUBS_DEBUG
 251         if (cs_stubs_debug > 3)
 252             cmn_err(CE_CONT, "csx_ReleaseIO: handle: 0x%x\n", ch);
 253 #endif
 254         return (CardServices(ReleaseIO, ch, ior));
 255 }
 256 
 257 int32_t
 258 csx_RequestIRQ(client_handle_t ch, irq_req_t *irqr)
 259 {
 260 #ifdef  CS_STUBS_DEBUG
 261         if (cs_stubs_debug > 3)
 262             cmn_err(CE_CONT, "csx_RequestIRQ: handle: 0x%x\n", ch);
 263 #endif
 264         return (CardServices(RequestIRQ, ch, irqr));
 265 }
 266 
 267 int32_t
 268 csx_ReleaseIRQ(client_handle_t ch, irq_req_t *irqr)
 269 {
 270 #ifdef  CS_STUBS_DEBUG
 271         if (cs_stubs_debug > 3)
 272             cmn_err(CE_CONT, "csx_ReleaseIRQ: handle: 0x%x\n", ch);
 273 #endif
 274         return (CardServices(ReleaseIRQ, ch, irqr));
 275 }
 276 
 277 int32_t
 278 csx_RequestWindow(client_handle_t ch, window_handle_t *wh, win_req_t *wr)
 279 {
 280 #ifdef  CS_STUBS_DEBUG
 281         if (cs_stubs_debug > 3)
 282             cmn_err(CE_CONT, "csx_RequestWindow: handle: 0x%x\n", ch);
 283 #endif
 284         return (CardServices(RequestWindow, ch, wh, wr));
 285 }
 286 
 287 int32_t
 288 csx_ReleaseWindow(window_handle_t wh)
 289 {
 290 #ifdef  CS_STUBS_DEBUG
 291         if (cs_stubs_debug > 3)
 292             cmn_err(CE_CONT, "csx_ReleaseWindow: handle: 0x%x\n", wh);
 293 #endif
 294         return (CardServices(ReleaseWindow, wh));
 295 }
 296 
 297 int32_t
 298 csx_ModifyWindow(window_handle_t wh, modify_win_t *mw)
 299 {
 300 #ifdef  CS_STUBS_DEBUG
 301         if (cs_stubs_debug > 3)
 302             cmn_err(CE_CONT, "csx_ModifyWindow: handle: 0x%x\n", wh);
 303 #endif
 304         return (CardServices(ModifyWindow, wh, mw));
 305 }
 306 
 307 int32_t
 308 csx_MapMemPage(window_handle_t wh, map_mem_page_t *mmp)
 309 {
 310 #ifdef  CS_STUBS_DEBUG
 311         if (cs_stubs_debug > 3)
 312             cmn_err(CE_CONT, "csx_MapMemPage: handle: 0x%x\n", wh);
 313 #endif
 314         return (CardServices(MapMemPage, wh, mmp));
 315 }
 316 
 317 int32_t
 318 csx_RequestSocketMask(client_handle_t ch, request_socket_mask_t *sm)
 319 {
 320 #ifdef  CS_STUBS_DEBUG
 321         if (cs_stubs_debug > 3)
 322             cmn_err(CE_CONT, "csx_RequestSocketMask: handle: 0x%x\n", ch);
 323 #endif
 324         return (CardServices(RequestSocketMask, ch, sm));
 325 }
 326 
 327 int32_t
 328 csx_ReleaseSocketMask(client_handle_t ch, release_socket_mask_t *rsm)
 329 {
 330 #ifdef  CS_STUBS_DEBUG
 331         if (cs_stubs_debug > 3)
 332             cmn_err(CE_CONT, "csx_ReleaseSocketMask: handle: 0x%x\n", ch);
 333 #endif
 334         return (CardServices(ReleaseSocketMask, ch, rsm));
 335 }
 336 
 337 int32_t
 338 csx_RequestConfiguration(client_handle_t ch, config_req_t *cr)
 339 {
 340 #ifdef  CS_STUBS_DEBUG
 341         if (cs_stubs_debug > 3)
 342             cmn_err(CE_CONT, "csx_RequestConfiguration: handle: 0x%x\n", ch);
 343 #endif
 344         return (CardServices(RequestConfiguration, ch, cr));
 345 }
 346 
 347 int32_t
 348 csx_ModifyConfiguration(client_handle_t ch, modify_config_t *mc)
 349 {
 350 #ifdef  CS_STUBS_DEBUG
 351         if (cs_stubs_debug > 3)
 352             cmn_err(CE_CONT, "csx_ModifyConfiguration: handle: 0x%x\n", ch);
 353 #endif
 354         return (CardServices(ModifyConfiguration, ch, mc));
 355 }
 356 
 357 int32_t
 358 csx_ReleaseConfiguration(client_handle_t ch, release_config_t *rc)
 359 {
 360 #ifdef  CS_STUBS_DEBUG
 361         if (cs_stubs_debug > 3)
 362             cmn_err(CE_CONT, "csx_ReleaseConfiguration: handle: 0x%x\n", ch);
 363 #endif
 364         return (CardServices(ReleaseConfiguration, ch, rc));
 365 }
 366 
 367 int32_t
 368 csx_AccessConfigurationRegister(client_handle_t ch, access_config_reg_t *acr)
 369 {
 370 #ifdef  CS_STUBS_DEBUG
 371         if (cs_stubs_debug > 3)
 372             cmn_err(CE_CONT,
 373                 "csx_AccessConfigurationRegister: handle: 0x%x\n", ch);
 374 #endif
 375         return (CardServices(AccessConfigurationRegister, ch, acr));
 376 }
 377 
 378 int32_t
 379 csx_GetFirstTuple(client_handle_t ch, tuple_t *tp)
 380 {
 381 #ifdef  CS_STUBS_DEBUG
 382         if (cs_stubs_debug > 3)
 383             cmn_err(CE_CONT, "csx_GetFirstTuple: handle: 0x%x\n", ch);
 384 #endif
 385         return (CardServices(GetFirstTuple, ch, tp));
 386 }
 387 
 388 int32_t
 389 csx_GetNextTuple(client_handle_t ch, tuple_t *tp)
 390 {
 391 #ifdef  CS_STUBS_DEBUG
 392         if (cs_stubs_debug > 3)
 393             cmn_err(CE_CONT, "csx_GetNextTuple: handle: 0x%x\n", ch);
 394 #endif
 395         return (CardServices(GetNextTuple, ch, tp));
 396 }
 397 
 398 int32_t
 399 csx_GetTupleData(client_handle_t ch, tuple_t *tp)
 400 {
 401 #ifdef  CS_STUBS_DEBUG
 402         if (cs_stubs_debug > 3)
 403             cmn_err(CE_CONT, "csx_GetTupleData: handle: 0x%x\n", ch);
 404 #endif
 405         return (CardServices(GetTupleData, ch, tp));
 406 }
 407 
 408 int32_t
 409 csx_MapLogSocket(client_handle_t ch, map_log_socket_t *mls)
 410 {
 411 #ifdef  CS_STUBS_DEBUG
 412         if (cs_stubs_debug > 3)
 413             cmn_err(CE_CONT, "csx_MapLogSocket: handle: 0x%x\n", ch);
 414 #endif
 415         return (CardServices(MapLogSocket, ch, mls));
 416 }
 417 
 418 int32_t
 419 csx_ValidateCIS(client_handle_t ch, cisinfo_t *ci)
 420 {
 421 #ifdef  CS_STUBS_DEBUG
 422         if (cs_stubs_debug > 3)
 423             cmn_err(CE_CONT, "csx_ValidateCIS: handle: 0x%x\n", ch);
 424 #endif
 425         return (CardServices(ValidateCIS, ch, ci));
 426 }
 427 
 428 int32_t
 429 csx_MakeDeviceNode(client_handle_t ch, make_device_node_t *mdn)
 430 {
 431 #ifdef  CS_STUBS_DEBUG
 432         if (cs_stubs_debug > 3)
 433             cmn_err(CE_CONT, "csx_MakeDeviceNode: handle: 0x%x\n", ch);
 434 #endif
 435         return (CardServices(MakeDeviceNode, ch, mdn));
 436 }
 437 
 438 int32_t
 439 csx_RemoveDeviceNode(client_handle_t ch, remove_device_node_t *rdn)
 440 {
 441 #ifdef  CS_STUBS_DEBUG
 442         if (cs_stubs_debug > 3)
 443             cmn_err(CE_CONT, "csx_RemoveDeviceNode: handle: 0x%x\n", ch);
 444 #endif
 445         return (CardServices(RemoveDeviceNode, ch, rdn));
 446 }
 447 
 448 int32_t
 449 csx_ConvertSpeed(convert_speed_t *cp)
 450 {
 451 #ifdef  CS_STUBS_DEBUG
 452         if (cs_stubs_debug > 3)
 453             cmn_err(CE_CONT, "csx_ConvertSpeed\n");
 454 #endif
 455         return (CardServices(ConvertSpeed, cp));
 456 }
 457 
 458 int32_t
 459 csx_ConvertSize(convert_size_t *cp)
 460 {
 461 #ifdef  CS_STUBS_DEBUG
 462         if (cs_stubs_debug > 3)
 463             cmn_err(CE_CONT, "csx_ConvertSize\n");
 464 #endif
 465         return (CardServices(ConvertSize, cp));
 466 }
 467 
 468 int32_t
 469 csx_Event2Text(event2text_t *e2t)
 470 {
 471 #ifdef  CS_STUBS_DEBUG
 472         if (cs_stubs_debug > 3)
 473             cmn_err(CE_CONT, "csx_Event2Text\n");
 474 #endif
 475         return (CardServices(Event2Text, e2t));
 476 }
 477 
 478 int32_t
 479 csx_Error2Text(error2text_t *e2t)
 480 {
 481 #ifdef  CS_STUBS_DEBUG
 482         if (cs_stubs_debug > 3)
 483             cmn_err(CE_CONT, "csx_Error2Text\n");
 484 #endif
 485         return (CardServices(Error2Text, e2t));
 486 }
 487 
 488 int32_t
 489 csx_CS_DDI_Info(cs_ddi_info_t *cp)
 490 {
 491 #ifdef  CS_STUBS_DEBUG
 492         if (cs_stubs_debug > 3)
 493             cmn_err(CE_CONT, "csx_CS_DDI_Info\n");
 494 #endif
 495         return (CardServices(CS_DDI_Info, cp));
 496 }
 497 
 498 int32_t
 499 csx_CS_Sys_Ctl(cs_sys_ctl_t *csc)
 500 {
 501 #ifdef  CS_STUBS_DEBUG
 502         if (cs_stubs_debug > 3)
 503             cmn_err(CE_CONT, "csx_CS_Sys_Ctl\n");
 504 #endif
 505         return (CardServices(CS_Sys_Ctl, csc));
 506 }
 507 
 508 int32_t
 509 csx_GetClientInfo(client_handle_t ch, client_info_t *ci)
 510 {
 511 #ifdef  CS_STUBS_DEBUG
 512         if (cs_stubs_debug > 3)
 513             cmn_err(CE_CONT, "csx_GetClientInfo: handle: 0x%x\n", ch);
 514 #endif
 515 
 516         return (CardServices(GetClientInfo, ch, ci));
 517 }
 518 
 519 int32_t
 520 csx_GetFirstClient(get_firstnext_client_t *fnc)
 521 {
 522 #ifdef  CS_STUBS_DEBUG
 523         if (cs_stubs_debug > 3)
 524             cmn_err(CE_CONT, "csx_GetFirstClient\n");
 525 #endif
 526 
 527         return (CardServices(GetFirstClient, fnc));
 528 }
 529 
 530 int32_t
 531 csx_GetNextClient(get_firstnext_client_t *fnc)
 532 {
 533 #ifdef  CS_STUBS_DEBUG
 534         if (cs_stubs_debug > 3)
 535             cmn_err(CE_CONT, "csx_GetNextClient\n");
 536 #endif
 537 
 538         return (CardServices(GetNextClient, fnc));
 539 }
 540 
 541 int32_t
 542 csx_ResetFunction(client_handle_t ch, reset_function_t *rf)
 543 {
 544 #ifdef  CS_STUBS_DEBUG
 545         if (cs_stubs_debug > 3)
 546             cmn_err(CE_CONT, "csx_ResetFunction: handle: 0x%x\n", ch);
 547 #endif
 548 
 549         return (CardServices(ResetFunction, ch, rf));
 550 }
 551 
 552 int32_t
 553 csx_GetCardServicesInfo(client_handle_t ch, get_cardservices_info_t *gcsi)
 554 {
 555 #ifdef  CS_STUBS_DEBUG
 556         if (cs_stubs_debug > 3)
 557             cmn_err(CE_CONT, "csx_GetCardServicesInfo: handle: 0x%x\n", ch);
 558 #endif
 559 
 560         return (CardServices(GetCardServicesInfo, ch, gcsi));
 561 }
 562 
 563 int32_t
 564 csx_GetConfigurationInfo(client_handle_t *ch, get_configuration_info_t *gci)
 565 {
 566 #ifdef  CS_STUBS_DEBUG
 567         if (cs_stubs_debug > 3)
 568             cmn_err(CE_CONT, "csx_GetConfigurationInfo: "
 569                 "handle: (no handle yet)\n");
 570 #endif
 571 
 572         return (CardServices(GetConfigurationInfo, ch, gci));
 573 }
 574 
 575 int32_t
 576 csx_GetPhysicalAdapterInfo(client_handle_t ch, get_physical_adapter_info_t *gp)
 577 {
 578 #ifdef  CS_STUBS_DEBUG
 579         if (cs_stubs_debug > 3)
 580             cmn_err(CE_CONT, "csx_GetPhysicalAdapterInfo: handle: 0x%x\n", ch);
 581 #endif
 582 
 583         return (CardServices(GetPhysicalAdapterInfo, ch, gp));
 584 }
 585 
 586 /*
 587  * CIS tuple parsing functions - one entrypoint per tuple that we know
 588  *      how to parse
 589  */
 590 int32_t
 591 csx_Parse_CISTPL_CONFIG(client_handle_t ch, tuple_t *tp, cistpl_config_t *pt)
 592 {
 593 #ifdef  CS_STUBS_DEBUG
 594         if (cs_stubs_debug > 3)
 595             cmn_err(CE_CONT, "csx_Parse_CISTPL_CONFIG: handle: 0x%x\n", ch);
 596 #endif
 597         tp->DesiredTuple = CISTPL_CONFIG;
 598         return (CardServices(ParseTuple, ch, tp, pt));
 599 }
 600 
 601 int32_t
 602 csx_Parse_CISTPL_DEVICE(client_handle_t ch, tuple_t *tp, cistpl_device_t *pt)
 603 {
 604 #ifdef  CS_STUBS_DEBUG
 605         if (cs_stubs_debug > 3)
 606             cmn_err(CE_CONT, "csx_Parse_CISTPL_DEVICE: handle: 0x%x\n", ch);
 607 #endif
 608         tp->DesiredTuple = CISTPL_DEVICE;
 609         return (CardServices(ParseTuple, ch, tp, pt));
 610 }
 611 
 612 int32_t
 613 csx_Parse_CISTPL_DEVICE_A(client_handle_t ch, tuple_t *tp, cistpl_device_t *pt)
 614 {
 615 #ifdef  CS_STUBS_DEBUG
 616         if (cs_stubs_debug > 3)
 617             cmn_err(CE_CONT, "csx_Parse_CISTPL_DEVICE_A: handle: 0x%x\n", ch);
 618 #endif
 619         tp->DesiredTuple = CISTPL_DEVICE_A;
 620         return (CardServices(ParseTuple, ch, tp, pt));
 621 }
 622 
 623 int32_t
 624 csx_Parse_CISTPL_DEVICE_OA(client_handle_t ch, tuple_t *tp, cistpl_device_t *pt)
 625 {
 626 #ifdef  CS_STUBS_DEBUG
 627         if (cs_stubs_debug > 3)
 628             cmn_err(CE_CONT, "csx_Parse_CISTPL_DEVICE_OA: handle: 0x%x\n", ch);
 629 #endif
 630         tp->DesiredTuple = CISTPL_DEVICE_OA;
 631         return (CardServices(ParseTuple, ch, tp, pt));
 632 }
 633 
 634 int32_t
 635 csx_Parse_CISTPL_DEVICE_OC(client_handle_t ch, tuple_t *tp, cistpl_device_t *pt)
 636 {
 637 #ifdef  CS_STUBS_DEBUG
 638         if (cs_stubs_debug > 3)
 639             cmn_err(CE_CONT, "csx_Parse_CISTPL_DEVICE_OC: handle: 0x%x\n", ch);
 640 #endif
 641         tp->DesiredTuple = CISTPL_DEVICE_OC;
 642         return (CardServices(ParseTuple, ch, tp, pt));
 643 }
 644 
 645 int32_t
 646 csx_Parse_CISTPL_VERS_1(client_handle_t ch, tuple_t *tp, cistpl_vers_1_t *pt)
 647 {
 648 #ifdef  CS_STUBS_DEBUG
 649         if (cs_stubs_debug > 3)
 650             cmn_err(CE_CONT, "csx_Parse_CISTPL_VERS_1: handle: 0x%x\n", ch);
 651 #endif
 652         tp->DesiredTuple = CISTPL_VERS_1;
 653         return (CardServices(ParseTuple, ch, tp, pt));
 654 }
 655 
 656 int32_t
 657 csx_Parse_CISTPL_VERS_2(client_handle_t ch, tuple_t *tp, cistpl_vers_2_t *pt)
 658 {
 659 #ifdef  CS_STUBS_DEBUG
 660         if (cs_stubs_debug > 3)
 661             cmn_err(CE_CONT, "csx_Parse_CISTPL_VERS_2: handle: 0x%x\n", ch);
 662 #endif
 663         tp->DesiredTuple = CISTPL_VERS_2;
 664         return (CardServices(ParseTuple, ch, tp, pt));
 665 }
 666 
 667 int32_t
 668 csx_Parse_CISTPL_JEDEC_A(client_handle_t ch, tuple_t *tp, cistpl_jedec_t *pt)
 669 {
 670 #ifdef  CS_STUBS_DEBUG
 671         if (cs_stubs_debug > 3)
 672             cmn_err(CE_CONT, "csx_Parse_CISTPL_JEDEC_A: handle: 0x%x\n", ch);
 673 #endif
 674         tp->DesiredTuple = CISTPL_JEDEC_A;
 675         return (CardServices(ParseTuple, ch, tp, pt));
 676 }
 677 
 678 int32_t
 679 csx_Parse_CISTPL_JEDEC_C(client_handle_t ch, tuple_t *tp, cistpl_jedec_t *pt)
 680 {
 681 #ifdef  CS_STUBS_DEBUG
 682         if (cs_stubs_debug > 3)
 683             cmn_err(CE_CONT, "csx_Parse_CISTPL_JEDEC_C: handle: 0x%x\n", ch);
 684 #endif
 685         tp->DesiredTuple = CISTPL_JEDEC_C;
 686         return (CardServices(ParseTuple, ch, tp, pt));
 687 }
 688 
 689 int32_t
 690 csx_Parse_CISTPL_FORMAT(client_handle_t ch, tuple_t *tp, cistpl_format_t *pt)
 691 {
 692 #ifdef  CS_STUBS_DEBUG
 693         if (cs_stubs_debug > 3)
 694             cmn_err(CE_CONT, "csx_Parse_CISTPL_FORMAT: handle: 0x%x\n", ch);
 695 #endif
 696         tp->DesiredTuple = CISTPL_FORMAT;
 697         return (CardServices(ParseTuple, ch, tp, pt));
 698 }
 699 
 700 int32_t
 701 csx_Parse_CISTPL_FORMAT_A(client_handle_t ch, tuple_t *tp, cistpl_format_t *pt)
 702 {
 703 #ifdef  CS_STUBS_DEBUG
 704         if (cs_stubs_debug > 3)
 705             cmn_err(CE_CONT, "csx_Parse_CISTPL_FORMAT_A: handle: 0x%x\n", ch);
 706 #endif
 707         tp->DesiredTuple = CISTPL_FORMAT_A;
 708         return (CardServices(ParseTuple, ch, tp, pt));
 709 }
 710 
 711 int32_t
 712 csx_Parse_CISTPL_GEOMETRY(client_handle_t ch, tuple_t *tp,
 713     cistpl_geometry_t *pt)
 714 {
 715 #ifdef  CS_STUBS_DEBUG
 716         if (cs_stubs_debug > 3)
 717             cmn_err(CE_CONT, "csx_Parse_CISTPL_GEOMETRY: handle: 0x%x\n", ch);
 718 #endif
 719         tp->DesiredTuple = CISTPL_GEOMETRY;
 720         return (CardServices(ParseTuple, ch, tp, pt));
 721 }
 722 
 723 int32_t
 724 csx_Parse_CISTPL_BYTEORDER(client_handle_t ch, tuple_t *tp,
 725     cistpl_byteorder_t *pt)
 726 {
 727 #ifdef  CS_STUBS_DEBUG
 728         if (cs_stubs_debug > 3)
 729             cmn_err(CE_CONT, "csx_Parse_CISTPL_BYTEORDER: handle: 0x%x\n", ch);
 730 #endif
 731         tp->DesiredTuple = CISTPL_BYTEORDER;
 732         return (CardServices(ParseTuple, ch, tp, pt));
 733 }
 734 
 735 int32_t
 736 csx_Parse_CISTPL_DATE(client_handle_t ch, tuple_t *tp, cistpl_date_t *pt)
 737 {
 738 #ifdef  CS_STUBS_DEBUG
 739         if (cs_stubs_debug > 3)
 740             cmn_err(CE_CONT, "csx_Parse_CISTPL_DATE: handle: 0x%x\n", ch);
 741 #endif
 742         tp->DesiredTuple = CISTPL_DATE;
 743         return (CardServices(ParseTuple, ch, tp, pt));
 744 }
 745 
 746 int32_t
 747 csx_Parse_CISTPL_BATTERY(client_handle_t ch, tuple_t *tp, cistpl_battery_t *pt)
 748 {
 749 #ifdef  CS_STUBS_DEBUG
 750         if (cs_stubs_debug > 3)
 751             cmn_err(CE_CONT, "csx_Parse_CISTPL_BATTERY: handle: 0x%x\n", ch);
 752 #endif
 753         tp->DesiredTuple = CISTPL_BATTERY;
 754         return (CardServices(ParseTuple, ch, tp, pt));
 755 }
 756 
 757 int32_t
 758 csx_Parse_CISTPL_ORG(client_handle_t ch, tuple_t *tp, cistpl_org_t *pt)
 759 {
 760 #ifdef  CS_STUBS_DEBUG
 761         if (cs_stubs_debug > 3)
 762             cmn_err(CE_CONT, "csx_Parse_CISTPL_ORG: handle: 0x%x\n", ch);
 763 #endif
 764         tp->DesiredTuple = CISTPL_ORG;
 765         return (CardServices(ParseTuple, ch, tp, pt));
 766 }
 767 
 768 int32_t
 769 csx_Parse_CISTPL_MANFID(client_handle_t ch, tuple_t *tp, cistpl_manfid_t *pt)
 770 {
 771 #ifdef  CS_STUBS_DEBUG
 772         if (cs_stubs_debug > 3)
 773             cmn_err(CE_CONT, "csx_Parse_CISTPL_MANFID: handle: 0x%x\n", ch);
 774 #endif
 775         tp->DesiredTuple = CISTPL_MANFID;
 776         return (CardServices(ParseTuple, ch, tp, pt));
 777 }
 778 
 779 int32_t
 780 csx_Parse_CISTPL_FUNCID(client_handle_t ch, tuple_t *tp, cistpl_funcid_t *pt)
 781 {
 782 #ifdef  CS_STUBS_DEBUG
 783         if (cs_stubs_debug > 3)
 784             cmn_err(CE_CONT, "csx_Parse_CISTPL_FUNCID: handle: 0x%x\n", ch);
 785 #endif
 786         tp->DesiredTuple = CISTPL_FUNCID;
 787         return (CardServices(ParseTuple, ch, tp, pt));
 788 }
 789 
 790 int32_t
 791 csx_Parse_CISTPL_FUNCE(client_handle_t ch, tuple_t *tp,
 792     cistpl_funce_t *pt, uint32_t function)
 793 {
 794 #ifdef  CS_STUBS_DEBUG
 795         if (cs_stubs_debug > 3)
 796             cmn_err(CE_CONT, "csx_Parse_CISTPL_FUNCE: handle: 0x%x\n", ch);
 797 #endif
 798         tp->DesiredTuple = CISTPL_FUNCE;
 799         return (CardServices(ParseTuple, ch, tp, pt, function));
 800 }
 801 
 802 int32_t
 803 csx_Parse_CISTPL_CFTABLE_ENTRY(client_handle_t ch, tuple_t *tp,
 804     cistpl_cftable_entry_t *pt)
 805 {
 806 #ifdef  CS_STUBS_DEBUG
 807         if (cs_stubs_debug > 3)
 808             cmn_err(CE_CONT,
 809                 "csx_Parse_CISTPL_CFTABLE_ENTRY: handle: 0x%x\n", ch);
 810 #endif
 811         tp->DesiredTuple = CISTPL_CFTABLE_ENTRY;
 812         return (CardServices(ParseTuple, ch, tp, pt));
 813 }
 814 
 815 int32_t
 816 csx_Parse_CISTPL_LINKTARGET(client_handle_t ch, tuple_t *tp,
 817     cistpl_linktarget_t *pt)
 818 {
 819 #ifdef  CS_STUBS_DEBUG
 820         if (cs_stubs_debug > 3)
 821             cmn_err(CE_CONT, "csx_Parse_CISTPL_LINKTARGET: handle: 0x%x\n", ch);
 822 #endif
 823         tp->DesiredTuple = CISTPL_LINKTARGET;
 824         return (CardServices(ParseTuple, ch, tp, pt));
 825 }
 826 
 827 int32_t
 828 csx_Parse_CISTPL_LONGLINK_A(client_handle_t ch, tuple_t *tp,
 829     cistpl_longlink_ac_t *pt)
 830 {
 831 #ifdef  CS_STUBS_DEBUG
 832         if (cs_stubs_debug > 3)
 833             cmn_err(CE_CONT, "csx_Parse_CISTPL_LONGLINK_A: handle: 0x%x\n", ch);
 834 #endif
 835         tp->DesiredTuple = CISTPL_LONGLINK_A;
 836         return (CardServices(ParseTuple, ch, tp, pt));
 837 }
 838 
 839 int32_t
 840 csx_Parse_CISTPL_LONGLINK_C(client_handle_t ch, tuple_t *tp,
 841     cistpl_longlink_ac_t *pt)
 842 {
 843 #ifdef  CS_STUBS_DEBUG
 844         if (cs_stubs_debug > 3)
 845             cmn_err(CE_CONT, "csx_Parse_CISTPL_LONGLINK_C: handle: 0x%x\n", ch);
 846 #endif
 847         tp->DesiredTuple = CISTPL_LONGLINK_C;
 848         return (CardServices(ParseTuple, ch, tp, pt));
 849 }
 850 
 851 int32_t
 852 csx_Parse_CISTPL_LONGLINK_MFC(client_handle_t ch, tuple_t *tp,
 853     cistpl_longlink_mfc_t *pt)
 854 {
 855 #ifdef  CS_STUBS_DEBUG
 856         if (cs_stubs_debug > 3)
 857             cmn_err(CE_CONT, "csx_Parse_CISTPL_LONGLINK_MFC: "
 858                                                 "handle: 0x%x\n", ch);
 859 #endif
 860         tp->DesiredTuple = CISTPL_LONGLINK_MFC;
 861         return (CardServices(ParseTuple, ch, tp, pt));
 862 }
 863 
 864 int32_t csx_Parse_CISTPL_LONGLINK_CB(client_handle_t ch, tuple_t *tp,
 865     cistpl_longlink_cb_t *pt)
 866 {
 867 #ifdef  CS_STUBS_DEBUG
 868         if (cs_stubs_debug > 3)
 869             cmn_err(CE_CONT, "csx_Parse_CISTPL_LONGLINK_CB: "
 870                                                 "handle: 0x%x\n", ch);
 871 #endif
 872         tp->DesiredTuple = CISTPL_LONGLINK_CB;
 873         return (CardServices(ParseTuple, ch, tp, pt));
 874 }
 875 
 876 int32_t
 877 csx_Parse_CISTPL_SPCL(client_handle_t ch, tuple_t *tp,
 878     cistpl_spcl_t *pt)
 879 {
 880 #ifdef  CS_STUBS_DEBUG
 881         if (cs_stubs_debug > 3)
 882             cmn_err(CE_CONT, "csx_Parse_CISTPL_SPCL: handle: 0x%x\n", ch);
 883 #endif
 884         tp->DesiredTuple = CISTPL_SPCL;
 885         return (CardServices(ParseTuple, ch, tp, pt));
 886 }
 887 
 888 int32_t
 889 csx_Parse_CISTPL_SWIL(client_handle_t ch, tuple_t *tp,
 890     cistpl_swil_t *pt)
 891 {
 892 #ifdef  CS_STUBS_DEBUG
 893         if (cs_stubs_debug > 3)
 894             cmn_err(CE_CONT, "csx_Parse_CISTPL_SWIL: handle: 0x%x\n", ch);
 895 #endif
 896         tp->DesiredTuple = CISTPL_SWIL;
 897         return (CardServices(ParseTuple, ch, tp, pt));
 898 }
 899 
 900 int32_t csx_Parse_CISTPL_BAR(client_handle_t ch, tuple_t *tp,
 901     cistpl_bar_t *pt)
 902 {
 903 #ifdef  CS_STUBS_DEBUG
 904         if (cs_stubs_debug > 3)
 905             cmn_err(CE_CONT, "csx_Parse_CISTPL_BAR: handle: 0x%x\n", ch);
 906 #endif
 907         tp->DesiredTuple = CISTPL_BAR;
 908         return (CardServices(ParseTuple, ch, tp, pt));
 909 }
 910 
 911 int32_t
 912 csx_Parse_CISTPL_DEVICEGEO(client_handle_t ch, tuple_t *tp,
 913     cistpl_devicegeo_t *pt)
 914 {
 915 #ifdef  CS_STUBS_DEBUG
 916         if (cs_stubs_debug > 3)
 917             cmn_err(CE_CONT, "csx_Parse_CISTPL_DEVICEGEO: handle: 0x%x\n", ch);
 918 #endif
 919         tp->DesiredTuple = CISTPL_DEVICEGEO;
 920         return (CardServices(ParseTuple, ch, tp, pt));
 921 }
 922 
 923 int32_t
 924 csx_Parse_CISTPL_DEVICEGEO_A(client_handle_t ch, tuple_t *tp,
 925     cistpl_devicegeo_t *pt)
 926 {
 927 #ifdef  CS_STUBS_DEBUG
 928         if (cs_stubs_debug > 3)
 929             cmn_err(CE_CONT, "csx_Parse_CISTPL_DEVICEGEO_A: "
 930                                                 "handle: 0x%x\n", ch);
 931 #endif
 932         tp->DesiredTuple = CISTPL_DEVICEGEO_A;
 933         return (CardServices(ParseTuple, ch, tp, pt));
 934 }
 935 
 936 int32_t
 937 csx_ParseTuple(client_handle_t ch, tuple_t *tp, cisparse_t *cp, uint32_t ef)
 938 {
 939 #ifdef  CS_STUBS_DEBUG
 940         if (cs_stubs_debug > 3)
 941             cmn_err(CE_CONT, "csx_ParseTuple: handle: 0x%x\n", ch);
 942 #endif
 943         return (CardServices(ParseTuple, ch, tp, cp, ef));
 944 }
 945 
 946 /*
 947  * The following functions are used to access various datatypes.
 948  *      These functions are not specific to PCMCIA client drivers
 949  *      and they don't depend on Card Services being present to
 950  *      operate.
 951  */
 952 void
 953 csx_Put8(acc_handle_t handle, uint32_t offset, uint8_t value)
 954 {
 955         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
 956 
 957         ddi_put8(handle, (uint8_t *)(hp->ah_addr + offset), value);
 958 }
 959 
 960 void
 961 csx_Put16(acc_handle_t handle, uint32_t offset, uint16_t value)
 962 {
 963         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
 964 
 965         ddi_put16(handle, (uint16_t *)(hp->ah_addr + offset), value);
 966 }
 967 
 968 void
 969 csx_Put32(acc_handle_t handle, uint32_t offset, uint32_t value)
 970 {
 971         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
 972 
 973         ddi_put32(handle, (uint32_t *)(hp->ah_addr + offset), value);
 974 }
 975 
 976 void
 977 csx_Put64(acc_handle_t handle, uint32_t offset, uint64_t value)
 978 {
 979         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
 980 
 981         ddi_put64(handle, (uint64_t *)(hp->ah_addr + offset), value);
 982 }
 983 
 984 uint8_t
 985 csx_Get8(acc_handle_t handle, uint32_t offset)
 986 {
 987         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
 988 
 989         return (ddi_get8(handle, (uint8_t *)(hp->ah_addr + offset)));
 990 }
 991 
 992 uint16_t
 993 csx_Get16(acc_handle_t handle, uint32_t offset)
 994 {
 995         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
 996 
 997         return (ddi_get16(handle, (uint16_t *)(hp->ah_addr + offset)));
 998 }
 999 
1000 uint32_t
1001 csx_Get32(acc_handle_t handle, uint32_t offset)
1002 {
1003         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1004 
1005         return (ddi_get32(handle, (uint32_t *)(hp->ah_addr + offset)));
1006 }
1007 
1008 uint64_t
1009 csx_Get64(acc_handle_t handle, uint32_t offset)
1010 {
1011         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1012 
1013         return (ddi_get64(handle, (uint64_t *)(hp->ah_addr + offset)));
1014 }
1015 
1016 void
1017 csx_RepPut8(acc_handle_t handle, uint8_t *hostaddr, uint32_t offset,
1018                                                 uint32_t rc, uint32_t flags)
1019 {
1020         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1021 
1022         ddi_rep_put8(handle, hostaddr, (uint8_t *)(hp->ah_addr + offset),
1023                 rc, (uint32_t)flags);
1024 }
1025 
1026 void
1027 csx_RepPut16(acc_handle_t handle, uint16_t *hostaddr, uint32_t offset,
1028                                                 uint32_t rc, uint32_t flags)
1029 {
1030         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1031 
1032         ddi_rep_put16(handle, hostaddr, (uint16_t *)(hp->ah_addr + offset),
1033                 rc, (uint32_t)flags);
1034 }
1035 
1036 void
1037 csx_RepPut32(acc_handle_t handle, uint32_t *hostaddr, uint32_t offset,
1038                                                 uint32_t rc, uint32_t flags)
1039 {
1040         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1041 
1042         ddi_rep_put32(handle, hostaddr, (uint32_t *)(hp->ah_addr + offset),
1043                 rc, (uint32_t)flags);
1044 }
1045 
1046 void
1047 csx_RepPut64(acc_handle_t handle, uint64_t *hostaddr, uint32_t offset,
1048                                                 uint32_t rc, uint32_t flags)
1049 {
1050         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1051 
1052         ddi_rep_put64(handle, hostaddr, (uint64_t *)(hp->ah_addr + offset),
1053                 rc, (uint32_t)flags);
1054 }
1055 
1056 void
1057 csx_RepGet8(acc_handle_t handle, uint8_t *hostaddr, uint32_t offset,
1058                                                 uint32_t rc, uint32_t flags)
1059 {
1060         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1061 
1062         ddi_rep_get8(handle, hostaddr, (uint8_t *)(hp->ah_addr + offset),
1063                 rc, (uint32_t)flags);
1064 }
1065 
1066 void
1067 csx_RepGet16(acc_handle_t handle, uint16_t *hostaddr, uint32_t offset,
1068                                                 uint32_t rc, uint32_t flags)
1069 {
1070         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1071 
1072         ddi_rep_get16(handle, hostaddr, (uint16_t *)(hp->ah_addr + offset),
1073                 rc, (uint32_t)flags);
1074 }
1075 
1076 void
1077 csx_RepGet32(acc_handle_t handle, uint32_t *hostaddr, uint32_t offset,
1078                                                 uint32_t rc, uint32_t flags)
1079 {
1080         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1081 
1082         ddi_rep_get32(handle, hostaddr, (uint32_t *)(hp->ah_addr + offset),
1083                 rc, (uint32_t)flags);
1084 }
1085 
1086 void
1087 csx_RepGet64(acc_handle_t handle, uint64_t *hostaddr, uint32_t offset,
1088                                                 uint32_t rc, uint32_t flags)
1089 {
1090         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1091 
1092         ddi_rep_get64(handle, hostaddr, (uint64_t *)(hp->ah_addr + offset),
1093                 rc, (uint32_t)flags);
1094 }
1095 
1096 /*
1097  * The following two functions return the mapped (virtual) or physical
1098  *      base address associated with the passed handle if the address
1099  *      can be directly accessed by the caller. If the object represented
1100  *      by the handle needs to be accessed through a common access
1101  *      function, CS_BAD_BASE is returned.
1102  *
1103  * XXX - Need to figure out how to determine when to return CS_BAD_BASE
1104  *      and also we need more generic return codes not tied to CS.
1105  */
1106 int32_t
1107 csx_GetMappedAddr(acc_handle_t handle, void **addr)
1108 {
1109         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1110 
1111 #ifdef  CS_STUBS_DEBUG
1112         if (cs_stubs_debug > 3)
1113             cmn_err(CE_CONT, "csx_GetMappedAddr: handle: 0x%p\n", handle);
1114 #endif
1115 
1116         *addr = hp->ah_addr;
1117 
1118         return (CS_SUCCESS);    /* XXX should be generic return code */
1119 }
1120 
1121 int32_t
1122 csx_GetPhysAddr(acc_handle_t handle, void **addr)
1123 {
1124 #ifndef lint
1125         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1126 #endif  /* lint */
1127 
1128 #ifdef  CS_STUBS_DEBUG
1129         if (cs_stubs_debug > 3)
1130             cmn_err(CE_CONT, "csx_GetPhysAddr: handle: 0x%p\n", handle);
1131 #endif
1132 
1133         *addr = NULL;
1134 
1135         return (CS_BAD_BASE);
1136 }
1137 
1138 /*ARGSUSED*/
1139 int32_t
1140 csx_DupHandle(acc_handle_t handle, acc_handle_t *dup, uint32_t flags)
1141 {
1142 #ifndef lint
1143         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1144 #endif  /* lint */
1145 
1146 #ifdef  CS_STUBS_DEBUG
1147         if (cs_stubs_debug > 3)
1148             cmn_err(CE_CONT, "csx_DupHandle: handle: 0x%p\n", handle);
1149 #endif
1150 
1151         return (CS_BAD_HANDLE);
1152 
1153 #ifdef  XXX
1154         *dup = (acc_handle_t)kmem_alloc(sizeof (acc_hdl_t), KM_SLEEP);
1155         ((acc_hdl_t *)*dup)->ddi_handle =
1156                 (ddi_acc_handle_t *)kmem_alloc(sizeof (ddi_acc_impl_t),
1157                     KM_SLEEP);
1158 
1159         bcopy((caddr_t)hp, (caddr_t)((acc_hdl_t *)*dup)->ddi_handle,
1160             sizeof (ddi_acc_impl_t));
1161 
1162         return (CS_SUCCESS);
1163 #endif
1164 }
1165 
1166 int32_t
1167 csx_FreeHandle(acc_handle_t *handle)
1168 {
1169 #ifdef  CS_STUBS_DEBUG
1170         if (cs_stubs_debug > 3)
1171             cmn_err(CE_CONT, "csx_FreeHandle: handle: 0x%p\n", *handle);
1172 #endif
1173         return (CS_BAD_HANDLE);
1174 
1175 #ifdef  XXX
1176 
1177         kmem_free((void *)((acc_hdl_t *)*handle)->ddi_handle,
1178                 sizeof (ddi_acc_impl_t));
1179         kmem_free((void *)(acc_hdl_t *)*handle, sizeof (acc_hdl_t));
1180 
1181         return (CS_SUCCESS);
1182 #endif
1183 }
1184 
1185 /*
1186  * XXX - Probably want to remove these fucntions soon
1187  */
1188 int32_t
1189 csx_GetHandleOffset(acc_handle_t handle, uint32_t *offset)
1190 {
1191         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1192 
1193 #ifdef  CS_STUBS_DEBUG
1194         if (cs_stubs_debug > 3)
1195             cmn_err(CE_CONT, "csx_GetHandleOffset: handle: 0x%p\n", handle);
1196 #endif
1197 
1198         *offset = hp->ah_offset;
1199 
1200         return (CS_SUCCESS);
1201 }
1202 
1203 int32_t
1204 csx_SetHandleOffset(acc_handle_t handle, uint32_t offset)
1205 {
1206         ddi_acc_hdl_t *hp = impl_acc_hdl_get(handle);
1207 
1208 #ifdef  CS_STUBS_DEBUG
1209         if (cs_stubs_debug > 3)
1210             cmn_err(CE_CONT, "csx_SetHandleOffset: handle: 0x%p\n", handle);
1211 #endif
1212 
1213         hp->ah_offset = offset;
1214 
1215         return (CS_SUCCESS);
1216 }
1217 
1218 static int
1219 cs_no_carservices()
1220 {
1221 #ifdef  CS_STUBS_DEBUG
1222         if (cs_stubs_debug > 3)
1223             cmn_err(CE_CONT, "cs_no_carservices\n");
1224 #endif
1225         return (CS_UNSUPPORTED_FUNCTION);
1226 }