Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
serial_cs.c
Go to the documentation of this file.
1 /*======================================================================
2 
3  A driver for PCMCIA serial devices
4 
5  serial_cs.c 1.134 2002/05/04 05:48:53
6 
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/
11 
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.
16 
17  The initial developer of the original code is David A. Hinds
18  <[email protected]>. Portions created by David A. Hinds
19  are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
20 
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.
31 
32 ======================================================================*/
33 
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/kernel.h>
37 #include <linux/init.h>
38 #include <linux/ptrace.h>
39 #include <linux/slab.h>
40 #include <linux/string.h>
41 #include <linux/timer.h>
42 #include <linux/serial_core.h>
43 #include <linux/delay.h>
44 #include <linux/major.h>
45 #include <asm/io.h>
46 
47 #include <pcmcia/cistpl.h>
48 #include <pcmcia/ciscode.h>
49 #include <pcmcia/ds.h>
50 #include <pcmcia/cisreg.h>
51 
52 #include "8250.h"
53 
54 
55 /*====================================================================*/
56 
57 /* Parameters that can be set with 'insmod' */
58 
59 /* Enable the speaker? */
60 static int do_sound = 1;
61 /* Skip strict UART tests? */
62 static int buggy_uart;
63 
64 module_param(do_sound, int, 0444);
65 module_param(buggy_uart, int, 0444);
66 
67 /*====================================================================*/
68 
69 /* Table of multi-port card ID's */
70 
71 struct serial_quirk {
72  unsigned int manfid;
73  unsigned int prodid;
74  int multi; /* 1 = multifunction, > 1 = # ports */
75  void (*config)(struct pcmcia_device *);
76  void (*setup)(struct pcmcia_device *, struct uart_8250_port *);
77  void (*wakeup)(struct pcmcia_device *);
78  int (*post)(struct pcmcia_device *);
79 };
80 
81 struct serial_info {
82  struct pcmcia_device *p_dev;
83  int ndev;
84  int multi;
85  int slave;
86  int manfid;
87  int prodid;
88  int c950ctrl;
89  int line[4];
90  const struct serial_quirk *quirk;
91 };
92 
96  u_char buf[256];
97 };
98 
99 /*
100  * vers_1 5.0, "Brain Boxes", "2-Port RS232 card", "r6"
101  * manfid 0x0160, 0x0104
102  * This card appears to have a 14.7456MHz clock.
103  */
104 /* Generic Modem: MD55x (GPRS/EDGE) have
105  * Elan VPU16551 UART with 14.7456MHz oscillator
106  * manfid 0x015D, 0x4C45
107  */
108 static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_8250_port *uart)
109 {
110  uart->port.uartclk = 14745600;
111 }
112 
113 static int quirk_post_ibm(struct pcmcia_device *link)
114 {
115  u8 val;
116  int ret;
117 
118  ret = pcmcia_read_config_byte(link, 0x800, &val);
119  if (ret)
120  goto failed;
121 
122  ret = pcmcia_write_config_byte(link, 0x800, val | 1);
123  if (ret)
124  goto failed;
125  return 0;
126 
127  failed:
128  return -ENODEV;
129 }
130 
131 /*
132  * Nokia cards are not really multiport cards. Shouldn't this
133  * be handled by setting the quirk entry .multi = 0 | 1 ?
134  */
135 static void quirk_config_nokia(struct pcmcia_device *link)
136 {
137  struct serial_info *info = link->priv;
138 
139  if (info->multi > 1)
140  info->multi = 1;
141 }
142 
143 static void quirk_wakeup_oxsemi(struct pcmcia_device *link)
144 {
145  struct serial_info *info = link->priv;
146 
147  if (info->c950ctrl)
148  outb(12, info->c950ctrl + 1);
149 }
150 
151 /* request_region? oxsemi branch does no request_region too... */
152 /*
153  * This sequence is needed to properly initialize MC45 attached to OXCF950.
154  * I tried decreasing these msleep()s, but it worked properly (survived
155  * 1000 stop/start operations) with these timeouts (or bigger).
156  */
157 static void quirk_wakeup_possio_gcc(struct pcmcia_device *link)
158 {
159  struct serial_info *info = link->priv;
160  unsigned int ctrl = info->c950ctrl;
161 
162  outb(0xA, ctrl + 1);
163  msleep(100);
164  outb(0xE, ctrl + 1);
165  msleep(300);
166  outb(0xC, ctrl + 1);
167  msleep(100);
168  outb(0xE, ctrl + 1);
169  msleep(200);
170  outb(0xF, ctrl + 1);
171  msleep(100);
172  outb(0xE, ctrl + 1);
173  msleep(100);
174  outb(0xC, ctrl + 1);
175 }
176 
177 /*
178  * Socket Dual IO: this enables irq's for second port
179  */
180 static void quirk_config_socket(struct pcmcia_device *link)
181 {
182  struct serial_info *info = link->priv;
183 
184  if (info->multi)
185  link->config_flags |= CONF_ENABLE_ESR;
186 }
187 
188 static const struct serial_quirk quirks[] = {
189  {
190  .manfid = 0x0160,
191  .prodid = 0x0104,
192  .multi = -1,
193  .setup = quirk_setup_brainboxes_0104,
194  }, {
195  .manfid = 0x015D,
196  .prodid = 0x4C45,
197  .multi = -1,
198  .setup = quirk_setup_brainboxes_0104,
199  }, {
200  .manfid = MANFID_IBM,
201  .prodid = ~0,
202  .multi = -1,
203  .post = quirk_post_ibm,
204  }, {
205  .manfid = MANFID_INTEL,
206  .prodid = PRODID_INTEL_DUAL_RS232,
207  .multi = 2,
208  }, {
209  .manfid = MANFID_NATINST,
210  .prodid = PRODID_NATINST_QUAD_RS232,
211  .multi = 4,
212  }, {
213  .manfid = MANFID_NOKIA,
214  .prodid = ~0,
215  .multi = -1,
216  .config = quirk_config_nokia,
217  }, {
218  .manfid = MANFID_OMEGA,
219  .prodid = PRODID_OMEGA_QSP_100,
220  .multi = 4,
221  }, {
222  .manfid = MANFID_OXSEMI,
223  .prodid = ~0,
224  .multi = -1,
225  .wakeup = quirk_wakeup_oxsemi,
226  }, {
227  .manfid = MANFID_POSSIO,
228  .prodid = PRODID_POSSIO_GCC,
229  .multi = -1,
230  .wakeup = quirk_wakeup_possio_gcc,
231  }, {
232  .manfid = MANFID_QUATECH,
233  .prodid = PRODID_QUATECH_DUAL_RS232,
234  .multi = 2,
235  }, {
236  .manfid = MANFID_QUATECH,
238  .multi = 2,
239  }, {
240  .manfid = MANFID_QUATECH,
241  .prodid = PRODID_QUATECH_DUAL_RS232_G,
242  .multi = 2,
243  }, {
244  .manfid = MANFID_QUATECH,
245  .prodid = PRODID_QUATECH_QUAD_RS232,
246  .multi = 4,
247  }, {
248  .manfid = MANFID_SOCKET,
249  .prodid = PRODID_SOCKET_DUAL_RS232,
250  .multi = 2,
251  .config = quirk_config_socket,
252  }, {
253  .manfid = MANFID_SOCKET,
254  .prodid = ~0,
255  .multi = -1,
256  .config = quirk_config_socket,
257  }
258 };
259 
260 
261 static int serial_config(struct pcmcia_device * link);
262 
263 
264 static void serial_remove(struct pcmcia_device *link)
265 {
266  struct serial_info *info = link->priv;
267  int i;
268 
269  dev_dbg(&link->dev, "serial_release\n");
270 
271  /*
272  * Recheck to see if the device is still configured.
273  */
274  for (i = 0; i < info->ndev; i++)
276 
277  if (!info->slave)
278  pcmcia_disable_device(link);
279 }
280 
281 static int serial_suspend(struct pcmcia_device *link)
282 {
283  struct serial_info *info = link->priv;
284  int i;
285 
286  for (i = 0; i < info->ndev; i++)
287  serial8250_suspend_port(info->line[i]);
288 
289  return 0;
290 }
291 
292 static int serial_resume(struct pcmcia_device *link)
293 {
294  struct serial_info *info = link->priv;
295  int i;
296 
297  for (i = 0; i < info->ndev; i++)
298  serial8250_resume_port(info->line[i]);
299 
300  if (info->quirk && info->quirk->wakeup)
301  info->quirk->wakeup(link);
302 
303  return 0;
304 }
305 
306 static int serial_probe(struct pcmcia_device *link)
307 {
308  struct serial_info *info;
309 
310  dev_dbg(&link->dev, "serial_attach()\n");
311 
312  /* Create new serial device */
313  info = kzalloc(sizeof (*info), GFP_KERNEL);
314  if (!info)
315  return -ENOMEM;
316  info->p_dev = link;
317  link->priv = info;
318 
319  link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
320  if (do_sound)
321  link->config_flags |= CONF_ENABLE_SPKR;
322 
323  return serial_config(link);
324 }
325 
326 static void serial_detach(struct pcmcia_device *link)
327 {
328  struct serial_info *info = link->priv;
329 
330  dev_dbg(&link->dev, "serial_detach\n");
331 
332  /*
333  * Ensure that the ports have been released.
334  */
335  serial_remove(link);
336 
337  /* free bits */
338  kfree(info);
339 }
340 
341 /*====================================================================*/
342 
343 static int setup_serial(struct pcmcia_device *handle, struct serial_info * info,
344  unsigned int iobase, int irq)
345 {
346  struct uart_8250_port uart;
347  int line;
348 
349  memset(&uart, 0, sizeof(uart));
350  uart.port.iobase = iobase;
351  uart.port.irq = irq;
353  uart.port.uartclk = 1843200;
354  uart.port.dev = &handle->dev;
355  if (buggy_uart)
356  uart.port.flags |= UPF_BUGGY_UART;
357 
358  if (info->quirk && info->quirk->setup)
359  info->quirk->setup(handle, &uart);
360 
362  if (line < 0) {
363  pr_err("serial_cs: serial8250_register_8250_port() at 0x%04lx, irq %d failed\n",
364  (unsigned long)iobase, irq);
365  return -EINVAL;
366  }
367 
368  info->line[info->ndev] = line;
369  info->ndev++;
370 
371  return 0;
372 }
373 
374 /*====================================================================*/
375 
376 static int pfc_config(struct pcmcia_device *p_dev)
377 {
378  unsigned int port = 0;
379  struct serial_info *info = p_dev->priv;
380 
381  if ((p_dev->resource[1]->end != 0) &&
382  (resource_size(p_dev->resource[1]) == 8)) {
383  port = p_dev->resource[1]->start;
384  info->slave = 1;
385  } else if ((info->manfid == MANFID_OSITECH) &&
386  (resource_size(p_dev->resource[0]) == 0x40)) {
387  port = p_dev->resource[0]->start + 0x28;
388  info->slave = 1;
389  }
390  if (info->slave)
391  return setup_serial(p_dev, info, port, p_dev->irq);
392 
393  dev_warn(&p_dev->dev, "no usable port range found, giving up\n");
394  return -ENODEV;
395 }
396 
397 static int simple_config_check(struct pcmcia_device *p_dev, void *priv_data)
398 {
399  static const int size_table[2] = { 8, 16 };
400  int *try = priv_data;
401 
402  if (p_dev->resource[0]->start == 0)
403  return -ENODEV;
404 
405  if ((*try & 0x1) == 0)
406  p_dev->io_lines = 16;
407 
408  if (p_dev->resource[0]->end != size_table[(*try >> 1)])
409  return -ENODEV;
410 
411  p_dev->resource[0]->end = 8;
412  p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
413  p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
414 
415  return pcmcia_request_io(p_dev);
416 }
417 
418 static int simple_config_check_notpicky(struct pcmcia_device *p_dev,
419  void *priv_data)
420 {
421  static const unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
422  int j;
423 
424  if (p_dev->io_lines > 3)
425  return -ENODEV;
426 
427  p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
428  p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
429  p_dev->resource[0]->end = 8;
430 
431  for (j = 0; j < 5; j++) {
432  p_dev->resource[0]->start = base[j];
433  p_dev->io_lines = base[j] ? 16 : 3;
434  if (!pcmcia_request_io(p_dev))
435  return 0;
436  }
437  return -ENODEV;
438 }
439 
440 static int simple_config(struct pcmcia_device *link)
441 {
442  struct serial_info *info = link->priv;
443  int i = -ENODEV, try;
444 
445  /* First pass: look for a config entry that looks normal.
446  * Two tries: without IO aliases, then with aliases */
447  link->config_flags |= CONF_AUTO_SET_VPP;
448  for (try = 0; try < 4; try++)
449  if (!pcmcia_loop_config(link, simple_config_check, &try))
450  goto found_port;
451 
452  /* Second pass: try to find an entry that isn't picky about
453  its base address, then try to grab any standard serial port
454  address, and finally try to get any free port. */
455  if (!pcmcia_loop_config(link, simple_config_check_notpicky, NULL))
456  goto found_port;
457 
458  dev_warn(&link->dev, "no usable port range found, giving up\n");
459  return -1;
460 
461 found_port:
462  if (info->multi && (info->manfid == MANFID_3COM))
463  link->config_index &= ~(0x08);
464 
465  /*
466  * Apply any configuration quirks.
467  */
468  if (info->quirk && info->quirk->config)
469  info->quirk->config(link);
470 
471  i = pcmcia_enable_device(link);
472  if (i != 0)
473  return -1;
474  return setup_serial(link, info, link->resource[0]->start, link->irq);
475 }
476 
477 static int multi_config_check(struct pcmcia_device *p_dev, void *priv_data)
478 {
479  int *multi = priv_data;
480 
481  if (p_dev->resource[1]->end)
482  return -EINVAL;
483 
484  /* The quad port cards have bad CIS's, so just look for a
485  window larger than 8 ports and assume it will be right */
486  if (p_dev->resource[0]->end <= 8)
487  return -EINVAL;
488 
489  p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
490  p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
491  p_dev->resource[0]->end = *multi * 8;
492 
493  if (pcmcia_request_io(p_dev))
494  return -ENODEV;
495  return 0;
496 }
497 
498 static int multi_config_check_notpicky(struct pcmcia_device *p_dev,
499  void *priv_data)
500 {
501  int *base2 = priv_data;
502 
503  if (!p_dev->resource[0]->end || !p_dev->resource[1]->end ||
504  p_dev->resource[0]->start + 8 != p_dev->resource[1]->start)
505  return -ENODEV;
506 
507  p_dev->resource[0]->end = p_dev->resource[1]->end = 8;
508  p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
509  p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
510 
511  if (pcmcia_request_io(p_dev))
512  return -ENODEV;
513 
514  *base2 = p_dev->resource[0]->start + 8;
515  return 0;
516 }
517 
518 static int multi_config(struct pcmcia_device *link)
519 {
520  struct serial_info *info = link->priv;
521  int i, base2 = 0;
522 
523  /* First, look for a generic full-sized window */
524  if (!pcmcia_loop_config(link, multi_config_check, &info->multi))
525  base2 = link->resource[0]->start + 8;
526  else {
527  /* If that didn't work, look for two windows */
528  info->multi = 2;
529  if (pcmcia_loop_config(link, multi_config_check_notpicky,
530  &base2)) {
531  dev_warn(&link->dev, "no usable port range "
532  "found, giving up\n");
533  return -ENODEV;
534  }
535  }
536 
537  if (!link->irq)
538  dev_warn(&link->dev, "no usable IRQ found, continuing...\n");
539 
540  /*
541  * Apply any configuration quirks.
542  */
543  if (info->quirk && info->quirk->config)
544  info->quirk->config(link);
545 
546  i = pcmcia_enable_device(link);
547  if (i != 0)
548  return -ENODEV;
549 
550  /* The Oxford Semiconductor OXCF950 cards are in fact single-port:
551  * 8 registers are for the UART, the others are extra registers.
552  * Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too.
553  */
554  if (info->manfid == MANFID_OXSEMI || (info->manfid == MANFID_POSSIO &&
555  info->prodid == PRODID_POSSIO_GCC)) {
556  int err;
557 
558  if (link->config_index == 1 ||
559  link->config_index == 3) {
560  err = setup_serial(link, info, base2,
561  link->irq);
562  base2 = link->resource[0]->start;
563  } else {
564  err = setup_serial(link, info, link->resource[0]->start,
565  link->irq);
566  }
567  info->c950ctrl = base2;
568 
569  /*
570  * FIXME: We really should wake up the port prior to
571  * handing it over to the serial layer.
572  */
573  if (info->quirk && info->quirk->wakeup)
574  info->quirk->wakeup(link);
575 
576  return 0;
577  }
578 
579  setup_serial(link, info, link->resource[0]->start, link->irq);
580  for (i = 0; i < info->multi - 1; i++)
581  setup_serial(link, info, base2 + (8 * i),
582  link->irq);
583  return 0;
584 }
585 
586 static int serial_check_for_multi(struct pcmcia_device *p_dev, void *priv_data)
587 {
588  struct serial_info *info = p_dev->priv;
589 
590  if (!p_dev->resource[0]->end)
591  return -EINVAL;
592 
593  if ((!p_dev->resource[1]->end) && (p_dev->resource[0]->end % 8 == 0))
594  info->multi = p_dev->resource[0]->end >> 3;
595 
596  if ((p_dev->resource[1]->end) && (p_dev->resource[0]->end == 8)
597  && (p_dev->resource[1]->end == 8))
598  info->multi = 2;
599 
600  return 0; /* break */
601 }
602 
603 
604 static int serial_config(struct pcmcia_device * link)
605 {
606  struct serial_info *info = link->priv;
607  int i;
608 
609  dev_dbg(&link->dev, "serial_config\n");
610 
611  /* Is this a compliant multifunction card? */
612  info->multi = (link->socket->functions > 1);
613 
614  /* Is this a multiport card? */
615  info->manfid = link->manf_id;
616  info->prodid = link->card_id;
617 
618  for (i = 0; i < ARRAY_SIZE(quirks); i++)
619  if ((quirks[i].manfid == ~0 ||
620  quirks[i].manfid == info->manfid) &&
621  (quirks[i].prodid == ~0 ||
622  quirks[i].prodid == info->prodid)) {
623  info->quirk = &quirks[i];
624  break;
625  }
626 
627  /* Another check for dual-serial cards: look for either serial or
628  multifunction cards that ask for appropriate IO port ranges */
629  if ((info->multi == 0) &&
630  (link->has_func_id) &&
631  (link->socket->pcmcia_pfc == 0) &&
632  ((link->func_id == CISTPL_FUNCID_MULTI) ||
633  (link->func_id == CISTPL_FUNCID_SERIAL)))
634  pcmcia_loop_config(link, serial_check_for_multi, info);
635 
636  /*
637  * Apply any multi-port quirk.
638  */
639  if (info->quirk && info->quirk->multi != -1)
640  info->multi = info->quirk->multi;
641 
642  dev_info(&link->dev,
643  "trying to set up [0x%04x:0x%04x] (pfc: %d, multi: %d, quirk: %p)\n",
644  link->manf_id, link->card_id,
645  link->socket->pcmcia_pfc, info->multi, info->quirk);
646  if (link->socket->pcmcia_pfc)
647  i = pfc_config(link);
648  else if (info->multi > 1)
649  i = multi_config(link);
650  else
651  i = simple_config(link);
652 
653  if (i || info->ndev == 0)
654  goto failed;
655 
656  /*
657  * Apply any post-init quirk. FIXME: This should really happen
658  * before we register the port, since it might already be in use.
659  */
660  if (info->quirk && info->quirk->post)
661  if (info->quirk->post(link))
662  goto failed;
663 
664  return 0;
665 
666 failed:
667  dev_warn(&link->dev, "failed to initialize\n");
668  serial_remove(link);
669  return -ENODEV;
670 }
671 
672 static const struct pcmcia_device_id serial_ids[] = {
673  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0057, 0x0021),
674  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0089, 0x110a),
675  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0104, 0x000a),
676  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0d0a),
677  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0e0a),
678  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0xea15),
679  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0109, 0x0501),
680  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0138, 0x110a),
681  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0140, 0x000a),
682  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0x3341),
683  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0xc0ab),
684  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x016c, 0x0081),
685  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x021b, 0x0101),
686  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x08a1, 0xc0ab),
687  PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63),
688  PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63),
689  PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef),
690  PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
691  PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea),
692  PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM33", 0x2e3ee845, 0x80609023),
693  PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a),
694  PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29),
695  PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719),
696  PCMCIA_PFC_DEVICE_PROD_ID12(1, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4),
697  PCMCIA_PFC_DEVICE_PROD_ID12(1, "ATKK", "LM33-PCM-T", 0xba9eb7e2, 0x077c174e),
698  PCMCIA_PFC_DEVICE_PROD_ID12(1, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff),
699  PCMCIA_PFC_DEVICE_PROD_ID12(1, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
700  PCMCIA_PFC_DEVICE_PROD_ID12(1, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
701  PCMCIA_PFC_DEVICE_PROD_ID12(1, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033),
702  PCMCIA_PFC_DEVICE_PROD_ID12(1, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58),
703  PCMCIA_PFC_DEVICE_PROD_ID12(1, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
704  PCMCIA_PFC_DEVICE_PROD_ID12(1, "MICRO RESEARCH", "COMBO-L/M-336", 0xb2ced065, 0x3ced0555),
705  PCMCIA_PFC_DEVICE_PROD_ID12(1, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064),
706  PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
707  PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
708  PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc),
709  PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f),
710  PCMCIA_PFC_DEVICE_PROD_ID12(1, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
711  PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
712  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0e01),
713  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05),
714  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0b05),
715  PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101),
716  PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070),
717  PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562),
718  PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0104, 0x0070),
719  PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x016c, 0x0020),
720  PCMCIA_MFC_DEVICE_PROD_ID123(1, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f),
721  PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away 28.8 PC Card ", 0xb569a6e5, 0x5bd4ff2c),
722  PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3),
723  PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15),
724  PCMCIA_MFC_DEVICE_PROD_ID1(1, "Motorola MARQUIS", 0xf03e4e77),
725  PCMCIA_MFC_DEVICE_PROD_ID2(1, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302),
726  PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0301),
727  PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x0276),
728  PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0039),
729  PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0006),
730  PCMCIA_DEVICE_MANF_CARD(0x0105, 0x0101), /* TDK DF2814 */
731  PCMCIA_DEVICE_MANF_CARD(0x0105, 0x100a), /* Xircom CM-56G */
732  PCMCIA_DEVICE_MANF_CARD(0x0105, 0x3e0a), /* TDK DF5660 */
733  PCMCIA_DEVICE_MANF_CARD(0x0105, 0x410a),
734  PCMCIA_DEVICE_MANF_CARD(0x0107, 0x0002), /* USRobotics 14,400 */
735  PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d50),
736  PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d51),
737  PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d52),
738  PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d53),
739  PCMCIA_DEVICE_MANF_CARD(0x010b, 0xd180),
740  PCMCIA_DEVICE_MANF_CARD(0x0115, 0x3330), /* USRobotics/SUN 14,400 */
741  PCMCIA_DEVICE_MANF_CARD(0x0124, 0x0100), /* Nokia DTP-2 ver II */
742  PCMCIA_DEVICE_MANF_CARD(0x0134, 0x5600), /* LASAT COMMUNICATIONS A/S */
743  PCMCIA_DEVICE_MANF_CARD(0x0137, 0x000e),
744  PCMCIA_DEVICE_MANF_CARD(0x0137, 0x001b),
745  PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0025),
746  PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0045),
747  PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0052),
748  PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0006), /* Psion 56K+Fax */
749  PCMCIA_DEVICE_MANF_CARD(0x0200, 0x0001), /* MultiMobile */
750  PCMCIA_DEVICE_PROD_ID134("ADV", "TECH", "COMpad-32/85", 0x67459937, 0x916d02ba, 0x8fbe92ae),
751  PCMCIA_DEVICE_PROD_ID124("GATEWAY2000", "CC3144", "PCMCIA MODEM", 0x506bccae, 0xcb3685f1, 0xbd6c43ef),
752  PCMCIA_DEVICE_PROD_ID14("MEGAHERTZ", "PCMCIA MODEM", 0xf510db04, 0xbd6c43ef),
753  PCMCIA_DEVICE_PROD_ID124("TOSHIBA", "T144PF", "PCMCIA MODEM", 0xb4585a1a, 0x7271409c, 0xbd6c43ef),
754  PCMCIA_DEVICE_PROD_ID123("FUJITSU", "FC14F ", "MBH10213", 0x6ee5a3d8, 0x30ead12b, 0xb00f05a0),
755  PCMCIA_DEVICE_PROD_ID123("Novatel Wireless", "Merlin UMTS Modem", "U630", 0x32607776, 0xd9e73b13, 0xe87332e),
756  PCMCIA_DEVICE_PROD_ID13("MEGAHERTZ", "V.34 PCMCIA MODEM", 0xf510db04, 0xbb2cce4a),
757  PCMCIA_DEVICE_PROD_ID12("Brain Boxes", "Bluetooth PC Card", 0xee138382, 0xd4ce9b02),
758  PCMCIA_DEVICE_PROD_ID12("CIRRUS LOGIC", "FAX MODEM", 0xe625f451, 0xcecd6dfa),
759  PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 28800 FAX/DATA MODEM", 0xa3a3062c, 0x8cbd7c76),
760  PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 33600 FAX/DATA MODEM", 0xa3a3062c, 0x5a00ce95),
761  PCMCIA_DEVICE_PROD_ID12("Computerboards, Inc.", "PCM-COM422", 0xd0b78f51, 0x7e2d49ed),
762  PCMCIA_DEVICE_PROD_ID12("Dr. Neuhaus", "FURY CARD 14K4", 0x76942813, 0x8b96ce65),
763  PCMCIA_DEVICE_PROD_ID12("IBM", "ISDN/56K/GSM", 0xb569a6e5, 0xfee5297b),
764  PCMCIA_DEVICE_PROD_ID12("Intelligent", "ANGIA FAX/MODEM", 0xb496e65e, 0xf31602a6),
765  PCMCIA_DEVICE_PROD_ID12("Intel", "MODEM 2400+", 0x816cc815, 0x412729fb),
766  PCMCIA_DEVICE_PROD_ID12("Intertex", "IX34-PCMCIA", 0xf8a097e3, 0x97880447),
767  PCMCIA_DEVICE_PROD_ID12("IOTech Inc ", "PCMCIA Dual RS-232 Serial Port Card", 0x3bd2d898, 0x92abc92f),
768  PCMCIA_DEVICE_PROD_ID12("MACRONIX", "FAX/MODEM", 0x668388b3, 0x3f9bdf2f),
769  PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT1432LT", 0x5f73be51, 0x0b3e2383),
770  PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e),
771  PCMCIA_DEVICE_PROD_ID12("OEM ", "C288MX ", 0xb572d360, 0xd2385b7a),
772  PCMCIA_DEVICE_PROD_ID12("Option International", "V34bis GSM/PSTN Data/Fax Modem", 0x9d7cd6f5, 0x5cb8bf41),
773  PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab),
774  PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f),
775  PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d),
776  PCMCIA_DEVICE_PROD_ID12("Telia", "SurfinBird 560P/A+", 0xe2cdd5e, 0xc9314b38),
777  PCMCIA_DEVICE_PROD_ID1("Smart Serial Port", 0x2d8ce292),
778  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"),
779  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"),
780  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
781  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
782  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
783  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "TOSHIBA", "Modem/LAN Card", 0xb4585a1a, 0x53f922f8, "cis/PCMLM28.cis"),
784  PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"),
785  PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"),
786  PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"),
787  PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"),
788  PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"),
789  PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"),
790  PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */
791  PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC860", 0xd85f6206, 0x698f93db, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC860 3G Network Adapter R1 */
792  PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */
793  PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
794  PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
795  PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"),
796  PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"),
797  PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
798  PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"),
799  PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
800  PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "cis/GLOBETROTTER.cis"),
801  PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b),
802  PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100",0x19ca78af,0x71d98e83),
803  PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232 1.00.",0x19ca78af,0x69fb7490),
804  PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232",0x19ca78af,0xb6bc0235),
805  PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232",0x63f2e0bd,0xb9e175d3),
806  PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232-5",0x63f2e0bd,0xfce33442),
807  PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232",0x3beb8cf2,0x171e7190),
808  PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232-5",0x3beb8cf2,0x20da4262),
809  PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF428",0x3beb8cf2,0xea5dd57d),
810  PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF500",0x3beb8cf2,0xd77255fa),
811  PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: IC232",0x3beb8cf2,0x6a709903),
812  PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: SL232",0x3beb8cf2,0x18430676),
813  PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: XL232",0x3beb8cf2,0x6f933767),
814  PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7),
815  PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41),
816  PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029),
817  PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
818  PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial+Parallel Port: SP230",0x3beb8cf2,0xdb9e58bc),
819  PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7),
820  PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41),
821  PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029),
822  PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
823  PCMCIA_MFC_DEVICE_PROD_ID12(2,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
824  PCMCIA_MFC_DEVICE_PROD_ID12(3,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4),
825  PCMCIA_DEVICE_MANF_CARD(0x0279, 0x950b),
826  /* too generic */
827  /* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */
828  /* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */
829  PCMCIA_DEVICE_FUNC_ID(2),
830  PCMCIA_DEVICE_NULL,
831 };
832 MODULE_DEVICE_TABLE(pcmcia, serial_ids);
833 
834 MODULE_FIRMWARE("cis/PCMLM28.cis");
835 MODULE_FIRMWARE("cis/DP83903.cis");
836 MODULE_FIRMWARE("cis/3CCFEM556.cis");
837 MODULE_FIRMWARE("cis/3CXEM556.cis");
838 MODULE_FIRMWARE("cis/SW_8xx_SER.cis");
839 MODULE_FIRMWARE("cis/SW_7xx_SER.cis");
840 MODULE_FIRMWARE("cis/SW_555_SER.cis");
841 MODULE_FIRMWARE("cis/MT5634ZLX.cis");
842 MODULE_FIRMWARE("cis/COMpad2.cis");
843 MODULE_FIRMWARE("cis/COMpad4.cis");
844 MODULE_FIRMWARE("cis/RS-COM-2P.cis");
845 
846 static struct pcmcia_driver serial_cs_driver = {
847  .owner = THIS_MODULE,
848  .name = "serial_cs",
849  .probe = serial_probe,
850  .remove = serial_detach,
851  .id_table = serial_ids,
852  .suspend = serial_suspend,
853  .resume = serial_resume,
854 };
855 
856 static int __init init_serial_cs(void)
857 {
858  return pcmcia_register_driver(&serial_cs_driver);
859 }
860 
861 static void __exit exit_serial_cs(void)
862 {
863  pcmcia_unregister_driver(&serial_cs_driver);
864 }
865 
866 module_init(init_serial_cs);
867 module_exit(exit_serial_cs);
868 
869 MODULE_LICENSE("GPL");