1 /*======================================================================
3 A driver for PCMCIA serial devices
5 serial_cs.c 1.134 2002/05/04 05:48:53
7 The contents of this file are subject to the Mozilla Public
8 License Version 1.1 (the "License"); you may not use this file
9 except in compliance with the License. You may obtain a copy of
10 the License at http://www.mozilla.org/MPL/
12 Software distributed under the License is distributed on an "AS
13 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14 implied. See the License for the specific language governing
15 rights and limitations under the License.
17 The initial developer of the original code is David A. Hinds
18 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
21 Alternatively, the contents of this file may be used under the
22 terms of the GNU General Public License version 2 (the "GPL"), in which
23 case the provisions of the GPL are applicable instead of the
24 above. If you wish to allow the use of your version of this file
25 only under the terms of the GPL and not to allow others to use
26 your version of this file under the MPL, indicate your decision
27 by deleting the provisions above and replace them with the notice
28 and other provisions required by the GPL. If you do not delete
29 the provisions above, a recipient may use your version of this
30 file under either the MPL or the GPL.
32 ======================================================================*/
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/kernel.h>
37 #include <linux/init.h>
38 #include <linux/sched.h>
39 #include <linux/ptrace.h>
40 #include <linux/slab.h>
41 #include <linux/string.h>
42 #include <linux/timer.h>
43 #include <linux/serial_core.h>
44 #include <linux/delay.h>
45 #include <linux/major.h>
47 #include <asm/system.h>
49 #include <pcmcia/cs_types.h>
50 #include <pcmcia/cs.h>
51 #include <pcmcia/cistpl.h>
52 #include <pcmcia/ciscode.h>
53 #include <pcmcia/ds.h>
54 #include <pcmcia/cisreg.h>
59 static int pc_debug = PCMCIA_DEBUG;
60 module_param(pc_debug, int, 0644);
61 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
62 static char *version = "serial_cs.c 1.134 2002/05/04 05:48:53 (David Hinds)";
64 #define DEBUG(n, args...)
67 /*====================================================================*/
69 /* Parameters that can be set with 'insmod' */
71 /* Enable the speaker? */
72 static int do_sound = 1;
73 /* Skip strict UART tests? */
74 static int buggy_uart;
76 module_param(do_sound, int, 0444);
77 module_param(buggy_uart, int, 0444);
79 /*====================================================================*/
81 /* Table of multi-port card ID's */
86 int multi; /* 1 = multifunction, > 1 = # ports */
87 int (*post)(struct pcmcia_device *);
91 struct pcmcia_device *p_dev;
100 const struct serial_quirk *quirk;
103 struct serial_cfg_mem {
109 static int quirk_post_ibm(struct pcmcia_device *link)
111 conf_reg_t reg = { 0, CS_READ, 0x800, 0 };
112 int last_ret, last_fn;
114 last_ret = pcmcia_access_configuration_register(link, ®);
116 last_fn = AccessConfigurationRegister;
119 reg.Action = CS_WRITE;
120 reg.Value = reg.Value | 1;
121 last_ret = pcmcia_access_configuration_register(link, ®);
123 last_fn = AccessConfigurationRegister;
129 cs_error(link, last_fn, last_ret);
133 static const struct serial_quirk quirks[] = {
135 .manfid = MANFID_IBM,
138 .post = quirk_post_ibm,
140 .manfid = MANFID_OMEGA,
141 .prodid = PRODID_OMEGA_QSP_100,
144 .manfid = MANFID_QUATECH,
145 .prodid = PRODID_QUATECH_DUAL_RS232,
148 .manfid = MANFID_QUATECH,
149 .prodid = PRODID_QUATECH_DUAL_RS232_D1,
152 .manfid = MANFID_QUATECH,
153 .prodid = PRODID_QUATECH_QUAD_RS232,
156 .manfid = MANFID_SOCKET,
157 .prodid = PRODID_SOCKET_DUAL_RS232,
160 .manfid = MANFID_INTEL,
161 .prodid = PRODID_INTEL_DUAL_RS232,
164 .manfid = MANFID_NATINST,
165 .prodid = PRODID_NATINST_QUAD_RS232,
171 static int serial_config(struct pcmcia_device * link);
174 static void wakeup_card(struct serial_info *info)
176 int ctrl = info->c950ctrl;
178 if (info->manfid == MANFID_OXSEMI) {
180 } else if (info->manfid == MANFID_POSSIO && info->prodid == PRODID_POSSIO_GCC) {
181 /* request_region? oxsemi branch does no request_region too... */
182 /* This sequence is needed to properly initialize MC45 attached to OXCF950.
183 * I tried decreasing these msleep()s, but it worked properly (survived
184 * 1000 stop/start operations) with these timeouts (or bigger). */
201 /*======================================================================
203 After a card is removed, serial_remove() will unregister
204 the serial device(s), and release the PCMCIA configuration.
206 ======================================================================*/
208 static void serial_remove(struct pcmcia_device *link)
210 struct serial_info *info = link->priv;
213 DEBUG(0, "serial_release(0x%p)\n", link);
216 * Recheck to see if the device is still configured.
218 for (i = 0; i < info->ndev; i++)
219 serial8250_unregister_port(info->line[i]);
221 info->p_dev->dev_node = NULL;
224 pcmcia_disable_device(link);
227 static int serial_suspend(struct pcmcia_device *link)
229 struct serial_info *info = link->priv;
232 for (i = 0; i < info->ndev; i++)
233 serial8250_suspend_port(info->line[i]);
238 static int serial_resume(struct pcmcia_device *link)
240 if (pcmcia_dev_present(link)) {
241 struct serial_info *info = link->priv;
244 for (i = 0; i < info->ndev; i++)
245 serial8250_resume_port(info->line[i]);
252 /*======================================================================
254 serial_attach() creates an "instance" of the driver, allocating
255 local data structures for one device. The device is registered
258 ======================================================================*/
260 static int serial_probe(struct pcmcia_device *link)
262 struct serial_info *info;
264 DEBUG(0, "serial_attach()\n");
266 /* Create new serial device */
267 info = kmalloc(sizeof (*info), GFP_KERNEL);
270 memset(info, 0, sizeof (*info));
274 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
275 link->io.NumPorts1 = 8;
276 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
277 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
278 link->conf.Attributes = CONF_ENABLE_IRQ;
280 link->conf.Attributes |= CONF_ENABLE_SPKR;
281 link->conf.Status = CCSR_AUDIO_ENA;
283 link->conf.IntType = INT_MEMORY_AND_IO;
285 return serial_config(link);
288 /*======================================================================
290 This deletes a driver "instance". The device is de-registered
291 with Card Services. If it has been released, all local data
292 structures are freed. Otherwise, the structures will be freed
293 when the device is released.
295 ======================================================================*/
297 static void serial_detach(struct pcmcia_device *link)
299 struct serial_info *info = link->priv;
301 DEBUG(0, "serial_detach(0x%p)\n", link);
304 * Ensure any outstanding scheduled tasks are completed.
306 flush_scheduled_work();
309 * Ensure that the ports have been released.
317 /*====================================================================*/
319 static int setup_serial(struct pcmcia_device *handle, struct serial_info * info,
320 kio_addr_t iobase, int irq)
322 struct uart_port port;
325 memset(&port, 0, sizeof (struct uart_port));
326 port.iobase = iobase;
328 port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
329 port.uartclk = 1843200;
330 port.dev = &handle_to_dev(handle);
332 port.flags |= UPF_BUGGY_UART;
333 line = serial8250_register_port(&port);
335 printk(KERN_NOTICE "serial_cs: serial8250_register_port() at "
336 "0x%04lx, irq %d failed\n", (u_long)iobase, irq);
340 info->line[info->ndev] = line;
341 sprintf(info->node[info->ndev].dev_name, "ttyS%d", line);
342 info->node[info->ndev].major = TTY_MAJOR;
343 info->node[info->ndev].minor = 0x40 + line;
345 info->node[info->ndev - 1].next = &info->node[info->ndev];
351 /*====================================================================*/
354 first_tuple(struct pcmcia_device *handle, tuple_t * tuple, cisparse_t * parse)
357 i = pcmcia_get_first_tuple(handle, tuple);
359 return CS_NO_MORE_ITEMS;
360 i = pcmcia_get_tuple_data(handle, tuple);
363 return pcmcia_parse_tuple(handle, tuple, parse);
367 next_tuple(struct pcmcia_device *handle, tuple_t * tuple, cisparse_t * parse)
370 i = pcmcia_get_next_tuple(handle, tuple);
372 return CS_NO_MORE_ITEMS;
373 i = pcmcia_get_tuple_data(handle, tuple);
376 return pcmcia_parse_tuple(handle, tuple, parse);
379 /*====================================================================*/
381 static int simple_config(struct pcmcia_device *link)
383 static const kio_addr_t base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
384 static const int size_table[2] = { 8, 16 };
385 struct serial_info *info = link->priv;
386 struct serial_cfg_mem *cfg_mem;
390 cistpl_cftable_entry_t *cf;
391 config_info_t config;
395 cfg_mem = kmalloc(sizeof(struct serial_cfg_mem), GFP_KERNEL);
399 tuple = &cfg_mem->tuple;
400 parse = &cfg_mem->parse;
401 cf = &parse->cftable_entry;
404 /* If the card is already configured, look up the port and irq */
405 i = pcmcia_get_configuration_info(link, &config);
406 if ((i == CS_SUCCESS) && (config.Attributes & CONF_VALID_CLIENT)) {
408 if ((config.BasePort2 != 0) && (config.NumPorts2 == 8)) {
409 port = config.BasePort2;
411 } else if ((info->manfid == MANFID_OSITECH) &&
412 (config.NumPorts1 == 0x40)) {
413 port = config.BasePort1 + 0x28;
418 return setup_serial(link, info, port, config.AssignedIRQ);
422 /* First pass: look for a config entry that looks normal. */
423 tuple->TupleData = (cisdata_t *) buf;
424 tuple->TupleOffset = 0;
425 tuple->TupleDataMax = 255;
426 tuple->Attributes = 0;
427 tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
428 /* Two tries: without IO aliases, then with aliases */
429 for (s = 0; s < 2; s++) {
430 for (try = 0; try < 2; try++) {
431 i = first_tuple(link, tuple, parse);
432 while (i != CS_NO_MORE_ITEMS) {
435 if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
437 cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
438 if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[s]) &&
439 (cf->io.win[0].base != 0)) {
440 link->conf.ConfigIndex = cf->index;
441 link->io.BasePort1 = cf->io.win[0].base;
442 link->io.IOAddrLines = (try == 0) ?
443 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
444 i = pcmcia_request_io(link, &link->io);
449 i = next_tuple(link, tuple, parse);
453 /* Second pass: try to find an entry that isn't picky about
454 its base address, then try to grab any standard serial port
455 address, and finally try to get any free port. */
456 i = first_tuple(link, tuple, parse);
457 while (i != CS_NO_MORE_ITEMS) {
458 if ((i == CS_SUCCESS) && (cf->io.nwin > 0) &&
459 ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
460 link->conf.ConfigIndex = cf->index;
461 for (j = 0; j < 5; j++) {
462 link->io.BasePort1 = base[j];
463 link->io.IOAddrLines = base[j] ? 16 : 3;
464 i = pcmcia_request_io(link, &link->io);
469 i = next_tuple(link, tuple, parse);
473 if (i != CS_SUCCESS) {
475 "serial_cs: no usable port range found, giving up\n");
476 cs_error(link, RequestIO, i);
481 i = pcmcia_request_irq(link, &link->irq);
482 if (i != CS_SUCCESS) {
483 cs_error(link, RequestIRQ, i);
484 link->irq.AssignedIRQ = 0;
486 if (info->multi && (info->manfid == MANFID_3COM))
487 link->conf.ConfigIndex &= ~(0x08);
488 i = pcmcia_request_configuration(link, &link->conf);
489 if (i != CS_SUCCESS) {
490 cs_error(link, RequestConfiguration, i);
495 return setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ);
498 static int multi_config(struct pcmcia_device * link)
500 struct serial_info *info = link->priv;
501 struct serial_cfg_mem *cfg_mem;
505 cistpl_cftable_entry_t *cf;
506 int i, rc, base2 = 0;
508 cfg_mem = kmalloc(sizeof(struct serial_cfg_mem), GFP_KERNEL);
511 tuple = &cfg_mem->tuple;
512 parse = &cfg_mem->parse;
513 cf = &parse->cftable_entry;
516 tuple->TupleData = (cisdata_t *) buf;
517 tuple->TupleOffset = 0;
518 tuple->TupleDataMax = 255;
519 tuple->Attributes = 0;
520 tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
522 /* First, look for a generic full-sized window */
523 link->io.NumPorts1 = info->multi * 8;
524 i = first_tuple(link, tuple, parse);
525 while (i != CS_NO_MORE_ITEMS) {
526 /* The quad port cards have bad CIS's, so just look for a
527 window larger than 8 ports and assume it will be right */
528 if ((i == CS_SUCCESS) && (cf->io.nwin == 1) &&
529 (cf->io.win[0].len > 8)) {
530 link->conf.ConfigIndex = cf->index;
531 link->io.BasePort1 = cf->io.win[0].base;
532 link->io.IOAddrLines =
533 cf->io.flags & CISTPL_IO_LINES_MASK;
534 i = pcmcia_request_io(link, &link->io);
535 base2 = link->io.BasePort1 + 8;
539 i = next_tuple(link, tuple, parse);
542 /* If that didn't work, look for two windows */
543 if (i != CS_SUCCESS) {
544 link->io.NumPorts1 = link->io.NumPorts2 = 8;
546 i = first_tuple(link, tuple, parse);
547 while (i != CS_NO_MORE_ITEMS) {
548 if ((i == CS_SUCCESS) && (cf->io.nwin == 2)) {
549 link->conf.ConfigIndex = cf->index;
550 link->io.BasePort1 = cf->io.win[0].base;
551 link->io.BasePort2 = cf->io.win[1].base;
552 link->io.IOAddrLines =
553 cf->io.flags & CISTPL_IO_LINES_MASK;
554 i = pcmcia_request_io(link, &link->io);
555 base2 = link->io.BasePort2;
559 i = next_tuple(link, tuple, parse);
563 if (i != CS_SUCCESS) {
564 cs_error(link, RequestIO, i);
569 i = pcmcia_request_irq(link, &link->irq);
570 if (i != CS_SUCCESS) {
572 "serial_cs: no usable port range found, giving up\n");
573 cs_error(link, RequestIRQ, i);
574 link->irq.AssignedIRQ = 0;
576 /* Socket Dual IO: this enables irq's for second port */
577 if (info->multi && (info->manfid == MANFID_SOCKET)) {
578 link->conf.Present |= PRESENT_EXT_STATUS;
579 link->conf.ExtStatus = ESR_REQ_ATTN_ENA;
581 i = pcmcia_request_configuration(link, &link->conf);
582 if (i != CS_SUCCESS) {
583 cs_error(link, RequestConfiguration, i);
588 /* The Oxford Semiconductor OXCF950 cards are in fact single-port:
589 * 8 registers are for the UART, the others are extra registers.
590 * Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too.
592 if (info->manfid == MANFID_OXSEMI || (info->manfid == MANFID_POSSIO &&
593 info->prodid == PRODID_POSSIO_GCC)) {
596 if (cf->index == 1 || cf->index == 3) {
597 err = setup_serial(link, info, base2,
598 link->irq.AssignedIRQ);
599 base2 = link->io.BasePort1;
601 err = setup_serial(link, info, link->io.BasePort1,
602 link->irq.AssignedIRQ);
604 info->c950ctrl = base2;
610 setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ);
611 /* The Nokia cards are not really multiport cards */
612 if (info->manfid == MANFID_NOKIA) {
616 for (i = 0; i < info->multi - 1; i++)
617 setup_serial(link, info, base2 + (8 * i),
618 link->irq.AssignedIRQ);
625 /*======================================================================
627 serial_config() is scheduled to run after a CARD_INSERTION event
628 is received, to configure the PCMCIA socket, and to make the
629 serial device available to the system.
631 ======================================================================*/
633 static int serial_config(struct pcmcia_device * link)
635 struct serial_info *info = link->priv;
636 struct serial_cfg_mem *cfg_mem;
640 cistpl_cftable_entry_t *cf;
641 int i, last_ret, last_fn;
643 DEBUG(0, "serial_config(0x%p)\n", link);
645 cfg_mem = kmalloc(sizeof(struct serial_cfg_mem), GFP_KERNEL);
649 tuple = &cfg_mem->tuple;
650 parse = &cfg_mem->parse;
651 cf = &parse->cftable_entry;
654 tuple->TupleData = (cisdata_t *) buf;
655 tuple->TupleOffset = 0;
656 tuple->TupleDataMax = 255;
657 tuple->Attributes = 0;
658 /* Get configuration register information */
659 tuple->DesiredTuple = CISTPL_CONFIG;
660 last_ret = first_tuple(link, tuple, parse);
661 if (last_ret != CS_SUCCESS) {
662 last_fn = ParseTuple;
665 link->conf.ConfigBase = parse->config.base;
666 link->conf.Present = parse->config.rmask[0];
668 /* Is this a compliant multifunction card? */
669 tuple->DesiredTuple = CISTPL_LONGLINK_MFC;
670 tuple->Attributes = TUPLE_RETURN_COMMON | TUPLE_RETURN_LINK;
671 info->multi = (first_tuple(link, tuple, parse) == CS_SUCCESS);
673 /* Is this a multiport card? */
674 tuple->DesiredTuple = CISTPL_MANFID;
675 if (first_tuple(link, tuple, parse) == CS_SUCCESS) {
676 info->manfid = parse->manfid.manf;
677 info->prodid = parse->manfid.card;
679 for (i = 0; i < ARRAY_SIZE(quirks); i++)
680 if ((quirks[i].manfid == ~0 ||
681 quirks[i].manfid == info->manfid) &&
682 (quirks[i].prodid == ~0 ||
683 quirks[i].prodid == info->prodid)) {
684 info->quirk = &quirks[i];
689 /* Another check for dual-serial cards: look for either serial or
690 multifunction cards that ask for appropriate IO port ranges */
691 tuple->DesiredTuple = CISTPL_FUNCID;
692 if ((info->multi == 0) &&
693 ((first_tuple(link, tuple, parse) != CS_SUCCESS) ||
694 (parse->funcid.func == CISTPL_FUNCID_MULTI) ||
695 (parse->funcid.func == CISTPL_FUNCID_SERIAL))) {
696 tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
697 if (first_tuple(link, tuple, parse) == CS_SUCCESS) {
698 if ((cf->io.nwin == 1) && (cf->io.win[0].len % 8 == 0))
699 info->multi = cf->io.win[0].len >> 3;
700 if ((cf->io.nwin == 2) && (cf->io.win[0].len == 8) &&
701 (cf->io.win[1].len == 8))
707 * Apply any multi-port quirk.
709 if (info->quirk && info->quirk->multi != -1)
710 info->multi = info->quirk->multi;
721 * Apply any post-init quirk. FIXME: This should really happen
722 * before we register the port, since it might already be in use.
724 if (info->quirk && info->quirk->post)
725 if (info->quirk->post(link))
728 link->dev_node = &info->node[0];
733 cs_error(link, last_fn, last_ret);
740 static struct pcmcia_device_id serial_ids[] = {
741 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0057, 0x0021),
742 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0089, 0x110a),
743 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0104, 0x000a),
744 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0xea15),
745 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0109, 0x0501),
746 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0138, 0x110a),
747 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0140, 0x000a),
748 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0x3341),
749 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0xc0ab),
750 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x016c, 0x0081),
751 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x021b, 0x0101),
752 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x08a1, 0xc0ab),
753 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0d0a),
754 PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0e0a),
755 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63),
756 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63),
757 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef),
758 PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
759 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea),
760 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM33", 0x2e3ee845, 0x80609023),
761 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a),
762 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29),
763 PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719),
764 PCMCIA_PFC_DEVICE_PROD_ID12(1, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4),
765 PCMCIA_PFC_DEVICE_PROD_ID12(1, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff),
766 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
767 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
768 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033),
769 PCMCIA_PFC_DEVICE_PROD_ID12(1, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58),
770 PCMCIA_PFC_DEVICE_PROD_ID12(1, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
771 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
772 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
773 PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc),
774 PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f),
775 PCMCIA_PFC_DEVICE_PROD_ID12(1, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
776 PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
777 PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070),
778 PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562),
779 PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0104, 0x0070),
780 PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x016c, 0x0020),
781 PCMCIA_MFC_DEVICE_PROD_ID123(1, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f),
782 PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away 28.8 PC Card ", 0xb569a6e5, 0x5bd4ff2c),
783 PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3),
784 PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15),
785 PCMCIA_MFC_DEVICE_PROD_ID1(1, "Motorola MARQUIS", 0xf03e4e77),
786 PCMCIA_MFC_DEVICE_PROD_ID2(1, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302),
787 PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0301),
788 PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x0276),
789 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0039),
790 PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0006),
791 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x410a),
792 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d50),
793 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d51),
794 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d52),
795 PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d53),
796 PCMCIA_DEVICE_MANF_CARD(0x010b, 0xd180),
797 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x000e),
798 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x001b),
799 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0025),
800 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0045),
801 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0052),
802 PCMCIA_DEVICE_PROD_ID134("ADV", "TECH", "COMpad-32/85", 0x67459937, 0x916d02ba, 0x8fbe92ae),
803 PCMCIA_DEVICE_PROD_ID124("GATEWAY2000", "CC3144", "PCMCIA MODEM", 0x506bccae, 0xcb3685f1, 0xbd6c43ef),
804 PCMCIA_DEVICE_PROD_ID14("MEGAHERTZ", "PCMCIA MODEM", 0xf510db04, 0xbd6c43ef),
805 PCMCIA_DEVICE_PROD_ID124("TOSHIBA", "T144PF", "PCMCIA MODEM", 0xb4585a1a, 0x7271409c, 0xbd6c43ef),
806 PCMCIA_DEVICE_PROD_ID123("FUJITSU", "FC14F ", "MBH10213", 0x6ee5a3d8, 0x30ead12b, 0xb00f05a0),
807 PCMCIA_DEVICE_PROD_ID123("Novatel Wireless", "Merlin UMTS Modem", "U630", 0x32607776, 0xd9e73b13, 0xe87332e),
808 PCMCIA_DEVICE_PROD_ID13("MEGAHERTZ", "V.34 PCMCIA MODEM", 0xf510db04, 0xbb2cce4a),
809 PCMCIA_DEVICE_PROD_ID12("Brain Boxes", "Bluetooth PC Card", 0xee138382, 0xd4ce9b02),
810 PCMCIA_DEVICE_PROD_ID12("CIRRUS LOGIC", "FAX MODEM", 0xe625f451, 0xcecd6dfa),
811 PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 28800 FAX/DATA MODEM", 0xa3a3062c, 0x8cbd7c76),
812 PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 33600 FAX/DATA MODEM", 0xa3a3062c, 0x5a00ce95),
813 PCMCIA_DEVICE_PROD_ID12("Computerboards, Inc.", "PCM-COM422", 0xd0b78f51, 0x7e2d49ed),
814 PCMCIA_DEVICE_PROD_ID12("Dr. Neuhaus", "FURY CARD 14K4", 0x76942813, 0x8b96ce65),
815 PCMCIA_DEVICE_PROD_ID12("Intelligent", "ANGIA FAX/MODEM", 0xb496e65e, 0xf31602a6),
816 PCMCIA_DEVICE_PROD_ID12("Intel", "MODEM 2400+", 0x816cc815, 0x412729fb),
817 PCMCIA_DEVICE_PROD_ID12("IOTech Inc ", "PCMCIA Dual RS-232 Serial Port Card", 0x3bd2d898, 0x92abc92f),
818 PCMCIA_DEVICE_PROD_ID12("MACRONIX", "FAX/MODEM", 0x668388b3, 0x3f9bdf2f),
819 PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT1432LT", 0x5f73be51, 0x0b3e2383),
820 PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e),
821 PCMCIA_DEVICE_PROD_ID12("OEM ", "C288MX ", 0xb572d360, 0xd2385b7a),
822 PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab),
823 PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f),
824 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "PCMLM28.cis"),
825 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "PCMLM28.cis"),
826 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "PCMLM28.cis"),
827 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "PCMLM28.cis"),
828 PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "PCMLM28.cis"),
829 PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"),
830 PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"),
831 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "3CCFEM556.cis"),
832 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "DP83903.cis"),
833 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "3CXEM556.cis"),
834 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "3CXEM556.cis"),
835 PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0x0710, "SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */
836 PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
837 PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
838 PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "MT5634ZLX.cis"),
839 PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"),
840 PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"),
841 PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "RS-COM-2P.cis"),
842 PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "GLOBETROTTER.cis"),
844 /* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */
845 /* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */
846 PCMCIA_DEVICE_FUNC_ID(2),
849 MODULE_DEVICE_TABLE(pcmcia, serial_ids);
851 static struct pcmcia_driver serial_cs_driver = {
852 .owner = THIS_MODULE,
856 .probe = serial_probe,
857 .remove = serial_detach,
858 .id_table = serial_ids,
859 .suspend = serial_suspend,
860 .resume = serial_resume,
863 static int __init init_serial_cs(void)
865 return pcmcia_register_driver(&serial_cs_driver);
868 static void __exit exit_serial_cs(void)
870 pcmcia_unregister_driver(&serial_cs_driver);
873 module_init(init_serial_cs);
874 module_exit(exit_serial_cs);
876 MODULE_LICENSE("GPL");