1/* 2 * cistpl.h 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * The initial developer of the original code is David A. Hinds 9 * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 10 * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. 11 * 12 * (C) 1999 David A. Hinds 13 */ 14 15#ifndef _LINUX_CISTPL_H 16#define _LINUX_CISTPL_H 17 18#define CISTPL_NULL 0x00 19#define CISTPL_DEVICE 0x01 20#define CISTPL_LONGLINK_CB 0x02 21#define CISTPL_INDIRECT 0x03 22#define CISTPL_CONFIG_CB 0x04 23#define CISTPL_CFTABLE_ENTRY_CB 0x05 24#define CISTPL_LONGLINK_MFC 0x06 25#define CISTPL_BAR 0x07 26#define CISTPL_PWR_MGMNT 0x08 27#define CISTPL_EXTDEVICE 0x09 28#define CISTPL_CHECKSUM 0x10 29#define CISTPL_LONGLINK_A 0x11 30#define CISTPL_LONGLINK_C 0x12 31#define CISTPL_LINKTARGET 0x13 32#define CISTPL_NO_LINK 0x14 33#define CISTPL_VERS_1 0x15 34#define CISTPL_ALTSTR 0x16 35#define CISTPL_DEVICE_A 0x17 36#define CISTPL_JEDEC_C 0x18 37#define CISTPL_JEDEC_A 0x19 38#define CISTPL_CONFIG 0x1a 39#define CISTPL_CFTABLE_ENTRY 0x1b 40#define CISTPL_DEVICE_OC 0x1c 41#define CISTPL_DEVICE_OA 0x1d 42#define CISTPL_DEVICE_GEO 0x1e 43#define CISTPL_DEVICE_GEO_A 0x1f 44#define CISTPL_MANFID 0x20 45#define CISTPL_FUNCID 0x21 46#define CISTPL_FUNCE 0x22 47#define CISTPL_SWIL 0x23 48#define CISTPL_END 0xff 49/* Layer 2 tuples */ 50#define CISTPL_VERS_2 0x40 51#define CISTPL_FORMAT 0x41 52#define CISTPL_GEOMETRY 0x42 53#define CISTPL_BYTEORDER 0x43 54#define CISTPL_DATE 0x44 55#define CISTPL_BATTERY 0x45 56#define CISTPL_FORMAT_A 0x47 57/* Layer 3 tuples */ 58#define CISTPL_ORG 0x46 59#define CISTPL_SPCL 0x90 60 61typedef struct cistpl_longlink_t { 62 u_int addr; 63} cistpl_longlink_t; 64 65typedef struct cistpl_checksum_t { 66 u_short addr; 67 u_short len; 68 u_char sum; 69} cistpl_checksum_t; 70 71#define CISTPL_MAX_FUNCTIONS 8 72#define CISTPL_MFC_ATTR 0x00 73#define CISTPL_MFC_COMMON 0x01 74 75typedef struct cistpl_longlink_mfc_t { 76 u_char nfn; 77 struct { 78 u_char space; 79 u_int addr; 80 } fn[CISTPL_MAX_FUNCTIONS]; 81} cistpl_longlink_mfc_t; 82 83#define CISTPL_MAX_ALTSTR_STRINGS 4 84 85typedef struct cistpl_altstr_t { 86 u_char ns; 87 u_char ofs[CISTPL_MAX_ALTSTR_STRINGS]; 88 char str[254]; 89} cistpl_altstr_t; 90 91#define CISTPL_DTYPE_NULL 0x00 92#define CISTPL_DTYPE_ROM 0x01 93#define CISTPL_DTYPE_OTPROM 0x02 94#define CISTPL_DTYPE_EPROM 0x03 95#define CISTPL_DTYPE_EEPROM 0x04 96#define CISTPL_DTYPE_FLASH 0x05 97#define CISTPL_DTYPE_SRAM 0x06 98#define CISTPL_DTYPE_DRAM 0x07 99#define CISTPL_DTYPE_FUNCSPEC 0x0d 100#define CISTPL_DTYPE_EXTEND 0x0e 101 102#define CISTPL_MAX_DEVICES 4 103 104typedef struct cistpl_device_t { 105 u_char ndev; 106 struct { 107 u_char type; 108 u_char wp; 109 u_int speed; 110 u_int size; 111 } dev[CISTPL_MAX_DEVICES]; 112} cistpl_device_t; 113 114#define CISTPL_DEVICE_MWAIT 0x01 115#define CISTPL_DEVICE_3VCC 0x02 116 117typedef struct cistpl_device_o_t { 118 u_char flags; 119 cistpl_device_t device; 120} cistpl_device_o_t; 121 122#define CISTPL_VERS_1_MAX_PROD_STRINGS 4 123 124typedef struct cistpl_vers_1_t { 125 u_char major; 126 u_char minor; 127 u_char ns; 128 u_char ofs[CISTPL_VERS_1_MAX_PROD_STRINGS]; 129 char str[254]; 130} cistpl_vers_1_t; 131 132typedef struct cistpl_jedec_t { 133 u_char nid; 134 struct { 135 u_char mfr; 136 u_char info; 137 } id[CISTPL_MAX_DEVICES]; 138} cistpl_jedec_t; 139 140typedef struct cistpl_manfid_t { 141 u_short manf; 142 u_short card; 143} cistpl_manfid_t; 144 145#define CISTPL_FUNCID_MULTI 0x00 146#define CISTPL_FUNCID_MEMORY 0x01 147#define CISTPL_FUNCID_SERIAL 0x02 148#define CISTPL_FUNCID_PARALLEL 0x03 149#define CISTPL_FUNCID_FIXED 0x04 150#define CISTPL_FUNCID_VIDEO 0x05 151#define CISTPL_FUNCID_NETWORK 0x06 152#define CISTPL_FUNCID_AIMS 0x07 153#define CISTPL_FUNCID_SCSI 0x08 154 155#define CISTPL_SYSINIT_POST 0x01 156#define CISTPL_SYSINIT_ROM 0x02 157 158typedef struct cistpl_funcid_t { 159 u_char func; 160 u_char sysinit; 161} cistpl_funcid_t; 162 163typedef struct cistpl_funce_t { 164 u_char type; 165 u_char data[0]; 166} cistpl_funce_t; 167 168/*====================================================================== 169 170 Modem Function Extension Tuples 171 172======================================================================*/ 173 174#define CISTPL_FUNCE_SERIAL_IF 0x00 175#define CISTPL_FUNCE_SERIAL_CAP 0x01 176#define CISTPL_FUNCE_SERIAL_SERV_DATA 0x02 177#define CISTPL_FUNCE_SERIAL_SERV_FAX 0x03 178#define CISTPL_FUNCE_SERIAL_SERV_VOICE 0x04 179#define CISTPL_FUNCE_SERIAL_CAP_DATA 0x05 180#define CISTPL_FUNCE_SERIAL_CAP_FAX 0x06 181#define CISTPL_FUNCE_SERIAL_CAP_VOICE 0x07 182#define CISTPL_FUNCE_SERIAL_IF_DATA 0x08 183#define CISTPL_FUNCE_SERIAL_IF_FAX 0x09 184#define CISTPL_FUNCE_SERIAL_IF_VOICE 0x0a 185 186/* UART identification */ 187#define CISTPL_SERIAL_UART_8250 0x00 188#define CISTPL_SERIAL_UART_16450 0x01 189#define CISTPL_SERIAL_UART_16550 0x02 190#define CISTPL_SERIAL_UART_8251 0x03 191#define CISTPL_SERIAL_UART_8530 0x04 192#define CISTPL_SERIAL_UART_85230 0x05 193 194/* UART capabilities */ 195#define CISTPL_SERIAL_UART_SPACE 0x01 196#define CISTPL_SERIAL_UART_MARK 0x02 197#define CISTPL_SERIAL_UART_ODD 0x04 198#define CISTPL_SERIAL_UART_EVEN 0x08 199#define CISTPL_SERIAL_UART_5BIT 0x01 200#define CISTPL_SERIAL_UART_6BIT 0x02 201#define CISTPL_SERIAL_UART_7BIT 0x04 202#define CISTPL_SERIAL_UART_8BIT 0x08 203#define CISTPL_SERIAL_UART_1STOP 0x10 204#define CISTPL_SERIAL_UART_MSTOP 0x20 205#define CISTPL_SERIAL_UART_2STOP 0x40 206 207typedef struct cistpl_serial_t { 208 u_char uart_type; 209 u_char uart_cap_0; 210 u_char uart_cap_1; 211} cistpl_serial_t; 212 213typedef struct cistpl_modem_cap_t { 214 u_char flow; 215 u_char cmd_buf; 216 u_char rcv_buf_0, rcv_buf_1, rcv_buf_2; 217 u_char xmit_buf_0, xmit_buf_1, xmit_buf_2; 218} cistpl_modem_cap_t; 219 220#define CISTPL_SERIAL_MOD_103 0x01 221#define CISTPL_SERIAL_MOD_V21 0x02 222#define CISTPL_SERIAL_MOD_V23 0x04 223#define CISTPL_SERIAL_MOD_V22 0x08 224#define CISTPL_SERIAL_MOD_212A 0x10 225#define CISTPL_SERIAL_MOD_V22BIS 0x20 226#define CISTPL_SERIAL_MOD_V26 0x40 227#define CISTPL_SERIAL_MOD_V26BIS 0x80 228#define CISTPL_SERIAL_MOD_V27BIS 0x01 229#define CISTPL_SERIAL_MOD_V29 0x02 230#define CISTPL_SERIAL_MOD_V32 0x04 231#define CISTPL_SERIAL_MOD_V32BIS 0x08 232#define CISTPL_SERIAL_MOD_V34 0x10 233 234#define CISTPL_SERIAL_ERR_MNP2_4 0x01 235#define CISTPL_SERIAL_ERR_V42_LAPM 0x02 236 237#define CISTPL_SERIAL_CMPR_V42BIS 0x01 238#define CISTPL_SERIAL_CMPR_MNP5 0x02 239 240#define CISTPL_SERIAL_CMD_AT1 0x01 241#define CISTPL_SERIAL_CMD_AT2 0x02 242#define CISTPL_SERIAL_CMD_AT3 0x04 243#define CISTPL_SERIAL_CMD_MNP_AT 0x08 244#define CISTPL_SERIAL_CMD_V25BIS 0x10 245#define CISTPL_SERIAL_CMD_V25A 0x20 246#define CISTPL_SERIAL_CMD_DMCL 0x40 247 248typedef struct cistpl_data_serv_t { 249 u_char max_data_0; 250 u_char max_data_1; 251 u_char modulation_0; 252 u_char modulation_1; 253 u_char error_control; 254 u_char compression; 255 u_char cmd_protocol; 256 u_char escape; 257 u_char encrypt; 258 u_char misc_features; 259 u_char ccitt_code[0]; 260} cistpl_data_serv_t; 261 262typedef struct cistpl_fax_serv_t { 263 u_char max_data_0; 264 u_char max_data_1; 265 u_char modulation; 266 u_char encrypt; 267 u_char features_0; 268 u_char features_1; 269 u_char ccitt_code[0]; 270} cistpl_fax_serv_t; 271 272typedef struct cistpl_voice_serv_t { 273 u_char max_data_0; 274 u_char max_data_1; 275} cistpl_voice_serv_t; 276 277/*====================================================================== 278 279 LAN Function Extension Tuples 280 281======================================================================*/ 282 283#define CISTPL_FUNCE_LAN_TECH 0x01 284#define CISTPL_FUNCE_LAN_SPEED 0x02 285#define CISTPL_FUNCE_LAN_MEDIA 0x03 286#define CISTPL_FUNCE_LAN_NODE_ID 0x04 287#define CISTPL_FUNCE_LAN_CONNECTOR 0x05 288 289/* LAN technologies */ 290#define CISTPL_LAN_TECH_ARCNET 0x01 291#define CISTPL_LAN_TECH_ETHERNET 0x02 292#define CISTPL_LAN_TECH_TOKENRING 0x03 293#define CISTPL_LAN_TECH_LOCALTALK 0x04 294#define CISTPL_LAN_TECH_FDDI 0x05 295#define CISTPL_LAN_TECH_ATM 0x06 296#define CISTPL_LAN_TECH_WIRELESS 0x07 297 298typedef struct cistpl_lan_tech_t { 299 u_char tech; 300} cistpl_lan_tech_t; 301 302typedef struct cistpl_lan_speed_t { 303 u_int speed; 304} cistpl_lan_speed_t; 305 306/* LAN media definitions */ 307#define CISTPL_LAN_MEDIA_UTP 0x01 308#define CISTPL_LAN_MEDIA_STP 0x02 309#define CISTPL_LAN_MEDIA_THIN_COAX 0x03 310#define CISTPL_LAN_MEDIA_THICK_COAX 0x04 311#define CISTPL_LAN_MEDIA_FIBER 0x05 312#define CISTPL_LAN_MEDIA_900MHZ 0x06 313#define CISTPL_LAN_MEDIA_2GHZ 0x07 314#define CISTPL_LAN_MEDIA_5GHZ 0x08 315#define CISTPL_LAN_MEDIA_DIFF_IR 0x09 316#define CISTPL_LAN_MEDIA_PTP_IR 0x0a 317 318typedef struct cistpl_lan_media_t { 319 u_char media; 320} cistpl_lan_media_t; 321 322typedef struct cistpl_lan_node_id_t { 323 u_char nb; 324 u_char id[16]; 325} cistpl_lan_node_id_t; 326 327typedef struct cistpl_lan_connector_t { 328 u_char code; 329} cistpl_lan_connector_t; 330 331/*====================================================================== 332 333 IDE Function Extension Tuples 334 335======================================================================*/ 336 337#define CISTPL_IDE_INTERFACE 0x01 338 339typedef struct cistpl_ide_interface_t { 340 u_char interface; 341} cistpl_ide_interface_t; 342 343/* First feature byte */ 344#define CISTPL_IDE_SILICON 0x04 345#define CISTPL_IDE_UNIQUE 0x08 346#define CISTPL_IDE_DUAL 0x10 347 348/* Second feature byte */ 349#define CISTPL_IDE_HAS_SLEEP 0x01 350#define CISTPL_IDE_HAS_STANDBY 0x02 351#define CISTPL_IDE_HAS_IDLE 0x04 352#define CISTPL_IDE_LOW_POWER 0x08 353#define CISTPL_IDE_REG_INHIBIT 0x10 354#define CISTPL_IDE_HAS_INDEX 0x20 355#define CISTPL_IDE_IOIS16 0x40 356 357typedef struct cistpl_ide_feature_t { 358 u_char feature1; 359 u_char feature2; 360} cistpl_ide_feature_t; 361 362#define CISTPL_FUNCE_IDE_IFACE 0x01 363#define CISTPL_FUNCE_IDE_MASTER 0x02 364#define CISTPL_FUNCE_IDE_SLAVE 0x03 365 366/*====================================================================== 367 368 Configuration Table Entries 369 370======================================================================*/ 371 372#define CISTPL_BAR_SPACE 0x07 373#define CISTPL_BAR_SPACE_IO 0x10 374#define CISTPL_BAR_PREFETCH 0x20 375#define CISTPL_BAR_CACHEABLE 0x40 376#define CISTPL_BAR_1MEG_MAP 0x80 377 378typedef struct cistpl_bar_t { 379 u_char attr; 380 u_int size; 381} cistpl_bar_t; 382 383typedef struct cistpl_config_t { 384 u_char last_idx; 385 u_int base; 386 u_int rmask[4]; 387 u_char subtuples; 388} cistpl_config_t; 389 390/* These are bits in the 'present' field, and indices in 'param' */ 391#define CISTPL_POWER_VNOM 0 392#define CISTPL_POWER_VMIN 1 393#define CISTPL_POWER_VMAX 2 394#define CISTPL_POWER_ISTATIC 3 395#define CISTPL_POWER_IAVG 4 396#define CISTPL_POWER_IPEAK 5 397#define CISTPL_POWER_IDOWN 6 398 399#define CISTPL_POWER_HIGHZ_OK 0x01 400#define CISTPL_POWER_HIGHZ_REQ 0x02 401 402typedef struct cistpl_power_t { 403 u_char present; 404 u_char flags; 405 u_int param[7]; 406} cistpl_power_t; 407 408typedef struct cistpl_timing_t { 409 u_int wait, waitscale; 410 u_int ready, rdyscale; 411 u_int reserved, rsvscale; 412} cistpl_timing_t; 413 414#define CISTPL_IO_LINES_MASK 0x1f 415#define CISTPL_IO_8BIT 0x20 416#define CISTPL_IO_16BIT 0x40 417#define CISTPL_IO_RANGE 0x80 418 419#define CISTPL_IO_MAX_WIN 16 420 421typedef struct cistpl_io_t { 422 u_char flags; 423 u_char nwin; 424 struct { 425 u_int base; 426 u_int len; 427 } win[CISTPL_IO_MAX_WIN]; 428} cistpl_io_t; 429 430typedef struct cistpl_irq_t { 431 u_int IRQInfo1; 432 u_int IRQInfo2; 433} cistpl_irq_t; 434 435#define CISTPL_MEM_MAX_WIN 8 436 437typedef struct cistpl_mem_t { 438 u_char flags; 439 u_char nwin; 440 struct { 441 u_int len; 442 u_int card_addr; 443 u_int host_addr; 444 } win[CISTPL_MEM_MAX_WIN]; 445} cistpl_mem_t; 446 447#define CISTPL_CFTABLE_DEFAULT 0x0001 448#define CISTPL_CFTABLE_BVDS 0x0002 449#define CISTPL_CFTABLE_WP 0x0004 450#define CISTPL_CFTABLE_RDYBSY 0x0008 451#define CISTPL_CFTABLE_MWAIT 0x0010 452#define CISTPL_CFTABLE_AUDIO 0x0800 453#define CISTPL_CFTABLE_READONLY 0x1000 454#define CISTPL_CFTABLE_PWRDOWN 0x2000 455 456typedef struct cistpl_cftable_entry_t { 457 u_char index; 458 u_short flags; 459 u_char interface; 460 cistpl_power_t vcc, vpp1, vpp2; 461 cistpl_timing_t timing; 462 cistpl_io_t io; 463 cistpl_irq_t irq; 464 cistpl_mem_t mem; 465 u_char subtuples; 466} cistpl_cftable_entry_t; 467 468#define CISTPL_CFTABLE_MASTER 0x000100 469#define CISTPL_CFTABLE_INVALIDATE 0x000200 470#define CISTPL_CFTABLE_VGA_PALETTE 0x000400 471#define CISTPL_CFTABLE_PARITY 0x000800 472#define CISTPL_CFTABLE_WAIT 0x001000 473#define CISTPL_CFTABLE_SERR 0x002000 474#define CISTPL_CFTABLE_FAST_BACK 0x004000 475#define CISTPL_CFTABLE_BINARY_AUDIO 0x010000 476#define CISTPL_CFTABLE_PWM_AUDIO 0x020000 477 478typedef struct cistpl_cftable_entry_cb_t { 479 u_char index; 480 u_int flags; 481 cistpl_power_t vcc, vpp1, vpp2; 482 u_char io; 483 cistpl_irq_t irq; 484 u_char mem; 485 u_char subtuples; 486} cistpl_cftable_entry_cb_t; 487 488typedef struct cistpl_device_geo_t { 489 u_char ngeo; 490 struct { 491 u_char buswidth; 492 u_int erase_block; 493 u_int read_block; 494 u_int write_block; 495 u_int partition; 496 u_int interleave; 497 } geo[CISTPL_MAX_DEVICES]; 498} cistpl_device_geo_t; 499 500typedef struct cistpl_vers_2_t { 501 u_char vers; 502 u_char comply; 503 u_short dindex; 504 u_char vspec8, vspec9; 505 u_char nhdr; 506 u_char vendor, info; 507 char str[244]; 508} cistpl_vers_2_t; 509 510typedef struct cistpl_org_t { 511 u_char data_org; 512 char desc[30]; 513} cistpl_org_t; 514 515#define CISTPL_ORG_FS 0x00 516#define CISTPL_ORG_APPSPEC 0x01 517#define CISTPL_ORG_XIP 0x02 518 519typedef struct cistpl_format_t { 520 u_char type; 521 u_char edc; 522 u_int offset; 523 u_int length; 524} cistpl_format_t; 525 526#define CISTPL_FORMAT_DISK 0x00 527#define CISTPL_FORMAT_MEM 0x01 528 529#define CISTPL_EDC_NONE 0x00 530#define CISTPL_EDC_CKSUM 0x01 531#define CISTPL_EDC_CRC 0x02 532#define CISTPL_EDC_PCC 0x03 533 534typedef union cisparse_t { 535 cistpl_device_t device; 536 cistpl_checksum_t checksum; 537 cistpl_longlink_t longlink; 538 cistpl_longlink_mfc_t longlink_mfc; 539 cistpl_vers_1_t version_1; 540 cistpl_altstr_t altstr; 541 cistpl_jedec_t jedec; 542 cistpl_manfid_t manfid; 543 cistpl_funcid_t funcid; 544 cistpl_funce_t funce; 545 cistpl_bar_t bar; 546 cistpl_config_t config; 547 cistpl_cftable_entry_t cftable_entry; 548 cistpl_cftable_entry_cb_t cftable_entry_cb; 549 cistpl_device_geo_t device_geo; 550 cistpl_vers_2_t vers_2; 551 cistpl_org_t org; 552 cistpl_format_t format; 553} cisparse_t; 554 555typedef struct tuple_t { 556 u_int Attributes; 557 cisdata_t DesiredTuple; 558 u_int Flags; /* internal use */ 559 u_int LinkOffset; /* internal use */ 560 u_int CISOffset; /* internal use */ 561 cisdata_t TupleCode; 562 cisdata_t TupleLink; 563 cisdata_t TupleOffset; 564 cisdata_t TupleDataMax; 565 cisdata_t TupleDataLen; 566 cisdata_t *TupleData; 567} tuple_t; 568 569/* Special cisdata_t value */ 570#define RETURN_FIRST_TUPLE 0xff 571 572/* Attributes for tuple calls */ 573#define TUPLE_RETURN_LINK 0x01 574#define TUPLE_RETURN_COMMON 0x02 575 576/* For ValidateCIS */ 577typedef struct cisinfo_t { 578 u_int Chains; 579} cisinfo_t; 580 581#define CISTPL_MAX_CIS_SIZE 0x200 582 583/* For ReplaceCIS */ 584typedef struct cisdump_t { 585 u_int Length; 586 cisdata_t Data[CISTPL_MAX_CIS_SIZE]; 587} cisdump_t; 588 589 590int pcmcia_replace_cis(struct pcmcia_socket *s, cisdump_t *cis); 591 592/* don't use outside of PCMCIA core yet */ 593int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int func, tuple_t *tuple); 594int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, tuple_t *tuple); 595int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple); 596int pccard_parse_tuple(tuple_t *tuple, cisparse_t *parse); 597 598int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, cisinfo_t *info); 599 600/* ... but use these wrappers instead */ 601#define pcmcia_get_first_tuple(p_dev, tuple) \ 602 pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple) 603 604#define pcmcia_get_next_tuple(p_dev, tuple) \ 605 pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple) 606 607#define pcmcia_get_tuple_data(p_dev, tuple) \ 608 pccard_get_tuple_data(p_dev->socket, tuple) 609 610#define pcmcia_parse_tuple(p_dev, tuple, parse) \ 611 pccard_parse_tuple(tuple, parse) 612 613#define pcmcia_validate_cis(p_dev, info) \ 614 pccard_validate_cis(p_dev->socket, p_dev->func, info) 615 616#endif /* LINUX_CISTPL_H */ 617