Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0
2 : : /*
3 : : * Probe module for 8250/16550-type PCI serial ports.
4 : : *
5 : : * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
6 : : *
7 : : * Copyright (C) 2001 Russell King, All Rights Reserved.
8 : : */
9 : : #undef DEBUG
10 : : #include <linux/module.h>
11 : : #include <linux/pci.h>
12 : : #include <linux/string.h>
13 : : #include <linux/kernel.h>
14 : : #include <linux/slab.h>
15 : : #include <linux/delay.h>
16 : : #include <linux/tty.h>
17 : : #include <linux/serial_reg.h>
18 : : #include <linux/serial_core.h>
19 : : #include <linux/8250_pci.h>
20 : : #include <linux/bitops.h>
21 : :
22 : : #include <asm/byteorder.h>
23 : : #include <asm/io.h>
24 : :
25 : : #include "8250.h"
26 : :
27 : : /*
28 : : * init function returns:
29 : : * > 0 - number of ports
30 : : * = 0 - use board->num_ports
31 : : * < 0 - error
32 : : */
33 : : struct pci_serial_quirk {
34 : : u32 vendor;
35 : : u32 device;
36 : : u32 subvendor;
37 : : u32 subdevice;
38 : : int (*probe)(struct pci_dev *dev);
39 : : int (*init)(struct pci_dev *dev);
40 : : int (*setup)(struct serial_private *,
41 : : const struct pciserial_board *,
42 : : struct uart_8250_port *, int);
43 : : void (*exit)(struct pci_dev *dev);
44 : : };
45 : :
46 : : struct f815xxa_data {
47 : : spinlock_t lock;
48 : : int idx;
49 : : };
50 : :
51 : : struct serial_private {
52 : : struct pci_dev *dev;
53 : : unsigned int nr;
54 : : struct pci_serial_quirk *quirk;
55 : : const struct pciserial_board *board;
56 : : int line[0];
57 : : };
58 : :
59 : : static const struct pci_device_id pci_use_msi[] = {
60 : : { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
61 : : 0xA000, 0x1000) },
62 : : { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912,
63 : : 0xA000, 0x1000) },
64 : : { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
65 : : 0xA000, 0x1000) },
66 : : { }
67 : : };
68 : :
69 : : static int pci_default_setup(struct serial_private*,
70 : : const struct pciserial_board*, struct uart_8250_port *, int);
71 : :
72 : 0 : static void moan_device(const char *str, struct pci_dev *dev)
73 : : {
74 [ # # ]: 0 : dev_err(&dev->dev,
75 : : "%s: %s\n"
76 : : "Please send the output of lspci -vv, this\n"
77 : : "message (0x%04x,0x%04x,0x%04x,0x%04x), the\n"
78 : : "manufacturer and name of serial board or\n"
79 : : "modem board to <linux-serial@vger.kernel.org>.\n",
80 : : pci_name(dev), str, dev->vendor, dev->device,
81 : : dev->subsystem_vendor, dev->subsystem_device);
82 : 0 : }
83 : :
84 : : static int
85 : : setup_port(struct serial_private *priv, struct uart_8250_port *port,
86 : : int bar, int offset, int regshift)
87 : : {
88 : : struct pci_dev *dev = priv->dev;
89 : :
90 : : if (bar >= PCI_STD_NUM_BARS)
91 : : return -EINVAL;
92 : :
93 : : if (pci_resource_flags(dev, bar) & IORESOURCE_MEM) {
94 : : if (!pcim_iomap(dev, bar, 0) && !pcim_iomap_table(dev))
95 : : return -ENOMEM;
96 : :
97 : : port->port.iotype = UPIO_MEM;
98 : : port->port.iobase = 0;
99 : : port->port.mapbase = pci_resource_start(dev, bar) + offset;
100 : : port->port.membase = pcim_iomap_table(dev)[bar] + offset;
101 : : port->port.regshift = regshift;
102 : : } else {
103 : : port->port.iotype = UPIO_PORT;
104 : : port->port.iobase = pci_resource_start(dev, bar) + offset;
105 : : port->port.mapbase = 0;
106 : : port->port.membase = NULL;
107 : : port->port.regshift = 0;
108 : : }
109 : : return 0;
110 : : }
111 : :
112 : : /*
113 : : * ADDI-DATA GmbH communication cards <info@addi-data.com>
114 : : */
115 : 0 : static int addidata_apci7800_setup(struct serial_private *priv,
116 : : const struct pciserial_board *board,
117 : : struct uart_8250_port *port, int idx)
118 : : {
119 : 0 : unsigned int bar = 0, offset = board->first_offset;
120 : 0 : bar = FL_GET_BASE(board->flags);
121 : :
122 [ # # ]: 0 : if (idx < 2) {
123 : 0 : offset += idx * board->uart_offset;
124 [ # # ]: 0 : } else if ((idx >= 2) && (idx < 4)) {
125 : 0 : bar += 1;
126 : 0 : offset += ((idx - 2) * board->uart_offset);
127 [ # # ]: 0 : } else if ((idx >= 4) && (idx < 6)) {
128 : 0 : bar += 2;
129 : 0 : offset += ((idx - 4) * board->uart_offset);
130 : 0 : } else if (idx >= 6) {
131 : 0 : bar += 3;
132 : 0 : offset += ((idx - 6) * board->uart_offset);
133 : : }
134 : :
135 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
136 : : }
137 : :
138 : : /*
139 : : * AFAVLAB uses a different mixture of BARs and offsets
140 : : * Not that ugly ;) -- HW
141 : : */
142 : : static int
143 : 0 : afavlab_setup(struct serial_private *priv, const struct pciserial_board *board,
144 : : struct uart_8250_port *port, int idx)
145 : : {
146 : 0 : unsigned int bar, offset = board->first_offset;
147 : :
148 : 0 : bar = FL_GET_BASE(board->flags);
149 [ # # ]: 0 : if (idx < 4)
150 : 0 : bar += idx;
151 : : else {
152 : 0 : bar = 4;
153 : 0 : offset += (idx - 4) * board->uart_offset;
154 : : }
155 : :
156 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
157 : : }
158 : :
159 : : /*
160 : : * HP's Remote Management Console. The Diva chip came in several
161 : : * different versions. N-class, L2000 and A500 have two Diva chips, each
162 : : * with 3 UARTs (the third UART on the second chip is unused). Superdome
163 : : * and Keystone have one Diva chip with 3 UARTs. Some later machines have
164 : : * one Diva chip, but it has been expanded to 5 UARTs.
165 : : */
166 : 0 : static int pci_hp_diva_init(struct pci_dev *dev)
167 : : {
168 : 0 : int rc = 0;
169 : :
170 [ # # # # : 0 : switch (dev->subsystem_device) {
# ]
171 : 0 : case PCI_DEVICE_ID_HP_DIVA_TOSCA1:
172 : : case PCI_DEVICE_ID_HP_DIVA_HALFDOME:
173 : : case PCI_DEVICE_ID_HP_DIVA_KEYSTONE:
174 : : case PCI_DEVICE_ID_HP_DIVA_EVEREST:
175 : 0 : rc = 3;
176 : 0 : break;
177 : 0 : case PCI_DEVICE_ID_HP_DIVA_TOSCA2:
178 : 0 : rc = 2;
179 : 0 : break;
180 : 0 : case PCI_DEVICE_ID_HP_DIVA_MAESTRO:
181 : 0 : rc = 4;
182 : 0 : break;
183 : 0 : case PCI_DEVICE_ID_HP_DIVA_POWERBAR:
184 : : case PCI_DEVICE_ID_HP_DIVA_HURRICANE:
185 : 0 : rc = 1;
186 : 0 : break;
187 : : }
188 : :
189 : 0 : return rc;
190 : : }
191 : :
192 : : /*
193 : : * HP's Diva chip puts the 4th/5th serial port further out, and
194 : : * some serial ports are supposed to be hidden on certain models.
195 : : */
196 : : static int
197 : 0 : pci_hp_diva_setup(struct serial_private *priv,
198 : : const struct pciserial_board *board,
199 : : struct uart_8250_port *port, int idx)
200 : : {
201 : 0 : unsigned int offset = board->first_offset;
202 : 0 : unsigned int bar = FL_GET_BASE(board->flags);
203 : :
204 [ # # # ]: 0 : switch (priv->dev->subsystem_device) {
205 : 0 : case PCI_DEVICE_ID_HP_DIVA_MAESTRO:
206 [ # # ]: 0 : if (idx == 3)
207 : 0 : idx++;
208 : : break;
209 : 0 : case PCI_DEVICE_ID_HP_DIVA_EVEREST:
210 [ # # ]: 0 : if (idx > 0)
211 : 0 : idx++;
212 [ # # ]: 0 : if (idx > 2)
213 : 0 : idx++;
214 : : break;
215 : : }
216 [ # # ]: 0 : if (idx > 2)
217 : 0 : offset = 0x18;
218 : :
219 : 0 : offset += idx * board->uart_offset;
220 : :
221 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
222 : : }
223 : :
224 : : /*
225 : : * Added for EKF Intel i960 serial boards
226 : : */
227 : 0 : static int pci_inteli960ni_init(struct pci_dev *dev)
228 : : {
229 : 0 : u32 oldval;
230 : :
231 [ # # ]: 0 : if (!(dev->subsystem_device & 0x1000))
232 : : return -ENODEV;
233 : :
234 : : /* is firmware started? */
235 : 0 : pci_read_config_dword(dev, 0x44, &oldval);
236 [ # # ]: 0 : if (oldval == 0x00001000L) { /* RESET value */
237 : 0 : dev_dbg(&dev->dev, "Local i960 firmware missing\n");
238 : 0 : return -ENODEV;
239 : : }
240 : : return 0;
241 : : }
242 : :
243 : : /*
244 : : * Some PCI serial cards using the PLX 9050 PCI interface chip require
245 : : * that the card interrupt be explicitly enabled or disabled. This
246 : : * seems to be mainly needed on card using the PLX which also use I/O
247 : : * mapped memory.
248 : : */
249 : 0 : static int pci_plx9050_init(struct pci_dev *dev)
250 : : {
251 : 0 : u8 irq_config;
252 : 0 : void __iomem *p;
253 : :
254 [ # # ]: 0 : if ((pci_resource_flags(dev, 0) & IORESOURCE_MEM) == 0) {
255 : 0 : moan_device("no memory in bar 0", dev);
256 : 0 : return 0;
257 : : }
258 : :
259 : 0 : irq_config = 0x41;
260 [ # # ]: 0 : if (dev->vendor == PCI_VENDOR_ID_PANACOM ||
261 [ # # ]: 0 : dev->subsystem_vendor == PCI_SUBVENDOR_ID_EXSYS)
262 : 0 : irq_config = 0x43;
263 : :
264 [ # # ]: 0 : if ((dev->vendor == PCI_VENDOR_ID_PLX) &&
265 : : (dev->device == PCI_DEVICE_ID_PLX_ROMULUS))
266 : : /*
267 : : * As the megawolf cards have the int pins active
268 : : * high, and have 2 UART chips, both ints must be
269 : : * enabled on the 9050. Also, the UARTS are set in
270 : : * 16450 mode by default, so we have to enable the
271 : : * 16C950 'enhanced' mode so that we can use the
272 : : * deep FIFOs
273 : : */
274 : 0 : irq_config = 0x5b;
275 : : /*
276 : : * enable/disable interrupts
277 : : */
278 : 0 : p = ioremap(pci_resource_start(dev, 0), 0x80);
279 [ # # ]: 0 : if (p == NULL)
280 : : return -ENOMEM;
281 : 0 : writel(irq_config, p + 0x4c);
282 : :
283 : : /*
284 : : * Read the register back to ensure that it took effect.
285 : : */
286 : 0 : readl(p + 0x4c);
287 : 0 : iounmap(p);
288 : :
289 : 0 : return 0;
290 : : }
291 : :
292 : 0 : static void pci_plx9050_exit(struct pci_dev *dev)
293 : : {
294 : 0 : u8 __iomem *p;
295 : :
296 [ # # ]: 0 : if ((pci_resource_flags(dev, 0) & IORESOURCE_MEM) == 0)
297 : : return;
298 : :
299 : : /*
300 : : * disable interrupts
301 : : */
302 : 0 : p = ioremap(pci_resource_start(dev, 0), 0x80);
303 [ # # ]: 0 : if (p != NULL) {
304 : 0 : writel(0, p + 0x4c);
305 : :
306 : : /*
307 : : * Read the register back to ensure that it took effect.
308 : : */
309 : 0 : readl(p + 0x4c);
310 : 0 : iounmap(p);
311 : : }
312 : : }
313 : :
314 : : #define NI8420_INT_ENABLE_REG 0x38
315 : : #define NI8420_INT_ENABLE_BIT 0x2000
316 : :
317 : 0 : static void pci_ni8420_exit(struct pci_dev *dev)
318 : : {
319 : 0 : void __iomem *p;
320 : 0 : unsigned int bar = 0;
321 : :
322 [ # # ]: 0 : if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
323 : 0 : moan_device("no memory in bar", dev);
324 : 0 : return;
325 : : }
326 : :
327 : 0 : p = pci_ioremap_bar(dev, bar);
328 [ # # ]: 0 : if (p == NULL)
329 : : return;
330 : :
331 : : /* Disable the CPU Interrupt */
332 : 0 : writel(readl(p + NI8420_INT_ENABLE_REG) & ~(NI8420_INT_ENABLE_BIT),
333 : 0 : p + NI8420_INT_ENABLE_REG);
334 : 0 : iounmap(p);
335 : : }
336 : :
337 : :
338 : : /* MITE registers */
339 : : #define MITE_IOWBSR1 0xc4
340 : : #define MITE_IOWCR1 0xf4
341 : : #define MITE_LCIMR1 0x08
342 : : #define MITE_LCIMR2 0x10
343 : :
344 : : #define MITE_LCIMR2_CLR_CPU_IE (1 << 30)
345 : :
346 : 0 : static void pci_ni8430_exit(struct pci_dev *dev)
347 : : {
348 : 0 : void __iomem *p;
349 : 0 : unsigned int bar = 0;
350 : :
351 [ # # ]: 0 : if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
352 : 0 : moan_device("no memory in bar", dev);
353 : 0 : return;
354 : : }
355 : :
356 : 0 : p = pci_ioremap_bar(dev, bar);
357 [ # # ]: 0 : if (p == NULL)
358 : : return;
359 : :
360 : : /* Disable the CPU Interrupt */
361 : 0 : writel(MITE_LCIMR2_CLR_CPU_IE, p + MITE_LCIMR2);
362 : 0 : iounmap(p);
363 : : }
364 : :
365 : : /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */
366 : : static int
367 : 0 : sbs_setup(struct serial_private *priv, const struct pciserial_board *board,
368 : : struct uart_8250_port *port, int idx)
369 : : {
370 : 0 : unsigned int bar, offset = board->first_offset;
371 : :
372 : 0 : bar = 0;
373 : :
374 [ # # ]: 0 : if (idx < 4) {
375 : : /* first four channels map to 0, 0x100, 0x200, 0x300 */
376 : 0 : offset += idx * board->uart_offset;
377 [ # # ]: 0 : } else if (idx < 8) {
378 : : /* last four channels map to 0x1000, 0x1100, 0x1200, 0x1300 */
379 : 0 : offset += idx * board->uart_offset + 0xC00;
380 : : } else /* we have only 8 ports on PMC-OCTALPRO */
381 : : return 1;
382 : :
383 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
384 : : }
385 : :
386 : : /*
387 : : * This does initialization for PMC OCTALPRO cards:
388 : : * maps the device memory, resets the UARTs (needed, bc
389 : : * if the module is removed and inserted again, the card
390 : : * is in the sleep mode) and enables global interrupt.
391 : : */
392 : :
393 : : /* global control register offset for SBS PMC-OctalPro */
394 : : #define OCT_REG_CR_OFF 0x500
395 : :
396 : 0 : static int sbs_init(struct pci_dev *dev)
397 : : {
398 : 0 : u8 __iomem *p;
399 : :
400 : 0 : p = pci_ioremap_bar(dev, 0);
401 : :
402 [ # # ]: 0 : if (p == NULL)
403 : : return -ENOMEM;
404 : : /* Set bit-4 Control Register (UART RESET) in to reset the uarts */
405 : 0 : writeb(0x10, p + OCT_REG_CR_OFF);
406 : 0 : udelay(50);
407 : 0 : writeb(0x0, p + OCT_REG_CR_OFF);
408 : :
409 : : /* Set bit-2 (INTENABLE) of Control Register */
410 : 0 : writeb(0x4, p + OCT_REG_CR_OFF);
411 : 0 : iounmap(p);
412 : :
413 : 0 : return 0;
414 : : }
415 : :
416 : : /*
417 : : * Disables the global interrupt of PMC-OctalPro
418 : : */
419 : :
420 : 0 : static void sbs_exit(struct pci_dev *dev)
421 : : {
422 : 0 : u8 __iomem *p;
423 : :
424 : 0 : p = pci_ioremap_bar(dev, 0);
425 : : /* FIXME: What if resource_len < OCT_REG_CR_OFF */
426 [ # # ]: 0 : if (p != NULL)
427 : 0 : writeb(0, p + OCT_REG_CR_OFF);
428 : 0 : iounmap(p);
429 : 0 : }
430 : :
431 : : /*
432 : : * SIIG serial cards have an PCI interface chip which also controls
433 : : * the UART clocking frequency. Each UART can be clocked independently
434 : : * (except cards equipped with 4 UARTs) and initial clocking settings
435 : : * are stored in the EEPROM chip. It can cause problems because this
436 : : * version of serial driver doesn't support differently clocked UART's
437 : : * on single PCI card. To prevent this, initialization functions set
438 : : * high frequency clocking for all UART's on given card. It is safe (I
439 : : * hope) because it doesn't touch EEPROM settings to prevent conflicts
440 : : * with other OSes (like M$ DOS).
441 : : *
442 : : * SIIG support added by Andrey Panin <pazke@donpac.ru>, 10/1999
443 : : *
444 : : * There is two family of SIIG serial cards with different PCI
445 : : * interface chip and different configuration methods:
446 : : * - 10x cards have control registers in IO and/or memory space;
447 : : * - 20x cards have control registers in standard PCI configuration space.
448 : : *
449 : : * Note: all 10x cards have PCI device ids 0x10..
450 : : * all 20x cards have PCI device ids 0x20..
451 : : *
452 : : * There are also Quartet Serial cards which use Oxford Semiconductor
453 : : * 16954 quad UART PCI chip clocked by 18.432 MHz quartz.
454 : : *
455 : : * Note: some SIIG cards are probed by the parport_serial object.
456 : : */
457 : :
458 : : #define PCI_DEVICE_ID_SIIG_1S_10x (PCI_DEVICE_ID_SIIG_1S_10x_550 & 0xfffc)
459 : : #define PCI_DEVICE_ID_SIIG_2S_10x (PCI_DEVICE_ID_SIIG_2S_10x_550 & 0xfff8)
460 : :
461 : : static int pci_siig10x_init(struct pci_dev *dev)
462 : : {
463 : : u16 data;
464 : : void __iomem *p;
465 : :
466 : : switch (dev->device & 0xfff8) {
467 : : case PCI_DEVICE_ID_SIIG_1S_10x: /* 1S */
468 : : data = 0xffdf;
469 : : break;
470 : : case PCI_DEVICE_ID_SIIG_2S_10x: /* 2S, 2S1P */
471 : : data = 0xf7ff;
472 : : break;
473 : : default: /* 1S1P, 4S */
474 : : data = 0xfffb;
475 : : break;
476 : : }
477 : :
478 : : p = ioremap(pci_resource_start(dev, 0), 0x80);
479 : : if (p == NULL)
480 : : return -ENOMEM;
481 : :
482 : : writew(readw(p + 0x28) & data, p + 0x28);
483 : : readw(p + 0x28);
484 : : iounmap(p);
485 : : return 0;
486 : : }
487 : :
488 : : #define PCI_DEVICE_ID_SIIG_2S_20x (PCI_DEVICE_ID_SIIG_2S_20x_550 & 0xfffc)
489 : : #define PCI_DEVICE_ID_SIIG_2S1P_20x (PCI_DEVICE_ID_SIIG_2S1P_20x_550 & 0xfffc)
490 : :
491 : 0 : static int pci_siig20x_init(struct pci_dev *dev)
492 : : {
493 : 0 : u8 data;
494 : :
495 : : /* Change clock frequency for the first UART. */
496 : 0 : pci_read_config_byte(dev, 0x6f, &data);
497 : 0 : pci_write_config_byte(dev, 0x6f, data & 0xef);
498 : :
499 : : /* If this card has 2 UART, we have to do the same with second UART. */
500 [ # # ]: 0 : if (((dev->device & 0xfffc) == PCI_DEVICE_ID_SIIG_2S_20x) ||
501 : : ((dev->device & 0xfffc) == PCI_DEVICE_ID_SIIG_2S1P_20x)) {
502 : 0 : pci_read_config_byte(dev, 0x73, &data);
503 : 0 : pci_write_config_byte(dev, 0x73, data & 0xef);
504 : : }
505 : 0 : return 0;
506 : : }
507 : :
508 : 0 : static int pci_siig_init(struct pci_dev *dev)
509 : : {
510 : 0 : unsigned int type = dev->device & 0xff00;
511 : :
512 [ # # ]: 0 : if (type == 0x1000)
513 : 0 : return pci_siig10x_init(dev);
514 [ # # ]: 0 : else if (type == 0x2000)
515 : 0 : return pci_siig20x_init(dev);
516 : :
517 : 0 : moan_device("Unknown SIIG card", dev);
518 : 0 : return -ENODEV;
519 : : }
520 : :
521 : 0 : static int pci_siig_setup(struct serial_private *priv,
522 : : const struct pciserial_board *board,
523 : : struct uart_8250_port *port, int idx)
524 : : {
525 : 0 : unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0;
526 : :
527 [ # # ]: 0 : if (idx > 3) {
528 : 0 : bar = 4;
529 : 0 : offset = (idx - 4) * 8;
530 : : }
531 : :
532 : 0 : return setup_port(priv, port, bar, offset, 0);
533 : : }
534 : :
535 : : /*
536 : : * Timedia has an explosion of boards, and to avoid the PCI table from
537 : : * growing *huge*, we use this function to collapse some 70 entries
538 : : * in the PCI table into one, for sanity's and compactness's sake.
539 : : */
540 : : static const unsigned short timedia_single_port[] = {
541 : : 0x4025, 0x4027, 0x4028, 0x5025, 0x5027, 0
542 : : };
543 : :
544 : : static const unsigned short timedia_dual_port[] = {
545 : : 0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
546 : : 0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
547 : : 0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
548 : : 0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
549 : : 0xD079, 0
550 : : };
551 : :
552 : : static const unsigned short timedia_quad_port[] = {
553 : : 0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
554 : : 0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
555 : : 0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
556 : : 0xB157, 0
557 : : };
558 : :
559 : : static const unsigned short timedia_eight_port[] = {
560 : : 0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
561 : : 0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
562 : : };
563 : :
564 : : static const struct timedia_struct {
565 : : int num;
566 : : const unsigned short *ids;
567 : : } timedia_data[] = {
568 : : { 1, timedia_single_port },
569 : : { 2, timedia_dual_port },
570 : : { 4, timedia_quad_port },
571 : : { 8, timedia_eight_port }
572 : : };
573 : :
574 : : /*
575 : : * There are nearly 70 different Timedia/SUNIX PCI serial devices. Instead of
576 : : * listing them individually, this driver merely grabs them all with
577 : : * PCI_ANY_ID. Some of these devices, however, also feature a parallel port,
578 : : * and should be left free to be claimed by parport_serial instead.
579 : : */
580 : 0 : static int pci_timedia_probe(struct pci_dev *dev)
581 : : {
582 : : /*
583 : : * Check the third digit of the subdevice ID
584 : : * (0,2,3,5,6: serial only -- 7,8,9: serial + parallel)
585 : : */
586 [ # # ]: 0 : if ((dev->subsystem_device & 0x00f0) >= 0x70) {
587 : 0 : dev_info(&dev->dev,
588 : : "ignoring Timedia subdevice %04x for parport_serial\n",
589 : : dev->subsystem_device);
590 : 0 : return -ENODEV;
591 : : }
592 : :
593 : : return 0;
594 : : }
595 : :
596 : 0 : static int pci_timedia_init(struct pci_dev *dev)
597 : : {
598 : 0 : const unsigned short *ids;
599 : 0 : int i, j;
600 : :
601 [ # # ]: 0 : for (i = 0; i < ARRAY_SIZE(timedia_data); i++) {
602 : 0 : ids = timedia_data[i].ids;
603 [ # # ]: 0 : for (j = 0; ids[j]; j++)
604 [ # # ]: 0 : if (dev->subsystem_device == ids[j])
605 : 0 : return timedia_data[i].num;
606 : : }
607 : : return 0;
608 : : }
609 : :
610 : : /*
611 : : * Timedia/SUNIX uses a mixture of BARs and offsets
612 : : * Ugh, this is ugly as all hell --- TYT
613 : : */
614 : : static int
615 : 0 : pci_timedia_setup(struct serial_private *priv,
616 : : const struct pciserial_board *board,
617 : : struct uart_8250_port *port, int idx)
618 : : {
619 : 0 : unsigned int bar = 0, offset = board->first_offset;
620 : :
621 [ # # # # : 0 : switch (idx) {
# ]
622 : : case 0:
623 : : bar = 0;
624 : : break;
625 : 0 : case 1:
626 : 0 : offset = board->uart_offset;
627 : 0 : bar = 0;
628 : 0 : break;
629 : 0 : case 2:
630 : 0 : bar = 1;
631 : 0 : break;
632 : 0 : case 3:
633 : 0 : offset = board->uart_offset;
634 : : /* FALLTHROUGH */
635 : 0 : case 4: /* BAR 2 */
636 : : case 5: /* BAR 3 */
637 : : case 6: /* BAR 4 */
638 : : case 7: /* BAR 5 */
639 : 0 : bar = idx - 2;
640 : : }
641 : :
642 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
643 : : }
644 : :
645 : : /*
646 : : * Some Titan cards are also a little weird
647 : : */
648 : : static int
649 : 0 : titan_400l_800l_setup(struct serial_private *priv,
650 : : const struct pciserial_board *board,
651 : : struct uart_8250_port *port, int idx)
652 : : {
653 : 0 : unsigned int bar, offset = board->first_offset;
654 : :
655 [ # # # ]: 0 : switch (idx) {
656 : : case 0:
657 : : bar = 1;
658 : : break;
659 : 0 : case 1:
660 : 0 : bar = 2;
661 : 0 : break;
662 : 0 : default:
663 : 0 : bar = 4;
664 : 0 : offset = (idx - 2) * board->uart_offset;
665 : : }
666 : :
667 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
668 : : }
669 : :
670 : 0 : static int pci_xircom_init(struct pci_dev *dev)
671 : : {
672 : 0 : msleep(100);
673 : 0 : return 0;
674 : : }
675 : :
676 : 0 : static int pci_ni8420_init(struct pci_dev *dev)
677 : : {
678 : 0 : void __iomem *p;
679 : 0 : unsigned int bar = 0;
680 : :
681 [ # # ]: 0 : if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
682 : 0 : moan_device("no memory in bar", dev);
683 : 0 : return 0;
684 : : }
685 : :
686 : 0 : p = pci_ioremap_bar(dev, bar);
687 [ # # ]: 0 : if (p == NULL)
688 : : return -ENOMEM;
689 : :
690 : : /* Enable CPU Interrupt */
691 : 0 : writel(readl(p + NI8420_INT_ENABLE_REG) | NI8420_INT_ENABLE_BIT,
692 : 0 : p + NI8420_INT_ENABLE_REG);
693 : :
694 : 0 : iounmap(p);
695 : 0 : return 0;
696 : : }
697 : :
698 : : #define MITE_IOWBSR1_WSIZE 0xa
699 : : #define MITE_IOWBSR1_WIN_OFFSET 0x800
700 : : #define MITE_IOWBSR1_WENAB (1 << 7)
701 : : #define MITE_LCIMR1_IO_IE_0 (1 << 24)
702 : : #define MITE_LCIMR2_SET_CPU_IE (1 << 31)
703 : : #define MITE_IOWCR1_RAMSEL_MASK 0xfffffffe
704 : :
705 : 0 : static int pci_ni8430_init(struct pci_dev *dev)
706 : : {
707 : 0 : void __iomem *p;
708 : 0 : struct pci_bus_region region;
709 : 0 : u32 device_window;
710 : 0 : unsigned int bar = 0;
711 : :
712 [ # # ]: 0 : if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
713 : 0 : moan_device("no memory in bar", dev);
714 : 0 : return 0;
715 : : }
716 : :
717 : 0 : p = pci_ioremap_bar(dev, bar);
718 [ # # ]: 0 : if (p == NULL)
719 : : return -ENOMEM;
720 : :
721 : : /*
722 : : * Set device window address and size in BAR0, while acknowledging that
723 : : * the resource structure may contain a translated address that differs
724 : : * from the address the device responds to.
725 : : */
726 : 0 : pcibios_resource_to_bus(dev->bus, ®ion, &dev->resource[bar]);
727 : 0 : device_window = ((region.start + MITE_IOWBSR1_WIN_OFFSET) & 0xffffff00)
728 : : | MITE_IOWBSR1_WENAB | MITE_IOWBSR1_WSIZE;
729 : 0 : writel(device_window, p + MITE_IOWBSR1);
730 : :
731 : : /* Set window access to go to RAMSEL IO address space */
732 : 0 : writel((readl(p + MITE_IOWCR1) & MITE_IOWCR1_RAMSEL_MASK),
733 : 0 : p + MITE_IOWCR1);
734 : :
735 : : /* Enable IO Bus Interrupt 0 */
736 : 0 : writel(MITE_LCIMR1_IO_IE_0, p + MITE_LCIMR1);
737 : :
738 : : /* Enable CPU Interrupt */
739 : 0 : writel(MITE_LCIMR2_SET_CPU_IE, p + MITE_LCIMR2);
740 : :
741 : 0 : iounmap(p);
742 : 0 : return 0;
743 : : }
744 : :
745 : : /* UART Port Control Register */
746 : : #define NI8430_PORTCON 0x0f
747 : : #define NI8430_PORTCON_TXVR_ENABLE (1 << 3)
748 : :
749 : : static int
750 : 0 : pci_ni8430_setup(struct serial_private *priv,
751 : : const struct pciserial_board *board,
752 : : struct uart_8250_port *port, int idx)
753 : : {
754 : 0 : struct pci_dev *dev = priv->dev;
755 : 0 : void __iomem *p;
756 : 0 : unsigned int bar, offset = board->first_offset;
757 : :
758 [ # # ]: 0 : if (idx >= board->num_ports)
759 : : return 1;
760 : :
761 : 0 : bar = FL_GET_BASE(board->flags);
762 : 0 : offset += idx * board->uart_offset;
763 : :
764 : 0 : p = pci_ioremap_bar(dev, bar);
765 [ # # ]: 0 : if (!p)
766 : : return -ENOMEM;
767 : :
768 : : /* enable the transceiver */
769 : 0 : writeb(readb(p + offset + NI8430_PORTCON) | NI8430_PORTCON_TXVR_ENABLE,
770 : 0 : p + offset + NI8430_PORTCON);
771 : :
772 : 0 : iounmap(p);
773 : :
774 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
775 : : }
776 : :
777 : 0 : static int pci_netmos_9900_setup(struct serial_private *priv,
778 : : const struct pciserial_board *board,
779 : : struct uart_8250_port *port, int idx)
780 : : {
781 : 0 : unsigned int bar;
782 : :
783 [ # # ]: 0 : if ((priv->dev->device != PCI_DEVICE_ID_NETMOS_9865) &&
784 [ # # ]: 0 : (priv->dev->subsystem_device & 0xff00) == 0x3000) {
785 : : /* netmos apparently orders BARs by datasheet layout, so serial
786 : : * ports get BARs 0 and 3 (or 1 and 4 for memmapped)
787 : : */
788 : 0 : bar = 3 * idx;
789 : :
790 : 0 : return setup_port(priv, port, bar, 0, board->reg_shift);
791 : : } else {
792 : 0 : return pci_default_setup(priv, board, port, idx);
793 : : }
794 : : }
795 : :
796 : : /* the 99xx series comes with a range of device IDs and a variety
797 : : * of capabilities:
798 : : *
799 : : * 9900 has varying capabilities and can cascade to sub-controllers
800 : : * (cascading should be purely internal)
801 : : * 9904 is hardwired with 4 serial ports
802 : : * 9912 and 9922 are hardwired with 2 serial ports
803 : : */
804 : 0 : static int pci_netmos_9900_numports(struct pci_dev *dev)
805 : : {
806 : 0 : unsigned int c = dev->class;
807 : 0 : unsigned int pi;
808 : 0 : unsigned short sub_serports;
809 : :
810 : 0 : pi = c & 0xff;
811 : :
812 [ # # ]: 0 : if (pi == 2)
813 : : return 1;
814 : :
815 [ # # # # ]: 0 : if ((pi == 0) && (dev->device == PCI_DEVICE_ID_NETMOS_9900)) {
816 : : /* two possibilities: 0x30ps encodes number of parallel and
817 : : * serial ports, or 0x1000 indicates *something*. This is not
818 : : * immediately obvious, since the 2s1p+4s configuration seems
819 : : * to offer all functionality on functions 0..2, while still
820 : : * advertising the same function 3 as the 4s+2s1p config.
821 : : */
822 : 0 : sub_serports = dev->subsystem_device & 0xf;
823 [ # # ]: 0 : if (sub_serports > 0)
824 : 0 : return sub_serports;
825 : :
826 : 0 : dev_err(&dev->dev,
827 : : "NetMos/Mostech serial driver ignoring port on ambiguous config.\n");
828 : 0 : return 0;
829 : : }
830 : :
831 : 0 : moan_device("unknown NetMos/Mostech program interface", dev);
832 : 0 : return 0;
833 : : }
834 : :
835 : 0 : static int pci_netmos_init(struct pci_dev *dev)
836 : : {
837 : : /* subdevice 0x00PS means <P> parallel, <S> serial */
838 : 0 : unsigned int num_serial = dev->subsystem_device & 0xf;
839 : :
840 [ # # ]: 0 : if ((dev->device == PCI_DEVICE_ID_NETMOS_9901) ||
841 : : (dev->device == PCI_DEVICE_ID_NETMOS_9865))
842 : : return 0;
843 : :
844 [ # # ]: 0 : if (dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
845 : : dev->subsystem_device == 0x0299)
846 : : return 0;
847 : :
848 [ # # ]: 0 : switch (dev->device) { /* FALLTHROUGH on all */
849 : 0 : case PCI_DEVICE_ID_NETMOS_9904:
850 : : case PCI_DEVICE_ID_NETMOS_9912:
851 : : case PCI_DEVICE_ID_NETMOS_9922:
852 : : case PCI_DEVICE_ID_NETMOS_9900:
853 : 0 : num_serial = pci_netmos_9900_numports(dev);
854 : 0 : break;
855 : :
856 : : default:
857 : : break;
858 : : }
859 : :
860 [ # # ]: 0 : if (num_serial == 0) {
861 : 0 : moan_device("unknown NetMos/Mostech device", dev);
862 : 0 : return -ENODEV;
863 : : }
864 : :
865 : 0 : return num_serial;
866 : : }
867 : :
868 : : /*
869 : : * These chips are available with optionally one parallel port and up to
870 : : * two serial ports. Unfortunately they all have the same product id.
871 : : *
872 : : * Basic configuration is done over a region of 32 I/O ports. The base
873 : : * ioport is called INTA or INTC, depending on docs/other drivers.
874 : : *
875 : : * The region of the 32 I/O ports is configured in POSIO0R...
876 : : */
877 : :
878 : : /* registers */
879 : : #define ITE_887x_MISCR 0x9c
880 : : #define ITE_887x_INTCBAR 0x78
881 : : #define ITE_887x_UARTBAR 0x7c
882 : : #define ITE_887x_PS0BAR 0x10
883 : : #define ITE_887x_POSIO0 0x60
884 : :
885 : : /* I/O space size */
886 : : #define ITE_887x_IOSIZE 32
887 : : /* I/O space size (bits 26-24; 8 bytes = 011b) */
888 : : #define ITE_887x_POSIO_IOSIZE_8 (3 << 24)
889 : : /* I/O space size (bits 26-24; 32 bytes = 101b) */
890 : : #define ITE_887x_POSIO_IOSIZE_32 (5 << 24)
891 : : /* Decoding speed (1 = slow, 2 = medium, 3 = fast) */
892 : : #define ITE_887x_POSIO_SPEED (3 << 29)
893 : : /* enable IO_Space bit */
894 : : #define ITE_887x_POSIO_ENABLE (1 << 31)
895 : :
896 : 0 : static int pci_ite887x_init(struct pci_dev *dev)
897 : : {
898 : : /* inta_addr are the configuration addresses of the ITE */
899 : 0 : static const short inta_addr[] = { 0x2a0, 0x2c0, 0x220, 0x240, 0x1e0,
900 : : 0x200, 0x280, 0 };
901 : 0 : int ret, i, type;
902 : 0 : struct resource *iobase = NULL;
903 : 0 : u32 miscr, uartbar, ioport;
904 : :
905 : : /* search for the base-ioport */
906 : 0 : i = 0;
907 [ # # # # ]: 0 : while (inta_addr[i] && iobase == NULL) {
908 : 0 : iobase = request_region(inta_addr[i], ITE_887x_IOSIZE,
909 : : "ite887x");
910 [ # # ]: 0 : if (iobase != NULL) {
911 : : /* write POSIO0R - speed | size | ioport */
912 : 0 : pci_write_config_dword(dev, ITE_887x_POSIO0,
913 : : ITE_887x_POSIO_ENABLE | ITE_887x_POSIO_SPEED |
914 : 0 : ITE_887x_POSIO_IOSIZE_32 | inta_addr[i]);
915 : : /* write INTCBAR - ioport */
916 : 0 : pci_write_config_dword(dev, ITE_887x_INTCBAR,
917 : : inta_addr[i]);
918 : 0 : ret = inb(inta_addr[i]);
919 [ # # ]: 0 : if (ret != 0xff) {
920 : : /* ioport connected */
921 : : break;
922 : : }
923 : 0 : release_region(iobase->start, ITE_887x_IOSIZE);
924 : 0 : iobase = NULL;
925 : : }
926 : 0 : i++;
927 : : }
928 : :
929 [ # # ]: 0 : if (!inta_addr[i]) {
930 : 0 : dev_err(&dev->dev, "ite887x: could not find iobase\n");
931 : 0 : return -ENODEV;
932 : : }
933 : :
934 : : /* start of undocumented type checking (see parport_pc.c) */
935 : 0 : type = inb(iobase->start + 0x18) & 0x0f;
936 : :
937 [ # # # # : 0 : switch (type) {
# ]
938 : : case 0x2: /* ITE8871 (1P) */
939 : : case 0xa: /* ITE8875 (1P) */
940 : : ret = 0;
941 : : break;
942 : 0 : case 0xe: /* ITE8872 (2S1P) */
943 : 0 : ret = 2;
944 : 0 : break;
945 : 0 : case 0x6: /* ITE8873 (1S) */
946 : 0 : ret = 1;
947 : 0 : break;
948 : 0 : case 0x8: /* ITE8874 (2S) */
949 : 0 : ret = 2;
950 : 0 : break;
951 : 0 : default:
952 : 0 : moan_device("Unknown ITE887x", dev);
953 : 0 : ret = -ENODEV;
954 : : }
955 : :
956 : : /* configure all serial ports */
957 [ # # ]: 0 : for (i = 0; i < ret; i++) {
958 : : /* read the I/O port from the device */
959 : 0 : pci_read_config_dword(dev, ITE_887x_PS0BAR + (0x4 * (i + 1)),
960 : : &ioport);
961 : 0 : ioport &= 0x0000FF00; /* the actual base address */
962 : 0 : pci_write_config_dword(dev, ITE_887x_POSIO0 + (0x4 * (i + 1)),
963 : : ITE_887x_POSIO_ENABLE | ITE_887x_POSIO_SPEED |
964 : : ITE_887x_POSIO_IOSIZE_8 | ioport);
965 : :
966 : : /* write the ioport to the UARTBAR */
967 : 0 : pci_read_config_dword(dev, ITE_887x_UARTBAR, &uartbar);
968 : 0 : uartbar &= ~(0xffff << (16 * i)); /* clear half the reg */
969 : 0 : uartbar |= (ioport << (16 * i)); /* set the ioport */
970 : 0 : pci_write_config_dword(dev, ITE_887x_UARTBAR, uartbar);
971 : :
972 : : /* get current config */
973 : 0 : pci_read_config_dword(dev, ITE_887x_MISCR, &miscr);
974 : : /* disable interrupts (UARTx_Routing[3:0]) */
975 : 0 : miscr &= ~(0xf << (12 - 4 * i));
976 : : /* activate the UART (UARTx_En) */
977 : 0 : miscr |= 1 << (23 - i);
978 : : /* write new config with activated UART */
979 : 0 : pci_write_config_dword(dev, ITE_887x_MISCR, miscr);
980 : : }
981 : :
982 [ # # ]: 0 : if (ret <= 0) {
983 : : /* the device has no UARTs if we get here */
984 : 0 : release_region(iobase->start, ITE_887x_IOSIZE);
985 : : }
986 : :
987 : : return ret;
988 : : }
989 : :
990 : 0 : static void pci_ite887x_exit(struct pci_dev *dev)
991 : : {
992 : 0 : u32 ioport;
993 : : /* the ioport is bit 0-15 in POSIO0R */
994 : 0 : pci_read_config_dword(dev, ITE_887x_POSIO0, &ioport);
995 : 0 : ioport &= 0xffff;
996 : 0 : release_region(ioport, ITE_887x_IOSIZE);
997 : 0 : }
998 : :
999 : : /*
1000 : : * EndRun Technologies.
1001 : : * Determine the number of ports available on the device.
1002 : : */
1003 : : #define PCI_VENDOR_ID_ENDRUN 0x7401
1004 : : #define PCI_DEVICE_ID_ENDRUN_1588 0xe100
1005 : :
1006 : 0 : static int pci_endrun_init(struct pci_dev *dev)
1007 : : {
1008 : 0 : u8 __iomem *p;
1009 : 0 : unsigned long deviceID;
1010 : 0 : unsigned int number_uarts = 0;
1011 : :
1012 : : /* EndRun device is all 0xexxx */
1013 [ # # ]: 0 : if (dev->vendor == PCI_VENDOR_ID_ENDRUN &&
1014 [ # # ]: 0 : (dev->device & 0xf000) != 0xe000)
1015 : : return 0;
1016 : :
1017 : 0 : p = pci_iomap(dev, 0, 5);
1018 [ # # ]: 0 : if (p == NULL)
1019 : : return -ENOMEM;
1020 : :
1021 : 0 : deviceID = ioread32(p);
1022 : : /* EndRun device */
1023 [ # # ]: 0 : if (deviceID == 0x07000200) {
1024 : 0 : number_uarts = ioread8(p + 4);
1025 : 0 : dev_dbg(&dev->dev,
1026 : : "%d ports detected on EndRun PCI Express device\n",
1027 : : number_uarts);
1028 : : }
1029 : 0 : pci_iounmap(dev, p);
1030 : 0 : return number_uarts;
1031 : : }
1032 : :
1033 : : /*
1034 : : * Oxford Semiconductor Inc.
1035 : : * Check that device is part of the Tornado range of devices, then determine
1036 : : * the number of ports available on the device.
1037 : : */
1038 : 0 : static int pci_oxsemi_tornado_init(struct pci_dev *dev)
1039 : : {
1040 : 0 : u8 __iomem *p;
1041 : 0 : unsigned long deviceID;
1042 : 0 : unsigned int number_uarts = 0;
1043 : :
1044 : : /* OxSemi Tornado devices are all 0xCxxx */
1045 [ # # ]: 0 : if (dev->vendor == PCI_VENDOR_ID_OXSEMI &&
1046 [ # # ]: 0 : (dev->device & 0xF000) != 0xC000)
1047 : : return 0;
1048 : :
1049 : 0 : p = pci_iomap(dev, 0, 5);
1050 [ # # ]: 0 : if (p == NULL)
1051 : : return -ENOMEM;
1052 : :
1053 : 0 : deviceID = ioread32(p);
1054 : : /* Tornado device */
1055 [ # # ]: 0 : if (deviceID == 0x07000200) {
1056 : 0 : number_uarts = ioread8(p + 4);
1057 : 0 : dev_dbg(&dev->dev,
1058 : : "%d ports detected on Oxford PCI Express device\n",
1059 : : number_uarts);
1060 : : }
1061 : 0 : pci_iounmap(dev, p);
1062 : 0 : return number_uarts;
1063 : : }
1064 : :
1065 : 0 : static int pci_asix_setup(struct serial_private *priv,
1066 : : const struct pciserial_board *board,
1067 : : struct uart_8250_port *port, int idx)
1068 : : {
1069 : 0 : port->bugs |= UART_BUG_PARITY;
1070 : 0 : return pci_default_setup(priv, board, port, idx);
1071 : : }
1072 : :
1073 : : /* Quatech devices have their own extra interface features */
1074 : :
1075 : : struct quatech_feature {
1076 : : u16 devid;
1077 : : bool amcc;
1078 : : };
1079 : :
1080 : : #define QPCR_TEST_FOR1 0x3F
1081 : : #define QPCR_TEST_GET1 0x00
1082 : : #define QPCR_TEST_FOR2 0x40
1083 : : #define QPCR_TEST_GET2 0x40
1084 : : #define QPCR_TEST_FOR3 0x80
1085 : : #define QPCR_TEST_GET3 0x40
1086 : : #define QPCR_TEST_FOR4 0xC0
1087 : : #define QPCR_TEST_GET4 0x80
1088 : :
1089 : : #define QOPR_CLOCK_X1 0x0000
1090 : : #define QOPR_CLOCK_X2 0x0001
1091 : : #define QOPR_CLOCK_X4 0x0002
1092 : : #define QOPR_CLOCK_X8 0x0003
1093 : : #define QOPR_CLOCK_RATE_MASK 0x0003
1094 : :
1095 : :
1096 : : static struct quatech_feature quatech_cards[] = {
1097 : : { PCI_DEVICE_ID_QUATECH_QSC100, 1 },
1098 : : { PCI_DEVICE_ID_QUATECH_DSC100, 1 },
1099 : : { PCI_DEVICE_ID_QUATECH_DSC100E, 0 },
1100 : : { PCI_DEVICE_ID_QUATECH_DSC200, 1 },
1101 : : { PCI_DEVICE_ID_QUATECH_DSC200E, 0 },
1102 : : { PCI_DEVICE_ID_QUATECH_ESC100D, 1 },
1103 : : { PCI_DEVICE_ID_QUATECH_ESC100M, 1 },
1104 : : { PCI_DEVICE_ID_QUATECH_QSCP100, 1 },
1105 : : { PCI_DEVICE_ID_QUATECH_DSCP100, 1 },
1106 : : { PCI_DEVICE_ID_QUATECH_QSCP200, 1 },
1107 : : { PCI_DEVICE_ID_QUATECH_DSCP200, 1 },
1108 : : { PCI_DEVICE_ID_QUATECH_ESCLP100, 0 },
1109 : : { PCI_DEVICE_ID_QUATECH_QSCLP100, 0 },
1110 : : { PCI_DEVICE_ID_QUATECH_DSCLP100, 0 },
1111 : : { PCI_DEVICE_ID_QUATECH_SSCLP100, 0 },
1112 : : { PCI_DEVICE_ID_QUATECH_QSCLP200, 0 },
1113 : : { PCI_DEVICE_ID_QUATECH_DSCLP200, 0 },
1114 : : { PCI_DEVICE_ID_QUATECH_SSCLP200, 0 },
1115 : : { PCI_DEVICE_ID_QUATECH_SPPXP_100, 0 },
1116 : : { 0, }
1117 : : };
1118 : :
1119 : 0 : static int pci_quatech_amcc(u16 devid)
1120 : : {
1121 : 0 : struct quatech_feature *qf = &quatech_cards[0];
1122 [ # # ]: 0 : while (qf->devid) {
1123 [ # # ]: 0 : if (qf->devid == devid)
1124 : 0 : return qf->amcc;
1125 : 0 : qf++;
1126 : : }
1127 : 0 : pr_err("quatech: unknown port type '0x%04X'.\n", devid);
1128 : 0 : return 0;
1129 : : };
1130 : :
1131 : 0 : static int pci_quatech_rqopr(struct uart_8250_port *port)
1132 : : {
1133 : 0 : unsigned long base = port->port.iobase;
1134 : 0 : u8 LCR, val;
1135 : :
1136 : 0 : LCR = inb(base + UART_LCR);
1137 : 0 : outb(0xBF, base + UART_LCR);
1138 : 0 : val = inb(base + UART_SCR);
1139 : 0 : outb(LCR, base + UART_LCR);
1140 : 0 : return val;
1141 : : }
1142 : :
1143 : 0 : static void pci_quatech_wqopr(struct uart_8250_port *port, u8 qopr)
1144 : : {
1145 : 0 : unsigned long base = port->port.iobase;
1146 : 0 : u8 LCR;
1147 : :
1148 : 0 : LCR = inb(base + UART_LCR);
1149 : 0 : outb(0xBF, base + UART_LCR);
1150 : 0 : inb(base + UART_SCR);
1151 : 0 : outb(qopr, base + UART_SCR);
1152 : 0 : outb(LCR, base + UART_LCR);
1153 : : }
1154 : :
1155 : 0 : static int pci_quatech_rqmcr(struct uart_8250_port *port)
1156 : : {
1157 : 0 : unsigned long base = port->port.iobase;
1158 : 0 : u8 LCR, val, qmcr;
1159 : :
1160 : 0 : LCR = inb(base + UART_LCR);
1161 : 0 : outb(0xBF, base + UART_LCR);
1162 : 0 : val = inb(base + UART_SCR);
1163 : 0 : outb(val | 0x10, base + UART_SCR);
1164 : 0 : qmcr = inb(base + UART_MCR);
1165 : 0 : outb(val, base + UART_SCR);
1166 : 0 : outb(LCR, base + UART_LCR);
1167 : :
1168 : 0 : return qmcr;
1169 : : }
1170 : :
1171 : 0 : static void pci_quatech_wqmcr(struct uart_8250_port *port, u8 qmcr)
1172 : : {
1173 : 0 : unsigned long base = port->port.iobase;
1174 : 0 : u8 LCR, val;
1175 : :
1176 : 0 : LCR = inb(base + UART_LCR);
1177 : 0 : outb(0xBF, base + UART_LCR);
1178 : 0 : val = inb(base + UART_SCR);
1179 : 0 : outb(val | 0x10, base + UART_SCR);
1180 : 0 : outb(qmcr, base + UART_MCR);
1181 : 0 : outb(val, base + UART_SCR);
1182 : 0 : outb(LCR, base + UART_LCR);
1183 : : }
1184 : :
1185 : 0 : static int pci_quatech_has_qmcr(struct uart_8250_port *port)
1186 : : {
1187 : 0 : unsigned long base = port->port.iobase;
1188 : 0 : u8 LCR, val;
1189 : :
1190 : 0 : LCR = inb(base + UART_LCR);
1191 : 0 : outb(0xBF, base + UART_LCR);
1192 : 0 : val = inb(base + UART_SCR);
1193 [ # # ]: 0 : if (val & 0x20) {
1194 : 0 : outb(0x80, UART_LCR);
1195 [ # # ]: 0 : if (!(inb(UART_SCR) & 0x20)) {
1196 : 0 : outb(LCR, base + UART_LCR);
1197 : 0 : return 1;
1198 : : }
1199 : : }
1200 : : return 0;
1201 : : }
1202 : :
1203 : 0 : static int pci_quatech_test(struct uart_8250_port *port)
1204 : : {
1205 : 0 : u8 reg, qopr;
1206 : :
1207 : 0 : qopr = pci_quatech_rqopr(port);
1208 : 0 : pci_quatech_wqopr(port, qopr & QPCR_TEST_FOR1);
1209 : 0 : reg = pci_quatech_rqopr(port) & 0xC0;
1210 [ # # ]: 0 : if (reg != QPCR_TEST_GET1)
1211 : : return -EINVAL;
1212 : 0 : pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR2);
1213 : 0 : reg = pci_quatech_rqopr(port) & 0xC0;
1214 [ # # ]: 0 : if (reg != QPCR_TEST_GET2)
1215 : : return -EINVAL;
1216 : 0 : pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR3);
1217 : 0 : reg = pci_quatech_rqopr(port) & 0xC0;
1218 [ # # ]: 0 : if (reg != QPCR_TEST_GET3)
1219 : : return -EINVAL;
1220 : 0 : pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR4);
1221 : 0 : reg = pci_quatech_rqopr(port) & 0xC0;
1222 [ # # ]: 0 : if (reg != QPCR_TEST_GET4)
1223 : : return -EINVAL;
1224 : :
1225 : 0 : pci_quatech_wqopr(port, qopr);
1226 : 0 : return 0;
1227 : : }
1228 : :
1229 : 0 : static int pci_quatech_clock(struct uart_8250_port *port)
1230 : : {
1231 : 0 : u8 qopr, reg, set;
1232 : 0 : unsigned long clock;
1233 : :
1234 [ # # ]: 0 : if (pci_quatech_test(port) < 0)
1235 : : return 1843200;
1236 : :
1237 : 0 : qopr = pci_quatech_rqopr(port);
1238 : :
1239 : 0 : pci_quatech_wqopr(port, qopr & ~QOPR_CLOCK_X8);
1240 : 0 : reg = pci_quatech_rqopr(port);
1241 [ # # ]: 0 : if (reg & QOPR_CLOCK_X8) {
1242 : 0 : clock = 1843200;
1243 : 0 : goto out;
1244 : : }
1245 : 0 : pci_quatech_wqopr(port, qopr | QOPR_CLOCK_X8);
1246 : 0 : reg = pci_quatech_rqopr(port);
1247 [ # # ]: 0 : if (!(reg & QOPR_CLOCK_X8)) {
1248 : 0 : clock = 1843200;
1249 : 0 : goto out;
1250 : : }
1251 : 0 : reg &= QOPR_CLOCK_X8;
1252 [ # # ]: 0 : if (reg == QOPR_CLOCK_X2) {
1253 : : clock = 3685400;
1254 : : set = QOPR_CLOCK_X2;
1255 [ # # ]: 0 : } else if (reg == QOPR_CLOCK_X4) {
1256 : : clock = 7372800;
1257 : : set = QOPR_CLOCK_X4;
1258 : 0 : } else if (reg == QOPR_CLOCK_X8) {
1259 : : clock = 14745600;
1260 : : set = QOPR_CLOCK_X8;
1261 : : } else {
1262 : : clock = 1843200;
1263 : : set = QOPR_CLOCK_X1;
1264 : : }
1265 : 0 : qopr &= ~QOPR_CLOCK_RATE_MASK;
1266 : 0 : qopr |= set;
1267 : :
1268 : 0 : out:
1269 : 0 : pci_quatech_wqopr(port, qopr);
1270 : 0 : return clock;
1271 : : }
1272 : :
1273 : 0 : static int pci_quatech_rs422(struct uart_8250_port *port)
1274 : : {
1275 : 0 : u8 qmcr;
1276 : 0 : int rs422 = 0;
1277 : :
1278 : 0 : if (!pci_quatech_has_qmcr(port))
1279 : : return 0;
1280 : 0 : qmcr = pci_quatech_rqmcr(port);
1281 : 0 : pci_quatech_wqmcr(port, 0xFF);
1282 [ # # ]: 0 : if (pci_quatech_rqmcr(port))
1283 : 0 : rs422 = 1;
1284 : 0 : pci_quatech_wqmcr(port, qmcr);
1285 : 0 : return rs422;
1286 : : }
1287 : :
1288 : 0 : static int pci_quatech_init(struct pci_dev *dev)
1289 : : {
1290 [ # # ]: 0 : if (pci_quatech_amcc(dev->device)) {
1291 : 0 : unsigned long base = pci_resource_start(dev, 0);
1292 [ # # ]: 0 : if (base) {
1293 : 0 : u32 tmp;
1294 : :
1295 : 0 : outl(inl(base + 0x38) | 0x00002000, base + 0x38);
1296 : 0 : tmp = inl(base + 0x3c);
1297 : 0 : outl(tmp | 0x01000000, base + 0x3c);
1298 : 0 : outl(tmp &= ~0x01000000, base + 0x3c);
1299 : : }
1300 : : }
1301 : 0 : return 0;
1302 : : }
1303 : :
1304 : 0 : static int pci_quatech_setup(struct serial_private *priv,
1305 : : const struct pciserial_board *board,
1306 : : struct uart_8250_port *port, int idx)
1307 : : {
1308 : : /* Needed by pci_quatech calls below */
1309 : 0 : port->port.iobase = pci_resource_start(priv->dev, FL_GET_BASE(board->flags));
1310 : : /* Set up the clocking */
1311 : 0 : port->port.uartclk = pci_quatech_clock(port);
1312 : : /* For now just warn about RS422 */
1313 [ # # ]: 0 : if (pci_quatech_rs422(port))
1314 : 0 : pr_warn("quatech: software control of RS422 features not currently supported.\n");
1315 : 0 : return pci_default_setup(priv, board, port, idx);
1316 : : }
1317 : :
1318 : 0 : static void pci_quatech_exit(struct pci_dev *dev)
1319 : : {
1320 : 0 : }
1321 : :
1322 : 0 : static int pci_default_setup(struct serial_private *priv,
1323 : : const struct pciserial_board *board,
1324 : : struct uart_8250_port *port, int idx)
1325 : : {
1326 : 0 : unsigned int bar, offset = board->first_offset, maxnr;
1327 : :
1328 : 0 : bar = FL_GET_BASE(board->flags);
1329 [ # # ]: 0 : if (board->flags & FL_BASE_BARS)
1330 : 0 : bar += idx;
1331 : : else
1332 : 0 : offset += idx * board->uart_offset;
1333 : :
1334 [ # # # # ]: 0 : maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >>
1335 : 0 : (board->reg_shift + 3);
1336 : :
1337 [ # # # # ]: 0 : if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
1338 : : return 1;
1339 : :
1340 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
1341 : : }
1342 : : static void
1343 : 0 : pericom_do_set_divisor(struct uart_port *port, unsigned int baud,
1344 : : unsigned int quot, unsigned int quot_frac)
1345 : : {
1346 : 0 : int scr;
1347 : 0 : int lcr;
1348 : 0 : int actual_baud;
1349 : 0 : int tolerance;
1350 : :
1351 [ # # ]: 0 : for (scr = 5 ; scr <= 15 ; scr++) {
1352 : 0 : actual_baud = 921600 * 16 / scr;
1353 : 0 : tolerance = actual_baud / 50;
1354 : :
1355 [ # # ]: 0 : if ((baud < actual_baud + tolerance) &&
1356 [ # # ]: 0 : (baud > actual_baud - tolerance)) {
1357 : :
1358 : 0 : lcr = serial_port_in(port, UART_LCR);
1359 : 0 : serial_port_out(port, UART_LCR, lcr | 0x80);
1360 : :
1361 : 0 : serial_port_out(port, UART_DLL, 1);
1362 : 0 : serial_port_out(port, UART_DLM, 0);
1363 : 0 : serial_port_out(port, 2, 16 - scr);
1364 : 0 : serial_port_out(port, UART_LCR, lcr);
1365 : 0 : return;
1366 [ # # ]: 0 : } else if (baud > actual_baud) {
1367 : : break;
1368 : : }
1369 : : }
1370 : 0 : serial8250_do_set_divisor(port, baud, quot, quot_frac);
1371 : : }
1372 : 0 : static int pci_pericom_setup(struct serial_private *priv,
1373 : : const struct pciserial_board *board,
1374 : : struct uart_8250_port *port, int idx)
1375 : : {
1376 : 0 : unsigned int bar, offset = board->first_offset, maxnr;
1377 : :
1378 : 0 : bar = FL_GET_BASE(board->flags);
1379 [ # # ]: 0 : if (board->flags & FL_BASE_BARS)
1380 : 0 : bar += idx;
1381 : : else
1382 : 0 : offset += idx * board->uart_offset;
1383 : :
1384 : :
1385 [ # # # # ]: 0 : maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >>
1386 : 0 : (board->reg_shift + 3);
1387 : :
1388 [ # # # # ]: 0 : if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
1389 : : return 1;
1390 : :
1391 : 0 : port->port.set_divisor = pericom_do_set_divisor;
1392 : :
1393 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
1394 : : }
1395 : :
1396 : 0 : static int pci_pericom_setup_four_at_eight(struct serial_private *priv,
1397 : : const struct pciserial_board *board,
1398 : : struct uart_8250_port *port, int idx)
1399 : : {
1400 : 0 : unsigned int bar, offset = board->first_offset, maxnr;
1401 : :
1402 : 0 : bar = FL_GET_BASE(board->flags);
1403 [ # # ]: 0 : if (board->flags & FL_BASE_BARS)
1404 : 0 : bar += idx;
1405 : : else
1406 : 0 : offset += idx * board->uart_offset;
1407 : :
1408 [ # # ]: 0 : if (idx==3)
1409 : 0 : offset = 0x38;
1410 : :
1411 [ # # # # ]: 0 : maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >>
1412 : 0 : (board->reg_shift + 3);
1413 : :
1414 [ # # # # ]: 0 : if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
1415 : : return 1;
1416 : :
1417 : 0 : port->port.set_divisor = pericom_do_set_divisor;
1418 : :
1419 : 0 : return setup_port(priv, port, bar, offset, board->reg_shift);
1420 : : }
1421 : :
1422 : : static int
1423 : 0 : ce4100_serial_setup(struct serial_private *priv,
1424 : : const struct pciserial_board *board,
1425 : : struct uart_8250_port *port, int idx)
1426 : : {
1427 : 0 : int ret;
1428 : :
1429 : 0 : ret = setup_port(priv, port, idx, 0, board->reg_shift);
1430 : 0 : port->port.iotype = UPIO_MEM32;
1431 : 0 : port->port.type = PORT_XSCALE;
1432 : 0 : port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
1433 : 0 : port->port.regshift = 2;
1434 : :
1435 : 0 : return ret;
1436 : : }
1437 : :
1438 : : static int
1439 : 0 : pci_omegapci_setup(struct serial_private *priv,
1440 : : const struct pciserial_board *board,
1441 : : struct uart_8250_port *port, int idx)
1442 : : {
1443 : 0 : return setup_port(priv, port, 2, idx * 8, 0);
1444 : : }
1445 : :
1446 : : static int
1447 : 0 : pci_brcm_trumanage_setup(struct serial_private *priv,
1448 : : const struct pciserial_board *board,
1449 : : struct uart_8250_port *port, int idx)
1450 : : {
1451 : 0 : int ret = pci_default_setup(priv, board, port, idx);
1452 : :
1453 : 0 : port->port.type = PORT_BRCM_TRUMANAGE;
1454 : 0 : port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
1455 : 0 : return ret;
1456 : : }
1457 : :
1458 : : /* RTS will control by MCR if this bit is 0 */
1459 : : #define FINTEK_RTS_CONTROL_BY_HW BIT(4)
1460 : : /* only worked with FINTEK_RTS_CONTROL_BY_HW on */
1461 : : #define FINTEK_RTS_INVERT BIT(5)
1462 : :
1463 : : /* We should do proper H/W transceiver setting before change to RS485 mode */
1464 : 0 : static int pci_fintek_rs485_config(struct uart_port *port,
1465 : : struct serial_rs485 *rs485)
1466 : : {
1467 : 0 : struct pci_dev *pci_dev = to_pci_dev(port->dev);
1468 : 0 : u8 setting;
1469 : 0 : u8 *index = (u8 *) port->private_data;
1470 : :
1471 : 0 : pci_read_config_byte(pci_dev, 0x40 + 8 * *index + 7, &setting);
1472 : :
1473 [ # # ]: 0 : if (!rs485)
1474 : 0 : rs485 = &port->rs485;
1475 [ # # ]: 0 : else if (rs485->flags & SER_RS485_ENABLED)
1476 : 0 : memset(rs485->padding, 0, sizeof(rs485->padding));
1477 : : else
1478 : 0 : memset(rs485, 0, sizeof(*rs485));
1479 : :
1480 : : /* F81504/508/512 not support RTS delay before or after send */
1481 : 0 : rs485->flags &= SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND;
1482 : :
1483 [ # # ]: 0 : if (rs485->flags & SER_RS485_ENABLED) {
1484 : : /* Enable RTS H/W control mode */
1485 : 0 : setting |= FINTEK_RTS_CONTROL_BY_HW;
1486 : :
1487 [ # # ]: 0 : if (rs485->flags & SER_RS485_RTS_ON_SEND) {
1488 : : /* RTS driving high on TX */
1489 : 0 : setting &= ~FINTEK_RTS_INVERT;
1490 : : } else {
1491 : : /* RTS driving low on TX */
1492 : 0 : setting |= FINTEK_RTS_INVERT;
1493 : : }
1494 : :
1495 : 0 : rs485->delay_rts_after_send = 0;
1496 : 0 : rs485->delay_rts_before_send = 0;
1497 : : } else {
1498 : : /* Disable RTS H/W control mode */
1499 : 0 : setting &= ~(FINTEK_RTS_CONTROL_BY_HW | FINTEK_RTS_INVERT);
1500 : : }
1501 : :
1502 : 0 : pci_write_config_byte(pci_dev, 0x40 + 8 * *index + 7, setting);
1503 : :
1504 [ # # ]: 0 : if (rs485 != &port->rs485)
1505 : 0 : port->rs485 = *rs485;
1506 : :
1507 : 0 : return 0;
1508 : : }
1509 : :
1510 : 0 : static int pci_fintek_setup(struct serial_private *priv,
1511 : : const struct pciserial_board *board,
1512 : : struct uart_8250_port *port, int idx)
1513 : : {
1514 : 0 : struct pci_dev *pdev = priv->dev;
1515 : 0 : u8 *data;
1516 : 0 : u8 config_base;
1517 : 0 : u16 iobase;
1518 : :
1519 : 0 : config_base = 0x40 + 0x08 * idx;
1520 : :
1521 : : /* Get the io address from configuration space */
1522 : 0 : pci_read_config_word(pdev, config_base + 4, &iobase);
1523 : :
1524 : 0 : dev_dbg(&pdev->dev, "%s: idx=%d iobase=0x%x", __func__, idx, iobase);
1525 : :
1526 : 0 : port->port.iotype = UPIO_PORT;
1527 : 0 : port->port.iobase = iobase;
1528 : 0 : port->port.rs485_config = pci_fintek_rs485_config;
1529 : :
1530 : 0 : data = devm_kzalloc(&pdev->dev, sizeof(u8), GFP_KERNEL);
1531 [ # # ]: 0 : if (!data)
1532 : : return -ENOMEM;
1533 : :
1534 : : /* preserve index in PCI configuration space */
1535 : 0 : *data = idx;
1536 : 0 : port->port.private_data = data;
1537 : :
1538 : 0 : return 0;
1539 : : }
1540 : :
1541 : 0 : static int pci_fintek_init(struct pci_dev *dev)
1542 : : {
1543 : 0 : unsigned long iobase;
1544 : 0 : u32 max_port, i;
1545 : 0 : resource_size_t bar_data[3];
1546 : 0 : u8 config_base;
1547 [ # # ]: 0 : struct serial_private *priv = pci_get_drvdata(dev);
1548 : 0 : struct uart_8250_port *port;
1549 : :
1550 [ # # ]: 0 : if (!(pci_resource_flags(dev, 5) & IORESOURCE_IO) ||
1551 [ # # ]: 0 : !(pci_resource_flags(dev, 4) & IORESOURCE_IO) ||
1552 [ # # ]: 0 : !(pci_resource_flags(dev, 3) & IORESOURCE_IO))
1553 : : return -ENODEV;
1554 : :
1555 [ # # # ]: 0 : switch (dev->device) {
1556 : 0 : case 0x1104: /* 4 ports */
1557 : : case 0x1108: /* 8 ports */
1558 : 0 : max_port = dev->device & 0xff;
1559 : 0 : break;
1560 : : case 0x1112: /* 12 ports */
1561 : : max_port = 12;
1562 : : break;
1563 : : default:
1564 : : return -EINVAL;
1565 : : }
1566 : :
1567 : : /* Get the io address dispatch from the BIOS */
1568 : 0 : bar_data[0] = pci_resource_start(dev, 5);
1569 : 0 : bar_data[1] = pci_resource_start(dev, 4);
1570 : 0 : bar_data[2] = pci_resource_start(dev, 3);
1571 : :
1572 [ # # ]: 0 : for (i = 0; i < max_port; ++i) {
1573 : : /* UART0 configuration offset start from 0x40 */
1574 : 0 : config_base = 0x40 + 0x08 * i;
1575 : :
1576 : : /* Calculate Real IO Port */
1577 : 0 : iobase = (bar_data[i / 4] & 0xffffffe0) + (i % 4) * 8;
1578 : :
1579 : : /* Enable UART I/O port */
1580 : 0 : pci_write_config_byte(dev, config_base + 0x00, 0x01);
1581 : :
1582 : : /* Select 128-byte FIFO and 8x FIFO threshold */
1583 : 0 : pci_write_config_byte(dev, config_base + 0x01, 0x33);
1584 : :
1585 : : /* LSB UART */
1586 : 0 : pci_write_config_byte(dev, config_base + 0x04,
1587 : 0 : (u8)(iobase & 0xff));
1588 : :
1589 : : /* MSB UART */
1590 : 0 : pci_write_config_byte(dev, config_base + 0x05,
1591 : 0 : (u8)((iobase & 0xff00) >> 8));
1592 : :
1593 : 0 : pci_write_config_byte(dev, config_base + 0x06, dev->irq);
1594 : :
1595 [ # # ]: 0 : if (priv) {
1596 : : /* re-apply RS232/485 mode when
1597 : : * pciserial_resume_ports()
1598 : : */
1599 : 0 : port = serial8250_get_port(priv->line[i]);
1600 : 0 : pci_fintek_rs485_config(&port->port, NULL);
1601 : : } else {
1602 : : /* First init without port data
1603 : : * force init to RS232 Mode
1604 : : */
1605 : 0 : pci_write_config_byte(dev, config_base + 0x07, 0x01);
1606 : : }
1607 : : }
1608 : :
1609 : 0 : return max_port;
1610 : : }
1611 : :
1612 : 0 : static void f815xxa_mem_serial_out(struct uart_port *p, int offset, int value)
1613 : : {
1614 : 0 : struct f815xxa_data *data = p->private_data;
1615 : 0 : unsigned long flags;
1616 : :
1617 : 0 : spin_lock_irqsave(&data->lock, flags);
1618 : 0 : writeb(value, p->membase + offset);
1619 : 0 : readb(p->membase + UART_SCR); /* Dummy read for flush pcie tx queue */
1620 : 0 : spin_unlock_irqrestore(&data->lock, flags);
1621 : 0 : }
1622 : :
1623 : 0 : static int pci_fintek_f815xxa_setup(struct serial_private *priv,
1624 : : const struct pciserial_board *board,
1625 : : struct uart_8250_port *port, int idx)
1626 : : {
1627 : 0 : struct pci_dev *pdev = priv->dev;
1628 : 0 : struct f815xxa_data *data;
1629 : :
1630 : 0 : data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
1631 [ # # ]: 0 : if (!data)
1632 : : return -ENOMEM;
1633 : :
1634 : 0 : data->idx = idx;
1635 : 0 : spin_lock_init(&data->lock);
1636 : :
1637 : 0 : port->port.private_data = data;
1638 : 0 : port->port.iotype = UPIO_MEM;
1639 : 0 : port->port.flags |= UPF_IOREMAP;
1640 : 0 : port->port.mapbase = pci_resource_start(pdev, 0) + 8 * idx;
1641 : 0 : port->port.serial_out = f815xxa_mem_serial_out;
1642 : :
1643 : 0 : return 0;
1644 : : }
1645 : :
1646 : 0 : static int pci_fintek_f815xxa_init(struct pci_dev *dev)
1647 : : {
1648 : 0 : u32 max_port, i;
1649 : 0 : int config_base;
1650 : :
1651 [ # # ]: 0 : if (!(pci_resource_flags(dev, 0) & IORESOURCE_MEM))
1652 : : return -ENODEV;
1653 : :
1654 [ # # # ]: 0 : switch (dev->device) {
1655 : 0 : case 0x1204: /* 4 ports */
1656 : : case 0x1208: /* 8 ports */
1657 : 0 : max_port = dev->device & 0xff;
1658 : 0 : break;
1659 : : case 0x1212: /* 12 ports */
1660 : : max_port = 12;
1661 : : break;
1662 : : default:
1663 : : return -EINVAL;
1664 : : }
1665 : :
1666 : : /* Set to mmio decode */
1667 : 0 : pci_write_config_byte(dev, 0x209, 0x40);
1668 : :
1669 [ # # ]: 0 : for (i = 0; i < max_port; ++i) {
1670 : : /* UART0 configuration offset start from 0x2A0 */
1671 : 0 : config_base = 0x2A0 + 0x08 * i;
1672 : :
1673 : : /* Select 128-byte FIFO and 8x FIFO threshold */
1674 : 0 : pci_write_config_byte(dev, config_base + 0x01, 0x33);
1675 : :
1676 : : /* Enable UART I/O port */
1677 : 0 : pci_write_config_byte(dev, config_base + 0, 0x01);
1678 : : }
1679 : :
1680 : 0 : return max_port;
1681 : : }
1682 : :
1683 : 0 : static int skip_tx_en_setup(struct serial_private *priv,
1684 : : const struct pciserial_board *board,
1685 : : struct uart_8250_port *port, int idx)
1686 : : {
1687 : 0 : port->port.quirks |= UPQ_NO_TXEN_TEST;
1688 : 0 : dev_dbg(&priv->dev->dev,
1689 : : "serial8250: skipping TxEn test for device [%04x:%04x] subsystem [%04x:%04x]\n",
1690 : : priv->dev->vendor, priv->dev->device,
1691 : : priv->dev->subsystem_vendor, priv->dev->subsystem_device);
1692 : :
1693 : 0 : return pci_default_setup(priv, board, port, idx);
1694 : : }
1695 : :
1696 : 0 : static void kt_handle_break(struct uart_port *p)
1697 : : {
1698 : 0 : struct uart_8250_port *up = up_to_u8250p(p);
1699 : : /*
1700 : : * On receipt of a BI, serial device in Intel ME (Intel
1701 : : * management engine) needs to have its fifos cleared for sane
1702 : : * SOL (Serial Over Lan) output.
1703 : : */
1704 : 0 : serial8250_clear_and_reinit_fifos(up);
1705 : 0 : }
1706 : :
1707 : 0 : static unsigned int kt_serial_in(struct uart_port *p, int offset)
1708 : : {
1709 : 0 : struct uart_8250_port *up = up_to_u8250p(p);
1710 : 0 : unsigned int val;
1711 : :
1712 : : /*
1713 : : * When the Intel ME (management engine) gets reset its serial
1714 : : * port registers could return 0 momentarily. Functions like
1715 : : * serial8250_console_write, read and save the IER, perform
1716 : : * some operation and then restore it. In order to avoid
1717 : : * setting IER register inadvertently to 0, if the value read
1718 : : * is 0, double check with ier value in uart_8250_port and use
1719 : : * that instead. up->ier should be the same value as what is
1720 : : * currently configured.
1721 : : */
1722 : 0 : val = inb(p->iobase + offset);
1723 [ # # ]: 0 : if (offset == UART_IER) {
1724 [ # # ]: 0 : if (val == 0)
1725 : 0 : val = up->ier;
1726 : : }
1727 : 0 : return val;
1728 : : }
1729 : :
1730 : 0 : static int kt_serial_setup(struct serial_private *priv,
1731 : : const struct pciserial_board *board,
1732 : : struct uart_8250_port *port, int idx)
1733 : : {
1734 : 0 : port->port.flags |= UPF_BUG_THRE;
1735 : 0 : port->port.serial_in = kt_serial_in;
1736 : 0 : port->port.handle_break = kt_handle_break;
1737 : 0 : return skip_tx_en_setup(priv, board, port, idx);
1738 : : }
1739 : :
1740 : 0 : static int pci_eg20t_init(struct pci_dev *dev)
1741 : : {
1742 : : #if defined(CONFIG_SERIAL_PCH_UART) || defined(CONFIG_SERIAL_PCH_UART_MODULE)
1743 : : return -ENODEV;
1744 : : #else
1745 : 0 : return 0;
1746 : : #endif
1747 : : }
1748 : :
1749 : : static int
1750 : 0 : pci_wch_ch353_setup(struct serial_private *priv,
1751 : : const struct pciserial_board *board,
1752 : : struct uart_8250_port *port, int idx)
1753 : : {
1754 : 0 : port->port.flags |= UPF_FIXED_TYPE;
1755 : 0 : port->port.type = PORT_16550A;
1756 : 0 : return pci_default_setup(priv, board, port, idx);
1757 : : }
1758 : :
1759 : : static int
1760 : 0 : pci_wch_ch355_setup(struct serial_private *priv,
1761 : : const struct pciserial_board *board,
1762 : : struct uart_8250_port *port, int idx)
1763 : : {
1764 : 0 : port->port.flags |= UPF_FIXED_TYPE;
1765 : 0 : port->port.type = PORT_16550A;
1766 : 0 : return pci_default_setup(priv, board, port, idx);
1767 : : }
1768 : :
1769 : : static int
1770 : 0 : pci_wch_ch38x_setup(struct serial_private *priv,
1771 : : const struct pciserial_board *board,
1772 : : struct uart_8250_port *port, int idx)
1773 : : {
1774 : 0 : port->port.flags |= UPF_FIXED_TYPE;
1775 : 0 : port->port.type = PORT_16850;
1776 : 0 : return pci_default_setup(priv, board, port, idx);
1777 : : }
1778 : :
1779 : : static int
1780 : 0 : pci_sunix_setup(struct serial_private *priv,
1781 : : const struct pciserial_board *board,
1782 : : struct uart_8250_port *port, int idx)
1783 : : {
1784 : 0 : int bar;
1785 : 0 : int offset;
1786 : :
1787 : 0 : port->port.flags |= UPF_FIXED_TYPE;
1788 : 0 : port->port.type = PORT_SUNIX;
1789 : :
1790 [ # # ]: 0 : if (idx < 4) {
1791 : 0 : bar = 0;
1792 : 0 : offset = idx * board->uart_offset;
1793 : : } else {
1794 : 0 : bar = 1;
1795 : 0 : idx -= 4;
1796 : 0 : idx = div_s64_rem(idx, 4, &offset);
1797 : 0 : offset = idx * 64 + offset * board->uart_offset;
1798 : : }
1799 : :
1800 : 0 : return setup_port(priv, port, bar, offset, 0);
1801 : : }
1802 : :
1803 : : static int
1804 : 0 : pci_moxa_setup(struct serial_private *priv,
1805 : : const struct pciserial_board *board,
1806 : : struct uart_8250_port *port, int idx)
1807 : : {
1808 : 0 : unsigned int bar = FL_GET_BASE(board->flags);
1809 : 0 : int offset;
1810 : :
1811 [ # # # # ]: 0 : if (board->num_ports == 4 && idx == 3)
1812 : 0 : offset = 7 * board->uart_offset;
1813 : : else
1814 : 0 : offset = idx * board->uart_offset;
1815 : :
1816 : 0 : return setup_port(priv, port, bar, offset, 0);
1817 : : }
1818 : :
1819 : : #define PCI_VENDOR_ID_SBSMODULARIO 0x124B
1820 : : #define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B
1821 : : #define PCI_DEVICE_ID_OCTPRO 0x0001
1822 : : #define PCI_SUBDEVICE_ID_OCTPRO232 0x0108
1823 : : #define PCI_SUBDEVICE_ID_OCTPRO422 0x0208
1824 : : #define PCI_SUBDEVICE_ID_POCTAL232 0x0308
1825 : : #define PCI_SUBDEVICE_ID_POCTAL422 0x0408
1826 : : #define PCI_SUBDEVICE_ID_SIIG_DUAL_00 0x2500
1827 : : #define PCI_SUBDEVICE_ID_SIIG_DUAL_30 0x2530
1828 : : #define PCI_VENDOR_ID_ADVANTECH 0x13fe
1829 : : #define PCI_DEVICE_ID_INTEL_CE4100_UART 0x2e66
1830 : : #define PCI_DEVICE_ID_ADVANTECH_PCI3620 0x3620
1831 : : #define PCI_DEVICE_ID_ADVANTECH_PCI3618 0x3618
1832 : : #define PCI_DEVICE_ID_ADVANTECH_PCIf618 0xf618
1833 : : #define PCI_DEVICE_ID_TITAN_200I 0x8028
1834 : : #define PCI_DEVICE_ID_TITAN_400I 0x8048
1835 : : #define PCI_DEVICE_ID_TITAN_800I 0x8088
1836 : : #define PCI_DEVICE_ID_TITAN_800EH 0xA007
1837 : : #define PCI_DEVICE_ID_TITAN_800EHB 0xA008
1838 : : #define PCI_DEVICE_ID_TITAN_400EH 0xA009
1839 : : #define PCI_DEVICE_ID_TITAN_100E 0xA010
1840 : : #define PCI_DEVICE_ID_TITAN_200E 0xA012
1841 : : #define PCI_DEVICE_ID_TITAN_400E 0xA013
1842 : : #define PCI_DEVICE_ID_TITAN_800E 0xA014
1843 : : #define PCI_DEVICE_ID_TITAN_200EI 0xA016
1844 : : #define PCI_DEVICE_ID_TITAN_200EISI 0xA017
1845 : : #define PCI_DEVICE_ID_TITAN_200V3 0xA306
1846 : : #define PCI_DEVICE_ID_TITAN_400V3 0xA310
1847 : : #define PCI_DEVICE_ID_TITAN_410V3 0xA312
1848 : : #define PCI_DEVICE_ID_TITAN_800V3 0xA314
1849 : : #define PCI_DEVICE_ID_TITAN_800V3B 0xA315
1850 : : #define PCI_DEVICE_ID_OXSEMI_16PCI958 0x9538
1851 : : #define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6
1852 : : #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001
1853 : : #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d
1854 : : #define PCI_VENDOR_ID_WCH 0x4348
1855 : : #define PCI_DEVICE_ID_WCH_CH352_2S 0x3253
1856 : : #define PCI_DEVICE_ID_WCH_CH353_4S 0x3453
1857 : : #define PCI_DEVICE_ID_WCH_CH353_2S1PF 0x5046
1858 : : #define PCI_DEVICE_ID_WCH_CH353_1S1P 0x5053
1859 : : #define PCI_DEVICE_ID_WCH_CH353_2S1P 0x7053
1860 : : #define PCI_DEVICE_ID_WCH_CH355_4S 0x7173
1861 : : #define PCI_VENDOR_ID_AGESTAR 0x5372
1862 : : #define PCI_DEVICE_ID_AGESTAR_9375 0x6872
1863 : : #define PCI_VENDOR_ID_ASIX 0x9710
1864 : : #define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
1865 : : #define PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800 0x818e
1866 : :
1867 : : #define PCIE_VENDOR_ID_WCH 0x1c00
1868 : : #define PCIE_DEVICE_ID_WCH_CH382_2S1P 0x3250
1869 : : #define PCIE_DEVICE_ID_WCH_CH384_4S 0x3470
1870 : : #define PCIE_DEVICE_ID_WCH_CH382_2S 0x3253
1871 : :
1872 : : #define PCI_VENDOR_ID_PERICOM 0x12D8
1873 : : #define PCI_DEVICE_ID_PERICOM_PI7C9X7951 0x7951
1874 : : #define PCI_DEVICE_ID_PERICOM_PI7C9X7952 0x7952
1875 : : #define PCI_DEVICE_ID_PERICOM_PI7C9X7954 0x7954
1876 : : #define PCI_DEVICE_ID_PERICOM_PI7C9X7958 0x7958
1877 : :
1878 : : #define PCI_VENDOR_ID_ACCESIO 0x494f
1879 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB 0x1051
1880 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S 0x1053
1881 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB 0x105C
1882 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S 0x105E
1883 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB 0x1091
1884 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2 0x1093
1885 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB 0x1099
1886 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4 0x109B
1887 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB 0x10D1
1888 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM 0x10D3
1889 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB 0x10DA
1890 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM 0x10DC
1891 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1 0x1108
1892 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2 0x1110
1893 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2 0x1111
1894 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4 0x1118
1895 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4 0x1119
1896 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S 0x1152
1897 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S 0x115A
1898 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2 0x1190
1899 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2 0x1191
1900 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4 0x1198
1901 : : #define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4 0x1199
1902 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM 0x11D0
1903 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4 0x105A
1904 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4 0x105B
1905 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8 0x106A
1906 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8 0x106B
1907 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4 0x1098
1908 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8 0x10A9
1909 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM 0x10D9
1910 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM 0x10E9
1911 : : #define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM 0x11D8
1912 : :
1913 : :
1914 : : #define PCI_DEVICE_ID_MOXA_CP102E 0x1024
1915 : : #define PCI_DEVICE_ID_MOXA_CP102EL 0x1025
1916 : : #define PCI_DEVICE_ID_MOXA_CP104EL_A 0x1045
1917 : : #define PCI_DEVICE_ID_MOXA_CP114EL 0x1144
1918 : : #define PCI_DEVICE_ID_MOXA_CP116E_A_A 0x1160
1919 : : #define PCI_DEVICE_ID_MOXA_CP116E_A_B 0x1161
1920 : : #define PCI_DEVICE_ID_MOXA_CP118EL_A 0x1182
1921 : : #define PCI_DEVICE_ID_MOXA_CP118E_A_I 0x1183
1922 : : #define PCI_DEVICE_ID_MOXA_CP132EL 0x1322
1923 : : #define PCI_DEVICE_ID_MOXA_CP134EL_A 0x1342
1924 : : #define PCI_DEVICE_ID_MOXA_CP138E_A 0x1381
1925 : : #define PCI_DEVICE_ID_MOXA_CP168EL_A 0x1683
1926 : :
1927 : : /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
1928 : : #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
1929 : : #define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588
1930 : :
1931 : : /*
1932 : : * Master list of serial port init/setup/exit quirks.
1933 : : * This does not describe the general nature of the port.
1934 : : * (ie, baud base, number and location of ports, etc)
1935 : : *
1936 : : * This list is ordered alphabetically by vendor then device.
1937 : : * Specific entries must come before more generic entries.
1938 : : */
1939 : : static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
1940 : : /*
1941 : : * ADDI-DATA GmbH communication cards <info@addi-data.com>
1942 : : */
1943 : : {
1944 : : .vendor = PCI_VENDOR_ID_AMCC,
1945 : : .device = PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800,
1946 : : .subvendor = PCI_ANY_ID,
1947 : : .subdevice = PCI_ANY_ID,
1948 : : .setup = addidata_apci7800_setup,
1949 : : },
1950 : : /*
1951 : : * AFAVLAB cards - these may be called via parport_serial
1952 : : * It is not clear whether this applies to all products.
1953 : : */
1954 : : {
1955 : : .vendor = PCI_VENDOR_ID_AFAVLAB,
1956 : : .device = PCI_ANY_ID,
1957 : : .subvendor = PCI_ANY_ID,
1958 : : .subdevice = PCI_ANY_ID,
1959 : : .setup = afavlab_setup,
1960 : : },
1961 : : /*
1962 : : * HP Diva
1963 : : */
1964 : : {
1965 : : .vendor = PCI_VENDOR_ID_HP,
1966 : : .device = PCI_DEVICE_ID_HP_DIVA,
1967 : : .subvendor = PCI_ANY_ID,
1968 : : .subdevice = PCI_ANY_ID,
1969 : : .init = pci_hp_diva_init,
1970 : : .setup = pci_hp_diva_setup,
1971 : : },
1972 : : /*
1973 : : * Intel
1974 : : */
1975 : : {
1976 : : .vendor = PCI_VENDOR_ID_INTEL,
1977 : : .device = PCI_DEVICE_ID_INTEL_80960_RP,
1978 : : .subvendor = 0xe4bf,
1979 : : .subdevice = PCI_ANY_ID,
1980 : : .init = pci_inteli960ni_init,
1981 : : .setup = pci_default_setup,
1982 : : },
1983 : : {
1984 : : .vendor = PCI_VENDOR_ID_INTEL,
1985 : : .device = PCI_DEVICE_ID_INTEL_8257X_SOL,
1986 : : .subvendor = PCI_ANY_ID,
1987 : : .subdevice = PCI_ANY_ID,
1988 : : .setup = skip_tx_en_setup,
1989 : : },
1990 : : {
1991 : : .vendor = PCI_VENDOR_ID_INTEL,
1992 : : .device = PCI_DEVICE_ID_INTEL_82573L_SOL,
1993 : : .subvendor = PCI_ANY_ID,
1994 : : .subdevice = PCI_ANY_ID,
1995 : : .setup = skip_tx_en_setup,
1996 : : },
1997 : : {
1998 : : .vendor = PCI_VENDOR_ID_INTEL,
1999 : : .device = PCI_DEVICE_ID_INTEL_82573E_SOL,
2000 : : .subvendor = PCI_ANY_ID,
2001 : : .subdevice = PCI_ANY_ID,
2002 : : .setup = skip_tx_en_setup,
2003 : : },
2004 : : {
2005 : : .vendor = PCI_VENDOR_ID_INTEL,
2006 : : .device = PCI_DEVICE_ID_INTEL_CE4100_UART,
2007 : : .subvendor = PCI_ANY_ID,
2008 : : .subdevice = PCI_ANY_ID,
2009 : : .setup = ce4100_serial_setup,
2010 : : },
2011 : : {
2012 : : .vendor = PCI_VENDOR_ID_INTEL,
2013 : : .device = PCI_DEVICE_ID_INTEL_PATSBURG_KT,
2014 : : .subvendor = PCI_ANY_ID,
2015 : : .subdevice = PCI_ANY_ID,
2016 : : .setup = kt_serial_setup,
2017 : : },
2018 : : /*
2019 : : * ITE
2020 : : */
2021 : : {
2022 : : .vendor = PCI_VENDOR_ID_ITE,
2023 : : .device = PCI_DEVICE_ID_ITE_8872,
2024 : : .subvendor = PCI_ANY_ID,
2025 : : .subdevice = PCI_ANY_ID,
2026 : : .init = pci_ite887x_init,
2027 : : .setup = pci_default_setup,
2028 : : .exit = pci_ite887x_exit,
2029 : : },
2030 : : /*
2031 : : * National Instruments
2032 : : */
2033 : : {
2034 : : .vendor = PCI_VENDOR_ID_NI,
2035 : : .device = PCI_DEVICE_ID_NI_PCI23216,
2036 : : .subvendor = PCI_ANY_ID,
2037 : : .subdevice = PCI_ANY_ID,
2038 : : .init = pci_ni8420_init,
2039 : : .setup = pci_default_setup,
2040 : : .exit = pci_ni8420_exit,
2041 : : },
2042 : : {
2043 : : .vendor = PCI_VENDOR_ID_NI,
2044 : : .device = PCI_DEVICE_ID_NI_PCI2328,
2045 : : .subvendor = PCI_ANY_ID,
2046 : : .subdevice = PCI_ANY_ID,
2047 : : .init = pci_ni8420_init,
2048 : : .setup = pci_default_setup,
2049 : : .exit = pci_ni8420_exit,
2050 : : },
2051 : : {
2052 : : .vendor = PCI_VENDOR_ID_NI,
2053 : : .device = PCI_DEVICE_ID_NI_PCI2324,
2054 : : .subvendor = PCI_ANY_ID,
2055 : : .subdevice = PCI_ANY_ID,
2056 : : .init = pci_ni8420_init,
2057 : : .setup = pci_default_setup,
2058 : : .exit = pci_ni8420_exit,
2059 : : },
2060 : : {
2061 : : .vendor = PCI_VENDOR_ID_NI,
2062 : : .device = PCI_DEVICE_ID_NI_PCI2322,
2063 : : .subvendor = PCI_ANY_ID,
2064 : : .subdevice = PCI_ANY_ID,
2065 : : .init = pci_ni8420_init,
2066 : : .setup = pci_default_setup,
2067 : : .exit = pci_ni8420_exit,
2068 : : },
2069 : : {
2070 : : .vendor = PCI_VENDOR_ID_NI,
2071 : : .device = PCI_DEVICE_ID_NI_PCI2324I,
2072 : : .subvendor = PCI_ANY_ID,
2073 : : .subdevice = PCI_ANY_ID,
2074 : : .init = pci_ni8420_init,
2075 : : .setup = pci_default_setup,
2076 : : .exit = pci_ni8420_exit,
2077 : : },
2078 : : {
2079 : : .vendor = PCI_VENDOR_ID_NI,
2080 : : .device = PCI_DEVICE_ID_NI_PCI2322I,
2081 : : .subvendor = PCI_ANY_ID,
2082 : : .subdevice = PCI_ANY_ID,
2083 : : .init = pci_ni8420_init,
2084 : : .setup = pci_default_setup,
2085 : : .exit = pci_ni8420_exit,
2086 : : },
2087 : : {
2088 : : .vendor = PCI_VENDOR_ID_NI,
2089 : : .device = PCI_DEVICE_ID_NI_PXI8420_23216,
2090 : : .subvendor = PCI_ANY_ID,
2091 : : .subdevice = PCI_ANY_ID,
2092 : : .init = pci_ni8420_init,
2093 : : .setup = pci_default_setup,
2094 : : .exit = pci_ni8420_exit,
2095 : : },
2096 : : {
2097 : : .vendor = PCI_VENDOR_ID_NI,
2098 : : .device = PCI_DEVICE_ID_NI_PXI8420_2328,
2099 : : .subvendor = PCI_ANY_ID,
2100 : : .subdevice = PCI_ANY_ID,
2101 : : .init = pci_ni8420_init,
2102 : : .setup = pci_default_setup,
2103 : : .exit = pci_ni8420_exit,
2104 : : },
2105 : : {
2106 : : .vendor = PCI_VENDOR_ID_NI,
2107 : : .device = PCI_DEVICE_ID_NI_PXI8420_2324,
2108 : : .subvendor = PCI_ANY_ID,
2109 : : .subdevice = PCI_ANY_ID,
2110 : : .init = pci_ni8420_init,
2111 : : .setup = pci_default_setup,
2112 : : .exit = pci_ni8420_exit,
2113 : : },
2114 : : {
2115 : : .vendor = PCI_VENDOR_ID_NI,
2116 : : .device = PCI_DEVICE_ID_NI_PXI8420_2322,
2117 : : .subvendor = PCI_ANY_ID,
2118 : : .subdevice = PCI_ANY_ID,
2119 : : .init = pci_ni8420_init,
2120 : : .setup = pci_default_setup,
2121 : : .exit = pci_ni8420_exit,
2122 : : },
2123 : : {
2124 : : .vendor = PCI_VENDOR_ID_NI,
2125 : : .device = PCI_DEVICE_ID_NI_PXI8422_2324,
2126 : : .subvendor = PCI_ANY_ID,
2127 : : .subdevice = PCI_ANY_ID,
2128 : : .init = pci_ni8420_init,
2129 : : .setup = pci_default_setup,
2130 : : .exit = pci_ni8420_exit,
2131 : : },
2132 : : {
2133 : : .vendor = PCI_VENDOR_ID_NI,
2134 : : .device = PCI_DEVICE_ID_NI_PXI8422_2322,
2135 : : .subvendor = PCI_ANY_ID,
2136 : : .subdevice = PCI_ANY_ID,
2137 : : .init = pci_ni8420_init,
2138 : : .setup = pci_default_setup,
2139 : : .exit = pci_ni8420_exit,
2140 : : },
2141 : : {
2142 : : .vendor = PCI_VENDOR_ID_NI,
2143 : : .device = PCI_ANY_ID,
2144 : : .subvendor = PCI_ANY_ID,
2145 : : .subdevice = PCI_ANY_ID,
2146 : : .init = pci_ni8430_init,
2147 : : .setup = pci_ni8430_setup,
2148 : : .exit = pci_ni8430_exit,
2149 : : },
2150 : : /* Quatech */
2151 : : {
2152 : : .vendor = PCI_VENDOR_ID_QUATECH,
2153 : : .device = PCI_ANY_ID,
2154 : : .subvendor = PCI_ANY_ID,
2155 : : .subdevice = PCI_ANY_ID,
2156 : : .init = pci_quatech_init,
2157 : : .setup = pci_quatech_setup,
2158 : : .exit = pci_quatech_exit,
2159 : : },
2160 : : /*
2161 : : * Panacom
2162 : : */
2163 : : {
2164 : : .vendor = PCI_VENDOR_ID_PANACOM,
2165 : : .device = PCI_DEVICE_ID_PANACOM_QUADMODEM,
2166 : : .subvendor = PCI_ANY_ID,
2167 : : .subdevice = PCI_ANY_ID,
2168 : : .init = pci_plx9050_init,
2169 : : .setup = pci_default_setup,
2170 : : .exit = pci_plx9050_exit,
2171 : : },
2172 : : {
2173 : : .vendor = PCI_VENDOR_ID_PANACOM,
2174 : : .device = PCI_DEVICE_ID_PANACOM_DUALMODEM,
2175 : : .subvendor = PCI_ANY_ID,
2176 : : .subdevice = PCI_ANY_ID,
2177 : : .init = pci_plx9050_init,
2178 : : .setup = pci_default_setup,
2179 : : .exit = pci_plx9050_exit,
2180 : : },
2181 : : /*
2182 : : * Pericom (Only 7954 - It have a offset jump for port 4)
2183 : : */
2184 : : {
2185 : : .vendor = PCI_VENDOR_ID_PERICOM,
2186 : : .device = PCI_DEVICE_ID_PERICOM_PI7C9X7954,
2187 : : .subvendor = PCI_ANY_ID,
2188 : : .subdevice = PCI_ANY_ID,
2189 : : .setup = pci_pericom_setup_four_at_eight,
2190 : : },
2191 : : /*
2192 : : * PLX
2193 : : */
2194 : : {
2195 : : .vendor = PCI_VENDOR_ID_PLX,
2196 : : .device = PCI_DEVICE_ID_PLX_9050,
2197 : : .subvendor = PCI_SUBVENDOR_ID_EXSYS,
2198 : : .subdevice = PCI_SUBDEVICE_ID_EXSYS_4055,
2199 : : .init = pci_plx9050_init,
2200 : : .setup = pci_default_setup,
2201 : : .exit = pci_plx9050_exit,
2202 : : },
2203 : : {
2204 : : .vendor = PCI_VENDOR_ID_PLX,
2205 : : .device = PCI_DEVICE_ID_PLX_9050,
2206 : : .subvendor = PCI_SUBVENDOR_ID_KEYSPAN,
2207 : : .subdevice = PCI_SUBDEVICE_ID_KEYSPAN_SX2,
2208 : : .init = pci_plx9050_init,
2209 : : .setup = pci_default_setup,
2210 : : .exit = pci_plx9050_exit,
2211 : : },
2212 : : {
2213 : : .vendor = PCI_VENDOR_ID_PLX,
2214 : : .device = PCI_DEVICE_ID_PLX_ROMULUS,
2215 : : .subvendor = PCI_VENDOR_ID_PLX,
2216 : : .subdevice = PCI_DEVICE_ID_PLX_ROMULUS,
2217 : : .init = pci_plx9050_init,
2218 : : .setup = pci_default_setup,
2219 : : .exit = pci_plx9050_exit,
2220 : : },
2221 : : {
2222 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2223 : : .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB,
2224 : : .subvendor = PCI_ANY_ID,
2225 : : .subdevice = PCI_ANY_ID,
2226 : : .setup = pci_pericom_setup_four_at_eight,
2227 : : },
2228 : : {
2229 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2230 : : .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S,
2231 : : .subvendor = PCI_ANY_ID,
2232 : : .subdevice = PCI_ANY_ID,
2233 : : .setup = pci_pericom_setup_four_at_eight,
2234 : : },
2235 : : {
2236 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2237 : : .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB,
2238 : : .subvendor = PCI_ANY_ID,
2239 : : .subdevice = PCI_ANY_ID,
2240 : : .setup = pci_pericom_setup_four_at_eight,
2241 : : },
2242 : : {
2243 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2244 : : .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4,
2245 : : .subvendor = PCI_ANY_ID,
2246 : : .subdevice = PCI_ANY_ID,
2247 : : .setup = pci_pericom_setup_four_at_eight,
2248 : : },
2249 : : {
2250 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2251 : : .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB,
2252 : : .subvendor = PCI_ANY_ID,
2253 : : .subdevice = PCI_ANY_ID,
2254 : : .setup = pci_pericom_setup_four_at_eight,
2255 : : },
2256 : : {
2257 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2258 : : .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM,
2259 : : .subvendor = PCI_ANY_ID,
2260 : : .subdevice = PCI_ANY_ID,
2261 : : .setup = pci_pericom_setup_four_at_eight,
2262 : : },
2263 : : {
2264 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2265 : : .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4,
2266 : : .subvendor = PCI_ANY_ID,
2267 : : .subdevice = PCI_ANY_ID,
2268 : : .setup = pci_pericom_setup_four_at_eight,
2269 : : },
2270 : : {
2271 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2272 : : .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4,
2273 : : .subvendor = PCI_ANY_ID,
2274 : : .subdevice = PCI_ANY_ID,
2275 : : .setup = pci_pericom_setup_four_at_eight,
2276 : : },
2277 : : {
2278 : : .vendor = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S,
2279 : : .device = PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4,
2280 : : .subvendor = PCI_ANY_ID,
2281 : : .subdevice = PCI_ANY_ID,
2282 : : .setup = pci_pericom_setup_four_at_eight,
2283 : : },
2284 : : {
2285 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2286 : : .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4,
2287 : : .subvendor = PCI_ANY_ID,
2288 : : .subdevice = PCI_ANY_ID,
2289 : : .setup = pci_pericom_setup_four_at_eight,
2290 : : },
2291 : : {
2292 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2293 : : .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4,
2294 : : .subvendor = PCI_ANY_ID,
2295 : : .subdevice = PCI_ANY_ID,
2296 : : .setup = pci_pericom_setup_four_at_eight,
2297 : : },
2298 : : {
2299 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2300 : : .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4,
2301 : : .subvendor = PCI_ANY_ID,
2302 : : .subdevice = PCI_ANY_ID,
2303 : : .setup = pci_pericom_setup_four_at_eight,
2304 : : },
2305 : : {
2306 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2307 : : .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4,
2308 : : .subvendor = PCI_ANY_ID,
2309 : : .subdevice = PCI_ANY_ID,
2310 : : .setup = pci_pericom_setup_four_at_eight,
2311 : : },
2312 : : {
2313 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2314 : : .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM,
2315 : : .subvendor = PCI_ANY_ID,
2316 : : .subdevice = PCI_ANY_ID,
2317 : : .setup = pci_pericom_setup_four_at_eight,
2318 : : },
2319 : : {
2320 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2321 : : .device = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM,
2322 : : .subvendor = PCI_ANY_ID,
2323 : : .subdevice = PCI_ANY_ID,
2324 : : .setup = pci_pericom_setup_four_at_eight,
2325 : : },
2326 : : {
2327 : : .vendor = PCI_VENDOR_ID_ACCESIO,
2328 : : .device = PCI_ANY_ID,
2329 : : .subvendor = PCI_ANY_ID,
2330 : : .subdevice = PCI_ANY_ID,
2331 : : .setup = pci_pericom_setup,
2332 : : }, /*
2333 : : * SBS Technologies, Inc., PMC-OCTALPRO 232
2334 : : */
2335 : : {
2336 : : .vendor = PCI_VENDOR_ID_SBSMODULARIO,
2337 : : .device = PCI_DEVICE_ID_OCTPRO,
2338 : : .subvendor = PCI_SUBVENDOR_ID_SBSMODULARIO,
2339 : : .subdevice = PCI_SUBDEVICE_ID_OCTPRO232,
2340 : : .init = sbs_init,
2341 : : .setup = sbs_setup,
2342 : : .exit = sbs_exit,
2343 : : },
2344 : : /*
2345 : : * SBS Technologies, Inc., PMC-OCTALPRO 422
2346 : : */
2347 : : {
2348 : : .vendor = PCI_VENDOR_ID_SBSMODULARIO,
2349 : : .device = PCI_DEVICE_ID_OCTPRO,
2350 : : .subvendor = PCI_SUBVENDOR_ID_SBSMODULARIO,
2351 : : .subdevice = PCI_SUBDEVICE_ID_OCTPRO422,
2352 : : .init = sbs_init,
2353 : : .setup = sbs_setup,
2354 : : .exit = sbs_exit,
2355 : : },
2356 : : /*
2357 : : * SBS Technologies, Inc., P-Octal 232
2358 : : */
2359 : : {
2360 : : .vendor = PCI_VENDOR_ID_SBSMODULARIO,
2361 : : .device = PCI_DEVICE_ID_OCTPRO,
2362 : : .subvendor = PCI_SUBVENDOR_ID_SBSMODULARIO,
2363 : : .subdevice = PCI_SUBDEVICE_ID_POCTAL232,
2364 : : .init = sbs_init,
2365 : : .setup = sbs_setup,
2366 : : .exit = sbs_exit,
2367 : : },
2368 : : /*
2369 : : * SBS Technologies, Inc., P-Octal 422
2370 : : */
2371 : : {
2372 : : .vendor = PCI_VENDOR_ID_SBSMODULARIO,
2373 : : .device = PCI_DEVICE_ID_OCTPRO,
2374 : : .subvendor = PCI_SUBVENDOR_ID_SBSMODULARIO,
2375 : : .subdevice = PCI_SUBDEVICE_ID_POCTAL422,
2376 : : .init = sbs_init,
2377 : : .setup = sbs_setup,
2378 : : .exit = sbs_exit,
2379 : : },
2380 : : /*
2381 : : * SIIG cards - these may be called via parport_serial
2382 : : */
2383 : : {
2384 : : .vendor = PCI_VENDOR_ID_SIIG,
2385 : : .device = PCI_ANY_ID,
2386 : : .subvendor = PCI_ANY_ID,
2387 : : .subdevice = PCI_ANY_ID,
2388 : : .init = pci_siig_init,
2389 : : .setup = pci_siig_setup,
2390 : : },
2391 : : /*
2392 : : * Titan cards
2393 : : */
2394 : : {
2395 : : .vendor = PCI_VENDOR_ID_TITAN,
2396 : : .device = PCI_DEVICE_ID_TITAN_400L,
2397 : : .subvendor = PCI_ANY_ID,
2398 : : .subdevice = PCI_ANY_ID,
2399 : : .setup = titan_400l_800l_setup,
2400 : : },
2401 : : {
2402 : : .vendor = PCI_VENDOR_ID_TITAN,
2403 : : .device = PCI_DEVICE_ID_TITAN_800L,
2404 : : .subvendor = PCI_ANY_ID,
2405 : : .subdevice = PCI_ANY_ID,
2406 : : .setup = titan_400l_800l_setup,
2407 : : },
2408 : : /*
2409 : : * Timedia cards
2410 : : */
2411 : : {
2412 : : .vendor = PCI_VENDOR_ID_TIMEDIA,
2413 : : .device = PCI_DEVICE_ID_TIMEDIA_1889,
2414 : : .subvendor = PCI_VENDOR_ID_TIMEDIA,
2415 : : .subdevice = PCI_ANY_ID,
2416 : : .probe = pci_timedia_probe,
2417 : : .init = pci_timedia_init,
2418 : : .setup = pci_timedia_setup,
2419 : : },
2420 : : {
2421 : : .vendor = PCI_VENDOR_ID_TIMEDIA,
2422 : : .device = PCI_ANY_ID,
2423 : : .subvendor = PCI_ANY_ID,
2424 : : .subdevice = PCI_ANY_ID,
2425 : : .setup = pci_timedia_setup,
2426 : : },
2427 : : /*
2428 : : * Sunix PCI serial boards
2429 : : */
2430 : : {
2431 : : .vendor = PCI_VENDOR_ID_SUNIX,
2432 : : .device = PCI_DEVICE_ID_SUNIX_1999,
2433 : : .subvendor = PCI_VENDOR_ID_SUNIX,
2434 : : .subdevice = PCI_ANY_ID,
2435 : : .setup = pci_sunix_setup,
2436 : : },
2437 : : /*
2438 : : * Xircom cards
2439 : : */
2440 : : {
2441 : : .vendor = PCI_VENDOR_ID_XIRCOM,
2442 : : .device = PCI_DEVICE_ID_XIRCOM_X3201_MDM,
2443 : : .subvendor = PCI_ANY_ID,
2444 : : .subdevice = PCI_ANY_ID,
2445 : : .init = pci_xircom_init,
2446 : : .setup = pci_default_setup,
2447 : : },
2448 : : /*
2449 : : * Netmos cards - these may be called via parport_serial
2450 : : */
2451 : : {
2452 : : .vendor = PCI_VENDOR_ID_NETMOS,
2453 : : .device = PCI_ANY_ID,
2454 : : .subvendor = PCI_ANY_ID,
2455 : : .subdevice = PCI_ANY_ID,
2456 : : .init = pci_netmos_init,
2457 : : .setup = pci_netmos_9900_setup,
2458 : : },
2459 : : /*
2460 : : * EndRun Technologies
2461 : : */
2462 : : {
2463 : : .vendor = PCI_VENDOR_ID_ENDRUN,
2464 : : .device = PCI_ANY_ID,
2465 : : .subvendor = PCI_ANY_ID,
2466 : : .subdevice = PCI_ANY_ID,
2467 : : .init = pci_endrun_init,
2468 : : .setup = pci_default_setup,
2469 : : },
2470 : : /*
2471 : : * For Oxford Semiconductor Tornado based devices
2472 : : */
2473 : : {
2474 : : .vendor = PCI_VENDOR_ID_OXSEMI,
2475 : : .device = PCI_ANY_ID,
2476 : : .subvendor = PCI_ANY_ID,
2477 : : .subdevice = PCI_ANY_ID,
2478 : : .init = pci_oxsemi_tornado_init,
2479 : : .setup = pci_default_setup,
2480 : : },
2481 : : {
2482 : : .vendor = PCI_VENDOR_ID_MAINPINE,
2483 : : .device = PCI_ANY_ID,
2484 : : .subvendor = PCI_ANY_ID,
2485 : : .subdevice = PCI_ANY_ID,
2486 : : .init = pci_oxsemi_tornado_init,
2487 : : .setup = pci_default_setup,
2488 : : },
2489 : : {
2490 : : .vendor = PCI_VENDOR_ID_DIGI,
2491 : : .device = PCIE_DEVICE_ID_NEO_2_OX_IBM,
2492 : : .subvendor = PCI_SUBVENDOR_ID_IBM,
2493 : : .subdevice = PCI_ANY_ID,
2494 : : .init = pci_oxsemi_tornado_init,
2495 : : .setup = pci_default_setup,
2496 : : },
2497 : : {
2498 : : .vendor = PCI_VENDOR_ID_INTEL,
2499 : : .device = 0x8811,
2500 : : .subvendor = PCI_ANY_ID,
2501 : : .subdevice = PCI_ANY_ID,
2502 : : .init = pci_eg20t_init,
2503 : : .setup = pci_default_setup,
2504 : : },
2505 : : {
2506 : : .vendor = PCI_VENDOR_ID_INTEL,
2507 : : .device = 0x8812,
2508 : : .subvendor = PCI_ANY_ID,
2509 : : .subdevice = PCI_ANY_ID,
2510 : : .init = pci_eg20t_init,
2511 : : .setup = pci_default_setup,
2512 : : },
2513 : : {
2514 : : .vendor = PCI_VENDOR_ID_INTEL,
2515 : : .device = 0x8813,
2516 : : .subvendor = PCI_ANY_ID,
2517 : : .subdevice = PCI_ANY_ID,
2518 : : .init = pci_eg20t_init,
2519 : : .setup = pci_default_setup,
2520 : : },
2521 : : {
2522 : : .vendor = PCI_VENDOR_ID_INTEL,
2523 : : .device = 0x8814,
2524 : : .subvendor = PCI_ANY_ID,
2525 : : .subdevice = PCI_ANY_ID,
2526 : : .init = pci_eg20t_init,
2527 : : .setup = pci_default_setup,
2528 : : },
2529 : : {
2530 : : .vendor = 0x10DB,
2531 : : .device = 0x8027,
2532 : : .subvendor = PCI_ANY_ID,
2533 : : .subdevice = PCI_ANY_ID,
2534 : : .init = pci_eg20t_init,
2535 : : .setup = pci_default_setup,
2536 : : },
2537 : : {
2538 : : .vendor = 0x10DB,
2539 : : .device = 0x8028,
2540 : : .subvendor = PCI_ANY_ID,
2541 : : .subdevice = PCI_ANY_ID,
2542 : : .init = pci_eg20t_init,
2543 : : .setup = pci_default_setup,
2544 : : },
2545 : : {
2546 : : .vendor = 0x10DB,
2547 : : .device = 0x8029,
2548 : : .subvendor = PCI_ANY_ID,
2549 : : .subdevice = PCI_ANY_ID,
2550 : : .init = pci_eg20t_init,
2551 : : .setup = pci_default_setup,
2552 : : },
2553 : : {
2554 : : .vendor = 0x10DB,
2555 : : .device = 0x800C,
2556 : : .subvendor = PCI_ANY_ID,
2557 : : .subdevice = PCI_ANY_ID,
2558 : : .init = pci_eg20t_init,
2559 : : .setup = pci_default_setup,
2560 : : },
2561 : : {
2562 : : .vendor = 0x10DB,
2563 : : .device = 0x800D,
2564 : : .subvendor = PCI_ANY_ID,
2565 : : .subdevice = PCI_ANY_ID,
2566 : : .init = pci_eg20t_init,
2567 : : .setup = pci_default_setup,
2568 : : },
2569 : : /*
2570 : : * Cronyx Omega PCI (PLX-chip based)
2571 : : */
2572 : : {
2573 : : .vendor = PCI_VENDOR_ID_PLX,
2574 : : .device = PCI_DEVICE_ID_PLX_CRONYX_OMEGA,
2575 : : .subvendor = PCI_ANY_ID,
2576 : : .subdevice = PCI_ANY_ID,
2577 : : .setup = pci_omegapci_setup,
2578 : : },
2579 : : /* WCH CH353 1S1P card (16550 clone) */
2580 : : {
2581 : : .vendor = PCI_VENDOR_ID_WCH,
2582 : : .device = PCI_DEVICE_ID_WCH_CH353_1S1P,
2583 : : .subvendor = PCI_ANY_ID,
2584 : : .subdevice = PCI_ANY_ID,
2585 : : .setup = pci_wch_ch353_setup,
2586 : : },
2587 : : /* WCH CH353 2S1P card (16550 clone) */
2588 : : {
2589 : : .vendor = PCI_VENDOR_ID_WCH,
2590 : : .device = PCI_DEVICE_ID_WCH_CH353_2S1P,
2591 : : .subvendor = PCI_ANY_ID,
2592 : : .subdevice = PCI_ANY_ID,
2593 : : .setup = pci_wch_ch353_setup,
2594 : : },
2595 : : /* WCH CH353 4S card (16550 clone) */
2596 : : {
2597 : : .vendor = PCI_VENDOR_ID_WCH,
2598 : : .device = PCI_DEVICE_ID_WCH_CH353_4S,
2599 : : .subvendor = PCI_ANY_ID,
2600 : : .subdevice = PCI_ANY_ID,
2601 : : .setup = pci_wch_ch353_setup,
2602 : : },
2603 : : /* WCH CH353 2S1PF card (16550 clone) */
2604 : : {
2605 : : .vendor = PCI_VENDOR_ID_WCH,
2606 : : .device = PCI_DEVICE_ID_WCH_CH353_2S1PF,
2607 : : .subvendor = PCI_ANY_ID,
2608 : : .subdevice = PCI_ANY_ID,
2609 : : .setup = pci_wch_ch353_setup,
2610 : : },
2611 : : /* WCH CH352 2S card (16550 clone) */
2612 : : {
2613 : : .vendor = PCI_VENDOR_ID_WCH,
2614 : : .device = PCI_DEVICE_ID_WCH_CH352_2S,
2615 : : .subvendor = PCI_ANY_ID,
2616 : : .subdevice = PCI_ANY_ID,
2617 : : .setup = pci_wch_ch353_setup,
2618 : : },
2619 : : /* WCH CH355 4S card (16550 clone) */
2620 : : {
2621 : : .vendor = PCI_VENDOR_ID_WCH,
2622 : : .device = PCI_DEVICE_ID_WCH_CH355_4S,
2623 : : .subvendor = PCI_ANY_ID,
2624 : : .subdevice = PCI_ANY_ID,
2625 : : .setup = pci_wch_ch355_setup,
2626 : : },
2627 : : /* WCH CH382 2S card (16850 clone) */
2628 : : {
2629 : : .vendor = PCIE_VENDOR_ID_WCH,
2630 : : .device = PCIE_DEVICE_ID_WCH_CH382_2S,
2631 : : .subvendor = PCI_ANY_ID,
2632 : : .subdevice = PCI_ANY_ID,
2633 : : .setup = pci_wch_ch38x_setup,
2634 : : },
2635 : : /* WCH CH382 2S1P card (16850 clone) */
2636 : : {
2637 : : .vendor = PCIE_VENDOR_ID_WCH,
2638 : : .device = PCIE_DEVICE_ID_WCH_CH382_2S1P,
2639 : : .subvendor = PCI_ANY_ID,
2640 : : .subdevice = PCI_ANY_ID,
2641 : : .setup = pci_wch_ch38x_setup,
2642 : : },
2643 : : /* WCH CH384 4S card (16850 clone) */
2644 : : {
2645 : : .vendor = PCIE_VENDOR_ID_WCH,
2646 : : .device = PCIE_DEVICE_ID_WCH_CH384_4S,
2647 : : .subvendor = PCI_ANY_ID,
2648 : : .subdevice = PCI_ANY_ID,
2649 : : .setup = pci_wch_ch38x_setup,
2650 : : },
2651 : : /*
2652 : : * ASIX devices with FIFO bug
2653 : : */
2654 : : {
2655 : : .vendor = PCI_VENDOR_ID_ASIX,
2656 : : .device = PCI_ANY_ID,
2657 : : .subvendor = PCI_ANY_ID,
2658 : : .subdevice = PCI_ANY_ID,
2659 : : .setup = pci_asix_setup,
2660 : : },
2661 : : /*
2662 : : * Broadcom TruManage (NetXtreme)
2663 : : */
2664 : : {
2665 : : .vendor = PCI_VENDOR_ID_BROADCOM,
2666 : : .device = PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
2667 : : .subvendor = PCI_ANY_ID,
2668 : : .subdevice = PCI_ANY_ID,
2669 : : .setup = pci_brcm_trumanage_setup,
2670 : : },
2671 : : {
2672 : : .vendor = 0x1c29,
2673 : : .device = 0x1104,
2674 : : .subvendor = PCI_ANY_ID,
2675 : : .subdevice = PCI_ANY_ID,
2676 : : .setup = pci_fintek_setup,
2677 : : .init = pci_fintek_init,
2678 : : },
2679 : : {
2680 : : .vendor = 0x1c29,
2681 : : .device = 0x1108,
2682 : : .subvendor = PCI_ANY_ID,
2683 : : .subdevice = PCI_ANY_ID,
2684 : : .setup = pci_fintek_setup,
2685 : : .init = pci_fintek_init,
2686 : : },
2687 : : {
2688 : : .vendor = 0x1c29,
2689 : : .device = 0x1112,
2690 : : .subvendor = PCI_ANY_ID,
2691 : : .subdevice = PCI_ANY_ID,
2692 : : .setup = pci_fintek_setup,
2693 : : .init = pci_fintek_init,
2694 : : },
2695 : : /*
2696 : : * MOXA
2697 : : */
2698 : : {
2699 : : .vendor = PCI_VENDOR_ID_MOXA,
2700 : : .device = PCI_ANY_ID,
2701 : : .subvendor = PCI_ANY_ID,
2702 : : .subdevice = PCI_ANY_ID,
2703 : : .setup = pci_moxa_setup,
2704 : : },
2705 : : {
2706 : : .vendor = 0x1c29,
2707 : : .device = 0x1204,
2708 : : .subvendor = PCI_ANY_ID,
2709 : : .subdevice = PCI_ANY_ID,
2710 : : .setup = pci_fintek_f815xxa_setup,
2711 : : .init = pci_fintek_f815xxa_init,
2712 : : },
2713 : : {
2714 : : .vendor = 0x1c29,
2715 : : .device = 0x1208,
2716 : : .subvendor = PCI_ANY_ID,
2717 : : .subdevice = PCI_ANY_ID,
2718 : : .setup = pci_fintek_f815xxa_setup,
2719 : : .init = pci_fintek_f815xxa_init,
2720 : : },
2721 : : {
2722 : : .vendor = 0x1c29,
2723 : : .device = 0x1212,
2724 : : .subvendor = PCI_ANY_ID,
2725 : : .subdevice = PCI_ANY_ID,
2726 : : .setup = pci_fintek_f815xxa_setup,
2727 : : .init = pci_fintek_f815xxa_init,
2728 : : },
2729 : :
2730 : : /*
2731 : : * Default "match everything" terminator entry
2732 : : */
2733 : : {
2734 : : .vendor = PCI_ANY_ID,
2735 : : .device = PCI_ANY_ID,
2736 : : .subvendor = PCI_ANY_ID,
2737 : : .subdevice = PCI_ANY_ID,
2738 : : .setup = pci_default_setup,
2739 : : }
2740 : : };
2741 : :
2742 : 7332 : static inline int quirk_id_matches(u32 quirk_id, u32 dev_id)
2743 : : {
2744 : 7332 : return quirk_id == PCI_ANY_ID || quirk_id == dev_id;
2745 : : }
2746 : :
2747 : 78 : static struct pci_serial_quirk *find_quirk(struct pci_dev *dev)
2748 : : {
2749 : 78 : struct pci_serial_quirk *quirk;
2750 : :
2751 : 7098 : for (quirk = pci_serial_quirks; ; quirk++)
2752 [ + + ]: 7098 : if (quirk_id_matches(quirk->vendor, dev->vendor) &&
2753 [ + - ]: 78 : quirk_id_matches(quirk->device, dev->device) &&
2754 [ + - ]: 78 : quirk_id_matches(quirk->subvendor, dev->subsystem_vendor) &&
2755 [ - + ]: 78 : quirk_id_matches(quirk->subdevice, dev->subsystem_device))
2756 : : break;
2757 : 78 : return quirk;
2758 : : }
2759 : :
2760 : : static inline int get_pci_irq(struct pci_dev *dev,
2761 : : const struct pciserial_board *board)
2762 : : {
2763 : : if (board->flags & FL_NOIRQ)
2764 : : return 0;
2765 : : else
2766 : : return dev->irq;
2767 : : }
2768 : :
2769 : : /*
2770 : : * This is the configuration table for all of the PCI serial boards
2771 : : * which we support. It is directly indexed by the pci_board_num_t enum
2772 : : * value, which is encoded in the pci_device_id PCI probe table's
2773 : : * driver_data member.
2774 : : *
2775 : : * The makeup of these names are:
2776 : : * pbn_bn{_bt}_n_baud{_offsetinhex}
2777 : : *
2778 : : * bn = PCI BAR number
2779 : : * bt = Index using PCI BARs
2780 : : * n = number of serial ports
2781 : : * baud = baud rate
2782 : : * offsetinhex = offset for each sequential port (in hex)
2783 : : *
2784 : : * This table is sorted by (in order): bn, bt, baud, offsetindex, n.
2785 : : *
2786 : : * Please note: in theory if n = 1, _bt infix should make no difference.
2787 : : * ie, pbn_b0_1_115200 is the same as pbn_b0_bt_1_115200
2788 : : */
2789 : : enum pci_board_num_t {
2790 : : pbn_default = 0,
2791 : :
2792 : : pbn_b0_1_115200,
2793 : : pbn_b0_2_115200,
2794 : : pbn_b0_4_115200,
2795 : : pbn_b0_5_115200,
2796 : : pbn_b0_8_115200,
2797 : :
2798 : : pbn_b0_1_921600,
2799 : : pbn_b0_2_921600,
2800 : : pbn_b0_4_921600,
2801 : :
2802 : : pbn_b0_2_1130000,
2803 : :
2804 : : pbn_b0_4_1152000,
2805 : :
2806 : : pbn_b0_4_1250000,
2807 : :
2808 : : pbn_b0_2_1843200,
2809 : : pbn_b0_4_1843200,
2810 : :
2811 : : pbn_b0_1_4000000,
2812 : :
2813 : : pbn_b0_bt_1_115200,
2814 : : pbn_b0_bt_2_115200,
2815 : : pbn_b0_bt_4_115200,
2816 : : pbn_b0_bt_8_115200,
2817 : :
2818 : : pbn_b0_bt_1_460800,
2819 : : pbn_b0_bt_2_460800,
2820 : : pbn_b0_bt_4_460800,
2821 : :
2822 : : pbn_b0_bt_1_921600,
2823 : : pbn_b0_bt_2_921600,
2824 : : pbn_b0_bt_4_921600,
2825 : : pbn_b0_bt_8_921600,
2826 : :
2827 : : pbn_b1_1_115200,
2828 : : pbn_b1_2_115200,
2829 : : pbn_b1_4_115200,
2830 : : pbn_b1_8_115200,
2831 : : pbn_b1_16_115200,
2832 : :
2833 : : pbn_b1_1_921600,
2834 : : pbn_b1_2_921600,
2835 : : pbn_b1_4_921600,
2836 : : pbn_b1_8_921600,
2837 : :
2838 : : pbn_b1_2_1250000,
2839 : :
2840 : : pbn_b1_bt_1_115200,
2841 : : pbn_b1_bt_2_115200,
2842 : : pbn_b1_bt_4_115200,
2843 : :
2844 : : pbn_b1_bt_2_921600,
2845 : :
2846 : : pbn_b1_1_1382400,
2847 : : pbn_b1_2_1382400,
2848 : : pbn_b1_4_1382400,
2849 : : pbn_b1_8_1382400,
2850 : :
2851 : : pbn_b2_1_115200,
2852 : : pbn_b2_2_115200,
2853 : : pbn_b2_4_115200,
2854 : : pbn_b2_8_115200,
2855 : :
2856 : : pbn_b2_1_460800,
2857 : : pbn_b2_4_460800,
2858 : : pbn_b2_8_460800,
2859 : : pbn_b2_16_460800,
2860 : :
2861 : : pbn_b2_1_921600,
2862 : : pbn_b2_4_921600,
2863 : : pbn_b2_8_921600,
2864 : :
2865 : : pbn_b2_8_1152000,
2866 : :
2867 : : pbn_b2_bt_1_115200,
2868 : : pbn_b2_bt_2_115200,
2869 : : pbn_b2_bt_4_115200,
2870 : :
2871 : : pbn_b2_bt_2_921600,
2872 : : pbn_b2_bt_4_921600,
2873 : :
2874 : : pbn_b3_2_115200,
2875 : : pbn_b3_4_115200,
2876 : : pbn_b3_8_115200,
2877 : :
2878 : : pbn_b4_bt_2_921600,
2879 : : pbn_b4_bt_4_921600,
2880 : : pbn_b4_bt_8_921600,
2881 : :
2882 : : /*
2883 : : * Board-specific versions.
2884 : : */
2885 : : pbn_panacom,
2886 : : pbn_panacom2,
2887 : : pbn_panacom4,
2888 : : pbn_plx_romulus,
2889 : : pbn_endrun_2_4000000,
2890 : : pbn_oxsemi,
2891 : : pbn_oxsemi_1_4000000,
2892 : : pbn_oxsemi_2_4000000,
2893 : : pbn_oxsemi_4_4000000,
2894 : : pbn_oxsemi_8_4000000,
2895 : : pbn_intel_i960,
2896 : : pbn_sgi_ioc3,
2897 : : pbn_computone_4,
2898 : : pbn_computone_6,
2899 : : pbn_computone_8,
2900 : : pbn_sbsxrsio,
2901 : : pbn_pasemi_1682M,
2902 : : pbn_ni8430_2,
2903 : : pbn_ni8430_4,
2904 : : pbn_ni8430_8,
2905 : : pbn_ni8430_16,
2906 : : pbn_ADDIDATA_PCIe_1_3906250,
2907 : : pbn_ADDIDATA_PCIe_2_3906250,
2908 : : pbn_ADDIDATA_PCIe_4_3906250,
2909 : : pbn_ADDIDATA_PCIe_8_3906250,
2910 : : pbn_ce4100_1_115200,
2911 : : pbn_omegapci,
2912 : : pbn_NETMOS9900_2s_115200,
2913 : : pbn_brcm_trumanage,
2914 : : pbn_fintek_4,
2915 : : pbn_fintek_8,
2916 : : pbn_fintek_12,
2917 : : pbn_fintek_F81504A,
2918 : : pbn_fintek_F81508A,
2919 : : pbn_fintek_F81512A,
2920 : : pbn_wch382_2,
2921 : : pbn_wch384_4,
2922 : : pbn_pericom_PI7C9X7951,
2923 : : pbn_pericom_PI7C9X7952,
2924 : : pbn_pericom_PI7C9X7954,
2925 : : pbn_pericom_PI7C9X7958,
2926 : : pbn_sunix_pci_1s,
2927 : : pbn_sunix_pci_2s,
2928 : : pbn_sunix_pci_4s,
2929 : : pbn_sunix_pci_8s,
2930 : : pbn_sunix_pci_16s,
2931 : : pbn_moxa8250_2p,
2932 : : pbn_moxa8250_4p,
2933 : : pbn_moxa8250_8p,
2934 : : };
2935 : :
2936 : : /*
2937 : : * uart_offset - the space between channels
2938 : : * reg_shift - describes how the UART registers are mapped
2939 : : * to PCI memory by the card.
2940 : : * For example IER register on SBS, Inc. PMC-OctPro is located at
2941 : : * offset 0x10 from the UART base, while UART_IER is defined as 1
2942 : : * in include/linux/serial_reg.h,
2943 : : * see first lines of serial_in() and serial_out() in 8250.c
2944 : : */
2945 : :
2946 : : static struct pciserial_board pci_boards[] = {
2947 : : [pbn_default] = {
2948 : : .flags = FL_BASE0,
2949 : : .num_ports = 1,
2950 : : .base_baud = 115200,
2951 : : .uart_offset = 8,
2952 : : },
2953 : : [pbn_b0_1_115200] = {
2954 : : .flags = FL_BASE0,
2955 : : .num_ports = 1,
2956 : : .base_baud = 115200,
2957 : : .uart_offset = 8,
2958 : : },
2959 : : [pbn_b0_2_115200] = {
2960 : : .flags = FL_BASE0,
2961 : : .num_ports = 2,
2962 : : .base_baud = 115200,
2963 : : .uart_offset = 8,
2964 : : },
2965 : : [pbn_b0_4_115200] = {
2966 : : .flags = FL_BASE0,
2967 : : .num_ports = 4,
2968 : : .base_baud = 115200,
2969 : : .uart_offset = 8,
2970 : : },
2971 : : [pbn_b0_5_115200] = {
2972 : : .flags = FL_BASE0,
2973 : : .num_ports = 5,
2974 : : .base_baud = 115200,
2975 : : .uart_offset = 8,
2976 : : },
2977 : : [pbn_b0_8_115200] = {
2978 : : .flags = FL_BASE0,
2979 : : .num_ports = 8,
2980 : : .base_baud = 115200,
2981 : : .uart_offset = 8,
2982 : : },
2983 : : [pbn_b0_1_921600] = {
2984 : : .flags = FL_BASE0,
2985 : : .num_ports = 1,
2986 : : .base_baud = 921600,
2987 : : .uart_offset = 8,
2988 : : },
2989 : : [pbn_b0_2_921600] = {
2990 : : .flags = FL_BASE0,
2991 : : .num_ports = 2,
2992 : : .base_baud = 921600,
2993 : : .uart_offset = 8,
2994 : : },
2995 : : [pbn_b0_4_921600] = {
2996 : : .flags = FL_BASE0,
2997 : : .num_ports = 4,
2998 : : .base_baud = 921600,
2999 : : .uart_offset = 8,
3000 : : },
3001 : :
3002 : : [pbn_b0_2_1130000] = {
3003 : : .flags = FL_BASE0,
3004 : : .num_ports = 2,
3005 : : .base_baud = 1130000,
3006 : : .uart_offset = 8,
3007 : : },
3008 : :
3009 : : [pbn_b0_4_1152000] = {
3010 : : .flags = FL_BASE0,
3011 : : .num_ports = 4,
3012 : : .base_baud = 1152000,
3013 : : .uart_offset = 8,
3014 : : },
3015 : :
3016 : : [pbn_b0_4_1250000] = {
3017 : : .flags = FL_BASE0,
3018 : : .num_ports = 4,
3019 : : .base_baud = 1250000,
3020 : : .uart_offset = 8,
3021 : : },
3022 : :
3023 : : [pbn_b0_2_1843200] = {
3024 : : .flags = FL_BASE0,
3025 : : .num_ports = 2,
3026 : : .base_baud = 1843200,
3027 : : .uart_offset = 8,
3028 : : },
3029 : : [pbn_b0_4_1843200] = {
3030 : : .flags = FL_BASE0,
3031 : : .num_ports = 4,
3032 : : .base_baud = 1843200,
3033 : : .uart_offset = 8,
3034 : : },
3035 : :
3036 : : [pbn_b0_1_4000000] = {
3037 : : .flags = FL_BASE0,
3038 : : .num_ports = 1,
3039 : : .base_baud = 4000000,
3040 : : .uart_offset = 8,
3041 : : },
3042 : :
3043 : : [pbn_b0_bt_1_115200] = {
3044 : : .flags = FL_BASE0|FL_BASE_BARS,
3045 : : .num_ports = 1,
3046 : : .base_baud = 115200,
3047 : : .uart_offset = 8,
3048 : : },
3049 : : [pbn_b0_bt_2_115200] = {
3050 : : .flags = FL_BASE0|FL_BASE_BARS,
3051 : : .num_ports = 2,
3052 : : .base_baud = 115200,
3053 : : .uart_offset = 8,
3054 : : },
3055 : : [pbn_b0_bt_4_115200] = {
3056 : : .flags = FL_BASE0|FL_BASE_BARS,
3057 : : .num_ports = 4,
3058 : : .base_baud = 115200,
3059 : : .uart_offset = 8,
3060 : : },
3061 : : [pbn_b0_bt_8_115200] = {
3062 : : .flags = FL_BASE0|FL_BASE_BARS,
3063 : : .num_ports = 8,
3064 : : .base_baud = 115200,
3065 : : .uart_offset = 8,
3066 : : },
3067 : :
3068 : : [pbn_b0_bt_1_460800] = {
3069 : : .flags = FL_BASE0|FL_BASE_BARS,
3070 : : .num_ports = 1,
3071 : : .base_baud = 460800,
3072 : : .uart_offset = 8,
3073 : : },
3074 : : [pbn_b0_bt_2_460800] = {
3075 : : .flags = FL_BASE0|FL_BASE_BARS,
3076 : : .num_ports = 2,
3077 : : .base_baud = 460800,
3078 : : .uart_offset = 8,
3079 : : },
3080 : : [pbn_b0_bt_4_460800] = {
3081 : : .flags = FL_BASE0|FL_BASE_BARS,
3082 : : .num_ports = 4,
3083 : : .base_baud = 460800,
3084 : : .uart_offset = 8,
3085 : : },
3086 : :
3087 : : [pbn_b0_bt_1_921600] = {
3088 : : .flags = FL_BASE0|FL_BASE_BARS,
3089 : : .num_ports = 1,
3090 : : .base_baud = 921600,
3091 : : .uart_offset = 8,
3092 : : },
3093 : : [pbn_b0_bt_2_921600] = {
3094 : : .flags = FL_BASE0|FL_BASE_BARS,
3095 : : .num_ports = 2,
3096 : : .base_baud = 921600,
3097 : : .uart_offset = 8,
3098 : : },
3099 : : [pbn_b0_bt_4_921600] = {
3100 : : .flags = FL_BASE0|FL_BASE_BARS,
3101 : : .num_ports = 4,
3102 : : .base_baud = 921600,
3103 : : .uart_offset = 8,
3104 : : },
3105 : : [pbn_b0_bt_8_921600] = {
3106 : : .flags = FL_BASE0|FL_BASE_BARS,
3107 : : .num_ports = 8,
3108 : : .base_baud = 921600,
3109 : : .uart_offset = 8,
3110 : : },
3111 : :
3112 : : [pbn_b1_1_115200] = {
3113 : : .flags = FL_BASE1,
3114 : : .num_ports = 1,
3115 : : .base_baud = 115200,
3116 : : .uart_offset = 8,
3117 : : },
3118 : : [pbn_b1_2_115200] = {
3119 : : .flags = FL_BASE1,
3120 : : .num_ports = 2,
3121 : : .base_baud = 115200,
3122 : : .uart_offset = 8,
3123 : : },
3124 : : [pbn_b1_4_115200] = {
3125 : : .flags = FL_BASE1,
3126 : : .num_ports = 4,
3127 : : .base_baud = 115200,
3128 : : .uart_offset = 8,
3129 : : },
3130 : : [pbn_b1_8_115200] = {
3131 : : .flags = FL_BASE1,
3132 : : .num_ports = 8,
3133 : : .base_baud = 115200,
3134 : : .uart_offset = 8,
3135 : : },
3136 : : [pbn_b1_16_115200] = {
3137 : : .flags = FL_BASE1,
3138 : : .num_ports = 16,
3139 : : .base_baud = 115200,
3140 : : .uart_offset = 8,
3141 : : },
3142 : :
3143 : : [pbn_b1_1_921600] = {
3144 : : .flags = FL_BASE1,
3145 : : .num_ports = 1,
3146 : : .base_baud = 921600,
3147 : : .uart_offset = 8,
3148 : : },
3149 : : [pbn_b1_2_921600] = {
3150 : : .flags = FL_BASE1,
3151 : : .num_ports = 2,
3152 : : .base_baud = 921600,
3153 : : .uart_offset = 8,
3154 : : },
3155 : : [pbn_b1_4_921600] = {
3156 : : .flags = FL_BASE1,
3157 : : .num_ports = 4,
3158 : : .base_baud = 921600,
3159 : : .uart_offset = 8,
3160 : : },
3161 : : [pbn_b1_8_921600] = {
3162 : : .flags = FL_BASE1,
3163 : : .num_ports = 8,
3164 : : .base_baud = 921600,
3165 : : .uart_offset = 8,
3166 : : },
3167 : : [pbn_b1_2_1250000] = {
3168 : : .flags = FL_BASE1,
3169 : : .num_ports = 2,
3170 : : .base_baud = 1250000,
3171 : : .uart_offset = 8,
3172 : : },
3173 : :
3174 : : [pbn_b1_bt_1_115200] = {
3175 : : .flags = FL_BASE1|FL_BASE_BARS,
3176 : : .num_ports = 1,
3177 : : .base_baud = 115200,
3178 : : .uart_offset = 8,
3179 : : },
3180 : : [pbn_b1_bt_2_115200] = {
3181 : : .flags = FL_BASE1|FL_BASE_BARS,
3182 : : .num_ports = 2,
3183 : : .base_baud = 115200,
3184 : : .uart_offset = 8,
3185 : : },
3186 : : [pbn_b1_bt_4_115200] = {
3187 : : .flags = FL_BASE1|FL_BASE_BARS,
3188 : : .num_ports = 4,
3189 : : .base_baud = 115200,
3190 : : .uart_offset = 8,
3191 : : },
3192 : :
3193 : : [pbn_b1_bt_2_921600] = {
3194 : : .flags = FL_BASE1|FL_BASE_BARS,
3195 : : .num_ports = 2,
3196 : : .base_baud = 921600,
3197 : : .uart_offset = 8,
3198 : : },
3199 : :
3200 : : [pbn_b1_1_1382400] = {
3201 : : .flags = FL_BASE1,
3202 : : .num_ports = 1,
3203 : : .base_baud = 1382400,
3204 : : .uart_offset = 8,
3205 : : },
3206 : : [pbn_b1_2_1382400] = {
3207 : : .flags = FL_BASE1,
3208 : : .num_ports = 2,
3209 : : .base_baud = 1382400,
3210 : : .uart_offset = 8,
3211 : : },
3212 : : [pbn_b1_4_1382400] = {
3213 : : .flags = FL_BASE1,
3214 : : .num_ports = 4,
3215 : : .base_baud = 1382400,
3216 : : .uart_offset = 8,
3217 : : },
3218 : : [pbn_b1_8_1382400] = {
3219 : : .flags = FL_BASE1,
3220 : : .num_ports = 8,
3221 : : .base_baud = 1382400,
3222 : : .uart_offset = 8,
3223 : : },
3224 : :
3225 : : [pbn_b2_1_115200] = {
3226 : : .flags = FL_BASE2,
3227 : : .num_ports = 1,
3228 : : .base_baud = 115200,
3229 : : .uart_offset = 8,
3230 : : },
3231 : : [pbn_b2_2_115200] = {
3232 : : .flags = FL_BASE2,
3233 : : .num_ports = 2,
3234 : : .base_baud = 115200,
3235 : : .uart_offset = 8,
3236 : : },
3237 : : [pbn_b2_4_115200] = {
3238 : : .flags = FL_BASE2,
3239 : : .num_ports = 4,
3240 : : .base_baud = 115200,
3241 : : .uart_offset = 8,
3242 : : },
3243 : : [pbn_b2_8_115200] = {
3244 : : .flags = FL_BASE2,
3245 : : .num_ports = 8,
3246 : : .base_baud = 115200,
3247 : : .uart_offset = 8,
3248 : : },
3249 : :
3250 : : [pbn_b2_1_460800] = {
3251 : : .flags = FL_BASE2,
3252 : : .num_ports = 1,
3253 : : .base_baud = 460800,
3254 : : .uart_offset = 8,
3255 : : },
3256 : : [pbn_b2_4_460800] = {
3257 : : .flags = FL_BASE2,
3258 : : .num_ports = 4,
3259 : : .base_baud = 460800,
3260 : : .uart_offset = 8,
3261 : : },
3262 : : [pbn_b2_8_460800] = {
3263 : : .flags = FL_BASE2,
3264 : : .num_ports = 8,
3265 : : .base_baud = 460800,
3266 : : .uart_offset = 8,
3267 : : },
3268 : : [pbn_b2_16_460800] = {
3269 : : .flags = FL_BASE2,
3270 : : .num_ports = 16,
3271 : : .base_baud = 460800,
3272 : : .uart_offset = 8,
3273 : : },
3274 : :
3275 : : [pbn_b2_1_921600] = {
3276 : : .flags = FL_BASE2,
3277 : : .num_ports = 1,
3278 : : .base_baud = 921600,
3279 : : .uart_offset = 8,
3280 : : },
3281 : : [pbn_b2_4_921600] = {
3282 : : .flags = FL_BASE2,
3283 : : .num_ports = 4,
3284 : : .base_baud = 921600,
3285 : : .uart_offset = 8,
3286 : : },
3287 : : [pbn_b2_8_921600] = {
3288 : : .flags = FL_BASE2,
3289 : : .num_ports = 8,
3290 : : .base_baud = 921600,
3291 : : .uart_offset = 8,
3292 : : },
3293 : :
3294 : : [pbn_b2_8_1152000] = {
3295 : : .flags = FL_BASE2,
3296 : : .num_ports = 8,
3297 : : .base_baud = 1152000,
3298 : : .uart_offset = 8,
3299 : : },
3300 : :
3301 : : [pbn_b2_bt_1_115200] = {
3302 : : .flags = FL_BASE2|FL_BASE_BARS,
3303 : : .num_ports = 1,
3304 : : .base_baud = 115200,
3305 : : .uart_offset = 8,
3306 : : },
3307 : : [pbn_b2_bt_2_115200] = {
3308 : : .flags = FL_BASE2|FL_BASE_BARS,
3309 : : .num_ports = 2,
3310 : : .base_baud = 115200,
3311 : : .uart_offset = 8,
3312 : : },
3313 : : [pbn_b2_bt_4_115200] = {
3314 : : .flags = FL_BASE2|FL_BASE_BARS,
3315 : : .num_ports = 4,
3316 : : .base_baud = 115200,
3317 : : .uart_offset = 8,
3318 : : },
3319 : :
3320 : : [pbn_b2_bt_2_921600] = {
3321 : : .flags = FL_BASE2|FL_BASE_BARS,
3322 : : .num_ports = 2,
3323 : : .base_baud = 921600,
3324 : : .uart_offset = 8,
3325 : : },
3326 : : [pbn_b2_bt_4_921600] = {
3327 : : .flags = FL_BASE2|FL_BASE_BARS,
3328 : : .num_ports = 4,
3329 : : .base_baud = 921600,
3330 : : .uart_offset = 8,
3331 : : },
3332 : :
3333 : : [pbn_b3_2_115200] = {
3334 : : .flags = FL_BASE3,
3335 : : .num_ports = 2,
3336 : : .base_baud = 115200,
3337 : : .uart_offset = 8,
3338 : : },
3339 : : [pbn_b3_4_115200] = {
3340 : : .flags = FL_BASE3,
3341 : : .num_ports = 4,
3342 : : .base_baud = 115200,
3343 : : .uart_offset = 8,
3344 : : },
3345 : : [pbn_b3_8_115200] = {
3346 : : .flags = FL_BASE3,
3347 : : .num_ports = 8,
3348 : : .base_baud = 115200,
3349 : : .uart_offset = 8,
3350 : : },
3351 : :
3352 : : [pbn_b4_bt_2_921600] = {
3353 : : .flags = FL_BASE4,
3354 : : .num_ports = 2,
3355 : : .base_baud = 921600,
3356 : : .uart_offset = 8,
3357 : : },
3358 : : [pbn_b4_bt_4_921600] = {
3359 : : .flags = FL_BASE4,
3360 : : .num_ports = 4,
3361 : : .base_baud = 921600,
3362 : : .uart_offset = 8,
3363 : : },
3364 : : [pbn_b4_bt_8_921600] = {
3365 : : .flags = FL_BASE4,
3366 : : .num_ports = 8,
3367 : : .base_baud = 921600,
3368 : : .uart_offset = 8,
3369 : : },
3370 : :
3371 : : /*
3372 : : * Entries following this are board-specific.
3373 : : */
3374 : :
3375 : : /*
3376 : : * Panacom - IOMEM
3377 : : */
3378 : : [pbn_panacom] = {
3379 : : .flags = FL_BASE2,
3380 : : .num_ports = 2,
3381 : : .base_baud = 921600,
3382 : : .uart_offset = 0x400,
3383 : : .reg_shift = 7,
3384 : : },
3385 : : [pbn_panacom2] = {
3386 : : .flags = FL_BASE2|FL_BASE_BARS,
3387 : : .num_ports = 2,
3388 : : .base_baud = 921600,
3389 : : .uart_offset = 0x400,
3390 : : .reg_shift = 7,
3391 : : },
3392 : : [pbn_panacom4] = {
3393 : : .flags = FL_BASE2|FL_BASE_BARS,
3394 : : .num_ports = 4,
3395 : : .base_baud = 921600,
3396 : : .uart_offset = 0x400,
3397 : : .reg_shift = 7,
3398 : : },
3399 : :
3400 : : /* I think this entry is broken - the first_offset looks wrong --rmk */
3401 : : [pbn_plx_romulus] = {
3402 : : .flags = FL_BASE2,
3403 : : .num_ports = 4,
3404 : : .base_baud = 921600,
3405 : : .uart_offset = 8 << 2,
3406 : : .reg_shift = 2,
3407 : : .first_offset = 0x03,
3408 : : },
3409 : :
3410 : : /*
3411 : : * EndRun Technologies
3412 : : * Uses the size of PCI Base region 0 to
3413 : : * signal now many ports are available
3414 : : * 2 port 952 Uart support
3415 : : */
3416 : : [pbn_endrun_2_4000000] = {
3417 : : .flags = FL_BASE0,
3418 : : .num_ports = 2,
3419 : : .base_baud = 4000000,
3420 : : .uart_offset = 0x200,
3421 : : .first_offset = 0x1000,
3422 : : },
3423 : :
3424 : : /*
3425 : : * This board uses the size of PCI Base region 0 to
3426 : : * signal now many ports are available
3427 : : */
3428 : : [pbn_oxsemi] = {
3429 : : .flags = FL_BASE0|FL_REGION_SZ_CAP,
3430 : : .num_ports = 32,
3431 : : .base_baud = 115200,
3432 : : .uart_offset = 8,
3433 : : },
3434 : : [pbn_oxsemi_1_4000000] = {
3435 : : .flags = FL_BASE0,
3436 : : .num_ports = 1,
3437 : : .base_baud = 4000000,
3438 : : .uart_offset = 0x200,
3439 : : .first_offset = 0x1000,
3440 : : },
3441 : : [pbn_oxsemi_2_4000000] = {
3442 : : .flags = FL_BASE0,
3443 : : .num_ports = 2,
3444 : : .base_baud = 4000000,
3445 : : .uart_offset = 0x200,
3446 : : .first_offset = 0x1000,
3447 : : },
3448 : : [pbn_oxsemi_4_4000000] = {
3449 : : .flags = FL_BASE0,
3450 : : .num_ports = 4,
3451 : : .base_baud = 4000000,
3452 : : .uart_offset = 0x200,
3453 : : .first_offset = 0x1000,
3454 : : },
3455 : : [pbn_oxsemi_8_4000000] = {
3456 : : .flags = FL_BASE0,
3457 : : .num_ports = 8,
3458 : : .base_baud = 4000000,
3459 : : .uart_offset = 0x200,
3460 : : .first_offset = 0x1000,
3461 : : },
3462 : :
3463 : :
3464 : : /*
3465 : : * EKF addition for i960 Boards form EKF with serial port.
3466 : : * Max 256 ports.
3467 : : */
3468 : : [pbn_intel_i960] = {
3469 : : .flags = FL_BASE0,
3470 : : .num_ports = 32,
3471 : : .base_baud = 921600,
3472 : : .uart_offset = 8 << 2,
3473 : : .reg_shift = 2,
3474 : : .first_offset = 0x10000,
3475 : : },
3476 : : [pbn_sgi_ioc3] = {
3477 : : .flags = FL_BASE0|FL_NOIRQ,
3478 : : .num_ports = 1,
3479 : : .base_baud = 458333,
3480 : : .uart_offset = 8,
3481 : : .reg_shift = 0,
3482 : : .first_offset = 0x20178,
3483 : : },
3484 : :
3485 : : /*
3486 : : * Computone - uses IOMEM.
3487 : : */
3488 : : [pbn_computone_4] = {
3489 : : .flags = FL_BASE0,
3490 : : .num_ports = 4,
3491 : : .base_baud = 921600,
3492 : : .uart_offset = 0x40,
3493 : : .reg_shift = 2,
3494 : : .first_offset = 0x200,
3495 : : },
3496 : : [pbn_computone_6] = {
3497 : : .flags = FL_BASE0,
3498 : : .num_ports = 6,
3499 : : .base_baud = 921600,
3500 : : .uart_offset = 0x40,
3501 : : .reg_shift = 2,
3502 : : .first_offset = 0x200,
3503 : : },
3504 : : [pbn_computone_8] = {
3505 : : .flags = FL_BASE0,
3506 : : .num_ports = 8,
3507 : : .base_baud = 921600,
3508 : : .uart_offset = 0x40,
3509 : : .reg_shift = 2,
3510 : : .first_offset = 0x200,
3511 : : },
3512 : : [pbn_sbsxrsio] = {
3513 : : .flags = FL_BASE0,
3514 : : .num_ports = 8,
3515 : : .base_baud = 460800,
3516 : : .uart_offset = 256,
3517 : : .reg_shift = 4,
3518 : : },
3519 : : /*
3520 : : * PA Semi PWRficient PA6T-1682M on-chip UART
3521 : : */
3522 : : [pbn_pasemi_1682M] = {
3523 : : .flags = FL_BASE0,
3524 : : .num_ports = 1,
3525 : : .base_baud = 8333333,
3526 : : },
3527 : : /*
3528 : : * National Instruments 843x
3529 : : */
3530 : : [pbn_ni8430_16] = {
3531 : : .flags = FL_BASE0,
3532 : : .num_ports = 16,
3533 : : .base_baud = 3686400,
3534 : : .uart_offset = 0x10,
3535 : : .first_offset = 0x800,
3536 : : },
3537 : : [pbn_ni8430_8] = {
3538 : : .flags = FL_BASE0,
3539 : : .num_ports = 8,
3540 : : .base_baud = 3686400,
3541 : : .uart_offset = 0x10,
3542 : : .first_offset = 0x800,
3543 : : },
3544 : : [pbn_ni8430_4] = {
3545 : : .flags = FL_BASE0,
3546 : : .num_ports = 4,
3547 : : .base_baud = 3686400,
3548 : : .uart_offset = 0x10,
3549 : : .first_offset = 0x800,
3550 : : },
3551 : : [pbn_ni8430_2] = {
3552 : : .flags = FL_BASE0,
3553 : : .num_ports = 2,
3554 : : .base_baud = 3686400,
3555 : : .uart_offset = 0x10,
3556 : : .first_offset = 0x800,
3557 : : },
3558 : : /*
3559 : : * ADDI-DATA GmbH PCI-Express communication cards <info@addi-data.com>
3560 : : */
3561 : : [pbn_ADDIDATA_PCIe_1_3906250] = {
3562 : : .flags = FL_BASE0,
3563 : : .num_ports = 1,
3564 : : .base_baud = 3906250,
3565 : : .uart_offset = 0x200,
3566 : : .first_offset = 0x1000,
3567 : : },
3568 : : [pbn_ADDIDATA_PCIe_2_3906250] = {
3569 : : .flags = FL_BASE0,
3570 : : .num_ports = 2,
3571 : : .base_baud = 3906250,
3572 : : .uart_offset = 0x200,
3573 : : .first_offset = 0x1000,
3574 : : },
3575 : : [pbn_ADDIDATA_PCIe_4_3906250] = {
3576 : : .flags = FL_BASE0,
3577 : : .num_ports = 4,
3578 : : .base_baud = 3906250,
3579 : : .uart_offset = 0x200,
3580 : : .first_offset = 0x1000,
3581 : : },
3582 : : [pbn_ADDIDATA_PCIe_8_3906250] = {
3583 : : .flags = FL_BASE0,
3584 : : .num_ports = 8,
3585 : : .base_baud = 3906250,
3586 : : .uart_offset = 0x200,
3587 : : .first_offset = 0x1000,
3588 : : },
3589 : : [pbn_ce4100_1_115200] = {
3590 : : .flags = FL_BASE_BARS,
3591 : : .num_ports = 2,
3592 : : .base_baud = 921600,
3593 : : .reg_shift = 2,
3594 : : },
3595 : : [pbn_omegapci] = {
3596 : : .flags = FL_BASE0,
3597 : : .num_ports = 8,
3598 : : .base_baud = 115200,
3599 : : .uart_offset = 0x200,
3600 : : },
3601 : : [pbn_NETMOS9900_2s_115200] = {
3602 : : .flags = FL_BASE0,
3603 : : .num_ports = 2,
3604 : : .base_baud = 115200,
3605 : : },
3606 : : [pbn_brcm_trumanage] = {
3607 : : .flags = FL_BASE0,
3608 : : .num_ports = 1,
3609 : : .reg_shift = 2,
3610 : : .base_baud = 115200,
3611 : : },
3612 : : [pbn_fintek_4] = {
3613 : : .num_ports = 4,
3614 : : .uart_offset = 8,
3615 : : .base_baud = 115200,
3616 : : .first_offset = 0x40,
3617 : : },
3618 : : [pbn_fintek_8] = {
3619 : : .num_ports = 8,
3620 : : .uart_offset = 8,
3621 : : .base_baud = 115200,
3622 : : .first_offset = 0x40,
3623 : : },
3624 : : [pbn_fintek_12] = {
3625 : : .num_ports = 12,
3626 : : .uart_offset = 8,
3627 : : .base_baud = 115200,
3628 : : .first_offset = 0x40,
3629 : : },
3630 : : [pbn_fintek_F81504A] = {
3631 : : .num_ports = 4,
3632 : : .uart_offset = 8,
3633 : : .base_baud = 115200,
3634 : : },
3635 : : [pbn_fintek_F81508A] = {
3636 : : .num_ports = 8,
3637 : : .uart_offset = 8,
3638 : : .base_baud = 115200,
3639 : : },
3640 : : [pbn_fintek_F81512A] = {
3641 : : .num_ports = 12,
3642 : : .uart_offset = 8,
3643 : : .base_baud = 115200,
3644 : : },
3645 : : [pbn_wch382_2] = {
3646 : : .flags = FL_BASE0,
3647 : : .num_ports = 2,
3648 : : .base_baud = 115200,
3649 : : .uart_offset = 8,
3650 : : .first_offset = 0xC0,
3651 : : },
3652 : : [pbn_wch384_4] = {
3653 : : .flags = FL_BASE0,
3654 : : .num_ports = 4,
3655 : : .base_baud = 115200,
3656 : : .uart_offset = 8,
3657 : : .first_offset = 0xC0,
3658 : : },
3659 : : /*
3660 : : * Pericom PI7C9X795[1248] Uno/Dual/Quad/Octal UART
3661 : : */
3662 : : [pbn_pericom_PI7C9X7951] = {
3663 : : .flags = FL_BASE0,
3664 : : .num_ports = 1,
3665 : : .base_baud = 921600,
3666 : : .uart_offset = 0x8,
3667 : : },
3668 : : [pbn_pericom_PI7C9X7952] = {
3669 : : .flags = FL_BASE0,
3670 : : .num_ports = 2,
3671 : : .base_baud = 921600,
3672 : : .uart_offset = 0x8,
3673 : : },
3674 : : [pbn_pericom_PI7C9X7954] = {
3675 : : .flags = FL_BASE0,
3676 : : .num_ports = 4,
3677 : : .base_baud = 921600,
3678 : : .uart_offset = 0x8,
3679 : : },
3680 : : [pbn_pericom_PI7C9X7958] = {
3681 : : .flags = FL_BASE0,
3682 : : .num_ports = 8,
3683 : : .base_baud = 921600,
3684 : : .uart_offset = 0x8,
3685 : : },
3686 : : [pbn_sunix_pci_1s] = {
3687 : : .num_ports = 1,
3688 : : .base_baud = 921600,
3689 : : .uart_offset = 0x8,
3690 : : },
3691 : : [pbn_sunix_pci_2s] = {
3692 : : .num_ports = 2,
3693 : : .base_baud = 921600,
3694 : : .uart_offset = 0x8,
3695 : : },
3696 : : [pbn_sunix_pci_4s] = {
3697 : : .num_ports = 4,
3698 : : .base_baud = 921600,
3699 : : .uart_offset = 0x8,
3700 : : },
3701 : : [pbn_sunix_pci_8s] = {
3702 : : .num_ports = 8,
3703 : : .base_baud = 921600,
3704 : : .uart_offset = 0x8,
3705 : : },
3706 : : [pbn_sunix_pci_16s] = {
3707 : : .num_ports = 16,
3708 : : .base_baud = 921600,
3709 : : .uart_offset = 0x8,
3710 : : },
3711 : : [pbn_moxa8250_2p] = {
3712 : : .flags = FL_BASE1,
3713 : : .num_ports = 2,
3714 : : .base_baud = 921600,
3715 : : .uart_offset = 0x200,
3716 : : },
3717 : : [pbn_moxa8250_4p] = {
3718 : : .flags = FL_BASE1,
3719 : : .num_ports = 4,
3720 : : .base_baud = 921600,
3721 : : .uart_offset = 0x200,
3722 : : },
3723 : : [pbn_moxa8250_8p] = {
3724 : : .flags = FL_BASE1,
3725 : : .num_ports = 8,
3726 : : .base_baud = 921600,
3727 : : .uart_offset = 0x200,
3728 : : },
3729 : : };
3730 : :
3731 : : static const struct pci_device_id blacklist[] = {
3732 : : /* softmodems */
3733 : : { PCI_VDEVICE(AL, 0x5457), }, /* ALi Corporation M5457 AC'97 Modem */
3734 : : { PCI_VDEVICE(MOTOROLA, 0x3052), }, /* Motorola Si3052-based modem */
3735 : : { PCI_DEVICE(0x1543, 0x3052), }, /* Si3052-based modem, default IDs */
3736 : :
3737 : : /* multi-io cards handled by parport_serial */
3738 : : { PCI_DEVICE(0x4348, 0x7053), }, /* WCH CH353 2S1P */
3739 : : { PCI_DEVICE(0x4348, 0x5053), }, /* WCH CH353 1S1P */
3740 : : { PCI_DEVICE(0x1c00, 0x3250), }, /* WCH CH382 2S1P */
3741 : :
3742 : : /* Intel platforms with MID UART */
3743 : : { PCI_VDEVICE(INTEL, 0x081b), },
3744 : : { PCI_VDEVICE(INTEL, 0x081c), },
3745 : : { PCI_VDEVICE(INTEL, 0x081d), },
3746 : : { PCI_VDEVICE(INTEL, 0x1191), },
3747 : : { PCI_VDEVICE(INTEL, 0x18d8), },
3748 : : { PCI_VDEVICE(INTEL, 0x19d8), },
3749 : :
3750 : : /* Intel platforms with DesignWare UART */
3751 : : { PCI_VDEVICE(INTEL, 0x0936), },
3752 : : { PCI_VDEVICE(INTEL, 0x0f0a), },
3753 : : { PCI_VDEVICE(INTEL, 0x0f0c), },
3754 : : { PCI_VDEVICE(INTEL, 0x228a), },
3755 : : { PCI_VDEVICE(INTEL, 0x228c), },
3756 : : { PCI_VDEVICE(INTEL, 0x9ce3), },
3757 : : { PCI_VDEVICE(INTEL, 0x9ce4), },
3758 : :
3759 : : /* Exar devices */
3760 : : { PCI_VDEVICE(EXAR, PCI_ANY_ID), },
3761 : : { PCI_VDEVICE(COMMTECH, PCI_ANY_ID), },
3762 : :
3763 : : /* End of the black list */
3764 : : { }
3765 : : };
3766 : :
3767 : : static int serial_pci_is_class_communication(struct pci_dev *dev)
3768 : : {
3769 : : /*
3770 : : * If it is not a communications device or the programming
3771 : : * interface is greater than 6, give up.
3772 : : */
3773 : : if ((((dev->class >> 8) != PCI_CLASS_COMMUNICATION_SERIAL) &&
3774 : : ((dev->class >> 8) != PCI_CLASS_COMMUNICATION_MULTISERIAL) &&
3775 : : ((dev->class >> 8) != PCI_CLASS_COMMUNICATION_MODEM)) ||
3776 : : (dev->class & 0xff) > 6)
3777 : : return -ENODEV;
3778 : :
3779 : : return 0;
3780 : : }
3781 : :
3782 : : /*
3783 : : * Given a complete unknown PCI device, try to use some heuristics to
3784 : : * guess what the configuration might be, based on the pitiful PCI
3785 : : * serial specs. Returns 0 on success, -ENODEV on failure.
3786 : : */
3787 : : static int
3788 : : serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
3789 : : {
3790 : : int num_iomem, num_port, first_port = -1, i;
3791 : : int rc;
3792 : :
3793 : : rc = serial_pci_is_class_communication(dev);
3794 : : if (rc)
3795 : : return rc;
3796 : :
3797 : : /*
3798 : : * Should we try to make guesses for multiport serial devices later?
3799 : : */
3800 : : if ((dev->class >> 8) == PCI_CLASS_COMMUNICATION_MULTISERIAL)
3801 : : return -ENODEV;
3802 : :
3803 : : num_iomem = num_port = 0;
3804 : : for (i = 0; i < PCI_STD_NUM_BARS; i++) {
3805 : : if (pci_resource_flags(dev, i) & IORESOURCE_IO) {
3806 : : num_port++;
3807 : : if (first_port == -1)
3808 : : first_port = i;
3809 : : }
3810 : : if (pci_resource_flags(dev, i) & IORESOURCE_MEM)
3811 : : num_iomem++;
3812 : : }
3813 : :
3814 : : /*
3815 : : * If there is 1 or 0 iomem regions, and exactly one port,
3816 : : * use it. We guess the number of ports based on the IO
3817 : : * region size.
3818 : : */
3819 : : if (num_iomem <= 1 && num_port == 1) {
3820 : : board->flags = first_port;
3821 : : board->num_ports = pci_resource_len(dev, first_port) / 8;
3822 : : return 0;
3823 : : }
3824 : :
3825 : : /*
3826 : : * Now guess if we've got a board which indexes by BARs.
3827 : : * Each IO BAR should be 8 bytes, and they should follow
3828 : : * consecutively.
3829 : : */
3830 : : first_port = -1;
3831 : : num_port = 0;
3832 : : for (i = 0; i < PCI_STD_NUM_BARS; i++) {
3833 : : if (pci_resource_flags(dev, i) & IORESOURCE_IO &&
3834 : : pci_resource_len(dev, i) == 8 &&
3835 : : (first_port == -1 || (first_port + num_port) == i)) {
3836 : : num_port++;
3837 : : if (first_port == -1)
3838 : : first_port = i;
3839 : : }
3840 : : }
3841 : :
3842 : : if (num_port > 1) {
3843 : : board->flags = first_port | FL_BASE_BARS;
3844 : : board->num_ports = num_port;
3845 : : return 0;
3846 : : }
3847 : :
3848 : : return -ENODEV;
3849 : : }
3850 : :
3851 : : static inline int
3852 : 0 : serial_pci_matches(const struct pciserial_board *board,
3853 : : const struct pciserial_board *guessed)
3854 : : {
3855 : 0 : return
3856 : 0 : board->num_ports == guessed->num_ports &&
3857 [ # # ]: 0 : board->base_baud == guessed->base_baud &&
3858 [ # # ]: 0 : board->uart_offset == guessed->uart_offset &&
3859 [ # # # # ]: 0 : board->reg_shift == guessed->reg_shift &&
3860 [ # # ]: 0 : board->first_offset == guessed->first_offset;
3861 : : }
3862 : :
3863 : : struct serial_private *
3864 : 0 : pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
3865 : : {
3866 : 0 : struct uart_8250_port uart;
3867 : 0 : struct serial_private *priv;
3868 : 0 : struct pci_serial_quirk *quirk;
3869 : 0 : int rc, nr_ports, i;
3870 : :
3871 : 0 : nr_ports = board->num_ports;
3872 : :
3873 : : /*
3874 : : * Find an init and setup quirks.
3875 : : */
3876 : 0 : quirk = find_quirk(dev);
3877 : :
3878 : : /*
3879 : : * Run the new-style initialization function.
3880 : : * The initialization function returns:
3881 : : * <0 - error
3882 : : * 0 - use board->num_ports
3883 : : * >0 - number of ports
3884 : : */
3885 [ # # ]: 0 : if (quirk->init) {
3886 : 0 : rc = quirk->init(dev);
3887 [ # # ]: 0 : if (rc < 0) {
3888 : 0 : priv = ERR_PTR(rc);
3889 : 0 : goto err_out;
3890 : : }
3891 [ # # ]: 0 : if (rc)
3892 : 0 : nr_ports = rc;
3893 : : }
3894 : :
3895 : 0 : priv = kzalloc(sizeof(struct serial_private) +
3896 : : sizeof(unsigned int) * nr_ports,
3897 : : GFP_KERNEL);
3898 [ # # ]: 0 : if (!priv) {
3899 : 0 : priv = ERR_PTR(-ENOMEM);
3900 : 0 : goto err_deinit;
3901 : : }
3902 : :
3903 : 0 : priv->dev = dev;
3904 : 0 : priv->quirk = quirk;
3905 : :
3906 : 0 : memset(&uart, 0, sizeof(uart));
3907 : 0 : uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
3908 : 0 : uart.port.uartclk = board->base_baud * 16;
3909 : :
3910 [ # # ]: 0 : if (pci_match_id(pci_use_msi, dev)) {
3911 : 0 : dev_dbg(&dev->dev, "Using MSI(-X) interrupts\n");
3912 : 0 : pci_set_master(dev);
3913 : 0 : rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES);
3914 : : } else {
3915 : 0 : dev_dbg(&dev->dev, "Using legacy interrupts\n");
3916 : 0 : rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_LEGACY);
3917 : : }
3918 [ # # ]: 0 : if (rc < 0) {
3919 : 0 : kfree(priv);
3920 : 0 : priv = ERR_PTR(rc);
3921 : 0 : goto err_deinit;
3922 : : }
3923 : :
3924 : 0 : uart.port.irq = pci_irq_vector(dev, 0);
3925 : 0 : uart.port.dev = &dev->dev;
3926 : :
3927 [ # # ]: 0 : for (i = 0; i < nr_ports; i++) {
3928 [ # # ]: 0 : if (quirk->setup(priv, board, &uart, i))
3929 : : break;
3930 : :
3931 : 0 : dev_dbg(&dev->dev, "Setup PCI port: port %lx, irq %d, type %d\n",
3932 : : uart.port.iobase, uart.port.irq, uart.port.iotype);
3933 : :
3934 : 0 : priv->line[i] = serial8250_register_8250_port(&uart);
3935 [ # # ]: 0 : if (priv->line[i] < 0) {
3936 : 0 : dev_err(&dev->dev,
3937 : : "Couldn't register serial port %lx, irq %d, type %d, error %d\n",
3938 : : uart.port.iobase, uart.port.irq,
3939 : : uart.port.iotype, priv->line[i]);
3940 : 0 : break;
3941 : : }
3942 : : }
3943 : 0 : priv->nr = i;
3944 : 0 : priv->board = board;
3945 : 0 : return priv;
3946 : :
3947 : 0 : err_deinit:
3948 [ # # ]: 0 : if (quirk->exit)
3949 : 0 : quirk->exit(dev);
3950 : 0 : err_out:
3951 : : return priv;
3952 : : }
3953 : : EXPORT_SYMBOL_GPL(pciserial_init_ports);
3954 : :
3955 : 0 : static void pciserial_detach_ports(struct serial_private *priv)
3956 : : {
3957 : 0 : struct pci_serial_quirk *quirk;
3958 : 0 : int i;
3959 : :
3960 [ # # ]: 0 : for (i = 0; i < priv->nr; i++)
3961 : 0 : serial8250_unregister_port(priv->line[i]);
3962 : :
3963 : : /*
3964 : : * Find the exit quirks.
3965 : : */
3966 : 0 : quirk = find_quirk(priv->dev);
3967 [ # # ]: 0 : if (quirk->exit)
3968 : 0 : quirk->exit(priv->dev);
3969 : 0 : }
3970 : :
3971 : 0 : void pciserial_remove_ports(struct serial_private *priv)
3972 : : {
3973 : 0 : pciserial_detach_ports(priv);
3974 : 0 : kfree(priv);
3975 : 0 : }
3976 : : EXPORT_SYMBOL_GPL(pciserial_remove_ports);
3977 : :
3978 : 0 : void pciserial_suspend_ports(struct serial_private *priv)
3979 : : {
3980 : 0 : int i;
3981 : :
3982 [ # # ]: 0 : for (i = 0; i < priv->nr; i++)
3983 [ # # ]: 0 : if (priv->line[i] >= 0)
3984 : 0 : serial8250_suspend_port(priv->line[i]);
3985 : :
3986 : : /*
3987 : : * Ensure that every init quirk is properly torn down
3988 : : */
3989 [ # # ]: 0 : if (priv->quirk->exit)
3990 : 0 : priv->quirk->exit(priv->dev);
3991 : 0 : }
3992 : : EXPORT_SYMBOL_GPL(pciserial_suspend_ports);
3993 : :
3994 : 0 : void pciserial_resume_ports(struct serial_private *priv)
3995 : : {
3996 : 0 : int i;
3997 : :
3998 : : /*
3999 : : * Ensure that the board is correctly configured.
4000 : : */
4001 [ # # ]: 0 : if (priv->quirk->init)
4002 : 0 : priv->quirk->init(priv->dev);
4003 : :
4004 [ # # ]: 0 : for (i = 0; i < priv->nr; i++)
4005 [ # # ]: 0 : if (priv->line[i] >= 0)
4006 : 0 : serial8250_resume_port(priv->line[i]);
4007 : 0 : }
4008 : : EXPORT_SYMBOL_GPL(pciserial_resume_ports);
4009 : :
4010 : : /*
4011 : : * Probe one serial board. Unfortunately, there is no rhyme nor reason
4012 : : * to the arrangement of serial ports on a PCI card.
4013 : : */
4014 : : static int
4015 : 78 : pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
4016 : : {
4017 : 78 : struct pci_serial_quirk *quirk;
4018 : 78 : struct serial_private *priv;
4019 : 78 : const struct pciserial_board *board;
4020 : 78 : const struct pci_device_id *exclude;
4021 : 78 : struct pciserial_board tmp;
4022 : 78 : int rc;
4023 : :
4024 : 78 : quirk = find_quirk(dev);
4025 [ - + ]: 78 : if (quirk->probe) {
4026 : 0 : rc = quirk->probe(dev);
4027 [ # # ]: 0 : if (rc)
4028 : : return rc;
4029 : : }
4030 : :
4031 [ - + ]: 78 : if (ent->driver_data >= ARRAY_SIZE(pci_boards)) {
4032 : 0 : dev_err(&dev->dev, "invalid driver_data: %ld\n",
4033 : : ent->driver_data);
4034 : 0 : return -EINVAL;
4035 : : }
4036 : :
4037 : 78 : board = &pci_boards[ent->driver_data];
4038 : :
4039 : 78 : exclude = pci_match_id(blacklist, dev);
4040 [ + - ]: 78 : if (exclude)
4041 : : return -ENODEV;
4042 : :
4043 : 78 : rc = pcim_enable_device(dev);
4044 : 78 : pci_save_state(dev);
4045 [ + - ]: 78 : if (rc)
4046 : : return rc;
4047 : :
4048 [ + - ]: 78 : if (ent->driver_data == pbn_default) {
4049 : : /*
4050 : : * Use a copy of the pci_board entry for this;
4051 : : * avoid changing entries in the table.
4052 : : */
4053 : 78 : memcpy(&tmp, board, sizeof(struct pciserial_board));
4054 : 78 : board = &tmp;
4055 : :
4056 : : /*
4057 : : * We matched one of our class entries. Try to
4058 : : * determine the parameters of this board.
4059 : : */
4060 : 78 : rc = serial_pci_guess_board(dev, &tmp);
4061 [ - + ]: 78 : if (rc)
4062 : : return rc;
4063 : : } else {
4064 : : /*
4065 : : * We matched an explicit entry. If we are able to
4066 : : * detect this boards settings with our heuristic,
4067 : : * then we no longer need this entry.
4068 : : */
4069 : 0 : memcpy(&tmp, &pci_boards[pbn_default],
4070 : : sizeof(struct pciserial_board));
4071 : 0 : rc = serial_pci_guess_board(dev, &tmp);
4072 [ # # ]: 0 : if (rc == 0 && serial_pci_matches(board, &tmp))
4073 : 0 : moan_device("Redundant entry in serial pci_table.",
4074 : : dev);
4075 : : }
4076 : :
4077 : 0 : priv = pciserial_init_ports(dev, board);
4078 [ # # ]: 0 : if (IS_ERR(priv))
4079 : 0 : return PTR_ERR(priv);
4080 : :
4081 : 0 : pci_set_drvdata(dev, priv);
4082 : 0 : return 0;
4083 : : }
4084 : :
4085 : 0 : static void pciserial_remove_one(struct pci_dev *dev)
4086 : : {
4087 : 0 : struct serial_private *priv = pci_get_drvdata(dev);
4088 : :
4089 : 0 : pciserial_remove_ports(priv);
4090 : 0 : }
4091 : :
4092 : : #ifdef CONFIG_PM_SLEEP
4093 : 0 : static int pciserial_suspend_one(struct device *dev)
4094 : : {
4095 [ # # ]: 0 : struct serial_private *priv = dev_get_drvdata(dev);
4096 : :
4097 [ # # ]: 0 : if (priv)
4098 : 0 : pciserial_suspend_ports(priv);
4099 : :
4100 : 0 : return 0;
4101 : : }
4102 : :
4103 : 0 : static int pciserial_resume_one(struct device *dev)
4104 : : {
4105 : 0 : struct pci_dev *pdev = to_pci_dev(dev);
4106 [ # # ]: 0 : struct serial_private *priv = pci_get_drvdata(pdev);
4107 : 0 : int err;
4108 : :
4109 [ # # ]: 0 : if (priv) {
4110 : : /*
4111 : : * The device may have been disabled. Re-enable it.
4112 : : */
4113 : 0 : err = pci_enable_device(pdev);
4114 : : /* FIXME: We cannot simply error out here */
4115 [ # # ]: 0 : if (err)
4116 : 0 : dev_err(dev, "Unable to re-enable ports, trying to continue.\n");
4117 : 0 : pciserial_resume_ports(priv);
4118 : : }
4119 : 0 : return 0;
4120 : : }
4121 : : #endif
4122 : :
4123 : : static SIMPLE_DEV_PM_OPS(pciserial_pm_ops, pciserial_suspend_one,
4124 : : pciserial_resume_one);
4125 : :
4126 : : static const struct pci_device_id serial_pci_tbl[] = {
4127 : : /* Advantech use PCI_DEVICE_ID_ADVANTECH_PCI3620 (0x3620) as 'PCI_SUBVENDOR_ID' */
4128 : : { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3620,
4129 : : PCI_DEVICE_ID_ADVANTECH_PCI3620, 0x0001, 0, 0,
4130 : : pbn_b2_8_921600 },
4131 : : /* Advantech also use 0x3618 and 0xf618 */
4132 : : { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3618,
4133 : : PCI_DEVICE_ID_ADVANTECH_PCI3618, PCI_ANY_ID, 0, 0,
4134 : : pbn_b0_4_921600 },
4135 : : { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCIf618,
4136 : : PCI_DEVICE_ID_ADVANTECH_PCI3618, PCI_ANY_ID, 0, 0,
4137 : : pbn_b0_4_921600 },
4138 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
4139 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4140 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0,
4141 : : pbn_b1_8_1382400 },
4142 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
4143 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4144 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_232, 0, 0,
4145 : : pbn_b1_4_1382400 },
4146 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
4147 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4148 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_232, 0, 0,
4149 : : pbn_b1_2_1382400 },
4150 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4151 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4152 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0,
4153 : : pbn_b1_8_1382400 },
4154 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4155 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4156 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_232, 0, 0,
4157 : : pbn_b1_4_1382400 },
4158 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4159 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4160 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_232, 0, 0,
4161 : : pbn_b1_2_1382400 },
4162 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4163 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4164 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485, 0, 0,
4165 : : pbn_b1_8_921600 },
4166 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4167 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4168 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_4_4, 0, 0,
4169 : : pbn_b1_8_921600 },
4170 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4171 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4172 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485, 0, 0,
4173 : : pbn_b1_4_921600 },
4174 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4175 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4176 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485_2_2, 0, 0,
4177 : : pbn_b1_4_921600 },
4178 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4179 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4180 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_485, 0, 0,
4181 : : pbn_b1_2_921600 },
4182 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4183 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4184 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_2_6, 0, 0,
4185 : : pbn_b1_8_921600 },
4186 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4187 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4188 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH081101V1, 0, 0,
4189 : : pbn_b1_8_921600 },
4190 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4191 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4192 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH041101V1, 0, 0,
4193 : : pbn_b1_4_921600 },
4194 : : { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V351,
4195 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4196 : : PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_20MHZ, 0, 0,
4197 : : pbn_b1_2_1250000 },
4198 : : { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4199 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4200 : : PCI_SUBDEVICE_ID_CONNECT_TECH_TITAN_2, 0, 0,
4201 : : pbn_b0_2_1843200 },
4202 : : { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4203 : : PCI_SUBVENDOR_ID_CONNECT_TECH,
4204 : : PCI_SUBDEVICE_ID_CONNECT_TECH_TITAN_4, 0, 0,
4205 : : pbn_b0_4_1843200 },
4206 : : { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4207 : : PCI_VENDOR_ID_AFAVLAB,
4208 : : PCI_SUBDEVICE_ID_AFAVLAB_P061, 0, 0,
4209 : : pbn_b0_4_1152000 },
4210 : : { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530,
4211 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4212 : : pbn_b2_bt_1_115200 },
4213 : : { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM2,
4214 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4215 : : pbn_b2_bt_2_115200 },
4216 : : { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM422,
4217 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4218 : : pbn_b2_bt_4_115200 },
4219 : : { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM232,
4220 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4221 : : pbn_b2_bt_2_115200 },
4222 : : { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_COMM4,
4223 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4224 : : pbn_b2_bt_4_115200 },
4225 : : { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_COMM8,
4226 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4227 : : pbn_b2_8_115200 },
4228 : : { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_7803,
4229 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4230 : : pbn_b2_8_460800 },
4231 : : { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM8,
4232 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4233 : : pbn_b2_8_115200 },
4234 : :
4235 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_GTEK_SERIAL2,
4236 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4237 : : pbn_b2_bt_2_115200 },
4238 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_SPCOM200,
4239 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4240 : : pbn_b2_bt_2_921600 },
4241 : : /*
4242 : : * VScom SPCOM800, from sl@s.pl
4243 : : */
4244 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_SPCOM800,
4245 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4246 : : pbn_b2_8_921600 },
4247 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_1077,
4248 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4249 : : pbn_b2_4_921600 },
4250 : : /* Unknown card - subdevice 0x1584 */
4251 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4252 : : PCI_VENDOR_ID_PLX,
4253 : : PCI_SUBDEVICE_ID_UNKNOWN_0x1584, 0, 0,
4254 : : pbn_b2_4_115200 },
4255 : : /* Unknown card - subdevice 0x1588 */
4256 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4257 : : PCI_VENDOR_ID_PLX,
4258 : : PCI_SUBDEVICE_ID_UNKNOWN_0x1588, 0, 0,
4259 : : pbn_b2_8_115200 },
4260 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4261 : : PCI_SUBVENDOR_ID_KEYSPAN,
4262 : : PCI_SUBDEVICE_ID_KEYSPAN_SX2, 0, 0,
4263 : : pbn_panacom },
4264 : : { PCI_VENDOR_ID_PANACOM, PCI_DEVICE_ID_PANACOM_QUADMODEM,
4265 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4266 : : pbn_panacom4 },
4267 : : { PCI_VENDOR_ID_PANACOM, PCI_DEVICE_ID_PANACOM_DUALMODEM,
4268 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4269 : : pbn_panacom2 },
4270 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
4271 : : PCI_VENDOR_ID_ESDGMBH,
4272 : : PCI_DEVICE_ID_ESDGMBH_CPCIASIO4, 0, 0,
4273 : : pbn_b2_4_115200 },
4274 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4275 : : PCI_SUBVENDOR_ID_CHASE_PCIFAST,
4276 : : PCI_SUBDEVICE_ID_CHASE_PCIFAST4, 0, 0,
4277 : : pbn_b2_4_460800 },
4278 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4279 : : PCI_SUBVENDOR_ID_CHASE_PCIFAST,
4280 : : PCI_SUBDEVICE_ID_CHASE_PCIFAST8, 0, 0,
4281 : : pbn_b2_8_460800 },
4282 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4283 : : PCI_SUBVENDOR_ID_CHASE_PCIFAST,
4284 : : PCI_SUBDEVICE_ID_CHASE_PCIFAST16, 0, 0,
4285 : : pbn_b2_16_460800 },
4286 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4287 : : PCI_SUBVENDOR_ID_CHASE_PCIFAST,
4288 : : PCI_SUBDEVICE_ID_CHASE_PCIFAST16FMC, 0, 0,
4289 : : pbn_b2_16_460800 },
4290 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4291 : : PCI_SUBVENDOR_ID_CHASE_PCIRAS,
4292 : : PCI_SUBDEVICE_ID_CHASE_PCIRAS4, 0, 0,
4293 : : pbn_b2_4_460800 },
4294 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4295 : : PCI_SUBVENDOR_ID_CHASE_PCIRAS,
4296 : : PCI_SUBDEVICE_ID_CHASE_PCIRAS8, 0, 0,
4297 : : pbn_b2_8_460800 },
4298 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
4299 : : PCI_SUBVENDOR_ID_EXSYS,
4300 : : PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0,
4301 : : pbn_b2_4_115200 },
4302 : : /*
4303 : : * Megawolf Romulus PCI Serial Card, from Mike Hudson
4304 : : * (Exoray@isys.ca)
4305 : : */
4306 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_ROMULUS,
4307 : : 0x10b5, 0x106a, 0, 0,
4308 : : pbn_plx_romulus },
4309 : : /*
4310 : : * EndRun Technologies. PCI express device range.
4311 : : * EndRun PTP/1588 has 2 Native UARTs.
4312 : : */
4313 : : { PCI_VENDOR_ID_ENDRUN, PCI_DEVICE_ID_ENDRUN_1588,
4314 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4315 : : pbn_endrun_2_4000000 },
4316 : : /*
4317 : : * Quatech cards. These actually have configurable clocks but for
4318 : : * now we just use the default.
4319 : : *
4320 : : * 100 series are RS232, 200 series RS422,
4321 : : */
4322 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC100,
4323 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4324 : : pbn_b1_4_115200 },
4325 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100,
4326 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4327 : : pbn_b1_2_115200 },
4328 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100E,
4329 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4330 : : pbn_b2_2_115200 },
4331 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC200,
4332 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4333 : : pbn_b1_2_115200 },
4334 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC200E,
4335 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4336 : : pbn_b2_2_115200 },
4337 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC200,
4338 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4339 : : pbn_b1_4_115200 },
4340 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100D,
4341 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4342 : : pbn_b1_8_115200 },
4343 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100M,
4344 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4345 : : pbn_b1_8_115200 },
4346 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCP100,
4347 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4348 : : pbn_b1_4_115200 },
4349 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCP100,
4350 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4351 : : pbn_b1_2_115200 },
4352 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCP200,
4353 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4354 : : pbn_b1_4_115200 },
4355 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCP200,
4356 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4357 : : pbn_b1_2_115200 },
4358 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCLP100,
4359 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4360 : : pbn_b2_4_115200 },
4361 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCLP100,
4362 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4363 : : pbn_b2_2_115200 },
4364 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SSCLP100,
4365 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4366 : : pbn_b2_1_115200 },
4367 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCLP200,
4368 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4369 : : pbn_b2_4_115200 },
4370 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCLP200,
4371 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4372 : : pbn_b2_2_115200 },
4373 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SSCLP200,
4374 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4375 : : pbn_b2_1_115200 },
4376 : : { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESCLP100,
4377 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4378 : : pbn_b0_8_115200 },
4379 : :
4380 : : { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_OXSEMI_16PCI954,
4381 : : PCI_VENDOR_ID_SPECIALIX, PCI_SUBDEVICE_ID_SPECIALIX_SPEED4,
4382 : : 0, 0,
4383 : : pbn_b0_4_921600 },
4384 : : { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4385 : : PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL,
4386 : : 0, 0,
4387 : : pbn_b0_4_1152000 },
4388 : : { PCI_VENDOR_ID_OXSEMI, 0x9505,
4389 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4390 : : pbn_b0_bt_2_921600 },
4391 : :
4392 : : /*
4393 : : * The below card is a little controversial since it is the
4394 : : * subject of a PCI vendor/device ID clash. (See
4395 : : * www.ussg.iu.edu/hypermail/linux/kernel/0303.1/0516.html).
4396 : : * For now just used the hex ID 0x950a.
4397 : : */
4398 : : { PCI_VENDOR_ID_OXSEMI, 0x950a,
4399 : : PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_00,
4400 : : 0, 0, pbn_b0_2_115200 },
4401 : : { PCI_VENDOR_ID_OXSEMI, 0x950a,
4402 : : PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_30,
4403 : : 0, 0, pbn_b0_2_115200 },
4404 : : { PCI_VENDOR_ID_OXSEMI, 0x950a,
4405 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4406 : : pbn_b0_2_1130000 },
4407 : : { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_C950,
4408 : : PCI_VENDOR_ID_OXSEMI, PCI_SUBDEVICE_ID_OXSEMI_C950, 0, 0,
4409 : : pbn_b0_1_921600 },
4410 : : { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
4411 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4412 : : pbn_b0_4_115200 },
4413 : : { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI952,
4414 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4415 : : pbn_b0_bt_2_921600 },
4416 : : { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI958,
4417 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4418 : : pbn_b2_8_1152000 },
4419 : :
4420 : : /*
4421 : : * Oxford Semiconductor Inc. Tornado PCI express device range.
4422 : : */
4423 : : { PCI_VENDOR_ID_OXSEMI, 0xc101, /* OXPCIe952 1 Legacy UART */
4424 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4425 : : pbn_b0_1_4000000 },
4426 : : { PCI_VENDOR_ID_OXSEMI, 0xc105, /* OXPCIe952 1 Legacy UART */
4427 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4428 : : pbn_b0_1_4000000 },
4429 : : { PCI_VENDOR_ID_OXSEMI, 0xc11b, /* OXPCIe952 1 Native UART */
4430 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4431 : : pbn_oxsemi_1_4000000 },
4432 : : { PCI_VENDOR_ID_OXSEMI, 0xc11f, /* OXPCIe952 1 Native UART */
4433 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4434 : : pbn_oxsemi_1_4000000 },
4435 : : { PCI_VENDOR_ID_OXSEMI, 0xc120, /* OXPCIe952 1 Legacy UART */
4436 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4437 : : pbn_b0_1_4000000 },
4438 : : { PCI_VENDOR_ID_OXSEMI, 0xc124, /* OXPCIe952 1 Legacy UART */
4439 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4440 : : pbn_b0_1_4000000 },
4441 : : { PCI_VENDOR_ID_OXSEMI, 0xc138, /* OXPCIe952 1 Native UART */
4442 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4443 : : pbn_oxsemi_1_4000000 },
4444 : : { PCI_VENDOR_ID_OXSEMI, 0xc13d, /* OXPCIe952 1 Native UART */
4445 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4446 : : pbn_oxsemi_1_4000000 },
4447 : : { PCI_VENDOR_ID_OXSEMI, 0xc140, /* OXPCIe952 1 Legacy UART */
4448 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4449 : : pbn_b0_1_4000000 },
4450 : : { PCI_VENDOR_ID_OXSEMI, 0xc141, /* OXPCIe952 1 Legacy UART */
4451 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4452 : : pbn_b0_1_4000000 },
4453 : : { PCI_VENDOR_ID_OXSEMI, 0xc144, /* OXPCIe952 1 Legacy UART */
4454 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4455 : : pbn_b0_1_4000000 },
4456 : : { PCI_VENDOR_ID_OXSEMI, 0xc145, /* OXPCIe952 1 Legacy UART */
4457 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4458 : : pbn_b0_1_4000000 },
4459 : : { PCI_VENDOR_ID_OXSEMI, 0xc158, /* OXPCIe952 2 Native UART */
4460 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4461 : : pbn_oxsemi_2_4000000 },
4462 : : { PCI_VENDOR_ID_OXSEMI, 0xc15d, /* OXPCIe952 2 Native UART */
4463 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4464 : : pbn_oxsemi_2_4000000 },
4465 : : { PCI_VENDOR_ID_OXSEMI, 0xc208, /* OXPCIe954 4 Native UART */
4466 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4467 : : pbn_oxsemi_4_4000000 },
4468 : : { PCI_VENDOR_ID_OXSEMI, 0xc20d, /* OXPCIe954 4 Native UART */
4469 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4470 : : pbn_oxsemi_4_4000000 },
4471 : : { PCI_VENDOR_ID_OXSEMI, 0xc308, /* OXPCIe958 8 Native UART */
4472 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4473 : : pbn_oxsemi_8_4000000 },
4474 : : { PCI_VENDOR_ID_OXSEMI, 0xc30d, /* OXPCIe958 8 Native UART */
4475 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4476 : : pbn_oxsemi_8_4000000 },
4477 : : { PCI_VENDOR_ID_OXSEMI, 0xc40b, /* OXPCIe200 1 Native UART */
4478 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4479 : : pbn_oxsemi_1_4000000 },
4480 : : { PCI_VENDOR_ID_OXSEMI, 0xc40f, /* OXPCIe200 1 Native UART */
4481 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4482 : : pbn_oxsemi_1_4000000 },
4483 : : { PCI_VENDOR_ID_OXSEMI, 0xc41b, /* OXPCIe200 1 Native UART */
4484 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4485 : : pbn_oxsemi_1_4000000 },
4486 : : { PCI_VENDOR_ID_OXSEMI, 0xc41f, /* OXPCIe200 1 Native UART */
4487 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4488 : : pbn_oxsemi_1_4000000 },
4489 : : { PCI_VENDOR_ID_OXSEMI, 0xc42b, /* OXPCIe200 1 Native UART */
4490 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4491 : : pbn_oxsemi_1_4000000 },
4492 : : { PCI_VENDOR_ID_OXSEMI, 0xc42f, /* OXPCIe200 1 Native UART */
4493 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4494 : : pbn_oxsemi_1_4000000 },
4495 : : { PCI_VENDOR_ID_OXSEMI, 0xc43b, /* OXPCIe200 1 Native UART */
4496 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4497 : : pbn_oxsemi_1_4000000 },
4498 : : { PCI_VENDOR_ID_OXSEMI, 0xc43f, /* OXPCIe200 1 Native UART */
4499 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4500 : : pbn_oxsemi_1_4000000 },
4501 : : { PCI_VENDOR_ID_OXSEMI, 0xc44b, /* OXPCIe200 1 Native UART */
4502 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4503 : : pbn_oxsemi_1_4000000 },
4504 : : { PCI_VENDOR_ID_OXSEMI, 0xc44f, /* OXPCIe200 1 Native UART */
4505 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4506 : : pbn_oxsemi_1_4000000 },
4507 : : { PCI_VENDOR_ID_OXSEMI, 0xc45b, /* OXPCIe200 1 Native UART */
4508 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4509 : : pbn_oxsemi_1_4000000 },
4510 : : { PCI_VENDOR_ID_OXSEMI, 0xc45f, /* OXPCIe200 1 Native UART */
4511 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4512 : : pbn_oxsemi_1_4000000 },
4513 : : { PCI_VENDOR_ID_OXSEMI, 0xc46b, /* OXPCIe200 1 Native UART */
4514 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4515 : : pbn_oxsemi_1_4000000 },
4516 : : { PCI_VENDOR_ID_OXSEMI, 0xc46f, /* OXPCIe200 1 Native UART */
4517 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4518 : : pbn_oxsemi_1_4000000 },
4519 : : { PCI_VENDOR_ID_OXSEMI, 0xc47b, /* OXPCIe200 1 Native UART */
4520 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4521 : : pbn_oxsemi_1_4000000 },
4522 : : { PCI_VENDOR_ID_OXSEMI, 0xc47f, /* OXPCIe200 1 Native UART */
4523 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4524 : : pbn_oxsemi_1_4000000 },
4525 : : { PCI_VENDOR_ID_OXSEMI, 0xc48b, /* OXPCIe200 1 Native UART */
4526 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4527 : : pbn_oxsemi_1_4000000 },
4528 : : { PCI_VENDOR_ID_OXSEMI, 0xc48f, /* OXPCIe200 1 Native UART */
4529 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4530 : : pbn_oxsemi_1_4000000 },
4531 : : { PCI_VENDOR_ID_OXSEMI, 0xc49b, /* OXPCIe200 1 Native UART */
4532 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4533 : : pbn_oxsemi_1_4000000 },
4534 : : { PCI_VENDOR_ID_OXSEMI, 0xc49f, /* OXPCIe200 1 Native UART */
4535 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4536 : : pbn_oxsemi_1_4000000 },
4537 : : { PCI_VENDOR_ID_OXSEMI, 0xc4ab, /* OXPCIe200 1 Native UART */
4538 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4539 : : pbn_oxsemi_1_4000000 },
4540 : : { PCI_VENDOR_ID_OXSEMI, 0xc4af, /* OXPCIe200 1 Native UART */
4541 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4542 : : pbn_oxsemi_1_4000000 },
4543 : : { PCI_VENDOR_ID_OXSEMI, 0xc4bb, /* OXPCIe200 1 Native UART */
4544 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4545 : : pbn_oxsemi_1_4000000 },
4546 : : { PCI_VENDOR_ID_OXSEMI, 0xc4bf, /* OXPCIe200 1 Native UART */
4547 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4548 : : pbn_oxsemi_1_4000000 },
4549 : : { PCI_VENDOR_ID_OXSEMI, 0xc4cb, /* OXPCIe200 1 Native UART */
4550 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4551 : : pbn_oxsemi_1_4000000 },
4552 : : { PCI_VENDOR_ID_OXSEMI, 0xc4cf, /* OXPCIe200 1 Native UART */
4553 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4554 : : pbn_oxsemi_1_4000000 },
4555 : : /*
4556 : : * Mainpine Inc. IQ Express "Rev3" utilizing OxSemi Tornado
4557 : : */
4558 : : { PCI_VENDOR_ID_MAINPINE, 0x4000, /* IQ Express 1 Port V.34 Super-G3 Fax */
4559 : : PCI_VENDOR_ID_MAINPINE, 0x4001, 0, 0,
4560 : : pbn_oxsemi_1_4000000 },
4561 : : { PCI_VENDOR_ID_MAINPINE, 0x4000, /* IQ Express 2 Port V.34 Super-G3 Fax */
4562 : : PCI_VENDOR_ID_MAINPINE, 0x4002, 0, 0,
4563 : : pbn_oxsemi_2_4000000 },
4564 : : { PCI_VENDOR_ID_MAINPINE, 0x4000, /* IQ Express 4 Port V.34 Super-G3 Fax */
4565 : : PCI_VENDOR_ID_MAINPINE, 0x4004, 0, 0,
4566 : : pbn_oxsemi_4_4000000 },
4567 : : { PCI_VENDOR_ID_MAINPINE, 0x4000, /* IQ Express 8 Port V.34 Super-G3 Fax */
4568 : : PCI_VENDOR_ID_MAINPINE, 0x4008, 0, 0,
4569 : : pbn_oxsemi_8_4000000 },
4570 : :
4571 : : /*
4572 : : * Digi/IBM PCIe 2-port Async EIA-232 Adapter utilizing OxSemi Tornado
4573 : : */
4574 : : { PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_2_OX_IBM,
4575 : : PCI_SUBVENDOR_ID_IBM, PCI_ANY_ID, 0, 0,
4576 : : pbn_oxsemi_2_4000000 },
4577 : :
4578 : : /*
4579 : : * SBS Technologies, Inc. P-Octal and PMC-OCTPRO cards,
4580 : : * from skokodyn@yahoo.com
4581 : : */
4582 : : { PCI_VENDOR_ID_SBSMODULARIO, PCI_DEVICE_ID_OCTPRO,
4583 : : PCI_SUBVENDOR_ID_SBSMODULARIO, PCI_SUBDEVICE_ID_OCTPRO232, 0, 0,
4584 : : pbn_sbsxrsio },
4585 : : { PCI_VENDOR_ID_SBSMODULARIO, PCI_DEVICE_ID_OCTPRO,
4586 : : PCI_SUBVENDOR_ID_SBSMODULARIO, PCI_SUBDEVICE_ID_OCTPRO422, 0, 0,
4587 : : pbn_sbsxrsio },
4588 : : { PCI_VENDOR_ID_SBSMODULARIO, PCI_DEVICE_ID_OCTPRO,
4589 : : PCI_SUBVENDOR_ID_SBSMODULARIO, PCI_SUBDEVICE_ID_POCTAL232, 0, 0,
4590 : : pbn_sbsxrsio },
4591 : : { PCI_VENDOR_ID_SBSMODULARIO, PCI_DEVICE_ID_OCTPRO,
4592 : : PCI_SUBVENDOR_ID_SBSMODULARIO, PCI_SUBDEVICE_ID_POCTAL422, 0, 0,
4593 : : pbn_sbsxrsio },
4594 : :
4595 : : /*
4596 : : * Digitan DS560-558, from jimd@esoft.com
4597 : : */
4598 : : { PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_ATT_VENUS_MODEM,
4599 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4600 : : pbn_b1_1_115200 },
4601 : :
4602 : : /*
4603 : : * Titan Electronic cards
4604 : : * The 400L and 800L have a custom setup quirk.
4605 : : */
4606 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_100,
4607 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4608 : : pbn_b0_1_921600 },
4609 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200,
4610 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4611 : : pbn_b0_2_921600 },
4612 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400,
4613 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4614 : : pbn_b0_4_921600 },
4615 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800B,
4616 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4617 : : pbn_b0_4_921600 },
4618 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_100L,
4619 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4620 : : pbn_b1_1_921600 },
4621 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200L,
4622 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4623 : : pbn_b1_bt_2_921600 },
4624 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400L,
4625 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4626 : : pbn_b0_bt_4_921600 },
4627 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800L,
4628 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4629 : : pbn_b0_bt_8_921600 },
4630 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200I,
4631 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4632 : : pbn_b4_bt_2_921600 },
4633 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400I,
4634 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4635 : : pbn_b4_bt_4_921600 },
4636 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800I,
4637 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4638 : : pbn_b4_bt_8_921600 },
4639 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400EH,
4640 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4641 : : pbn_b0_4_921600 },
4642 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800EH,
4643 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4644 : : pbn_b0_4_921600 },
4645 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800EHB,
4646 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4647 : : pbn_b0_4_921600 },
4648 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_100E,
4649 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4650 : : pbn_oxsemi_1_4000000 },
4651 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200E,
4652 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4653 : : pbn_oxsemi_2_4000000 },
4654 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400E,
4655 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4656 : : pbn_oxsemi_4_4000000 },
4657 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800E,
4658 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4659 : : pbn_oxsemi_8_4000000 },
4660 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200EI,
4661 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4662 : : pbn_oxsemi_2_4000000 },
4663 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200EISI,
4664 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4665 : : pbn_oxsemi_2_4000000 },
4666 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_200V3,
4667 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4668 : : pbn_b0_bt_2_921600 },
4669 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_400V3,
4670 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4671 : : pbn_b0_4_921600 },
4672 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_410V3,
4673 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4674 : : pbn_b0_4_921600 },
4675 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800V3,
4676 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4677 : : pbn_b0_4_921600 },
4678 : : { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800V3B,
4679 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4680 : : pbn_b0_4_921600 },
4681 : :
4682 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_550,
4683 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4684 : : pbn_b2_1_460800 },
4685 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_650,
4686 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4687 : : pbn_b2_1_460800 },
4688 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_10x_850,
4689 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4690 : : pbn_b2_1_460800 },
4691 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_10x_550,
4692 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4693 : : pbn_b2_bt_2_921600 },
4694 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_10x_650,
4695 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4696 : : pbn_b2_bt_2_921600 },
4697 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_10x_850,
4698 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4699 : : pbn_b2_bt_2_921600 },
4700 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_10x_550,
4701 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4702 : : pbn_b2_bt_4_921600 },
4703 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_10x_650,
4704 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4705 : : pbn_b2_bt_4_921600 },
4706 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_10x_850,
4707 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4708 : : pbn_b2_bt_4_921600 },
4709 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_20x_550,
4710 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4711 : : pbn_b0_1_921600 },
4712 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_20x_650,
4713 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4714 : : pbn_b0_1_921600 },
4715 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S_20x_850,
4716 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4717 : : pbn_b0_1_921600 },
4718 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_20x_550,
4719 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4720 : : pbn_b0_bt_2_921600 },
4721 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_20x_650,
4722 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4723 : : pbn_b0_bt_2_921600 },
4724 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S_20x_850,
4725 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4726 : : pbn_b0_bt_2_921600 },
4727 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_20x_550,
4728 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4729 : : pbn_b0_bt_4_921600 },
4730 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_20x_650,
4731 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4732 : : pbn_b0_bt_4_921600 },
4733 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_4S_20x_850,
4734 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4735 : : pbn_b0_bt_4_921600 },
4736 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_8S_20x_550,
4737 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4738 : : pbn_b0_bt_8_921600 },
4739 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_8S_20x_650,
4740 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4741 : : pbn_b0_bt_8_921600 },
4742 : : { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_8S_20x_850,
4743 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4744 : : pbn_b0_bt_8_921600 },
4745 : :
4746 : : /*
4747 : : * Computone devices submitted by Doug McNash dmcnash@computone.com
4748 : : */
4749 : : { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG,
4750 : : PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG4,
4751 : : 0, 0, pbn_computone_4 },
4752 : : { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG,
4753 : : PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG8,
4754 : : 0, 0, pbn_computone_8 },
4755 : : { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG,
4756 : : PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG6,
4757 : : 0, 0, pbn_computone_6 },
4758 : :
4759 : : { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI95N,
4760 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4761 : : pbn_oxsemi },
4762 : : { PCI_VENDOR_ID_TIMEDIA, PCI_DEVICE_ID_TIMEDIA_1889,
4763 : : PCI_VENDOR_ID_TIMEDIA, PCI_ANY_ID, 0, 0,
4764 : : pbn_b0_bt_1_921600 },
4765 : :
4766 : : /*
4767 : : * Sunix PCI serial boards
4768 : : */
4769 : : { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4770 : : PCI_VENDOR_ID_SUNIX, 0x0001, 0, 0,
4771 : : pbn_sunix_pci_1s },
4772 : : { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4773 : : PCI_VENDOR_ID_SUNIX, 0x0002, 0, 0,
4774 : : pbn_sunix_pci_2s },
4775 : : { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4776 : : PCI_VENDOR_ID_SUNIX, 0x0004, 0, 0,
4777 : : pbn_sunix_pci_4s },
4778 : : { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4779 : : PCI_VENDOR_ID_SUNIX, 0x0084, 0, 0,
4780 : : pbn_sunix_pci_4s },
4781 : : { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4782 : : PCI_VENDOR_ID_SUNIX, 0x0008, 0, 0,
4783 : : pbn_sunix_pci_8s },
4784 : : { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4785 : : PCI_VENDOR_ID_SUNIX, 0x0088, 0, 0,
4786 : : pbn_sunix_pci_8s },
4787 : : { PCI_VENDOR_ID_SUNIX, PCI_DEVICE_ID_SUNIX_1999,
4788 : : PCI_VENDOR_ID_SUNIX, 0x0010, 0, 0,
4789 : : pbn_sunix_pci_16s },
4790 : :
4791 : : /*
4792 : : * AFAVLAB serial card, from Harald Welte <laforge@gnumonks.org>
4793 : : */
4794 : : { PCI_VENDOR_ID_AFAVLAB, PCI_DEVICE_ID_AFAVLAB_P028,
4795 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4796 : : pbn_b0_bt_8_115200 },
4797 : : { PCI_VENDOR_ID_AFAVLAB, PCI_DEVICE_ID_AFAVLAB_P030,
4798 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4799 : : pbn_b0_bt_8_115200 },
4800 : :
4801 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DSERIAL,
4802 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4803 : : pbn_b0_bt_2_115200 },
4804 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATRO_A,
4805 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4806 : : pbn_b0_bt_2_115200 },
4807 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATRO_B,
4808 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4809 : : pbn_b0_bt_2_115200 },
4810 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATTRO_A,
4811 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4812 : : pbn_b0_bt_2_115200 },
4813 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUATTRO_B,
4814 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4815 : : pbn_b0_bt_2_115200 },
4816 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_OCTO_A,
4817 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4818 : : pbn_b0_bt_4_460800 },
4819 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_OCTO_B,
4820 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4821 : : pbn_b0_bt_4_460800 },
4822 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PORT_PLUS,
4823 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4824 : : pbn_b0_bt_2_460800 },
4825 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUAD_A,
4826 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4827 : : pbn_b0_bt_2_460800 },
4828 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_QUAD_B,
4829 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4830 : : pbn_b0_bt_2_460800 },
4831 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_SSERIAL,
4832 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4833 : : pbn_b0_bt_1_115200 },
4834 : : { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PORT_650,
4835 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4836 : : pbn_b0_bt_1_460800 },
4837 : :
4838 : : /*
4839 : : * Korenix Jetcard F0/F1 cards (JC1204, JC1208, JC1404, JC1408).
4840 : : * Cards are identified by their subsystem vendor IDs, which
4841 : : * (in hex) match the model number.
4842 : : *
4843 : : * Note that JC140x are RS422/485 cards which require ox950
4844 : : * ACR = 0x10, and as such are not currently fully supported.
4845 : : */
4846 : : { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF0,
4847 : : 0x1204, 0x0004, 0, 0,
4848 : : pbn_b0_4_921600 },
4849 : : { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF0,
4850 : : 0x1208, 0x0004, 0, 0,
4851 : : pbn_b0_4_921600 },
4852 : : /* { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF0,
4853 : : 0x1402, 0x0002, 0, 0,
4854 : : pbn_b0_2_921600 }, */
4855 : : /* { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF0,
4856 : : 0x1404, 0x0004, 0, 0,
4857 : : pbn_b0_4_921600 }, */
4858 : : { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF1,
4859 : : 0x1208, 0x0004, 0, 0,
4860 : : pbn_b0_4_921600 },
4861 : :
4862 : : { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF2,
4863 : : 0x1204, 0x0004, 0, 0,
4864 : : pbn_b0_4_921600 },
4865 : : { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF2,
4866 : : 0x1208, 0x0004, 0, 0,
4867 : : pbn_b0_4_921600 },
4868 : : { PCI_VENDOR_ID_KORENIX, PCI_DEVICE_ID_KORENIX_JETCARDF3,
4869 : : 0x1208, 0x0004, 0, 0,
4870 : : pbn_b0_4_921600 },
4871 : : /*
4872 : : * Dell Remote Access Card 4 - Tim_T_Murphy@Dell.com
4873 : : */
4874 : : { PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_RAC4,
4875 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4876 : : pbn_b1_1_1382400 },
4877 : :
4878 : : /*
4879 : : * Dell Remote Access Card III - Tim_T_Murphy@Dell.com
4880 : : */
4881 : : { PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_RACIII,
4882 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4883 : : pbn_b1_1_1382400 },
4884 : :
4885 : : /*
4886 : : * RAStel 2 port modem, gerg@moreton.com.au
4887 : : */
4888 : : { PCI_VENDOR_ID_MORETON, PCI_DEVICE_ID_RASTEL_2PORT,
4889 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4890 : : pbn_b2_bt_2_115200 },
4891 : :
4892 : : /*
4893 : : * EKF addition for i960 Boards form EKF with serial port
4894 : : */
4895 : : { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80960_RP,
4896 : : 0xE4BF, PCI_ANY_ID, 0, 0,
4897 : : pbn_intel_i960 },
4898 : :
4899 : : /*
4900 : : * Xircom Cardbus/Ethernet combos
4901 : : */
4902 : : { PCI_VENDOR_ID_XIRCOM, PCI_DEVICE_ID_XIRCOM_X3201_MDM,
4903 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4904 : : pbn_b0_1_115200 },
4905 : : /*
4906 : : * Xircom RBM56G cardbus modem - Dirk Arnold (temp entry)
4907 : : */
4908 : : { PCI_VENDOR_ID_XIRCOM, PCI_DEVICE_ID_XIRCOM_RBM56G,
4909 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4910 : : pbn_b0_1_115200 },
4911 : :
4912 : : /*
4913 : : * Untested PCI modems, sent in from various folks...
4914 : : */
4915 : :
4916 : : /*
4917 : : * Elsa Model 56K PCI Modem, from Andreas Rath <arh@01019freenet.de>
4918 : : */
4919 : : { PCI_VENDOR_ID_ROCKWELL, 0x1004,
4920 : : 0x1048, 0x1500, 0, 0,
4921 : : pbn_b1_1_115200 },
4922 : :
4923 : : { PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC3,
4924 : : 0xFF00, 0, 0, 0,
4925 : : pbn_sgi_ioc3 },
4926 : :
4927 : : /*
4928 : : * HP Diva card
4929 : : */
4930 : : { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA,
4931 : : PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_RMP3, 0, 0,
4932 : : pbn_b1_1_115200 },
4933 : : { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA,
4934 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4935 : : pbn_b0_5_115200 },
4936 : : { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_AUX,
4937 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4938 : : pbn_b2_1_115200 },
4939 : :
4940 : : { PCI_VENDOR_ID_DCI, PCI_DEVICE_ID_DCI_PCCOM2,
4941 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4942 : : pbn_b3_2_115200 },
4943 : : { PCI_VENDOR_ID_DCI, PCI_DEVICE_ID_DCI_PCCOM4,
4944 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4945 : : pbn_b3_4_115200 },
4946 : : { PCI_VENDOR_ID_DCI, PCI_DEVICE_ID_DCI_PCCOM8,
4947 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4948 : : pbn_b3_8_115200 },
4949 : : /*
4950 : : * Pericom PI7C9X795[1248] Uno/Dual/Quad/Octal UART
4951 : : */
4952 : : { PCI_VENDOR_ID_PERICOM, PCI_DEVICE_ID_PERICOM_PI7C9X7951,
4953 : : PCI_ANY_ID, PCI_ANY_ID,
4954 : : 0,
4955 : : 0, pbn_pericom_PI7C9X7951 },
4956 : : { PCI_VENDOR_ID_PERICOM, PCI_DEVICE_ID_PERICOM_PI7C9X7952,
4957 : : PCI_ANY_ID, PCI_ANY_ID,
4958 : : 0,
4959 : : 0, pbn_pericom_PI7C9X7952 },
4960 : : { PCI_VENDOR_ID_PERICOM, PCI_DEVICE_ID_PERICOM_PI7C9X7954,
4961 : : PCI_ANY_ID, PCI_ANY_ID,
4962 : : 0,
4963 : : 0, pbn_pericom_PI7C9X7954 },
4964 : : { PCI_VENDOR_ID_PERICOM, PCI_DEVICE_ID_PERICOM_PI7C9X7958,
4965 : : PCI_ANY_ID, PCI_ANY_ID,
4966 : : 0,
4967 : : 0, pbn_pericom_PI7C9X7958 },
4968 : : /*
4969 : : * ACCES I/O Products quad
4970 : : */
4971 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB,
4972 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4973 : : pbn_pericom_PI7C9X7952 },
4974 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S,
4975 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4976 : : pbn_pericom_PI7C9X7952 },
4977 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB,
4978 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4979 : : pbn_pericom_PI7C9X7954 },
4980 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S,
4981 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4982 : : pbn_pericom_PI7C9X7954 },
4983 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB,
4984 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4985 : : pbn_pericom_PI7C9X7952 },
4986 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2,
4987 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4988 : : pbn_pericom_PI7C9X7952 },
4989 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB,
4990 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4991 : : pbn_pericom_PI7C9X7954 },
4992 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4,
4993 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4994 : : pbn_pericom_PI7C9X7954 },
4995 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB,
4996 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
4997 : : pbn_pericom_PI7C9X7952 },
4998 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM,
4999 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5000 : : pbn_pericom_PI7C9X7952 },
5001 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB,
5002 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5003 : : pbn_pericom_PI7C9X7954 },
5004 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM,
5005 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5006 : : pbn_pericom_PI7C9X7954 },
5007 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1,
5008 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5009 : : pbn_pericom_PI7C9X7951 },
5010 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2,
5011 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5012 : : pbn_pericom_PI7C9X7952 },
5013 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2,
5014 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5015 : : pbn_pericom_PI7C9X7952 },
5016 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4,
5017 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5018 : : pbn_pericom_PI7C9X7954 },
5019 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4,
5020 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5021 : : pbn_pericom_PI7C9X7954 },
5022 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S,
5023 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5024 : : pbn_pericom_PI7C9X7952 },
5025 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S,
5026 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5027 : : pbn_pericom_PI7C9X7954 },
5028 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2,
5029 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5030 : : pbn_pericom_PI7C9X7952 },
5031 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2,
5032 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5033 : : pbn_pericom_PI7C9X7952 },
5034 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4,
5035 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5036 : : pbn_pericom_PI7C9X7954 },
5037 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4,
5038 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5039 : : pbn_pericom_PI7C9X7954 },
5040 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM,
5041 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5042 : : pbn_pericom_PI7C9X7952 },
5043 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4,
5044 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5045 : : pbn_pericom_PI7C9X7954 },
5046 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4,
5047 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5048 : : pbn_pericom_PI7C9X7954 },
5049 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8,
5050 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5051 : : pbn_pericom_PI7C9X7958 },
5052 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8,
5053 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5054 : : pbn_pericom_PI7C9X7958 },
5055 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4,
5056 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5057 : : pbn_pericom_PI7C9X7954 },
5058 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8,
5059 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5060 : : pbn_pericom_PI7C9X7958 },
5061 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM,
5062 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5063 : : pbn_pericom_PI7C9X7954 },
5064 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM,
5065 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5066 : : pbn_pericom_PI7C9X7958 },
5067 : : { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM,
5068 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5069 : : pbn_pericom_PI7C9X7954 },
5070 : : /*
5071 : : * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke)
5072 : : */
5073 : : { PCI_VENDOR_ID_TOPIC, PCI_DEVICE_ID_TOPIC_TP560,
5074 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5075 : : pbn_b0_1_115200 },
5076 : : /*
5077 : : * ITE
5078 : : */
5079 : : { PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_8872,
5080 : : PCI_ANY_ID, PCI_ANY_ID,
5081 : : 0, 0,
5082 : : pbn_b1_bt_1_115200 },
5083 : :
5084 : : /*
5085 : : * IntaShield IS-200
5086 : : */
5087 : : { PCI_VENDOR_ID_INTASHIELD, PCI_DEVICE_ID_INTASHIELD_IS200,
5088 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0, /* 135a.0811 */
5089 : : pbn_b2_2_115200 },
5090 : : /*
5091 : : * IntaShield IS-400
5092 : : */
5093 : : { PCI_VENDOR_ID_INTASHIELD, PCI_DEVICE_ID_INTASHIELD_IS400,
5094 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0, /* 135a.0dc0 */
5095 : : pbn_b2_4_115200 },
5096 : : /*
5097 : : * BrainBoxes UC-260
5098 : : */
5099 : : { PCI_VENDOR_ID_INTASHIELD, 0x0D21,
5100 : : PCI_ANY_ID, PCI_ANY_ID,
5101 : : PCI_CLASS_COMMUNICATION_MULTISERIAL << 8, 0xffff00,
5102 : : pbn_b2_4_115200 },
5103 : : { PCI_VENDOR_ID_INTASHIELD, 0x0E34,
5104 : : PCI_ANY_ID, PCI_ANY_ID,
5105 : : PCI_CLASS_COMMUNICATION_MULTISERIAL << 8, 0xffff00,
5106 : : pbn_b2_4_115200 },
5107 : : /*
5108 : : * Perle PCI-RAS cards
5109 : : */
5110 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
5111 : : PCI_SUBVENDOR_ID_PERLE, PCI_SUBDEVICE_ID_PCI_RAS4,
5112 : : 0, 0, pbn_b2_4_921600 },
5113 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
5114 : : PCI_SUBVENDOR_ID_PERLE, PCI_SUBDEVICE_ID_PCI_RAS8,
5115 : : 0, 0, pbn_b2_8_921600 },
5116 : :
5117 : : /*
5118 : : * Mainpine series cards: Fairly standard layout but fools
5119 : : * parts of the autodetect in some cases and uses otherwise
5120 : : * unmatched communications subclasses in the PCI Express case
5121 : : */
5122 : :
5123 : : { /* RockForceDUO */
5124 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5125 : : PCI_VENDOR_ID_MAINPINE, 0x0200,
5126 : : 0, 0, pbn_b0_2_115200 },
5127 : : { /* RockForceQUATRO */
5128 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5129 : : PCI_VENDOR_ID_MAINPINE, 0x0300,
5130 : : 0, 0, pbn_b0_4_115200 },
5131 : : { /* RockForceDUO+ */
5132 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5133 : : PCI_VENDOR_ID_MAINPINE, 0x0400,
5134 : : 0, 0, pbn_b0_2_115200 },
5135 : : { /* RockForceQUATRO+ */
5136 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5137 : : PCI_VENDOR_ID_MAINPINE, 0x0500,
5138 : : 0, 0, pbn_b0_4_115200 },
5139 : : { /* RockForce+ */
5140 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5141 : : PCI_VENDOR_ID_MAINPINE, 0x0600,
5142 : : 0, 0, pbn_b0_2_115200 },
5143 : : { /* RockForce+ */
5144 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5145 : : PCI_VENDOR_ID_MAINPINE, 0x0700,
5146 : : 0, 0, pbn_b0_4_115200 },
5147 : : { /* RockForceOCTO+ */
5148 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5149 : : PCI_VENDOR_ID_MAINPINE, 0x0800,
5150 : : 0, 0, pbn_b0_8_115200 },
5151 : : { /* RockForceDUO+ */
5152 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5153 : : PCI_VENDOR_ID_MAINPINE, 0x0C00,
5154 : : 0, 0, pbn_b0_2_115200 },
5155 : : { /* RockForceQUARTRO+ */
5156 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5157 : : PCI_VENDOR_ID_MAINPINE, 0x0D00,
5158 : : 0, 0, pbn_b0_4_115200 },
5159 : : { /* RockForceOCTO+ */
5160 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5161 : : PCI_VENDOR_ID_MAINPINE, 0x1D00,
5162 : : 0, 0, pbn_b0_8_115200 },
5163 : : { /* RockForceD1 */
5164 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5165 : : PCI_VENDOR_ID_MAINPINE, 0x2000,
5166 : : 0, 0, pbn_b0_1_115200 },
5167 : : { /* RockForceF1 */
5168 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5169 : : PCI_VENDOR_ID_MAINPINE, 0x2100,
5170 : : 0, 0, pbn_b0_1_115200 },
5171 : : { /* RockForceD2 */
5172 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5173 : : PCI_VENDOR_ID_MAINPINE, 0x2200,
5174 : : 0, 0, pbn_b0_2_115200 },
5175 : : { /* RockForceF2 */
5176 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5177 : : PCI_VENDOR_ID_MAINPINE, 0x2300,
5178 : : 0, 0, pbn_b0_2_115200 },
5179 : : { /* RockForceD4 */
5180 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5181 : : PCI_VENDOR_ID_MAINPINE, 0x2400,
5182 : : 0, 0, pbn_b0_4_115200 },
5183 : : { /* RockForceF4 */
5184 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5185 : : PCI_VENDOR_ID_MAINPINE, 0x2500,
5186 : : 0, 0, pbn_b0_4_115200 },
5187 : : { /* RockForceD8 */
5188 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5189 : : PCI_VENDOR_ID_MAINPINE, 0x2600,
5190 : : 0, 0, pbn_b0_8_115200 },
5191 : : { /* RockForceF8 */
5192 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5193 : : PCI_VENDOR_ID_MAINPINE, 0x2700,
5194 : : 0, 0, pbn_b0_8_115200 },
5195 : : { /* IQ Express D1 */
5196 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5197 : : PCI_VENDOR_ID_MAINPINE, 0x3000,
5198 : : 0, 0, pbn_b0_1_115200 },
5199 : : { /* IQ Express F1 */
5200 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5201 : : PCI_VENDOR_ID_MAINPINE, 0x3100,
5202 : : 0, 0, pbn_b0_1_115200 },
5203 : : { /* IQ Express D2 */
5204 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5205 : : PCI_VENDOR_ID_MAINPINE, 0x3200,
5206 : : 0, 0, pbn_b0_2_115200 },
5207 : : { /* IQ Express F2 */
5208 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5209 : : PCI_VENDOR_ID_MAINPINE, 0x3300,
5210 : : 0, 0, pbn_b0_2_115200 },
5211 : : { /* IQ Express D4 */
5212 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5213 : : PCI_VENDOR_ID_MAINPINE, 0x3400,
5214 : : 0, 0, pbn_b0_4_115200 },
5215 : : { /* IQ Express F4 */
5216 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5217 : : PCI_VENDOR_ID_MAINPINE, 0x3500,
5218 : : 0, 0, pbn_b0_4_115200 },
5219 : : { /* IQ Express D8 */
5220 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5221 : : PCI_VENDOR_ID_MAINPINE, 0x3C00,
5222 : : 0, 0, pbn_b0_8_115200 },
5223 : : { /* IQ Express F8 */
5224 : : PCI_VENDOR_ID_MAINPINE, PCI_DEVICE_ID_MAINPINE_PBRIDGE,
5225 : : PCI_VENDOR_ID_MAINPINE, 0x3D00,
5226 : : 0, 0, pbn_b0_8_115200 },
5227 : :
5228 : :
5229 : : /*
5230 : : * PA Semi PA6T-1682M on-chip UART
5231 : : */
5232 : : { PCI_VENDOR_ID_PASEMI, 0xa004,
5233 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5234 : : pbn_pasemi_1682M },
5235 : :
5236 : : /*
5237 : : * National Instruments
5238 : : */
5239 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI23216,
5240 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5241 : : pbn_b1_16_115200 },
5242 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2328,
5243 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5244 : : pbn_b1_8_115200 },
5245 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2324,
5246 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5247 : : pbn_b1_bt_4_115200 },
5248 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2322,
5249 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5250 : : pbn_b1_bt_2_115200 },
5251 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2324I,
5252 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5253 : : pbn_b1_bt_4_115200 },
5254 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2322I,
5255 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5256 : : pbn_b1_bt_2_115200 },
5257 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_23216,
5258 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5259 : : pbn_b1_16_115200 },
5260 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_2328,
5261 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5262 : : pbn_b1_8_115200 },
5263 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_2324,
5264 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5265 : : pbn_b1_bt_4_115200 },
5266 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_2322,
5267 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5268 : : pbn_b1_bt_2_115200 },
5269 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8422_2324,
5270 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5271 : : pbn_b1_bt_4_115200 },
5272 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8422_2322,
5273 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5274 : : pbn_b1_bt_2_115200 },
5275 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_2322,
5276 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5277 : : pbn_ni8430_2 },
5278 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_2322,
5279 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5280 : : pbn_ni8430_2 },
5281 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_2324,
5282 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5283 : : pbn_ni8430_4 },
5284 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_2324,
5285 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5286 : : pbn_ni8430_4 },
5287 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_2328,
5288 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5289 : : pbn_ni8430_8 },
5290 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_2328,
5291 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5292 : : pbn_ni8430_8 },
5293 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_23216,
5294 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5295 : : pbn_ni8430_16 },
5296 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_23216,
5297 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5298 : : pbn_ni8430_16 },
5299 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8432_2322,
5300 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5301 : : pbn_ni8430_2 },
5302 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8432_2322,
5303 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5304 : : pbn_ni8430_2 },
5305 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8432_2324,
5306 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5307 : : pbn_ni8430_4 },
5308 : : { PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8432_2324,
5309 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5310 : : pbn_ni8430_4 },
5311 : :
5312 : : /*
5313 : : * MOXA
5314 : : */
5315 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102E,
5316 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5317 : : pbn_moxa8250_2p },
5318 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102EL,
5319 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5320 : : pbn_moxa8250_2p },
5321 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP104EL_A,
5322 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5323 : : pbn_moxa8250_4p },
5324 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP114EL,
5325 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5326 : : pbn_moxa8250_4p },
5327 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_A,
5328 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5329 : : pbn_moxa8250_8p },
5330 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP116E_A_B,
5331 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5332 : : pbn_moxa8250_8p },
5333 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP118EL_A,
5334 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5335 : : pbn_moxa8250_8p },
5336 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP118E_A_I,
5337 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5338 : : pbn_moxa8250_8p },
5339 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP132EL,
5340 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5341 : : pbn_moxa8250_2p },
5342 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP134EL_A,
5343 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5344 : : pbn_moxa8250_4p },
5345 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP138E_A,
5346 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5347 : : pbn_moxa8250_8p },
5348 : : { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP168EL_A,
5349 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5350 : : pbn_moxa8250_8p },
5351 : :
5352 : : /*
5353 : : * ADDI-DATA GmbH communication cards <info@addi-data.com>
5354 : : */
5355 : : { PCI_VENDOR_ID_ADDIDATA,
5356 : : PCI_DEVICE_ID_ADDIDATA_APCI7500,
5357 : : PCI_ANY_ID,
5358 : : PCI_ANY_ID,
5359 : : 0,
5360 : : 0,
5361 : : pbn_b0_4_115200 },
5362 : :
5363 : : { PCI_VENDOR_ID_ADDIDATA,
5364 : : PCI_DEVICE_ID_ADDIDATA_APCI7420,
5365 : : PCI_ANY_ID,
5366 : : PCI_ANY_ID,
5367 : : 0,
5368 : : 0,
5369 : : pbn_b0_2_115200 },
5370 : :
5371 : : { PCI_VENDOR_ID_ADDIDATA,
5372 : : PCI_DEVICE_ID_ADDIDATA_APCI7300,
5373 : : PCI_ANY_ID,
5374 : : PCI_ANY_ID,
5375 : : 0,
5376 : : 0,
5377 : : pbn_b0_1_115200 },
5378 : :
5379 : : { PCI_VENDOR_ID_AMCC,
5380 : : PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800,
5381 : : PCI_ANY_ID,
5382 : : PCI_ANY_ID,
5383 : : 0,
5384 : : 0,
5385 : : pbn_b1_8_115200 },
5386 : :
5387 : : { PCI_VENDOR_ID_ADDIDATA,
5388 : : PCI_DEVICE_ID_ADDIDATA_APCI7500_2,
5389 : : PCI_ANY_ID,
5390 : : PCI_ANY_ID,
5391 : : 0,
5392 : : 0,
5393 : : pbn_b0_4_115200 },
5394 : :
5395 : : { PCI_VENDOR_ID_ADDIDATA,
5396 : : PCI_DEVICE_ID_ADDIDATA_APCI7420_2,
5397 : : PCI_ANY_ID,
5398 : : PCI_ANY_ID,
5399 : : 0,
5400 : : 0,
5401 : : pbn_b0_2_115200 },
5402 : :
5403 : : { PCI_VENDOR_ID_ADDIDATA,
5404 : : PCI_DEVICE_ID_ADDIDATA_APCI7300_2,
5405 : : PCI_ANY_ID,
5406 : : PCI_ANY_ID,
5407 : : 0,
5408 : : 0,
5409 : : pbn_b0_1_115200 },
5410 : :
5411 : : { PCI_VENDOR_ID_ADDIDATA,
5412 : : PCI_DEVICE_ID_ADDIDATA_APCI7500_3,
5413 : : PCI_ANY_ID,
5414 : : PCI_ANY_ID,
5415 : : 0,
5416 : : 0,
5417 : : pbn_b0_4_115200 },
5418 : :
5419 : : { PCI_VENDOR_ID_ADDIDATA,
5420 : : PCI_DEVICE_ID_ADDIDATA_APCI7420_3,
5421 : : PCI_ANY_ID,
5422 : : PCI_ANY_ID,
5423 : : 0,
5424 : : 0,
5425 : : pbn_b0_2_115200 },
5426 : :
5427 : : { PCI_VENDOR_ID_ADDIDATA,
5428 : : PCI_DEVICE_ID_ADDIDATA_APCI7300_3,
5429 : : PCI_ANY_ID,
5430 : : PCI_ANY_ID,
5431 : : 0,
5432 : : 0,
5433 : : pbn_b0_1_115200 },
5434 : :
5435 : : { PCI_VENDOR_ID_ADDIDATA,
5436 : : PCI_DEVICE_ID_ADDIDATA_APCI7800_3,
5437 : : PCI_ANY_ID,
5438 : : PCI_ANY_ID,
5439 : : 0,
5440 : : 0,
5441 : : pbn_b0_8_115200 },
5442 : :
5443 : : { PCI_VENDOR_ID_ADDIDATA,
5444 : : PCI_DEVICE_ID_ADDIDATA_APCIe7500,
5445 : : PCI_ANY_ID,
5446 : : PCI_ANY_ID,
5447 : : 0,
5448 : : 0,
5449 : : pbn_ADDIDATA_PCIe_4_3906250 },
5450 : :
5451 : : { PCI_VENDOR_ID_ADDIDATA,
5452 : : PCI_DEVICE_ID_ADDIDATA_APCIe7420,
5453 : : PCI_ANY_ID,
5454 : : PCI_ANY_ID,
5455 : : 0,
5456 : : 0,
5457 : : pbn_ADDIDATA_PCIe_2_3906250 },
5458 : :
5459 : : { PCI_VENDOR_ID_ADDIDATA,
5460 : : PCI_DEVICE_ID_ADDIDATA_APCIe7300,
5461 : : PCI_ANY_ID,
5462 : : PCI_ANY_ID,
5463 : : 0,
5464 : : 0,
5465 : : pbn_ADDIDATA_PCIe_1_3906250 },
5466 : :
5467 : : { PCI_VENDOR_ID_ADDIDATA,
5468 : : PCI_DEVICE_ID_ADDIDATA_APCIe7800,
5469 : : PCI_ANY_ID,
5470 : : PCI_ANY_ID,
5471 : : 0,
5472 : : 0,
5473 : : pbn_ADDIDATA_PCIe_8_3906250 },
5474 : :
5475 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
5476 : : PCI_VENDOR_ID_IBM, 0x0299,
5477 : : 0, 0, pbn_b0_bt_2_115200 },
5478 : :
5479 : : /*
5480 : : * other NetMos 9835 devices are most likely handled by the
5481 : : * parport_serial driver, check drivers/parport/parport_serial.c
5482 : : * before adding them here.
5483 : : */
5484 : :
5485 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9901,
5486 : : 0xA000, 0x1000,
5487 : : 0, 0, pbn_b0_1_115200 },
5488 : :
5489 : : /* the 9901 is a rebranded 9912 */
5490 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912,
5491 : : 0xA000, 0x1000,
5492 : : 0, 0, pbn_b0_1_115200 },
5493 : :
5494 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
5495 : : 0xA000, 0x1000,
5496 : : 0, 0, pbn_b0_1_115200 },
5497 : :
5498 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9904,
5499 : : 0xA000, 0x1000,
5500 : : 0, 0, pbn_b0_1_115200 },
5501 : :
5502 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
5503 : : 0xA000, 0x1000,
5504 : : 0, 0, pbn_b0_1_115200 },
5505 : :
5506 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
5507 : : 0xA000, 0x3002,
5508 : : 0, 0, pbn_NETMOS9900_2s_115200 },
5509 : :
5510 : : /*
5511 : : * Best Connectivity and Rosewill PCI Multi I/O cards
5512 : : */
5513 : :
5514 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
5515 : : 0xA000, 0x1000,
5516 : : 0, 0, pbn_b0_1_115200 },
5517 : :
5518 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
5519 : : 0xA000, 0x3002,
5520 : : 0, 0, pbn_b0_bt_2_115200 },
5521 : :
5522 : : { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
5523 : : 0xA000, 0x3004,
5524 : : 0, 0, pbn_b0_bt_4_115200 },
5525 : : /* Intel CE4100 */
5526 : : { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CE4100_UART,
5527 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5528 : : pbn_ce4100_1_115200 },
5529 : :
5530 : : /*
5531 : : * Cronyx Omega PCI
5532 : : */
5533 : : { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_CRONYX_OMEGA,
5534 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5535 : : pbn_omegapci },
5536 : :
5537 : : /*
5538 : : * Broadcom TruManage
5539 : : */
5540 : : { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
5541 : : PCI_ANY_ID, PCI_ANY_ID, 0, 0,
5542 : : pbn_brcm_trumanage },
5543 : :
5544 : : /*
5545 : : * AgeStar as-prs2-009
5546 : : */
5547 : : { PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375,
5548 : : PCI_ANY_ID, PCI_ANY_ID,
5549 : : 0, 0, pbn_b0_bt_2_115200 },
5550 : :
5551 : : /*
5552 : : * WCH CH353 series devices: The 2S1P is handled by parport_serial
5553 : : * so not listed here.
5554 : : */
5555 : : { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_4S,
5556 : : PCI_ANY_ID, PCI_ANY_ID,
5557 : : 0, 0, pbn_b0_bt_4_115200 },
5558 : :
5559 : : { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_2S1PF,
5560 : : PCI_ANY_ID, PCI_ANY_ID,
5561 : : 0, 0, pbn_b0_bt_2_115200 },
5562 : :
5563 : : { PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH355_4S,
5564 : : PCI_ANY_ID, PCI_ANY_ID,
5565 : : 0, 0, pbn_b0_bt_4_115200 },
5566 : :
5567 : : { PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH382_2S,
5568 : : PCI_ANY_ID, PCI_ANY_ID,
5569 : : 0, 0, pbn_wch382_2 },
5570 : :
5571 : : { PCIE_VENDOR_ID_WCH, PCIE_DEVICE_ID_WCH_CH384_4S,
5572 : : PCI_ANY_ID, PCI_ANY_ID,
5573 : : 0, 0, pbn_wch384_4 },
5574 : :
5575 : : /* Fintek PCI serial cards */
5576 : : { PCI_DEVICE(0x1c29, 0x1104), .driver_data = pbn_fintek_4 },
5577 : : { PCI_DEVICE(0x1c29, 0x1108), .driver_data = pbn_fintek_8 },
5578 : : { PCI_DEVICE(0x1c29, 0x1112), .driver_data = pbn_fintek_12 },
5579 : : { PCI_DEVICE(0x1c29, 0x1204), .driver_data = pbn_fintek_F81504A },
5580 : : { PCI_DEVICE(0x1c29, 0x1208), .driver_data = pbn_fintek_F81508A },
5581 : : { PCI_DEVICE(0x1c29, 0x1212), .driver_data = pbn_fintek_F81512A },
5582 : :
5583 : : /* MKS Tenta SCOM-080x serial cards */
5584 : : { PCI_DEVICE(0x1601, 0x0800), .driver_data = pbn_b0_4_1250000 },
5585 : : { PCI_DEVICE(0x1601, 0xa801), .driver_data = pbn_b0_4_1250000 },
5586 : :
5587 : : /* Amazon PCI serial device */
5588 : : { PCI_DEVICE(0x1d0f, 0x8250), .driver_data = pbn_b0_1_115200 },
5589 : :
5590 : : /*
5591 : : * These entries match devices with class COMMUNICATION_SERIAL,
5592 : : * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
5593 : : */
5594 : : { PCI_ANY_ID, PCI_ANY_ID,
5595 : : PCI_ANY_ID, PCI_ANY_ID,
5596 : : PCI_CLASS_COMMUNICATION_SERIAL << 8,
5597 : : 0xffff00, pbn_default },
5598 : : { PCI_ANY_ID, PCI_ANY_ID,
5599 : : PCI_ANY_ID, PCI_ANY_ID,
5600 : : PCI_CLASS_COMMUNICATION_MODEM << 8,
5601 : : 0xffff00, pbn_default },
5602 : : { PCI_ANY_ID, PCI_ANY_ID,
5603 : : PCI_ANY_ID, PCI_ANY_ID,
5604 : : PCI_CLASS_COMMUNICATION_MULTISERIAL << 8,
5605 : : 0xffff00, pbn_default },
5606 : : { 0, }
5607 : : };
5608 : :
5609 : 0 : static pci_ers_result_t serial8250_io_error_detected(struct pci_dev *dev,
5610 : : pci_channel_state_t state)
5611 : : {
5612 [ # # ]: 0 : struct serial_private *priv = pci_get_drvdata(dev);
5613 : :
5614 [ # # ]: 0 : if (state == pci_channel_io_perm_failure)
5615 : : return PCI_ERS_RESULT_DISCONNECT;
5616 : :
5617 [ # # ]: 0 : if (priv)
5618 : 0 : pciserial_detach_ports(priv);
5619 : :
5620 : 0 : pci_disable_device(dev);
5621 : :
5622 : 0 : return PCI_ERS_RESULT_NEED_RESET;
5623 : : }
5624 : :
5625 : 0 : static pci_ers_result_t serial8250_io_slot_reset(struct pci_dev *dev)
5626 : : {
5627 : 0 : int rc;
5628 : :
5629 : 0 : rc = pci_enable_device(dev);
5630 : :
5631 [ # # ]: 0 : if (rc)
5632 : : return PCI_ERS_RESULT_DISCONNECT;
5633 : :
5634 : 0 : pci_restore_state(dev);
5635 : 0 : pci_save_state(dev);
5636 : :
5637 : 0 : return PCI_ERS_RESULT_RECOVERED;
5638 : : }
5639 : :
5640 : 0 : static void serial8250_io_resume(struct pci_dev *dev)
5641 : : {
5642 [ # # ]: 0 : struct serial_private *priv = pci_get_drvdata(dev);
5643 : 0 : struct serial_private *new;
5644 : :
5645 [ # # ]: 0 : if (!priv)
5646 : : return;
5647 : :
5648 : 0 : new = pciserial_init_ports(dev, priv->board);
5649 [ # # ]: 0 : if (!IS_ERR(new)) {
5650 : 0 : pci_set_drvdata(dev, new);
5651 : 0 : kfree(priv);
5652 : : }
5653 : : }
5654 : :
5655 : : static const struct pci_error_handlers serial8250_err_handler = {
5656 : : .error_detected = serial8250_io_error_detected,
5657 : : .slot_reset = serial8250_io_slot_reset,
5658 : : .resume = serial8250_io_resume,
5659 : : };
5660 : :
5661 : : static struct pci_driver serial_pci_driver = {
5662 : : .name = "serial",
5663 : : .probe = pciserial_init_one,
5664 : : .remove = pciserial_remove_one,
5665 : : .driver = {
5666 : : .pm = &pciserial_pm_ops,
5667 : : },
5668 : : .id_table = serial_pci_tbl,
5669 : : .err_handler = &serial8250_err_handler,
5670 : : };
5671 : :
5672 : 78 : module_pci_driver(serial_pci_driver);
5673 : :
5674 : : MODULE_LICENSE("GPL");
5675 : : MODULE_DESCRIPTION("Generic 8250/16x50 PCI serial probe module");
5676 : : MODULE_DEVICE_TABLE(pci, serial_pci_tbl);
|