xref: /freebsd/sys/dev/puc/pucdata.c (revision cbb009b9fee290f1a61461cb45253ca1c724c3b8)
1098ca2bdSWarner Losh /*-
2718cf2ccSPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3718cf2ccSPedro F. Giffuni  *
464220a7eSMarcel Moolenaar  * Copyright (c) 2006 Marcel Moolenaar
564220a7eSMarcel Moolenaar  * All rights reserved.
69c564b6cSJohn Hay  *
79c564b6cSJohn Hay  * Redistribution and use in source and binary forms, with or without
89c564b6cSJohn Hay  * modification, are permitted provided that the following conditions
99c564b6cSJohn Hay  * are met:
1064220a7eSMarcel Moolenaar  *
119c564b6cSJohn Hay  * 1. Redistributions of source code must retain the above copyright
129c564b6cSJohn Hay  *    notice, this list of conditions and the following disclaimer.
139c564b6cSJohn Hay  * 2. Redistributions in binary form must reproduce the above copyright
149c564b6cSJohn Hay  *    notice, this list of conditions and the following disclaimer in the
159c564b6cSJohn Hay  *    documentation and/or other materials provided with the distribution.
169c564b6cSJohn Hay  *
179c564b6cSJohn Hay  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
189c564b6cSJohn Hay  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
199c564b6cSJohn Hay  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
209c564b6cSJohn Hay  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
219c564b6cSJohn Hay  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
229c564b6cSJohn Hay  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239c564b6cSJohn Hay  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249c564b6cSJohn Hay  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259c564b6cSJohn Hay  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
269c564b6cSJohn Hay  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279c564b6cSJohn Hay  */
289c564b6cSJohn Hay 
299c564b6cSJohn Hay #include <sys/cdefs.h>
309c564b6cSJohn Hay __FBSDID("$FreeBSD$");
319c564b6cSJohn Hay 
329c564b6cSJohn Hay /*
339c564b6cSJohn Hay  * PCI "universal" communications card driver configuration data (used to
349c564b6cSJohn Hay  * match/attach the cards).
359c564b6cSJohn Hay  */
369c564b6cSJohn Hay 
379c564b6cSJohn Hay #include <sys/param.h>
3864220a7eSMarcel Moolenaar #include <sys/systm.h>
3964220a7eSMarcel Moolenaar #include <sys/kernel.h>
4064220a7eSMarcel Moolenaar #include <sys/bus.h>
419725900bSRyan Stone #include <sys/sysctl.h>
429c564b6cSJohn Hay 
4364220a7eSMarcel Moolenaar #include <machine/resource.h>
44ed0b0e82SWarner Losh #include <machine/bus.h>
4564220a7eSMarcel Moolenaar #include <sys/rman.h>
4664220a7eSMarcel Moolenaar 
473deebd53SMarius Strobl #include <dev/ic/ns16550.h>
483deebd53SMarius Strobl 
493deebd53SMarius Strobl #include <dev/pci/pcireg.h>
509c564b6cSJohn Hay #include <dev/pci/pcivar.h>
519c564b6cSJohn Hay 
5264220a7eSMarcel Moolenaar #include <dev/puc/puc_bus.h>
5364220a7eSMarcel Moolenaar #include <dev/puc/puc_cfg.h>
54482aa6a3SDavid E. O'Brien #include <dev/puc/puc_bfe.h>
559c564b6cSJohn Hay 
563deebd53SMarius Strobl static puc_config_f puc_config_advantech;
5764220a7eSMarcel Moolenaar static puc_config_f puc_config_amc;
5864220a7eSMarcel Moolenaar static puc_config_f puc_config_diva;
5922e0612fSJohn Baldwin static puc_config_f puc_config_exar;
608de2c77bSRyan Stone static puc_config_f puc_config_exar_pcie;
6164220a7eSMarcel Moolenaar static puc_config_f puc_config_icbook;
622c89ac5eSEitan Adler static puc_config_f puc_config_moxa;
63d5e0798eSMarius Strobl static puc_config_f puc_config_oxford_pci954;
64a59f78daSJohn Baldwin static puc_config_f puc_config_oxford_pcie;
6564220a7eSMarcel Moolenaar static puc_config_f puc_config_quatech;
6664220a7eSMarcel Moolenaar static puc_config_f puc_config_syba;
6764220a7eSMarcel Moolenaar static puc_config_f puc_config_siig;
6850c0e894SMarius Strobl static puc_config_f puc_config_sunix;
6964220a7eSMarcel Moolenaar static puc_config_f puc_config_timedia;
7064220a7eSMarcel Moolenaar static puc_config_f puc_config_titan;
71dc7d0deaSMarcel Moolenaar 
7264220a7eSMarcel Moolenaar const struct puc_cfg puc_pci_devices[] = {
7364220a7eSMarcel Moolenaar 	{   0x0009, 0x7168, 0xffff, 0,
7464220a7eSMarcel Moolenaar 	    "Sunix SUN1889",
7564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
7664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
770efcc68bSBruce Evans 	},
780efcc68bSBruce Evans 
7964220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1049,
8064220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
8164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8264220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
8364220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
84dc7d0deaSMarcel Moolenaar 	},
85dc7d0deaSMarcel Moolenaar 
8664220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104a,
8764220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
8864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, -1,
9064220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
91a27ffb41SDavid E. O'Brien 	},
92a27ffb41SDavid E. O'Brien 
9364220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104b,
9464220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
9564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, -1,
9764220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
98a27ffb41SDavid E. O'Brien 	},
99a27ffb41SDavid E. O'Brien 
10064220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1223,
10164220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
10264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10364220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10464220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
105a27ffb41SDavid E. O'Brien 	},
106a27ffb41SDavid E. O'Brien 
10764220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1226,
10864220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
10964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
11064220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
11164220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
112a27ffb41SDavid E. O'Brien 	},
113a27ffb41SDavid E. O'Brien 
11464220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1282,
11564220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
11664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
11764220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
11864220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
119a27ffb41SDavid E. O'Brien 	},
120a27ffb41SDavid E. O'Brien 
12164220a7eSMarcel Moolenaar 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
12264220a7eSMarcel Moolenaar 	    "VScom PCI-800",
12364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1252569e387SDavid E. O'Brien 	},
12664220a7eSMarcel Moolenaar 
12764220a7eSMarcel Moolenaar 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
12864220a7eSMarcel Moolenaar 	    "VScom PCI-400",
12964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
13064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
1312569e387SDavid E. O'Brien 	},
13264220a7eSMarcel Moolenaar 
13364220a7eSMarcel Moolenaar 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
13464220a7eSMarcel Moolenaar 	    "VScom PCI-200",
13564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
13664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1372569e387SDavid E. O'Brien 	},
138a27ffb41SDavid E. O'Brien 
1399c564b6cSJohn Hay 	/*
14064220a7eSMarcel Moolenaar 	 * Boca Research Turbo Serial 658 (8 serial port) card.
14164220a7eSMarcel Moolenaar 	 * Appears to be the same as Chase Research PLC PCI-FAST8
14264220a7eSMarcel Moolenaar 	 * and Perle PCI-FAST8 Multi-Port serial cards.
1439c564b6cSJohn Hay 	 */
14464220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
14564220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 658",
14664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1489c564b6cSJohn Hay 	},
1499c564b6cSJohn Hay 
15064220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
15164220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 654",
15264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
15364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
15464220a7eSMarcel Moolenaar 	},
1559c564b6cSJohn Hay 
1569c564b6cSJohn Hay 	/*
1579c564b6cSJohn Hay 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
1589c564b6cSJohn Hay 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
1599c564b6cSJohn Hay 	 * into the subsystem fields, and claims that it's a
1609c564b6cSJohn Hay 	 * network/misc (0x02/0x80) device.
1619c564b6cSJohn Hay 	 */
16264220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
16364220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4035",
16464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
16564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1669c564b6cSJohn Hay 	},
1679c564b6cSJohn Hay 
1689c564b6cSJohn Hay 	/*
16964220a7eSMarcel Moolenaar 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
17064220a7eSMarcel Moolenaar 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
17164220a7eSMarcel Moolenaar 	 * into the subsystem fields, and claims that it's a
17264220a7eSMarcel Moolenaar 	 * network/misc (0x02/0x80) device.
1739c564b6cSJohn Hay 	 */
17464220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
17564220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4014",
17664220a7eSMarcel Moolenaar 	    0,
17764220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x20, 4, 0,
1789c564b6cSJohn Hay 	},
1799c564b6cSJohn Hay 
18064220a7eSMarcel Moolenaar 	{   0x10e8, 0x818e, 0xffff, 0,
18164220a7eSMarcel Moolenaar 	    "Applied Micro Circuits 8 Port UART",
18264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
18364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
18464220a7eSMarcel Moolenaar 	    .config_function = puc_config_amc
18564220a7eSMarcel Moolenaar 	},
1869c564b6cSJohn Hay 
187430acc47SMarius Strobl 	/*
188430acc47SMarius Strobl 	 * The following members of the Digi International Neo series are
189430acc47SMarius Strobl 	 * based on Exar PCI chips, f. e. the 8 port variants on XR17V258IV.
190430acc47SMarius Strobl 	 * Accordingly, the PCIe versions of these cards incorporate a PLX
191430acc47SMarius Strobl 	 * PCIe-PCI-bridge.
192430acc47SMarius Strobl 	 */
193430acc47SMarius Strobl 
194430acc47SMarius Strobl 	{   0x114f, 0x00b0, 0xffff, 0,
195430acc47SMarius Strobl 	    "Digi Neo PCI 4 Port",
196430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
197430acc47SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, -1,
198430acc47SMarius Strobl 	    .config_function = puc_config_exar
199430acc47SMarius Strobl 	},
200430acc47SMarius Strobl 
201430acc47SMarius Strobl 	{   0x114f, 0x00b1, 0xffff, 0,
202430acc47SMarius Strobl 	    "Digi Neo PCI 8 Port",
203430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
204430acc47SMarius Strobl 	    PUC_PORT_8S, 0x10, 0, -1,
205430acc47SMarius Strobl 	    .config_function = puc_config_exar
206430acc47SMarius Strobl 	},
207430acc47SMarius Strobl 
208430acc47SMarius Strobl 	{   0x114f, 0x00f0, 0xffff, 0,
209430acc47SMarius Strobl 	    "Digi Neo PCIe 8 Port",
210430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
211430acc47SMarius Strobl 	    PUC_PORT_8S, 0x10, 0, -1,
212430acc47SMarius Strobl 	    .config_function = puc_config_exar
213430acc47SMarius Strobl 	},
214430acc47SMarius Strobl 
215430acc47SMarius Strobl 	{   0x114f, 0x00f1, 0xffff, 0,
216430acc47SMarius Strobl 	    "Digi Neo PCIe 4 Port",
217430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
218430acc47SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, -1,
219430acc47SMarius Strobl 	    .config_function = puc_config_exar
220430acc47SMarius Strobl 	},
221430acc47SMarius Strobl 
222430acc47SMarius Strobl 	{   0x114f, 0x00f2, 0xffff, 0,
223430acc47SMarius Strobl 	    "Digi Neo PCIe 4 Port RJ45",
224430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
225430acc47SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, -1,
226430acc47SMarius Strobl 	    .config_function = puc_config_exar
227430acc47SMarius Strobl 	},
228430acc47SMarius Strobl 
229430acc47SMarius Strobl 	{   0x114f, 0x00f3, 0xffff, 0,
230430acc47SMarius Strobl 	    "Digi Neo PCIe 8 Port RJ45",
231430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
232430acc47SMarius Strobl 	    PUC_PORT_8S, 0x10, 0, -1,
233430acc47SMarius Strobl 	    .config_function = puc_config_exar
234430acc47SMarius Strobl 	},
235430acc47SMarius Strobl 
23664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8010, 0xffff, 0,
23764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part A",
23864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
24064220a7eSMarcel Moolenaar 	},
24164220a7eSMarcel Moolenaar 
24264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8011, 0xffff, 0,
24364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part B",
24464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
24564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
24664220a7eSMarcel Moolenaar 	},
24764220a7eSMarcel Moolenaar 
24864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8012, 0xffff, 0,
24964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part A",
25064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
25164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
25264220a7eSMarcel Moolenaar 	},
25364220a7eSMarcel Moolenaar 
25464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8013, 0xffff, 0,
25564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part B",
25664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
25764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
25864220a7eSMarcel Moolenaar 	},
25964220a7eSMarcel Moolenaar 
26064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8014, 0xffff, 0,
26164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/4 RJ45",
26264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
26364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
26464220a7eSMarcel Moolenaar 	},
26564220a7eSMarcel Moolenaar 
26664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8015, 0xffff, 0,
26764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/Quad",
26864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
26964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
27064220a7eSMarcel Moolenaar 	},
27164220a7eSMarcel Moolenaar 
27264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8016, 0xffff, 0,
27364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part A",
27464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
27564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
27664220a7eSMarcel Moolenaar 	},
27764220a7eSMarcel Moolenaar 
27864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8017, 0xffff, 0,
27964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part B",
28064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
28164220a7eSMarcel Moolenaar 	    PUC_PORT_12S, 0x10, 0, 8,
28264220a7eSMarcel Moolenaar 	},
28364220a7eSMarcel Moolenaar 
28464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8018, 0xffff, 0,
28564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part A",
28664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
28764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
28864220a7eSMarcel Moolenaar 	},
28964220a7eSMarcel Moolenaar 
29064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8019, 0xffff, 0,
29164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part B",
29264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
29364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
29464220a7eSMarcel Moolenaar 	},
2959c564b6cSJohn Hay 
2969c564b6cSJohn Hay 	/*
29763fbf504SRobert Watson 	 * IBM SurePOS 300 Series (481033H) serial ports
29863fbf504SRobert Watson 	 * Details can be found on the IBM RSS websites
29963fbf504SRobert Watson 	 */
30063fbf504SRobert Watson 
30163fbf504SRobert Watson 	{   0x1014, 0x0297, 0xffff, 0,
30263fbf504SRobert Watson 	    "IBM SurePOS 300 Series (481033H) serial ports",
30363fbf504SRobert Watson 	    DEFAULT_RCLK,
30463fbf504SRobert Watson 	    PUC_PORT_4S, 0x10, 4, 0
30563fbf504SRobert Watson 	},
30663fbf504SRobert Watson 
30763fbf504SRobert Watson 	/*
3089c564b6cSJohn Hay 	 * SIIG Boards.
3099c564b6cSJohn Hay 	 *
3109c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
31164220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
3129c564b6cSJohn Hay 	 */
3139c564b6cSJohn Hay 
31464220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
31564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
31664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
3189c564b6cSJohn Hay 	},
3199c564b6cSJohn Hay 
32064220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
32164220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
32264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32364220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
3249c564b6cSJohn Hay 	},
3259c564b6cSJohn Hay 
32664220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
32764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
32864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
3309c564b6cSJohn Hay 	},
3319c564b6cSJohn Hay 
33264220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
33364220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
33464220a7eSMarcel Moolenaar 	    0,
33564220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
3369c564b6cSJohn Hay 	},
3379c564b6cSJohn Hay 
33864220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
33964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
34064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3429c564b6cSJohn Hay 	},
3439c564b6cSJohn Hay 
34464220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
34564220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
34664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3489c564b6cSJohn Hay 	},
3499c564b6cSJohn Hay 
35064220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
35164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
35264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3549c564b6cSJohn Hay 	},
3559c564b6cSJohn Hay 
35664220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
35764220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
35864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35964220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3609c564b6cSJohn Hay 	},
3619c564b6cSJohn Hay 
36264220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
36364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
36464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36564220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3669c564b6cSJohn Hay 	},
3679c564b6cSJohn Hay 
36864220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
36964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
37064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37164220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3729c564b6cSJohn Hay 	},
3739c564b6cSJohn Hay 
37464220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
37564220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
37664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3789c564b6cSJohn Hay 	},
3799c564b6cSJohn Hay 
38064220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
38164220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
38264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3849c564b6cSJohn Hay 	},
3859c564b6cSJohn Hay 
38664220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
38764220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
38864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3909c564b6cSJohn Hay 	},
3919c564b6cSJohn Hay 
39264220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
39364220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
39464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39564220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3969c564b6cSJohn Hay 	},
3979c564b6cSJohn Hay 
39864220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
39964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
40064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
4029c564b6cSJohn Hay 	},
4039c564b6cSJohn Hay 
40464220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
40564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
40664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
4089c564b6cSJohn Hay 	},
4099c564b6cSJohn Hay 
41064220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
41164220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
41264220a7eSMarcel Moolenaar 	    0,
41364220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
4149c564b6cSJohn Hay 	},
4159c564b6cSJohn Hay 
41664220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
41764220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
41864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
4209c564b6cSJohn Hay 	},
4219c564b6cSJohn Hay 
42264220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
42364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
42464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
4269c564b6cSJohn Hay 	},
4279c564b6cSJohn Hay 
42864220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
42964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
43064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
4329c564b6cSJohn Hay 	},
4339c564b6cSJohn Hay 
43464220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
43564220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
43664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43764220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
43864220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4399c564b6cSJohn Hay 	},
4409c564b6cSJohn Hay 
44164220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
44264220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
44364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
44464220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
44564220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4469c564b6cSJohn Hay 	},
4479c564b6cSJohn Hay 
44864220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
44964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
45064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
45164220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
45264220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4539c564b6cSJohn Hay 	},
4549c564b6cSJohn Hay 
45564220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
45664220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
45764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
45864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4599c564b6cSJohn Hay 	},
4609c564b6cSJohn Hay 
46164220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
46264220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
46364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
46464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4659c564b6cSJohn Hay 	},
4669c564b6cSJohn Hay 
46764220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
46864220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
46964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
47064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4719c564b6cSJohn Hay 	},
4729c564b6cSJohn Hay 
47364220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
47464220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
47564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
47664220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4779c564b6cSJohn Hay 	},
4789c564b6cSJohn Hay 
47964220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
48064220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
48164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
48264220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4839c564b6cSJohn Hay 	},
4849c564b6cSJohn Hay 
48564220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
48664220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
48764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
48864220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4899c564b6cSJohn Hay 	},
4909c564b6cSJohn Hay 
49164220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
49264220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
49364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
49464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
49564220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4969c564b6cSJohn Hay 	},
4979c564b6cSJohn Hay 
49864220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
49964220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
50064220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
50164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
50264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5039c564b6cSJohn Hay 	},
5049c564b6cSJohn Hay 
50564220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
50664220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
50764220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
50864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
50964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5109c564b6cSJohn Hay 	},
5119c564b6cSJohn Hay 
51264220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
51364220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
51464220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
51564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
51664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5179c564b6cSJohn Hay 	},
5189c564b6cSJohn Hay 
51964220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
52064220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
52164220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
52264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
52364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5249c564b6cSJohn Hay 	},
5259c564b6cSJohn Hay 
52664220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
52764220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
52864220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
52964220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
53064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5319c564b6cSJohn Hay 	},
5329c564b6cSJohn Hay 
53364220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
53464220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
53564220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
53664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
53764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5389c564b6cSJohn Hay 	},
5399c564b6cSJohn Hay 
54064220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
54164220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
54264220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
54364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
54464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5459c564b6cSJohn Hay 	},
5469c564b6cSJohn Hay 
54764220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
54864220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
54964220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
55064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
55164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
55276353f68SJohn Hay 	},
55376353f68SJohn Hay 
55464220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
55564220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
55664220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
55764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
55864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5599c564b6cSJohn Hay 	},
5609c564b6cSJohn Hay 
56164220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
56264220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
56364220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
56464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
56564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5669c564b6cSJohn Hay 	},
5679c564b6cSJohn Hay 
568f83255a5SMax Khon 	{   0x1393, 0x1024, 0xffff, 0,
569f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102E/PCIe",
570f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
57151cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
57251cb024fSMax Khon 	    .config_function = puc_config_moxa
573f83255a5SMax Khon 	},
574f83255a5SMax Khon 
575f83255a5SMax Khon 	{   0x1393, 0x1025, 0xffff, 0,
576f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102EL/PCIe",
577f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
57851cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
57951cb024fSMax Khon 	    .config_function = puc_config_moxa
580f83255a5SMax Khon 	},
581f83255a5SMax Khon 
58264220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
58364220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
58464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
58564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5860ec6e983SJoerg Wunsch 	},
58740f01890SBruce Evans 
58864220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
58964220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
59064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
59164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5929c564b6cSJohn Hay 	},
5939c564b6cSJohn Hay 
5942c89ac5eSEitan Adler 	{   0x1393, 0x1042, 0xffff, 0,
5952c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104JU/PCI",
5962c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5972c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x18, 0, 8,
5982c89ac5eSEitan Adler 	},
5992c89ac5eSEitan Adler 
600f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
601f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
602f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
603f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
604f6a60febSMaxim Konovalov 	},
605f6a60febSMaxim Konovalov 
6062c89ac5eSEitan Adler 	{   0x1393, 0x1045, 0xffff, 0,
6072c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104EL-A/PCIe",
6082c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
6092c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x14, 0, -1,
6102c89ac5eSEitan Adler 	    .config_function = puc_config_moxa
6112c89ac5eSEitan Adler 	},
6122c89ac5eSEitan Adler 
6138efbf264SJohn Baldwin 	{   0x1393, 0x1120, 0xffff, 0,
6148efbf264SJohn Baldwin 	    "Moxa Technologies, CP-112UL",
6158efbf264SJohn Baldwin 	    DEFAULT_RCLK * 8,
6168efbf264SJohn Baldwin 	    PUC_PORT_2S, 0x18, 0, 8,
6178efbf264SJohn Baldwin 	},
6188efbf264SJohn Baldwin 
61964220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
62064220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
62164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
62264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
6239c564b6cSJohn Hay 	},
6249c564b6cSJohn Hay 
625f83255a5SMax Khon 	{   0x1393, 0x1144, 0xffff, 0,
626f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-114EL/PCIe",
627f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
628f83255a5SMax Khon 	    PUC_PORT_4S, 0x14, 0, -1,
629f83255a5SMax Khon 	    .config_function = puc_config_moxa
630f83255a5SMax Khon 	},
631f83255a5SMax Khon 
632f83255a5SMax Khon 	{   0x1393, 0x1182, 0xffff, 0,
633f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-118EL-A/PCIe",
634f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
63551cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
63651cb024fSMax Khon 	    .config_function = puc_config_moxa
637f83255a5SMax Khon 	},
638f83255a5SMax Khon 
63964220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
64064220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
64164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
64264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
6439c564b6cSJohn Hay 	},
6449c564b6cSJohn Hay 
64564220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
64664220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
64764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
64864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
6499c564b6cSJohn Hay 	},
6509c564b6cSJohn Hay 
6510db1aa0bSStanislav Sedov 	{   0x1393, 0x1682, 0xffff, 0,
6520db1aa0bSStanislav Sedov 	    "Moxa Technologies, CP-168EL/PCIe",
6530db1aa0bSStanislav Sedov 	    DEFAULT_RCLK * 8,
6540db1aa0bSStanislav Sedov 	    PUC_PORT_8S, 0x18, 0, 8,
6550db1aa0bSStanislav Sedov 	},
6560db1aa0bSStanislav Sedov 
657f83255a5SMax Khon 	{   0x1393, 0x1683, 0xffff, 0,
658f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-168EL-A/PCIe",
659f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
66051cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
66151cb024fSMax Khon 	    .config_function = puc_config_moxa
662f83255a5SMax Khon 	},
663f83255a5SMax Khon 
66422e0612fSJohn Baldwin 	{   0x13a8, 0x0152, 0xffff, 0,
66522e0612fSJohn Baldwin 	    "Exar XR17C/D152",
66622e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
66722e0612fSJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, -1,
66822e0612fSJohn Baldwin 	    .config_function = puc_config_exar
66922e0612fSJohn Baldwin 	},
67022e0612fSJohn Baldwin 
67122e0612fSJohn Baldwin 	{   0x13a8, 0x0154, 0xffff, 0,
67222e0612fSJohn Baldwin 	    "Exar XR17C154",
67322e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
67422e0612fSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, -1,
67522e0612fSJohn Baldwin 	    .config_function = puc_config_exar
67622e0612fSJohn Baldwin 	},
67722e0612fSJohn Baldwin 
67864220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
67922e0612fSJohn Baldwin 	    "Exar XR17C158",
68064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
68164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
68222e0612fSJohn Baldwin 	    .config_function = puc_config_exar
683de0d2cadSJohn Hay 	},
684de0d2cadSJohn Hay 
68579aac43eSEd Maste 	{   0x13a8, 0x0258, 0xffff, 0,
68679aac43eSEd Maste 	    "Exar XR17V258IV",
68779aac43eSEd Maste 	    DEFAULT_RCLK * 8,
68879aac43eSEd Maste 	    PUC_PORT_8S, 0x10, 0, -1,
6893aff0961SRyan Stone 	    .config_function = puc_config_exar
69079aac43eSEd Maste 	},
69179aac43eSEd Maste 
692*cbb009b9SConrad Meyer 	{   0x13a8, 0x0352, 0xffff, 0,
693*cbb009b9SConrad Meyer 	    "Exar XR17V352",
694*cbb009b9SConrad Meyer 	    125000000,
695*cbb009b9SConrad Meyer 	    PUC_PORT_2S, 0x10, 0, -1,
696*cbb009b9SConrad Meyer 	    .config_function = puc_config_exar_pcie
697*cbb009b9SConrad Meyer 	},
698*cbb009b9SConrad Meyer 
6998de2c77bSRyan Stone 	/* The XR17V358 uses the 125MHz PCIe clock as its reference clock. */
7008de2c77bSRyan Stone 	{   0x13a8, 0x0358, 0xffff, 0,
7018de2c77bSRyan Stone 	    "Exar XR17V358",
7028de2c77bSRyan Stone 	    125000000,
7038de2c77bSRyan Stone 	    PUC_PORT_8S, 0x10, 0, -1,
7048de2c77bSRyan Stone 	    .config_function = puc_config_exar_pcie
7058de2c77bSRyan Stone 	},
7068de2c77bSRyan Stone 
7073deebd53SMarius Strobl 	/*
7083deebd53SMarius Strobl 	 * The Advantech PCI-1602 Rev. A use the first two ports of an Oxford
7093deebd53SMarius Strobl 	 * Semiconductor OXuPCI954.  Note these boards have a hardware bug in
7103deebd53SMarius Strobl 	 * that they drive the RS-422/485 transmitters after power-on until a
7113deebd53SMarius Strobl 	 * driver initalizes the UARTs.
7123deebd53SMarius Strobl 	 */
7135bcc8e2fSEitan Adler 	{   0x13fe, 0x1600, 0x1602, 0x0002,
7143deebd53SMarius Strobl 	    "Advantech PCI-1602 Rev. A",
7155bcc8e2fSEitan Adler 	    DEFAULT_RCLK * 8,
7165bcc8e2fSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
7173deebd53SMarius Strobl 	    .config_function = puc_config_advantech
7183deebd53SMarius Strobl 	},
7193deebd53SMarius Strobl 
7203deebd53SMarius Strobl 	/* Advantech PCI-1602 Rev. B1/PCI-1603 are also based on OXuPCI952. */
7213deebd53SMarius Strobl 	{   0x13fe, 0xa102, 0x13fe, 0xa102,
7223deebd53SMarius Strobl 	    "Advantech 2-port PCI (PCI-1602 Rev. B1/PCI-1603)",
7233deebd53SMarius Strobl 	    DEFAULT_RCLK * 8,
7243deebd53SMarius Strobl 	    PUC_PORT_2S, 0x10, 4, 0,
7253deebd53SMarius Strobl 	    .config_function = puc_config_advantech
7265bcc8e2fSEitan Adler 	},
7275bcc8e2fSEitan Adler 
72864220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
72964220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
73064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
73164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7329c564b6cSJohn Hay 	},
7339c564b6cSJohn Hay 
73464220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
73564220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
73664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
73764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7389c564b6cSJohn Hay 	},
7399c564b6cSJohn Hay 
74064220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
74164220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
74264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
74364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7449c564b6cSJohn Hay 	},
7459c564b6cSJohn Hay 
74664220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
74764220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
74864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
74964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7509c564b6cSJohn Hay 	},
75164220a7eSMarcel Moolenaar 
75264220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
75364220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
75464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
75564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
75664220a7eSMarcel Moolenaar 	},
75764220a7eSMarcel Moolenaar 
75864220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
75964220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
76064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
76164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
76264220a7eSMarcel Moolenaar 	},
76364220a7eSMarcel Moolenaar 
76464220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
76564220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
76664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
76764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
76864220a7eSMarcel Moolenaar 	},
76964220a7eSMarcel Moolenaar 
77013ae6dceSKevin Lo 	{   0x1409, 0x7268, 0xffff, 0,
77113ae6dceSKevin Lo 	    "Sunix SUN1888",
77213ae6dceSKevin Lo 	    0,
77313ae6dceSKevin Lo 	    PUC_PORT_2P, 0x10, 0, 8,
77413ae6dceSKevin Lo 	},
77513ae6dceSKevin Lo 
77664220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
77764220a7eSMarcel Moolenaar 	    NULL,
77864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
77964220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
78064220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
7819c564b6cSJohn Hay 	},
7829c564b6cSJohn Hay 
7839c564b6cSJohn Hay 	/*
7849c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
7859c564b6cSJohn Hay 	 *
7869c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
7876e9f075aSJohn Baldwin 	 * <URL:http://www.plxtech.com/products/uart/>
7889c564b6cSJohn Hay 	 *
7899c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
7909c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
7919c564b6cSJohn Hay 	 */
792acdfc36aSEitan Adler 	{
793acdfc36aSEitan Adler 	    0x1415, 0x9501, 0x10fc, 0xc070,
794acdfc36aSEitan Adler 	    "I-O DATA RSA-PCI2/R",
795acdfc36aSEitan Adler 	    DEFAULT_RCLK * 8,
796acdfc36aSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
797acdfc36aSEitan Adler 	},
7989c564b6cSJohn Hay 
7990db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
8000db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
8010db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
8020db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
8030db885bbSDag-Erling Smørgrav 	},
8040db885bbSDag-Erling Smørgrav 
8051d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
8061d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
8071d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
8081d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
8091d860a7eSMarcel Moolenaar 	},
8101d860a7eSMarcel Moolenaar 
81130ced0d8SJohn Baldwin 	{   0x1415, 0x9501, 0x131f, 0x2052,
81230ced0d8SJohn Baldwin 	    "SIIG Quartet Serial 850",
81330ced0d8SJohn Baldwin 	    DEFAULT_RCLK * 10,
81430ced0d8SJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
81530ced0d8SJohn Baldwin 	},
81630ced0d8SJohn Baldwin 
817282211eaSJohn Baldwin 	{   0x1415, 0x9501, 0x14db, 0x2150,
818282211eaSJohn Baldwin 	    "Kuroutoshikou SERIAL4P-LPPCI2",
819282211eaSJohn Baldwin 	    DEFAULT_RCLK * 10,
820282211eaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
821282211eaSJohn Baldwin 	},
822282211eaSJohn Baldwin 
82364220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
824c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
825d5e0798eSMarius Strobl 	    0,
82664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
827d5e0798eSMarius Strobl 	    .config_function = puc_config_oxford_pci954
82883431653SWarner Losh 	},
82983431653SWarner Losh 
83010414b71SJohn Baldwin 	{   0x1415, 0x950a, 0x131f, 0x2030,
83110414b71SJohn Baldwin 	    "SIIG Cyber 2S PCIe",
83210414b71SJohn Baldwin 	    DEFAULT_RCLK * 10,
83310414b71SJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, 8,
83410414b71SJohn Baldwin 	},
83510414b71SJohn Baldwin 
8360dfbbaceSEitan Adler 	{   0x1415, 0x950a, 0x131f, 0x2032,
8370dfbbaceSEitan Adler 	    "SIIG Cyber Serial Dual PCI 16C850",
8380dfbbaceSEitan Adler 	    DEFAULT_RCLK * 10,
8390dfbbaceSEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
8400dfbbaceSEitan Adler 	},
8410dfbbaceSEitan Adler 
8421714dcabSMarius Strobl 	{   0x1415, 0x950a, 0x131f, 0x2061,
8431714dcabSMarius Strobl 	    "SIIG Cyber 2SP1 PCIe",
8441714dcabSMarius Strobl 	    DEFAULT_RCLK * 10,
8451714dcabSMarius Strobl 	    PUC_PORT_2S, 0x10, 0, 8,
8461714dcabSMarius Strobl 	},
8471714dcabSMarius Strobl 
84864220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
849c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
850c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
85164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
8529c564b6cSJohn Hay 	},
8539c564b6cSJohn Hay 
85464220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
85564220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
85664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
85764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
85843e42f36SDoug Ambrisko 	},
85943e42f36SDoug Ambrisko 
86064220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
86164220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
86264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
86364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
8646cb38a02SDoug Ambrisko 	},
8656cb38a02SDoug Ambrisko 
86611a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
86711a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
86800ff5de5SMarius Strobl 	    DEFAULT_RCLK,
86911a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
87011a12794SRoman Kurakin 	},
87111a12794SRoman Kurakin 
872f09d9fbaSJohn Baldwin 	/*
873f09d9fbaSJohn Baldwin 	 * Perle boards use Oxford Semiconductor chips, but they store the
874f09d9fbaSJohn Baldwin 	 * Oxford Semiconductor device ID as a subvendor device ID and use
875f09d9fbaSJohn Baldwin 	 * their own device IDs.
876f09d9fbaSJohn Baldwin 	 */
877f09d9fbaSJohn Baldwin 
878f09d9fbaSJohn Baldwin 	{   0x155f, 0x0331, 0xffff, 0,
879edfaa737SEitan Adler 	    "Perle Ultraport4 Express",
880edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
881edfaa737SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
882edfaa737SEitan Adler 	},
883edfaa737SEitan Adler 
884edfaa737SEitan Adler 	{   0x155f, 0xB012, 0xffff, 0,
885edfaa737SEitan Adler 	    "Perle Speed2 LE",
886edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
887edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
888edfaa737SEitan Adler 	},
889edfaa737SEitan Adler 
890edfaa737SEitan Adler 	{   0x155f, 0xB022, 0xffff, 0,
891edfaa737SEitan Adler 	    "Perle Speed2 LE",
892edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
893edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
894edfaa737SEitan Adler 	},
895edfaa737SEitan Adler 
896edfaa737SEitan Adler 	{   0x155f, 0xB004, 0xffff, 0,
897f09d9fbaSJohn Baldwin 	    "Perle Speed4 LE",
898f09d9fbaSJohn Baldwin 	    DEFAULT_RCLK * 8,
899f09d9fbaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
900f09d9fbaSJohn Baldwin 	},
901f09d9fbaSJohn Baldwin 
902edfaa737SEitan Adler 	{   0x155f, 0xB008, 0xffff, 0,
903edfaa737SEitan Adler 	    "Perle Speed8 LE",
904edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
905edfaa737SEitan Adler 	    PUC_PORT_8S, 0x10, 0, 8,
906edfaa737SEitan Adler 	},
907edfaa737SEitan Adler 
908edfaa737SEitan Adler 
9096e9f075aSJohn Baldwin 	/*
9106e9f075aSJohn Baldwin 	 * Oxford Semiconductor PCI Express Expresso family
9116e9f075aSJohn Baldwin 	 *
9126e9f075aSJohn Baldwin 	 * Found in many 'native' PCI Express serial boards such as:
9136e9f075aSJohn Baldwin 	 *
9146e9f075aSJohn Baldwin 	 * eMegatech MP954ER4 (4 port) and MP958ER8 (8 port)
9156e9f075aSJohn Baldwin 	 * <URL:http://www.emegatech.com.tw/pdrs232pcie.html>
9166e9f075aSJohn Baldwin 	 *
9176e9f075aSJohn Baldwin 	 * Lindy 51189 (4 port)
9186e9f075aSJohn Baldwin 	 * <URL:http://www.lindy.com> <URL:http://tinyurl.com/lindy-51189>
9196e9f075aSJohn Baldwin 	 *
9206e9f075aSJohn Baldwin 	 * StarTech.com PEX4S952 (4 port) and PEX8S952 (8 port)
9216e9f075aSJohn Baldwin 	 * <URL:http://www.startech.com>
9226e9f075aSJohn Baldwin 	 */
9236e9f075aSJohn Baldwin 
924bdb4291fSRui Paulo 	{   0x1415, 0xc11b, 0xffff, 0,
925bdb4291fSRui Paulo 	    "Oxford Semiconductor OXPCIe952 1S1P",
926bdb4291fSRui Paulo 	    DEFAULT_RCLK * 0x22,
927bdb4291fSRui Paulo 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
928bdb4291fSRui Paulo 	    .config_function = puc_config_oxford_pcie
929bdb4291fSRui Paulo 	},
930bdb4291fSRui Paulo 
931a6a64612SAndrey V. Elsukov 	{   0x1415, 0xc138, 0xffff, 0,
932a6a64612SAndrey V. Elsukov 	    "Oxford Semiconductor OXPCIe952 UARTs",
933a6a64612SAndrey V. Elsukov 	    DEFAULT_RCLK * 0x22,
934a6a64612SAndrey V. Elsukov 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
935a6a64612SAndrey V. Elsukov 	    .config_function = puc_config_oxford_pcie
936a6a64612SAndrey V. Elsukov 	},
937a6a64612SAndrey V. Elsukov 
9386e9f075aSJohn Baldwin 	{   0x1415, 0xc158, 0xffff, 0,
9396e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs",
9406e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9416e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9426e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9436e9f075aSJohn Baldwin 	},
9446e9f075aSJohn Baldwin 
9456e9f075aSJohn Baldwin 	{   0x1415, 0xc15d, 0xffff, 0,
9466e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs (function 1)",
9476e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9486e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9496e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9506e9f075aSJohn Baldwin 	},
9516e9f075aSJohn Baldwin 
9526e9f075aSJohn Baldwin 	{   0x1415, 0xc208, 0xffff, 0,
9536e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs",
9546e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9556e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9566e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9576e9f075aSJohn Baldwin 	},
9586e9f075aSJohn Baldwin 
9596e9f075aSJohn Baldwin 	{   0x1415, 0xc20d, 0xffff, 0,
9606e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs (function 1)",
9616e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9626e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9636e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9646e9f075aSJohn Baldwin 	},
9656e9f075aSJohn Baldwin 
9666e9f075aSJohn Baldwin 	{   0x1415, 0xc308, 0xffff, 0,
9676e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs",
9686e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9696e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9706e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9716e9f075aSJohn Baldwin 	},
9726e9f075aSJohn Baldwin 
9736e9f075aSJohn Baldwin 	{   0x1415, 0xc30d, 0xffff, 0,
9746e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs (function 1)",
9756e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9766e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9776e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9786e9f075aSJohn Baldwin 	},
9796e9f075aSJohn Baldwin 
98046ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
98146ce58c7SAndrew Thompson 	    "VScom PCI-100L",
98246ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
98346ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
98446ce58c7SAndrew Thompson 	},
98546ce58c7SAndrew Thompson 
98664220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
98764220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
98864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
98964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
990a58deb46SColin Percival 	},
991a58deb46SColin Percival 
99264220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
99346dd877dSPoul-Henning Kamp 	    "VScom 200Li",
99464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
99564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
99646dd877dSPoul-Henning Kamp 	},
9973e19d3c0SBruce M Simpson 
99864220a7eSMarcel Moolenaar 	/*
99964220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
100064220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
100164220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
100264220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
100364220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
100464220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
100564220a7eSMarcel Moolenaar 	 * access the external UARTs.
100664220a7eSMarcel Moolenaar 	 */
100764220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
100864220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
100964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
101064220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
101164220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
101264220a7eSMarcel Moolenaar 	},
101364220a7eSMarcel Moolenaar 
101464220a7eSMarcel Moolenaar 	/*
101564220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
101664220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
101764220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
101864220a7eSMarcel Moolenaar 	 */
101964220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
102064220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
102164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
102264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
102364220a7eSMarcel Moolenaar 	},
102400ff5de5SMarius Strobl 
102564220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
102664220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
102764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
102864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
102964220a7eSMarcel Moolenaar 	},
103064220a7eSMarcel Moolenaar 
103164220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
103264220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
103364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
103464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
103564220a7eSMarcel Moolenaar 	},
103664220a7eSMarcel Moolenaar 
103764220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
103864220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
103964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
104064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
104164220a7eSMarcel Moolenaar 	},
104264220a7eSMarcel Moolenaar 
104364589ec8SEitan Adler 	{   0x14d2, 0xa007, 0xffff, 0,
104464589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
104564589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
104664589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
104764589ec8SEitan Adler 	},
104864589ec8SEitan Adler 
104964589ec8SEitan Adler 	{   0x14d2, 0xa008, 0xffff, 0,
105064589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
105164589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
105264589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
105364589ec8SEitan Adler 	},
105464589ec8SEitan Adler 
105564220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
105664220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
105764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
105864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
105964220a7eSMarcel Moolenaar 	},
106064220a7eSMarcel Moolenaar 
106164220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
106264220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
106364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
106464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
106564220a7eSMarcel Moolenaar 	},
106664220a7eSMarcel Moolenaar 
10670dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
10680dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
10690dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
10700dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
10710dc908e7SAndrew Thompson 	},
10720dc908e7SAndrew Thompson 
107364220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
107464220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
107564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
107664220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
107764220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
107864220a7eSMarcel Moolenaar 	},
107964220a7eSMarcel Moolenaar 
108050c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0002,
108150c0e894SMarius Strobl 	    "Sunix SER5xxxx 2-port serial",
10827501345eSJohn Hay 	    DEFAULT_RCLK * 8,
10837501345eSJohn Hay 	    PUC_PORT_2S, 0x10, 0, 8,
10847501345eSJohn Hay 	},
10857501345eSJohn Hay 
108650c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0004,
108750c0e894SMarius Strobl 	    "Sunix SER5xxxx 4-port serial",
108850c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
108950c0e894SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, 8,
109050c0e894SMarius Strobl 	},
109150c0e894SMarius Strobl 
109250c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0008,
109350c0e894SMarius Strobl 	    "Sunix SER5xxxx 8-port serial",
109450c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
109550c0e894SMarius Strobl 	    PUC_PORT_8S, -1, -1, -1,
109650c0e894SMarius Strobl 	    .config_function = puc_config_sunix
109750c0e894SMarius Strobl 	},
109850c0e894SMarius Strobl 
109950c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0101,
110050c0e894SMarius Strobl 	    "Sunix MIO5xxxx 1-port serial and 1284 Printer port",
110150c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
110250c0e894SMarius Strobl 	    PUC_PORT_1S1P, -1, -1, -1,
110350c0e894SMarius Strobl 	    .config_function = puc_config_sunix
110450c0e894SMarius Strobl 	},
110550c0e894SMarius Strobl 
110650c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0102,
110710bcada8SMarius Strobl 	    "Sunix MIO5xxxx 2-port serial and 1284 Printer port",
110850c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
110950c0e894SMarius Strobl 	    PUC_PORT_2S1P, -1, -1, -1,
111050c0e894SMarius Strobl 	    .config_function = puc_config_sunix
111150c0e894SMarius Strobl 	},
111250c0e894SMarius Strobl 
111350c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0104,
111450c0e894SMarius Strobl 	    "Sunix MIO5xxxx 4-port serial and 1284 Printer port",
111550c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
111650c0e894SMarius Strobl 	    PUC_PORT_4S1P, -1, -1, -1,
111750c0e894SMarius Strobl 	    .config_function = puc_config_sunix
111850c0e894SMarius Strobl 	},
111950c0e894SMarius Strobl 
11207eae6323SLuiz Otavio O Souza 	{   0x5372, 0x6872, 0xffff, 0,
11217eae6323SLuiz Otavio O Souza 	    "Feasso PCI FPP-02 2S1P",
11227eae6323SLuiz Otavio O Souza 	    DEFAULT_RCLK,
11237eae6323SLuiz Otavio O Souza 	    PUC_PORT_2S1P, 0x10, 4, 0,
11247eae6323SLuiz Otavio O Souza 	},
11257eae6323SLuiz Otavio O Souza 
1126d9b73ea9SEitan Adler 	{   0x5372, 0x6873, 0xffff, 0,
1127d9b73ea9SEitan Adler 	    "Sun 1040 PCI Quad Serial",
1128d9b73ea9SEitan Adler 	    DEFAULT_RCLK,
1129d9b73ea9SEitan Adler 	    PUC_PORT_4S, 0x10, 4, 0,
1130d9b73ea9SEitan Adler 	},
1131d9b73ea9SEitan Adler 
113264220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
113364220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
113464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
113564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
113664220a7eSMarcel Moolenaar 	},
113764220a7eSMarcel Moolenaar 
1138858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
1139858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
1140858030c4SAndrew Thompson 	    DEFAULT_RCLK,
1141858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
1142858030c4SAndrew Thompson 	},
1143858030c4SAndrew Thompson 
114464220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
114564220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
114664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
114764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
114864220a7eSMarcel Moolenaar 	},
114964220a7eSMarcel Moolenaar 
115064220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
115164220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
115264220a7eSMarcel Moolenaar 	    0,
115364220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
115464220a7eSMarcel Moolenaar 	},
115564220a7eSMarcel Moolenaar 
1156843994aeSJohn Baldwin 	/*
115750c0e894SMarius Strobl 	 * This is more specific than the generic NM9835 entry, and is placed
115850c0e894SMarius Strobl 	 * here to _prevent_ puc(4) from claiming this single port card.
1159843994aeSJohn Baldwin 	 *
1160843994aeSJohn Baldwin 	 * uart(4) will claim this device.
1161843994aeSJohn Baldwin 	 */
1162843994aeSJohn Baldwin 	{   0x9710, 0x9835, 0x1000, 1,
1163843994aeSJohn Baldwin 	    "NetMos NM9835 based 1-port serial",
1164843994aeSJohn Baldwin 	    DEFAULT_RCLK,
1165843994aeSJohn Baldwin 	    PUC_PORT_1S, 0x10, 4, 0,
1166843994aeSJohn Baldwin 	},
1167843994aeSJohn Baldwin 
1168045de714SNavdeep Parhar 	{   0x9710, 0x9835, 0x1000, 2,
1169045de714SNavdeep Parhar 	    "NetMos NM9835 based 2-port serial",
1170045de714SNavdeep Parhar 	    DEFAULT_RCLK,
1171045de714SNavdeep Parhar 	    PUC_PORT_2S, 0x10, 4, 0,
1172045de714SNavdeep Parhar 	},
1173045de714SNavdeep Parhar 
117464220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
117564220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
117664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
117764220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
117864220a7eSMarcel Moolenaar 	},
117964220a7eSMarcel Moolenaar 
118064220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
118164220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
118264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
118364220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
118464220a7eSMarcel Moolenaar 	},
118564220a7eSMarcel Moolenaar 
118664220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
118764220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
118864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
118964220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
11901d864e0dSMarcel Moolenaar 	},
11911d864e0dSMarcel Moolenaar 
11921d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3002,
11931d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART",
11941d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11951d864e0dSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
11961d864e0dSMarcel Moolenaar 	},
11971d864e0dSMarcel Moolenaar 
11981d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3003,
11991d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Triple UART",
12001d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
12011d864e0dSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 4, 0,
12021d864e0dSMarcel Moolenaar 	},
12031d864e0dSMarcel Moolenaar 
12041d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3004,
12051d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Quad UART",
12061d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
120700ff5de5SMarius Strobl 	    PUC_PORT_4S, 0x10, 4, 0,
12081d864e0dSMarcel Moolenaar 	},
12091d864e0dSMarcel Moolenaar 
12101d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3011,
12111d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Single UART and 1284 Printer port",
12121d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
12131d864e0dSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
12141d864e0dSMarcel Moolenaar 	},
12151d864e0dSMarcel Moolenaar 
12161d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3012,
12171d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART and 1284 Printer port",
12181d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
12191d864e0dSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
12201d864e0dSMarcel Moolenaar 	},
12211d864e0dSMarcel Moolenaar 
12221d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3020,
12231d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual 1284 Printer port",
12241d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
12251d864e0dSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 4, 0,
122664220a7eSMarcel Moolenaar 	},
122764220a7eSMarcel Moolenaar 
122864220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
122964220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
123064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
123164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
123264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
123364220a7eSMarcel Moolenaar 	},
123464220a7eSMarcel Moolenaar 
123564220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
123664220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
123764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
123864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
123964220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
124064220a7eSMarcel Moolenaar 	},
124164220a7eSMarcel Moolenaar 
124264220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
124364220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
124464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
124564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
124664220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
124764220a7eSMarcel Moolenaar 	},
124864220a7eSMarcel Moolenaar 
124964220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
125064220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
125164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
125264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
125364220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
125464220a7eSMarcel Moolenaar 	},
125564220a7eSMarcel Moolenaar 
125664220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
125764220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
125864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
125964220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
126064220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
126164220a7eSMarcel Moolenaar 	},
126264220a7eSMarcel Moolenaar 
126364220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
126464220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
126564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
126664220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
126764220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
126864220a7eSMarcel Moolenaar 	},
126964220a7eSMarcel Moolenaar 
127064220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
127164220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
127264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
127364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
127464220a7eSMarcel Moolenaar 	},
127564220a7eSMarcel Moolenaar 
127664220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
127764220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
127864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
127964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
128064220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
128164220a7eSMarcel Moolenaar 	},
128264220a7eSMarcel Moolenaar 
128364220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
12849c564b6cSJohn Hay };
128564220a7eSMarcel Moolenaar 
128664220a7eSMarcel Moolenaar static int
12873deebd53SMarius Strobl puc_config_advantech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
12883deebd53SMarius Strobl     intptr_t *res __unused)
12893deebd53SMarius Strobl {
12903deebd53SMarius Strobl 	const struct puc_cfg *cfg;
12913deebd53SMarius Strobl 	struct resource *cres;
12923deebd53SMarius Strobl 	struct puc_bar *bar;
12933deebd53SMarius Strobl 	device_t cdev, dev;
12943deebd53SMarius Strobl 	bus_size_t off;
12953deebd53SMarius Strobl 	int base, crtype, fixed, high, i, oxpcie;
12963deebd53SMarius Strobl 	uint8_t acr, func, mask;
12973deebd53SMarius Strobl 
12983deebd53SMarius Strobl 	if (cmd != PUC_CFG_SETUP)
12993deebd53SMarius Strobl 		return (ENXIO);
13003deebd53SMarius Strobl 
13013deebd53SMarius Strobl 	base = fixed = oxpcie = 0;
13023deebd53SMarius Strobl 	crtype = SYS_RES_IOPORT;
13033deebd53SMarius Strobl 	acr = mask = 0x0;
13043deebd53SMarius Strobl 	func = high = 1;
13053deebd53SMarius Strobl 	off = 0x60;
13063deebd53SMarius Strobl 
13073deebd53SMarius Strobl 	cfg = sc->sc_cfg;
13083deebd53SMarius Strobl 	switch (cfg->subvendor) {
13093deebd53SMarius Strobl 	case 0x13fe:
13103deebd53SMarius Strobl 		switch (cfg->device) {
13113deebd53SMarius Strobl 		case 0xa102:
13123deebd53SMarius Strobl 			high = 0;
13133deebd53SMarius Strobl 			break;
13143deebd53SMarius Strobl 		default:
13153deebd53SMarius Strobl 			break;
13163deebd53SMarius Strobl 		}
13173deebd53SMarius Strobl 	default:
13183deebd53SMarius Strobl 		break;
13193deebd53SMarius Strobl 	}
13203deebd53SMarius Strobl 	if (fixed == 1)
13213deebd53SMarius Strobl 		goto setup;
13223deebd53SMarius Strobl 
13233deebd53SMarius Strobl 	dev = sc->sc_dev;
13243deebd53SMarius Strobl 	cdev = pci_find_dbsf(pci_get_domain(dev), pci_get_bus(dev),
13253deebd53SMarius Strobl 	    pci_get_slot(dev), func);
13263deebd53SMarius Strobl 	if (cdev == NULL) {
13273deebd53SMarius Strobl 		device_printf(dev, "could not find config function\n");
13283deebd53SMarius Strobl 		return (ENXIO);
13293deebd53SMarius Strobl 	}
13303deebd53SMarius Strobl 
13313deebd53SMarius Strobl 	i = PCIR_BAR(0);
13323deebd53SMarius Strobl 	cres = bus_alloc_resource_any(cdev, crtype, &i, RF_ACTIVE);
13333deebd53SMarius Strobl 	if (cres == NULL) {
13343deebd53SMarius Strobl 		device_printf(dev, "could not allocate config resource\n");
13353deebd53SMarius Strobl 		return (ENXIO);
13363deebd53SMarius Strobl 	}
13373deebd53SMarius Strobl 
13383deebd53SMarius Strobl 	if (oxpcie == 0) {
13393deebd53SMarius Strobl 		mask = bus_read_1(cres, off);
13403deebd53SMarius Strobl 		if (pci_get_function(dev) == 1)
13413deebd53SMarius Strobl 			base = 4;
13423deebd53SMarius Strobl 	}
13433deebd53SMarius Strobl 
13443deebd53SMarius Strobl  setup:
13453deebd53SMarius Strobl 	for (i = 0; i < sc->sc_nports; ++i) {
13463deebd53SMarius Strobl 		device_printf(dev, "port %d: ", i);
13473deebd53SMarius Strobl 		bar = puc_get_bar(sc, cfg->rid + i * cfg->d_rid);
13483deebd53SMarius Strobl 		if (bar == NULL) {
13493deebd53SMarius Strobl 			printf("could not get BAR\n");
13503deebd53SMarius Strobl 			continue;
13513deebd53SMarius Strobl 		}
13523deebd53SMarius Strobl 
13533deebd53SMarius Strobl 		if (fixed == 0) {
13543deebd53SMarius Strobl 			if ((mask & (1 << (base + i))) == 0) {
13553deebd53SMarius Strobl 				acr = 0;
13563deebd53SMarius Strobl 				printf("RS-232\n");
13573deebd53SMarius Strobl 			} else {
13583deebd53SMarius Strobl 				acr = (high == 1 ? 0x18 : 0x10);
13593deebd53SMarius Strobl 				printf("RS-422/RS-485, active-%s auto-DTR\n",
13603deebd53SMarius Strobl 				    high == 1 ? "high" : "low");
13613deebd53SMarius Strobl 			}
13623deebd53SMarius Strobl 		}
13633deebd53SMarius Strobl 
13643deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_SPR, REG_ACR);
13653deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_ICR, acr);
13663deebd53SMarius Strobl 	}
13673deebd53SMarius Strobl 
13683deebd53SMarius Strobl 	bus_release_resource(cdev, crtype, rman_get_rid(cres), cres);
13693deebd53SMarius Strobl 	return (0);
13703deebd53SMarius Strobl }
13713deebd53SMarius Strobl 
13723deebd53SMarius Strobl static int
1373430acc47SMarius Strobl puc_config_amc(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd, int port,
137464220a7eSMarcel Moolenaar     intptr_t *res)
137564220a7eSMarcel Moolenaar {
1376430acc47SMarius Strobl 
137764220a7eSMarcel Moolenaar 	switch (cmd) {
137864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
137964220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
138064220a7eSMarcel Moolenaar 		return (0);
138164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
138264220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
138364220a7eSMarcel Moolenaar 		return (0);
138464220a7eSMarcel Moolenaar 	default:
138564220a7eSMarcel Moolenaar 		break;
138664220a7eSMarcel Moolenaar 	}
138764220a7eSMarcel Moolenaar 	return (ENXIO);
138864220a7eSMarcel Moolenaar }
138964220a7eSMarcel Moolenaar 
139064220a7eSMarcel Moolenaar static int
139164220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
139264220a7eSMarcel Moolenaar     intptr_t *res)
139364220a7eSMarcel Moolenaar {
139464220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
139564220a7eSMarcel Moolenaar 
139664220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
139764220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
139864220a7eSMarcel Moolenaar 			port <<= 1;
139964220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
140064220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
140164220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
140264220a7eSMarcel Moolenaar 		return (0);
140364220a7eSMarcel Moolenaar 	}
140464220a7eSMarcel Moolenaar 	return (ENXIO);
140564220a7eSMarcel Moolenaar }
140664220a7eSMarcel Moolenaar 
140764220a7eSMarcel Moolenaar static int
1408430acc47SMarius Strobl puc_config_exar(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1409430acc47SMarius Strobl     int port, intptr_t *res)
141022e0612fSJohn Baldwin {
1411430acc47SMarius Strobl 
141222e0612fSJohn Baldwin 	if (cmd == PUC_CFG_GET_OFS) {
141322e0612fSJohn Baldwin 		*res = port * 0x200;
141422e0612fSJohn Baldwin 		return (0);
141522e0612fSJohn Baldwin 	}
141622e0612fSJohn Baldwin 	return (ENXIO);
141722e0612fSJohn Baldwin }
141822e0612fSJohn Baldwin 
141922e0612fSJohn Baldwin static int
1420430acc47SMarius Strobl puc_config_exar_pcie(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1421430acc47SMarius Strobl     int port, intptr_t *res)
14228de2c77bSRyan Stone {
1423430acc47SMarius Strobl 
14248de2c77bSRyan Stone 	if (cmd == PUC_CFG_GET_OFS) {
14258de2c77bSRyan Stone 		*res = port * 0x400;
14268de2c77bSRyan Stone 		return (0);
14278de2c77bSRyan Stone 	}
14288de2c77bSRyan Stone 	return (ENXIO);
14298de2c77bSRyan Stone }
14308de2c77bSRyan Stone 
14318de2c77bSRyan Stone static int
1432430acc47SMarius Strobl puc_config_icbook(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1433430acc47SMarius Strobl     int port __unused, intptr_t *res)
143464220a7eSMarcel Moolenaar {
1435430acc47SMarius Strobl 
143664220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
143764220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
143864220a7eSMarcel Moolenaar 		return (0);
143964220a7eSMarcel Moolenaar 	}
144064220a7eSMarcel Moolenaar 	return (ENXIO);
144164220a7eSMarcel Moolenaar }
144264220a7eSMarcel Moolenaar 
144364220a7eSMarcel Moolenaar static int
14442c89ac5eSEitan Adler puc_config_moxa(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
14452c89ac5eSEitan Adler     intptr_t *res)
14462c89ac5eSEitan Adler {
144751cb024fSMax Khon 	const struct puc_cfg *cfg = sc->sc_cfg;
144851cb024fSMax Khon 
1449430acc47SMarius Strobl 	if (cmd == PUC_CFG_GET_OFS) {
14501714dcabSMarius Strobl 		if (port == 3 && (cfg->device == 0x1045 ||
14511714dcabSMarius Strobl 		    cfg->device == 0x1144))
145251cb024fSMax Khon 			port = 7;
145351cb024fSMax Khon 		*res = port * 0x200;
145451cb024fSMax Khon 
14552c89ac5eSEitan Adler 		return 0;
14562c89ac5eSEitan Adler 	}
14572c89ac5eSEitan Adler 	return (ENXIO);
14582c89ac5eSEitan Adler }
14592c89ac5eSEitan Adler 
14602c89ac5eSEitan Adler static int
1461430acc47SMarius Strobl puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd,
1462430acc47SMarius Strobl     int port __unused, intptr_t *res)
146364220a7eSMarcel Moolenaar {
146464220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
146564220a7eSMarcel Moolenaar 	struct puc_bar *bar;
146664220a7eSMarcel Moolenaar 	uint8_t v0, v1;
146764220a7eSMarcel Moolenaar 
146864220a7eSMarcel Moolenaar 	switch (cmd) {
146964220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
147064220a7eSMarcel Moolenaar 		/*
147164220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
147264220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
147364220a7eSMarcel Moolenaar 		 */
147464220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
147564220a7eSMarcel Moolenaar 		if (bar == NULL)
147664220a7eSMarcel Moolenaar 			return (ENXIO);
14773deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_LCR, LCR_DLAB);
14783deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_SPR, 0);
14793deebd53SMarius Strobl 		v0 = bus_read_1(bar->b_res, REG_SPR);
14803deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_SPR, 0x80 + -cfg->clock);
14813deebd53SMarius Strobl 		v1 = bus_read_1(bar->b_res, REG_SPR);
14823deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_LCR, 0);
148364220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
148464220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
148564220a7eSMarcel Moolenaar 			/*
148664220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
148764220a7eSMarcel Moolenaar 			 * by us.  This means that the SPAD jumper is set.
148864220a7eSMarcel Moolenaar 			 */
148964220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
149064220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
149164220a7eSMarcel Moolenaar 			return (0);
149264220a7eSMarcel Moolenaar 		}
149364220a7eSMarcel Moolenaar 		if (v0 != 0) {
149464220a7eSMarcel Moolenaar 			/*
149564220a7eSMarcel Moolenaar 			 * The first value doesn't match.  This can only mean
149664220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
149764220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
149864220a7eSMarcel Moolenaar 			 */
149964220a7eSMarcel Moolenaar 			if (bootverbose)
150064220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
150164220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
150264220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
150364220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
150464220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
150564220a7eSMarcel Moolenaar 				    "setting\n");
150664220a7eSMarcel Moolenaar 			return (0);
150764220a7eSMarcel Moolenaar 		}
150864220a7eSMarcel Moolenaar 		/*
150964220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't.  We know
151064220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set.  We also know that the
151164220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
151264220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
151364220a7eSMarcel Moolenaar 		 */
151464220a7eSMarcel Moolenaar 		if (bootverbose)
151564220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
151664220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
151764220a7eSMarcel Moolenaar 		return (0);
151864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
151964220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
152064220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
152164220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
152264220a7eSMarcel Moolenaar 			/*
152364220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
152464220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
152564220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed.  Let's hope
152664220a7eSMarcel Moolenaar 			 * not ...
152764220a7eSMarcel Moolenaar 			 */
152864220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
152964220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
153064220a7eSMarcel Moolenaar 			/*
153164220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
153264220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
153364220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
153464220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
153564220a7eSMarcel Moolenaar 			 */
153664220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
153764220a7eSMarcel Moolenaar 		} else
153864220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
153964220a7eSMarcel Moolenaar 		return (0);
154064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
154164220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
154264220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
1543430acc47SMarius Strobl 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock) ?
1544430acc47SMarius Strobl 		    PUC_ILR_NONE : PUC_ILR_QUATECH;
154564220a7eSMarcel Moolenaar 		return (0);
154664220a7eSMarcel Moolenaar 	default:
154764220a7eSMarcel Moolenaar 		break;
154864220a7eSMarcel Moolenaar 	}
154964220a7eSMarcel Moolenaar 	return (ENXIO);
155064220a7eSMarcel Moolenaar }
155164220a7eSMarcel Moolenaar 
155264220a7eSMarcel Moolenaar static int
155364220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
155464220a7eSMarcel Moolenaar     intptr_t *res)
155564220a7eSMarcel Moolenaar {
155664220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
155764220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
155864220a7eSMarcel Moolenaar 	struct puc_bar *bar;
155964220a7eSMarcel Moolenaar 	int efir, idx, ofs;
156064220a7eSMarcel Moolenaar 	uint8_t v;
156164220a7eSMarcel Moolenaar 
156264220a7eSMarcel Moolenaar 	switch (cmd) {
156364220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
156464220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
156564220a7eSMarcel Moolenaar 		if (bar == NULL)
156664220a7eSMarcel Moolenaar 			return (ENXIO);
156764220a7eSMarcel Moolenaar 
156864220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
156964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
157064220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
157164220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
157264220a7eSMarcel Moolenaar 		idx = 0;
157364220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
157464220a7eSMarcel Moolenaar 			efir = base[idx];
157564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
157664220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
157764220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
157864220a7eSMarcel Moolenaar 				return (ENXIO);
157964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
158064220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
158164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
158264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
158364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
158464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
158564220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
158664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
158764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
158864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
158964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
159064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
159164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
159264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
159364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
159464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
159564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
159664220a7eSMarcel Moolenaar 			idx++;
159764220a7eSMarcel Moolenaar 		}
159864220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
159964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
160064220a7eSMarcel Moolenaar 		return (0);
160164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
160264220a7eSMarcel Moolenaar 		switch (port) {
160364220a7eSMarcel Moolenaar 		case 0:
160464220a7eSMarcel Moolenaar 			*res = 0x2f8;
160564220a7eSMarcel Moolenaar 			return (0);
160664220a7eSMarcel Moolenaar 		case 1:
160764220a7eSMarcel Moolenaar 			*res = 0x2e8;
160864220a7eSMarcel Moolenaar 			return (0);
160964220a7eSMarcel Moolenaar 		case 2:
161064220a7eSMarcel Moolenaar 			*res = 0x3f8;
161164220a7eSMarcel Moolenaar 			return (0);
161264220a7eSMarcel Moolenaar 		case 3:
161364220a7eSMarcel Moolenaar 			*res = 0x3e8;
161464220a7eSMarcel Moolenaar 			return (0);
161564220a7eSMarcel Moolenaar 		case 4:
161664220a7eSMarcel Moolenaar 			*res = 0x278;
161764220a7eSMarcel Moolenaar 			return (0);
161864220a7eSMarcel Moolenaar 		}
161964220a7eSMarcel Moolenaar 		break;
162064220a7eSMarcel Moolenaar 	default:
162164220a7eSMarcel Moolenaar 		break;
162264220a7eSMarcel Moolenaar 	}
162364220a7eSMarcel Moolenaar 	return (ENXIO);
162464220a7eSMarcel Moolenaar }
162564220a7eSMarcel Moolenaar 
162664220a7eSMarcel Moolenaar static int
162764220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
162864220a7eSMarcel Moolenaar     intptr_t *res)
162964220a7eSMarcel Moolenaar {
163064220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
163164220a7eSMarcel Moolenaar 
163264220a7eSMarcel Moolenaar 	switch (cmd) {
163364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
163464220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
163564220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
163664220a7eSMarcel Moolenaar 			return (0);
163764220a7eSMarcel Moolenaar 		}
163864220a7eSMarcel Moolenaar 		break;
163964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
164064220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
164164220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
164264220a7eSMarcel Moolenaar 			return (0);
164364220a7eSMarcel Moolenaar 		}
164464220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
164564220a7eSMarcel Moolenaar 			switch (port) {
164664220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
164764220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
164864220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
164964220a7eSMarcel Moolenaar 			}
165064220a7eSMarcel Moolenaar 		}
165164220a7eSMarcel Moolenaar 		break;
165264220a7eSMarcel Moolenaar 	default:
165364220a7eSMarcel Moolenaar 		break;
165464220a7eSMarcel Moolenaar 	}
165564220a7eSMarcel Moolenaar 	return (ENXIO);
165664220a7eSMarcel Moolenaar }
165764220a7eSMarcel Moolenaar 
165864220a7eSMarcel Moolenaar static int
165964220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
166064220a7eSMarcel Moolenaar     intptr_t *res)
166164220a7eSMarcel Moolenaar {
166200ff5de5SMarius Strobl 	static const uint16_t dual[] = {
166364220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
166464220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
166564220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
166664220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
166764220a7eSMarcel Moolenaar 	    0xD079, 0
166864220a7eSMarcel Moolenaar 	};
166900ff5de5SMarius Strobl 	static const uint16_t quad[] = {
167064220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
167164220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
167264220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
167364220a7eSMarcel Moolenaar 	    0xB157, 0
167464220a7eSMarcel Moolenaar 	};
167500ff5de5SMarius Strobl 	static const uint16_t octa[] = {
167664220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
167764220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
167864220a7eSMarcel Moolenaar 	};
167900ff5de5SMarius Strobl 	static const struct {
168064220a7eSMarcel Moolenaar 		int ports;
168100ff5de5SMarius Strobl 		const uint16_t *ids;
168264220a7eSMarcel Moolenaar 	} subdevs[] = {
168364220a7eSMarcel Moolenaar 	    { 2, dual },
168464220a7eSMarcel Moolenaar 	    { 4, quad },
168564220a7eSMarcel Moolenaar 	    { 8, octa },
168664220a7eSMarcel Moolenaar 	    { 0, NULL }
168764220a7eSMarcel Moolenaar 	};
168864220a7eSMarcel Moolenaar 	static char desc[64];
168964220a7eSMarcel Moolenaar 	int dev, id;
169064220a7eSMarcel Moolenaar 	uint16_t subdev;
169164220a7eSMarcel Moolenaar 
169264220a7eSMarcel Moolenaar 	switch (cmd) {
16939c418f51SJohn Baldwin 	case PUC_CFG_GET_CLOCK:
16949c418f51SJohn Baldwin 		if (port < 2)
16959c418f51SJohn Baldwin 			*res = DEFAULT_RCLK * 8;
16969c418f51SJohn Baldwin 		else
16979c418f51SJohn Baldwin 			*res = DEFAULT_RCLK;
16989c418f51SJohn Baldwin 		return (0);
169964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
170064220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
170164220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
170264220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
170364220a7eSMarcel Moolenaar 		return (0);
170464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
170564220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
170664220a7eSMarcel Moolenaar 		dev = 0;
170764220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
170864220a7eSMarcel Moolenaar 			id = 0;
170964220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
171064220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
171164220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
171264220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
171364220a7eSMarcel Moolenaar 					return (0);
171464220a7eSMarcel Moolenaar 				}
171564220a7eSMarcel Moolenaar 				id++;
171664220a7eSMarcel Moolenaar 			}
171764220a7eSMarcel Moolenaar 			dev++;
171864220a7eSMarcel Moolenaar 		}
171964220a7eSMarcel Moolenaar 		return (ENXIO);
172064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
172164220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
172264220a7eSMarcel Moolenaar 		return (0);
172364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
1724c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
172564220a7eSMarcel Moolenaar 		return (0);
172664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
172764220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
172864220a7eSMarcel Moolenaar 		return (0);
172964220a7eSMarcel Moolenaar 	default:
173064220a7eSMarcel Moolenaar 		break;
173164220a7eSMarcel Moolenaar 	}
173264220a7eSMarcel Moolenaar 	return (ENXIO);
173364220a7eSMarcel Moolenaar }
173464220a7eSMarcel Moolenaar 
173564220a7eSMarcel Moolenaar static int
1736d5e0798eSMarius Strobl puc_config_oxford_pci954(struct puc_softc *sc, enum puc_cfg_cmd cmd,
1737d5e0798eSMarius Strobl     int port __unused, intptr_t *res)
1738d5e0798eSMarius Strobl {
1739d5e0798eSMarius Strobl 
1740d5e0798eSMarius Strobl 	switch (cmd) {
1741d5e0798eSMarius Strobl 	case PUC_CFG_GET_CLOCK:
1742d5e0798eSMarius Strobl 		/*
1743d5e0798eSMarius Strobl 		 * OXu16PCI954 use a 14.7456 MHz clock by default while
1744d5e0798eSMarius Strobl 		 * OX16PCI954 and OXm16PCI954 employ a 1.8432 MHz one.
1745d5e0798eSMarius Strobl 		 */
1746d5e0798eSMarius Strobl 		if (pci_get_revid(sc->sc_dev) == 1)
1747d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK * 8;
1748d5e0798eSMarius Strobl 		else
1749d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK;
1750d5e0798eSMarius Strobl 		return (0);
1751d5e0798eSMarius Strobl 	default:
1752d5e0798eSMarius Strobl 		break;
1753d5e0798eSMarius Strobl 	}
1754d5e0798eSMarius Strobl 	return (ENXIO);
1755d5e0798eSMarius Strobl }
1756d5e0798eSMarius Strobl 
1757d5e0798eSMarius Strobl static int
17586e9f075aSJohn Baldwin puc_config_oxford_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
17596e9f075aSJohn Baldwin     intptr_t *res)
17606e9f075aSJohn Baldwin {
17616e9f075aSJohn Baldwin 	const struct puc_cfg *cfg = sc->sc_cfg;
17626e9f075aSJohn Baldwin 	int idx;
17636e9f075aSJohn Baldwin 	struct puc_bar *bar;
17646e9f075aSJohn Baldwin 	uint8_t value;
17656e9f075aSJohn Baldwin 
17666e9f075aSJohn Baldwin 	switch (cmd) {
17676e9f075aSJohn Baldwin 	case PUC_CFG_SETUP:
17686e9f075aSJohn Baldwin 		device_printf(sc->sc_dev, "%d UARTs detected\n",
17696e9f075aSJohn Baldwin 			sc->sc_nports);
17706e9f075aSJohn Baldwin 
17716e9f075aSJohn Baldwin 		/* Set UARTs to enhanced mode */
17726e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
17736e9f075aSJohn Baldwin 		if (bar == NULL)
17746e9f075aSJohn Baldwin 			return (ENXIO);
17756e9f075aSJohn Baldwin 		for (idx = 0; idx < sc->sc_nports; idx++) {
1776a59f78daSJohn Baldwin 			value = bus_read_1(bar->b_res, 0x1000 + (idx << 9) +
1777a59f78daSJohn Baldwin 			    0x92);
17786e9f075aSJohn Baldwin 			bus_write_1(bar->b_res, 0x1000 + (idx << 9) + 0x92,
17796e9f075aSJohn Baldwin 			    value | 0x10);
17806e9f075aSJohn Baldwin 		}
17816e9f075aSJohn Baldwin 		return (0);
17826e9f075aSJohn Baldwin 	case PUC_CFG_GET_LEN:
17836e9f075aSJohn Baldwin 		*res = 0x200;
17846e9f075aSJohn Baldwin 		return (0);
17856e9f075aSJohn Baldwin 	case PUC_CFG_GET_NPORTS:
17866e9f075aSJohn Baldwin 		/*
17876e9f075aSJohn Baldwin 		 * Check if we are being called from puc_bfe_attach()
17886e9f075aSJohn Baldwin 		 * or puc_bfe_probe().  If puc_bfe_probe(), we cannot
17893deebd53SMarius Strobl 		 * puc_get_bar(), so we return a value of 16.  This has
17903deebd53SMarius Strobl 		 * cosmetic side-effects at worst; in PUC_CFG_GET_DESC,
17913deebd53SMarius Strobl 		 * sc->sc_cfg_data will not contain the true number of
17923deebd53SMarius Strobl 		 * ports in PUC_CFG_GET_DESC, but we are not implementing
17933deebd53SMarius Strobl 		 * that call for this device family anyway.
17946e9f075aSJohn Baldwin 		 *
17953deebd53SMarius Strobl 		 * The check is for initialization of sc->sc_bar[idx],
17963deebd53SMarius Strobl 		 * which is only done in puc_bfe_attach().
17976e9f075aSJohn Baldwin 		 */
17986e9f075aSJohn Baldwin 		idx = 0;
17996e9f075aSJohn Baldwin 		do {
18006e9f075aSJohn Baldwin 			if (sc->sc_bar[idx++].b_rid != -1) {
18016e9f075aSJohn Baldwin 				sc->sc_cfg_data = 16;
18026e9f075aSJohn Baldwin 				*res = sc->sc_cfg_data;
18036e9f075aSJohn Baldwin 				return (0);
18046e9f075aSJohn Baldwin 			}
18056e9f075aSJohn Baldwin 		} while (idx < PUC_PCI_BARS);
18066e9f075aSJohn Baldwin 
18076e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
18086e9f075aSJohn Baldwin 		if (bar == NULL)
18096e9f075aSJohn Baldwin 			return (ENXIO);
18106e9f075aSJohn Baldwin 
18116e9f075aSJohn Baldwin 		value = bus_read_1(bar->b_res, 0x04);
18126e9f075aSJohn Baldwin 		if (value == 0)
18136e9f075aSJohn Baldwin 			return (ENXIO);
18146e9f075aSJohn Baldwin 
18156e9f075aSJohn Baldwin 		sc->sc_cfg_data = value;
18166e9f075aSJohn Baldwin 		*res = sc->sc_cfg_data;
18176e9f075aSJohn Baldwin 		return (0);
18186e9f075aSJohn Baldwin 	case PUC_CFG_GET_OFS:
18196e9f075aSJohn Baldwin 		*res = 0x1000 + (port << 9);
18206e9f075aSJohn Baldwin 		return (0);
18216e9f075aSJohn Baldwin 	case PUC_CFG_GET_TYPE:
18226e9f075aSJohn Baldwin 		*res = PUC_TYPE_SERIAL;
18236e9f075aSJohn Baldwin 		return (0);
18246e9f075aSJohn Baldwin 	default:
18256e9f075aSJohn Baldwin 		break;
18266e9f075aSJohn Baldwin 	}
18276e9f075aSJohn Baldwin 	return (ENXIO);
18286e9f075aSJohn Baldwin }
18296e9f075aSJohn Baldwin 
18306e9f075aSJohn Baldwin static int
183150c0e894SMarius Strobl puc_config_sunix(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
183250c0e894SMarius Strobl     intptr_t *res)
183350c0e894SMarius Strobl {
183450c0e894SMarius Strobl 	int error;
183550c0e894SMarius Strobl 
183650c0e894SMarius Strobl 	switch (cmd) {
183750c0e894SMarius Strobl 	case PUC_CFG_GET_OFS:
183850c0e894SMarius Strobl 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
183950c0e894SMarius Strobl 		if (error != 0)
184050c0e894SMarius Strobl 			return (error);
184150c0e894SMarius Strobl 		*res = (*res == PUC_TYPE_SERIAL) ? (port & 3) * 8 : 0;
184250c0e894SMarius Strobl 		return (0);
184350c0e894SMarius Strobl 	case PUC_CFG_GET_RID:
184450c0e894SMarius Strobl 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
184550c0e894SMarius Strobl 		if (error != 0)
184650c0e894SMarius Strobl 			return (error);
184750c0e894SMarius Strobl 		*res = (*res == PUC_TYPE_SERIAL && port <= 3) ? 0x10 : 0x14;
184850c0e894SMarius Strobl 		return (0);
184950c0e894SMarius Strobl 	default:
185050c0e894SMarius Strobl 		break;
185150c0e894SMarius Strobl 	}
185250c0e894SMarius Strobl 	return (ENXIO);
185350c0e894SMarius Strobl }
185450c0e894SMarius Strobl 
185550c0e894SMarius Strobl static int
1856430acc47SMarius Strobl puc_config_titan(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1857430acc47SMarius Strobl     int port, intptr_t *res)
185864220a7eSMarcel Moolenaar {
1859430acc47SMarius Strobl 
186064220a7eSMarcel Moolenaar 	switch (cmd) {
186164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
186264220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
186364220a7eSMarcel Moolenaar 		return (0);
186464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
186564220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
186664220a7eSMarcel Moolenaar 		return (0);
186764220a7eSMarcel Moolenaar 	default:
186864220a7eSMarcel Moolenaar 		break;
186964220a7eSMarcel Moolenaar 	}
187064220a7eSMarcel Moolenaar 	return (ENXIO);
187164220a7eSMarcel Moolenaar }
1872