xref: /freebsd/sys/dev/puc/pucdata.c (revision bdb4291f89a8c4df0112829ba44031106255f86b)
1098ca2bdSWarner Losh /*-
264220a7eSMarcel Moolenaar  * Copyright (c) 2006 Marcel Moolenaar
364220a7eSMarcel Moolenaar  * All rights reserved.
49c564b6cSJohn Hay  *
59c564b6cSJohn Hay  * Redistribution and use in source and binary forms, with or without
69c564b6cSJohn Hay  * modification, are permitted provided that the following conditions
79c564b6cSJohn Hay  * are met:
864220a7eSMarcel Moolenaar  *
99c564b6cSJohn Hay  * 1. Redistributions of source code must retain the above copyright
109c564b6cSJohn Hay  *    notice, this list of conditions and the following disclaimer.
119c564b6cSJohn Hay  * 2. Redistributions in binary form must reproduce the above copyright
129c564b6cSJohn Hay  *    notice, this list of conditions and the following disclaimer in the
139c564b6cSJohn Hay  *    documentation and/or other materials provided with the distribution.
149c564b6cSJohn Hay  *
159c564b6cSJohn Hay  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
169c564b6cSJohn Hay  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
179c564b6cSJohn Hay  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
189c564b6cSJohn Hay  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
199c564b6cSJohn Hay  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
209c564b6cSJohn Hay  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
219c564b6cSJohn Hay  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
229c564b6cSJohn Hay  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
239c564b6cSJohn Hay  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
249c564b6cSJohn Hay  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
259c564b6cSJohn Hay  */
269c564b6cSJohn Hay 
279c564b6cSJohn Hay #include <sys/cdefs.h>
289c564b6cSJohn Hay __FBSDID("$FreeBSD$");
299c564b6cSJohn Hay 
309c564b6cSJohn Hay /*
319c564b6cSJohn Hay  * PCI "universal" communications card driver configuration data (used to
329c564b6cSJohn Hay  * match/attach the cards).
339c564b6cSJohn Hay  */
349c564b6cSJohn Hay 
359c564b6cSJohn Hay #include <sys/param.h>
3664220a7eSMarcel Moolenaar #include <sys/systm.h>
3764220a7eSMarcel Moolenaar #include <sys/kernel.h>
3864220a7eSMarcel Moolenaar #include <sys/bus.h>
399725900bSRyan Stone #include <sys/sysctl.h>
409c564b6cSJohn Hay 
4164220a7eSMarcel Moolenaar #include <machine/resource.h>
42ed0b0e82SWarner Losh #include <machine/bus.h>
4364220a7eSMarcel Moolenaar #include <sys/rman.h>
4464220a7eSMarcel Moolenaar 
459c564b6cSJohn Hay #include <dev/pci/pcivar.h>
469c564b6cSJohn Hay 
4764220a7eSMarcel Moolenaar #include <dev/puc/puc_bus.h>
4864220a7eSMarcel Moolenaar #include <dev/puc/puc_cfg.h>
49482aa6a3SDavid E. O'Brien #include <dev/puc/puc_bfe.h>
509c564b6cSJohn Hay 
5164220a7eSMarcel Moolenaar static puc_config_f puc_config_amc;
5264220a7eSMarcel Moolenaar static puc_config_f puc_config_diva;
5322e0612fSJohn Baldwin static puc_config_f puc_config_exar;
548de2c77bSRyan Stone static puc_config_f puc_config_exar_pcie;
5564220a7eSMarcel Moolenaar static puc_config_f puc_config_icbook;
562c89ac5eSEitan Adler static puc_config_f puc_config_moxa;
57d5e0798eSMarius Strobl static puc_config_f puc_config_oxford_pci954;
58a59f78daSJohn Baldwin static puc_config_f puc_config_oxford_pcie;
5964220a7eSMarcel Moolenaar static puc_config_f puc_config_quatech;
6064220a7eSMarcel Moolenaar static puc_config_f puc_config_syba;
6164220a7eSMarcel Moolenaar static puc_config_f puc_config_siig;
6250c0e894SMarius Strobl static puc_config_f puc_config_sunix;
6364220a7eSMarcel Moolenaar static puc_config_f puc_config_timedia;
6464220a7eSMarcel Moolenaar static puc_config_f puc_config_titan;
65dc7d0deaSMarcel Moolenaar 
6664220a7eSMarcel Moolenaar const struct puc_cfg puc_pci_devices[] = {
67a27ffb41SDavid E. O'Brien 
6864220a7eSMarcel Moolenaar 	{   0x0009, 0x7168, 0xffff, 0,
6964220a7eSMarcel Moolenaar 	    "Sunix SUN1889",
7064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
7164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
720efcc68bSBruce Evans 	},
730efcc68bSBruce Evans 
7464220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1049,
7564220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
7664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
7764220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
7864220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
79dc7d0deaSMarcel Moolenaar 	},
80dc7d0deaSMarcel Moolenaar 
8164220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104a,
8264220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
8364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, -1,
8564220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
86a27ffb41SDavid E. O'Brien 	},
87a27ffb41SDavid E. O'Brien 
8864220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104b,
8964220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
9064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, -1,
9264220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
93a27ffb41SDavid E. O'Brien 	},
94a27ffb41SDavid E. O'Brien 
9564220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1223,
9664220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
9764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9864220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
9964220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
100a27ffb41SDavid E. O'Brien 	},
101a27ffb41SDavid E. O'Brien 
10264220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1226,
10364220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
10464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10564220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10664220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
107a27ffb41SDavid E. O'Brien 	},
108a27ffb41SDavid E. O'Brien 
10964220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1282,
11064220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
11164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
11264220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
11364220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
114a27ffb41SDavid E. O'Brien 	},
115a27ffb41SDavid E. O'Brien 
11664220a7eSMarcel Moolenaar 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
11764220a7eSMarcel Moolenaar 	    "VScom PCI-800",
11864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
11964220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1202569e387SDavid E. O'Brien 	},
12164220a7eSMarcel Moolenaar 
12264220a7eSMarcel Moolenaar 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
12364220a7eSMarcel Moolenaar 	    "VScom PCI-400",
12464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
1262569e387SDavid E. O'Brien 	},
12764220a7eSMarcel Moolenaar 
12864220a7eSMarcel Moolenaar 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
12964220a7eSMarcel Moolenaar 	    "VScom PCI-200",
13064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
13164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1322569e387SDavid E. O'Brien 	},
133a27ffb41SDavid E. O'Brien 
1349c564b6cSJohn Hay 	/*
13564220a7eSMarcel Moolenaar 	 * Boca Research Turbo Serial 658 (8 serial port) card.
13664220a7eSMarcel Moolenaar 	 * Appears to be the same as Chase Research PLC PCI-FAST8
13764220a7eSMarcel Moolenaar 	 * and Perle PCI-FAST8 Multi-Port serial cards.
1389c564b6cSJohn Hay 	 */
13964220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
14064220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 658",
14164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1439c564b6cSJohn Hay 	},
1449c564b6cSJohn Hay 
14564220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
14664220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 654",
14764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
14964220a7eSMarcel Moolenaar 	},
1509c564b6cSJohn Hay 
1519c564b6cSJohn Hay 	/*
1529c564b6cSJohn Hay 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
1539c564b6cSJohn Hay 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
1549c564b6cSJohn Hay 	 * into the subsystem fields, and claims that it's a
1559c564b6cSJohn Hay 	 * network/misc (0x02/0x80) device.
1569c564b6cSJohn Hay 	 */
15764220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
15864220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4035",
15964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
16064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1619c564b6cSJohn Hay 	},
1629c564b6cSJohn Hay 
1639c564b6cSJohn Hay 	/*
16464220a7eSMarcel Moolenaar 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
16564220a7eSMarcel Moolenaar 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
16664220a7eSMarcel Moolenaar 	 * into the subsystem fields, and claims that it's a
16764220a7eSMarcel Moolenaar 	 * network/misc (0x02/0x80) device.
1689c564b6cSJohn Hay 	 */
16964220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
17064220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4014",
17164220a7eSMarcel Moolenaar 	    0,
17264220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x20, 4, 0,
1739c564b6cSJohn Hay 	},
1749c564b6cSJohn Hay 
17564220a7eSMarcel Moolenaar 	{   0x10e8, 0x818e, 0xffff, 0,
17664220a7eSMarcel Moolenaar 	    "Applied Micro Circuits 8 Port UART",
17764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
17864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
17964220a7eSMarcel Moolenaar 	    .config_function = puc_config_amc
18064220a7eSMarcel Moolenaar 	},
1819c564b6cSJohn Hay 
18264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8010, 0xffff, 0,
18364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part A",
18464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18664220a7eSMarcel Moolenaar 	},
18764220a7eSMarcel Moolenaar 
18864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8011, 0xffff, 0,
18964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part B",
19064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19264220a7eSMarcel Moolenaar 	},
19364220a7eSMarcel Moolenaar 
19464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8012, 0xffff, 0,
19564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part A",
19664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19864220a7eSMarcel Moolenaar 	},
19964220a7eSMarcel Moolenaar 
20064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8013, 0xffff, 0,
20164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part B",
20264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
20364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
20464220a7eSMarcel Moolenaar 	},
20564220a7eSMarcel Moolenaar 
20664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8014, 0xffff, 0,
20764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/4 RJ45",
20864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
20964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21064220a7eSMarcel Moolenaar 	},
21164220a7eSMarcel Moolenaar 
21264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8015, 0xffff, 0,
21364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/Quad",
21464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21664220a7eSMarcel Moolenaar 	},
21764220a7eSMarcel Moolenaar 
21864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8016, 0xffff, 0,
21964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part A",
22064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
22264220a7eSMarcel Moolenaar 	},
22364220a7eSMarcel Moolenaar 
22464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8017, 0xffff, 0,
22564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part B",
22664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22764220a7eSMarcel Moolenaar 	    PUC_PORT_12S, 0x10, 0, 8,
22864220a7eSMarcel Moolenaar 	},
22964220a7eSMarcel Moolenaar 
23064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8018, 0xffff, 0,
23164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part A",
23264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23464220a7eSMarcel Moolenaar 	},
23564220a7eSMarcel Moolenaar 
23664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8019, 0xffff, 0,
23764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part B",
23864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
24064220a7eSMarcel Moolenaar 	},
2419c564b6cSJohn Hay 
2429c564b6cSJohn Hay 	/*
24363fbf504SRobert Watson 	 * IBM SurePOS 300 Series (481033H) serial ports
24463fbf504SRobert Watson 	 * Details can be found on the IBM RSS websites
24563fbf504SRobert Watson 	 */
24663fbf504SRobert Watson 
24763fbf504SRobert Watson 	{   0x1014, 0x0297, 0xffff, 0,
24863fbf504SRobert Watson 	    "IBM SurePOS 300 Series (481033H) serial ports",
24963fbf504SRobert Watson 	    DEFAULT_RCLK,
25063fbf504SRobert Watson 	    PUC_PORT_4S, 0x10, 4, 0
25163fbf504SRobert Watson 	},
25263fbf504SRobert Watson 
25363fbf504SRobert Watson 	/*
2549c564b6cSJohn Hay 	 * SIIG Boards.
2559c564b6cSJohn Hay 	 *
2569c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
25764220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
2589c564b6cSJohn Hay 	 */
2599c564b6cSJohn Hay 
26064220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
26164220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
26264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
26364220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2649c564b6cSJohn Hay 	},
2659c564b6cSJohn Hay 
26664220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
26764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
26864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
26964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2709c564b6cSJohn Hay 	},
2719c564b6cSJohn Hay 
27264220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
27364220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
27464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
27564220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2769c564b6cSJohn Hay 	},
2779c564b6cSJohn Hay 
27864220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
27964220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
28064220a7eSMarcel Moolenaar 	    0,
28164220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
2829c564b6cSJohn Hay 	},
2839c564b6cSJohn Hay 
28464220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
28564220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
28664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2889c564b6cSJohn Hay 	},
2899c564b6cSJohn Hay 
29064220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
29164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
29264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2949c564b6cSJohn Hay 	},
2959c564b6cSJohn Hay 
29664220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
29764220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
29864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
3009c564b6cSJohn Hay 	},
3019c564b6cSJohn Hay 
30264220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
30364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
30464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30564220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3069c564b6cSJohn Hay 	},
3079c564b6cSJohn Hay 
30864220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
30964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
31064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31164220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3129c564b6cSJohn Hay 	},
3139c564b6cSJohn Hay 
31464220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
31564220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
31664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31764220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3189c564b6cSJohn Hay 	},
3199c564b6cSJohn Hay 
32064220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
32164220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
32264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3249c564b6cSJohn Hay 	},
3259c564b6cSJohn Hay 
32664220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
32764220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
32864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3309c564b6cSJohn Hay 	},
3319c564b6cSJohn Hay 
33264220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
33364220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
33464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3369c564b6cSJohn Hay 	},
3379c564b6cSJohn Hay 
33864220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
33964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
34064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3429c564b6cSJohn Hay 	},
3439c564b6cSJohn Hay 
34464220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
34564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
34664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3489c564b6cSJohn Hay 	},
3499c564b6cSJohn Hay 
35064220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
35164220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
35264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35364220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3549c564b6cSJohn Hay 	},
3559c564b6cSJohn Hay 
35664220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
35764220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
35864220a7eSMarcel Moolenaar 	    0,
35964220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
3609c564b6cSJohn Hay 	},
3619c564b6cSJohn Hay 
36264220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
36364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
36464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3669c564b6cSJohn Hay 	},
3679c564b6cSJohn Hay 
36864220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
36964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
37064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3729c564b6cSJohn Hay 	},
3739c564b6cSJohn Hay 
37464220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
37564220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
37664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3789c564b6cSJohn Hay 	},
3799c564b6cSJohn Hay 
38064220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
38164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
38264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38364220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38464220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3859c564b6cSJohn Hay 	},
3869c564b6cSJohn Hay 
38764220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
38864220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
38964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39064220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
39164220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3929c564b6cSJohn Hay 	},
3939c564b6cSJohn Hay 
39464220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
39564220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
39664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39764220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
39864220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3999c564b6cSJohn Hay 	},
4009c564b6cSJohn Hay 
40164220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
40264220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
40364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4059c564b6cSJohn Hay 	},
4069c564b6cSJohn Hay 
40764220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
40864220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
40964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4119c564b6cSJohn Hay 	},
4129c564b6cSJohn Hay 
41364220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
41464220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
41564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4179c564b6cSJohn Hay 	},
4189c564b6cSJohn Hay 
41964220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
42064220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
42164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42264220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4239c564b6cSJohn Hay 	},
4249c564b6cSJohn Hay 
42564220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
42664220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
42764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42864220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4299c564b6cSJohn Hay 	},
4309c564b6cSJohn Hay 
43164220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
43264220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
43364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43464220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4359c564b6cSJohn Hay 	},
4369c564b6cSJohn Hay 
43764220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
43864220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
43964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
44064220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
44164220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4429c564b6cSJohn Hay 	},
4439c564b6cSJohn Hay 
44464220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
44564220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
44664220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
44764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
44864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4499c564b6cSJohn Hay 	},
4509c564b6cSJohn Hay 
45164220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
45264220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
45364220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
45464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
45564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4569c564b6cSJohn Hay 	},
4579c564b6cSJohn Hay 
45864220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
45964220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
46064220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
46164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
46264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4639c564b6cSJohn Hay 	},
4649c564b6cSJohn Hay 
46564220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
46664220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
46764220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
46864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
46964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4709c564b6cSJohn Hay 	},
4719c564b6cSJohn Hay 
47264220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
47364220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
47464220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
47564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4779c564b6cSJohn Hay 	},
4789c564b6cSJohn Hay 
47964220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
48064220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
48164220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
48264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
48364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4849c564b6cSJohn Hay 	},
4859c564b6cSJohn Hay 
48664220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
48764220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
48864220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
48964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
49064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4919c564b6cSJohn Hay 	},
4929c564b6cSJohn Hay 
49364220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
49464220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
49564220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
49664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
49764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
49876353f68SJohn Hay 	},
49976353f68SJohn Hay 
50064220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
50164220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
50264220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
50364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
50464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5059c564b6cSJohn Hay 	},
5069c564b6cSJohn Hay 
50764220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
50864220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
50964220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
51064220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
51164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5129c564b6cSJohn Hay 	},
5139c564b6cSJohn Hay 
514f83255a5SMax Khon 	{   0x1393, 0x1024, 0xffff, 0,
515f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102E/PCIe",
516f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
51751cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
51851cb024fSMax Khon 	    .config_function = puc_config_moxa
519f83255a5SMax Khon 	},
520f83255a5SMax Khon 
521f83255a5SMax Khon 	{   0x1393, 0x1025, 0xffff, 0,
522f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102EL/PCIe",
523f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
52451cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
52551cb024fSMax Khon 	    .config_function = puc_config_moxa
526f83255a5SMax Khon 	},
527f83255a5SMax Khon 
52864220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
52964220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
53064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
53164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5320ec6e983SJoerg Wunsch 	},
53340f01890SBruce Evans 
53464220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
53564220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
53664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
53764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5389c564b6cSJohn Hay 	},
5399c564b6cSJohn Hay 
5402c89ac5eSEitan Adler 	{   0x1393, 0x1042, 0xffff, 0,
5412c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104JU/PCI",
5422c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5432c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x18, 0, 8,
5442c89ac5eSEitan Adler 	},
5452c89ac5eSEitan Adler 
546f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
547f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
548f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
549f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
550f6a60febSMaxim Konovalov 	},
551f6a60febSMaxim Konovalov 
5522c89ac5eSEitan Adler 	{   0x1393, 0x1045, 0xffff, 0,
5532c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104EL-A/PCIe",
5542c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5552c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x14, 0, -1,
5562c89ac5eSEitan Adler 	    .config_function = puc_config_moxa
5572c89ac5eSEitan Adler 	},
5582c89ac5eSEitan Adler 
5598efbf264SJohn Baldwin 	{   0x1393, 0x1120, 0xffff, 0,
5608efbf264SJohn Baldwin 	    "Moxa Technologies, CP-112UL",
5618efbf264SJohn Baldwin 	    DEFAULT_RCLK * 8,
5628efbf264SJohn Baldwin 	    PUC_PORT_2S, 0x18, 0, 8,
5638efbf264SJohn Baldwin 	},
5648efbf264SJohn Baldwin 
56564220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
56664220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
56764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
56864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5699c564b6cSJohn Hay 	},
5709c564b6cSJohn Hay 
571f83255a5SMax Khon 	{   0x1393, 0x1144, 0xffff, 0,
572f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-114EL/PCIe",
573f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
574f83255a5SMax Khon 	    PUC_PORT_4S, 0x14, 0, -1,
575f83255a5SMax Khon 	    .config_function = puc_config_moxa
576f83255a5SMax Khon 	},
577f83255a5SMax Khon 
578f83255a5SMax Khon 	{   0x1393, 0x1182, 0xffff, 0,
579f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-118EL-A/PCIe",
580f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
58151cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
58251cb024fSMax Khon 	    .config_function = puc_config_moxa
583f83255a5SMax Khon 	},
584f83255a5SMax Khon 
58564220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
58664220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
58764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
58864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5899c564b6cSJohn Hay 	},
5909c564b6cSJohn Hay 
59164220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
59264220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
59364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
59464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5959c564b6cSJohn Hay 	},
5969c564b6cSJohn Hay 
5970db1aa0bSStanislav Sedov 	{   0x1393, 0x1682, 0xffff, 0,
5980db1aa0bSStanislav Sedov 	    "Moxa Technologies, CP-168EL/PCIe",
5990db1aa0bSStanislav Sedov 	    DEFAULT_RCLK * 8,
6000db1aa0bSStanislav Sedov 	    PUC_PORT_8S, 0x18, 0, 8,
6010db1aa0bSStanislav Sedov 	},
6020db1aa0bSStanislav Sedov 
603f83255a5SMax Khon 	{   0x1393, 0x1683, 0xffff, 0,
604f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-168EL-A/PCIe",
605f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
60651cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
60751cb024fSMax Khon 	    .config_function = puc_config_moxa
608f83255a5SMax Khon 	},
609f83255a5SMax Khon 
61022e0612fSJohn Baldwin 	{   0x13a8, 0x0152, 0xffff, 0,
61122e0612fSJohn Baldwin 	    "Exar XR17C/D152",
61222e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
61322e0612fSJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, -1,
61422e0612fSJohn Baldwin 	    .config_function = puc_config_exar
61522e0612fSJohn Baldwin 	},
61622e0612fSJohn Baldwin 
61722e0612fSJohn Baldwin 	{   0x13a8, 0x0154, 0xffff, 0,
61822e0612fSJohn Baldwin 	    "Exar XR17C154",
61922e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
62022e0612fSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, -1,
62122e0612fSJohn Baldwin 	    .config_function = puc_config_exar
62222e0612fSJohn Baldwin 	},
62322e0612fSJohn Baldwin 
62464220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
62522e0612fSJohn Baldwin 	    "Exar XR17C158",
62664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
62764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
62822e0612fSJohn Baldwin 	    .config_function = puc_config_exar
629de0d2cadSJohn Hay 	},
630de0d2cadSJohn Hay 
63179aac43eSEd Maste 	{   0x13a8, 0x0258, 0xffff, 0,
63279aac43eSEd Maste 	    "Exar XR17V258IV",
63379aac43eSEd Maste 	    DEFAULT_RCLK * 8,
63479aac43eSEd Maste 	    PUC_PORT_8S, 0x10, 0, -1,
6353aff0961SRyan Stone 	    .config_function = puc_config_exar
63679aac43eSEd Maste 	},
63779aac43eSEd Maste 
6388de2c77bSRyan Stone 	/* The XR17V358 uses the 125MHz PCIe clock as its reference clock. */
6398de2c77bSRyan Stone 	{   0x13a8, 0x0358, 0xffff, 0,
6408de2c77bSRyan Stone 	    "Exar XR17V358",
6418de2c77bSRyan Stone 	    125000000,
6428de2c77bSRyan Stone 	    PUC_PORT_8S, 0x10, 0, -1,
6438de2c77bSRyan Stone 	    .config_function = puc_config_exar_pcie
6448de2c77bSRyan Stone 	},
6458de2c77bSRyan Stone 
6465bcc8e2fSEitan Adler 	{   0x13fe, 0x1600, 0x1602, 0x0002,
6475bcc8e2fSEitan Adler 	    "Advantech PCI-1602",
6485bcc8e2fSEitan Adler 	    DEFAULT_RCLK * 8,
6495bcc8e2fSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
6505bcc8e2fSEitan Adler 	},
6515bcc8e2fSEitan Adler 
65264220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
65364220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
65464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
65564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6569c564b6cSJohn Hay 	},
6579c564b6cSJohn Hay 
65864220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
65964220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
66064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
66164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6629c564b6cSJohn Hay 	},
6639c564b6cSJohn Hay 
66464220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
66564220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
66664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
66764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6689c564b6cSJohn Hay 	},
6699c564b6cSJohn Hay 
67064220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
67164220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
67264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
67364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6749c564b6cSJohn Hay 	},
67564220a7eSMarcel Moolenaar 
67664220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
67764220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
67864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
67964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
68064220a7eSMarcel Moolenaar 	},
68164220a7eSMarcel Moolenaar 
68264220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
68364220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
68464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
68564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
68664220a7eSMarcel Moolenaar 	},
68764220a7eSMarcel Moolenaar 
68864220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
68964220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
69064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
69164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
69264220a7eSMarcel Moolenaar 	},
69364220a7eSMarcel Moolenaar 
69413ae6dceSKevin Lo 	{   0x1409, 0x7268, 0xffff, 0,
69513ae6dceSKevin Lo 	    "Sunix SUN1888",
69613ae6dceSKevin Lo 	    0,
69713ae6dceSKevin Lo 	    PUC_PORT_2P, 0x10, 0, 8,
69813ae6dceSKevin Lo 	},
69913ae6dceSKevin Lo 
70064220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
70164220a7eSMarcel Moolenaar 	    NULL,
70264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
70364220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
70464220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
7059c564b6cSJohn Hay 	},
7069c564b6cSJohn Hay 
7079c564b6cSJohn Hay 	/*
7089c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
7099c564b6cSJohn Hay 	 *
7109c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
7116e9f075aSJohn Baldwin 	 * <URL:http://www.plxtech.com/products/uart/>
7129c564b6cSJohn Hay 	 *
7139c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
7149c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
7159c564b6cSJohn Hay 	 */
716acdfc36aSEitan Adler 	{
717acdfc36aSEitan Adler 	    0x1415, 0x9501, 0x10fc, 0xc070,
718acdfc36aSEitan Adler 	    "I-O DATA RSA-PCI2/R",
719acdfc36aSEitan Adler 	    DEFAULT_RCLK * 8,
720acdfc36aSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
721acdfc36aSEitan Adler 	},
7229c564b6cSJohn Hay 
7230db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
7240db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
7250db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
7260db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
7270db885bbSDag-Erling Smørgrav 	},
7280db885bbSDag-Erling Smørgrav 
7291d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
7301d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
7311d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
7321d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
7331d860a7eSMarcel Moolenaar 	},
7341d860a7eSMarcel Moolenaar 
73530ced0d8SJohn Baldwin 	{   0x1415, 0x9501, 0x131f, 0x2052,
73630ced0d8SJohn Baldwin 	    "SIIG Quartet Serial 850",
73730ced0d8SJohn Baldwin 	    DEFAULT_RCLK * 10,
73830ced0d8SJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
73930ced0d8SJohn Baldwin 	},
74030ced0d8SJohn Baldwin 
741282211eaSJohn Baldwin 	{   0x1415, 0x9501, 0x14db, 0x2150,
742282211eaSJohn Baldwin 	    "Kuroutoshikou SERIAL4P-LPPCI2",
743282211eaSJohn Baldwin 	    DEFAULT_RCLK * 10,
744282211eaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
745282211eaSJohn Baldwin 	},
746282211eaSJohn Baldwin 
74764220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
748c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
749d5e0798eSMarius Strobl 	    0,
75064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
751d5e0798eSMarius Strobl 	    .config_function = puc_config_oxford_pci954
75283431653SWarner Losh 	},
75383431653SWarner Losh 
75410414b71SJohn Baldwin 	{   0x1415, 0x950a, 0x131f, 0x2030,
75510414b71SJohn Baldwin 	    "SIIG Cyber 2S PCIe",
75610414b71SJohn Baldwin 	    DEFAULT_RCLK * 10,
75710414b71SJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, 8,
75810414b71SJohn Baldwin 	},
75910414b71SJohn Baldwin 
7600dfbbaceSEitan Adler 	{   0x1415, 0x950a, 0x131f, 0x2032,
7610dfbbaceSEitan Adler 	    "SIIG Cyber Serial Dual PCI 16C850",
7620dfbbaceSEitan Adler 	    DEFAULT_RCLK * 10,
7630dfbbaceSEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
7640dfbbaceSEitan Adler 	},
7650dfbbaceSEitan Adler 
76664220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
767c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
768c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
76964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
7709c564b6cSJohn Hay 	},
7719c564b6cSJohn Hay 
77264220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
77364220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
77464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
77564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
77643e42f36SDoug Ambrisko 	},
77743e42f36SDoug Ambrisko 
77864220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
77964220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
78064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
78164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7826cb38a02SDoug Ambrisko 	},
7836cb38a02SDoug Ambrisko 
78411a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
78511a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
78600ff5de5SMarius Strobl 	    DEFAULT_RCLK,
78711a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
78811a12794SRoman Kurakin 	},
78911a12794SRoman Kurakin 
790f09d9fbaSJohn Baldwin 	/*
791f09d9fbaSJohn Baldwin 	 * Perle boards use Oxford Semiconductor chips, but they store the
792f09d9fbaSJohn Baldwin 	 * Oxford Semiconductor device ID as a subvendor device ID and use
793f09d9fbaSJohn Baldwin 	 * their own device IDs.
794f09d9fbaSJohn Baldwin 	 */
795f09d9fbaSJohn Baldwin 
796f09d9fbaSJohn Baldwin 	{   0x155f, 0x0331, 0xffff, 0,
797edfaa737SEitan Adler 	    "Perle Ultraport4 Express",
798edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
799edfaa737SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
800edfaa737SEitan Adler 	},
801edfaa737SEitan Adler 
802edfaa737SEitan Adler 	{   0x155f, 0xB012, 0xffff, 0,
803edfaa737SEitan Adler 	    "Perle Speed2 LE",
804edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
805edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
806edfaa737SEitan Adler 	},
807edfaa737SEitan Adler 
808edfaa737SEitan Adler 	{   0x155f, 0xB022, 0xffff, 0,
809edfaa737SEitan Adler 	    "Perle Speed2 LE",
810edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
811edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
812edfaa737SEitan Adler 	},
813edfaa737SEitan Adler 
814edfaa737SEitan Adler 	{   0x155f, 0xB004, 0xffff, 0,
815f09d9fbaSJohn Baldwin 	    "Perle Speed4 LE",
816f09d9fbaSJohn Baldwin 	    DEFAULT_RCLK * 8,
817f09d9fbaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
818f09d9fbaSJohn Baldwin 	},
819f09d9fbaSJohn Baldwin 
820edfaa737SEitan Adler 	{   0x155f, 0xB008, 0xffff, 0,
821edfaa737SEitan Adler 	    "Perle Speed8 LE",
822edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
823edfaa737SEitan Adler 	    PUC_PORT_8S, 0x10, 0, 8,
824edfaa737SEitan Adler 	},
825edfaa737SEitan Adler 
826edfaa737SEitan Adler 
8276e9f075aSJohn Baldwin 	/*
8286e9f075aSJohn Baldwin 	 * Oxford Semiconductor PCI Express Expresso family
8296e9f075aSJohn Baldwin 	 *
8306e9f075aSJohn Baldwin 	 * Found in many 'native' PCI Express serial boards such as:
8316e9f075aSJohn Baldwin 	 *
8326e9f075aSJohn Baldwin 	 * eMegatech MP954ER4 (4 port) and MP958ER8 (8 port)
8336e9f075aSJohn Baldwin 	 * <URL:http://www.emegatech.com.tw/pdrs232pcie.html>
8346e9f075aSJohn Baldwin 	 *
8356e9f075aSJohn Baldwin 	 * Lindy 51189 (4 port)
8366e9f075aSJohn Baldwin 	 * <URL:http://www.lindy.com> <URL:http://tinyurl.com/lindy-51189>
8376e9f075aSJohn Baldwin 	 *
8386e9f075aSJohn Baldwin 	 * StarTech.com PEX4S952 (4 port) and PEX8S952 (8 port)
8396e9f075aSJohn Baldwin 	 * <URL:http://www.startech.com>
8406e9f075aSJohn Baldwin 	 */
8416e9f075aSJohn Baldwin 
842*bdb4291fSRui Paulo 	{   0x1415, 0xc11b, 0xffff, 0,
843*bdb4291fSRui Paulo             "Oxford Semiconductor OXPCIe952 1S1P",
844*bdb4291fSRui Paulo             DEFAULT_RCLK * 0x22,
845*bdb4291fSRui Paulo             PUC_PORT_NONSTANDARD, 0x10, 0, -1,
846*bdb4291fSRui Paulo 	    .config_function = puc_config_oxford_pcie
847*bdb4291fSRui Paulo 	},
848*bdb4291fSRui Paulo 
849a6a64612SAndrey V. Elsukov 	{   0x1415, 0xc138, 0xffff, 0,
850a6a64612SAndrey V. Elsukov 	    "Oxford Semiconductor OXPCIe952 UARTs",
851a6a64612SAndrey V. Elsukov 	    DEFAULT_RCLK * 0x22,
852a6a64612SAndrey V. Elsukov 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
853a6a64612SAndrey V. Elsukov 	    .config_function = puc_config_oxford_pcie
854a6a64612SAndrey V. Elsukov 	},
855a6a64612SAndrey V. Elsukov 
8566e9f075aSJohn Baldwin 	{   0x1415, 0xc158, 0xffff, 0,
8576e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs",
8586e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8596e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8606e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8616e9f075aSJohn Baldwin 	},
8626e9f075aSJohn Baldwin 
8636e9f075aSJohn Baldwin 	{   0x1415, 0xc15d, 0xffff, 0,
8646e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs (function 1)",
8656e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8666e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8676e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8686e9f075aSJohn Baldwin 	},
8696e9f075aSJohn Baldwin 
8706e9f075aSJohn Baldwin 	{   0x1415, 0xc208, 0xffff, 0,
8716e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs",
8726e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8736e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8746e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8756e9f075aSJohn Baldwin 	},
8766e9f075aSJohn Baldwin 
8776e9f075aSJohn Baldwin 	{   0x1415, 0xc20d, 0xffff, 0,
8786e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs (function 1)",
8796e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8806e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8816e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8826e9f075aSJohn Baldwin 	},
8836e9f075aSJohn Baldwin 
8846e9f075aSJohn Baldwin 	{   0x1415, 0xc308, 0xffff, 0,
8856e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs",
8866e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8876e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8886e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8896e9f075aSJohn Baldwin 	},
8906e9f075aSJohn Baldwin 
8916e9f075aSJohn Baldwin 	{   0x1415, 0xc30d, 0xffff, 0,
8926e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs (function 1)",
8936e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8946e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8956e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8966e9f075aSJohn Baldwin 	},
8976e9f075aSJohn Baldwin 
89846ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
89946ce58c7SAndrew Thompson 	    "VScom PCI-100L",
90046ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
90146ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
90246ce58c7SAndrew Thompson 	},
90346ce58c7SAndrew Thompson 
90464220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
90564220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
90664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
90764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
908a58deb46SColin Percival 	},
909a58deb46SColin Percival 
91064220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
91146dd877dSPoul-Henning Kamp 	    "VScom 200Li",
91264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
91364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
91446dd877dSPoul-Henning Kamp 	},
9153e19d3c0SBruce M Simpson 
91664220a7eSMarcel Moolenaar 	/*
91764220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
91864220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
91964220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
92064220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
92164220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
92264220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
92364220a7eSMarcel Moolenaar 	 * access the external UARTs.
92464220a7eSMarcel Moolenaar 	 */
92564220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
92664220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
92764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
92864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
92964220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
93064220a7eSMarcel Moolenaar 	},
93164220a7eSMarcel Moolenaar 
93264220a7eSMarcel Moolenaar 	/*
93364220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
93464220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
93564220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
93664220a7eSMarcel Moolenaar 	 */
93764220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
93864220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
93964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
94064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
94164220a7eSMarcel Moolenaar 	},
94200ff5de5SMarius Strobl 
94364220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
94464220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
94564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
94664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
94764220a7eSMarcel Moolenaar 	},
94864220a7eSMarcel Moolenaar 
94964220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
95064220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
95164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
95264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
95364220a7eSMarcel Moolenaar 	},
95464220a7eSMarcel Moolenaar 
95564220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
95664220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
95764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
95864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
95964220a7eSMarcel Moolenaar 	},
96064220a7eSMarcel Moolenaar 
96164589ec8SEitan Adler 	{   0x14d2, 0xa007, 0xffff, 0,
96264589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
96364589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
96464589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
96564589ec8SEitan Adler 	},
96664589ec8SEitan Adler 
96764589ec8SEitan Adler 	{   0x14d2, 0xa008, 0xffff, 0,
96864589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
96964589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
97064589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
97164589ec8SEitan Adler 	},
97264589ec8SEitan Adler 
97364220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
97464220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
97564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
97664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
97764220a7eSMarcel Moolenaar 	},
97864220a7eSMarcel Moolenaar 
97964220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
98064220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
98164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
98264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
98364220a7eSMarcel Moolenaar 	},
98464220a7eSMarcel Moolenaar 
9850dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
9860dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
9870dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
9880dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
9890dc908e7SAndrew Thompson 	},
9900dc908e7SAndrew Thompson 
99164220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
99264220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
99364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
99464220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
99564220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
99664220a7eSMarcel Moolenaar 	},
99764220a7eSMarcel Moolenaar 
99850c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0002,
99950c0e894SMarius Strobl 	    "Sunix SER5xxxx 2-port serial",
10007501345eSJohn Hay 	    DEFAULT_RCLK * 8,
10017501345eSJohn Hay 	    PUC_PORT_2S, 0x10, 0, 8,
10027501345eSJohn Hay 	},
10037501345eSJohn Hay 
100450c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0004,
100550c0e894SMarius Strobl 	    "Sunix SER5xxxx 4-port serial",
100650c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
100750c0e894SMarius Strobl 	    PUC_PORT_4S, 0x10, 0, 8,
100850c0e894SMarius Strobl 	},
100950c0e894SMarius Strobl 
101050c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0008,
101150c0e894SMarius Strobl 	    "Sunix SER5xxxx 8-port serial",
101250c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
101350c0e894SMarius Strobl 	    PUC_PORT_8S, -1, -1, -1,
101450c0e894SMarius Strobl 	    .config_function = puc_config_sunix
101550c0e894SMarius Strobl 	},
101650c0e894SMarius Strobl 
101750c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0101,
101850c0e894SMarius Strobl 	    "Sunix MIO5xxxx 1-port serial and 1284 Printer port",
101950c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
102050c0e894SMarius Strobl 	    PUC_PORT_1S1P, -1, -1, -1,
102150c0e894SMarius Strobl 	    .config_function = puc_config_sunix
102250c0e894SMarius Strobl 	},
102350c0e894SMarius Strobl 
102450c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0102,
102510bcada8SMarius Strobl 	    "Sunix MIO5xxxx 2-port serial and 1284 Printer port",
102650c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
102750c0e894SMarius Strobl 	    PUC_PORT_2S1P, -1, -1, -1,
102850c0e894SMarius Strobl 	    .config_function = puc_config_sunix
102950c0e894SMarius Strobl 	},
103050c0e894SMarius Strobl 
103150c0e894SMarius Strobl 	{   0x1fd4, 0x1999, 0x1fd4, 0x0104,
103250c0e894SMarius Strobl 	    "Sunix MIO5xxxx 4-port serial and 1284 Printer port",
103350c0e894SMarius Strobl 	    DEFAULT_RCLK * 8,
103450c0e894SMarius Strobl 	    PUC_PORT_4S1P, -1, -1, -1,
103550c0e894SMarius Strobl 	    .config_function = puc_config_sunix
103650c0e894SMarius Strobl 	},
103750c0e894SMarius Strobl 
1038d9b73ea9SEitan Adler 	{   0x5372, 0x6873, 0xffff, 0,
1039d9b73ea9SEitan Adler 	    "Sun 1040 PCI Quad Serial",
1040d9b73ea9SEitan Adler 	    DEFAULT_RCLK,
1041d9b73ea9SEitan Adler 	    PUC_PORT_4S, 0x10, 4, 0,
1042d9b73ea9SEitan Adler 	},
1043d9b73ea9SEitan Adler 
104464220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
104564220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
104664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
104764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
104864220a7eSMarcel Moolenaar 	},
104964220a7eSMarcel Moolenaar 
1050858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
1051858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
1052858030c4SAndrew Thompson 	    DEFAULT_RCLK,
1053858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
1054858030c4SAndrew Thompson 	},
1055858030c4SAndrew Thompson 
105664220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
105764220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
105864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
105964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
106064220a7eSMarcel Moolenaar 	},
106164220a7eSMarcel Moolenaar 
106264220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
106364220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
106464220a7eSMarcel Moolenaar 	    0,
106564220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
106664220a7eSMarcel Moolenaar 	},
106764220a7eSMarcel Moolenaar 
1068843994aeSJohn Baldwin 	/*
106950c0e894SMarius Strobl 	 * This is more specific than the generic NM9835 entry, and is placed
107050c0e894SMarius Strobl 	 * here to _prevent_ puc(4) from claiming this single port card.
1071843994aeSJohn Baldwin 	 *
1072843994aeSJohn Baldwin 	 * uart(4) will claim this device.
1073843994aeSJohn Baldwin 	 */
1074843994aeSJohn Baldwin 	{   0x9710, 0x9835, 0x1000, 1,
1075843994aeSJohn Baldwin 	    "NetMos NM9835 based 1-port serial",
1076843994aeSJohn Baldwin 	    DEFAULT_RCLK,
1077843994aeSJohn Baldwin 	    PUC_PORT_1S, 0x10, 4, 0,
1078843994aeSJohn Baldwin 	},
1079843994aeSJohn Baldwin 
1080045de714SNavdeep Parhar 	{   0x9710, 0x9835, 0x1000, 2,
1081045de714SNavdeep Parhar 	    "NetMos NM9835 based 2-port serial",
1082045de714SNavdeep Parhar 	    DEFAULT_RCLK,
1083045de714SNavdeep Parhar 	    PUC_PORT_2S, 0x10, 4, 0,
1084045de714SNavdeep Parhar 	},
1085045de714SNavdeep Parhar 
108664220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
108764220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
108864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
108964220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
109064220a7eSMarcel Moolenaar 	},
109164220a7eSMarcel Moolenaar 
109264220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
109364220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
109464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
109564220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
109664220a7eSMarcel Moolenaar 	},
109764220a7eSMarcel Moolenaar 
109864220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
109964220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
110064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
110164220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
11021d864e0dSMarcel Moolenaar 	},
11031d864e0dSMarcel Moolenaar 
11041d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3002,
11051d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART",
11061d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11071d864e0dSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
11081d864e0dSMarcel Moolenaar 	},
11091d864e0dSMarcel Moolenaar 
11101d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3003,
11111d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Triple UART",
11121d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11131d864e0dSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 4, 0,
11141d864e0dSMarcel Moolenaar 	},
11151d864e0dSMarcel Moolenaar 
11161d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3004,
11171d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Quad UART",
11181d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
111900ff5de5SMarius Strobl 	    PUC_PORT_4S, 0x10, 4, 0,
11201d864e0dSMarcel Moolenaar 	},
11211d864e0dSMarcel Moolenaar 
11221d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3011,
11231d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Single UART and 1284 Printer port",
11241d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11251d864e0dSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
11261d864e0dSMarcel Moolenaar 	},
11271d864e0dSMarcel Moolenaar 
11281d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3012,
11291d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART and 1284 Printer port",
11301d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11311d864e0dSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
11321d864e0dSMarcel Moolenaar 	},
11331d864e0dSMarcel Moolenaar 
11341d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3020,
11351d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual 1284 Printer port",
11361d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
11371d864e0dSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 4, 0,
113864220a7eSMarcel Moolenaar 	},
113964220a7eSMarcel Moolenaar 
114064220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
114164220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
114264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
114364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
114464220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
114564220a7eSMarcel Moolenaar 	},
114664220a7eSMarcel Moolenaar 
114764220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
114864220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
114964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
115064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
115164220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
115264220a7eSMarcel Moolenaar 	},
115364220a7eSMarcel Moolenaar 
115464220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
115564220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
115664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
115764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
115864220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
115964220a7eSMarcel Moolenaar 	},
116064220a7eSMarcel Moolenaar 
116164220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
116264220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
116364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
116464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
116564220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
116664220a7eSMarcel Moolenaar 	},
116764220a7eSMarcel Moolenaar 
116864220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
116964220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
117064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
117164220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
117264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
117364220a7eSMarcel Moolenaar 	},
117464220a7eSMarcel Moolenaar 
117564220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
117664220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
117764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
117864220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
117964220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
118064220a7eSMarcel Moolenaar 	},
118164220a7eSMarcel Moolenaar 
118264220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
118364220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
118464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
118564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
118664220a7eSMarcel Moolenaar 	},
118764220a7eSMarcel Moolenaar 
118864220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
118964220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
119064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
119164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
119264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
119364220a7eSMarcel Moolenaar 	},
119464220a7eSMarcel Moolenaar 
119564220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
11969c564b6cSJohn Hay };
119764220a7eSMarcel Moolenaar 
119864220a7eSMarcel Moolenaar static int
119964220a7eSMarcel Moolenaar puc_config_amc(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
120064220a7eSMarcel Moolenaar     intptr_t *res)
120164220a7eSMarcel Moolenaar {
120264220a7eSMarcel Moolenaar 	switch (cmd) {
120364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
120464220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
120564220a7eSMarcel Moolenaar 		return (0);
120664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
120764220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
120864220a7eSMarcel Moolenaar 		return (0);
120964220a7eSMarcel Moolenaar 	default:
121064220a7eSMarcel Moolenaar 		break;
121164220a7eSMarcel Moolenaar 	}
121264220a7eSMarcel Moolenaar 	return (ENXIO);
121364220a7eSMarcel Moolenaar }
121464220a7eSMarcel Moolenaar 
121564220a7eSMarcel Moolenaar static int
121664220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
121764220a7eSMarcel Moolenaar     intptr_t *res)
121864220a7eSMarcel Moolenaar {
121964220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
122064220a7eSMarcel Moolenaar 
122164220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
122264220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
122364220a7eSMarcel Moolenaar 			port <<= 1;
122464220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
122564220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
122664220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
122764220a7eSMarcel Moolenaar 		return (0);
122864220a7eSMarcel Moolenaar 	}
122964220a7eSMarcel Moolenaar 	return (ENXIO);
123064220a7eSMarcel Moolenaar }
123164220a7eSMarcel Moolenaar 
123264220a7eSMarcel Moolenaar static int
123322e0612fSJohn Baldwin puc_config_exar(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
123422e0612fSJohn Baldwin     intptr_t *res)
123522e0612fSJohn Baldwin {
123622e0612fSJohn Baldwin 	if (cmd == PUC_CFG_GET_OFS) {
123722e0612fSJohn Baldwin 		*res = port * 0x200;
123822e0612fSJohn Baldwin 		return (0);
123922e0612fSJohn Baldwin 	}
124022e0612fSJohn Baldwin 	return (ENXIO);
124122e0612fSJohn Baldwin }
124222e0612fSJohn Baldwin 
124322e0612fSJohn Baldwin static int
12448de2c77bSRyan Stone puc_config_exar_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
12458de2c77bSRyan Stone     intptr_t *res)
12468de2c77bSRyan Stone {
12478de2c77bSRyan Stone 	if (cmd == PUC_CFG_GET_OFS) {
12488de2c77bSRyan Stone 		*res = port * 0x400;
12498de2c77bSRyan Stone 		return (0);
12508de2c77bSRyan Stone 	}
12518de2c77bSRyan Stone 	return (ENXIO);
12528de2c77bSRyan Stone }
12538de2c77bSRyan Stone 
12548de2c77bSRyan Stone static int
125564220a7eSMarcel Moolenaar puc_config_icbook(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
125664220a7eSMarcel Moolenaar     intptr_t *res)
125764220a7eSMarcel Moolenaar {
125864220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
125964220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
126064220a7eSMarcel Moolenaar 		return (0);
126164220a7eSMarcel Moolenaar 	}
126264220a7eSMarcel Moolenaar 	return (ENXIO);
126364220a7eSMarcel Moolenaar }
126464220a7eSMarcel Moolenaar 
126564220a7eSMarcel Moolenaar static int
12662c89ac5eSEitan Adler puc_config_moxa(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
12672c89ac5eSEitan Adler     intptr_t *res)
12682c89ac5eSEitan Adler {
1269f83255a5SMax Khon 	if (cmd == PUC_CFG_GET_OFS) {
127051cb024fSMax Khon 		const struct puc_cfg *cfg = sc->sc_cfg;
127151cb024fSMax Khon 
127251cb024fSMax Khon 		if (port == 3 && (cfg->device == 0x1045 || cfg->device == 0x1144))
127351cb024fSMax Khon 			port = 7;
127451cb024fSMax Khon 		*res = port * 0x200;
127551cb024fSMax Khon 
12762c89ac5eSEitan Adler 		return 0;
12772c89ac5eSEitan Adler 	}
12782c89ac5eSEitan Adler 	return (ENXIO);
12792c89ac5eSEitan Adler }
12802c89ac5eSEitan Adler 
12812c89ac5eSEitan Adler static int
128264220a7eSMarcel Moolenaar puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
128364220a7eSMarcel Moolenaar     intptr_t *res)
128464220a7eSMarcel Moolenaar {
128564220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
128664220a7eSMarcel Moolenaar 	struct puc_bar *bar;
128764220a7eSMarcel Moolenaar 	uint8_t v0, v1;
128864220a7eSMarcel Moolenaar 
128964220a7eSMarcel Moolenaar 	switch (cmd) {
129064220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
129164220a7eSMarcel Moolenaar 		/*
129264220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
129364220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
129464220a7eSMarcel Moolenaar 		 */
129564220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
129664220a7eSMarcel Moolenaar 		if (bar == NULL)
129764220a7eSMarcel Moolenaar 			return (ENXIO);
129864220a7eSMarcel Moolenaar 		/* Set DLAB in the LCR register of UART 0. */
129964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0x80);
130064220a7eSMarcel Moolenaar 		/* Write 0 to the SPR register of UART 0. */
130164220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0);
130264220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
130364220a7eSMarcel Moolenaar 		v0 = bus_read_1(bar->b_res, 7);
130464220a7eSMarcel Moolenaar 		/* Write a specific value to the SPR register of UART 0. */
130564220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0x80 + -cfg->clock);
130664220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
130764220a7eSMarcel Moolenaar 		v1 = bus_read_1(bar->b_res, 7);
130864220a7eSMarcel Moolenaar 		/* Clear DLAB in the LCR register of UART 0. */
130964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0);
131064220a7eSMarcel Moolenaar 		/* Save the two values read-back from the SPR register. */
131164220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
131264220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
131364220a7eSMarcel Moolenaar 			/*
131464220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
131564220a7eSMarcel Moolenaar 			 * by us. This means that the SPAD jumper is set.
131664220a7eSMarcel Moolenaar 			 */
131764220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
131864220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
131964220a7eSMarcel Moolenaar 			return (0);
132064220a7eSMarcel Moolenaar 		}
132164220a7eSMarcel Moolenaar 		if (v0 != 0) {
132264220a7eSMarcel Moolenaar 			/*
132364220a7eSMarcel Moolenaar 			 * The first value doesn't match. This can only mean
132464220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
132564220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
132664220a7eSMarcel Moolenaar 			 */
132764220a7eSMarcel Moolenaar 			if (bootverbose)
132864220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
132964220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
133064220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
133164220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
133264220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
133364220a7eSMarcel Moolenaar 				    "setting\n");
133464220a7eSMarcel Moolenaar 			return (0);
133564220a7eSMarcel Moolenaar 		}
133664220a7eSMarcel Moolenaar 		/*
133764220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't. We know
133864220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set. We also know that the
133964220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
134064220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
134164220a7eSMarcel Moolenaar 		 */
134264220a7eSMarcel Moolenaar 		if (bootverbose)
134364220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
134464220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
134564220a7eSMarcel Moolenaar 		return (0);
134664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
134764220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
134864220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
134964220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
135064220a7eSMarcel Moolenaar 			/*
135164220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
135264220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
135364220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed. Let's hope
135464220a7eSMarcel Moolenaar 			 * not...
135564220a7eSMarcel Moolenaar 			 */
135664220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
135764220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
135864220a7eSMarcel Moolenaar 			/*
135964220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
136064220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
136164220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
136264220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
136364220a7eSMarcel Moolenaar 			 */
136464220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
136564220a7eSMarcel Moolenaar 		} else
136664220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
136764220a7eSMarcel Moolenaar 		return (0);
136864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
136964220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
137064220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
137164220a7eSMarcel Moolenaar 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock)
137264220a7eSMarcel Moolenaar 		    ? PUC_ILR_NONE : PUC_ILR_QUATECH;
137364220a7eSMarcel Moolenaar 		return (0);
137464220a7eSMarcel Moolenaar 	default:
137564220a7eSMarcel Moolenaar 		break;
137664220a7eSMarcel Moolenaar 	}
137764220a7eSMarcel Moolenaar 	return (ENXIO);
137864220a7eSMarcel Moolenaar }
137964220a7eSMarcel Moolenaar 
138064220a7eSMarcel Moolenaar static int
138164220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
138264220a7eSMarcel Moolenaar     intptr_t *res)
138364220a7eSMarcel Moolenaar {
138464220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
138564220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
138664220a7eSMarcel Moolenaar 	struct puc_bar *bar;
138764220a7eSMarcel Moolenaar 	int efir, idx, ofs;
138864220a7eSMarcel Moolenaar 	uint8_t v;
138964220a7eSMarcel Moolenaar 
139064220a7eSMarcel Moolenaar 	switch (cmd) {
139164220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
139264220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
139364220a7eSMarcel Moolenaar 		if (bar == NULL)
139464220a7eSMarcel Moolenaar 			return (ENXIO);
139564220a7eSMarcel Moolenaar 
139664220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
139764220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
139864220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
139964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
140064220a7eSMarcel Moolenaar 		idx = 0;
140164220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
140264220a7eSMarcel Moolenaar 			efir = base[idx];
140364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
140464220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
140564220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
140664220a7eSMarcel Moolenaar 				return (ENXIO);
140764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
140864220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
140964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
141064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
141164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
141264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
141364220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
141464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
141564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
141664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
141764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
141864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
141964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
142064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
142164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
142264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
142364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
142464220a7eSMarcel Moolenaar 			idx++;
142564220a7eSMarcel Moolenaar 		}
142664220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
142764220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
142864220a7eSMarcel Moolenaar 		return (0);
142964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
143064220a7eSMarcel Moolenaar 		switch (port) {
143164220a7eSMarcel Moolenaar 		case 0:
143264220a7eSMarcel Moolenaar 			*res = 0x2f8;
143364220a7eSMarcel Moolenaar 			return (0);
143464220a7eSMarcel Moolenaar 		case 1:
143564220a7eSMarcel Moolenaar 			*res = 0x2e8;
143664220a7eSMarcel Moolenaar 			return (0);
143764220a7eSMarcel Moolenaar 		case 2:
143864220a7eSMarcel Moolenaar 			*res = 0x3f8;
143964220a7eSMarcel Moolenaar 			return (0);
144064220a7eSMarcel Moolenaar 		case 3:
144164220a7eSMarcel Moolenaar 			*res = 0x3e8;
144264220a7eSMarcel Moolenaar 			return (0);
144364220a7eSMarcel Moolenaar 		case 4:
144464220a7eSMarcel Moolenaar 			*res = 0x278;
144564220a7eSMarcel Moolenaar 			return (0);
144664220a7eSMarcel Moolenaar 		}
144764220a7eSMarcel Moolenaar 		break;
144864220a7eSMarcel Moolenaar 	default:
144964220a7eSMarcel Moolenaar 		break;
145064220a7eSMarcel Moolenaar 	}
145164220a7eSMarcel Moolenaar 	return (ENXIO);
145264220a7eSMarcel Moolenaar }
145364220a7eSMarcel Moolenaar 
145464220a7eSMarcel Moolenaar static int
145564220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
145664220a7eSMarcel Moolenaar     intptr_t *res)
145764220a7eSMarcel Moolenaar {
145864220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
145964220a7eSMarcel Moolenaar 
146064220a7eSMarcel Moolenaar 	switch (cmd) {
146164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
146264220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
146364220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
146464220a7eSMarcel Moolenaar 			return (0);
146564220a7eSMarcel Moolenaar 		}
146664220a7eSMarcel Moolenaar 		break;
146764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
146864220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
146964220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
147064220a7eSMarcel Moolenaar 			return (0);
147164220a7eSMarcel Moolenaar 		}
147264220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
147364220a7eSMarcel Moolenaar 			switch (port) {
147464220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
147564220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
147664220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
147764220a7eSMarcel Moolenaar 			}
147864220a7eSMarcel Moolenaar 		}
147964220a7eSMarcel Moolenaar 		break;
148064220a7eSMarcel Moolenaar 	default:
148164220a7eSMarcel Moolenaar 		break;
148264220a7eSMarcel Moolenaar 	}
148364220a7eSMarcel Moolenaar 	return (ENXIO);
148464220a7eSMarcel Moolenaar }
148564220a7eSMarcel Moolenaar 
148664220a7eSMarcel Moolenaar static int
148764220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
148864220a7eSMarcel Moolenaar     intptr_t *res)
148964220a7eSMarcel Moolenaar {
149000ff5de5SMarius Strobl 	static const uint16_t dual[] = {
149164220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
149264220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
149364220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
149464220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
149564220a7eSMarcel Moolenaar 	    0xD079, 0
149664220a7eSMarcel Moolenaar 	};
149700ff5de5SMarius Strobl 	static const uint16_t quad[] = {
149864220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
149964220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
150064220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
150164220a7eSMarcel Moolenaar 	    0xB157, 0
150264220a7eSMarcel Moolenaar 	};
150300ff5de5SMarius Strobl 	static const uint16_t octa[] = {
150464220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
150564220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
150664220a7eSMarcel Moolenaar 	};
150700ff5de5SMarius Strobl 	static const struct {
150864220a7eSMarcel Moolenaar 		int ports;
150900ff5de5SMarius Strobl 		const uint16_t *ids;
151064220a7eSMarcel Moolenaar 	} subdevs[] = {
151164220a7eSMarcel Moolenaar 	    { 2, dual },
151264220a7eSMarcel Moolenaar 	    { 4, quad },
151364220a7eSMarcel Moolenaar 	    { 8, octa },
151464220a7eSMarcel Moolenaar 	    { 0, NULL }
151564220a7eSMarcel Moolenaar 	};
151664220a7eSMarcel Moolenaar 	static char desc[64];
151764220a7eSMarcel Moolenaar 	int dev, id;
151864220a7eSMarcel Moolenaar 	uint16_t subdev;
151964220a7eSMarcel Moolenaar 
152064220a7eSMarcel Moolenaar 	switch (cmd) {
15219c418f51SJohn Baldwin 	case PUC_CFG_GET_CLOCK:
15229c418f51SJohn Baldwin 		if (port < 2)
15239c418f51SJohn Baldwin 			*res = DEFAULT_RCLK * 8;
15249c418f51SJohn Baldwin 		else
15259c418f51SJohn Baldwin 			*res = DEFAULT_RCLK;
15269c418f51SJohn Baldwin 		return (0);
152764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
152864220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
152964220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
153064220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
153164220a7eSMarcel Moolenaar 		return (0);
153264220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
153364220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
153464220a7eSMarcel Moolenaar 		dev = 0;
153564220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
153664220a7eSMarcel Moolenaar 			id = 0;
153764220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
153864220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
153964220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
154064220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
154164220a7eSMarcel Moolenaar 					return (0);
154264220a7eSMarcel Moolenaar 				}
154364220a7eSMarcel Moolenaar 				id++;
154464220a7eSMarcel Moolenaar 			}
154564220a7eSMarcel Moolenaar 			dev++;
154664220a7eSMarcel Moolenaar 		}
154764220a7eSMarcel Moolenaar 		return (ENXIO);
154864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
154964220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
155064220a7eSMarcel Moolenaar 		return (0);
155164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
1552c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
155364220a7eSMarcel Moolenaar 		return (0);
155464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
155564220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
155664220a7eSMarcel Moolenaar 		return (0);
155764220a7eSMarcel Moolenaar 	default:
155864220a7eSMarcel Moolenaar 		break;
155964220a7eSMarcel Moolenaar 	}
156064220a7eSMarcel Moolenaar 	return (ENXIO);
156164220a7eSMarcel Moolenaar }
156264220a7eSMarcel Moolenaar 
156364220a7eSMarcel Moolenaar static int
1564d5e0798eSMarius Strobl puc_config_oxford_pci954(struct puc_softc *sc, enum puc_cfg_cmd cmd,
1565d5e0798eSMarius Strobl     int port __unused, intptr_t *res)
1566d5e0798eSMarius Strobl {
1567d5e0798eSMarius Strobl 
1568d5e0798eSMarius Strobl 	switch (cmd) {
1569d5e0798eSMarius Strobl 	case PUC_CFG_GET_CLOCK:
1570d5e0798eSMarius Strobl 		/*
1571d5e0798eSMarius Strobl 		 * OXu16PCI954 use a 14.7456 MHz clock by default while
1572d5e0798eSMarius Strobl 		 * OX16PCI954 and OXm16PCI954 employ a 1.8432 MHz one.
1573d5e0798eSMarius Strobl 		 */
1574d5e0798eSMarius Strobl 		if (pci_get_revid(sc->sc_dev) == 1)
1575d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK * 8;
1576d5e0798eSMarius Strobl 		else
1577d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK;
1578d5e0798eSMarius Strobl 		return (0);
1579d5e0798eSMarius Strobl 	default:
1580d5e0798eSMarius Strobl 		break;
1581d5e0798eSMarius Strobl 	}
1582d5e0798eSMarius Strobl 	return (ENXIO);
1583d5e0798eSMarius Strobl }
1584d5e0798eSMarius Strobl 
1585d5e0798eSMarius Strobl static int
15866e9f075aSJohn Baldwin puc_config_oxford_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
15876e9f075aSJohn Baldwin     intptr_t *res)
15886e9f075aSJohn Baldwin {
15896e9f075aSJohn Baldwin 	const struct puc_cfg *cfg = sc->sc_cfg;
15906e9f075aSJohn Baldwin 	int idx;
15916e9f075aSJohn Baldwin 	struct puc_bar *bar;
15926e9f075aSJohn Baldwin 	uint8_t value;
15936e9f075aSJohn Baldwin 
15946e9f075aSJohn Baldwin 	switch (cmd) {
15956e9f075aSJohn Baldwin 	case PUC_CFG_SETUP:
15966e9f075aSJohn Baldwin 		device_printf(sc->sc_dev, "%d UARTs detected\n",
15976e9f075aSJohn Baldwin 			sc->sc_nports);
15986e9f075aSJohn Baldwin 
15996e9f075aSJohn Baldwin 		/* Set UARTs to enhanced mode */
16006e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
16016e9f075aSJohn Baldwin 		if (bar == NULL)
16026e9f075aSJohn Baldwin 			return (ENXIO);
16036e9f075aSJohn Baldwin 		for (idx = 0; idx < sc->sc_nports; idx++) {
1604a59f78daSJohn Baldwin 			value = bus_read_1(bar->b_res, 0x1000 + (idx << 9) +
1605a59f78daSJohn Baldwin 			    0x92);
16066e9f075aSJohn Baldwin 			bus_write_1(bar->b_res, 0x1000 + (idx << 9) + 0x92,
16076e9f075aSJohn Baldwin 			    value | 0x10);
16086e9f075aSJohn Baldwin 		}
16096e9f075aSJohn Baldwin 		return (0);
16106e9f075aSJohn Baldwin 	case PUC_CFG_GET_LEN:
16116e9f075aSJohn Baldwin 		*res = 0x200;
16126e9f075aSJohn Baldwin 		return (0);
16136e9f075aSJohn Baldwin 	case PUC_CFG_GET_NPORTS:
16146e9f075aSJohn Baldwin 		/*
16156e9f075aSJohn Baldwin 		 * Check if we are being called from puc_bfe_attach()
16166e9f075aSJohn Baldwin 		 * or puc_bfe_probe(). If puc_bfe_probe(), we cannot
16176e9f075aSJohn Baldwin 		 * puc_get_bar(), so we return a value of 16. This has cosmetic
16186e9f075aSJohn Baldwin 		 * side-effects at worst; in PUC_CFG_GET_DESC,
16196e9f075aSJohn Baldwin 		 * (int)sc->sc_cfg_data will not contain the true number of
16206e9f075aSJohn Baldwin 		 * ports in PUC_CFG_GET_DESC, but we are not implementing that
16216e9f075aSJohn Baldwin 		 * call for this device family anyway.
16226e9f075aSJohn Baldwin 		 *
16236e9f075aSJohn Baldwin 		 * The check is for initialisation of sc->sc_bar[idx], which is
16246e9f075aSJohn Baldwin 		 * only done in puc_bfe_attach().
16256e9f075aSJohn Baldwin 		 */
16266e9f075aSJohn Baldwin 		idx = 0;
16276e9f075aSJohn Baldwin 		do {
16286e9f075aSJohn Baldwin 			if (sc->sc_bar[idx++].b_rid != -1) {
16296e9f075aSJohn Baldwin 				sc->sc_cfg_data = 16;
16306e9f075aSJohn Baldwin 				*res = sc->sc_cfg_data;
16316e9f075aSJohn Baldwin 				return (0);
16326e9f075aSJohn Baldwin 			}
16336e9f075aSJohn Baldwin 		} while (idx < PUC_PCI_BARS);
16346e9f075aSJohn Baldwin 
16356e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
16366e9f075aSJohn Baldwin 		if (bar == NULL)
16376e9f075aSJohn Baldwin 			return (ENXIO);
16386e9f075aSJohn Baldwin 
16396e9f075aSJohn Baldwin 		value = bus_read_1(bar->b_res, 0x04);
16406e9f075aSJohn Baldwin 		if (value == 0)
16416e9f075aSJohn Baldwin 			return (ENXIO);
16426e9f075aSJohn Baldwin 
16436e9f075aSJohn Baldwin 		sc->sc_cfg_data = value;
16446e9f075aSJohn Baldwin 		*res = sc->sc_cfg_data;
16456e9f075aSJohn Baldwin 		return (0);
16466e9f075aSJohn Baldwin 	case PUC_CFG_GET_OFS:
16476e9f075aSJohn Baldwin 		*res = 0x1000 + (port << 9);
16486e9f075aSJohn Baldwin 		return (0);
16496e9f075aSJohn Baldwin 	case PUC_CFG_GET_TYPE:
16506e9f075aSJohn Baldwin 		*res = PUC_TYPE_SERIAL;
16516e9f075aSJohn Baldwin 		return (0);
16526e9f075aSJohn Baldwin 	default:
16536e9f075aSJohn Baldwin 		break;
16546e9f075aSJohn Baldwin 	}
16556e9f075aSJohn Baldwin 	return (ENXIO);
16566e9f075aSJohn Baldwin }
16576e9f075aSJohn Baldwin 
16586e9f075aSJohn Baldwin static int
165950c0e894SMarius Strobl puc_config_sunix(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
166050c0e894SMarius Strobl     intptr_t *res)
166150c0e894SMarius Strobl {
166250c0e894SMarius Strobl 	int error;
166350c0e894SMarius Strobl 
166450c0e894SMarius Strobl 	switch (cmd) {
166550c0e894SMarius Strobl 	case PUC_CFG_GET_OFS:
166650c0e894SMarius Strobl 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
166750c0e894SMarius Strobl 		if (error != 0)
166850c0e894SMarius Strobl 			return (error);
166950c0e894SMarius Strobl 		*res = (*res == PUC_TYPE_SERIAL) ? (port & 3) * 8 : 0;
167050c0e894SMarius Strobl 		return (0);
167150c0e894SMarius Strobl 	case PUC_CFG_GET_RID:
167250c0e894SMarius Strobl 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
167350c0e894SMarius Strobl 		if (error != 0)
167450c0e894SMarius Strobl 			return (error);
167550c0e894SMarius Strobl 		*res = (*res == PUC_TYPE_SERIAL && port <= 3) ? 0x10 : 0x14;
167650c0e894SMarius Strobl 		return (0);
167750c0e894SMarius Strobl 	default:
167850c0e894SMarius Strobl 		break;
167950c0e894SMarius Strobl 	}
168050c0e894SMarius Strobl 	return (ENXIO);
168150c0e894SMarius Strobl }
168250c0e894SMarius Strobl 
168350c0e894SMarius Strobl static int
168464220a7eSMarcel Moolenaar puc_config_titan(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
168564220a7eSMarcel Moolenaar     intptr_t *res)
168664220a7eSMarcel Moolenaar {
168764220a7eSMarcel Moolenaar 	switch (cmd) {
168864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
168964220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
169064220a7eSMarcel Moolenaar 		return (0);
169164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
169264220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
169364220a7eSMarcel Moolenaar 		return (0);
169464220a7eSMarcel Moolenaar 	default:
169564220a7eSMarcel Moolenaar 		break;
169664220a7eSMarcel Moolenaar 	}
169764220a7eSMarcel Moolenaar 	return (ENXIO);
169864220a7eSMarcel Moolenaar }
1699