This source file includes following definitions.
- write_data
- write_address
- read_data
- isapnp_read_byte
- isapnp_read_word
- isapnp_write_byte
- isapnp_write_word
- isapnp_key
- isapnp_wait
- isapnp_wake
- isapnp_device
- isapnp_activate
- isapnp_deactivate
- isapnp_peek
- isapnp_next_rdp
- isapnp_set_rdp
- isapnp_isolate_rdp_select
- isapnp_isolate
- isapnp_read_tag
- isapnp_skip_bytes
- isapnp_parse_device
- isapnp_parse_irq_resource
- isapnp_parse_dma_resource
- isapnp_parse_port_resource
- isapnp_parse_fixed_port_resource
- isapnp_parse_mem_resource
- isapnp_parse_mem32_resource
- isapnp_parse_fixed_mem32_resource
- isapnp_parse_name
- isapnp_create_device
- isapnp_parse_resource_map
- isapnp_checksum
- isapnp_build_device_list
- isapnp_present
- isapnp_cfg_begin
- isapnp_cfg_end
- isapnp_get_resources
- isapnp_set_resources
- isapnp_disable_resources
- isapnp_init
- isapnp_setup_disable
- isapnp_setup_isapnp
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 #include <linux/moduleparam.h>
  24 #include <linux/kernel.h>
  25 #include <linux/errno.h>
  26 #include <linux/delay.h>
  27 #include <linux/init.h>
  28 #include <linux/isapnp.h>
  29 #include <linux/mutex.h>
  30 #include <asm/io.h>
  31 
  32 #include "../base.h"
  33 
  34 #if 0
  35 #define ISAPNP_REGION_OK
  36 #endif
  37 
  38 int isapnp_disable;             
  39 static int isapnp_rdp;          
  40 static int isapnp_reset = 1;    
  41 static int isapnp_verbose = 1;  
  42 
  43 module_param(isapnp_disable, int, 0);
  44 MODULE_PARM_DESC(isapnp_disable, "ISA Plug & Play disable");
  45 module_param(isapnp_rdp, int, 0);
  46 MODULE_PARM_DESC(isapnp_rdp, "ISA Plug & Play read data port");
  47 module_param(isapnp_reset, int, 0);
  48 MODULE_PARM_DESC(isapnp_reset, "ISA Plug & Play reset all cards");
  49 module_param(isapnp_verbose, int, 0);
  50 MODULE_PARM_DESC(isapnp_verbose, "ISA Plug & Play verbose mode");
  51 
  52 #define _PIDXR          0x279
  53 #define _PNPWRP         0xa79
  54 
  55 
  56 #define _STAG_PNPVERNO          0x01
  57 #define _STAG_LOGDEVID          0x02
  58 #define _STAG_COMPATDEVID       0x03
  59 #define _STAG_IRQ               0x04
  60 #define _STAG_DMA               0x05
  61 #define _STAG_STARTDEP          0x06
  62 #define _STAG_ENDDEP            0x07
  63 #define _STAG_IOPORT            0x08
  64 #define _STAG_FIXEDIO           0x09
  65 #define _STAG_VENDOR            0x0e
  66 #define _STAG_END               0x0f
  67 
  68 #define _LTAG_MEMRANGE          0x81
  69 #define _LTAG_ANSISTR           0x82
  70 #define _LTAG_UNICODESTR        0x83
  71 #define _LTAG_VENDOR            0x84
  72 #define _LTAG_MEM32RANGE        0x85
  73 #define _LTAG_FIXEDMEM32RANGE   0x86
  74 
  75 
  76 
  77 #define ISAPNP_CFG_ACTIVATE     0x30    
  78 #define ISAPNP_CFG_MEM          0x40    
  79 #define ISAPNP_CFG_PORT         0x60    
  80 #define ISAPNP_CFG_IRQ          0x70    
  81 #define ISAPNP_CFG_DMA          0x74    
  82 
  83 
  84 
  85 
  86 
  87 #define ISAPNP_MAX_MEM          4
  88 #define ISAPNP_MAX_PORT         8
  89 #define ISAPNP_MAX_IRQ          2
  90 #define ISAPNP_MAX_DMA          2
  91 
  92 static unsigned char isapnp_checksum_value;
  93 static DEFINE_MUTEX(isapnp_cfg_mutex);
  94 static int isapnp_csn_count;
  95 
  96 
  97 
  98 static inline void write_data(unsigned char x)
  99 {
 100         outb(x, _PNPWRP);
 101 }
 102 
 103 static inline void write_address(unsigned char x)
 104 {
 105         outb(x, _PIDXR);
 106         udelay(20);
 107 }
 108 
 109 static inline unsigned char read_data(void)
 110 {
 111         unsigned char val = inb(isapnp_rdp);
 112         return val;
 113 }
 114 
 115 unsigned char isapnp_read_byte(unsigned char idx)
 116 {
 117         write_address(idx);
 118         return read_data();
 119 }
 120 
 121 static unsigned short isapnp_read_word(unsigned char idx)
 122 {
 123         unsigned short val;
 124 
 125         val = isapnp_read_byte(idx);
 126         val = (val << 8) + isapnp_read_byte(idx + 1);
 127         return val;
 128 }
 129 
 130 void isapnp_write_byte(unsigned char idx, unsigned char val)
 131 {
 132         write_address(idx);
 133         write_data(val);
 134 }
 135 
 136 static void isapnp_write_word(unsigned char idx, unsigned short val)
 137 {
 138         isapnp_write_byte(idx, val >> 8);
 139         isapnp_write_byte(idx + 1, val);
 140 }
 141 
 142 static void isapnp_key(void)
 143 {
 144         unsigned char code = 0x6a, msb;
 145         int i;
 146 
 147         mdelay(1);
 148         write_address(0x00);
 149         write_address(0x00);
 150 
 151         write_address(code);
 152 
 153         for (i = 1; i < 32; i++) {
 154                 msb = ((code & 0x01) ^ ((code & 0x02) >> 1)) << 7;
 155                 code = (code >> 1) | msb;
 156                 write_address(code);
 157         }
 158 }
 159 
 160 
 161 static void isapnp_wait(void)
 162 {
 163         isapnp_write_byte(0x02, 0x02);
 164 }
 165 
 166 static void isapnp_wake(unsigned char csn)
 167 {
 168         isapnp_write_byte(0x03, csn);
 169 }
 170 
 171 static void isapnp_device(unsigned char logdev)
 172 {
 173         isapnp_write_byte(0x07, logdev);
 174 }
 175 
 176 static void isapnp_activate(unsigned char logdev)
 177 {
 178         isapnp_device(logdev);
 179         isapnp_write_byte(ISAPNP_CFG_ACTIVATE, 1);
 180         udelay(250);
 181 }
 182 
 183 static void isapnp_deactivate(unsigned char logdev)
 184 {
 185         isapnp_device(logdev);
 186         isapnp_write_byte(ISAPNP_CFG_ACTIVATE, 0);
 187         udelay(500);
 188 }
 189 
 190 static void __init isapnp_peek(unsigned char *data, int bytes)
 191 {
 192         int i, j;
 193         unsigned char d = 0;
 194 
 195         for (i = 1; i <= bytes; i++) {
 196                 for (j = 0; j < 20; j++) {
 197                         d = isapnp_read_byte(0x05);
 198                         if (d & 1)
 199                                 break;
 200                         udelay(100);
 201                 }
 202                 if (!(d & 1)) {
 203                         if (data != NULL)
 204                                 *data++ = 0xff;
 205                         continue;
 206                 }
 207                 d = isapnp_read_byte(0x04);     
 208                 isapnp_checksum_value += d;
 209                 if (data != NULL)
 210                         *data++ = d;
 211         }
 212 }
 213 
 214 #define RDP_STEP        32      
 215 
 216 static int isapnp_next_rdp(void)
 217 {
 218         int rdp = isapnp_rdp;
 219         static int old_rdp = 0;
 220 
 221         if (old_rdp) {
 222                 release_region(old_rdp, 1);
 223                 old_rdp = 0;
 224         }
 225         while (rdp <= 0x3ff) {
 226                 
 227 
 228 
 229 
 230                 if ((rdp < 0x280 || rdp > 0x380)
 231                     && request_region(rdp, 1, "ISAPnP")) {
 232                         isapnp_rdp = rdp;
 233                         old_rdp = rdp;
 234                         return 0;
 235                 }
 236                 rdp += RDP_STEP;
 237         }
 238         return -1;
 239 }
 240 
 241 
 242 static inline void isapnp_set_rdp(void)
 243 {
 244         isapnp_write_byte(0x00, isapnp_rdp >> 2);
 245         udelay(100);
 246 }
 247 
 248 
 249 
 250 
 251 
 252 static int __init isapnp_isolate_rdp_select(void)
 253 {
 254         isapnp_wait();
 255         isapnp_key();
 256 
 257         
 258         isapnp_write_byte(0x02, isapnp_reset ? 0x05 : 0x04);
 259         mdelay(2);
 260 
 261         isapnp_wait();
 262         isapnp_key();
 263         isapnp_wake(0x00);
 264 
 265         if (isapnp_next_rdp() < 0) {
 266                 isapnp_wait();
 267                 return -1;
 268         }
 269 
 270         isapnp_set_rdp();
 271         udelay(1000);
 272         write_address(0x01);
 273         udelay(1000);
 274         return 0;
 275 }
 276 
 277 
 278 
 279 
 280 static int __init isapnp_isolate(void)
 281 {
 282         unsigned char checksum = 0x6a;
 283         unsigned char chksum = 0x00;
 284         unsigned char bit = 0x00;
 285         int data;
 286         int csn = 0;
 287         int i;
 288         int iteration = 1;
 289 
 290         isapnp_rdp = 0x213;
 291         if (isapnp_isolate_rdp_select() < 0)
 292                 return -1;
 293 
 294         while (1) {
 295                 for (i = 1; i <= 64; i++) {
 296                         data = read_data() << 8;
 297                         udelay(250);
 298                         data = data | read_data();
 299                         udelay(250);
 300                         if (data == 0x55aa)
 301                                 bit = 0x01;
 302                         checksum =
 303                             ((((checksum ^ (checksum >> 1)) & 0x01) ^ bit) << 7)
 304                             | (checksum >> 1);
 305                         bit = 0x00;
 306                 }
 307                 for (i = 65; i <= 72; i++) {
 308                         data = read_data() << 8;
 309                         udelay(250);
 310                         data = data | read_data();
 311                         udelay(250);
 312                         if (data == 0x55aa)
 313                                 chksum |= (1 << (i - 65));
 314                 }
 315                 if (checksum != 0x00 && checksum == chksum) {
 316                         csn++;
 317 
 318                         isapnp_write_byte(0x06, csn);
 319                         udelay(250);
 320                         iteration++;
 321                         isapnp_wake(0x00);
 322                         isapnp_set_rdp();
 323                         udelay(1000);
 324                         write_address(0x01);
 325                         udelay(1000);
 326                         goto __next;
 327                 }
 328                 if (iteration == 1) {
 329                         isapnp_rdp += RDP_STEP;
 330                         if (isapnp_isolate_rdp_select() < 0)
 331                                 return -1;
 332                 } else if (iteration > 1) {
 333                         break;
 334                 }
 335 __next:
 336                 if (csn == 255)
 337                         break;
 338                 checksum = 0x6a;
 339                 chksum = 0x00;
 340                 bit = 0x00;
 341         }
 342         isapnp_wait();
 343         isapnp_csn_count = csn;
 344         return csn;
 345 }
 346 
 347 
 348 
 349 
 350 static int __init isapnp_read_tag(unsigned char *type, unsigned short *size)
 351 {
 352         unsigned char tag, tmp[2];
 353 
 354         isapnp_peek(&tag, 1);
 355         if (tag == 0)           
 356                 return -1;
 357         if (tag & 0x80) {       
 358                 *type = tag;
 359                 isapnp_peek(tmp, 2);
 360                 *size = (tmp[1] << 8) | tmp[0];
 361         } else {
 362                 *type = (tag >> 3) & 0x0f;
 363                 *size = tag & 0x07;
 364         }
 365         if (*type == 0xff && *size == 0xffff)   
 366                 return -1;
 367         return 0;
 368 }
 369 
 370 
 371 
 372 
 373 static void __init isapnp_skip_bytes(int count)
 374 {
 375         isapnp_peek(NULL, count);
 376 }
 377 
 378 
 379 
 380 
 381 static struct pnp_dev *__init isapnp_parse_device(struct pnp_card *card,
 382                                                   int size, int number)
 383 {
 384         unsigned char tmp[6];
 385         struct pnp_dev *dev;
 386         u32 eisa_id;
 387         char id[8];
 388 
 389         isapnp_peek(tmp, size);
 390         eisa_id = tmp[0] | tmp[1] << 8 | tmp[2] << 16 | tmp[3] << 24;
 391         pnp_eisa_id_to_string(eisa_id, id);
 392 
 393         dev = pnp_alloc_dev(&isapnp_protocol, number, id);
 394         if (!dev)
 395                 return NULL;
 396 
 397         dev->card = card;
 398         dev->capabilities |= PNP_CONFIGURABLE;
 399         dev->capabilities |= PNP_READ;
 400         dev->capabilities |= PNP_WRITE;
 401         dev->capabilities |= PNP_DISABLE;
 402         pnp_init_resources(dev);
 403         return dev;
 404 }
 405 
 406 
 407 
 408 
 409 static void __init isapnp_parse_irq_resource(struct pnp_dev *dev,
 410                                              unsigned int option_flags,
 411                                              int size)
 412 {
 413         unsigned char tmp[3];
 414         unsigned long bits;
 415         pnp_irq_mask_t map;
 416         unsigned char flags = IORESOURCE_IRQ_HIGHEDGE;
 417 
 418         isapnp_peek(tmp, size);
 419         bits = (tmp[1] << 8) | tmp[0];
 420 
 421         bitmap_zero(map.bits, PNP_IRQ_NR);
 422         bitmap_copy(map.bits, &bits, 16);
 423 
 424         if (size > 2)
 425                 flags = tmp[2];
 426 
 427         pnp_register_irq_resource(dev, option_flags, &map, flags);
 428 }
 429 
 430 
 431 
 432 
 433 static void __init isapnp_parse_dma_resource(struct pnp_dev *dev,
 434                                              unsigned int option_flags,
 435                                              int size)
 436 {
 437         unsigned char tmp[2];
 438 
 439         isapnp_peek(tmp, size);
 440         pnp_register_dma_resource(dev, option_flags, tmp[0], tmp[1]);
 441 }
 442 
 443 
 444 
 445 
 446 static void __init isapnp_parse_port_resource(struct pnp_dev *dev,
 447                                               unsigned int option_flags,
 448                                               int size)
 449 {
 450         unsigned char tmp[7];
 451         resource_size_t min, max, align, len;
 452         unsigned char flags;
 453 
 454         isapnp_peek(tmp, size);
 455         min = (tmp[2] << 8) | tmp[1];
 456         max = (tmp[4] << 8) | tmp[3];
 457         align = tmp[5];
 458         len = tmp[6];
 459         flags = tmp[0] ? IORESOURCE_IO_16BIT_ADDR : 0;
 460         pnp_register_port_resource(dev, option_flags,
 461                                    min, max, align, len, flags);
 462 }
 463 
 464 
 465 
 466 
 467 static void __init isapnp_parse_fixed_port_resource(struct pnp_dev *dev,
 468                                                     unsigned int option_flags,
 469                                                     int size)
 470 {
 471         unsigned char tmp[3];
 472         resource_size_t base, len;
 473 
 474         isapnp_peek(tmp, size);
 475         base = (tmp[1] << 8) | tmp[0];
 476         len = tmp[2];
 477         pnp_register_port_resource(dev, option_flags, base, base, 0, len,
 478                                    IORESOURCE_IO_FIXED);
 479 }
 480 
 481 
 482 
 483 
 484 static void __init isapnp_parse_mem_resource(struct pnp_dev *dev,
 485                                              unsigned int option_flags,
 486                                              int size)
 487 {
 488         unsigned char tmp[9];
 489         resource_size_t min, max, align, len;
 490         unsigned char flags;
 491 
 492         isapnp_peek(tmp, size);
 493         min = ((tmp[2] << 8) | tmp[1]) << 8;
 494         max = ((tmp[4] << 8) | tmp[3]) << 8;
 495         align = (tmp[6] << 8) | tmp[5];
 496         len = ((tmp[8] << 8) | tmp[7]) << 8;
 497         flags = tmp[0];
 498         pnp_register_mem_resource(dev, option_flags,
 499                                   min, max, align, len, flags);
 500 }
 501 
 502 
 503 
 504 
 505 static void __init isapnp_parse_mem32_resource(struct pnp_dev *dev,
 506                                                unsigned int option_flags,
 507                                                int size)
 508 {
 509         unsigned char tmp[17];
 510         resource_size_t min, max, align, len;
 511         unsigned char flags;
 512 
 513         isapnp_peek(tmp, size);
 514         min = (tmp[4] << 24) | (tmp[3] << 16) | (tmp[2] << 8) | tmp[1];
 515         max = (tmp[8] << 24) | (tmp[7] << 16) | (tmp[6] << 8) | tmp[5];
 516         align = (tmp[12] << 24) | (tmp[11] << 16) | (tmp[10] << 8) | tmp[9];
 517         len = (tmp[16] << 24) | (tmp[15] << 16) | (tmp[14] << 8) | tmp[13];
 518         flags = tmp[0];
 519         pnp_register_mem_resource(dev, option_flags,
 520                                   min, max, align, len, flags);
 521 }
 522 
 523 
 524 
 525 
 526 static void __init isapnp_parse_fixed_mem32_resource(struct pnp_dev *dev,
 527                                                      unsigned int option_flags,
 528                                                      int size)
 529 {
 530         unsigned char tmp[9];
 531         resource_size_t base, len;
 532         unsigned char flags;
 533 
 534         isapnp_peek(tmp, size);
 535         base = (tmp[4] << 24) | (tmp[3] << 16) | (tmp[2] << 8) | tmp[1];
 536         len = (tmp[8] << 24) | (tmp[7] << 16) | (tmp[6] << 8) | tmp[5];
 537         flags = tmp[0];
 538         pnp_register_mem_resource(dev, option_flags, base, base, 0, len, flags);
 539 }
 540 
 541 
 542 
 543 
 544 static void __init
 545 isapnp_parse_name(char *name, unsigned int name_max, unsigned short *size)
 546 {
 547         if (name[0] == '\0') {
 548                 unsigned short size1 =
 549                     *size >= name_max ? (name_max - 1) : *size;
 550                 isapnp_peek(name, size1);
 551                 name[size1] = '\0';
 552                 *size -= size1;
 553 
 554                 
 555                 while (size1 > 0 && name[--size1] == ' ')
 556                         name[size1] = '\0';
 557         }
 558 }
 559 
 560 
 561 
 562 
 563 static int __init isapnp_create_device(struct pnp_card *card,
 564                                        unsigned short size)
 565 {
 566         int number = 0, skip = 0, priority, compat = 0;
 567         unsigned char type, tmp[17];
 568         unsigned int option_flags;
 569         struct pnp_dev *dev;
 570         u32 eisa_id;
 571         char id[8];
 572 
 573         if ((dev = isapnp_parse_device(card, size, number++)) == NULL)
 574                 return 1;
 575         option_flags = 0;
 576         pnp_add_card_device(card, dev);
 577 
 578         while (1) {
 579                 if (isapnp_read_tag(&type, &size) < 0)
 580                         return 1;
 581                 if (skip && type != _STAG_LOGDEVID && type != _STAG_END)
 582                         goto __skip;
 583                 switch (type) {
 584                 case _STAG_LOGDEVID:
 585                         if (size >= 5 && size <= 6) {
 586                                 if ((dev =
 587                                      isapnp_parse_device(card, size,
 588                                                          number++)) == NULL)
 589                                         return 1;
 590                                 size = 0;
 591                                 skip = 0;
 592                                 option_flags = 0;
 593                                 pnp_add_card_device(card, dev);
 594                         } else {
 595                                 skip = 1;
 596                         }
 597                         compat = 0;
 598                         break;
 599                 case _STAG_COMPATDEVID:
 600                         if (size == 4 && compat < DEVICE_COUNT_COMPATIBLE) {
 601                                 isapnp_peek(tmp, 4);
 602                                 eisa_id = tmp[0] | tmp[1] << 8 |
 603                                           tmp[2] << 16 | tmp[3] << 24;
 604                                 pnp_eisa_id_to_string(eisa_id, id);
 605                                 pnp_add_id(dev, id);
 606                                 compat++;
 607                                 size = 0;
 608                         }
 609                         break;
 610                 case _STAG_IRQ:
 611                         if (size < 2 || size > 3)
 612                                 goto __skip;
 613                         isapnp_parse_irq_resource(dev, option_flags, size);
 614                         size = 0;
 615                         break;
 616                 case _STAG_DMA:
 617                         if (size != 2)
 618                                 goto __skip;
 619                         isapnp_parse_dma_resource(dev, option_flags, size);
 620                         size = 0;
 621                         break;
 622                 case _STAG_STARTDEP:
 623                         if (size > 1)
 624                                 goto __skip;
 625                         priority = PNP_RES_PRIORITY_ACCEPTABLE;
 626                         if (size > 0) {
 627                                 isapnp_peek(tmp, size);
 628                                 priority = tmp[0];
 629                                 size = 0;
 630                         }
 631                         option_flags = pnp_new_dependent_set(dev, priority);
 632                         break;
 633                 case _STAG_ENDDEP:
 634                         if (size != 0)
 635                                 goto __skip;
 636                         option_flags = 0;
 637                         break;
 638                 case _STAG_IOPORT:
 639                         if (size != 7)
 640                                 goto __skip;
 641                         isapnp_parse_port_resource(dev, option_flags, size);
 642                         size = 0;
 643                         break;
 644                 case _STAG_FIXEDIO:
 645                         if (size != 3)
 646                                 goto __skip;
 647                         isapnp_parse_fixed_port_resource(dev, option_flags,
 648                                                          size);
 649                         size = 0;
 650                         break;
 651                 case _STAG_VENDOR:
 652                         break;
 653                 case _LTAG_MEMRANGE:
 654                         if (size != 9)
 655                                 goto __skip;
 656                         isapnp_parse_mem_resource(dev, option_flags, size);
 657                         size = 0;
 658                         break;
 659                 case _LTAG_ANSISTR:
 660                         isapnp_parse_name(dev->name, sizeof(dev->name), &size);
 661                         break;
 662                 case _LTAG_UNICODESTR:
 663                         
 664                         
 665                         break;
 666                 case _LTAG_VENDOR:
 667                         break;
 668                 case _LTAG_MEM32RANGE:
 669                         if (size != 17)
 670                                 goto __skip;
 671                         isapnp_parse_mem32_resource(dev, option_flags, size);
 672                         size = 0;
 673                         break;
 674                 case _LTAG_FIXEDMEM32RANGE:
 675                         if (size != 9)
 676                                 goto __skip;
 677                         isapnp_parse_fixed_mem32_resource(dev, option_flags,
 678                                                           size);
 679                         size = 0;
 680                         break;
 681                 case _STAG_END:
 682                         if (size > 0)
 683                                 isapnp_skip_bytes(size);
 684                         return 1;
 685                 default:
 686                         dev_err(&dev->dev, "unknown tag %#x (card %i), "
 687                                 "ignored\n", type, card->number);
 688                 }
 689 __skip:
 690                 if (size > 0)
 691                         isapnp_skip_bytes(size);
 692         }
 693         return 0;
 694 }
 695 
 696 
 697 
 698 
 699 static void __init isapnp_parse_resource_map(struct pnp_card *card)
 700 {
 701         unsigned char type, tmp[17];
 702         unsigned short size;
 703 
 704         while (1) {
 705                 if (isapnp_read_tag(&type, &size) < 0)
 706                         return;
 707                 switch (type) {
 708                 case _STAG_PNPVERNO:
 709                         if (size != 2)
 710                                 goto __skip;
 711                         isapnp_peek(tmp, 2);
 712                         card->pnpver = tmp[0];
 713                         card->productver = tmp[1];
 714                         size = 0;
 715                         break;
 716                 case _STAG_LOGDEVID:
 717                         if (size >= 5 && size <= 6) {
 718                                 if (isapnp_create_device(card, size) == 1)
 719                                         return;
 720                                 size = 0;
 721                         }
 722                         break;
 723                 case _STAG_VENDOR:
 724                         break;
 725                 case _LTAG_ANSISTR:
 726                         isapnp_parse_name(card->name, sizeof(card->name),
 727                                           &size);
 728                         break;
 729                 case _LTAG_UNICODESTR:
 730                         
 731                         
 732                         break;
 733                 case _LTAG_VENDOR:
 734                         break;
 735                 case _STAG_END:
 736                         if (size > 0)
 737                                 isapnp_skip_bytes(size);
 738                         return;
 739                 default:
 740                         dev_err(&card->dev, "unknown tag %#x, ignored\n",
 741                                type);
 742                 }
 743 __skip:
 744                 if (size > 0)
 745                         isapnp_skip_bytes(size);
 746         }
 747 }
 748 
 749 
 750 
 751 
 752 static unsigned char __init isapnp_checksum(unsigned char *data)
 753 {
 754         int i, j;
 755         unsigned char checksum = 0x6a, bit, b;
 756 
 757         for (i = 0; i < 8; i++) {
 758                 b = data[i];
 759                 for (j = 0; j < 8; j++) {
 760                         bit = 0;
 761                         if (b & (1 << j))
 762                                 bit = 1;
 763                         checksum =
 764                             ((((checksum ^ (checksum >> 1)) & 0x01) ^ bit) << 7)
 765                             | (checksum >> 1);
 766                 }
 767         }
 768         return checksum;
 769 }
 770 
 771 
 772 
 773 
 774 static int __init isapnp_build_device_list(void)
 775 {
 776         int csn;
 777         unsigned char header[9], checksum;
 778         struct pnp_card *card;
 779         u32 eisa_id;
 780         char id[8];
 781 
 782         isapnp_wait();
 783         isapnp_key();
 784         for (csn = 1; csn <= isapnp_csn_count; csn++) {
 785                 isapnp_wake(csn);
 786                 isapnp_peek(header, 9);
 787                 checksum = isapnp_checksum(header);
 788                 eisa_id = header[0] | header[1] << 8 |
 789                           header[2] << 16 | header[3] << 24;
 790                 pnp_eisa_id_to_string(eisa_id, id);
 791                 card = pnp_alloc_card(&isapnp_protocol, csn, id);
 792                 if (!card)
 793                         continue;
 794 
 795                 INIT_LIST_HEAD(&card->devices);
 796                 card->serial =
 797                     (header[7] << 24) | (header[6] << 16) | (header[5] << 8) |
 798                     header[4];
 799                 isapnp_checksum_value = 0x00;
 800                 isapnp_parse_resource_map(card);
 801                 if (isapnp_checksum_value != 0x00)
 802                         dev_err(&card->dev, "invalid checksum %#x\n",
 803                                 isapnp_checksum_value);
 804                 card->checksum = isapnp_checksum_value;
 805 
 806                 pnp_add_card(card);
 807         }
 808         isapnp_wait();
 809         return 0;
 810 }
 811 
 812 
 813 
 814 
 815 
 816 int isapnp_present(void)
 817 {
 818         struct pnp_card *card;
 819 
 820         pnp_for_each_card(card) {
 821                 if (card->protocol == &isapnp_protocol)
 822                         return 1;
 823         }
 824         return 0;
 825 }
 826 
 827 int isapnp_cfg_begin(int csn, int logdev)
 828 {
 829         if (csn < 1 || csn > isapnp_csn_count || logdev > 10)
 830                 return -EINVAL;
 831         mutex_lock(&isapnp_cfg_mutex);
 832         isapnp_wait();
 833         isapnp_key();
 834         isapnp_wake(csn);
 835 #if 0
 836         
 837         
 838         
 839         
 840         isapnp_write_byte(0x02, 0x04);  
 841         mdelay(2);              
 842         isapnp_wake(csn);       
 843         isapnp_wake(0);         
 844         isapnp_set_rdp();       
 845         udelay(1000);           
 846         isapnp_write_byte(0x06, csn);   
 847         udelay(250);            
 848 #endif
 849         if (logdev >= 0)
 850                 isapnp_device(logdev);
 851         return 0;
 852 }
 853 
 854 int isapnp_cfg_end(void)
 855 {
 856         isapnp_wait();
 857         mutex_unlock(&isapnp_cfg_mutex);
 858         return 0;
 859 }
 860 
 861 
 862 
 863 
 864 
 865 EXPORT_SYMBOL(isapnp_protocol);
 866 EXPORT_SYMBOL(isapnp_present);
 867 EXPORT_SYMBOL(isapnp_cfg_begin);
 868 EXPORT_SYMBOL(isapnp_cfg_end);
 869 EXPORT_SYMBOL(isapnp_write_byte);
 870 
 871 static int isapnp_get_resources(struct pnp_dev *dev)
 872 {
 873         int i, ret;
 874 
 875         pnp_dbg(&dev->dev, "get resources\n");
 876         pnp_init_resources(dev);
 877         isapnp_cfg_begin(dev->card->number, dev->number);
 878         dev->active = isapnp_read_byte(ISAPNP_CFG_ACTIVATE);
 879         if (!dev->active)
 880                 goto __end;
 881 
 882         for (i = 0; i < ISAPNP_MAX_PORT; i++) {
 883                 ret = isapnp_read_word(ISAPNP_CFG_PORT + (i << 1));
 884                 pnp_add_io_resource(dev, ret, ret,
 885                                     ret == 0 ? IORESOURCE_DISABLED : 0);
 886         }
 887         for (i = 0; i < ISAPNP_MAX_MEM; i++) {
 888                 ret = isapnp_read_word(ISAPNP_CFG_MEM + (i << 3)) << 8;
 889                 pnp_add_mem_resource(dev, ret, ret,
 890                                      ret == 0 ? IORESOURCE_DISABLED : 0);
 891         }
 892         for (i = 0; i < ISAPNP_MAX_IRQ; i++) {
 893                 ret = isapnp_read_word(ISAPNP_CFG_IRQ + (i << 1)) >> 8;
 894                 pnp_add_irq_resource(dev, ret,
 895                                      ret == 0 ? IORESOURCE_DISABLED : 0);
 896         }
 897         for (i = 0; i < ISAPNP_MAX_DMA; i++) {
 898                 ret = isapnp_read_byte(ISAPNP_CFG_DMA + i);
 899                 pnp_add_dma_resource(dev, ret,
 900                                      ret == 4 ? IORESOURCE_DISABLED : 0);
 901         }
 902 
 903 __end:
 904         isapnp_cfg_end();
 905         return 0;
 906 }
 907 
 908 static int isapnp_set_resources(struct pnp_dev *dev)
 909 {
 910         struct resource *res;
 911         int tmp;
 912 
 913         pnp_dbg(&dev->dev, "set resources\n");
 914         isapnp_cfg_begin(dev->card->number, dev->number);
 915         dev->active = 1;
 916         for (tmp = 0; tmp < ISAPNP_MAX_PORT; tmp++) {
 917                 res = pnp_get_resource(dev, IORESOURCE_IO, tmp);
 918                 if (pnp_resource_enabled(res)) {
 919                         pnp_dbg(&dev->dev, "  set io  %d to %#llx\n",
 920                                 tmp, (unsigned long long) res->start);
 921                         isapnp_write_word(ISAPNP_CFG_PORT + (tmp << 1),
 922                                           res->start);
 923                 }
 924         }
 925         for (tmp = 0; tmp < ISAPNP_MAX_IRQ; tmp++) {
 926                 res = pnp_get_resource(dev, IORESOURCE_IRQ, tmp);
 927                 if (pnp_resource_enabled(res)) {
 928                         int irq = res->start;
 929                         if (irq == 2)
 930                                 irq = 9;
 931                         pnp_dbg(&dev->dev, "  set irq %d to %d\n", tmp, irq);
 932                         isapnp_write_byte(ISAPNP_CFG_IRQ + (tmp << 1), irq);
 933                 }
 934         }
 935         for (tmp = 0; tmp < ISAPNP_MAX_DMA; tmp++) {
 936                 res = pnp_get_resource(dev, IORESOURCE_DMA, tmp);
 937                 if (pnp_resource_enabled(res)) {
 938                         pnp_dbg(&dev->dev, "  set dma %d to %lld\n",
 939                                 tmp, (unsigned long long) res->start);
 940                         isapnp_write_byte(ISAPNP_CFG_DMA + tmp, res->start);
 941                 }
 942         }
 943         for (tmp = 0; tmp < ISAPNP_MAX_MEM; tmp++) {
 944                 res = pnp_get_resource(dev, IORESOURCE_MEM, tmp);
 945                 if (pnp_resource_enabled(res)) {
 946                         pnp_dbg(&dev->dev, "  set mem %d to %#llx\n",
 947                                 tmp, (unsigned long long) res->start);
 948                         isapnp_write_word(ISAPNP_CFG_MEM + (tmp << 3),
 949                                           (res->start >> 8) & 0xffff);
 950                 }
 951         }
 952         
 953         isapnp_activate(dev->number);
 954         isapnp_cfg_end();
 955         return 0;
 956 }
 957 
 958 static int isapnp_disable_resources(struct pnp_dev *dev)
 959 {
 960         if (!dev->active)
 961                 return -EINVAL;
 962         isapnp_cfg_begin(dev->card->number, dev->number);
 963         isapnp_deactivate(dev->number);
 964         dev->active = 0;
 965         isapnp_cfg_end();
 966         return 0;
 967 }
 968 
 969 struct pnp_protocol isapnp_protocol = {
 970         .name = "ISA Plug and Play",
 971         .get = isapnp_get_resources,
 972         .set = isapnp_set_resources,
 973         .disable = isapnp_disable_resources,
 974 };
 975 
 976 static int __init isapnp_init(void)
 977 {
 978         int cards;
 979         struct pnp_card *card;
 980         struct pnp_dev *dev;
 981 
 982         if (isapnp_disable) {
 983                 printk(KERN_INFO "isapnp: ISA Plug & Play support disabled\n");
 984                 return 0;
 985         }
 986 #ifdef CONFIG_PPC
 987         if (check_legacy_ioport(_PIDXR) || check_legacy_ioport(_PNPWRP))
 988                 return -EINVAL;
 989 #endif
 990 #ifdef ISAPNP_REGION_OK
 991         if (!request_region(_PIDXR, 1, "isapnp index")) {
 992                 printk(KERN_ERR "isapnp: Index Register 0x%x already used\n",
 993                        _PIDXR);
 994                 return -EBUSY;
 995         }
 996 #endif
 997         if (!request_region(_PNPWRP, 1, "isapnp write")) {
 998                 printk(KERN_ERR
 999                        "isapnp: Write Data Register 0x%x already used\n",
1000                        _PNPWRP);
1001 #ifdef ISAPNP_REGION_OK
1002                 release_region(_PIDXR, 1);
1003 #endif
1004                 return -EBUSY;
1005         }
1006 
1007         if (pnp_register_protocol(&isapnp_protocol) < 0)
1008                 return -EBUSY;
1009 
1010         
1011 
1012 
1013 
1014 
1015         printk(KERN_INFO "isapnp: Scanning for PnP cards...\n");
1016         if (isapnp_rdp >= 0x203 && isapnp_rdp <= 0x3ff) {
1017                 isapnp_rdp |= 3;
1018                 if (!request_region(isapnp_rdp, 1, "isapnp read")) {
1019                         printk(KERN_ERR
1020                                "isapnp: Read Data Register 0x%x already used\n",
1021                                isapnp_rdp);
1022 #ifdef ISAPNP_REGION_OK
1023                         release_region(_PIDXR, 1);
1024 #endif
1025                         release_region(_PNPWRP, 1);
1026                         return -EBUSY;
1027                 }
1028                 isapnp_set_rdp();
1029         }
1030         if (isapnp_rdp < 0x203 || isapnp_rdp > 0x3ff) {
1031                 cards = isapnp_isolate();
1032                 if (cards < 0 || (isapnp_rdp < 0x203 || isapnp_rdp > 0x3ff)) {
1033 #ifdef ISAPNP_REGION_OK
1034                         release_region(_PIDXR, 1);
1035 #endif
1036                         release_region(_PNPWRP, 1);
1037                         printk(KERN_INFO
1038                                "isapnp: No Plug & Play device found\n");
1039                         return 0;
1040                 }
1041                 request_region(isapnp_rdp, 1, "isapnp read");
1042         }
1043         isapnp_build_device_list();
1044         cards = 0;
1045 
1046         protocol_for_each_card(&isapnp_protocol, card) {
1047                 cards++;
1048                 if (isapnp_verbose) {
1049                         dev_info(&card->dev, "card '%s'\n",
1050                                card->name[0] ? card->name : "unknown");
1051                         if (isapnp_verbose < 2)
1052                                 continue;
1053                         card_for_each_dev(card, dev) {
1054                                 dev_info(&card->dev, "device '%s'\n",
1055                                        dev->name[0] ? dev->name : "unknown");
1056                         }
1057                 }
1058         }
1059         if (cards)
1060                 printk(KERN_INFO
1061                        "isapnp: %i Plug & Play card%s detected total\n", cards,
1062                        cards > 1 ? "s" : "");
1063         else
1064                 printk(KERN_INFO "isapnp: No Plug & Play card found\n");
1065 
1066         isapnp_proc_init();
1067         return 0;
1068 }
1069 
1070 device_initcall(isapnp_init);
1071 
1072 
1073 
1074 static int __init isapnp_setup_disable(char *str)
1075 {
1076         isapnp_disable = 1;
1077         return 1;
1078 }
1079 
1080 __setup("noisapnp", isapnp_setup_disable);
1081 
1082 
1083 
1084 static int __init isapnp_setup_isapnp(char *str)
1085 {
1086         (void)((get_option(&str, &isapnp_rdp) == 2) &&
1087                (get_option(&str, &isapnp_reset) == 2) &&
1088                (get_option(&str, &isapnp_verbose) == 2));
1089         return 1;
1090 }
1091 
1092 __setup("isapnp=", isapnp_setup_isapnp);