root/drivers/pnp/isapnp/core.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. write_data
  2. write_address
  3. read_data
  4. isapnp_read_byte
  5. isapnp_read_word
  6. isapnp_write_byte
  7. isapnp_write_word
  8. isapnp_key
  9. isapnp_wait
  10. isapnp_wake
  11. isapnp_device
  12. isapnp_activate
  13. isapnp_deactivate
  14. isapnp_peek
  15. isapnp_next_rdp
  16. isapnp_set_rdp
  17. isapnp_isolate_rdp_select
  18. isapnp_isolate
  19. isapnp_read_tag
  20. isapnp_skip_bytes
  21. isapnp_parse_device
  22. isapnp_parse_irq_resource
  23. isapnp_parse_dma_resource
  24. isapnp_parse_port_resource
  25. isapnp_parse_fixed_port_resource
  26. isapnp_parse_mem_resource
  27. isapnp_parse_mem32_resource
  28. isapnp_parse_fixed_mem32_resource
  29. isapnp_parse_name
  30. isapnp_create_device
  31. isapnp_parse_resource_map
  32. isapnp_checksum
  33. isapnp_build_device_list
  34. isapnp_present
  35. isapnp_cfg_begin
  36. isapnp_cfg_end
  37. isapnp_get_resources
  38. isapnp_set_resources
  39. isapnp_disable_resources
  40. isapnp_init
  41. isapnp_setup_disable
  42. isapnp_setup_isapnp

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *  ISA Plug & Play support
   4  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   5  *
   6  *  Changelog:
   7  *  2000-01-01  Added quirks handling for buggy hardware
   8  *              Peter Denison <peterd@pnd-pc.demon.co.uk>
   9  *  2000-06-14  Added isapnp_probe_devs() and isapnp_activate_dev()
  10  *              Christoph Hellwig <hch@infradead.org>
  11  *  2001-06-03  Added release_region calls to correspond with
  12  *              request_region calls when a failure occurs.  Also
  13  *              added KERN_* constants to printk() calls.
  14  *  2001-11-07  Added isapnp_{,un}register_driver calls along the lines
  15  *              of the pci driver interface
  16  *              Kai Germaschewski <kai.germaschewski@gmx.de>
  17  *  2002-06-06  Made the use of dma channel 0 configurable
  18  *              Gerald Teschl <gerald.teschl@univie.ac.at>
  19  *  2002-10-06  Ported to PnP Layer - Adam Belay <ambx1@neo.rr.com>
  20  *  2003-08-11  Resource Management Updates - Adam Belay <ambx1@neo.rr.com>
  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;             /* Disable ISA PnP */
  39 static int isapnp_rdp;          /* Read Data Port */
  40 static int isapnp_reset = 1;    /* reset all PnP cards (deactivate) */
  41 static int isapnp_verbose = 1;  /* verbose mode */
  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 /* short tags */
  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 /* long tags */
  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 /* Logical device control and configuration registers */
  76 
  77 #define ISAPNP_CFG_ACTIVATE     0x30    /* byte */
  78 #define ISAPNP_CFG_MEM          0x40    /* 4 * dword */
  79 #define ISAPNP_CFG_PORT         0x60    /* 8 * word */
  80 #define ISAPNP_CFG_IRQ          0x70    /* 2 * word */
  81 #define ISAPNP_CFG_DMA          0x74    /* 2 * byte */
  82 
  83 /*
  84  * Sizes of ISAPNP logical device configuration register sets.
  85  * See PNP-ISA-v1.0a.pdf, Appendix A.
  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 /* some prototypes */
  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 /* place all pnp cards in wait-for-key state */
 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);     /* PRESDI */
 208                 isapnp_checksum_value += d;
 209                 if (data != NULL)
 210                         *data++ = d;
 211         }
 212 }
 213 
 214 #define RDP_STEP        32      /* minimum is 4 */
 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                  *      We cannot use NE2000 probe spaces for ISAPnP or we
 228                  *      will lock up machines.
 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 /* Set read port address */
 242 static inline void isapnp_set_rdp(void)
 243 {
 244         isapnp_write_byte(0x00, isapnp_rdp >> 2);
 245         udelay(100);
 246 }
 247 
 248 /*
 249  *      Perform an isolation. The port selection code now tries to avoid
 250  *      "dangerous to read" ports.
 251  */
 252 static int __init isapnp_isolate_rdp_select(void)
 253 {
 254         isapnp_wait();
 255         isapnp_key();
 256 
 257         /* Control: reset CSN and conditionally everything else too */
 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  *  Isolate (assign uniqued CSN) to all ISA PnP devices.
 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  *  Read one tag from stream.
 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)           /* invalid tag */
 356                 return -1;
 357         if (tag & 0x80) {       /* large item */
 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)   /* probably invalid data */
 366                 return -1;
 367         return 0;
 368 }
 369 
 370 /*
 371  *  Skip specified number of bytes from stream.
 372  */
 373 static void __init isapnp_skip_bytes(int count)
 374 {
 375         isapnp_peek(NULL, count);
 376 }
 377 
 378 /*
 379  *  Parse logical device tag.
 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  *  Add IRQ resource to resources list.
 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  *  Add DMA resource to resources list.
 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  *  Add port resource to resources list.
 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  *  Add fixed port resource to resources list.
 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  *  Add memory resource to resources list.
 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  *  Add 32-bit memory resource to resources list.
 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  *  Add 32-bit fixed memory resource to resources list.
 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  *  Parse card name for ISA PnP device.
 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                 /* clean whitespace from end of string */
 555                 while (size1 > 0 && name[--size1] == ' ')
 556                         name[size1] = '\0';
 557         }
 558 }
 559 
 560 /*
 561  *  Parse resource map for logical device.
 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                         /* silently ignore */
 664                         /* who use unicode for hardware identification? */
 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  *  Parse resource map for ISA PnP card.
 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                         /* silently ignore */
 731                         /* who use unicode for hardware identification? */
 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  *  Compute ISA PnP checksum for first eight bytes.
 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  *  Build device list for all present ISA PnP devices.
 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  *  Basic configuration routines.
 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         /* to avoid malfunction when the isapnptools package is used */
 837         /* we must set RDP to our value again */
 838         /* it is possible to set RDP only in the isolation phase */
 839         /*   Jens Thoms Toerring <Jens.Toerring@physik.fu-berlin.de> */
 840         isapnp_write_byte(0x02, 0x04);  /* clear CSN of card */
 841         mdelay(2);              /* is this necessary? */
 842         isapnp_wake(csn);       /* bring card into sleep state */
 843         isapnp_wake(0);         /* bring card into isolation state */
 844         isapnp_set_rdp();       /* reset the RDP port */
 845         udelay(1000);           /* delay 1000us */
 846         isapnp_write_byte(0x06, csn);   /* reset CSN to previous value */
 847         udelay(250);            /* is this necessary? */
 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  *  Initialization.
 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         /* FIXME: We aren't handling 32bit mems properly here */
 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          *      Print a message. The existing ISAPnP code is hanging machines
1012          *      so let the user know where.
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 /* format is: noisapnp */
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 /* format is: isapnp=rdp,reset,skip_pci_scan,verbose */
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);

/* [<][>][^][v][top][bottom][index][help] */