0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 #include <linux/module.h>
0036 #include <linux/moduleparam.h>
0037 #include <linux/kernel.h>
0038 #include <linux/ptrace.h>
0039 #include <linux/slab.h>
0040 #include <linux/string.h>
0041 #include <linux/timer.h>
0042 #include <linux/serial_core.h>
0043 #include <linux/delay.h>
0044 #include <linux/major.h>
0045 #include <asm/io.h>
0046
0047 #include <pcmcia/cistpl.h>
0048 #include <pcmcia/ciscode.h>
0049 #include <pcmcia/ds.h>
0050 #include <pcmcia/cisreg.h>
0051
0052 #include "8250.h"
0053
0054
0055
0056
0057
0058
0059
0060 static int do_sound = 1;
0061
0062 static int buggy_uart;
0063
0064 module_param(do_sound, int, 0444);
0065 module_param(buggy_uart, int, 0444);
0066
0067
0068
0069
0070
0071 struct serial_quirk {
0072 unsigned int manfid;
0073 unsigned int prodid;
0074 int multi;
0075 void (*config)(struct pcmcia_device *);
0076 void (*setup)(struct pcmcia_device *, struct uart_8250_port *);
0077 void (*wakeup)(struct pcmcia_device *);
0078 int (*post)(struct pcmcia_device *);
0079 };
0080
0081 struct serial_info {
0082 struct pcmcia_device *p_dev;
0083 int ndev;
0084 int multi;
0085 int slave;
0086 int manfid;
0087 int prodid;
0088 int c950ctrl;
0089 int line[4];
0090 const struct serial_quirk *quirk;
0091 };
0092
0093 struct serial_cfg_mem {
0094 tuple_t tuple;
0095 cisparse_t parse;
0096 u_char buf[256];
0097 };
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108 static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_8250_port *uart)
0109 {
0110 uart->port.uartclk = 14745600;
0111 }
0112
0113 static int quirk_post_ibm(struct pcmcia_device *link)
0114 {
0115 u8 val;
0116 int ret;
0117
0118 ret = pcmcia_read_config_byte(link, 0x800, &val);
0119 if (ret)
0120 goto failed;
0121
0122 ret = pcmcia_write_config_byte(link, 0x800, val | 1);
0123 if (ret)
0124 goto failed;
0125 return 0;
0126
0127 failed:
0128 return -ENODEV;
0129 }
0130
0131
0132
0133
0134
0135 static void quirk_config_nokia(struct pcmcia_device *link)
0136 {
0137 struct serial_info *info = link->priv;
0138
0139 if (info->multi > 1)
0140 info->multi = 1;
0141 }
0142
0143 static void quirk_wakeup_oxsemi(struct pcmcia_device *link)
0144 {
0145 struct serial_info *info = link->priv;
0146
0147 if (info->c950ctrl)
0148 outb(12, info->c950ctrl + 1);
0149 }
0150
0151
0152
0153
0154
0155
0156
0157 static void quirk_wakeup_possio_gcc(struct pcmcia_device *link)
0158 {
0159 struct serial_info *info = link->priv;
0160 unsigned int ctrl = info->c950ctrl;
0161
0162 outb(0xA, ctrl + 1);
0163 msleep(100);
0164 outb(0xE, ctrl + 1);
0165 msleep(300);
0166 outb(0xC, ctrl + 1);
0167 msleep(100);
0168 outb(0xE, ctrl + 1);
0169 msleep(200);
0170 outb(0xF, ctrl + 1);
0171 msleep(100);
0172 outb(0xE, ctrl + 1);
0173 msleep(100);
0174 outb(0xC, ctrl + 1);
0175 }
0176
0177
0178
0179
0180 static void quirk_config_socket(struct pcmcia_device *link)
0181 {
0182 struct serial_info *info = link->priv;
0183
0184 if (info->multi)
0185 link->config_flags |= CONF_ENABLE_ESR;
0186 }
0187
0188 static const struct serial_quirk quirks[] = {
0189 {
0190 .manfid = 0x0160,
0191 .prodid = 0x0104,
0192 .multi = -1,
0193 .setup = quirk_setup_brainboxes_0104,
0194 }, {
0195 .manfid = 0x015D,
0196 .prodid = 0x4C45,
0197 .multi = -1,
0198 .setup = quirk_setup_brainboxes_0104,
0199 }, {
0200 .manfid = MANFID_IBM,
0201 .prodid = ~0,
0202 .multi = -1,
0203 .post = quirk_post_ibm,
0204 }, {
0205 .manfid = MANFID_INTEL,
0206 .prodid = PRODID_INTEL_DUAL_RS232,
0207 .multi = 2,
0208 }, {
0209 .manfid = MANFID_NATINST,
0210 .prodid = PRODID_NATINST_QUAD_RS232,
0211 .multi = 4,
0212 }, {
0213 .manfid = MANFID_NOKIA,
0214 .prodid = ~0,
0215 .multi = -1,
0216 .config = quirk_config_nokia,
0217 }, {
0218 .manfid = MANFID_OMEGA,
0219 .prodid = PRODID_OMEGA_QSP_100,
0220 .multi = 4,
0221 }, {
0222 .manfid = MANFID_OXSEMI,
0223 .prodid = ~0,
0224 .multi = -1,
0225 .wakeup = quirk_wakeup_oxsemi,
0226 }, {
0227 .manfid = MANFID_POSSIO,
0228 .prodid = PRODID_POSSIO_GCC,
0229 .multi = -1,
0230 .wakeup = quirk_wakeup_possio_gcc,
0231 }, {
0232 .manfid = MANFID_QUATECH,
0233 .prodid = PRODID_QUATECH_DUAL_RS232,
0234 .multi = 2,
0235 }, {
0236 .manfid = MANFID_QUATECH,
0237 .prodid = PRODID_QUATECH_DUAL_RS232_D1,
0238 .multi = 2,
0239 }, {
0240 .manfid = MANFID_QUATECH,
0241 .prodid = PRODID_QUATECH_DUAL_RS232_G,
0242 .multi = 2,
0243 }, {
0244 .manfid = MANFID_QUATECH,
0245 .prodid = PRODID_QUATECH_QUAD_RS232,
0246 .multi = 4,
0247 }, {
0248 .manfid = MANFID_SOCKET,
0249 .prodid = PRODID_SOCKET_DUAL_RS232,
0250 .multi = 2,
0251 .config = quirk_config_socket,
0252 }, {
0253 .manfid = MANFID_SOCKET,
0254 .prodid = ~0,
0255 .multi = -1,
0256 .config = quirk_config_socket,
0257 }
0258 };
0259
0260
0261 static int serial_config(struct pcmcia_device *link);
0262
0263
0264 static void serial_remove(struct pcmcia_device *link)
0265 {
0266 struct serial_info *info = link->priv;
0267 int i;
0268
0269 dev_dbg(&link->dev, "serial_release\n");
0270
0271
0272
0273
0274 for (i = 0; i < info->ndev; i++)
0275 serial8250_unregister_port(info->line[i]);
0276
0277 if (!info->slave)
0278 pcmcia_disable_device(link);
0279 }
0280
0281 static int serial_suspend(struct pcmcia_device *link)
0282 {
0283 struct serial_info *info = link->priv;
0284 int i;
0285
0286 for (i = 0; i < info->ndev; i++)
0287 serial8250_suspend_port(info->line[i]);
0288
0289 return 0;
0290 }
0291
0292 static int serial_resume(struct pcmcia_device *link)
0293 {
0294 struct serial_info *info = link->priv;
0295 int i;
0296
0297 for (i = 0; i < info->ndev; i++)
0298 serial8250_resume_port(info->line[i]);
0299
0300 if (info->quirk && info->quirk->wakeup)
0301 info->quirk->wakeup(link);
0302
0303 return 0;
0304 }
0305
0306 static int serial_probe(struct pcmcia_device *link)
0307 {
0308 struct serial_info *info;
0309 int ret;
0310
0311 dev_dbg(&link->dev, "serial_attach()\n");
0312
0313
0314 info = kzalloc(sizeof(*info), GFP_KERNEL);
0315 if (!info)
0316 return -ENOMEM;
0317 info->p_dev = link;
0318 link->priv = info;
0319
0320 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
0321 if (do_sound)
0322 link->config_flags |= CONF_ENABLE_SPKR;
0323
0324 ret = serial_config(link);
0325 if (ret)
0326 goto free_info;
0327
0328 return 0;
0329
0330 free_info:
0331 kfree(info);
0332 return ret;
0333 }
0334
0335 static void serial_detach(struct pcmcia_device *link)
0336 {
0337 struct serial_info *info = link->priv;
0338
0339 dev_dbg(&link->dev, "serial_detach\n");
0340
0341
0342
0343
0344 serial_remove(link);
0345
0346
0347 kfree(info);
0348 }
0349
0350
0351
0352 static int setup_serial(struct pcmcia_device *handle, struct serial_info *info,
0353 unsigned int iobase, int irq)
0354 {
0355 struct uart_8250_port uart;
0356 int line;
0357
0358 memset(&uart, 0, sizeof(uart));
0359 uart.port.iobase = iobase;
0360 uart.port.irq = irq;
0361 uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
0362 uart.port.uartclk = 1843200;
0363 uart.port.dev = &handle->dev;
0364 if (buggy_uart)
0365 uart.port.flags |= UPF_BUGGY_UART;
0366
0367 if (info->quirk && info->quirk->setup)
0368 info->quirk->setup(handle, &uart);
0369
0370 line = serial8250_register_8250_port(&uart);
0371 if (line < 0) {
0372 pr_err("serial_cs: serial8250_register_8250_port() at 0x%04lx, irq %d failed\n",
0373 (unsigned long)iobase, irq);
0374 return -EINVAL;
0375 }
0376
0377 info->line[info->ndev] = line;
0378 info->ndev++;
0379
0380 return 0;
0381 }
0382
0383
0384
0385 static int pfc_config(struct pcmcia_device *p_dev)
0386 {
0387 unsigned int port = 0;
0388 struct serial_info *info = p_dev->priv;
0389
0390 if ((p_dev->resource[1]->end != 0) &&
0391 (resource_size(p_dev->resource[1]) == 8)) {
0392 port = p_dev->resource[1]->start;
0393 info->slave = 1;
0394 } else if ((info->manfid == MANFID_OSITECH) &&
0395 (resource_size(p_dev->resource[0]) == 0x40)) {
0396 port = p_dev->resource[0]->start + 0x28;
0397 info->slave = 1;
0398 }
0399 if (info->slave)
0400 return setup_serial(p_dev, info, port, p_dev->irq);
0401
0402 dev_warn(&p_dev->dev, "no usable port range found, giving up\n");
0403 return -ENODEV;
0404 }
0405
0406 static int simple_config_check(struct pcmcia_device *p_dev, void *priv_data)
0407 {
0408 static const int size_table[2] = { 8, 16 };
0409 int *try = priv_data;
0410
0411 if (p_dev->resource[0]->start == 0)
0412 return -ENODEV;
0413
0414 if ((*try & 0x1) == 0)
0415 p_dev->io_lines = 16;
0416
0417 if (p_dev->resource[0]->end != size_table[(*try >> 1)])
0418 return -ENODEV;
0419
0420 p_dev->resource[0]->end = 8;
0421 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
0422 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
0423
0424 return pcmcia_request_io(p_dev);
0425 }
0426
0427 static int simple_config_check_notpicky(struct pcmcia_device *p_dev,
0428 void *priv_data)
0429 {
0430 static const unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
0431 int j;
0432
0433 if (p_dev->io_lines > 3)
0434 return -ENODEV;
0435
0436 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
0437 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
0438 p_dev->resource[0]->end = 8;
0439
0440 for (j = 0; j < 5; j++) {
0441 p_dev->resource[0]->start = base[j];
0442 p_dev->io_lines = base[j] ? 16 : 3;
0443 if (!pcmcia_request_io(p_dev))
0444 return 0;
0445 }
0446 return -ENODEV;
0447 }
0448
0449 static int simple_config(struct pcmcia_device *link)
0450 {
0451 struct serial_info *info = link->priv;
0452 int ret, try;
0453
0454
0455
0456
0457
0458 link->config_flags |= CONF_AUTO_SET_VPP;
0459 for (try = 0; try < 4; try++)
0460 if (!pcmcia_loop_config(link, simple_config_check, &try))
0461 goto found_port;
0462
0463
0464
0465
0466
0467
0468 ret = pcmcia_loop_config(link, simple_config_check_notpicky, NULL);
0469 if (ret) {
0470 dev_warn(&link->dev, "no usable port range found, giving up\n");
0471 return ret;
0472 }
0473
0474 found_port:
0475 if (info->multi && (info->manfid == MANFID_3COM))
0476 link->config_index &= ~(0x08);
0477
0478
0479
0480
0481 if (info->quirk && info->quirk->config)
0482 info->quirk->config(link);
0483
0484 ret = pcmcia_enable_device(link);
0485 if (ret != 0)
0486 return ret;
0487 return setup_serial(link, info, link->resource[0]->start, link->irq);
0488 }
0489
0490 static int multi_config_check(struct pcmcia_device *p_dev, void *priv_data)
0491 {
0492 int *multi = priv_data;
0493
0494 if (p_dev->resource[1]->end)
0495 return -EINVAL;
0496
0497
0498
0499
0500
0501 if (p_dev->resource[0]->end <= 8)
0502 return -EINVAL;
0503
0504 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
0505 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
0506 p_dev->resource[0]->end = *multi * 8;
0507
0508 if (pcmcia_request_io(p_dev))
0509 return -ENODEV;
0510 return 0;
0511 }
0512
0513 static int multi_config_check_notpicky(struct pcmcia_device *p_dev,
0514 void *priv_data)
0515 {
0516 int *base2 = priv_data;
0517
0518 if (!p_dev->resource[0]->end || !p_dev->resource[1]->end ||
0519 p_dev->resource[0]->start + 8 != p_dev->resource[1]->start)
0520 return -ENODEV;
0521
0522 p_dev->resource[0]->end = p_dev->resource[1]->end = 8;
0523 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
0524 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
0525
0526 if (pcmcia_request_io(p_dev))
0527 return -ENODEV;
0528
0529 *base2 = p_dev->resource[0]->start + 8;
0530 return 0;
0531 }
0532
0533 static int multi_config(struct pcmcia_device *link)
0534 {
0535 struct serial_info *info = link->priv;
0536 int i, base2 = 0;
0537
0538
0539 if (!pcmcia_loop_config(link, multi_config_check, &info->multi))
0540 base2 = link->resource[0]->start + 8;
0541 else {
0542
0543 info->multi = 2;
0544 if (pcmcia_loop_config(link, multi_config_check_notpicky,
0545 &base2)) {
0546 dev_warn(&link->dev,
0547 "no usable port range found, giving up\n");
0548 return -ENODEV;
0549 }
0550 }
0551
0552 if (!link->irq)
0553 dev_warn(&link->dev, "no usable IRQ found, continuing...\n");
0554
0555
0556
0557
0558 if (info->quirk && info->quirk->config)
0559 info->quirk->config(link);
0560
0561 i = pcmcia_enable_device(link);
0562 if (i != 0)
0563 return -ENODEV;
0564
0565
0566
0567
0568
0569 if (info->manfid == MANFID_OXSEMI || (info->manfid == MANFID_POSSIO &&
0570 info->prodid == PRODID_POSSIO_GCC)) {
0571 if (link->config_index == 1 ||
0572 link->config_index == 3) {
0573 setup_serial(link, info, base2, link->irq);
0574 base2 = link->resource[0]->start;
0575 } else {
0576 setup_serial(link, info, link->resource[0]->start,
0577 link->irq);
0578 }
0579 info->c950ctrl = base2;
0580
0581
0582
0583
0584
0585 if (info->quirk && info->quirk->wakeup)
0586 info->quirk->wakeup(link);
0587
0588 return 0;
0589 }
0590
0591 setup_serial(link, info, link->resource[0]->start, link->irq);
0592 for (i = 0; i < info->multi - 1; i++)
0593 setup_serial(link, info, base2 + (8 * i),
0594 link->irq);
0595 return 0;
0596 }
0597
0598 static int serial_check_for_multi(struct pcmcia_device *p_dev, void *priv_data)
0599 {
0600 struct serial_info *info = p_dev->priv;
0601
0602 if (!p_dev->resource[0]->end)
0603 return -EINVAL;
0604
0605 if ((!p_dev->resource[1]->end) && (p_dev->resource[0]->end % 8 == 0))
0606 info->multi = p_dev->resource[0]->end >> 3;
0607
0608 if ((p_dev->resource[1]->end) && (p_dev->resource[0]->end == 8)
0609 && (p_dev->resource[1]->end == 8))
0610 info->multi = 2;
0611
0612 return 0;
0613 }
0614
0615
0616 static int serial_config(struct pcmcia_device *link)
0617 {
0618 struct serial_info *info = link->priv;
0619 int i;
0620
0621 dev_dbg(&link->dev, "serial_config\n");
0622
0623
0624 info->multi = (link->socket->functions > 1);
0625
0626
0627 info->manfid = link->manf_id;
0628 info->prodid = link->card_id;
0629
0630 for (i = 0; i < ARRAY_SIZE(quirks); i++)
0631 if ((quirks[i].manfid == ~0 ||
0632 quirks[i].manfid == info->manfid) &&
0633 (quirks[i].prodid == ~0 ||
0634 quirks[i].prodid == info->prodid)) {
0635 info->quirk = &quirks[i];
0636 break;
0637 }
0638
0639
0640
0641
0642
0643 if ((info->multi == 0) &&
0644 (link->has_func_id) &&
0645 (link->socket->pcmcia_pfc == 0) &&
0646 ((link->func_id == CISTPL_FUNCID_MULTI) ||
0647 (link->func_id == CISTPL_FUNCID_SERIAL))) {
0648 if (pcmcia_loop_config(link, serial_check_for_multi, info))
0649 goto failed;
0650 }
0651
0652
0653
0654
0655 if (info->quirk && info->quirk->multi != -1)
0656 info->multi = info->quirk->multi;
0657
0658 dev_info(&link->dev,
0659 "trying to set up [0x%04x:0x%04x] (pfc: %d, multi: %d, quirk: %p)\n",
0660 link->manf_id, link->card_id,
0661 link->socket->pcmcia_pfc, info->multi, info->quirk);
0662 if (link->socket->pcmcia_pfc)
0663 i = pfc_config(link);
0664 else if (info->multi > 1)
0665 i = multi_config(link);
0666 else
0667 i = simple_config(link);
0668
0669 if (i || info->ndev == 0)
0670 goto failed;
0671
0672
0673
0674
0675
0676 if (info->quirk && info->quirk->post)
0677 if (info->quirk->post(link))
0678 goto failed;
0679
0680 return 0;
0681
0682 failed:
0683 dev_warn(&link->dev, "failed to initialize\n");
0684 serial_remove(link);
0685 return -ENODEV;
0686 }
0687
0688 static const struct pcmcia_device_id serial_ids[] = {
0689 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0057, 0x0021),
0690 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0089, 0x110a),
0691 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0104, 0x000a),
0692 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0d0a),
0693 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0e0a),
0694 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0xea15),
0695 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0109, 0x0501),
0696 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0138, 0x110a),
0697 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0140, 0x000a),
0698 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0x3341),
0699 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0xc0ab),
0700 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x016c, 0x0081),
0701 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x021b, 0x0101),
0702 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x08a1, 0xc0ab),
0703 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63),
0704 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63),
0705 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef),
0706 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
0707 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea),
0708 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM33", 0x2e3ee845, 0x80609023),
0709 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a),
0710 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29),
0711 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719),
0712 PCMCIA_PFC_DEVICE_PROD_ID12(1, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4),
0713 PCMCIA_PFC_DEVICE_PROD_ID12(1, "ATKK", "LM33-PCM-T", 0xba9eb7e2, 0x077c174e),
0714 PCMCIA_PFC_DEVICE_PROD_ID12(1, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff),
0715 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
0716 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
0717 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033),
0718 PCMCIA_PFC_DEVICE_PROD_ID12(1, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58),
0719 PCMCIA_PFC_DEVICE_PROD_ID12(1, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
0720 PCMCIA_PFC_DEVICE_PROD_ID12(1, "MICRO RESEARCH", "COMBO-L/M-336", 0xb2ced065, 0x3ced0555),
0721 PCMCIA_PFC_DEVICE_PROD_ID12(1, "NEC", "PK-UG-J001", 0x18df0ba0, 0x831b1064),
0722 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
0723 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
0724 PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc),
0725 PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f),
0726 PCMCIA_PFC_DEVICE_PROD_ID12(1, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
0727 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
0728 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0e01),
0729 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05),
0730 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0b05),
0731 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101),
0732 PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070),
0733 PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562),
0734 PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0104, 0x0070),
0735 PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x016c, 0x0020),
0736 PCMCIA_MFC_DEVICE_PROD_ID123(1, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f),
0737 PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away 28.8 PC Card ", 0xb569a6e5, 0x5bd4ff2c),
0738 PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3),
0739 PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15),
0740 PCMCIA_MFC_DEVICE_PROD_ID1(1, "Motorola MARQUIS", 0xf03e4e77),
0741 PCMCIA_MFC_DEVICE_PROD_ID2(1, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302),
0742 PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0301),
0743 PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x0276),
0744 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0039),
0745 PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0006),
0746 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x0101),
0747 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x100a),
0748 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x3e0a),
0749 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x410a),
0750 PCMCIA_DEVICE_MANF_CARD(0x0107, 0x0002),
0751 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d50),
0752 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d51),
0753 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d52),
0754 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d53),
0755 PCMCIA_DEVICE_MANF_CARD(0x010b, 0xd180),
0756 PCMCIA_DEVICE_MANF_CARD(0x0115, 0x3330),
0757 PCMCIA_DEVICE_MANF_CARD(0x0124, 0x0100),
0758 PCMCIA_DEVICE_MANF_CARD(0x0134, 0x5600),
0759 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x000e),
0760 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x001b),
0761 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0025),
0762 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0045),
0763 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0052),
0764 PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0006),
0765 PCMCIA_DEVICE_MANF_CARD(0x0200, 0x0001),
0766 PCMCIA_DEVICE_PROD_ID134("ADV", "TECH", "COMpad-32/85", 0x67459937, 0x916d02ba, 0x8fbe92ae),
0767 PCMCIA_DEVICE_PROD_ID124("GATEWAY2000", "CC3144", "PCMCIA MODEM", 0x506bccae, 0xcb3685f1, 0xbd6c43ef),
0768 PCMCIA_DEVICE_PROD_ID14("MEGAHERTZ", "PCMCIA MODEM", 0xf510db04, 0xbd6c43ef),
0769 PCMCIA_DEVICE_PROD_ID124("TOSHIBA", "T144PF", "PCMCIA MODEM", 0xb4585a1a, 0x7271409c, 0xbd6c43ef),
0770 PCMCIA_DEVICE_PROD_ID123("FUJITSU", "FC14F ", "MBH10213", 0x6ee5a3d8, 0x30ead12b, 0xb00f05a0),
0771 PCMCIA_DEVICE_PROD_ID123("Novatel Wireless", "Merlin UMTS Modem", "U630", 0x32607776, 0xd9e73b13, 0xe87332e),
0772 PCMCIA_DEVICE_PROD_ID13("MEGAHERTZ", "V.34 PCMCIA MODEM", 0xf510db04, 0xbb2cce4a),
0773 PCMCIA_DEVICE_PROD_ID12("Brain Boxes", "Bluetooth PC Card", 0xee138382, 0xd4ce9b02),
0774 PCMCIA_DEVICE_PROD_ID12("CIRRUS LOGIC", "FAX MODEM", 0xe625f451, 0xcecd6dfa),
0775 PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 28800 FAX/DATA MODEM", 0xa3a3062c, 0x8cbd7c76),
0776 PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 33600 FAX/DATA MODEM", 0xa3a3062c, 0x5a00ce95),
0777 PCMCIA_DEVICE_PROD_ID12("Computerboards, Inc.", "PCM-COM422", 0xd0b78f51, 0x7e2d49ed),
0778 PCMCIA_DEVICE_PROD_ID12("Dr. Neuhaus", "FURY CARD 14K4", 0x76942813, 0x8b96ce65),
0779 PCMCIA_DEVICE_PROD_ID12("IBM", "ISDN/56K/GSM", 0xb569a6e5, 0xfee5297b),
0780 PCMCIA_DEVICE_PROD_ID12("Intelligent", "ANGIA FAX/MODEM", 0xb496e65e, 0xf31602a6),
0781 PCMCIA_DEVICE_PROD_ID12("Intel", "MODEM 2400+", 0x816cc815, 0x412729fb),
0782 PCMCIA_DEVICE_PROD_ID12("Intertex", "IX34-PCMCIA", 0xf8a097e3, 0x97880447),
0783 PCMCIA_DEVICE_PROD_ID12("IOTech Inc ", "PCMCIA Dual RS-232 Serial Port Card", 0x3bd2d898, 0x92abc92f),
0784 PCMCIA_DEVICE_PROD_ID12("MACRONIX", "FAX/MODEM", 0x668388b3, 0x3f9bdf2f),
0785 PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT1432LT", 0x5f73be51, 0x0b3e2383),
0786 PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e),
0787 PCMCIA_DEVICE_PROD_ID12("OEM ", "C288MX ", 0xb572d360, 0xd2385b7a),
0788 PCMCIA_DEVICE_PROD_ID12("Option International", "V34bis GSM/PSTN Data/Fax Modem", 0x9d7cd6f5, 0x5cb8bf41),
0789 PCMCIA_DEVICE_PROD_ID12("Option International", "GSM-Ready 56K/ISDN", 0x9d7cd6f5, 0xb23844aa),
0790 PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab),
0791 PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f),
0792 PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d),
0793 PCMCIA_DEVICE_PROD_ID12("Telia", "SurfinBird 560P/A+", 0xe2cdd5e, 0xc9314b38),
0794 PCMCIA_DEVICE_PROD_ID1("Smart Serial Port", 0x2d8ce292),
0795 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"),
0796 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"),
0797 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
0798 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
0799 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
0800 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "TOSHIBA", "Modem/LAN Card", 0xb4585a1a, 0x53f922f8, "cis/PCMLM28.cis"),
0801 PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"),
0802 PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"),
0803 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"),
0804 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"),
0805 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"),
0806 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"),
0807 PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "cis/SW_8xx_SER.cis"),
0808 PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC860", 0xd85f6206, 0x698f93db, "cis/SW_8xx_SER.cis"),
0809 PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"),
0810 PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"),
0811 PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"),
0812 PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"),
0813 PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"),
0814 PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
0815 PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"),
0816 PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
0817 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL100 1.00.", 0x19ca78af, 0xf964f42b),
0818 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL100", 0x19ca78af, 0x71d98e83),
0819 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL232 1.00.", 0x19ca78af, 0x69fb7490),
0820 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL232", 0x19ca78af, 0xb6bc0235),
0821 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.", "SERIAL CARD: CF232", 0x63f2e0bd, 0xb9e175d3),
0822 PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.", "SERIAL CARD: CF232-5", 0x63f2e0bd, 0xfce33442),
0823 PCMCIA_DEVICE_PROD_ID12("Elan", "Serial Port: CF232", 0x3beb8cf2, 0x171e7190),
0824 PCMCIA_DEVICE_PROD_ID12("Elan", "Serial Port: CF232-5", 0x3beb8cf2, 0x20da4262),
0825 PCMCIA_DEVICE_PROD_ID12("Elan", "Serial Port: CF428", 0x3beb8cf2, 0xea5dd57d),
0826 PCMCIA_DEVICE_PROD_ID12("Elan", "Serial Port: CF500", 0x3beb8cf2, 0xd77255fa),
0827 PCMCIA_DEVICE_PROD_ID12("Elan", "Serial Port: IC232", 0x3beb8cf2, 0x6a709903),
0828 PCMCIA_DEVICE_PROD_ID12("Elan", "Serial Port: SL232", 0x3beb8cf2, 0x18430676),
0829 PCMCIA_DEVICE_PROD_ID12("Elan", "Serial Port: XL232", 0x3beb8cf2, 0x6f933767),
0830 PCMCIA_MFC_DEVICE_PROD_ID12(0, "Elan", "Serial Port: CF332", 0x3beb8cf2, 0x16dc1ba7),
0831 PCMCIA_MFC_DEVICE_PROD_ID12(0, "Elan", "Serial Port: SL332", 0x3beb8cf2, 0x19816c41),
0832 PCMCIA_MFC_DEVICE_PROD_ID12(0, "Elan", "Serial Port: SL385", 0x3beb8cf2, 0x64112029),
0833 PCMCIA_MFC_DEVICE_PROD_ID12(0, "Elan", "Serial Port: SL432", 0x3beb8cf2, 0x1cce7ac4),
0834 PCMCIA_MFC_DEVICE_PROD_ID12(0, "Elan", "Serial+Parallel Port: SP230", 0x3beb8cf2, 0xdb9e58bc),
0835 PCMCIA_MFC_DEVICE_PROD_ID12(1, "Elan", "Serial Port: CF332", 0x3beb8cf2, 0x16dc1ba7),
0836 PCMCIA_MFC_DEVICE_PROD_ID12(1, "Elan", "Serial Port: SL332", 0x3beb8cf2, 0x19816c41),
0837 PCMCIA_MFC_DEVICE_PROD_ID12(1, "Elan", "Serial Port: SL385", 0x3beb8cf2, 0x64112029),
0838 PCMCIA_MFC_DEVICE_PROD_ID12(1, "Elan", "Serial Port: SL432", 0x3beb8cf2, 0x1cce7ac4),
0839 PCMCIA_MFC_DEVICE_PROD_ID12(2, "Elan", "Serial Port: SL432", 0x3beb8cf2, 0x1cce7ac4),
0840 PCMCIA_MFC_DEVICE_PROD_ID12(3, "Elan", "Serial Port: SL432", 0x3beb8cf2, 0x1cce7ac4),
0841 PCMCIA_DEVICE_MANF_CARD(0x0279, 0x950b),
0842
0843
0844
0845 PCMCIA_DEVICE_FUNC_ID(2),
0846 PCMCIA_DEVICE_NULL,
0847 };
0848 MODULE_DEVICE_TABLE(pcmcia, serial_ids);
0849
0850 MODULE_FIRMWARE("cis/PCMLM28.cis");
0851 MODULE_FIRMWARE("cis/DP83903.cis");
0852 MODULE_FIRMWARE("cis/3CCFEM556.cis");
0853 MODULE_FIRMWARE("cis/3CXEM556.cis");
0854 MODULE_FIRMWARE("cis/SW_8xx_SER.cis");
0855 MODULE_FIRMWARE("cis/SW_7xx_SER.cis");
0856 MODULE_FIRMWARE("cis/SW_555_SER.cis");
0857 MODULE_FIRMWARE("cis/MT5634ZLX.cis");
0858 MODULE_FIRMWARE("cis/COMpad2.cis");
0859 MODULE_FIRMWARE("cis/COMpad4.cis");
0860 MODULE_FIRMWARE("cis/RS-COM-2P.cis");
0861
0862 static struct pcmcia_driver serial_cs_driver = {
0863 .owner = THIS_MODULE,
0864 .name = "serial_cs",
0865 .probe = serial_probe,
0866 .remove = serial_detach,
0867 .id_table = serial_ids,
0868 .suspend = serial_suspend,
0869 .resume = serial_resume,
0870 };
0871 module_pcmcia_driver(serial_cs_driver);
0872
0873 MODULE_LICENSE("GPL");