Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: (GPL-2.0 OR MPL-1.1)
0002 /*======================================================================
0003 
0004     A driver for PCMCIA serial devices
0005 
0006     serial_cs.c 1.134 2002/05/04 05:48:53
0007 
0008     The contents of this file are subject to the Mozilla Public
0009     License Version 1.1 (the "License"); you may not use this file
0010     except in compliance with the License. You may obtain a copy of
0011     the License at http://www.mozilla.org/MPL/
0012 
0013     Software distributed under the License is distributed on an "AS
0014     IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
0015     implied. See the License for the specific language governing
0016     rights and limitations under the License.
0017 
0018     The initial developer of the original code is David A. Hinds
0019     <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
0020     are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
0021 
0022     Alternatively, the contents of this file may be used under the
0023     terms of the GNU General Public License version 2 (the "GPL"), in which
0024     case the provisions of the GPL are applicable instead of the
0025     above.  If you wish to allow the use of your version of this file
0026     only under the terms of the GPL and not to allow others to use
0027     your version of this file under the MPL, indicate your decision
0028     by deleting the provisions above and replace them with the notice
0029     and other provisions required by the GPL.  If you do not delete
0030     the provisions above, a recipient may use your version of this
0031     file under either the MPL or the GPL.
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 /* Parameters that can be set with 'insmod' */
0058 
0059 /* Enable the speaker? */
0060 static int do_sound = 1;
0061 /* Skip strict UART tests? */
0062 static int buggy_uart;
0063 
0064 module_param(do_sound, int, 0444);
0065 module_param(buggy_uart, int, 0444);
0066 
0067 /*====================================================================*/
0068 
0069 /* Table of multi-port card ID's */
0070 
0071 struct serial_quirk {
0072     unsigned int manfid;
0073     unsigned int prodid;
0074     int multi;      /* 1 = multifunction, > 1 = # ports */
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  * vers_1 5.0, "Brain Boxes", "2-Port RS232 card", "r6"
0101  * manfid 0x0160, 0x0104
0102  * This card appears to have a 14.7456MHz clock.
0103  */
0104 /* Generic Modem: MD55x (GPRS/EDGE) have
0105  * Elan VPU16551 UART with 14.7456MHz oscillator
0106  * manfid 0x015D, 0x4C45
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  * Nokia cards are not really multiport cards.  Shouldn't this
0133  * be handled by setting the quirk entry .multi = 0 | 1 ?
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 /* request_region? oxsemi branch does no request_region too... */
0152 /*
0153  * This sequence is needed to properly initialize MC45 attached to OXCF950.
0154  * I tried decreasing these msleep()s, but it worked properly (survived
0155  * 1000 stop/start operations) with these timeouts (or bigger).
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  * Socket Dual IO: this enables irq's for second port
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      * Recheck to see if the device is still configured.
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     /* Create new serial device */
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      * Ensure that the ports have been released.
0343      */
0344     serial_remove(link);
0345 
0346     /* free bits */
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      * First pass: look for a config entry that looks normal.
0456      * Two tries: without IO aliases, then with aliases.
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      * Second pass: try to find an entry that isn't picky about
0465      * its base address, then try to grab any standard serial port
0466      * address, and finally try to get any free port.
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      * Apply any configuration quirks.
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      * The quad port cards have bad CIS's, so just look for a
0499      * window larger than 8 ports and assume it will be right.
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     /* First, look for a generic full-sized window */
0539     if (!pcmcia_loop_config(link, multi_config_check, &info->multi))
0540         base2 = link->resource[0]->start + 8;
0541     else {
0542         /* If that didn't work, look for two windows */
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      * Apply any configuration quirks.
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     /* The Oxford Semiconductor OXCF950 cards are in fact single-port:
0566      * 8 registers are for the UART, the others are extra registers.
0567      * Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too.
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          * FIXME: We really should wake up the port prior to
0583          * handing it over to the serial layer.
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; /* break */
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     /* Is this a compliant multifunction card? */
0624     info->multi = (link->socket->functions > 1);
0625 
0626     /* Is this a multiport card? */
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      * Another check for dual-serial cards: look for either serial or
0641      * multifunction cards that ask for appropriate IO port ranges.
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      * Apply any multi-port quirk.
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      * Apply any post-init quirk.  FIXME: This should really happen
0674      * before we register the port, since it might already be in use.
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), /* TDK DF2814 */
0747     PCMCIA_DEVICE_MANF_CARD(0x0105, 0x100a), /* Xircom CM-56G */
0748     PCMCIA_DEVICE_MANF_CARD(0x0105, 0x3e0a), /* TDK DF5660 */
0749     PCMCIA_DEVICE_MANF_CARD(0x0105, 0x410a),
0750     PCMCIA_DEVICE_MANF_CARD(0x0107, 0x0002), /* USRobotics 14,400 */
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), /* USRobotics/SUN 14,400 */
0757     PCMCIA_DEVICE_MANF_CARD(0x0124, 0x0100), /* Nokia DTP-2 ver II */
0758     PCMCIA_DEVICE_MANF_CARD(0x0134, 0x5600), /* LASAT COMMUNICATIONS A/S */
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), /* Psion 56K+Fax */
0765     PCMCIA_DEVICE_MANF_CARD(0x0200, 0x0001), /* MultiMobile */
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"), /* Sierra Wireless AC850 3G Network Adapter R1 */
0808     PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC860", 0xd85f6206, 0x698f93db, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC860 3G Network Adapter R1 */
0809     PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"),  /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */
0810     PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"),  /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
0811     PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"),  /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
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     /* too generic */
0843     /* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */
0844     /* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */
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");