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 (c) 1995-1996 by Sun Microsystems, Inc.
  24  * All rights reserved.
  25  */
  26 
  27 #pragma ident   "%Z%%M% %I%     %E% SMI"
  28 
  29 /*
  30  * This file contains an array of structures, each of which refers to
  31  *      a tuple that we are prepared to handle.  The last structure
  32  *      in this array must have a type of CISTPL_END.
  33  *
  34  * If you want the generic tuple handler to be called for a tuple, use
  35  *      the cis_no_tuple_handler() entry point.
  36  */
  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/ddi_impldefs.h>
  53 #include <sys/kstat.h>
  54 #include <sys/kmem.h>
  55 #include <sys/modctl.h>
  56 #include <sys/kobj.h>
  57 #include <sys/callb.h>
  58 
  59 #include <sys/pctypes.h>
  60 #include <pcmcia/sys/cs_types.h>
  61 #include <pcmcia/sys/cis.h>
  62 #include <pcmcia/sys/cis_handlers.h>
  63 #include <pcmcia/sys/cs.h>
  64 #include <pcmcia/sys/cs_priv.h>
  65 #include <pcmcia/sys/cis_protos.h>
  66 
  67 /*
  68  * cistpl_std_callout - callout list for standard tuples
  69  */
  70 cistpl_callout_t cistpl_std_callout[] = {
  71         {       CISTPL_DEVICE,                  /* device information */
  72                 0,
  73                 0,
  74                 cistpl_device_handler,
  75                 "CISTPL_DEVICE"         },
  76         {       CISTPL_CHECKSUM,                /* checksum control */
  77                 0,
  78                 0,
  79                 cis_no_tuple_handler,
  80                 "CISTPL_CHECKSUM"       },
  81         {       CISTPL_LONGLINK_A,              /* long-link to AM */
  82                 0,
  83                 0,
  84                 cistpl_longlink_ac_handler,
  85                 "CISTPL_LONGLINK_A"     },
  86         {       CISTPL_LONGLINK_C,              /* long-link to CM */
  87                 0,
  88                 0,
  89                 cistpl_longlink_ac_handler,
  90                 "CISTPL_LONGLINK_C"     },
  91         {       CISTPL_LONGLINK_MFC,            /* long-link to MFC CIS */
  92                 0,
  93                 0,
  94                 cistpl_longlink_mfc_handler,
  95                 "CISTPL_LONGLINK_MFC"   },
  96         {       CISTPL_LINKTARGET,              /* link-target control */
  97                 0,
  98                 0,
  99                 cistpl_linktarget_handler,
 100                 "CISTPL_LINKTARGET"     },
 101         {       CISTPL_NO_LINK,                 /* no-link control */
 102                 0,
 103                 0,
 104                 cis_no_tuple_handler,
 105                 "CISTPL_NO_LINK"        },
 106         {       CISTPL_VERS_1,                  /* level 1 version info */
 107                 0,
 108                 0,
 109                 cistpl_vers_1_handler,
 110                 "CISTPL_VERS_1"         },
 111         {       CISTPL_ALTSTR,                  /* alternate language string */
 112                 0,
 113                 0,
 114                 cis_no_tuple_handler,
 115                 "CISTPL_ALTSTR"         },
 116         {       CISTPL_DEVICE_A,                /* AM device information */
 117                 0,
 118                 0,
 119                 cistpl_device_handler,
 120                 "CISTPL_DEVICE_A"       },
 121         {       CISTPL_JEDEC_C,                 /* JEDEC info for CM */
 122                 0,
 123                 0,
 124                 cistpl_jedec_handler,
 125                 "CISTPL_JEDEC_C"        },
 126         {       CISTPL_JEDEC_A,                 /* JEDEC info for AM */
 127                 0,
 128                 0,
 129                 cistpl_jedec_handler,
 130                 "CISTPL_JEDEC_A"        },
 131         {       CISTPL_CONFIG,                  /* configuration */
 132                 0,
 133                 0,
 134                 cistpl_config_handler,
 135                 "CISTPL_CONFIG"         },
 136         {       CISTPL_CFTABLE_ENTRY,           /* configuration-table-entry */
 137                 0,
 138                 0,
 139                 cistpl_cftable_handler,
 140                 "CISTPL_CFTABLE_ENTRY"  },
 141         {       CISTPL_DEVICE_OC,               /* other conditions for CM */
 142                 0,
 143                 0,
 144                 cistpl_device_handler,
 145                 "CISTPL_DEVICE_OC"      },
 146         {       CISTPL_DEVICE_OA,               /* other conditions for AM */
 147                 0,
 148                 0,
 149                 cistpl_device_handler,
 150                 "CISTPL_DEVICE_OA"      },
 151         {       CISTPL_VERS_2,                  /* level 2 version info */
 152                 0,
 153                 0,
 154                 cistpl_vers_2_handler,
 155                 "CISTPL_VERS_2"         },
 156         {       CISTPL_FORMAT,                  /* format type */
 157                 0,
 158                 0,
 159                 cistpl_format_handler,
 160                 "CISTPL_FORMAT"         },
 161         {       CISTPL_FORMAT_A,                /* Attribute Memory */
 162                 0,                              /* recording format */
 163                 0,
 164                 cistpl_format_handler,
 165                 "CISTPL_FORMAT_A"       },
 166         {       CISTPL_GEOMETRY,                /* geometry */
 167                 0,
 168                 0,
 169                 cistpl_geometry_handler,
 170                 "CISTPL_GEOMETRY"       },
 171         {       CISTPL_BYTEORDER,               /* byte order */
 172                 0,
 173                 0,
 174                 cistpl_byteorder_handler,
 175                 "CISTPL_BYTEORDER"      },
 176         {       CISTPL_DATE,                    /* card initialization date */
 177                 0,
 178                 0,
 179                 cistpl_date_handler,
 180                 "CISTPL_DATE"           },
 181         {       CISTPL_BATTERY,                 /* battery replacement date */
 182                 0,
 183                 0,
 184                 cistpl_battery_handler,
 185                 "CISTPL_BATTERY"        },
 186         {       CISTPL_ORG,                     /* organization */
 187                 0,
 188                 0,
 189                 cistpl_org_handler,
 190                 "CISTPL_ORG"            },
 191         {       CISTPL_FUNCID,                  /* card function ID */
 192                 0,
 193                 0,
 194                 cistpl_funcid_handler,
 195                 "CISTPL_FUNCID"         },
 196         {       CISTPL_FUNCE,                   /* card function extension */
 197                 TPLFUNC_MULTI,          /* for multifunction cards */
 198                 0,
 199                 cis_no_tuple_handler,
 200                 "CISTPL_FUNCE/MULTI"    },
 201         {       CISTPL_FUNCE,                   /* card function extension */
 202                 TPLFUNC_MEMORY,         /* for memory cards */
 203                 0,
 204                 cis_no_tuple_handler,
 205                 "CISTPL_FUNCE/MEMORY"   },
 206         {       CISTPL_FUNCE,                   /* card function extension */
 207                 TPLFUNC_SERIAL,         /* for serial port cards */
 208                 0,
 209                 cistpl_funce_serial_handler,
 210                 "CISTPL_FUNCE/SERIAL"   },
 211         {       CISTPL_FUNCE,                   /* card function extension */
 212                 TPLFUNC_PARALLEL,               /* for parallel port cards */
 213                 0,
 214                 cis_no_tuple_handler,
 215                 "CISTPL_FUNCE/PARALLEL" },
 216         {       CISTPL_FUNCE,                   /* card function extension */
 217                 TPLFUNC_FIXED,          /* for fixed disk cards */
 218                 0,
 219                 cis_no_tuple_handler,
 220                 "CISTPL_FUNCE/FIXED"    },
 221         {       CISTPL_FUNCE,                   /* card function extension */
 222                 TPLFUNC_VIDEO,          /* for video cards */
 223                 0,
 224                 cis_no_tuple_handler,
 225                 "CISTPL_FUNCE/VIDEO"    },
 226         {       CISTPL_FUNCE,                   /* card function extension */
 227                 TPLFUNC_LAN,            /* for LAN cards */
 228                 0,
 229                 cistpl_funce_lan_handler,
 230                 "CISTPL_FUNCE/LAN"      },
 231 
 232         {       CISTPL_FUNCE,                   /* card function extension */
 233                 TPLFUNC_AIMS,           /* Auto Incrementing Mass Storage */
 234                 0,
 235                 cis_no_tuple_handler,
 236                 "CISTPL_FUNCE/AIMS"     },
 237         {       CISTPL_FUNCE,                   /* card function extension */
 238                 TPLFUNC_SCSI,           /* SCSI bridge */
 239                 0,
 240                 cis_no_tuple_handler,
 241                 "CISTPL_FUNCE/SCSI"     },
 242         {       CISTPL_FUNCE,                   /* card function extension */
 243                 TPLFUNC_VENDOR_SPECIFIC,        /* Vendor Specific */
 244                 0,
 245                 cis_no_tuple_handler,
 246                 "CISTPL_FUNCE/VENDOR_SPECIFIC"  },
 247         {       CISTPL_FUNCE,                   /* card function extension */
 248                 TPLFUNC_UNKNOWN,        /* for unknown functions */
 249                 0,
 250                 cis_no_tuple_handler,
 251                 "CISTPL_FUNCE/unknown"  },
 252         {       CISTPL_MANFID,                  /* manufacturer ID */
 253                 0,
 254                 0,
 255                 cistpl_manfid_handler,
 256                 "CISTPL_MANFID"         },
 257         {       CISTPL_SPCL,                    /* special-purpose tuple */
 258                 0,
 259                 0,
 260                 cis_no_tuple_handler,
 261                 "CISTPL_SPCL"           },
 262         {       CISTPL_LONGLINK_CB,             /* longlink to next */
 263                 0,                              /* tuple chain */
 264                 0,
 265                 cis_no_tuple_handler,
 266                 "CISTPL_LONGLINK_CB"    },
 267         {       CISTPL_CONFIG_CB,               /* configuration tuple */
 268                 0,
 269                 0,
 270                 cis_no_tuple_handler,
 271                 "CISTPL_CONFIG_CB"      },
 272         {       CISTPL_CFTABLE_ENTRY_CB,        /* configuration table */
 273                 0,                              /* entry */
 274                 0,
 275                 cis_no_tuple_handler,
 276                 "CISTPL_CFTABLE_ENTRY_CB"       },
 277         {       CISTPL_BAR,                     /* Base Address Register */
 278                 0,                              /* definition */
 279                 0,
 280                 cis_no_tuple_handler,
 281                 "CISTPL_BAR"            },
 282         {       CISTPL_DEVICEGEO,               /* Common Memory */
 283                 0,                              /* device geometry */
 284                 0,
 285                 cis_no_tuple_handler,
 286                 "CISTPL_DEVICEGEO"      },
 287         {       CISTPL_DEVICEGEO_A,             /* Attribute Memory */
 288                 0,                              /* device geometry */
 289                 0,
 290                 cis_no_tuple_handler,
 291                 "CISTPL_DEVICEGEO_A"    },
 292         {       CISTPL_SWIL,                    /* software interleave */
 293                 0,
 294                 0,
 295                 cis_no_tuple_handler,
 296                 "CISTPL_SWIL"           },
 297         {       CISTPL_VEND_SPEC_80,            /* vendor-specific 0x80 */
 298                 0,
 299                 0,
 300                 cis_unknown_tuple_handler,
 301                 "CISTPL_VEND_SPEC_80"   },
 302         {       CISTPL_VEND_SPEC_81,            /* vendor-specific 0x81 */
 303                 0,
 304                 0,
 305                 cis_unknown_tuple_handler,
 306                 "CISTPL_VEND_SPEC_81"   },
 307         {       CISTPL_VEND_SPEC_82,            /* vendor-specific 0x82 */
 308                 0,
 309                 0,
 310                 cis_unknown_tuple_handler,
 311                 "CISTPL_VEND_SPEC_82"   },
 312         {       CISTPL_VEND_SPEC_83,            /* vendor-specific 0x83 */
 313                 0,
 314                 0,
 315                 cis_unknown_tuple_handler,
 316                 "CISTPL_VEND_SPEC_83"   },
 317         {       CISTPL_VEND_SPEC_84,            /* vendor-specific 0x84 */
 318                 0,
 319                 0,
 320                 cis_unknown_tuple_handler,
 321                 "CISTPL_VEND_SPEC_84"   },
 322         {       CISTPL_VEND_SPEC_85,            /* vendor-specific 0x85 */
 323                 0,
 324                 0,
 325                 cis_unknown_tuple_handler,
 326                 "CISTPL_VEND_SPEC_85"   },
 327         {       CISTPL_VEND_SPEC_86,            /* vendor-specific 0x86 */
 328                 0,
 329                 0,
 330                 cis_unknown_tuple_handler,
 331                 "CISTPL_VEND_SPEC_86"   },
 332         {       CISTPL_VEND_SPEC_87,            /* vendor-specific 0x87 */
 333                 0,
 334                 0,
 335                 cis_unknown_tuple_handler,
 336                 "CISTPL_VEND_SPEC_87"   },
 337         {       CISTPL_VEND_SPEC_88,            /* vendor-specific 0x88 */
 338                 0,
 339                 0,
 340                 cis_unknown_tuple_handler,
 341                 "CISTPL_VEND_SPEC_88"   },
 342         {       CISTPL_VEND_SPEC_89,            /* vendor-specific 0x89 */
 343                 0,
 344                 0,
 345                 cis_unknown_tuple_handler,
 346                 "CISTPL_VEND_SPEC_89"   },
 347         {       CISTPL_VEND_SPEC_8a,            /* vendor-specific 0x8a */
 348                 0,
 349                 0,
 350                 cis_unknown_tuple_handler,
 351                 "CISTPL_VEND_SPEC_8a"   },
 352         {       CISTPL_VEND_SPEC_8b,            /* vendor-specific 0x8b */
 353                 0,
 354                 0,
 355                 cis_unknown_tuple_handler,
 356                 "CISTPL_VEND_SPEC_8b"   },
 357         {       CISTPL_VEND_SPEC_8c,            /* vendor-specific 0x8c */
 358                 0,
 359                 0,
 360                 cis_unknown_tuple_handler,
 361                 "CISTPL_VEND_SPEC_8c"   },
 362         {       CISTPL_VEND_SPEC_8d,            /* vendor-specific 0x8d */
 363                 0,
 364                 0,
 365                 cis_unknown_tuple_handler,
 366                 "CISTPL_VEND_SPEC_8d"   },
 367         {       CISTPL_VEND_SPEC_8e,            /* vendor-specific 0x8e */
 368                 0,
 369                 0,
 370                 cis_unknown_tuple_handler,
 371                 "CISTPL_VEND_SPEC_8e"   },
 372         {       CISTPL_VEND_SPEC_8f,            /* vendor-specific 0x8f */
 373                 0,
 374                 0,
 375                 cis_unknown_tuple_handler,
 376                 "CISTPL_VEND_SPEC_8f"   },
 377         {       CISTPL_END,                     /* end-of-list tuple */
 378                 0,
 379                 0,
 380                 cis_no_tuple_handler,
 381                 "unknown tuple"         },
 382         };