xref: /freebsd/sys/dev/puc/pucdata.c (revision 41b30bbc1a57b60afee9acdd6ad240c92ef13790)
1098ca2bdSWarner Losh /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
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 /*
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 
453deebd53SMarius Strobl #include <dev/ic/ns16550.h>
463deebd53SMarius Strobl 
473deebd53SMarius Strobl #include <dev/pci/pcireg.h>
489c564b6cSJohn Hay #include <dev/pci/pcivar.h>
499c564b6cSJohn Hay 
5064220a7eSMarcel Moolenaar #include <dev/puc/puc_bus.h>
5164220a7eSMarcel Moolenaar #include <dev/puc/puc_cfg.h>
52482aa6a3SDavid E. O'Brien #include <dev/puc/puc_bfe.h>
539c564b6cSJohn Hay 
543deebd53SMarius Strobl static puc_config_f puc_config_advantech;
5564220a7eSMarcel Moolenaar static puc_config_f puc_config_amc;
5664220a7eSMarcel Moolenaar static puc_config_f puc_config_diva;
5722e0612fSJohn Baldwin static puc_config_f puc_config_exar;
588de2c77bSRyan Stone static puc_config_f puc_config_exar_pcie;
5964220a7eSMarcel Moolenaar static puc_config_f puc_config_icbook;
602c89ac5eSEitan Adler static puc_config_f puc_config_moxa;
61d5e0798eSMarius Strobl static puc_config_f puc_config_oxford_pci954;
62a59f78daSJohn Baldwin static puc_config_f puc_config_oxford_pcie;
6364220a7eSMarcel Moolenaar static puc_config_f puc_config_quatech;
6464220a7eSMarcel Moolenaar static puc_config_f puc_config_syba;
6564220a7eSMarcel Moolenaar static puc_config_f puc_config_siig;
6650c0e894SMarius Strobl static puc_config_f puc_config_sunix;
6764220a7eSMarcel Moolenaar static puc_config_f puc_config_timedia;
6864220a7eSMarcel Moolenaar static puc_config_f puc_config_titan;
69dc7d0deaSMarcel Moolenaar 
7064220a7eSMarcel Moolenaar const struct puc_cfg puc_pci_devices[] = {
7164220a7eSMarcel Moolenaar 	{   0x0009, 0x7168, 0xffff, 0,
7264220a7eSMarcel Moolenaar 	    "Sunix SUN1889",
7364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
7464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
750efcc68bSBruce Evans 	},
760efcc68bSBruce Evans 
7764220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1049,
7864220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
7964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8064220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
8164220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
82dc7d0deaSMarcel Moolenaar 	},
83dc7d0deaSMarcel Moolenaar 
8464220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104a,
8564220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
8664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, -1,
8864220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
89a27ffb41SDavid E. O'Brien 	},
90a27ffb41SDavid E. O'Brien 
9164220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104b,
9264220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
9364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, -1,
9564220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
96a27ffb41SDavid E. O'Brien 	},
97a27ffb41SDavid E. O'Brien 
9864220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1223,
9964220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
10064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10164220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10264220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
103a27ffb41SDavid E. O'Brien 	},
104a27ffb41SDavid E. O'Brien 
10564220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1226,
10664220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
10764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10864220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10964220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
110a27ffb41SDavid E. O'Brien 	},
111a27ffb41SDavid E. O'Brien 
11264220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1282,
11364220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
11464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
11564220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
11664220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
117a27ffb41SDavid E. O'Brien 	},
118a27ffb41SDavid E. O'Brien 
11964220a7eSMarcel Moolenaar 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
12064220a7eSMarcel Moolenaar 	    "VScom PCI-800",
12164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1232569e387SDavid E. O'Brien 	},
12464220a7eSMarcel Moolenaar 
12564220a7eSMarcel Moolenaar 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
12664220a7eSMarcel Moolenaar 	    "VScom PCI-400",
12764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
1292569e387SDavid E. O'Brien 	},
13064220a7eSMarcel Moolenaar 
13164220a7eSMarcel Moolenaar 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
13264220a7eSMarcel Moolenaar 	    "VScom PCI-200",
13364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
13464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1352569e387SDavid E. O'Brien 	},
136a27ffb41SDavid E. O'Brien 
1379c564b6cSJohn Hay 	/*
13864220a7eSMarcel Moolenaar 	 * Boca Research Turbo Serial 658 (8 serial port) card.
13964220a7eSMarcel Moolenaar 	 * Appears to be the same as Chase Research PLC PCI-FAST8
14064220a7eSMarcel Moolenaar 	 * and Perle PCI-FAST8 Multi-Port serial cards.
1419c564b6cSJohn Hay 	 */
14264220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
14364220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 658",
14464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1469c564b6cSJohn Hay 	},
1479c564b6cSJohn Hay 
14864220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
14964220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 654",
15064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
15164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
15264220a7eSMarcel Moolenaar 	},
1539c564b6cSJohn Hay 
1549c564b6cSJohn Hay 	/*
1559c564b6cSJohn Hay 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
1569c564b6cSJohn Hay 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
1579c564b6cSJohn Hay 	 * into the subsystem fields, and claims that it's a
1589c564b6cSJohn Hay 	 * network/misc (0x02/0x80) device.
1599c564b6cSJohn Hay 	 */
16064220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
16164220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4035",
16264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
16364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1649c564b6cSJohn Hay 	},
1659c564b6cSJohn Hay 
1669c564b6cSJohn Hay 	/*
16764220a7eSMarcel Moolenaar 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
16864220a7eSMarcel Moolenaar 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
16964220a7eSMarcel Moolenaar 	 * into the subsystem fields, and claims that it's a
17064220a7eSMarcel Moolenaar 	 * network/misc (0x02/0x80) device.
1719c564b6cSJohn Hay 	 */
17264220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
17364220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4014",
17464220a7eSMarcel Moolenaar 	    0,
17564220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x20, 4, 0,
1769c564b6cSJohn Hay 	},
1779c564b6cSJohn Hay 
17864220a7eSMarcel Moolenaar 	{   0x10e8, 0x818e, 0xffff, 0,
17964220a7eSMarcel Moolenaar 	    "Applied Micro Circuits 8 Port UART",
18064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
18164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
18264220a7eSMarcel Moolenaar 	    .config_function = puc_config_amc
18364220a7eSMarcel Moolenaar 	},
1849c564b6cSJohn Hay 
185430acc47SMarius Strobl 	/*
186430acc47SMarius Strobl 	 * The following members of the Digi International Neo series are
187430acc47SMarius Strobl 	 * based on Exar PCI chips, f. e. the 8 port variants on XR17V258IV.
188430acc47SMarius Strobl 	 * Accordingly, the PCIe versions of these cards incorporate a PLX
189430acc47SMarius Strobl 	 * PCIe-PCI-bridge.
190430acc47SMarius Strobl 	 */
191430acc47SMarius Strobl 
192430acc47SMarius Strobl 	{   0x114f, 0x00b0, 0xffff, 0,
193430acc47SMarius Strobl 	    "Digi Neo PCI 4 Port",
194430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
195430acc47SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, -1,
196430acc47SMarius Strobl 	    .config_function = puc_config_exar
197430acc47SMarius Strobl 	},
198430acc47SMarius Strobl 
199430acc47SMarius Strobl 	{   0x114f, 0x00b1, 0xffff, 0,
200430acc47SMarius Strobl 	    "Digi Neo PCI 8 Port",
201430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
202430acc47SMarius Strobl 	    PUC_PORT_8S, 0x10, 0, -1,
203430acc47SMarius Strobl 	    .config_function = puc_config_exar
204430acc47SMarius Strobl 	},
205430acc47SMarius Strobl 
206430acc47SMarius Strobl 	{   0x114f, 0x00f0, 0xffff, 0,
207430acc47SMarius Strobl 	    "Digi Neo PCIe 8 Port",
208430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
209430acc47SMarius Strobl 	    PUC_PORT_8S, 0x10, 0, -1,
210430acc47SMarius Strobl 	    .config_function = puc_config_exar
211430acc47SMarius Strobl 	},
212430acc47SMarius Strobl 
213430acc47SMarius Strobl 	{   0x114f, 0x00f1, 0xffff, 0,
214430acc47SMarius Strobl 	    "Digi Neo PCIe 4 Port",
215430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
216430acc47SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, -1,
217430acc47SMarius Strobl 	    .config_function = puc_config_exar
218430acc47SMarius Strobl 	},
219430acc47SMarius Strobl 
220430acc47SMarius Strobl 	{   0x114f, 0x00f2, 0xffff, 0,
221430acc47SMarius Strobl 	    "Digi Neo PCIe 4 Port RJ45",
222430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
223430acc47SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, -1,
224430acc47SMarius Strobl 	    .config_function = puc_config_exar
225430acc47SMarius Strobl 	},
226430acc47SMarius Strobl 
227430acc47SMarius Strobl 	{   0x114f, 0x00f3, 0xffff, 0,
228430acc47SMarius Strobl 	    "Digi Neo PCIe 8 Port RJ45",
229430acc47SMarius Strobl 	    DEFAULT_RCLK * 8,
230430acc47SMarius Strobl 	    PUC_PORT_8S, 0x10, 0, -1,
231430acc47SMarius Strobl 	    .config_function = puc_config_exar
232430acc47SMarius Strobl 	},
233430acc47SMarius Strobl 
23464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8010, 0xffff, 0,
23564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part A",
23664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23864220a7eSMarcel Moolenaar 	},
23964220a7eSMarcel Moolenaar 
24064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8011, 0xffff, 0,
24164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part B",
24264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
24364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
24464220a7eSMarcel Moolenaar 	},
24564220a7eSMarcel Moolenaar 
24664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8012, 0xffff, 0,
24764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part A",
24864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
24964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
25064220a7eSMarcel Moolenaar 	},
25164220a7eSMarcel Moolenaar 
25264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8013, 0xffff, 0,
25364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part B",
25464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
25564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
25664220a7eSMarcel Moolenaar 	},
25764220a7eSMarcel Moolenaar 
25864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8014, 0xffff, 0,
25964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/4 RJ45",
26064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
26164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
26264220a7eSMarcel Moolenaar 	},
26364220a7eSMarcel Moolenaar 
26464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8015, 0xffff, 0,
26564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/Quad",
26664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
26764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
26864220a7eSMarcel Moolenaar 	},
26964220a7eSMarcel Moolenaar 
27064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8016, 0xffff, 0,
27164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part A",
27264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
27364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
27464220a7eSMarcel Moolenaar 	},
27564220a7eSMarcel Moolenaar 
27664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8017, 0xffff, 0,
27764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part B",
27864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
27964220a7eSMarcel Moolenaar 	    PUC_PORT_12S, 0x10, 0, 8,
28064220a7eSMarcel Moolenaar 	},
28164220a7eSMarcel Moolenaar 
28264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8018, 0xffff, 0,
28364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part A",
28464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
28564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
28664220a7eSMarcel Moolenaar 	},
28764220a7eSMarcel Moolenaar 
28864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8019, 0xffff, 0,
28964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part B",
29064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
29164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
29264220a7eSMarcel Moolenaar 	},
2939c564b6cSJohn Hay 
2949c564b6cSJohn Hay 	/*
29563fbf504SRobert Watson 	 * IBM SurePOS 300 Series (481033H) serial ports
29663fbf504SRobert Watson 	 * Details can be found on the IBM RSS websites
29763fbf504SRobert Watson 	 */
29863fbf504SRobert Watson 
29963fbf504SRobert Watson 	{   0x1014, 0x0297, 0xffff, 0,
30063fbf504SRobert Watson 	    "IBM SurePOS 300 Series (481033H) serial ports",
30163fbf504SRobert Watson 	    DEFAULT_RCLK,
30263fbf504SRobert Watson 	    PUC_PORT_4S, 0x10, 4, 0
30363fbf504SRobert Watson 	},
30463fbf504SRobert Watson 
30563fbf504SRobert Watson 	/*
3069c564b6cSJohn Hay 	 * SIIG Boards.
3079c564b6cSJohn Hay 	 *
3089c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
30964220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
3109c564b6cSJohn Hay 	 */
3119c564b6cSJohn Hay 
31264220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
31364220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
31464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31564220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
3169c564b6cSJohn Hay 	},
3179c564b6cSJohn Hay 
31864220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
31964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
32064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
3229c564b6cSJohn Hay 	},
3239c564b6cSJohn Hay 
32464220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
32564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
32664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
3289c564b6cSJohn Hay 	},
3299c564b6cSJohn Hay 
33064220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
33164220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
33264220a7eSMarcel Moolenaar 	    0,
33364220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
3349c564b6cSJohn Hay 	},
3359c564b6cSJohn Hay 
33664220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
33764220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
33864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3409c564b6cSJohn Hay 	},
3419c564b6cSJohn Hay 
34264220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
34364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
34464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3469c564b6cSJohn Hay 	},
3479c564b6cSJohn Hay 
34864220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
34964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
35064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3529c564b6cSJohn Hay 	},
3539c564b6cSJohn Hay 
35464220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
35564220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
35664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35764220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3589c564b6cSJohn Hay 	},
3599c564b6cSJohn Hay 
36064220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
36164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
36264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36364220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3649c564b6cSJohn Hay 	},
3659c564b6cSJohn Hay 
36664220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
36764220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
36864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36964220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3709c564b6cSJohn Hay 	},
3719c564b6cSJohn Hay 
37264220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
37364220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
37464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3769c564b6cSJohn Hay 	},
3779c564b6cSJohn Hay 
37864220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
37964220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
38064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3829c564b6cSJohn Hay 	},
3839c564b6cSJohn Hay 
38464220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
38564220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
38664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3889c564b6cSJohn Hay 	},
3899c564b6cSJohn Hay 
39064220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
39164220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
39264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39364220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3949c564b6cSJohn Hay 	},
3959c564b6cSJohn Hay 
39664220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
39764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
39864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
4009c564b6cSJohn Hay 	},
4019c564b6cSJohn Hay 
40264220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
40364220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
40464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40564220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
4069c564b6cSJohn Hay 	},
4079c564b6cSJohn Hay 
40864220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
40964220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
41064220a7eSMarcel Moolenaar 	    0,
41164220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
4129c564b6cSJohn Hay 	},
4139c564b6cSJohn Hay 
41464220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
41564220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
41664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
4189c564b6cSJohn Hay 	},
4199c564b6cSJohn Hay 
42064220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
42164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
42264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
4249c564b6cSJohn Hay 	},
4259c564b6cSJohn Hay 
42664220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
42764220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
42864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
4309c564b6cSJohn Hay 	},
4319c564b6cSJohn Hay 
43264220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
43364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
43464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43564220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
43664220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4379c564b6cSJohn Hay 	},
4389c564b6cSJohn Hay 
43964220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
44064220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
44164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
44264220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
44364220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4449c564b6cSJohn Hay 	},
4459c564b6cSJohn Hay 
44664220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
44764220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
44864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
44964220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
45064220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4519c564b6cSJohn Hay 	},
4529c564b6cSJohn Hay 
45364220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
45464220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
45564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
45664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4579c564b6cSJohn Hay 	},
4589c564b6cSJohn Hay 
45964220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
46064220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
46164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
46264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4639c564b6cSJohn Hay 	},
4649c564b6cSJohn Hay 
46564220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
46664220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
46764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
46864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4699c564b6cSJohn Hay 	},
4709c564b6cSJohn Hay 
47164220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
47264220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
47364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
47464220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4759c564b6cSJohn Hay 	},
4769c564b6cSJohn Hay 
47764220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
47864220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
47964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
48064220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4819c564b6cSJohn Hay 	},
4829c564b6cSJohn Hay 
48364220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
48464220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
48564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
48664220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4879c564b6cSJohn Hay 	},
4889c564b6cSJohn Hay 
48964220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
49064220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
49164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
49264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
49364220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4949c564b6cSJohn Hay 	},
4959c564b6cSJohn Hay 
496*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0841, 0xffff, 0,
497*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-268",
498*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
499*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_4S, 0x18, 0, 8,
500*41b30bbcSYoshihiro Takahashi 	},
501*41b30bbcSYoshihiro Takahashi 
502*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0861, 0xffff, 0,
503*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-257",
504*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
505*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
506*41b30bbcSYoshihiro Takahashi 	},
507*41b30bbcSYoshihiro Takahashi 
508*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0862, 0xffff, 0,
509*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-257",
510*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
511*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
512*41b30bbcSYoshihiro Takahashi 	},
513*41b30bbcSYoshihiro Takahashi 
514*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0863, 0xffff, 0,
515*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-257",
516*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
517*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
518*41b30bbcSYoshihiro Takahashi 	},
519*41b30bbcSYoshihiro Takahashi 
520*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0881, 0xffff, 0,
521*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-279",
522*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
523*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_8S, 0x18, 0, 8,
524*41b30bbcSYoshihiro Takahashi 	},
525*41b30bbcSYoshihiro Takahashi 
526*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x08a1, 0xffff, 0,
527*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-313",
528*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
529*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
530*41b30bbcSYoshihiro Takahashi 	},
531*41b30bbcSYoshihiro Takahashi 
532*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x08a2, 0xffff, 0,
533*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-313",
534*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
535*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
536*41b30bbcSYoshihiro Takahashi 	},
537*41b30bbcSYoshihiro Takahashi 
538*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x08a3, 0xffff, 0,
539*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-313",
540*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
541*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
542*41b30bbcSYoshihiro Takahashi 	},
543*41b30bbcSYoshihiro Takahashi 
544*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x08c1, 0xffff, 0,
545*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-310",
546*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
547*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
548*41b30bbcSYoshihiro Takahashi 	},
549*41b30bbcSYoshihiro Takahashi 
550*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x08e1, 0xffff, 0,
551*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-302",
552*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
553*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
554*41b30bbcSYoshihiro Takahashi 	},
555*41b30bbcSYoshihiro Takahashi 
556*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x08e2, 0xffff, 0,
557*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-302",
558*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
559*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
560*41b30bbcSYoshihiro Takahashi 	},
561*41b30bbcSYoshihiro Takahashi 
562*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x08e3, 0xffff, 0,
563*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-302",
564*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
565*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
566*41b30bbcSYoshihiro Takahashi 	},
567*41b30bbcSYoshihiro Takahashi 
568*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0901, 0xffff, 0,
569*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-431",
570*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
571*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_3S, 0x18, 0, 8,
572*41b30bbcSYoshihiro Takahashi 	},
573*41b30bbcSYoshihiro Takahashi 
574*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0921, 0xffff, 0,
575*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-420",
576*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
577*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_4S, 0x18, 0, 8,
578*41b30bbcSYoshihiro Takahashi 	},
579*41b30bbcSYoshihiro Takahashi 
580*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0981, 0xffff, 0,
581*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-475",
582*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
583*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
584*41b30bbcSYoshihiro Takahashi 	},
585*41b30bbcSYoshihiro Takahashi 
586*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0982, 0xffff, 0,
587*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-475",
588*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
589*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
590*41b30bbcSYoshihiro Takahashi 	},
591*41b30bbcSYoshihiro Takahashi 
592*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x09a1, 0xffff, 0,
593*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-607",
594*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
595*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
596*41b30bbcSYoshihiro Takahashi 	},
597*41b30bbcSYoshihiro Takahashi 
598*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x09a2, 0xffff, 0,
599*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-607",
600*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
601*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
602*41b30bbcSYoshihiro Takahashi 	},
603*41b30bbcSYoshihiro Takahashi 
604*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x09a3, 0xffff, 0,
605*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-607",
606*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
607*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
608*41b30bbcSYoshihiro Takahashi 	},
609*41b30bbcSYoshihiro Takahashi 
610*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0a81, 0xffff, 0,
611*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-357",
612*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
613*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
614*41b30bbcSYoshihiro Takahashi 	},
615*41b30bbcSYoshihiro Takahashi 
616*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0a82, 0xffff, 0,
617*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-357",
618*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
619*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
620*41b30bbcSYoshihiro Takahashi 	},
621*41b30bbcSYoshihiro Takahashi 
622*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0a83, 0xffff, 0,
623*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-357",
624*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
625*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
626*41b30bbcSYoshihiro Takahashi 	},
627*41b30bbcSYoshihiro Takahashi 
628*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0ac1, 0xffff, 0,
629*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-189",
630*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
631*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
632*41b30bbcSYoshihiro Takahashi 	},
633*41b30bbcSYoshihiro Takahashi 
634*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0ac2, 0xffff, 0,
635*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-189",
636*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
637*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
638*41b30bbcSYoshihiro Takahashi 	},
639*41b30bbcSYoshihiro Takahashi 
640*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0ac3, 0xffff, 0,
641*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-189",
642*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
643*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
644*41b30bbcSYoshihiro Takahashi 	},
645*41b30bbcSYoshihiro Takahashi 
646*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0b01, 0xffff, 0,
647*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-346",
648*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
649*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_4S, 0x18, 0, 8,
650*41b30bbcSYoshihiro Takahashi 	},
651*41b30bbcSYoshihiro Takahashi 
652*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0b02, 0xffff, 0,
653*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-346",
654*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
655*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_4S, 0x18, 0, 8,
656*41b30bbcSYoshihiro Takahashi 	},
657*41b30bbcSYoshihiro Takahashi 
658*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0b21, 0xffff, 0,
659*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-200",
660*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
661*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
662*41b30bbcSYoshihiro Takahashi 	},
663*41b30bbcSYoshihiro Takahashi 
664*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0b22, 0xffff, 0,
665*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-200",
666*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
667*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
668*41b30bbcSYoshihiro Takahashi 	},
669*41b30bbcSYoshihiro Takahashi 
670*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0b23, 0xffff, 0,
671*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-200",
672*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
673*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
674*41b30bbcSYoshihiro Takahashi 	},
675*41b30bbcSYoshihiro Takahashi 
676*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0ba1, 0xffff, 0,
677*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-101",
678*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
679*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
680*41b30bbcSYoshihiro Takahashi 	},
681*41b30bbcSYoshihiro Takahashi 
682*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0bc1, 0xffff, 0,
683*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-203",
684*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
685*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
686*41b30bbcSYoshihiro Takahashi 	},
687*41b30bbcSYoshihiro Takahashi 
688*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0bc2, 0xffff, 0,
689*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-203",
690*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
691*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
692*41b30bbcSYoshihiro Takahashi 	},
693*41b30bbcSYoshihiro Takahashi 
694*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0c01, 0xffff, 0,
695*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-869",
696*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
697*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
698*41b30bbcSYoshihiro Takahashi 	},
699*41b30bbcSYoshihiro Takahashi 
700*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0c02, 0xffff, 0,
701*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-869",
702*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
703*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
704*41b30bbcSYoshihiro Takahashi 	},
705*41b30bbcSYoshihiro Takahashi 
706*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0c03, 0xffff, 0,
707*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-869",
708*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
709*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
710*41b30bbcSYoshihiro Takahashi 	},
711*41b30bbcSYoshihiro Takahashi 
712*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0c21, 0xffff, 0,
713*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-880",
714*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
715*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
716*41b30bbcSYoshihiro Takahashi 	},
717*41b30bbcSYoshihiro Takahashi 
718*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0c22, 0xffff, 0,
719*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-880",
720*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
721*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
722*41b30bbcSYoshihiro Takahashi 	},
723*41b30bbcSYoshihiro Takahashi 
724*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0c23, 0xffff, 0,
725*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UP-880",
726*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
727*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
728*41b30bbcSYoshihiro Takahashi 	},
729*41b30bbcSYoshihiro Takahashi 
730*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0c41, 0xffff, 0,
731*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-368",
732*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
733*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_4S, 0x18, 0, 8,
734*41b30bbcSYoshihiro Takahashi 	},
735*41b30bbcSYoshihiro Takahashi 
736*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0ca1, 0xffff, 0,
737*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-253",
738*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
739*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
740*41b30bbcSYoshihiro Takahashi 	},
741*41b30bbcSYoshihiro Takahashi 
742*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0d21, 0xffff, 0,
743*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-260",
744*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
745*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_4S, 0x18, 0, 8,
746*41b30bbcSYoshihiro Takahashi 	},
747*41b30bbcSYoshihiro Takahashi 
748*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0d41, 0xffff, 0,
749*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-836",
750*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
751*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_4S, 0x18, 0, 8,
752*41b30bbcSYoshihiro Takahashi 	},
753*41b30bbcSYoshihiro Takahashi 
754*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0d80, 0xffff, 0,
755*41b30bbcSYoshihiro Takahashi 	    "Intashield IS-200",
756*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
757*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_2S, 0x18, 0, 8,
758*41b30bbcSYoshihiro Takahashi 	},
759*41b30bbcSYoshihiro Takahashi 
760*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0dc0, 0xffff, 0,
761*41b30bbcSYoshihiro Takahashi 	    "Intashield IS-400",
762*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
763*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_4S, 0x18, 0, 8,
764*41b30bbcSYoshihiro Takahashi 	},
765*41b30bbcSYoshihiro Takahashi 
766*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0e41, 0xffff, 0,
767*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-279",
768*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
769*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_8S, 0x18, 0, 8,
770*41b30bbcSYoshihiro Takahashi 	},
771*41b30bbcSYoshihiro Takahashi 
772*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x0e61, 0xffff, 0,
773*41b30bbcSYoshihiro Takahashi 	    "Brainboxes UC-414",
774*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK,
775*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_4S, 0x18, 0, 8,
776*41b30bbcSYoshihiro Takahashi 	},
777*41b30bbcSYoshihiro Takahashi 
778*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x400a, 0xffff, 0,
779*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-260",
780*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
781*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
782*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
783*41b30bbcSYoshihiro Takahashi 	},
784*41b30bbcSYoshihiro Takahashi 
785*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x400b, 0xffff, 0,
786*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-320",
787*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
788*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
789*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
790*41b30bbcSYoshihiro Takahashi 	},
791*41b30bbcSYoshihiro Takahashi 
792*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x400c, 0xffff, 0,
793*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-313",
794*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
795*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
796*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
797*41b30bbcSYoshihiro Takahashi 	},
798*41b30bbcSYoshihiro Takahashi 
799*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x400e, 0xffff, 0,
800*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-310",
801*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
802*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
803*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
804*41b30bbcSYoshihiro Takahashi 	},
805*41b30bbcSYoshihiro Takahashi 
806*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x400f, 0xffff, 0,
807*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-346",
808*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
809*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
810*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
811*41b30bbcSYoshihiro Takahashi 	},
812*41b30bbcSYoshihiro Takahashi 
813*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4010, 0xffff, 0,
814*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-368",
815*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
816*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
817*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
818*41b30bbcSYoshihiro Takahashi 	},
819*41b30bbcSYoshihiro Takahashi 
820*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4011, 0xffff, 0,
821*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-420",
822*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
823*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
824*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
825*41b30bbcSYoshihiro Takahashi 	},
826*41b30bbcSYoshihiro Takahashi 
827*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4012, 0xffff, 0,
828*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-431",
829*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
830*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
831*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
832*41b30bbcSYoshihiro Takahashi 	},
833*41b30bbcSYoshihiro Takahashi 
834*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4013, 0xffff, 0,
835*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-820",
836*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
837*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
838*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
839*41b30bbcSYoshihiro Takahashi 	},
840*41b30bbcSYoshihiro Takahashi 
841*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4014, 0xffff, 0,
842*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-831",
843*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
844*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
845*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
846*41b30bbcSYoshihiro Takahashi 	},
847*41b30bbcSYoshihiro Takahashi 
848*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4015, 0xffff, 0,
849*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-257",
850*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
851*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
852*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
853*41b30bbcSYoshihiro Takahashi 	},
854*41b30bbcSYoshihiro Takahashi 
855*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4016, 0xffff, 0,
856*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-246",
857*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
858*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
859*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
860*41b30bbcSYoshihiro Takahashi 	},
861*41b30bbcSYoshihiro Takahashi 
862*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4017, 0xffff, 0,
863*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-846",
864*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
865*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
866*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
867*41b30bbcSYoshihiro Takahashi 	},
868*41b30bbcSYoshihiro Takahashi 
869*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4018, 0xffff, 0,
870*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-857",
871*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
872*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
873*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
874*41b30bbcSYoshihiro Takahashi 	},
875*41b30bbcSYoshihiro Takahashi 
876*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4019, 0xffff, 0,
877*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-101",
878*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
879*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
880*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
881*41b30bbcSYoshihiro Takahashi 	},
882*41b30bbcSYoshihiro Takahashi 
883*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x401d, 0xffff, 0,
884*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-475",
885*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
886*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
887*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
888*41b30bbcSYoshihiro Takahashi 	},
889*41b30bbcSYoshihiro Takahashi 
890*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x401e, 0xffff, 0,
891*41b30bbcSYoshihiro Takahashi 	    "Brainboxes PX-803",
892*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
893*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
894*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
895*41b30bbcSYoshihiro Takahashi 	},
896*41b30bbcSYoshihiro Takahashi 
897*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4027, 0xffff, 0,
898*41b30bbcSYoshihiro Takahashi 	    "Intashield IX-100",
899*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
900*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
901*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
902*41b30bbcSYoshihiro Takahashi 	},
903*41b30bbcSYoshihiro Takahashi 
904*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4028, 0xffff, 0,
905*41b30bbcSYoshihiro Takahashi 	    "Intashield IX-200",
906*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
907*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
908*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
909*41b30bbcSYoshihiro Takahashi 	},
910*41b30bbcSYoshihiro Takahashi 
911*41b30bbcSYoshihiro Takahashi 	{   0x135a, 0x4029, 0xffff, 0,
912*41b30bbcSYoshihiro Takahashi 	    "Intashield IX-400",
913*41b30bbcSYoshihiro Takahashi 	    DEFAULT_RCLK * 0x22,
914*41b30bbcSYoshihiro Takahashi 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
915*41b30bbcSYoshihiro Takahashi 	    .config_function = puc_config_oxford_pcie
916*41b30bbcSYoshihiro Takahashi 	},
917*41b30bbcSYoshihiro Takahashi 
91864220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
91964220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
92064220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
92164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
92264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
9239c564b6cSJohn Hay 	},
9249c564b6cSJohn Hay 
92564220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
92664220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
92764220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
92864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
92964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
9309c564b6cSJohn Hay 	},
9319c564b6cSJohn Hay 
93264220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
93364220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
93464220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
93564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
93664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
9379c564b6cSJohn Hay 	},
9389c564b6cSJohn Hay 
93964220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
94064220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
94164220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
94264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
94364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
9449c564b6cSJohn Hay 	},
9459c564b6cSJohn Hay 
94664220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
94764220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
94864220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
94964220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
95064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
9519c564b6cSJohn Hay 	},
9529c564b6cSJohn Hay 
95364220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
95464220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
95564220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
95664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
95764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
9589c564b6cSJohn Hay 	},
9599c564b6cSJohn Hay 
96064220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
96164220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
96264220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
96364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
96464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
9659c564b6cSJohn Hay 	},
9669c564b6cSJohn Hay 
96764220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
96864220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
96964220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
97064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
97164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
97276353f68SJohn Hay 	},
97376353f68SJohn Hay 
97464220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
97564220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
97664220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
97764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
97864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
9799c564b6cSJohn Hay 	},
9809c564b6cSJohn Hay 
98164220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
98264220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
98364220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
98464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
98564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
9869c564b6cSJohn Hay 	},
9879c564b6cSJohn Hay 
988f83255a5SMax Khon 	{   0x1393, 0x1024, 0xffff, 0,
989f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102E/PCIe",
990f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
99151cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
99251cb024fSMax Khon 	    .config_function = puc_config_moxa
993f83255a5SMax Khon 	},
994f83255a5SMax Khon 
995f83255a5SMax Khon 	{   0x1393, 0x1025, 0xffff, 0,
996f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102EL/PCIe",
997f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
99851cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
99951cb024fSMax Khon 	    .config_function = puc_config_moxa
1000f83255a5SMax Khon 	},
1001f83255a5SMax Khon 
100264220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
100364220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
100464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
100564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
10060ec6e983SJoerg Wunsch 	},
100740f01890SBruce Evans 
100864220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
100964220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
101064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
101164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
10129c564b6cSJohn Hay 	},
10139c564b6cSJohn Hay 
10142c89ac5eSEitan Adler 	{   0x1393, 0x1042, 0xffff, 0,
10152c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104JU/PCI",
10162c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
10172c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x18, 0, 8,
10182c89ac5eSEitan Adler 	},
10192c89ac5eSEitan Adler 
1020f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
1021f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
1022f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
1023f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
1024f6a60febSMaxim Konovalov 	},
1025f6a60febSMaxim Konovalov 
10262c89ac5eSEitan Adler 	{   0x1393, 0x1045, 0xffff, 0,
10272c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104EL-A/PCIe",
10282c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
10292c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x14, 0, -1,
10302c89ac5eSEitan Adler 	    .config_function = puc_config_moxa
10312c89ac5eSEitan Adler 	},
10322c89ac5eSEitan Adler 
10338efbf264SJohn Baldwin 	{   0x1393, 0x1120, 0xffff, 0,
10348efbf264SJohn Baldwin 	    "Moxa Technologies, CP-112UL",
10358efbf264SJohn Baldwin 	    DEFAULT_RCLK * 8,
10368efbf264SJohn Baldwin 	    PUC_PORT_2S, 0x18, 0, 8,
10378efbf264SJohn Baldwin 	},
10388efbf264SJohn Baldwin 
103964220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
104064220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
104164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
104264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
10439c564b6cSJohn Hay 	},
10449c564b6cSJohn Hay 
1045f83255a5SMax Khon 	{   0x1393, 0x1144, 0xffff, 0,
1046f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-114EL/PCIe",
1047f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
1048f83255a5SMax Khon 	    PUC_PORT_4S, 0x14, 0, -1,
1049f83255a5SMax Khon 	    .config_function = puc_config_moxa
1050f83255a5SMax Khon 	},
1051f83255a5SMax Khon 
1052f83255a5SMax Khon 	{   0x1393, 0x1182, 0xffff, 0,
1053f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-118EL-A/PCIe",
1054f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
105551cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
105651cb024fSMax Khon 	    .config_function = puc_config_moxa
1057f83255a5SMax Khon 	},
1058f83255a5SMax Khon 
105964220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
106064220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
106164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
106264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
10639c564b6cSJohn Hay 	},
10649c564b6cSJohn Hay 
106564220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
106664220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
106764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
106864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
10699c564b6cSJohn Hay 	},
10709c564b6cSJohn Hay 
10710db1aa0bSStanislav Sedov 	{   0x1393, 0x1682, 0xffff, 0,
10720db1aa0bSStanislav Sedov 	    "Moxa Technologies, CP-168EL/PCIe",
10730db1aa0bSStanislav Sedov 	    DEFAULT_RCLK * 8,
10740db1aa0bSStanislav Sedov 	    PUC_PORT_8S, 0x18, 0, 8,
10750db1aa0bSStanislav Sedov 	},
10760db1aa0bSStanislav Sedov 
1077f83255a5SMax Khon 	{   0x1393, 0x1683, 0xffff, 0,
1078f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-168EL-A/PCIe",
1079f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
108051cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
108151cb024fSMax Khon 	    .config_function = puc_config_moxa
1082f83255a5SMax Khon 	},
1083f83255a5SMax Khon 
108422e0612fSJohn Baldwin 	{   0x13a8, 0x0152, 0xffff, 0,
108522e0612fSJohn Baldwin 	    "Exar XR17C/D152",
108622e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
108722e0612fSJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, -1,
108822e0612fSJohn Baldwin 	    .config_function = puc_config_exar
108922e0612fSJohn Baldwin 	},
109022e0612fSJohn Baldwin 
109122e0612fSJohn Baldwin 	{   0x13a8, 0x0154, 0xffff, 0,
109222e0612fSJohn Baldwin 	    "Exar XR17C154",
109322e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
109422e0612fSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, -1,
109522e0612fSJohn Baldwin 	    .config_function = puc_config_exar
109622e0612fSJohn Baldwin 	},
109722e0612fSJohn Baldwin 
109864220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
109922e0612fSJohn Baldwin 	    "Exar XR17C158",
110064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
110164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
110222e0612fSJohn Baldwin 	    .config_function = puc_config_exar
1103de0d2cadSJohn Hay 	},
1104de0d2cadSJohn Hay 
110579aac43eSEd Maste 	{   0x13a8, 0x0258, 0xffff, 0,
110679aac43eSEd Maste 	    "Exar XR17V258IV",
110779aac43eSEd Maste 	    DEFAULT_RCLK * 8,
110879aac43eSEd Maste 	    PUC_PORT_8S, 0x10, 0, -1,
11093aff0961SRyan Stone 	    .config_function = puc_config_exar
111079aac43eSEd Maste 	},
111179aac43eSEd Maste 
1112cbb009b9SConrad Meyer 	{   0x13a8, 0x0352, 0xffff, 0,
1113cbb009b9SConrad Meyer 	    "Exar XR17V352",
1114cbb009b9SConrad Meyer 	    125000000,
1115cbb009b9SConrad Meyer 	    PUC_PORT_2S, 0x10, 0, -1,
1116cbb009b9SConrad Meyer 	    .config_function = puc_config_exar_pcie
1117cbb009b9SConrad Meyer 	},
1118cbb009b9SConrad Meyer 
11195704277aSTeerayut Hiruntaraporn 	{   0x13a8, 0x0354, 0xffff, 0,
11205704277aSTeerayut Hiruntaraporn 	    "Exar XR17V354",
11215704277aSTeerayut Hiruntaraporn 	    125000000,
11225704277aSTeerayut Hiruntaraporn 	    PUC_PORT_4S, 0x10, 0, -1,
11235704277aSTeerayut Hiruntaraporn 	    .config_function = puc_config_exar_pcie
11245704277aSTeerayut Hiruntaraporn 	},
11255704277aSTeerayut Hiruntaraporn 
11268de2c77bSRyan Stone 	/* The XR17V358 uses the 125MHz PCIe clock as its reference clock. */
11278de2c77bSRyan Stone 	{   0x13a8, 0x0358, 0xffff, 0,
11288de2c77bSRyan Stone 	    "Exar XR17V358",
11298de2c77bSRyan Stone 	    125000000,
11308de2c77bSRyan Stone 	    PUC_PORT_8S, 0x10, 0, -1,
11318de2c77bSRyan Stone 	    .config_function = puc_config_exar_pcie
11328de2c77bSRyan Stone 	},
11338de2c77bSRyan Stone 
11343deebd53SMarius Strobl 	/*
11353deebd53SMarius Strobl 	 * The Advantech PCI-1602 Rev. A use the first two ports of an Oxford
11363deebd53SMarius Strobl 	 * Semiconductor OXuPCI954.  Note these boards have a hardware bug in
11373deebd53SMarius Strobl 	 * that they drive the RS-422/485 transmitters after power-on until a
11385aa0576bSEd Maste 	 * driver initializes the UARTs.
11393deebd53SMarius Strobl 	 */
11405bcc8e2fSEitan Adler 	{   0x13fe, 0x1600, 0x1602, 0x0002,
11413deebd53SMarius Strobl 	    "Advantech PCI-1602 Rev. A",
11425bcc8e2fSEitan Adler 	    DEFAULT_RCLK * 8,
11435bcc8e2fSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
11443deebd53SMarius Strobl 	    .config_function = puc_config_advantech
11453deebd53SMarius Strobl 	},
11463deebd53SMarius Strobl 
11473deebd53SMarius Strobl 	/* Advantech PCI-1602 Rev. B1/PCI-1603 are also based on OXuPCI952. */
11483deebd53SMarius Strobl 	{   0x13fe, 0xa102, 0x13fe, 0xa102,
11493deebd53SMarius Strobl 	    "Advantech 2-port PCI (PCI-1602 Rev. B1/PCI-1603)",
11503deebd53SMarius Strobl 	    DEFAULT_RCLK * 8,
11513deebd53SMarius Strobl 	    PUC_PORT_2S, 0x10, 4, 0,
11523deebd53SMarius Strobl 	    .config_function = puc_config_advantech
11535bcc8e2fSEitan Adler 	},
11545bcc8e2fSEitan Adler 
115564220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
115664220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
115764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
115864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
11599c564b6cSJohn Hay 	},
11609c564b6cSJohn Hay 
116164220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
116264220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
116364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
116464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
11659c564b6cSJohn Hay 	},
11669c564b6cSJohn Hay 
116764220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
116864220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
116964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
117064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
11719c564b6cSJohn Hay 	},
11729c564b6cSJohn Hay 
117364220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
117464220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
117564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
117664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
11779c564b6cSJohn Hay 	},
117864220a7eSMarcel Moolenaar 
117964220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
118064220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
118164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
118264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
118364220a7eSMarcel Moolenaar 	},
118464220a7eSMarcel Moolenaar 
118564220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
118664220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
118764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
118864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
118964220a7eSMarcel Moolenaar 	},
119064220a7eSMarcel Moolenaar 
119164220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
119264220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
119364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
119464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
119564220a7eSMarcel Moolenaar 	},
119664220a7eSMarcel Moolenaar 
119713ae6dceSKevin Lo 	{   0x1409, 0x7268, 0xffff, 0,
119813ae6dceSKevin Lo 	    "Sunix SUN1888",
119913ae6dceSKevin Lo 	    0,
120013ae6dceSKevin Lo 	    PUC_PORT_2P, 0x10, 0, 8,
120113ae6dceSKevin Lo 	},
120213ae6dceSKevin Lo 
120364220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
120464220a7eSMarcel Moolenaar 	    NULL,
120564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
120664220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
120764220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
12089c564b6cSJohn Hay 	},
12099c564b6cSJohn Hay 
12109c564b6cSJohn Hay 	/*
12119c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
12129c564b6cSJohn Hay 	 *
12139c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
12146e9f075aSJohn Baldwin 	 * <URL:http://www.plxtech.com/products/uart/>
12159c564b6cSJohn Hay 	 *
12169c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
12179c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
12189c564b6cSJohn Hay 	 */
1219acdfc36aSEitan Adler 	{
1220acdfc36aSEitan Adler 	    0x1415, 0x9501, 0x10fc, 0xc070,
1221acdfc36aSEitan Adler 	    "I-O DATA RSA-PCI2/R",
1222acdfc36aSEitan Adler 	    DEFAULT_RCLK * 8,
1223acdfc36aSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
1224acdfc36aSEitan Adler 	},
12259c564b6cSJohn Hay 
12260db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
12270db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
12280db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
12290db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
12300db885bbSDag-Erling Smørgrav 	},
12310db885bbSDag-Erling Smørgrav 
12321d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
12331d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
12341d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
12351d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
12361d860a7eSMarcel Moolenaar 	},
12371d860a7eSMarcel Moolenaar 
123830ced0d8SJohn Baldwin 	{   0x1415, 0x9501, 0x131f, 0x2052,
123930ced0d8SJohn Baldwin 	    "SIIG Quartet Serial 850",
124030ced0d8SJohn Baldwin 	    DEFAULT_RCLK * 10,
124130ced0d8SJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
124230ced0d8SJohn Baldwin 	},
124330ced0d8SJohn Baldwin 
1244282211eaSJohn Baldwin 	{   0x1415, 0x9501, 0x14db, 0x2150,
1245282211eaSJohn Baldwin 	    "Kuroutoshikou SERIAL4P-LPPCI2",
1246282211eaSJohn Baldwin 	    DEFAULT_RCLK * 10,
1247282211eaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
1248282211eaSJohn Baldwin 	},
1249282211eaSJohn Baldwin 
125064220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
1251c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
1252d5e0798eSMarius Strobl 	    0,
125364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
1254d5e0798eSMarius Strobl 	    .config_function = puc_config_oxford_pci954
125583431653SWarner Losh 	},
125683431653SWarner Losh 
125710414b71SJohn Baldwin 	{   0x1415, 0x950a, 0x131f, 0x2030,
125810414b71SJohn Baldwin 	    "SIIG Cyber 2S PCIe",
125910414b71SJohn Baldwin 	    DEFAULT_RCLK * 10,
126010414b71SJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, 8,
126110414b71SJohn Baldwin 	},
126210414b71SJohn Baldwin 
12630dfbbaceSEitan Adler 	{   0x1415, 0x950a, 0x131f, 0x2032,
12640dfbbaceSEitan Adler 	    "SIIG Cyber Serial Dual PCI 16C850",
12650dfbbaceSEitan Adler 	    DEFAULT_RCLK * 10,
12660dfbbaceSEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
12670dfbbaceSEitan Adler 	},
12680dfbbaceSEitan Adler 
12691714dcabSMarius Strobl 	{   0x1415, 0x950a, 0x131f, 0x2061,
12701714dcabSMarius Strobl 	    "SIIG Cyber 2SP1 PCIe",
12711714dcabSMarius Strobl 	    DEFAULT_RCLK * 10,
12721714dcabSMarius Strobl 	    PUC_PORT_2S, 0x10, 0, 8,
12731714dcabSMarius Strobl 	},
12741714dcabSMarius Strobl 
127564220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
1276c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
1277c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
127864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
12799c564b6cSJohn Hay 	},
12809c564b6cSJohn Hay 
128164220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
128264220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
128364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
128464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
128543e42f36SDoug Ambrisko 	},
128643e42f36SDoug Ambrisko 
128764220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
128864220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
128964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
129064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
12916cb38a02SDoug Ambrisko 	},
12926cb38a02SDoug Ambrisko 
129311a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
129411a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
129500ff5de5SMarius Strobl 	    DEFAULT_RCLK,
129611a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
129711a12794SRoman Kurakin 	},
129811a12794SRoman Kurakin 
1299f09d9fbaSJohn Baldwin 	/*
1300f09d9fbaSJohn Baldwin 	 * Perle boards use Oxford Semiconductor chips, but they store the
1301f09d9fbaSJohn Baldwin 	 * Oxford Semiconductor device ID as a subvendor device ID and use
1302f09d9fbaSJohn Baldwin 	 * their own device IDs.
1303f09d9fbaSJohn Baldwin 	 */
1304f09d9fbaSJohn Baldwin 
1305f09d9fbaSJohn Baldwin 	{   0x155f, 0x0331, 0xffff, 0,
1306edfaa737SEitan Adler 	    "Perle Ultraport4 Express",
1307edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
1308edfaa737SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
1309edfaa737SEitan Adler 	},
1310edfaa737SEitan Adler 
1311edfaa737SEitan Adler 	{   0x155f, 0xB012, 0xffff, 0,
1312edfaa737SEitan Adler 	    "Perle Speed2 LE",
1313edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
1314edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
1315edfaa737SEitan Adler 	},
1316edfaa737SEitan Adler 
1317edfaa737SEitan Adler 	{   0x155f, 0xB022, 0xffff, 0,
1318edfaa737SEitan Adler 	    "Perle Speed2 LE",
1319edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
1320edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
1321edfaa737SEitan Adler 	},
1322edfaa737SEitan Adler 
1323edfaa737SEitan Adler 	{   0x155f, 0xB004, 0xffff, 0,
1324f09d9fbaSJohn Baldwin 	    "Perle Speed4 LE",
1325f09d9fbaSJohn Baldwin 	    DEFAULT_RCLK * 8,
1326f09d9fbaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
1327f09d9fbaSJohn Baldwin 	},
1328f09d9fbaSJohn Baldwin 
1329edfaa737SEitan Adler 	{   0x155f, 0xB008, 0xffff, 0,
1330edfaa737SEitan Adler 	    "Perle Speed8 LE",
1331edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
1332edfaa737SEitan Adler 	    PUC_PORT_8S, 0x10, 0, 8,
1333edfaa737SEitan Adler 	},
1334edfaa737SEitan Adler 
13356e9f075aSJohn Baldwin 	/*
13366e9f075aSJohn Baldwin 	 * Oxford Semiconductor PCI Express Expresso family
13376e9f075aSJohn Baldwin 	 *
13386e9f075aSJohn Baldwin 	 * Found in many 'native' PCI Express serial boards such as:
13396e9f075aSJohn Baldwin 	 *
13406e9f075aSJohn Baldwin 	 * eMegatech MP954ER4 (4 port) and MP958ER8 (8 port)
13416e9f075aSJohn Baldwin 	 * <URL:http://www.emegatech.com.tw/pdrs232pcie.html>
13426e9f075aSJohn Baldwin 	 *
13436e9f075aSJohn Baldwin 	 * Lindy 51189 (4 port)
13446e9f075aSJohn Baldwin 	 * <URL:http://www.lindy.com> <URL:http://tinyurl.com/lindy-51189>
13456e9f075aSJohn Baldwin 	 *
13466e9f075aSJohn Baldwin 	 * StarTech.com PEX4S952 (4 port) and PEX8S952 (8 port)
13476e9f075aSJohn Baldwin 	 * <URL:http://www.startech.com>
13486e9f075aSJohn Baldwin 	 */
13496e9f075aSJohn Baldwin 
1350bdb4291fSRui Paulo 	{   0x1415, 0xc11b, 0xffff, 0,
1351bdb4291fSRui Paulo 	    "Oxford Semiconductor OXPCIe952 1S1P",
1352bdb4291fSRui Paulo 	    DEFAULT_RCLK * 0x22,
1353bdb4291fSRui Paulo 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
1354bdb4291fSRui Paulo 	    .config_function = puc_config_oxford_pcie
1355bdb4291fSRui Paulo 	},
1356bdb4291fSRui Paulo 
1357a6a64612SAndrey V. Elsukov 	{   0x1415, 0xc138, 0xffff, 0,
1358a6a64612SAndrey V. Elsukov 	    "Oxford Semiconductor OXPCIe952 UARTs",
1359a6a64612SAndrey V. Elsukov 	    DEFAULT_RCLK * 0x22,
1360a6a64612SAndrey V. Elsukov 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
1361a6a64612SAndrey V. Elsukov 	    .config_function = puc_config_oxford_pcie
1362a6a64612SAndrey V. Elsukov 	},
1363a6a64612SAndrey V. Elsukov 
13646e9f075aSJohn Baldwin 	{   0x1415, 0xc158, 0xffff, 0,
13656e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs",
13666e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
13676e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
13686e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
13696e9f075aSJohn Baldwin 	},
13706e9f075aSJohn Baldwin 
13716e9f075aSJohn Baldwin 	{   0x1415, 0xc15d, 0xffff, 0,
13726e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs (function 1)",
13736e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
13746e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
13756e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
13766e9f075aSJohn Baldwin 	},
13776e9f075aSJohn Baldwin 
13786e9f075aSJohn Baldwin 	{   0x1415, 0xc208, 0xffff, 0,
13796e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs",
13806e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
13816e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
13826e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
13836e9f075aSJohn Baldwin 	},
13846e9f075aSJohn Baldwin 
13856e9f075aSJohn Baldwin 	{   0x1415, 0xc20d, 0xffff, 0,
13866e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs (function 1)",
13876e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
13886e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
13896e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
13906e9f075aSJohn Baldwin 	},
13916e9f075aSJohn Baldwin 
13926e9f075aSJohn Baldwin 	{   0x1415, 0xc308, 0xffff, 0,
13936e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs",
13946e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
13956e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
13966e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
13976e9f075aSJohn Baldwin 	},
13986e9f075aSJohn Baldwin 
13996e9f075aSJohn Baldwin 	{   0x1415, 0xc30d, 0xffff, 0,
14006e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs (function 1)",
14016e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
14026e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
14036e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
14046e9f075aSJohn Baldwin 	},
14056e9f075aSJohn Baldwin 
140646ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
140746ce58c7SAndrew Thompson 	    "VScom PCI-100L",
140846ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
140946ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
141046ce58c7SAndrew Thompson 	},
141146ce58c7SAndrew Thompson 
141264220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
141364220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
141464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
141564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
1416a58deb46SColin Percival 	},
1417a58deb46SColin Percival 
141864220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
141946dd877dSPoul-Henning Kamp 	    "VScom 200Li",
142064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
142164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
142246dd877dSPoul-Henning Kamp 	},
14233e19d3c0SBruce M Simpson 
142464220a7eSMarcel Moolenaar 	/*
142564220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
142664220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
142764220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
142864220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
142964220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
143064220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
143164220a7eSMarcel Moolenaar 	 * access the external UARTs.
143264220a7eSMarcel Moolenaar 	 */
143364220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
143464220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
143564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
143664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
143764220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
143864220a7eSMarcel Moolenaar 	},
143964220a7eSMarcel Moolenaar 
144064220a7eSMarcel Moolenaar 	/*
144164220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
144264220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
144364220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
144464220a7eSMarcel Moolenaar 	 */
144564220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
144664220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
144764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
144864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
144964220a7eSMarcel Moolenaar 	},
145000ff5de5SMarius Strobl 
145164220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
145264220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
145364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
145464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
145564220a7eSMarcel Moolenaar 	},
145664220a7eSMarcel Moolenaar 
145764220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
145864220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
145964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
146064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
146164220a7eSMarcel Moolenaar 	},
146264220a7eSMarcel Moolenaar 
146364220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
146464220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
146564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
146664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
146764220a7eSMarcel Moolenaar 	},
146864220a7eSMarcel Moolenaar 
146964589ec8SEitan Adler 	{   0x14d2, 0xa007, 0xffff, 0,
147064589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
147164589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
147264589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
147364589ec8SEitan Adler 	},
147464589ec8SEitan Adler 
147564589ec8SEitan Adler 	{   0x14d2, 0xa008, 0xffff, 0,
147664589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
147764589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
147864589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
147964589ec8SEitan Adler 	},
148064589ec8SEitan Adler 
148164220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
148264220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
148364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
148464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
148564220a7eSMarcel Moolenaar 	},
148664220a7eSMarcel Moolenaar 
148764220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
148864220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
148964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
149064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
149164220a7eSMarcel Moolenaar 	},
149264220a7eSMarcel Moolenaar 
14930dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
14940dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
14950dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
14960dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
14970dc908e7SAndrew Thompson 	},
14980dc908e7SAndrew Thompson 
149964220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
150064220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
150164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
150264220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
150364220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
150464220a7eSMarcel Moolenaar 	},
150564220a7eSMarcel Moolenaar 
150650c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0002,
150750c0e894SMarius Strobl 	    "Sunix SER5xxxx 2-port serial",
15087501345eSJohn Hay 	    DEFAULT_RCLK * 8,
15097501345eSJohn Hay 	    PUC_PORT_2S, 0x10, 0, 8,
15107501345eSJohn Hay 	},
15117501345eSJohn Hay 
151250c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0004,
151350c0e894SMarius Strobl 	    "Sunix SER5xxxx 4-port serial",
151450c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
151550c0e894SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, 8,
151650c0e894SMarius Strobl 	},
151750c0e894SMarius Strobl 
151850c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0008,
151950c0e894SMarius Strobl 	    "Sunix SER5xxxx 8-port serial",
152050c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
152150c0e894SMarius Strobl 	    PUC_PORT_8S, -1, -1, -1,
152250c0e894SMarius Strobl 	    .config_function = puc_config_sunix
152350c0e894SMarius Strobl 	},
152450c0e894SMarius Strobl 
152550c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0101,
152650c0e894SMarius Strobl 	    "Sunix MIO5xxxx 1-port serial and 1284 Printer port",
152750c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
152850c0e894SMarius Strobl 	    PUC_PORT_1S1P, -1, -1, -1,
152950c0e894SMarius Strobl 	    .config_function = puc_config_sunix
153050c0e894SMarius Strobl 	},
153150c0e894SMarius Strobl 
153250c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0102,
153310bcada8SMarius Strobl 	    "Sunix MIO5xxxx 2-port serial and 1284 Printer port",
153450c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
153550c0e894SMarius Strobl 	    PUC_PORT_2S1P, -1, -1, -1,
153650c0e894SMarius Strobl 	    .config_function = puc_config_sunix
153750c0e894SMarius Strobl 	},
153850c0e894SMarius Strobl 
153950c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0104,
154050c0e894SMarius Strobl 	    "Sunix MIO5xxxx 4-port serial and 1284 Printer port",
154150c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
154250c0e894SMarius Strobl 	    PUC_PORT_4S1P, -1, -1, -1,
154350c0e894SMarius Strobl 	    .config_function = puc_config_sunix
154450c0e894SMarius Strobl 	},
154550c0e894SMarius Strobl 
15467eae6323SLuiz Otavio O Souza 	{   0x5372, 0x6872, 0xffff, 0,
15477eae6323SLuiz Otavio O Souza 	    "Feasso PCI FPP-02 2S1P",
15487eae6323SLuiz Otavio O Souza 	    DEFAULT_RCLK,
15497eae6323SLuiz Otavio O Souza 	    PUC_PORT_2S1P, 0x10, 4, 0,
15507eae6323SLuiz Otavio O Souza 	},
15517eae6323SLuiz Otavio O Souza 
1552d9b73ea9SEitan Adler 	{   0x5372, 0x6873, 0xffff, 0,
1553d9b73ea9SEitan Adler 	    "Sun 1040 PCI Quad Serial",
1554d9b73ea9SEitan Adler 	    DEFAULT_RCLK,
1555d9b73ea9SEitan Adler 	    PUC_PORT_4S, 0x10, 4, 0,
1556d9b73ea9SEitan Adler 	},
1557d9b73ea9SEitan Adler 
155864220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
155964220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
156064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
156164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
156264220a7eSMarcel Moolenaar 	},
156364220a7eSMarcel Moolenaar 
1564858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
1565858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
1566858030c4SAndrew Thompson 	    DEFAULT_RCLK,
1567858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
1568858030c4SAndrew Thompson 	},
1569858030c4SAndrew Thompson 
157064220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
157164220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
157264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
157364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
157464220a7eSMarcel Moolenaar 	},
157564220a7eSMarcel Moolenaar 
157664220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
157764220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
157864220a7eSMarcel Moolenaar 	    0,
157964220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
158064220a7eSMarcel Moolenaar 	},
158164220a7eSMarcel Moolenaar 
1582843994aeSJohn Baldwin 	/*
158350c0e894SMarius Strobl 	 * This is more specific than the generic NM9835 entry, and is placed
158450c0e894SMarius Strobl 	 * here to _prevent_ puc(4) from claiming this single port card.
1585843994aeSJohn Baldwin 	 *
1586843994aeSJohn Baldwin 	 * uart(4) will claim this device.
1587843994aeSJohn Baldwin 	 */
1588843994aeSJohn Baldwin 	{   0x9710, 0x9835, 0x1000, 1,
1589843994aeSJohn Baldwin 	    "NetMos NM9835 based 1-port serial",
1590843994aeSJohn Baldwin 	    DEFAULT_RCLK,
1591843994aeSJohn Baldwin 	    PUC_PORT_1S, 0x10, 4, 0,
1592843994aeSJohn Baldwin 	},
1593843994aeSJohn Baldwin 
1594045de714SNavdeep Parhar 	{   0x9710, 0x9835, 0x1000, 2,
1595045de714SNavdeep Parhar 	    "NetMos NM9835 based 2-port serial",
1596045de714SNavdeep Parhar 	    DEFAULT_RCLK,
1597045de714SNavdeep Parhar 	    PUC_PORT_2S, 0x10, 4, 0,
1598045de714SNavdeep Parhar 	},
1599045de714SNavdeep Parhar 
160064220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
160164220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
160264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
160364220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
160464220a7eSMarcel Moolenaar 	},
160564220a7eSMarcel Moolenaar 
160664220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
160764220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
160864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
160964220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
161064220a7eSMarcel Moolenaar 	},
161164220a7eSMarcel Moolenaar 
161264220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
161364220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
161464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
161564220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
16161d864e0dSMarcel Moolenaar 	},
16171d864e0dSMarcel Moolenaar 
16181d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3002,
16191d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART",
16201d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
16211d864e0dSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
16221d864e0dSMarcel Moolenaar 	},
16231d864e0dSMarcel Moolenaar 
16241d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3003,
16251d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Triple UART",
16261d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
16271d864e0dSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 4, 0,
16281d864e0dSMarcel Moolenaar 	},
16291d864e0dSMarcel Moolenaar 
16301d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3004,
16311d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Quad UART",
16321d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
163300ff5de5SMarius Strobl 	    PUC_PORT_4S, 0x10, 4, 0,
16341d864e0dSMarcel Moolenaar 	},
16351d864e0dSMarcel Moolenaar 
16361d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3011,
16371d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Single UART and 1284 Printer port",
16381d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
16391d864e0dSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
16401d864e0dSMarcel Moolenaar 	},
16411d864e0dSMarcel Moolenaar 
16421d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3012,
16431d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART and 1284 Printer port",
16441d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
16451d864e0dSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
16461d864e0dSMarcel Moolenaar 	},
16471d864e0dSMarcel Moolenaar 
16481d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3020,
16491d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual 1284 Printer port",
16501d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
16511d864e0dSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 4, 0,
165264220a7eSMarcel Moolenaar 	},
165364220a7eSMarcel Moolenaar 
165464220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
165564220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
165664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
165764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
165864220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
165964220a7eSMarcel Moolenaar 	},
166064220a7eSMarcel Moolenaar 
166164220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
166264220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
166364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
166464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
166564220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
166664220a7eSMarcel Moolenaar 	},
166764220a7eSMarcel Moolenaar 
166864220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
166964220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
167064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
167164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
167264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
167364220a7eSMarcel Moolenaar 	},
167464220a7eSMarcel Moolenaar 
167564220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
167664220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
167764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
167864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
167964220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
168064220a7eSMarcel Moolenaar 	},
168164220a7eSMarcel Moolenaar 
168264220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
168364220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
168464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
168564220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
168664220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
168764220a7eSMarcel Moolenaar 	},
168864220a7eSMarcel Moolenaar 
168964220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
169064220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
169164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
169264220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
169364220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
169464220a7eSMarcel Moolenaar 	},
169564220a7eSMarcel Moolenaar 
169664220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
169764220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
169864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
169964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
170064220a7eSMarcel Moolenaar 	},
170164220a7eSMarcel Moolenaar 
170264220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
170364220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
170464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
170564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
170664220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
170764220a7eSMarcel Moolenaar 	},
170864220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
17099c564b6cSJohn Hay };
171064220a7eSMarcel Moolenaar 
171164220a7eSMarcel Moolenaar static int
puc_config_advantech(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port,intptr_t * res __unused)17123deebd53SMarius Strobl puc_config_advantech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
17133deebd53SMarius Strobl     intptr_t *res __unused)
17143deebd53SMarius Strobl {
17153deebd53SMarius Strobl 	const struct puc_cfg *cfg;
17163deebd53SMarius Strobl 	struct resource *cres;
17173deebd53SMarius Strobl 	struct puc_bar *bar;
17183deebd53SMarius Strobl 	device_t cdev, dev;
17193deebd53SMarius Strobl 	bus_size_t off;
17203deebd53SMarius Strobl 	int base, crtype, fixed, high, i, oxpcie;
17213deebd53SMarius Strobl 	uint8_t acr, func, mask;
17223deebd53SMarius Strobl 
17233deebd53SMarius Strobl 	if (cmd != PUC_CFG_SETUP)
17243deebd53SMarius Strobl 		return (ENXIO);
17253deebd53SMarius Strobl 
17263deebd53SMarius Strobl 	base = fixed = oxpcie = 0;
17273deebd53SMarius Strobl 	crtype = SYS_RES_IOPORT;
17283deebd53SMarius Strobl 	acr = mask = 0x0;
17293deebd53SMarius Strobl 	func = high = 1;
17303deebd53SMarius Strobl 	off = 0x60;
17313deebd53SMarius Strobl 
17323deebd53SMarius Strobl 	cfg = sc->sc_cfg;
17333deebd53SMarius Strobl 	switch (cfg->subvendor) {
17343deebd53SMarius Strobl 	case 0x13fe:
17353deebd53SMarius Strobl 		switch (cfg->device) {
17363deebd53SMarius Strobl 		case 0xa102:
17373deebd53SMarius Strobl 			high = 0;
17383deebd53SMarius Strobl 			break;
17393deebd53SMarius Strobl 		default:
17403deebd53SMarius Strobl 			break;
17413deebd53SMarius Strobl 		}
17423deebd53SMarius Strobl 	default:
17433deebd53SMarius Strobl 		break;
17443deebd53SMarius Strobl 	}
17453deebd53SMarius Strobl 	if (fixed == 1)
17463deebd53SMarius Strobl 		goto setup;
17473deebd53SMarius Strobl 
17483deebd53SMarius Strobl 	dev = sc->sc_dev;
17493deebd53SMarius Strobl 	cdev = pci_find_dbsf(pci_get_domain(dev), pci_get_bus(dev),
17503deebd53SMarius Strobl 	    pci_get_slot(dev), func);
17513deebd53SMarius Strobl 	if (cdev == NULL) {
17523deebd53SMarius Strobl 		device_printf(dev, "could not find config function\n");
17533deebd53SMarius Strobl 		return (ENXIO);
17543deebd53SMarius Strobl 	}
17553deebd53SMarius Strobl 
17563deebd53SMarius Strobl 	i = PCIR_BAR(0);
17573deebd53SMarius Strobl 	cres = bus_alloc_resource_any(cdev, crtype, &i, RF_ACTIVE);
17583deebd53SMarius Strobl 	if (cres == NULL) {
17593deebd53SMarius Strobl 		device_printf(dev, "could not allocate config resource\n");
17603deebd53SMarius Strobl 		return (ENXIO);
17613deebd53SMarius Strobl 	}
17623deebd53SMarius Strobl 
17633deebd53SMarius Strobl 	if (oxpcie == 0) {
17643deebd53SMarius Strobl 		mask = bus_read_1(cres, off);
17653deebd53SMarius Strobl 		if (pci_get_function(dev) == 1)
17663deebd53SMarius Strobl 			base = 4;
17673deebd53SMarius Strobl 	}
17683deebd53SMarius Strobl 
17693deebd53SMarius Strobl  setup:
17703deebd53SMarius Strobl 	for (i = 0; i < sc->sc_nports; ++i) {
17713deebd53SMarius Strobl 		device_printf(dev, "port %d: ", i);
17723deebd53SMarius Strobl 		bar = puc_get_bar(sc, cfg->rid + i * cfg->d_rid);
17733deebd53SMarius Strobl 		if (bar == NULL) {
17743deebd53SMarius Strobl 			printf("could not get BAR\n");
17753deebd53SMarius Strobl 			continue;
17763deebd53SMarius Strobl 		}
17773deebd53SMarius Strobl 
17783deebd53SMarius Strobl 		if (fixed == 0) {
17793deebd53SMarius Strobl 			if ((mask & (1 << (base + i))) == 0) {
17803deebd53SMarius Strobl 				acr = 0;
17813deebd53SMarius Strobl 				printf("RS-232\n");
17823deebd53SMarius Strobl 			} else {
17833deebd53SMarius Strobl 				acr = (high == 1 ? 0x18 : 0x10);
17843deebd53SMarius Strobl 				printf("RS-422/RS-485, active-%s auto-DTR\n",
17853deebd53SMarius Strobl 				    high == 1 ? "high" : "low");
17863deebd53SMarius Strobl 			}
17873deebd53SMarius Strobl 		}
17883deebd53SMarius Strobl 
17893deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_SPR, REG_ACR);
17903deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_ICR, acr);
17913deebd53SMarius Strobl 	}
17923deebd53SMarius Strobl 
17933deebd53SMarius Strobl 	bus_release_resource(cdev, crtype, rman_get_rid(cres), cres);
17943deebd53SMarius Strobl 	return (0);
17953deebd53SMarius Strobl }
17963deebd53SMarius Strobl 
17973deebd53SMarius Strobl static int
puc_config_amc(struct puc_softc * sc __unused,enum puc_cfg_cmd cmd,int port,intptr_t * res)1798430acc47SMarius Strobl puc_config_amc(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd, int port,
179964220a7eSMarcel Moolenaar     intptr_t *res)
180064220a7eSMarcel Moolenaar {
1801430acc47SMarius Strobl 
180264220a7eSMarcel Moolenaar 	switch (cmd) {
180364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
180464220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
180564220a7eSMarcel Moolenaar 		return (0);
180664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
180764220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
180864220a7eSMarcel Moolenaar 		return (0);
180964220a7eSMarcel Moolenaar 	default:
181064220a7eSMarcel Moolenaar 		break;
181164220a7eSMarcel Moolenaar 	}
181264220a7eSMarcel Moolenaar 	return (ENXIO);
181364220a7eSMarcel Moolenaar }
181464220a7eSMarcel Moolenaar 
181564220a7eSMarcel Moolenaar static int
puc_config_diva(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port,intptr_t * res)181664220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
181764220a7eSMarcel Moolenaar     intptr_t *res)
181864220a7eSMarcel Moolenaar {
181964220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
182064220a7eSMarcel Moolenaar 
182164220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
182264220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
182364220a7eSMarcel Moolenaar 			port <<= 1;
182464220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
182564220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
182664220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
182764220a7eSMarcel Moolenaar 		return (0);
182864220a7eSMarcel Moolenaar 	}
182964220a7eSMarcel Moolenaar 	return (ENXIO);
183064220a7eSMarcel Moolenaar }
183164220a7eSMarcel Moolenaar 
183264220a7eSMarcel Moolenaar static int
puc_config_exar(struct puc_softc * sc __unused,enum puc_cfg_cmd cmd,int port,intptr_t * res)1833430acc47SMarius Strobl puc_config_exar(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1834430acc47SMarius Strobl     int port, intptr_t *res)
183522e0612fSJohn Baldwin {
1836430acc47SMarius Strobl 
183722e0612fSJohn Baldwin 	if (cmd == PUC_CFG_GET_OFS) {
183822e0612fSJohn Baldwin 		*res = port * 0x200;
183922e0612fSJohn Baldwin 		return (0);
184022e0612fSJohn Baldwin 	}
184122e0612fSJohn Baldwin 	return (ENXIO);
184222e0612fSJohn Baldwin }
184322e0612fSJohn Baldwin 
184422e0612fSJohn Baldwin static int
puc_config_exar_pcie(struct puc_softc * sc __unused,enum puc_cfg_cmd cmd,int port,intptr_t * res)1845430acc47SMarius Strobl puc_config_exar_pcie(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1846430acc47SMarius Strobl     int port, intptr_t *res)
18478de2c77bSRyan Stone {
1848430acc47SMarius Strobl 
18498de2c77bSRyan Stone 	if (cmd == PUC_CFG_GET_OFS) {
18508de2c77bSRyan Stone 		*res = port * 0x400;
18518de2c77bSRyan Stone 		return (0);
18528de2c77bSRyan Stone 	}
18538de2c77bSRyan Stone 	return (ENXIO);
18548de2c77bSRyan Stone }
18558de2c77bSRyan Stone 
18568de2c77bSRyan Stone static int
puc_config_icbook(struct puc_softc * sc __unused,enum puc_cfg_cmd cmd,int port __unused,intptr_t * res)1857430acc47SMarius Strobl puc_config_icbook(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1858430acc47SMarius Strobl     int port __unused, intptr_t *res)
185964220a7eSMarcel Moolenaar {
1860430acc47SMarius Strobl 
186164220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
186264220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
186364220a7eSMarcel Moolenaar 		return (0);
186464220a7eSMarcel Moolenaar 	}
186564220a7eSMarcel Moolenaar 	return (ENXIO);
186664220a7eSMarcel Moolenaar }
186764220a7eSMarcel Moolenaar 
186864220a7eSMarcel Moolenaar static int
puc_config_moxa(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port,intptr_t * res)18692c89ac5eSEitan Adler puc_config_moxa(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
18702c89ac5eSEitan Adler     intptr_t *res)
18712c89ac5eSEitan Adler {
187251cb024fSMax Khon 	const struct puc_cfg *cfg = sc->sc_cfg;
187351cb024fSMax Khon 
1874430acc47SMarius Strobl 	if (cmd == PUC_CFG_GET_OFS) {
18751714dcabSMarius Strobl 		if (port == 3 && (cfg->device == 0x1045 ||
18761714dcabSMarius Strobl 		    cfg->device == 0x1144))
187751cb024fSMax Khon 			port = 7;
187851cb024fSMax Khon 		*res = port * 0x200;
187951cb024fSMax Khon 
18802c89ac5eSEitan Adler 		return 0;
18812c89ac5eSEitan Adler 	}
18822c89ac5eSEitan Adler 	return (ENXIO);
18832c89ac5eSEitan Adler }
18842c89ac5eSEitan Adler 
18852c89ac5eSEitan Adler static int
puc_config_quatech(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port __unused,intptr_t * res)1886430acc47SMarius Strobl puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd,
1887430acc47SMarius Strobl     int port __unused, intptr_t *res)
188864220a7eSMarcel Moolenaar {
188964220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
189064220a7eSMarcel Moolenaar 	struct puc_bar *bar;
189164220a7eSMarcel Moolenaar 	uint8_t v0, v1;
189264220a7eSMarcel Moolenaar 
189364220a7eSMarcel Moolenaar 	switch (cmd) {
189464220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
189564220a7eSMarcel Moolenaar 		/*
189664220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
189764220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
189864220a7eSMarcel Moolenaar 		 */
189964220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
190064220a7eSMarcel Moolenaar 		if (bar == NULL)
190164220a7eSMarcel Moolenaar 			return (ENXIO);
19023deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_LCR, LCR_DLAB);
19033deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_SPR, 0);
19043deebd53SMarius Strobl 		v0 = bus_read_1(bar->b_res, REG_SPR);
19053deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_SPR, 0x80 + -cfg->clock);
19063deebd53SMarius Strobl 		v1 = bus_read_1(bar->b_res, REG_SPR);
19073deebd53SMarius Strobl 		bus_write_1(bar->b_res, REG_LCR, 0);
190864220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
190964220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
191064220a7eSMarcel Moolenaar 			/*
191164220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
191264220a7eSMarcel Moolenaar 			 * by us.  This means that the SPAD jumper is set.
191364220a7eSMarcel Moolenaar 			 */
191464220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
191564220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
191664220a7eSMarcel Moolenaar 			return (0);
191764220a7eSMarcel Moolenaar 		}
191864220a7eSMarcel Moolenaar 		if (v0 != 0) {
191964220a7eSMarcel Moolenaar 			/*
192064220a7eSMarcel Moolenaar 			 * The first value doesn't match.  This can only mean
192164220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
192264220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
192364220a7eSMarcel Moolenaar 			 */
192464220a7eSMarcel Moolenaar 			if (bootverbose)
192564220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
192664220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
192764220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
192864220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
192964220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
193064220a7eSMarcel Moolenaar 				    "setting\n");
193164220a7eSMarcel Moolenaar 			return (0);
193264220a7eSMarcel Moolenaar 		}
193364220a7eSMarcel Moolenaar 		/*
193464220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't.  We know
193564220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set.  We also know that the
193664220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
193764220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
193864220a7eSMarcel Moolenaar 		 */
193964220a7eSMarcel Moolenaar 		if (bootverbose)
194064220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
194164220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
194264220a7eSMarcel Moolenaar 		return (0);
194364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
194464220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
194564220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
194664220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
194764220a7eSMarcel Moolenaar 			/*
194864220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
194964220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
195064220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed.  Let's hope
195164220a7eSMarcel Moolenaar 			 * not ...
195264220a7eSMarcel Moolenaar 			 */
195364220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
195464220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
195564220a7eSMarcel Moolenaar 			/*
195664220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
195764220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
195864220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
195964220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
196064220a7eSMarcel Moolenaar 			 */
196164220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
196264220a7eSMarcel Moolenaar 		} else
196364220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
196464220a7eSMarcel Moolenaar 		return (0);
196564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
196664220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
196764220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
1968430acc47SMarius Strobl 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock) ?
1969430acc47SMarius Strobl 		    PUC_ILR_NONE : PUC_ILR_QUATECH;
197064220a7eSMarcel Moolenaar 		return (0);
197164220a7eSMarcel Moolenaar 	default:
197264220a7eSMarcel Moolenaar 		break;
197364220a7eSMarcel Moolenaar 	}
197464220a7eSMarcel Moolenaar 	return (ENXIO);
197564220a7eSMarcel Moolenaar }
197664220a7eSMarcel Moolenaar 
197764220a7eSMarcel Moolenaar static int
puc_config_syba(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port,intptr_t * res)197864220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
197964220a7eSMarcel Moolenaar     intptr_t *res)
198064220a7eSMarcel Moolenaar {
198164220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
198264220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
198364220a7eSMarcel Moolenaar 	struct puc_bar *bar;
198464220a7eSMarcel Moolenaar 	int efir, idx, ofs;
198564220a7eSMarcel Moolenaar 	uint8_t v;
198664220a7eSMarcel Moolenaar 
198764220a7eSMarcel Moolenaar 	switch (cmd) {
198864220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
198964220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
199064220a7eSMarcel Moolenaar 		if (bar == NULL)
199164220a7eSMarcel Moolenaar 			return (ENXIO);
199264220a7eSMarcel Moolenaar 
199364220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
199464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
199564220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
199664220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
199764220a7eSMarcel Moolenaar 		idx = 0;
199864220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
199964220a7eSMarcel Moolenaar 			efir = base[idx];
200064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
200164220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
200264220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
200364220a7eSMarcel Moolenaar 				return (ENXIO);
200464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
200564220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
200664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
200764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
200864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
200964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
201064220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
201164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
201264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
201364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
201464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
201564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
201664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
201764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
201864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
201964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
202064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
202164220a7eSMarcel Moolenaar 			idx++;
202264220a7eSMarcel Moolenaar 		}
202364220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
202464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
202564220a7eSMarcel Moolenaar 		return (0);
202664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
202764220a7eSMarcel Moolenaar 		switch (port) {
202864220a7eSMarcel Moolenaar 		case 0:
202964220a7eSMarcel Moolenaar 			*res = 0x2f8;
203064220a7eSMarcel Moolenaar 			return (0);
203164220a7eSMarcel Moolenaar 		case 1:
203264220a7eSMarcel Moolenaar 			*res = 0x2e8;
203364220a7eSMarcel Moolenaar 			return (0);
203464220a7eSMarcel Moolenaar 		case 2:
203564220a7eSMarcel Moolenaar 			*res = 0x3f8;
203664220a7eSMarcel Moolenaar 			return (0);
203764220a7eSMarcel Moolenaar 		case 3:
203864220a7eSMarcel Moolenaar 			*res = 0x3e8;
203964220a7eSMarcel Moolenaar 			return (0);
204064220a7eSMarcel Moolenaar 		case 4:
204164220a7eSMarcel Moolenaar 			*res = 0x278;
204264220a7eSMarcel Moolenaar 			return (0);
204364220a7eSMarcel Moolenaar 		}
204464220a7eSMarcel Moolenaar 		break;
204564220a7eSMarcel Moolenaar 	default:
204664220a7eSMarcel Moolenaar 		break;
204764220a7eSMarcel Moolenaar 	}
204864220a7eSMarcel Moolenaar 	return (ENXIO);
204964220a7eSMarcel Moolenaar }
205064220a7eSMarcel Moolenaar 
205164220a7eSMarcel Moolenaar static int
puc_config_siig(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port,intptr_t * res)205264220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
205364220a7eSMarcel Moolenaar     intptr_t *res)
205464220a7eSMarcel Moolenaar {
205564220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
205664220a7eSMarcel Moolenaar 
205764220a7eSMarcel Moolenaar 	switch (cmd) {
205864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
205964220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
206064220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
206164220a7eSMarcel Moolenaar 			return (0);
206264220a7eSMarcel Moolenaar 		}
206364220a7eSMarcel Moolenaar 		break;
206464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
206564220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
206664220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
206764220a7eSMarcel Moolenaar 			return (0);
206864220a7eSMarcel Moolenaar 		}
206964220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
207064220a7eSMarcel Moolenaar 			switch (port) {
207164220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
207264220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
207364220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
207464220a7eSMarcel Moolenaar 			}
207564220a7eSMarcel Moolenaar 		}
207664220a7eSMarcel Moolenaar 		break;
207764220a7eSMarcel Moolenaar 	default:
207864220a7eSMarcel Moolenaar 		break;
207964220a7eSMarcel Moolenaar 	}
208064220a7eSMarcel Moolenaar 	return (ENXIO);
208164220a7eSMarcel Moolenaar }
208264220a7eSMarcel Moolenaar 
208364220a7eSMarcel Moolenaar static int
puc_config_timedia(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port,intptr_t * res)208464220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
208564220a7eSMarcel Moolenaar     intptr_t *res)
208664220a7eSMarcel Moolenaar {
208700ff5de5SMarius Strobl 	static const uint16_t dual[] = {
208864220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
208964220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
209064220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
209164220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
209264220a7eSMarcel Moolenaar 	    0xD079, 0
209364220a7eSMarcel Moolenaar 	};
209400ff5de5SMarius Strobl 	static const uint16_t quad[] = {
209564220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
209664220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
209764220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
209864220a7eSMarcel Moolenaar 	    0xB157, 0
209964220a7eSMarcel Moolenaar 	};
210000ff5de5SMarius Strobl 	static const uint16_t octa[] = {
210164220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
210264220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
210364220a7eSMarcel Moolenaar 	};
210400ff5de5SMarius Strobl 	static const struct {
210564220a7eSMarcel Moolenaar 		int ports;
210600ff5de5SMarius Strobl 		const uint16_t *ids;
210764220a7eSMarcel Moolenaar 	} subdevs[] = {
210864220a7eSMarcel Moolenaar 	    { 2, dual },
210964220a7eSMarcel Moolenaar 	    { 4, quad },
211064220a7eSMarcel Moolenaar 	    { 8, octa },
211164220a7eSMarcel Moolenaar 	    { 0, NULL }
211264220a7eSMarcel Moolenaar 	};
211364220a7eSMarcel Moolenaar 	static char desc[64];
211464220a7eSMarcel Moolenaar 	int dev, id;
211564220a7eSMarcel Moolenaar 	uint16_t subdev;
211664220a7eSMarcel Moolenaar 
211764220a7eSMarcel Moolenaar 	switch (cmd) {
21189c418f51SJohn Baldwin 	case PUC_CFG_GET_CLOCK:
21199c418f51SJohn Baldwin 		if (port < 2)
21209c418f51SJohn Baldwin 			*res = DEFAULT_RCLK * 8;
21219c418f51SJohn Baldwin 		else
21229c418f51SJohn Baldwin 			*res = DEFAULT_RCLK;
21239c418f51SJohn Baldwin 		return (0);
212464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
212564220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
212664220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
212764220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
212864220a7eSMarcel Moolenaar 		return (0);
212964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
213064220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
213164220a7eSMarcel Moolenaar 		dev = 0;
213264220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
213364220a7eSMarcel Moolenaar 			id = 0;
213464220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
213564220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
213664220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
213764220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
213864220a7eSMarcel Moolenaar 					return (0);
213964220a7eSMarcel Moolenaar 				}
214064220a7eSMarcel Moolenaar 				id++;
214164220a7eSMarcel Moolenaar 			}
214264220a7eSMarcel Moolenaar 			dev++;
214364220a7eSMarcel Moolenaar 		}
214464220a7eSMarcel Moolenaar 		return (ENXIO);
214564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
214664220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
214764220a7eSMarcel Moolenaar 		return (0);
214864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
2149c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
215064220a7eSMarcel Moolenaar 		return (0);
215164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
215264220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
215364220a7eSMarcel Moolenaar 		return (0);
215464220a7eSMarcel Moolenaar 	default:
215564220a7eSMarcel Moolenaar 		break;
215664220a7eSMarcel Moolenaar 	}
215764220a7eSMarcel Moolenaar 	return (ENXIO);
215864220a7eSMarcel Moolenaar }
215964220a7eSMarcel Moolenaar 
216064220a7eSMarcel Moolenaar static int
puc_config_oxford_pci954(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port __unused,intptr_t * res)2161d5e0798eSMarius Strobl puc_config_oxford_pci954(struct puc_softc *sc, enum puc_cfg_cmd cmd,
2162d5e0798eSMarius Strobl     int port __unused, intptr_t *res)
2163d5e0798eSMarius Strobl {
2164d5e0798eSMarius Strobl 
2165d5e0798eSMarius Strobl 	switch (cmd) {
2166d5e0798eSMarius Strobl 	case PUC_CFG_GET_CLOCK:
2167d5e0798eSMarius Strobl 		/*
2168d5e0798eSMarius Strobl 		 * OXu16PCI954 use a 14.7456 MHz clock by default while
2169d5e0798eSMarius Strobl 		 * OX16PCI954 and OXm16PCI954 employ a 1.8432 MHz one.
2170d5e0798eSMarius Strobl 		 */
2171d5e0798eSMarius Strobl 		if (pci_get_revid(sc->sc_dev) == 1)
2172d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK * 8;
2173d5e0798eSMarius Strobl 		else
2174d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK;
2175d5e0798eSMarius Strobl 		return (0);
2176d5e0798eSMarius Strobl 	default:
2177d5e0798eSMarius Strobl 		break;
2178d5e0798eSMarius Strobl 	}
2179d5e0798eSMarius Strobl 	return (ENXIO);
2180d5e0798eSMarius Strobl }
2181d5e0798eSMarius Strobl 
2182d5e0798eSMarius Strobl static int
puc_config_oxford_pcie(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port,intptr_t * res)21836e9f075aSJohn Baldwin puc_config_oxford_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
21846e9f075aSJohn Baldwin     intptr_t *res)
21856e9f075aSJohn Baldwin {
21866e9f075aSJohn Baldwin 	const struct puc_cfg *cfg = sc->sc_cfg;
21876e9f075aSJohn Baldwin 	int idx;
21886e9f075aSJohn Baldwin 	struct puc_bar *bar;
21896e9f075aSJohn Baldwin 	uint8_t value;
21906e9f075aSJohn Baldwin 
21916e9f075aSJohn Baldwin 	switch (cmd) {
21926e9f075aSJohn Baldwin 	case PUC_CFG_SETUP:
21936e9f075aSJohn Baldwin 		device_printf(sc->sc_dev, "%d UARTs detected\n",
21946e9f075aSJohn Baldwin 			sc->sc_nports);
21956e9f075aSJohn Baldwin 
21966e9f075aSJohn Baldwin 		/* Set UARTs to enhanced mode */
21976e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
21986e9f075aSJohn Baldwin 		if (bar == NULL)
21996e9f075aSJohn Baldwin 			return (ENXIO);
22006e9f075aSJohn Baldwin 		for (idx = 0; idx < sc->sc_nports; idx++) {
2201a59f78daSJohn Baldwin 			value = bus_read_1(bar->b_res, 0x1000 + (idx << 9) +
2202a59f78daSJohn Baldwin 			    0x92);
22036e9f075aSJohn Baldwin 			bus_write_1(bar->b_res, 0x1000 + (idx << 9) + 0x92,
22046e9f075aSJohn Baldwin 			    value | 0x10);
22056e9f075aSJohn Baldwin 		}
22066e9f075aSJohn Baldwin 		return (0);
22076e9f075aSJohn Baldwin 	case PUC_CFG_GET_LEN:
22086e9f075aSJohn Baldwin 		*res = 0x200;
22096e9f075aSJohn Baldwin 		return (0);
22106e9f075aSJohn Baldwin 	case PUC_CFG_GET_NPORTS:
22116e9f075aSJohn Baldwin 		/*
22126e9f075aSJohn Baldwin 		 * Check if we are being called from puc_bfe_attach()
22136e9f075aSJohn Baldwin 		 * or puc_bfe_probe().  If puc_bfe_probe(), we cannot
22143deebd53SMarius Strobl 		 * puc_get_bar(), so we return a value of 16.  This has
22153deebd53SMarius Strobl 		 * cosmetic side-effects at worst; in PUC_CFG_GET_DESC,
22163deebd53SMarius Strobl 		 * sc->sc_cfg_data will not contain the true number of
22173deebd53SMarius Strobl 		 * ports in PUC_CFG_GET_DESC, but we are not implementing
22183deebd53SMarius Strobl 		 * that call for this device family anyway.
22196e9f075aSJohn Baldwin 		 *
22203deebd53SMarius Strobl 		 * The check is for initialization of sc->sc_bar[idx],
22213deebd53SMarius Strobl 		 * which is only done in puc_bfe_attach().
22226e9f075aSJohn Baldwin 		 */
22236e9f075aSJohn Baldwin 		idx = 0;
22246e9f075aSJohn Baldwin 		do {
22256e9f075aSJohn Baldwin 			if (sc->sc_bar[idx++].b_rid != -1) {
22266e9f075aSJohn Baldwin 				sc->sc_cfg_data = 16;
22276e9f075aSJohn Baldwin 				*res = sc->sc_cfg_data;
22286e9f075aSJohn Baldwin 				return (0);
22296e9f075aSJohn Baldwin 			}
22306e9f075aSJohn Baldwin 		} while (idx < PUC_PCI_BARS);
22316e9f075aSJohn Baldwin 
22326e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
22336e9f075aSJohn Baldwin 		if (bar == NULL)
22346e9f075aSJohn Baldwin 			return (ENXIO);
22356e9f075aSJohn Baldwin 
22366e9f075aSJohn Baldwin 		value = bus_read_1(bar->b_res, 0x04);
22376e9f075aSJohn Baldwin 		if (value == 0)
22386e9f075aSJohn Baldwin 			return (ENXIO);
22396e9f075aSJohn Baldwin 
22406e9f075aSJohn Baldwin 		sc->sc_cfg_data = value;
22416e9f075aSJohn Baldwin 		*res = sc->sc_cfg_data;
22426e9f075aSJohn Baldwin 		return (0);
22436e9f075aSJohn Baldwin 	case PUC_CFG_GET_OFS:
22446e9f075aSJohn Baldwin 		*res = 0x1000 + (port << 9);
22456e9f075aSJohn Baldwin 		return (0);
22466e9f075aSJohn Baldwin 	case PUC_CFG_GET_TYPE:
22476e9f075aSJohn Baldwin 		*res = PUC_TYPE_SERIAL;
22486e9f075aSJohn Baldwin 		return (0);
22496e9f075aSJohn Baldwin 	default:
22506e9f075aSJohn Baldwin 		break;
22516e9f075aSJohn Baldwin 	}
22526e9f075aSJohn Baldwin 	return (ENXIO);
22536e9f075aSJohn Baldwin }
22546e9f075aSJohn Baldwin 
22556e9f075aSJohn Baldwin static int
puc_config_sunix(struct puc_softc * sc,enum puc_cfg_cmd cmd,int port,intptr_t * res)225650c0e894SMarius Strobl puc_config_sunix(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
225750c0e894SMarius Strobl     intptr_t *res)
225850c0e894SMarius Strobl {
225950c0e894SMarius Strobl 	int error;
226050c0e894SMarius Strobl 
226150c0e894SMarius Strobl 	switch (cmd) {
226250c0e894SMarius Strobl 	case PUC_CFG_GET_OFS:
226350c0e894SMarius Strobl 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
226450c0e894SMarius Strobl 		if (error != 0)
226550c0e894SMarius Strobl 			return (error);
226650c0e894SMarius Strobl 		*res = (*res == PUC_TYPE_SERIAL) ? (port & 3) * 8 : 0;
226750c0e894SMarius Strobl 		return (0);
226850c0e894SMarius Strobl 	case PUC_CFG_GET_RID:
226950c0e894SMarius Strobl 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
227050c0e894SMarius Strobl 		if (error != 0)
227150c0e894SMarius Strobl 			return (error);
227250c0e894SMarius Strobl 		*res = (*res == PUC_TYPE_SERIAL && port <= 3) ? 0x10 : 0x14;
227350c0e894SMarius Strobl 		return (0);
227450c0e894SMarius Strobl 	default:
227550c0e894SMarius Strobl 		break;
227650c0e894SMarius Strobl 	}
227750c0e894SMarius Strobl 	return (ENXIO);
227850c0e894SMarius Strobl }
227950c0e894SMarius Strobl 
228050c0e894SMarius Strobl static int
puc_config_titan(struct puc_softc * sc __unused,enum puc_cfg_cmd cmd,int port,intptr_t * res)2281430acc47SMarius Strobl puc_config_titan(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
2282430acc47SMarius Strobl     int port, intptr_t *res)
228364220a7eSMarcel Moolenaar {
2284430acc47SMarius Strobl 
228564220a7eSMarcel Moolenaar 	switch (cmd) {
228664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
228764220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
228864220a7eSMarcel Moolenaar 		return (0);
228964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
229064220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
229164220a7eSMarcel Moolenaar 		return (0);
229264220a7eSMarcel Moolenaar 	default:
229364220a7eSMarcel Moolenaar 		break;
229464220a7eSMarcel Moolenaar 	}
229564220a7eSMarcel Moolenaar 	return (ENXIO);
229664220a7eSMarcel Moolenaar }
2297