xref: /freebsd/sys/dev/puc/pucdata.c (revision 430acc472f22d5c1bdc100d8bf521d49845eeea5)
1098ca2bdSWarner Losh /*-
264220a7eSMarcel Moolenaar  * Copyright (c) 2006 Marcel Moolenaar
364220a7eSMarcel Moolenaar  * All rights reserved.
49c564b6cSJohn Hay  *
59c564b6cSJohn Hay  * Redistribution and use in source and binary forms, with or without
69c564b6cSJohn Hay  * modification, are permitted provided that the following conditions
79c564b6cSJohn Hay  * are met:
864220a7eSMarcel Moolenaar  *
99c564b6cSJohn Hay  * 1. Redistributions of source code must retain the above copyright
109c564b6cSJohn Hay  *    notice, this list of conditions and the following disclaimer.
119c564b6cSJohn Hay  * 2. Redistributions in binary form must reproduce the above copyright
129c564b6cSJohn Hay  *    notice, this list of conditions and the following disclaimer in the
139c564b6cSJohn Hay  *    documentation and/or other materials provided with the distribution.
149c564b6cSJohn Hay  *
159c564b6cSJohn Hay  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
169c564b6cSJohn Hay  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
179c564b6cSJohn Hay  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
189c564b6cSJohn Hay  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
199c564b6cSJohn Hay  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
209c564b6cSJohn Hay  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
219c564b6cSJohn Hay  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
229c564b6cSJohn Hay  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
239c564b6cSJohn Hay  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
249c564b6cSJohn Hay  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
259c564b6cSJohn Hay  */
269c564b6cSJohn Hay 
279c564b6cSJohn Hay #include <sys/cdefs.h>
289c564b6cSJohn Hay __FBSDID("$FreeBSD$");
299c564b6cSJohn Hay 
309c564b6cSJohn Hay /*
319c564b6cSJohn Hay  * PCI "universal" communications card driver configuration data (used to
329c564b6cSJohn Hay  * match/attach the cards).
339c564b6cSJohn Hay  */
349c564b6cSJohn Hay 
359c564b6cSJohn Hay #include <sys/param.h>
3664220a7eSMarcel Moolenaar #include <sys/systm.h>
3764220a7eSMarcel Moolenaar #include <sys/kernel.h>
3864220a7eSMarcel Moolenaar #include <sys/bus.h>
399725900bSRyan Stone #include <sys/sysctl.h>
409c564b6cSJohn Hay 
4164220a7eSMarcel Moolenaar #include <machine/resource.h>
42ed0b0e82SWarner Losh #include <machine/bus.h>
4364220a7eSMarcel Moolenaar #include <sys/rman.h>
4464220a7eSMarcel Moolenaar 
459c564b6cSJohn Hay #include <dev/pci/pcivar.h>
469c564b6cSJohn Hay 
4764220a7eSMarcel Moolenaar #include <dev/puc/puc_bus.h>
4864220a7eSMarcel Moolenaar #include <dev/puc/puc_cfg.h>
49482aa6a3SDavid E. O'Brien #include <dev/puc/puc_bfe.h>
509c564b6cSJohn Hay 
5164220a7eSMarcel Moolenaar static puc_config_f puc_config_amc;
5264220a7eSMarcel Moolenaar static puc_config_f puc_config_diva;
5322e0612fSJohn Baldwin static puc_config_f puc_config_exar;
548de2c77bSRyan Stone static puc_config_f puc_config_exar_pcie;
5564220a7eSMarcel Moolenaar static puc_config_f puc_config_icbook;
562c89ac5eSEitan Adler static puc_config_f puc_config_moxa;
57d5e0798eSMarius Strobl static puc_config_f puc_config_oxford_pci954;
58a59f78daSJohn Baldwin static puc_config_f puc_config_oxford_pcie;
5964220a7eSMarcel Moolenaar static puc_config_f puc_config_quatech;
6064220a7eSMarcel Moolenaar static puc_config_f puc_config_syba;
6164220a7eSMarcel Moolenaar static puc_config_f puc_config_siig;
6250c0e894SMarius Strobl static puc_config_f puc_config_sunix;
6364220a7eSMarcel Moolenaar static puc_config_f puc_config_timedia;
6464220a7eSMarcel Moolenaar static puc_config_f puc_config_titan;
65dc7d0deaSMarcel Moolenaar 
6664220a7eSMarcel Moolenaar const struct puc_cfg puc_pci_devices[] = {
6764220a7eSMarcel Moolenaar 	{   0x0009, 0x7168, 0xffff, 0,
6864220a7eSMarcel Moolenaar 	    "Sunix SUN1889",
6964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
7064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
710efcc68bSBruce Evans 	},
720efcc68bSBruce Evans 
7364220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1049,
7464220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
7564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
7664220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
7764220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
78dc7d0deaSMarcel Moolenaar 	},
79dc7d0deaSMarcel Moolenaar 
8064220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104a,
8164220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
8264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, -1,
8464220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
85a27ffb41SDavid E. O'Brien 	},
86a27ffb41SDavid E. O'Brien 
8764220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104b,
8864220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
8964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, -1,
9164220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
92a27ffb41SDavid E. O'Brien 	},
93a27ffb41SDavid E. O'Brien 
9464220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1223,
9564220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
9664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9764220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
9864220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
99a27ffb41SDavid E. O'Brien 	},
100a27ffb41SDavid E. O'Brien 
10164220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1226,
10264220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
10364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10464220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10564220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
106a27ffb41SDavid E. O'Brien 	},
107a27ffb41SDavid E. O'Brien 
10864220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1282,
10964220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
11064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
11164220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
11264220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
113a27ffb41SDavid E. O'Brien 	},
114a27ffb41SDavid E. O'Brien 
11564220a7eSMarcel Moolenaar 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
11664220a7eSMarcel Moolenaar 	    "VScom PCI-800",
11764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
11864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1192569e387SDavid E. O'Brien 	},
12064220a7eSMarcel Moolenaar 
12164220a7eSMarcel Moolenaar 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
12264220a7eSMarcel Moolenaar 	    "VScom PCI-400",
12364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
1252569e387SDavid E. O'Brien 	},
12664220a7eSMarcel Moolenaar 
12764220a7eSMarcel Moolenaar 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
12864220a7eSMarcel Moolenaar 	    "VScom PCI-200",
12964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
13064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1312569e387SDavid E. O'Brien 	},
132a27ffb41SDavid E. O'Brien 
1339c564b6cSJohn Hay 	/*
13464220a7eSMarcel Moolenaar 	 * Boca Research Turbo Serial 658 (8 serial port) card.
13564220a7eSMarcel Moolenaar 	 * Appears to be the same as Chase Research PLC PCI-FAST8
13664220a7eSMarcel Moolenaar 	 * and Perle PCI-FAST8 Multi-Port serial cards.
1379c564b6cSJohn Hay 	 */
13864220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
13964220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 658",
14064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1429c564b6cSJohn Hay 	},
1439c564b6cSJohn Hay 
14464220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
14564220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 654",
14664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
14864220a7eSMarcel Moolenaar 	},
1499c564b6cSJohn Hay 
1509c564b6cSJohn Hay 	/*
1519c564b6cSJohn Hay 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
1529c564b6cSJohn Hay 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
1539c564b6cSJohn Hay 	 * into the subsystem fields, and claims that it's a
1549c564b6cSJohn Hay 	 * network/misc (0x02/0x80) device.
1559c564b6cSJohn Hay 	 */
15664220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
15764220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4035",
15864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
15964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1609c564b6cSJohn Hay 	},
1619c564b6cSJohn Hay 
1629c564b6cSJohn Hay 	/*
16364220a7eSMarcel Moolenaar 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
16464220a7eSMarcel Moolenaar 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
16564220a7eSMarcel Moolenaar 	 * into the subsystem fields, and claims that it's a
16664220a7eSMarcel Moolenaar 	 * network/misc (0x02/0x80) device.
1679c564b6cSJohn Hay 	 */
16864220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
16964220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4014",
17064220a7eSMarcel Moolenaar 	    0,
17164220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x20, 4, 0,
1729c564b6cSJohn Hay 	},
1739c564b6cSJohn Hay 
17464220a7eSMarcel Moolenaar 	{   0x10e8, 0x818e, 0xffff, 0,
17564220a7eSMarcel Moolenaar 	    "Applied Micro Circuits 8 Port UART",
17664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
17764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
17864220a7eSMarcel Moolenaar 	    .config_function = puc_config_amc
17964220a7eSMarcel Moolenaar 	},
1809c564b6cSJohn Hay 
181*430acc47SMarius Strobl 	/*
182*430acc47SMarius Strobl 	 * The following members of the Digi International Neo series are
183*430acc47SMarius Strobl 	 * based on Exar PCI chips, f. e. the 8 port variants on XR17V258IV.
184*430acc47SMarius Strobl 	 * Accordingly, the PCIe versions of these cards incorporate a PLX
185*430acc47SMarius Strobl 	 * PCIe-PCI-bridge.
186*430acc47SMarius Strobl 	 */
187*430acc47SMarius Strobl 
188*430acc47SMarius Strobl 	{   0x114f, 0x00b0, 0xffff, 0,
189*430acc47SMarius Strobl 	    "Digi Neo PCI 4 Port",
190*430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
191*430acc47SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, -1,
192*430acc47SMarius Strobl 	    .config_function = puc_config_exar
193*430acc47SMarius Strobl 	},
194*430acc47SMarius Strobl 
195*430acc47SMarius Strobl 	{   0x114f, 0x00b1, 0xffff, 0,
196*430acc47SMarius Strobl 	    "Digi Neo PCI 8 Port",
197*430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
198*430acc47SMarius Strobl 	    PUC_PORT_8S, 0x10, 0, -1,
199*430acc47SMarius Strobl 	    .config_function = puc_config_exar
200*430acc47SMarius Strobl 	},
201*430acc47SMarius Strobl 
202*430acc47SMarius Strobl 	{   0x114f, 0x00f0, 0xffff, 0,
203*430acc47SMarius Strobl 	    "Digi Neo PCIe 8 Port",
204*430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
205*430acc47SMarius Strobl 	    PUC_PORT_8S, 0x10, 0, -1,
206*430acc47SMarius Strobl 	    .config_function = puc_config_exar
207*430acc47SMarius Strobl 	},
208*430acc47SMarius Strobl 
209*430acc47SMarius Strobl 	{   0x114f, 0x00f1, 0xffff, 0,
210*430acc47SMarius Strobl 	    "Digi Neo PCIe 4 Port",
211*430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
212*430acc47SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, -1,
213*430acc47SMarius Strobl 	    .config_function = puc_config_exar
214*430acc47SMarius Strobl 	},
215*430acc47SMarius Strobl 
216*430acc47SMarius Strobl 	{   0x114f, 0x00f2, 0xffff, 0,
217*430acc47SMarius Strobl 	    "Digi Neo PCIe 4 Port RJ45",
218*430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
219*430acc47SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, -1,
220*430acc47SMarius Strobl 	    .config_function = puc_config_exar
221*430acc47SMarius Strobl 	},
222*430acc47SMarius Strobl 
223*430acc47SMarius Strobl 	{   0x114f, 0x00f3, 0xffff, 0,
224*430acc47SMarius Strobl 	    "Digi Neo PCIe 8 Port RJ45",
225*430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
226*430acc47SMarius Strobl 	    PUC_PORT_8S, 0x10, 0, -1,
227*430acc47SMarius Strobl 	    .config_function = puc_config_exar
228*430acc47SMarius Strobl 	},
229*430acc47SMarius Strobl 
23064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8010, 0xffff, 0,
23164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part A",
23264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23464220a7eSMarcel Moolenaar 	},
23564220a7eSMarcel Moolenaar 
23664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8011, 0xffff, 0,
23764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part B",
23864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
24064220a7eSMarcel Moolenaar 	},
24164220a7eSMarcel Moolenaar 
24264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8012, 0xffff, 0,
24364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part A",
24464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
24564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
24664220a7eSMarcel Moolenaar 	},
24764220a7eSMarcel Moolenaar 
24864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8013, 0xffff, 0,
24964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part B",
25064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
25164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
25264220a7eSMarcel Moolenaar 	},
25364220a7eSMarcel Moolenaar 
25464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8014, 0xffff, 0,
25564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/4 RJ45",
25664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
25764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
25864220a7eSMarcel Moolenaar 	},
25964220a7eSMarcel Moolenaar 
26064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8015, 0xffff, 0,
26164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/Quad",
26264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
26364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
26464220a7eSMarcel Moolenaar 	},
26564220a7eSMarcel Moolenaar 
26664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8016, 0xffff, 0,
26764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part A",
26864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
26964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
27064220a7eSMarcel Moolenaar 	},
27164220a7eSMarcel Moolenaar 
27264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8017, 0xffff, 0,
27364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part B",
27464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
27564220a7eSMarcel Moolenaar 	    PUC_PORT_12S, 0x10, 0, 8,
27664220a7eSMarcel Moolenaar 	},
27764220a7eSMarcel Moolenaar 
27864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8018, 0xffff, 0,
27964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part A",
28064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
28164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
28264220a7eSMarcel Moolenaar 	},
28364220a7eSMarcel Moolenaar 
28464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8019, 0xffff, 0,
28564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part B",
28664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
28764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
28864220a7eSMarcel Moolenaar 	},
2899c564b6cSJohn Hay 
2909c564b6cSJohn Hay 	/*
29163fbf504SRobert Watson 	 * IBM SurePOS 300 Series (481033H) serial ports
29263fbf504SRobert Watson 	 * Details can be found on the IBM RSS websites
29363fbf504SRobert Watson 	 */
29463fbf504SRobert Watson 
29563fbf504SRobert Watson 	{   0x1014, 0x0297, 0xffff, 0,
29663fbf504SRobert Watson 	    "IBM SurePOS 300 Series (481033H) serial ports",
29763fbf504SRobert Watson 	    DEFAULT_RCLK,
29863fbf504SRobert Watson 	    PUC_PORT_4S, 0x10, 4, 0
29963fbf504SRobert Watson 	},
30063fbf504SRobert Watson 
30163fbf504SRobert Watson 	/*
3029c564b6cSJohn Hay 	 * SIIG Boards.
3039c564b6cSJohn Hay 	 *
3049c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
30564220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
3069c564b6cSJohn Hay 	 */
3079c564b6cSJohn Hay 
30864220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
30964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
31064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
3129c564b6cSJohn Hay 	},
3139c564b6cSJohn Hay 
31464220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
31564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
31664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
3189c564b6cSJohn Hay 	},
3199c564b6cSJohn Hay 
32064220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
32164220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
32264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32364220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
3249c564b6cSJohn Hay 	},
3259c564b6cSJohn Hay 
32664220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
32764220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
32864220a7eSMarcel Moolenaar 	    0,
32964220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
3309c564b6cSJohn Hay 	},
3319c564b6cSJohn Hay 
33264220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
33364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
33464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3369c564b6cSJohn Hay 	},
3379c564b6cSJohn Hay 
33864220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
33964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
34064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3429c564b6cSJohn Hay 	},
3439c564b6cSJohn Hay 
34464220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
34564220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
34664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3489c564b6cSJohn Hay 	},
3499c564b6cSJohn Hay 
35064220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
35164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
35264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35364220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3549c564b6cSJohn Hay 	},
3559c564b6cSJohn Hay 
35664220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
35764220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
35864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35964220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3609c564b6cSJohn Hay 	},
3619c564b6cSJohn Hay 
36264220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
36364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
36464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36564220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3669c564b6cSJohn Hay 	},
3679c564b6cSJohn Hay 
36864220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
36964220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
37064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3729c564b6cSJohn Hay 	},
3739c564b6cSJohn Hay 
37464220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
37564220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
37664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3789c564b6cSJohn Hay 	},
3799c564b6cSJohn Hay 
38064220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
38164220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
38264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3849c564b6cSJohn Hay 	},
3859c564b6cSJohn Hay 
38664220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
38764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
38864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3909c564b6cSJohn Hay 	},
3919c564b6cSJohn Hay 
39264220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
39364220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
39464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39564220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3969c564b6cSJohn Hay 	},
3979c564b6cSJohn Hay 
39864220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
39964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
40064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
4029c564b6cSJohn Hay 	},
4039c564b6cSJohn Hay 
40464220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
40564220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
40664220a7eSMarcel Moolenaar 	    0,
40764220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
4089c564b6cSJohn Hay 	},
4099c564b6cSJohn Hay 
41064220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
41164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
41264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
4149c564b6cSJohn Hay 	},
4159c564b6cSJohn Hay 
41664220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
41764220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
41864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
4209c564b6cSJohn Hay 	},
4219c564b6cSJohn Hay 
42264220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
42364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
42464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
4269c564b6cSJohn Hay 	},
4279c564b6cSJohn Hay 
42864220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
42964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
43064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43164220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
43264220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4339c564b6cSJohn Hay 	},
4349c564b6cSJohn Hay 
43564220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
43664220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
43764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43864220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
43964220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4409c564b6cSJohn Hay 	},
4419c564b6cSJohn Hay 
44264220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
44364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
44464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
44564220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
44664220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4479c564b6cSJohn Hay 	},
4489c564b6cSJohn Hay 
44964220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
45064220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
45164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
45264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4539c564b6cSJohn Hay 	},
4549c564b6cSJohn Hay 
45564220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
45664220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
45764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
45864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4599c564b6cSJohn Hay 	},
4609c564b6cSJohn Hay 
46164220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
46264220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
46364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
46464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4659c564b6cSJohn Hay 	},
4669c564b6cSJohn Hay 
46764220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
46864220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
46964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
47064220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4719c564b6cSJohn Hay 	},
4729c564b6cSJohn Hay 
47364220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
47464220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
47564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
47664220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4779c564b6cSJohn Hay 	},
4789c564b6cSJohn Hay 
47964220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
48064220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
48164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
48264220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4839c564b6cSJohn Hay 	},
4849c564b6cSJohn Hay 
48564220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
48664220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
48764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
48864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
48964220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4909c564b6cSJohn Hay 	},
4919c564b6cSJohn Hay 
49264220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
49364220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
49464220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
49564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
49664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4979c564b6cSJohn Hay 	},
4989c564b6cSJohn Hay 
49964220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
50064220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
50164220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
50264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
50364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5049c564b6cSJohn Hay 	},
5059c564b6cSJohn Hay 
50664220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
50764220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
50864220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
50964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
51064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5119c564b6cSJohn Hay 	},
5129c564b6cSJohn Hay 
51364220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
51464220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
51564220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
51664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
51764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5189c564b6cSJohn Hay 	},
5199c564b6cSJohn Hay 
52064220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
52164220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
52264220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
52364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
52464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5259c564b6cSJohn Hay 	},
5269c564b6cSJohn Hay 
52764220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
52864220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
52964220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
53064220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
53164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5329c564b6cSJohn Hay 	},
5339c564b6cSJohn Hay 
53464220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
53564220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
53664220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
53764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
53864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5399c564b6cSJohn Hay 	},
5409c564b6cSJohn Hay 
54164220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
54264220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
54364220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
54464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
54564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
54676353f68SJohn Hay 	},
54776353f68SJohn Hay 
54864220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
54964220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
55064220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
55164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
55264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5539c564b6cSJohn Hay 	},
5549c564b6cSJohn Hay 
55564220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
55664220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
55764220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
55864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
55964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5609c564b6cSJohn Hay 	},
5619c564b6cSJohn Hay 
562f83255a5SMax Khon 	{   0x1393, 0x1024, 0xffff, 0,
563f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102E/PCIe",
564f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
56551cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
56651cb024fSMax Khon 	    .config_function = puc_config_moxa
567f83255a5SMax Khon 	},
568f83255a5SMax Khon 
569f83255a5SMax Khon 	{   0x1393, 0x1025, 0xffff, 0,
570f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102EL/PCIe",
571f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
57251cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
57351cb024fSMax Khon 	    .config_function = puc_config_moxa
574f83255a5SMax Khon 	},
575f83255a5SMax Khon 
57664220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
57764220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
57864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
57964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5800ec6e983SJoerg Wunsch 	},
58140f01890SBruce Evans 
58264220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
58364220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
58464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
58564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5869c564b6cSJohn Hay 	},
5879c564b6cSJohn Hay 
5882c89ac5eSEitan Adler 	{   0x1393, 0x1042, 0xffff, 0,
5892c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104JU/PCI",
5902c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5912c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x18, 0, 8,
5922c89ac5eSEitan Adler 	},
5932c89ac5eSEitan Adler 
594f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
595f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
596f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
597f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
598f6a60febSMaxim Konovalov 	},
599f6a60febSMaxim Konovalov 
6002c89ac5eSEitan Adler 	{   0x1393, 0x1045, 0xffff, 0,
6012c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104EL-A/PCIe",
6022c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
6032c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x14, 0, -1,
6042c89ac5eSEitan Adler 	    .config_function = puc_config_moxa
6052c89ac5eSEitan Adler 	},
6062c89ac5eSEitan Adler 
6078efbf264SJohn Baldwin 	{   0x1393, 0x1120, 0xffff, 0,
6088efbf264SJohn Baldwin 	    "Moxa Technologies, CP-112UL",
6098efbf264SJohn Baldwin 	    DEFAULT_RCLK * 8,
6108efbf264SJohn Baldwin 	    PUC_PORT_2S, 0x18, 0, 8,
6118efbf264SJohn Baldwin 	},
6128efbf264SJohn Baldwin 
61364220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
61464220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
61564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
61664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
6179c564b6cSJohn Hay 	},
6189c564b6cSJohn Hay 
619f83255a5SMax Khon 	{   0x1393, 0x1144, 0xffff, 0,
620f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-114EL/PCIe",
621f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
622f83255a5SMax Khon 	    PUC_PORT_4S, 0x14, 0, -1,
623f83255a5SMax Khon 	    .config_function = puc_config_moxa
624f83255a5SMax Khon 	},
625f83255a5SMax Khon 
626f83255a5SMax Khon 	{   0x1393, 0x1182, 0xffff, 0,
627f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-118EL-A/PCIe",
628f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
62951cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
63051cb024fSMax Khon 	    .config_function = puc_config_moxa
631f83255a5SMax Khon 	},
632f83255a5SMax Khon 
63364220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
63464220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
63564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
63664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
6379c564b6cSJohn Hay 	},
6389c564b6cSJohn Hay 
63964220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
64064220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
64164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
64264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
6439c564b6cSJohn Hay 	},
6449c564b6cSJohn Hay 
6450db1aa0bSStanislav Sedov 	{   0x1393, 0x1682, 0xffff, 0,
6460db1aa0bSStanislav Sedov 	    "Moxa Technologies, CP-168EL/PCIe",
6470db1aa0bSStanislav Sedov 	    DEFAULT_RCLK * 8,
6480db1aa0bSStanislav Sedov 	    PUC_PORT_8S, 0x18, 0, 8,
6490db1aa0bSStanislav Sedov 	},
6500db1aa0bSStanislav Sedov 
651f83255a5SMax Khon 	{   0x1393, 0x1683, 0xffff, 0,
652f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-168EL-A/PCIe",
653f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
65451cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
65551cb024fSMax Khon 	    .config_function = puc_config_moxa
656f83255a5SMax Khon 	},
657f83255a5SMax Khon 
65822e0612fSJohn Baldwin 	{   0x13a8, 0x0152, 0xffff, 0,
65922e0612fSJohn Baldwin 	    "Exar XR17C/D152",
66022e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
66122e0612fSJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, -1,
66222e0612fSJohn Baldwin 	    .config_function = puc_config_exar
66322e0612fSJohn Baldwin 	},
66422e0612fSJohn Baldwin 
66522e0612fSJohn Baldwin 	{   0x13a8, 0x0154, 0xffff, 0,
66622e0612fSJohn Baldwin 	    "Exar XR17C154",
66722e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
66822e0612fSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, -1,
66922e0612fSJohn Baldwin 	    .config_function = puc_config_exar
67022e0612fSJohn Baldwin 	},
67122e0612fSJohn Baldwin 
67264220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
67322e0612fSJohn Baldwin 	    "Exar XR17C158",
67464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
67564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
67622e0612fSJohn Baldwin 	    .config_function = puc_config_exar
677de0d2cadSJohn Hay 	},
678de0d2cadSJohn Hay 
67979aac43eSEd Maste 	{   0x13a8, 0x0258, 0xffff, 0,
68079aac43eSEd Maste 	    "Exar XR17V258IV",
68179aac43eSEd Maste 	    DEFAULT_RCLK * 8,
68279aac43eSEd Maste 	    PUC_PORT_8S, 0x10, 0, -1,
6833aff0961SRyan Stone 	    .config_function = puc_config_exar
68479aac43eSEd Maste 	},
68579aac43eSEd Maste 
6868de2c77bSRyan Stone 	/* The XR17V358 uses the 125MHz PCIe clock as its reference clock. */
6878de2c77bSRyan Stone 	{   0x13a8, 0x0358, 0xffff, 0,
6888de2c77bSRyan Stone 	    "Exar XR17V358",
6898de2c77bSRyan Stone 	    125000000,
6908de2c77bSRyan Stone 	    PUC_PORT_8S, 0x10, 0, -1,
6918de2c77bSRyan Stone 	    .config_function = puc_config_exar_pcie
6928de2c77bSRyan Stone 	},
6938de2c77bSRyan Stone 
6945bcc8e2fSEitan Adler 	{   0x13fe, 0x1600, 0x1602, 0x0002,
6955bcc8e2fSEitan Adler 	    "Advantech PCI-1602",
6965bcc8e2fSEitan Adler 	    DEFAULT_RCLK * 8,
6975bcc8e2fSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
6985bcc8e2fSEitan Adler 	},
6995bcc8e2fSEitan Adler 
70064220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
70164220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
70264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
70364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7049c564b6cSJohn Hay 	},
7059c564b6cSJohn Hay 
70664220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
70764220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
70864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
70964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7109c564b6cSJohn Hay 	},
7119c564b6cSJohn Hay 
71264220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
71364220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
71464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
71564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7169c564b6cSJohn Hay 	},
7179c564b6cSJohn Hay 
71864220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
71964220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
72064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
72164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7229c564b6cSJohn Hay 	},
72364220a7eSMarcel Moolenaar 
72464220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
72564220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
72664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
72764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
72864220a7eSMarcel Moolenaar 	},
72964220a7eSMarcel Moolenaar 
73064220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
73164220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
73264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
73364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
73464220a7eSMarcel Moolenaar 	},
73564220a7eSMarcel Moolenaar 
73664220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
73764220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
73864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
73964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
74064220a7eSMarcel Moolenaar 	},
74164220a7eSMarcel Moolenaar 
74213ae6dceSKevin Lo 	{   0x1409, 0x7268, 0xffff, 0,
74313ae6dceSKevin Lo 	    "Sunix SUN1888",
74413ae6dceSKevin Lo 	    0,
74513ae6dceSKevin Lo 	    PUC_PORT_2P, 0x10, 0, 8,
74613ae6dceSKevin Lo 	},
74713ae6dceSKevin Lo 
74864220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
74964220a7eSMarcel Moolenaar 	    NULL,
75064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
75164220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
75264220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
7539c564b6cSJohn Hay 	},
7549c564b6cSJohn Hay 
7559c564b6cSJohn Hay 	/*
7569c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
7579c564b6cSJohn Hay 	 *
7589c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
7596e9f075aSJohn Baldwin 	 * <URL:http://www.plxtech.com/products/uart/>
7609c564b6cSJohn Hay 	 *
7619c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
7629c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
7639c564b6cSJohn Hay 	 */
764acdfc36aSEitan Adler 	{
765acdfc36aSEitan Adler 	    0x1415, 0x9501, 0x10fc, 0xc070,
766acdfc36aSEitan Adler 	    "I-O DATA RSA-PCI2/R",
767acdfc36aSEitan Adler 	    DEFAULT_RCLK * 8,
768acdfc36aSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
769acdfc36aSEitan Adler 	},
7709c564b6cSJohn Hay 
7710db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
7720db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
7730db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
7740db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
7750db885bbSDag-Erling Smørgrav 	},
7760db885bbSDag-Erling Smørgrav 
7771d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
7781d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
7791d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
7801d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
7811d860a7eSMarcel Moolenaar 	},
7821d860a7eSMarcel Moolenaar 
78330ced0d8SJohn Baldwin 	{   0x1415, 0x9501, 0x131f, 0x2052,
78430ced0d8SJohn Baldwin 	    "SIIG Quartet Serial 850",
78530ced0d8SJohn Baldwin 	    DEFAULT_RCLK * 10,
78630ced0d8SJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
78730ced0d8SJohn Baldwin 	},
78830ced0d8SJohn Baldwin 
789282211eaSJohn Baldwin 	{   0x1415, 0x9501, 0x14db, 0x2150,
790282211eaSJohn Baldwin 	    "Kuroutoshikou SERIAL4P-LPPCI2",
791282211eaSJohn Baldwin 	    DEFAULT_RCLK * 10,
792282211eaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
793282211eaSJohn Baldwin 	},
794282211eaSJohn Baldwin 
79564220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
796c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
797d5e0798eSMarius Strobl 	    0,
79864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
799d5e0798eSMarius Strobl 	    .config_function = puc_config_oxford_pci954
80083431653SWarner Losh 	},
80183431653SWarner Losh 
80210414b71SJohn Baldwin 	{   0x1415, 0x950a, 0x131f, 0x2030,
80310414b71SJohn Baldwin 	    "SIIG Cyber 2S PCIe",
80410414b71SJohn Baldwin 	    DEFAULT_RCLK * 10,
80510414b71SJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, 8,
80610414b71SJohn Baldwin 	},
80710414b71SJohn Baldwin 
8080dfbbaceSEitan Adler 	{   0x1415, 0x950a, 0x131f, 0x2032,
8090dfbbaceSEitan Adler 	    "SIIG Cyber Serial Dual PCI 16C850",
8100dfbbaceSEitan Adler 	    DEFAULT_RCLK * 10,
8110dfbbaceSEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
8120dfbbaceSEitan Adler 	},
8130dfbbaceSEitan Adler 
8141714dcabSMarius Strobl 	{   0x1415, 0x950a, 0x131f, 0x2061,
8151714dcabSMarius Strobl 	    "SIIG Cyber 2SP1 PCIe",
8161714dcabSMarius Strobl 	    DEFAULT_RCLK * 10,
8171714dcabSMarius Strobl 	    PUC_PORT_2S, 0x10, 0, 8,
8181714dcabSMarius Strobl 	},
8191714dcabSMarius Strobl 
82064220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
821c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
822c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
82364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
8249c564b6cSJohn Hay 	},
8259c564b6cSJohn Hay 
82664220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
82764220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
82864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
82964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
83043e42f36SDoug Ambrisko 	},
83143e42f36SDoug Ambrisko 
83264220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
83364220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
83464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
83564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
8366cb38a02SDoug Ambrisko 	},
8376cb38a02SDoug Ambrisko 
83811a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
83911a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
84000ff5de5SMarius Strobl 	    DEFAULT_RCLK,
84111a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
84211a12794SRoman Kurakin 	},
84311a12794SRoman Kurakin 
844f09d9fbaSJohn Baldwin 	/*
845f09d9fbaSJohn Baldwin 	 * Perle boards use Oxford Semiconductor chips, but they store the
846f09d9fbaSJohn Baldwin 	 * Oxford Semiconductor device ID as a subvendor device ID and use
847f09d9fbaSJohn Baldwin 	 * their own device IDs.
848f09d9fbaSJohn Baldwin 	 */
849f09d9fbaSJohn Baldwin 
850f09d9fbaSJohn Baldwin 	{   0x155f, 0x0331, 0xffff, 0,
851edfaa737SEitan Adler 	    "Perle Ultraport4 Express",
852edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
853edfaa737SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
854edfaa737SEitan Adler 	},
855edfaa737SEitan Adler 
856edfaa737SEitan Adler 	{   0x155f, 0xB012, 0xffff, 0,
857edfaa737SEitan Adler 	    "Perle Speed2 LE",
858edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
859edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
860edfaa737SEitan Adler 	},
861edfaa737SEitan Adler 
862edfaa737SEitan Adler 	{   0x155f, 0xB022, 0xffff, 0,
863edfaa737SEitan Adler 	    "Perle Speed2 LE",
864edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
865edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
866edfaa737SEitan Adler 	},
867edfaa737SEitan Adler 
868edfaa737SEitan Adler 	{   0x155f, 0xB004, 0xffff, 0,
869f09d9fbaSJohn Baldwin 	    "Perle Speed4 LE",
870f09d9fbaSJohn Baldwin 	    DEFAULT_RCLK * 8,
871f09d9fbaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
872f09d9fbaSJohn Baldwin 	},
873f09d9fbaSJohn Baldwin 
874edfaa737SEitan Adler 	{   0x155f, 0xB008, 0xffff, 0,
875edfaa737SEitan Adler 	    "Perle Speed8 LE",
876edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
877edfaa737SEitan Adler 	    PUC_PORT_8S, 0x10, 0, 8,
878edfaa737SEitan Adler 	},
879edfaa737SEitan Adler 
880edfaa737SEitan Adler 
8816e9f075aSJohn Baldwin 	/*
8826e9f075aSJohn Baldwin 	 * Oxford Semiconductor PCI Express Expresso family
8836e9f075aSJohn Baldwin 	 *
8846e9f075aSJohn Baldwin 	 * Found in many 'native' PCI Express serial boards such as:
8856e9f075aSJohn Baldwin 	 *
8866e9f075aSJohn Baldwin 	 * eMegatech MP954ER4 (4 port) and MP958ER8 (8 port)
8876e9f075aSJohn Baldwin 	 * <URL:http://www.emegatech.com.tw/pdrs232pcie.html>
8886e9f075aSJohn Baldwin 	 *
8896e9f075aSJohn Baldwin 	 * Lindy 51189 (4 port)
8906e9f075aSJohn Baldwin 	 * <URL:http://www.lindy.com> <URL:http://tinyurl.com/lindy-51189>
8916e9f075aSJohn Baldwin 	 *
8926e9f075aSJohn Baldwin 	 * StarTech.com PEX4S952 (4 port) and PEX8S952 (8 port)
8936e9f075aSJohn Baldwin 	 * <URL:http://www.startech.com>
8946e9f075aSJohn Baldwin 	 */
8956e9f075aSJohn Baldwin 
896bdb4291fSRui Paulo 	{   0x1415, 0xc11b, 0xffff, 0,
897bdb4291fSRui Paulo 	    "Oxford Semiconductor OXPCIe952 1S1P",
898bdb4291fSRui Paulo 	    DEFAULT_RCLK * 0x22,
899bdb4291fSRui Paulo 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
900bdb4291fSRui Paulo 	    .config_function = puc_config_oxford_pcie
901bdb4291fSRui Paulo 	},
902bdb4291fSRui Paulo 
903a6a64612SAndrey V. Elsukov 	{   0x1415, 0xc138, 0xffff, 0,
904a6a64612SAndrey V. Elsukov 	    "Oxford Semiconductor OXPCIe952 UARTs",
905a6a64612SAndrey V. Elsukov 	    DEFAULT_RCLK * 0x22,
906a6a64612SAndrey V. Elsukov 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
907a6a64612SAndrey V. Elsukov 	    .config_function = puc_config_oxford_pcie
908a6a64612SAndrey V. Elsukov 	},
909a6a64612SAndrey V. Elsukov 
9106e9f075aSJohn Baldwin 	{   0x1415, 0xc158, 0xffff, 0,
9116e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs",
9126e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9136e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9146e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9156e9f075aSJohn Baldwin 	},
9166e9f075aSJohn Baldwin 
9176e9f075aSJohn Baldwin 	{   0x1415, 0xc15d, 0xffff, 0,
9186e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs (function 1)",
9196e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9206e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9216e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9226e9f075aSJohn Baldwin 	},
9236e9f075aSJohn Baldwin 
9246e9f075aSJohn Baldwin 	{   0x1415, 0xc208, 0xffff, 0,
9256e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs",
9266e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9276e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9286e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9296e9f075aSJohn Baldwin 	},
9306e9f075aSJohn Baldwin 
9316e9f075aSJohn Baldwin 	{   0x1415, 0xc20d, 0xffff, 0,
9326e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs (function 1)",
9336e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
9346e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
9356e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
9366e9f075aSJohn Baldwin 	},
9376e9f075aSJohn Baldwin 
9386e9f075aSJohn Baldwin 	{   0x1415, 0xc308, 0xffff, 0,
9396e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 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, 0xc30d, 0xffff, 0,
9466e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 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 
95246ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
95346ce58c7SAndrew Thompson 	    "VScom PCI-100L",
95446ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
95546ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
95646ce58c7SAndrew Thompson 	},
95746ce58c7SAndrew Thompson 
95864220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
95964220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
96064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
96164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
962a58deb46SColin Percival 	},
963a58deb46SColin Percival 
96464220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
96546dd877dSPoul-Henning Kamp 	    "VScom 200Li",
96664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
96764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
96846dd877dSPoul-Henning Kamp 	},
9693e19d3c0SBruce M Simpson 
97064220a7eSMarcel Moolenaar 	/*
97164220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
97264220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
97364220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
97464220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
97564220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
97664220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
97764220a7eSMarcel Moolenaar 	 * access the external UARTs.
97864220a7eSMarcel Moolenaar 	 */
97964220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
98064220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
98164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
98264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
98364220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
98464220a7eSMarcel Moolenaar 	},
98564220a7eSMarcel Moolenaar 
98664220a7eSMarcel Moolenaar 	/*
98764220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
98864220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
98964220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
99064220a7eSMarcel Moolenaar 	 */
99164220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
99264220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
99364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
99464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
99564220a7eSMarcel Moolenaar 	},
99600ff5de5SMarius Strobl 
99764220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
99864220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
99964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
100064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
100164220a7eSMarcel Moolenaar 	},
100264220a7eSMarcel Moolenaar 
100364220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
100464220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
100564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
100664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
100764220a7eSMarcel Moolenaar 	},
100864220a7eSMarcel Moolenaar 
100964220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
101064220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
101164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
101264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
101364220a7eSMarcel Moolenaar 	},
101464220a7eSMarcel Moolenaar 
101564589ec8SEitan Adler 	{   0x14d2, 0xa007, 0xffff, 0,
101664589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
101764589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
101864589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
101964589ec8SEitan Adler 	},
102064589ec8SEitan Adler 
102164589ec8SEitan Adler 	{   0x14d2, 0xa008, 0xffff, 0,
102264589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
102364589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
102464589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
102564589ec8SEitan Adler 	},
102664589ec8SEitan Adler 
102764220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
102864220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
102964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
103064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
103164220a7eSMarcel Moolenaar 	},
103264220a7eSMarcel Moolenaar 
103364220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
103464220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
103564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
103664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
103764220a7eSMarcel Moolenaar 	},
103864220a7eSMarcel Moolenaar 
10390dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
10400dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
10410dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
10420dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
10430dc908e7SAndrew Thompson 	},
10440dc908e7SAndrew Thompson 
104564220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
104664220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
104764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
104864220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
104964220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
105064220a7eSMarcel Moolenaar 	},
105164220a7eSMarcel Moolenaar 
105250c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0002,
105350c0e894SMarius Strobl 	    "Sunix SER5xxxx 2-port serial",
10547501345eSJohn Hay 	    DEFAULT_RCLK * 8,
10557501345eSJohn Hay 	    PUC_PORT_2S, 0x10, 0, 8,
10567501345eSJohn Hay 	},
10577501345eSJohn Hay 
105850c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0004,
105950c0e894SMarius Strobl 	    "Sunix SER5xxxx 4-port serial",
106050c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
106150c0e894SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, 8,
106250c0e894SMarius Strobl 	},
106350c0e894SMarius Strobl 
106450c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0008,
106550c0e894SMarius Strobl 	    "Sunix SER5xxxx 8-port serial",
106650c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
106750c0e894SMarius Strobl 	    PUC_PORT_8S, -1, -1, -1,
106850c0e894SMarius Strobl 	    .config_function = puc_config_sunix
106950c0e894SMarius Strobl 	},
107050c0e894SMarius Strobl 
107150c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0101,
107250c0e894SMarius Strobl 	    "Sunix MIO5xxxx 1-port serial and 1284 Printer port",
107350c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
107450c0e894SMarius Strobl 	    PUC_PORT_1S1P, -1, -1, -1,
107550c0e894SMarius Strobl 	    .config_function = puc_config_sunix
107650c0e894SMarius Strobl 	},
107750c0e894SMarius Strobl 
107850c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0102,
107910bcada8SMarius Strobl 	    "Sunix MIO5xxxx 2-port serial and 1284 Printer port",
108050c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
108150c0e894SMarius Strobl 	    PUC_PORT_2S1P, -1, -1, -1,
108250c0e894SMarius Strobl 	    .config_function = puc_config_sunix
108350c0e894SMarius Strobl 	},
108450c0e894SMarius Strobl 
108550c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0104,
108650c0e894SMarius Strobl 	    "Sunix MIO5xxxx 4-port serial and 1284 Printer port",
108750c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
108850c0e894SMarius Strobl 	    PUC_PORT_4S1P, -1, -1, -1,
108950c0e894SMarius Strobl 	    .config_function = puc_config_sunix
109050c0e894SMarius Strobl 	},
109150c0e894SMarius Strobl 
10927eae6323SLuiz Otavio O Souza 	{   0x5372, 0x6872, 0xffff, 0,
10937eae6323SLuiz Otavio O Souza 	    "Feasso PCI FPP-02 2S1P",
10947eae6323SLuiz Otavio O Souza 	    DEFAULT_RCLK,
10957eae6323SLuiz Otavio O Souza 	    PUC_PORT_2S1P, 0x10, 4, 0,
10967eae6323SLuiz Otavio O Souza 	},
10977eae6323SLuiz Otavio O Souza 
1098d9b73ea9SEitan Adler 	{   0x5372, 0x6873, 0xffff, 0,
1099d9b73ea9SEitan Adler 	    "Sun 1040 PCI Quad Serial",
1100d9b73ea9SEitan Adler 	    DEFAULT_RCLK,
1101d9b73ea9SEitan Adler 	    PUC_PORT_4S, 0x10, 4, 0,
1102d9b73ea9SEitan Adler 	},
1103d9b73ea9SEitan Adler 
110464220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
110564220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
110664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
110764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
110864220a7eSMarcel Moolenaar 	},
110964220a7eSMarcel Moolenaar 
1110858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
1111858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
1112858030c4SAndrew Thompson 	    DEFAULT_RCLK,
1113858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
1114858030c4SAndrew Thompson 	},
1115858030c4SAndrew Thompson 
111664220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
111764220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
111864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
111964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
112064220a7eSMarcel Moolenaar 	},
112164220a7eSMarcel Moolenaar 
112264220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
112364220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
112464220a7eSMarcel Moolenaar 	    0,
112564220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
112664220a7eSMarcel Moolenaar 	},
112764220a7eSMarcel Moolenaar 
1128843994aeSJohn Baldwin 	/*
112950c0e894SMarius Strobl 	 * This is more specific than the generic NM9835 entry, and is placed
113050c0e894SMarius Strobl 	 * here to _prevent_ puc(4) from claiming this single port card.
1131843994aeSJohn Baldwin 	 *
1132843994aeSJohn Baldwin 	 * uart(4) will claim this device.
1133843994aeSJohn Baldwin 	 */
1134843994aeSJohn Baldwin 	{   0x9710, 0x9835, 0x1000, 1,
1135843994aeSJohn Baldwin 	    "NetMos NM9835 based 1-port serial",
1136843994aeSJohn Baldwin 	    DEFAULT_RCLK,
1137843994aeSJohn Baldwin 	    PUC_PORT_1S, 0x10, 4, 0,
1138843994aeSJohn Baldwin 	},
1139843994aeSJohn Baldwin 
1140045de714SNavdeep Parhar 	{   0x9710, 0x9835, 0x1000, 2,
1141045de714SNavdeep Parhar 	    "NetMos NM9835 based 2-port serial",
1142045de714SNavdeep Parhar 	    DEFAULT_RCLK,
1143045de714SNavdeep Parhar 	    PUC_PORT_2S, 0x10, 4, 0,
1144045de714SNavdeep Parhar 	},
1145045de714SNavdeep Parhar 
114664220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
114764220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
114864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
114964220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
115064220a7eSMarcel Moolenaar 	},
115164220a7eSMarcel Moolenaar 
115264220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
115364220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
115464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
115564220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
115664220a7eSMarcel Moolenaar 	},
115764220a7eSMarcel Moolenaar 
115864220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
115964220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
116064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
116164220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
11621d864e0dSMarcel Moolenaar 	},
11631d864e0dSMarcel Moolenaar 
11641d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3002,
11651d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART",
11661d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11671d864e0dSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
11681d864e0dSMarcel Moolenaar 	},
11691d864e0dSMarcel Moolenaar 
11701d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3003,
11711d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Triple UART",
11721d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11731d864e0dSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 4, 0,
11741d864e0dSMarcel Moolenaar 	},
11751d864e0dSMarcel Moolenaar 
11761d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3004,
11771d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Quad UART",
11781d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
117900ff5de5SMarius Strobl 	    PUC_PORT_4S, 0x10, 4, 0,
11801d864e0dSMarcel Moolenaar 	},
11811d864e0dSMarcel Moolenaar 
11821d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3011,
11831d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Single UART and 1284 Printer port",
11841d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11851d864e0dSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
11861d864e0dSMarcel Moolenaar 	},
11871d864e0dSMarcel Moolenaar 
11881d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3012,
11891d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART and 1284 Printer port",
11901d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11911d864e0dSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
11921d864e0dSMarcel Moolenaar 	},
11931d864e0dSMarcel Moolenaar 
11941d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3020,
11951d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual 1284 Printer port",
11961d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11971d864e0dSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 4, 0,
119864220a7eSMarcel Moolenaar 	},
119964220a7eSMarcel Moolenaar 
120064220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
120164220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
120264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
120364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
120464220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
120564220a7eSMarcel Moolenaar 	},
120664220a7eSMarcel Moolenaar 
120764220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
120864220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
120964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
121064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
121164220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
121264220a7eSMarcel Moolenaar 	},
121364220a7eSMarcel Moolenaar 
121464220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
121564220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
121664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
121764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
121864220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
121964220a7eSMarcel Moolenaar 	},
122064220a7eSMarcel Moolenaar 
122164220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
122264220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
122364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
122464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
122564220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
122664220a7eSMarcel Moolenaar 	},
122764220a7eSMarcel Moolenaar 
122864220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
122964220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
123064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
123164220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
123264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
123364220a7eSMarcel Moolenaar 	},
123464220a7eSMarcel Moolenaar 
123564220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
123664220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
123764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
123864220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
123964220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
124064220a7eSMarcel Moolenaar 	},
124164220a7eSMarcel Moolenaar 
124264220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
124364220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
124464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
124564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
124664220a7eSMarcel Moolenaar 	},
124764220a7eSMarcel Moolenaar 
124864220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
124964220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
125064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
125164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
125264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
125364220a7eSMarcel Moolenaar 	},
125464220a7eSMarcel Moolenaar 
125564220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
12569c564b6cSJohn Hay };
125764220a7eSMarcel Moolenaar 
125864220a7eSMarcel Moolenaar static int
1259*430acc47SMarius Strobl puc_config_amc(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd, int port,
126064220a7eSMarcel Moolenaar     intptr_t *res)
126164220a7eSMarcel Moolenaar {
1262*430acc47SMarius Strobl 
126364220a7eSMarcel Moolenaar 	switch (cmd) {
126464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
126564220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
126664220a7eSMarcel Moolenaar 		return (0);
126764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
126864220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
126964220a7eSMarcel Moolenaar 		return (0);
127064220a7eSMarcel Moolenaar 	default:
127164220a7eSMarcel Moolenaar 		break;
127264220a7eSMarcel Moolenaar 	}
127364220a7eSMarcel Moolenaar 	return (ENXIO);
127464220a7eSMarcel Moolenaar }
127564220a7eSMarcel Moolenaar 
127664220a7eSMarcel Moolenaar static int
127764220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
127864220a7eSMarcel Moolenaar     intptr_t *res)
127964220a7eSMarcel Moolenaar {
128064220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
128164220a7eSMarcel Moolenaar 
128264220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
128364220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
128464220a7eSMarcel Moolenaar 			port <<= 1;
128564220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
128664220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
128764220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
128864220a7eSMarcel Moolenaar 		return (0);
128964220a7eSMarcel Moolenaar 	}
129064220a7eSMarcel Moolenaar 	return (ENXIO);
129164220a7eSMarcel Moolenaar }
129264220a7eSMarcel Moolenaar 
129364220a7eSMarcel Moolenaar static int
1294*430acc47SMarius Strobl puc_config_exar(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1295*430acc47SMarius Strobl     int port, intptr_t *res)
129622e0612fSJohn Baldwin {
1297*430acc47SMarius Strobl 
129822e0612fSJohn Baldwin 	if (cmd == PUC_CFG_GET_OFS) {
129922e0612fSJohn Baldwin 		*res = port * 0x200;
130022e0612fSJohn Baldwin 		return (0);
130122e0612fSJohn Baldwin 	}
130222e0612fSJohn Baldwin 	return (ENXIO);
130322e0612fSJohn Baldwin }
130422e0612fSJohn Baldwin 
130522e0612fSJohn Baldwin static int
1306*430acc47SMarius Strobl puc_config_exar_pcie(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1307*430acc47SMarius Strobl     int port, intptr_t *res)
13088de2c77bSRyan Stone {
1309*430acc47SMarius Strobl 
13108de2c77bSRyan Stone 	if (cmd == PUC_CFG_GET_OFS) {
13118de2c77bSRyan Stone 		*res = port * 0x400;
13128de2c77bSRyan Stone 		return (0);
13138de2c77bSRyan Stone 	}
13148de2c77bSRyan Stone 	return (ENXIO);
13158de2c77bSRyan Stone }
13168de2c77bSRyan Stone 
13178de2c77bSRyan Stone static int
1318*430acc47SMarius Strobl puc_config_icbook(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1319*430acc47SMarius Strobl     int port __unused, intptr_t *res)
132064220a7eSMarcel Moolenaar {
1321*430acc47SMarius Strobl 
132264220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
132364220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
132464220a7eSMarcel Moolenaar 		return (0);
132564220a7eSMarcel Moolenaar 	}
132664220a7eSMarcel Moolenaar 	return (ENXIO);
132764220a7eSMarcel Moolenaar }
132864220a7eSMarcel Moolenaar 
132964220a7eSMarcel Moolenaar static int
13302c89ac5eSEitan Adler puc_config_moxa(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
13312c89ac5eSEitan Adler     intptr_t *res)
13322c89ac5eSEitan Adler {
133351cb024fSMax Khon 	const struct puc_cfg *cfg = sc->sc_cfg;
133451cb024fSMax Khon 
1335*430acc47SMarius Strobl 	if (cmd == PUC_CFG_GET_OFS) {
13361714dcabSMarius Strobl 		if (port == 3 && (cfg->device == 0x1045 ||
13371714dcabSMarius Strobl 		    cfg->device == 0x1144))
133851cb024fSMax Khon 			port = 7;
133951cb024fSMax Khon 		*res = port * 0x200;
134051cb024fSMax Khon 
13412c89ac5eSEitan Adler 		return 0;
13422c89ac5eSEitan Adler 	}
13432c89ac5eSEitan Adler 	return (ENXIO);
13442c89ac5eSEitan Adler }
13452c89ac5eSEitan Adler 
13462c89ac5eSEitan Adler static int
1347*430acc47SMarius Strobl puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd,
1348*430acc47SMarius Strobl     int port __unused, intptr_t *res)
134964220a7eSMarcel Moolenaar {
135064220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
135164220a7eSMarcel Moolenaar 	struct puc_bar *bar;
135264220a7eSMarcel Moolenaar 	uint8_t v0, v1;
135364220a7eSMarcel Moolenaar 
135464220a7eSMarcel Moolenaar 	switch (cmd) {
135564220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
135664220a7eSMarcel Moolenaar 		/*
135764220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
135864220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
135964220a7eSMarcel Moolenaar 		 */
136064220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
136164220a7eSMarcel Moolenaar 		if (bar == NULL)
136264220a7eSMarcel Moolenaar 			return (ENXIO);
136364220a7eSMarcel Moolenaar 		/* Set DLAB in the LCR register of UART 0. */
136464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0x80);
136564220a7eSMarcel Moolenaar 		/* Write 0 to the SPR register of UART 0. */
136664220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0);
136764220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
136864220a7eSMarcel Moolenaar 		v0 = bus_read_1(bar->b_res, 7);
136964220a7eSMarcel Moolenaar 		/* Write a specific value to the SPR register of UART 0. */
137064220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0x80 + -cfg->clock);
137164220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
137264220a7eSMarcel Moolenaar 		v1 = bus_read_1(bar->b_res, 7);
137364220a7eSMarcel Moolenaar 		/* Clear DLAB in the LCR register of UART 0. */
137464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0);
137564220a7eSMarcel Moolenaar 		/* Save the two values read-back from the SPR register. */
137664220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
137764220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
137864220a7eSMarcel Moolenaar 			/*
137964220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
138064220a7eSMarcel Moolenaar 			 * by us. This means that the SPAD jumper is set.
138164220a7eSMarcel Moolenaar 			 */
138264220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
138364220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
138464220a7eSMarcel Moolenaar 			return (0);
138564220a7eSMarcel Moolenaar 		}
138664220a7eSMarcel Moolenaar 		if (v0 != 0) {
138764220a7eSMarcel Moolenaar 			/*
138864220a7eSMarcel Moolenaar 			 * The first value doesn't match. This can only mean
138964220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
139064220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
139164220a7eSMarcel Moolenaar 			 */
139264220a7eSMarcel Moolenaar 			if (bootverbose)
139364220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
139464220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
139564220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
139664220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
139764220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
139864220a7eSMarcel Moolenaar 				    "setting\n");
139964220a7eSMarcel Moolenaar 			return (0);
140064220a7eSMarcel Moolenaar 		}
140164220a7eSMarcel Moolenaar 		/*
140264220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't. We know
140364220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set. We also know that the
140464220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
140564220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
140664220a7eSMarcel Moolenaar 		 */
140764220a7eSMarcel Moolenaar 		if (bootverbose)
140864220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
140964220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
141064220a7eSMarcel Moolenaar 		return (0);
141164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
141264220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
141364220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
141464220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
141564220a7eSMarcel Moolenaar 			/*
141664220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
141764220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
141864220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed. Let's hope
141964220a7eSMarcel Moolenaar 			 * not...
142064220a7eSMarcel Moolenaar 			 */
142164220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
142264220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
142364220a7eSMarcel Moolenaar 			/*
142464220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
142564220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
142664220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
142764220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
142864220a7eSMarcel Moolenaar 			 */
142964220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
143064220a7eSMarcel Moolenaar 		} else
143164220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
143264220a7eSMarcel Moolenaar 		return (0);
143364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
143464220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
143564220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
1436*430acc47SMarius Strobl 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock) ?
1437*430acc47SMarius Strobl 		    PUC_ILR_NONE : PUC_ILR_QUATECH;
143864220a7eSMarcel Moolenaar 		return (0);
143964220a7eSMarcel Moolenaar 	default:
144064220a7eSMarcel Moolenaar 		break;
144164220a7eSMarcel Moolenaar 	}
144264220a7eSMarcel Moolenaar 	return (ENXIO);
144364220a7eSMarcel Moolenaar }
144464220a7eSMarcel Moolenaar 
144564220a7eSMarcel Moolenaar static int
144664220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
144764220a7eSMarcel Moolenaar     intptr_t *res)
144864220a7eSMarcel Moolenaar {
144964220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
145064220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
145164220a7eSMarcel Moolenaar 	struct puc_bar *bar;
145264220a7eSMarcel Moolenaar 	int efir, idx, ofs;
145364220a7eSMarcel Moolenaar 	uint8_t v;
145464220a7eSMarcel Moolenaar 
145564220a7eSMarcel Moolenaar 	switch (cmd) {
145664220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
145764220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
145864220a7eSMarcel Moolenaar 		if (bar == NULL)
145964220a7eSMarcel Moolenaar 			return (ENXIO);
146064220a7eSMarcel Moolenaar 
146164220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
146264220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
146364220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
146464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
146564220a7eSMarcel Moolenaar 		idx = 0;
146664220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
146764220a7eSMarcel Moolenaar 			efir = base[idx];
146864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
146964220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
147064220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
147164220a7eSMarcel Moolenaar 				return (ENXIO);
147264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
147364220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
147464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
147564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
147664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
147764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
147864220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
147964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
148064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
148164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
148264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
148364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
148464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
148564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
148664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
148764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
148864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
148964220a7eSMarcel Moolenaar 			idx++;
149064220a7eSMarcel Moolenaar 		}
149164220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
149264220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
149364220a7eSMarcel Moolenaar 		return (0);
149464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
149564220a7eSMarcel Moolenaar 		switch (port) {
149664220a7eSMarcel Moolenaar 		case 0:
149764220a7eSMarcel Moolenaar 			*res = 0x2f8;
149864220a7eSMarcel Moolenaar 			return (0);
149964220a7eSMarcel Moolenaar 		case 1:
150064220a7eSMarcel Moolenaar 			*res = 0x2e8;
150164220a7eSMarcel Moolenaar 			return (0);
150264220a7eSMarcel Moolenaar 		case 2:
150364220a7eSMarcel Moolenaar 			*res = 0x3f8;
150464220a7eSMarcel Moolenaar 			return (0);
150564220a7eSMarcel Moolenaar 		case 3:
150664220a7eSMarcel Moolenaar 			*res = 0x3e8;
150764220a7eSMarcel Moolenaar 			return (0);
150864220a7eSMarcel Moolenaar 		case 4:
150964220a7eSMarcel Moolenaar 			*res = 0x278;
151064220a7eSMarcel Moolenaar 			return (0);
151164220a7eSMarcel Moolenaar 		}
151264220a7eSMarcel Moolenaar 		break;
151364220a7eSMarcel Moolenaar 	default:
151464220a7eSMarcel Moolenaar 		break;
151564220a7eSMarcel Moolenaar 	}
151664220a7eSMarcel Moolenaar 	return (ENXIO);
151764220a7eSMarcel Moolenaar }
151864220a7eSMarcel Moolenaar 
151964220a7eSMarcel Moolenaar static int
152064220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
152164220a7eSMarcel Moolenaar     intptr_t *res)
152264220a7eSMarcel Moolenaar {
152364220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
152464220a7eSMarcel Moolenaar 
152564220a7eSMarcel Moolenaar 	switch (cmd) {
152664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
152764220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
152864220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
152964220a7eSMarcel Moolenaar 			return (0);
153064220a7eSMarcel Moolenaar 		}
153164220a7eSMarcel Moolenaar 		break;
153264220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
153364220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
153464220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
153564220a7eSMarcel Moolenaar 			return (0);
153664220a7eSMarcel Moolenaar 		}
153764220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
153864220a7eSMarcel Moolenaar 			switch (port) {
153964220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
154064220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
154164220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
154264220a7eSMarcel Moolenaar 			}
154364220a7eSMarcel Moolenaar 		}
154464220a7eSMarcel Moolenaar 		break;
154564220a7eSMarcel Moolenaar 	default:
154664220a7eSMarcel Moolenaar 		break;
154764220a7eSMarcel Moolenaar 	}
154864220a7eSMarcel Moolenaar 	return (ENXIO);
154964220a7eSMarcel Moolenaar }
155064220a7eSMarcel Moolenaar 
155164220a7eSMarcel Moolenaar static int
155264220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
155364220a7eSMarcel Moolenaar     intptr_t *res)
155464220a7eSMarcel Moolenaar {
155500ff5de5SMarius Strobl 	static const uint16_t dual[] = {
155664220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
155764220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
155864220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
155964220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
156064220a7eSMarcel Moolenaar 	    0xD079, 0
156164220a7eSMarcel Moolenaar 	};
156200ff5de5SMarius Strobl 	static const uint16_t quad[] = {
156364220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
156464220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
156564220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
156664220a7eSMarcel Moolenaar 	    0xB157, 0
156764220a7eSMarcel Moolenaar 	};
156800ff5de5SMarius Strobl 	static const uint16_t octa[] = {
156964220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
157064220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
157164220a7eSMarcel Moolenaar 	};
157200ff5de5SMarius Strobl 	static const struct {
157364220a7eSMarcel Moolenaar 		int ports;
157400ff5de5SMarius Strobl 		const uint16_t *ids;
157564220a7eSMarcel Moolenaar 	} subdevs[] = {
157664220a7eSMarcel Moolenaar 	    { 2, dual },
157764220a7eSMarcel Moolenaar 	    { 4, quad },
157864220a7eSMarcel Moolenaar 	    { 8, octa },
157964220a7eSMarcel Moolenaar 	    { 0, NULL }
158064220a7eSMarcel Moolenaar 	};
158164220a7eSMarcel Moolenaar 	static char desc[64];
158264220a7eSMarcel Moolenaar 	int dev, id;
158364220a7eSMarcel Moolenaar 	uint16_t subdev;
158464220a7eSMarcel Moolenaar 
158564220a7eSMarcel Moolenaar 	switch (cmd) {
15869c418f51SJohn Baldwin 	case PUC_CFG_GET_CLOCK:
15879c418f51SJohn Baldwin 		if (port < 2)
15889c418f51SJohn Baldwin 			*res = DEFAULT_RCLK * 8;
15899c418f51SJohn Baldwin 		else
15909c418f51SJohn Baldwin 			*res = DEFAULT_RCLK;
15919c418f51SJohn Baldwin 		return (0);
159264220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
159364220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
159464220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
159564220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
159664220a7eSMarcel Moolenaar 		return (0);
159764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
159864220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
159964220a7eSMarcel Moolenaar 		dev = 0;
160064220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
160164220a7eSMarcel Moolenaar 			id = 0;
160264220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
160364220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
160464220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
160564220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
160664220a7eSMarcel Moolenaar 					return (0);
160764220a7eSMarcel Moolenaar 				}
160864220a7eSMarcel Moolenaar 				id++;
160964220a7eSMarcel Moolenaar 			}
161064220a7eSMarcel Moolenaar 			dev++;
161164220a7eSMarcel Moolenaar 		}
161264220a7eSMarcel Moolenaar 		return (ENXIO);
161364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
161464220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
161564220a7eSMarcel Moolenaar 		return (0);
161664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
1617c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
161864220a7eSMarcel Moolenaar 		return (0);
161964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
162064220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
162164220a7eSMarcel Moolenaar 		return (0);
162264220a7eSMarcel Moolenaar 	default:
162364220a7eSMarcel Moolenaar 		break;
162464220a7eSMarcel Moolenaar 	}
162564220a7eSMarcel Moolenaar 	return (ENXIO);
162664220a7eSMarcel Moolenaar }
162764220a7eSMarcel Moolenaar 
162864220a7eSMarcel Moolenaar static int
1629d5e0798eSMarius Strobl puc_config_oxford_pci954(struct puc_softc *sc, enum puc_cfg_cmd cmd,
1630d5e0798eSMarius Strobl     int port __unused, intptr_t *res)
1631d5e0798eSMarius Strobl {
1632d5e0798eSMarius Strobl 
1633d5e0798eSMarius Strobl 	switch (cmd) {
1634d5e0798eSMarius Strobl 	case PUC_CFG_GET_CLOCK:
1635d5e0798eSMarius Strobl 		/*
1636d5e0798eSMarius Strobl 		 * OXu16PCI954 use a 14.7456 MHz clock by default while
1637d5e0798eSMarius Strobl 		 * OX16PCI954 and OXm16PCI954 employ a 1.8432 MHz one.
1638d5e0798eSMarius Strobl 		 */
1639d5e0798eSMarius Strobl 		if (pci_get_revid(sc->sc_dev) == 1)
1640d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK * 8;
1641d5e0798eSMarius Strobl 		else
1642d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK;
1643d5e0798eSMarius Strobl 		return (0);
1644d5e0798eSMarius Strobl 	default:
1645d5e0798eSMarius Strobl 		break;
1646d5e0798eSMarius Strobl 	}
1647d5e0798eSMarius Strobl 	return (ENXIO);
1648d5e0798eSMarius Strobl }
1649d5e0798eSMarius Strobl 
1650d5e0798eSMarius Strobl static int
16516e9f075aSJohn Baldwin puc_config_oxford_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
16526e9f075aSJohn Baldwin     intptr_t *res)
16536e9f075aSJohn Baldwin {
16546e9f075aSJohn Baldwin 	const struct puc_cfg *cfg = sc->sc_cfg;
16556e9f075aSJohn Baldwin 	int idx;
16566e9f075aSJohn Baldwin 	struct puc_bar *bar;
16576e9f075aSJohn Baldwin 	uint8_t value;
16586e9f075aSJohn Baldwin 
16596e9f075aSJohn Baldwin 	switch (cmd) {
16606e9f075aSJohn Baldwin 	case PUC_CFG_SETUP:
16616e9f075aSJohn Baldwin 		device_printf(sc->sc_dev, "%d UARTs detected\n",
16626e9f075aSJohn Baldwin 			sc->sc_nports);
16636e9f075aSJohn Baldwin 
16646e9f075aSJohn Baldwin 		/* Set UARTs to enhanced mode */
16656e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
16666e9f075aSJohn Baldwin 		if (bar == NULL)
16676e9f075aSJohn Baldwin 			return (ENXIO);
16686e9f075aSJohn Baldwin 		for (idx = 0; idx < sc->sc_nports; idx++) {
1669a59f78daSJohn Baldwin 			value = bus_read_1(bar->b_res, 0x1000 + (idx << 9) +
1670a59f78daSJohn Baldwin 			    0x92);
16716e9f075aSJohn Baldwin 			bus_write_1(bar->b_res, 0x1000 + (idx << 9) + 0x92,
16726e9f075aSJohn Baldwin 			    value | 0x10);
16736e9f075aSJohn Baldwin 		}
16746e9f075aSJohn Baldwin 		return (0);
16756e9f075aSJohn Baldwin 	case PUC_CFG_GET_LEN:
16766e9f075aSJohn Baldwin 		*res = 0x200;
16776e9f075aSJohn Baldwin 		return (0);
16786e9f075aSJohn Baldwin 	case PUC_CFG_GET_NPORTS:
16796e9f075aSJohn Baldwin 		/*
16806e9f075aSJohn Baldwin 		 * Check if we are being called from puc_bfe_attach()
16816e9f075aSJohn Baldwin 		 * or puc_bfe_probe(). If puc_bfe_probe(), we cannot
16826e9f075aSJohn Baldwin 		 * puc_get_bar(), so we return a value of 16. This has cosmetic
16836e9f075aSJohn Baldwin 		 * side-effects at worst; in PUC_CFG_GET_DESC,
16846e9f075aSJohn Baldwin 		 * (int)sc->sc_cfg_data will not contain the true number of
16856e9f075aSJohn Baldwin 		 * ports in PUC_CFG_GET_DESC, but we are not implementing that
16866e9f075aSJohn Baldwin 		 * call for this device family anyway.
16876e9f075aSJohn Baldwin 		 *
16886e9f075aSJohn Baldwin 		 * The check is for initialisation of sc->sc_bar[idx], which is
16896e9f075aSJohn Baldwin 		 * only done in puc_bfe_attach().
16906e9f075aSJohn Baldwin 		 */
16916e9f075aSJohn Baldwin 		idx = 0;
16926e9f075aSJohn Baldwin 		do {
16936e9f075aSJohn Baldwin 			if (sc->sc_bar[idx++].b_rid != -1) {
16946e9f075aSJohn Baldwin 				sc->sc_cfg_data = 16;
16956e9f075aSJohn Baldwin 				*res = sc->sc_cfg_data;
16966e9f075aSJohn Baldwin 				return (0);
16976e9f075aSJohn Baldwin 			}
16986e9f075aSJohn Baldwin 		} while (idx < PUC_PCI_BARS);
16996e9f075aSJohn Baldwin 
17006e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
17016e9f075aSJohn Baldwin 		if (bar == NULL)
17026e9f075aSJohn Baldwin 			return (ENXIO);
17036e9f075aSJohn Baldwin 
17046e9f075aSJohn Baldwin 		value = bus_read_1(bar->b_res, 0x04);
17056e9f075aSJohn Baldwin 		if (value == 0)
17066e9f075aSJohn Baldwin 			return (ENXIO);
17076e9f075aSJohn Baldwin 
17086e9f075aSJohn Baldwin 		sc->sc_cfg_data = value;
17096e9f075aSJohn Baldwin 		*res = sc->sc_cfg_data;
17106e9f075aSJohn Baldwin 		return (0);
17116e9f075aSJohn Baldwin 	case PUC_CFG_GET_OFS:
17126e9f075aSJohn Baldwin 		*res = 0x1000 + (port << 9);
17136e9f075aSJohn Baldwin 		return (0);
17146e9f075aSJohn Baldwin 	case PUC_CFG_GET_TYPE:
17156e9f075aSJohn Baldwin 		*res = PUC_TYPE_SERIAL;
17166e9f075aSJohn Baldwin 		return (0);
17176e9f075aSJohn Baldwin 	default:
17186e9f075aSJohn Baldwin 		break;
17196e9f075aSJohn Baldwin 	}
17206e9f075aSJohn Baldwin 	return (ENXIO);
17216e9f075aSJohn Baldwin }
17226e9f075aSJohn Baldwin 
17236e9f075aSJohn Baldwin static int
172450c0e894SMarius Strobl puc_config_sunix(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
172550c0e894SMarius Strobl     intptr_t *res)
172650c0e894SMarius Strobl {
172750c0e894SMarius Strobl 	int error;
172850c0e894SMarius Strobl 
172950c0e894SMarius Strobl 	switch (cmd) {
173050c0e894SMarius Strobl 	case PUC_CFG_GET_OFS:
173150c0e894SMarius Strobl 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
173250c0e894SMarius Strobl 		if (error != 0)
173350c0e894SMarius Strobl 			return (error);
173450c0e894SMarius Strobl 		*res = (*res == PUC_TYPE_SERIAL) ? (port & 3) * 8 : 0;
173550c0e894SMarius Strobl 		return (0);
173650c0e894SMarius Strobl 	case PUC_CFG_GET_RID:
173750c0e894SMarius Strobl 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
173850c0e894SMarius Strobl 		if (error != 0)
173950c0e894SMarius Strobl 			return (error);
174050c0e894SMarius Strobl 		*res = (*res == PUC_TYPE_SERIAL && port <= 3) ? 0x10 : 0x14;
174150c0e894SMarius Strobl 		return (0);
174250c0e894SMarius Strobl 	default:
174350c0e894SMarius Strobl 		break;
174450c0e894SMarius Strobl 	}
174550c0e894SMarius Strobl 	return (ENXIO);
174650c0e894SMarius Strobl }
174750c0e894SMarius Strobl 
174850c0e894SMarius Strobl static int
1749*430acc47SMarius Strobl puc_config_titan(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1750*430acc47SMarius Strobl     int port, intptr_t *res)
175164220a7eSMarcel Moolenaar {
1752*430acc47SMarius Strobl 
175364220a7eSMarcel Moolenaar 	switch (cmd) {
175464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
175564220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
175664220a7eSMarcel Moolenaar 		return (0);
175764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
175864220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
175964220a7eSMarcel Moolenaar 		return (0);
176064220a7eSMarcel Moolenaar 	default:
176164220a7eSMarcel Moolenaar 		break;
176264220a7eSMarcel Moolenaar 	}
176364220a7eSMarcel Moolenaar 	return (ENXIO);
176464220a7eSMarcel Moolenaar }
1765