xref: /freebsd/sys/dev/puc/pucdata.c (revision d5e0798e6dbd9a8a7a4a241483f2d18417d4fe71)
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>
399c564b6cSJohn Hay 
4064220a7eSMarcel Moolenaar #include <machine/resource.h>
41ed0b0e82SWarner Losh #include <machine/bus.h>
4264220a7eSMarcel Moolenaar #include <sys/rman.h>
4364220a7eSMarcel Moolenaar 
449c564b6cSJohn Hay #include <dev/pci/pcivar.h>
459c564b6cSJohn Hay 
4664220a7eSMarcel Moolenaar #include <dev/puc/puc_bus.h>
4764220a7eSMarcel Moolenaar #include <dev/puc/puc_cfg.h>
48482aa6a3SDavid E. O'Brien #include <dev/puc/puc_bfe.h>
499c564b6cSJohn Hay 
5064220a7eSMarcel Moolenaar static puc_config_f puc_config_amc;
5164220a7eSMarcel Moolenaar static puc_config_f puc_config_diva;
5222e0612fSJohn Baldwin static puc_config_f puc_config_exar;
538de2c77bSRyan Stone static puc_config_f puc_config_exar_pcie;
5464220a7eSMarcel Moolenaar static puc_config_f puc_config_icbook;
552c89ac5eSEitan Adler static puc_config_f puc_config_moxa;
56*d5e0798eSMarius Strobl static puc_config_f puc_config_oxford_pci954;
57a59f78daSJohn Baldwin static puc_config_f puc_config_oxford_pcie;
5864220a7eSMarcel Moolenaar static puc_config_f puc_config_quatech;
5964220a7eSMarcel Moolenaar static puc_config_f puc_config_syba;
6064220a7eSMarcel Moolenaar static puc_config_f puc_config_siig;
6164220a7eSMarcel Moolenaar static puc_config_f puc_config_timedia;
6264220a7eSMarcel Moolenaar static puc_config_f puc_config_titan;
63dc7d0deaSMarcel Moolenaar 
6464220a7eSMarcel Moolenaar const struct puc_cfg puc_pci_devices[] = {
65a27ffb41SDavid E. O'Brien 
6664220a7eSMarcel Moolenaar 	{   0x0009, 0x7168, 0xffff, 0,
6764220a7eSMarcel Moolenaar 	    "Sunix SUN1889",
6864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
6964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
700efcc68bSBruce Evans 	},
710efcc68bSBruce Evans 
7264220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1049,
7364220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
7464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
7564220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
7664220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
77dc7d0deaSMarcel Moolenaar 	},
78dc7d0deaSMarcel Moolenaar 
7964220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104a,
8064220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
8164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, -1,
8364220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
84a27ffb41SDavid E. O'Brien 	},
85a27ffb41SDavid E. O'Brien 
8664220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104b,
8764220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
8864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, -1,
9064220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
91a27ffb41SDavid E. O'Brien 	},
92a27ffb41SDavid E. O'Brien 
9364220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1223,
9464220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
9564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9664220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
9764220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
98a27ffb41SDavid E. O'Brien 	},
99a27ffb41SDavid E. O'Brien 
10064220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1226,
10164220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
10264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10364220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10464220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
105a27ffb41SDavid E. O'Brien 	},
106a27ffb41SDavid E. O'Brien 
10764220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1282,
10864220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
10964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
11064220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
11164220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
112a27ffb41SDavid E. O'Brien 	},
113a27ffb41SDavid E. O'Brien 
11464220a7eSMarcel Moolenaar 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
11564220a7eSMarcel Moolenaar 	    "VScom PCI-800",
11664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
11764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1182569e387SDavid E. O'Brien 	},
11964220a7eSMarcel Moolenaar 
12064220a7eSMarcel Moolenaar 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
12164220a7eSMarcel Moolenaar 	    "VScom PCI-400",
12264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
1242569e387SDavid E. O'Brien 	},
12564220a7eSMarcel Moolenaar 
12664220a7eSMarcel Moolenaar 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
12764220a7eSMarcel Moolenaar 	    "VScom PCI-200",
12864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1302569e387SDavid E. O'Brien 	},
131a27ffb41SDavid E. O'Brien 
1329c564b6cSJohn Hay 	/*
13364220a7eSMarcel Moolenaar 	 * Boca Research Turbo Serial 658 (8 serial port) card.
13464220a7eSMarcel Moolenaar 	 * Appears to be the same as Chase Research PLC PCI-FAST8
13564220a7eSMarcel Moolenaar 	 * and Perle PCI-FAST8 Multi-Port serial cards.
1369c564b6cSJohn Hay 	 */
13764220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
13864220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 658",
13964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14064220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1419c564b6cSJohn Hay 	},
1429c564b6cSJohn Hay 
14364220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
14464220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 654",
14564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
14764220a7eSMarcel Moolenaar 	},
1489c564b6cSJohn Hay 
1499c564b6cSJohn Hay 	/*
1509c564b6cSJohn Hay 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
1519c564b6cSJohn Hay 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
1529c564b6cSJohn Hay 	 * into the subsystem fields, and claims that it's a
1539c564b6cSJohn Hay 	 * network/misc (0x02/0x80) device.
1549c564b6cSJohn Hay 	 */
15564220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
15664220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4035",
15764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
15864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1599c564b6cSJohn Hay 	},
1609c564b6cSJohn Hay 
1619c564b6cSJohn Hay 	/*
16264220a7eSMarcel Moolenaar 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
16364220a7eSMarcel Moolenaar 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
16464220a7eSMarcel Moolenaar 	 * into the subsystem fields, and claims that it's a
16564220a7eSMarcel Moolenaar 	 * network/misc (0x02/0x80) device.
1669c564b6cSJohn Hay 	 */
16764220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
16864220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4014",
16964220a7eSMarcel Moolenaar 	    0,
17064220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x20, 4, 0,
1719c564b6cSJohn Hay 	},
1729c564b6cSJohn Hay 
17364220a7eSMarcel Moolenaar 	{   0x10e8, 0x818e, 0xffff, 0,
17464220a7eSMarcel Moolenaar 	    "Applied Micro Circuits 8 Port UART",
17564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
17664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
17764220a7eSMarcel Moolenaar 	    .config_function = puc_config_amc
17864220a7eSMarcel Moolenaar 	},
1799c564b6cSJohn Hay 
18064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8010, 0xffff, 0,
18164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part A",
18264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18464220a7eSMarcel Moolenaar 	},
18564220a7eSMarcel Moolenaar 
18664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8011, 0xffff, 0,
18764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part B",
18864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19064220a7eSMarcel Moolenaar 	},
19164220a7eSMarcel Moolenaar 
19264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8012, 0xffff, 0,
19364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part A",
19464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19664220a7eSMarcel Moolenaar 	},
19764220a7eSMarcel Moolenaar 
19864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8013, 0xffff, 0,
19964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part B",
20064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
20164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
20264220a7eSMarcel Moolenaar 	},
20364220a7eSMarcel Moolenaar 
20464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8014, 0xffff, 0,
20564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/4 RJ45",
20664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
20764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
20864220a7eSMarcel Moolenaar 	},
20964220a7eSMarcel Moolenaar 
21064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8015, 0xffff, 0,
21164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/Quad",
21264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21464220a7eSMarcel Moolenaar 	},
21564220a7eSMarcel Moolenaar 
21664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8016, 0xffff, 0,
21764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part A",
21864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
22064220a7eSMarcel Moolenaar 	},
22164220a7eSMarcel Moolenaar 
22264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8017, 0xffff, 0,
22364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part B",
22464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22564220a7eSMarcel Moolenaar 	    PUC_PORT_12S, 0x10, 0, 8,
22664220a7eSMarcel Moolenaar 	},
22764220a7eSMarcel Moolenaar 
22864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8018, 0xffff, 0,
22964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part A",
23064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23264220a7eSMarcel Moolenaar 	},
23364220a7eSMarcel Moolenaar 
23464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8019, 0xffff, 0,
23564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part B",
23664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23864220a7eSMarcel Moolenaar 	},
2399c564b6cSJohn Hay 
2409c564b6cSJohn Hay 	/*
24163fbf504SRobert Watson 	 * IBM SurePOS 300 Series (481033H) serial ports
24263fbf504SRobert Watson 	 * Details can be found on the IBM RSS websites
24363fbf504SRobert Watson 	 */
24463fbf504SRobert Watson 
24563fbf504SRobert Watson 	{   0x1014, 0x0297, 0xffff, 0,
24663fbf504SRobert Watson 	    "IBM SurePOS 300 Series (481033H) serial ports",
24763fbf504SRobert Watson 	    DEFAULT_RCLK,
24863fbf504SRobert Watson 	    PUC_PORT_4S, 0x10, 4, 0
24963fbf504SRobert Watson 	},
25063fbf504SRobert Watson 
25163fbf504SRobert Watson 	/*
2529c564b6cSJohn Hay 	 * SIIG Boards.
2539c564b6cSJohn Hay 	 *
2549c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
25564220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
2569c564b6cSJohn Hay 	 */
2579c564b6cSJohn Hay 
25864220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
25964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
26064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
26164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2629c564b6cSJohn Hay 	},
2639c564b6cSJohn Hay 
26464220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
26564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
26664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
26764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2689c564b6cSJohn Hay 	},
2699c564b6cSJohn Hay 
27064220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
27164220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
27264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
27364220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2749c564b6cSJohn Hay 	},
2759c564b6cSJohn Hay 
27664220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
27764220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
27864220a7eSMarcel Moolenaar 	    0,
27964220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
2809c564b6cSJohn Hay 	},
2819c564b6cSJohn Hay 
28264220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
28364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
28464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2869c564b6cSJohn Hay 	},
2879c564b6cSJohn Hay 
28864220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
28964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
29064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2929c564b6cSJohn Hay 	},
2939c564b6cSJohn Hay 
29464220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
29564220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
29664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2989c564b6cSJohn Hay 	},
2999c564b6cSJohn Hay 
30064220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
30164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
30264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30364220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3049c564b6cSJohn Hay 	},
3059c564b6cSJohn Hay 
30664220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
30764220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
30864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30964220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3109c564b6cSJohn Hay 	},
3119c564b6cSJohn Hay 
31264220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
31364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
31464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31564220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3169c564b6cSJohn Hay 	},
3179c564b6cSJohn Hay 
31864220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
31964220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
32064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3229c564b6cSJohn Hay 	},
3239c564b6cSJohn Hay 
32464220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
32564220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
32664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3289c564b6cSJohn Hay 	},
3299c564b6cSJohn Hay 
33064220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
33164220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
33264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3349c564b6cSJohn Hay 	},
3359c564b6cSJohn Hay 
33664220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
33764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
33864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3409c564b6cSJohn Hay 	},
3419c564b6cSJohn Hay 
34264220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
34364220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
34464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34564220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3469c564b6cSJohn Hay 	},
3479c564b6cSJohn Hay 
34864220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
34964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
35064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3529c564b6cSJohn Hay 	},
3539c564b6cSJohn Hay 
35464220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
35564220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
35664220a7eSMarcel Moolenaar 	    0,
35764220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
3589c564b6cSJohn Hay 	},
3599c564b6cSJohn Hay 
36064220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
36164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
36264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3649c564b6cSJohn Hay 	},
3659c564b6cSJohn Hay 
36664220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
36764220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
36864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3709c564b6cSJohn Hay 	},
3719c564b6cSJohn Hay 
37264220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
37364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
37464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3769c564b6cSJohn Hay 	},
3779c564b6cSJohn Hay 
37864220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
37964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
38064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38164220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38264220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3839c564b6cSJohn Hay 	},
3849c564b6cSJohn Hay 
38564220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
38664220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
38764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38864220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38964220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3909c564b6cSJohn Hay 	},
3919c564b6cSJohn Hay 
39264220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
39364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
39464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39564220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
39664220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3979c564b6cSJohn Hay 	},
3989c564b6cSJohn Hay 
39964220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
40064220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
40164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4039c564b6cSJohn Hay 	},
4049c564b6cSJohn Hay 
40564220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
40664220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
40764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4099c564b6cSJohn Hay 	},
4109c564b6cSJohn Hay 
41164220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
41264220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
41364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4159c564b6cSJohn Hay 	},
4169c564b6cSJohn Hay 
41764220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
41864220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
41964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42064220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4219c564b6cSJohn Hay 	},
4229c564b6cSJohn Hay 
42364220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
42464220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
42564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42664220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4279c564b6cSJohn Hay 	},
4289c564b6cSJohn Hay 
42964220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
43064220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
43164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43264220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4339c564b6cSJohn Hay 	},
4349c564b6cSJohn Hay 
43564220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
43664220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
43764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
43964220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4409c564b6cSJohn Hay 	},
4419c564b6cSJohn Hay 
44264220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
44364220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
44464220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
44564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
44664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4479c564b6cSJohn Hay 	},
4489c564b6cSJohn Hay 
44964220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
45064220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
45164220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
45264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
45364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4549c564b6cSJohn Hay 	},
4559c564b6cSJohn Hay 
45664220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
45764220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
45864220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
45964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
46064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4619c564b6cSJohn Hay 	},
4629c564b6cSJohn Hay 
46364220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
46464220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
46564220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
46664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
46764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4689c564b6cSJohn Hay 	},
4699c564b6cSJohn Hay 
47064220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
47164220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
47264220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
47364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4759c564b6cSJohn Hay 	},
4769c564b6cSJohn Hay 
47764220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
47864220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
47964220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
48064220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
48164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4829c564b6cSJohn Hay 	},
4839c564b6cSJohn Hay 
48464220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
48564220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
48664220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
48764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
48864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4899c564b6cSJohn Hay 	},
4909c564b6cSJohn Hay 
49164220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
49264220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
49364220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
49464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
49564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
49676353f68SJohn Hay 	},
49776353f68SJohn Hay 
49864220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
49964220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
50064220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
50164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
50264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5039c564b6cSJohn Hay 	},
5049c564b6cSJohn Hay 
50564220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
50664220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
50764220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
50864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
50964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5109c564b6cSJohn Hay 	},
5119c564b6cSJohn Hay 
512f83255a5SMax Khon 	{   0x1393, 0x1024, 0xffff, 0,
513f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102E/PCIe",
514f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
51551cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
51651cb024fSMax Khon 	    .config_function = puc_config_moxa
517f83255a5SMax Khon 	},
518f83255a5SMax Khon 
519f83255a5SMax Khon 	{   0x1393, 0x1025, 0xffff, 0,
520f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102EL/PCIe",
521f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
52251cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
52351cb024fSMax Khon 	    .config_function = puc_config_moxa
524f83255a5SMax Khon 	},
525f83255a5SMax Khon 
52664220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
52764220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
52864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
52964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5300ec6e983SJoerg Wunsch 	},
53140f01890SBruce Evans 
53264220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
53364220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
53464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
53564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5369c564b6cSJohn Hay 	},
5379c564b6cSJohn Hay 
5382c89ac5eSEitan Adler 	{   0x1393, 0x1042, 0xffff, 0,
5392c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104JU/PCI",
5402c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5412c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x18, 0, 8,
5422c89ac5eSEitan Adler 	},
5432c89ac5eSEitan Adler 
544f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
545f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
546f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
547f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
548f6a60febSMaxim Konovalov 	},
549f6a60febSMaxim Konovalov 
5502c89ac5eSEitan Adler 	{   0x1393, 0x1045, 0xffff, 0,
5512c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104EL-A/PCIe",
5522c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5532c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x14, 0, -1,
5542c89ac5eSEitan Adler 	    .config_function = puc_config_moxa
5552c89ac5eSEitan Adler 	},
5562c89ac5eSEitan Adler 
5578efbf264SJohn Baldwin 	{   0x1393, 0x1120, 0xffff, 0,
5588efbf264SJohn Baldwin 	    "Moxa Technologies, CP-112UL",
5598efbf264SJohn Baldwin 	    DEFAULT_RCLK * 8,
5608efbf264SJohn Baldwin 	    PUC_PORT_2S, 0x18, 0, 8,
5618efbf264SJohn Baldwin 	},
5628efbf264SJohn Baldwin 
56364220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
56464220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
56564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
56664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5679c564b6cSJohn Hay 	},
5689c564b6cSJohn Hay 
569f83255a5SMax Khon 	{   0x1393, 0x1144, 0xffff, 0,
570f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-114EL/PCIe",
571f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
572f83255a5SMax Khon 	    PUC_PORT_4S, 0x14, 0, -1,
573f83255a5SMax Khon 	    .config_function = puc_config_moxa
574f83255a5SMax Khon 	},
575f83255a5SMax Khon 
576f83255a5SMax Khon 	{   0x1393, 0x1182, 0xffff, 0,
577f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-118EL-A/PCIe",
578f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
57951cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
58051cb024fSMax Khon 	    .config_function = puc_config_moxa
581f83255a5SMax Khon 	},
582f83255a5SMax Khon 
58364220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
58464220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
58564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
58664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5879c564b6cSJohn Hay 	},
5889c564b6cSJohn Hay 
58964220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
59064220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
59164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
59264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5939c564b6cSJohn Hay 	},
5949c564b6cSJohn Hay 
5950db1aa0bSStanislav Sedov 	{   0x1393, 0x1682, 0xffff, 0,
5960db1aa0bSStanislav Sedov 	    "Moxa Technologies, CP-168EL/PCIe",
5970db1aa0bSStanislav Sedov 	    DEFAULT_RCLK * 8,
5980db1aa0bSStanislav Sedov 	    PUC_PORT_8S, 0x18, 0, 8,
5990db1aa0bSStanislav Sedov 	},
6000db1aa0bSStanislav Sedov 
601f83255a5SMax Khon 	{   0x1393, 0x1683, 0xffff, 0,
602f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-168EL-A/PCIe",
603f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
60451cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
60551cb024fSMax Khon 	    .config_function = puc_config_moxa
606f83255a5SMax Khon 	},
607f83255a5SMax Khon 
60822e0612fSJohn Baldwin 	{   0x13a8, 0x0152, 0xffff, 0,
60922e0612fSJohn Baldwin 	    "Exar XR17C/D152",
61022e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
61122e0612fSJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, -1,
61222e0612fSJohn Baldwin 	    .config_function = puc_config_exar
61322e0612fSJohn Baldwin 	},
61422e0612fSJohn Baldwin 
61522e0612fSJohn Baldwin 	{   0x13a8, 0x0154, 0xffff, 0,
61622e0612fSJohn Baldwin 	    "Exar XR17C154",
61722e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
61822e0612fSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, -1,
61922e0612fSJohn Baldwin 	    .config_function = puc_config_exar
62022e0612fSJohn Baldwin 	},
62122e0612fSJohn Baldwin 
62264220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
62322e0612fSJohn Baldwin 	    "Exar XR17C158",
62464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
62564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
62622e0612fSJohn Baldwin 	    .config_function = puc_config_exar
627de0d2cadSJohn Hay 	},
628de0d2cadSJohn Hay 
62979aac43eSEd Maste 	{   0x13a8, 0x0258, 0xffff, 0,
63079aac43eSEd Maste 	    "Exar XR17V258IV",
63179aac43eSEd Maste 	    DEFAULT_RCLK * 8,
63279aac43eSEd Maste 	    PUC_PORT_8S, 0x10, 0, -1,
6333aff0961SRyan Stone 	    .config_function = puc_config_exar
63479aac43eSEd Maste 	},
63579aac43eSEd Maste 
6368de2c77bSRyan Stone 	/* The XR17V358 uses the 125MHz PCIe clock as its reference clock. */
6378de2c77bSRyan Stone 	{   0x13a8, 0x0358, 0xffff, 0,
6388de2c77bSRyan Stone 	    "Exar XR17V358",
6398de2c77bSRyan Stone 	    125000000,
6408de2c77bSRyan Stone 	    PUC_PORT_8S, 0x10, 0, -1,
6418de2c77bSRyan Stone 	    .config_function = puc_config_exar_pcie
6428de2c77bSRyan Stone 	},
6438de2c77bSRyan Stone 
6445bcc8e2fSEitan Adler 	{   0x13fe, 0x1600, 0x1602, 0x0002,
6455bcc8e2fSEitan Adler 	    "Advantech PCI-1602",
6465bcc8e2fSEitan Adler 	    DEFAULT_RCLK * 8,
6475bcc8e2fSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
6485bcc8e2fSEitan Adler 	},
6495bcc8e2fSEitan Adler 
65064220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
65164220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
65264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
65364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6549c564b6cSJohn Hay 	},
6559c564b6cSJohn Hay 
65664220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
65764220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
65864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
65964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6609c564b6cSJohn Hay 	},
6619c564b6cSJohn Hay 
66264220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
66364220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
66464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
66564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6669c564b6cSJohn Hay 	},
6679c564b6cSJohn Hay 
66864220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
66964220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
67064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
67164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6729c564b6cSJohn Hay 	},
67364220a7eSMarcel Moolenaar 
67464220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
67564220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
67664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
67764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
67864220a7eSMarcel Moolenaar 	},
67964220a7eSMarcel Moolenaar 
68064220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
68164220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
68264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
68364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
68464220a7eSMarcel Moolenaar 	},
68564220a7eSMarcel Moolenaar 
68664220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
68764220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
68864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
68964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
69064220a7eSMarcel Moolenaar 	},
69164220a7eSMarcel Moolenaar 
69213ae6dceSKevin Lo 	{   0x1409, 0x7268, 0xffff, 0,
69313ae6dceSKevin Lo 	    "Sunix SUN1888",
69413ae6dceSKevin Lo 	    0,
69513ae6dceSKevin Lo 	    PUC_PORT_2P, 0x10, 0, 8,
69613ae6dceSKevin Lo 	},
69713ae6dceSKevin Lo 
69864220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
69964220a7eSMarcel Moolenaar 	    NULL,
70064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
70164220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
70264220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
7039c564b6cSJohn Hay 	},
7049c564b6cSJohn Hay 
7059c564b6cSJohn Hay 	/*
7069c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
7079c564b6cSJohn Hay 	 *
7089c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
7096e9f075aSJohn Baldwin 	 * <URL:http://www.plxtech.com/products/uart/>
7109c564b6cSJohn Hay 	 *
7119c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
7129c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
7139c564b6cSJohn Hay 	 */
714acdfc36aSEitan Adler 	{
715acdfc36aSEitan Adler 	    0x1415, 0x9501, 0x10fc, 0xc070,
716acdfc36aSEitan Adler 	    "I-O DATA RSA-PCI2/R",
717acdfc36aSEitan Adler 	    DEFAULT_RCLK * 8,
718acdfc36aSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
719acdfc36aSEitan Adler 	},
7209c564b6cSJohn Hay 
7210db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
7220db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
7230db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
7240db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
7250db885bbSDag-Erling Smørgrav 	},
7260db885bbSDag-Erling Smørgrav 
7271d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
7281d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
7291d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
7301d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
7311d860a7eSMarcel Moolenaar 	},
7321d860a7eSMarcel Moolenaar 
73330ced0d8SJohn Baldwin 	{   0x1415, 0x9501, 0x131f, 0x2052,
73430ced0d8SJohn Baldwin 	    "SIIG Quartet Serial 850",
73530ced0d8SJohn Baldwin 	    DEFAULT_RCLK * 10,
73630ced0d8SJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
73730ced0d8SJohn Baldwin 	},
73830ced0d8SJohn Baldwin 
739282211eaSJohn Baldwin 	{   0x1415, 0x9501, 0x14db, 0x2150,
740282211eaSJohn Baldwin 	    "Kuroutoshikou SERIAL4P-LPPCI2",
741282211eaSJohn Baldwin 	    DEFAULT_RCLK * 10,
742282211eaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
743282211eaSJohn Baldwin 	},
744282211eaSJohn Baldwin 
74564220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
746c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
747*d5e0798eSMarius Strobl 	    0,
74864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
749*d5e0798eSMarius Strobl 	    .config_function = puc_config_oxford_pci954
75083431653SWarner Losh 	},
75183431653SWarner Losh 
75210414b71SJohn Baldwin 	{   0x1415, 0x950a, 0x131f, 0x2030,
75310414b71SJohn Baldwin 	    "SIIG Cyber 2S PCIe",
75410414b71SJohn Baldwin 	    DEFAULT_RCLK * 10,
75510414b71SJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, 8,
75610414b71SJohn Baldwin 	},
75710414b71SJohn Baldwin 
7580dfbbaceSEitan Adler 	{   0x1415, 0x950a, 0x131f, 0x2032,
7590dfbbaceSEitan Adler 	    "SIIG Cyber Serial Dual PCI 16C850",
7600dfbbaceSEitan Adler 	    DEFAULT_RCLK * 10,
7610dfbbaceSEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
7620dfbbaceSEitan Adler 	},
7630dfbbaceSEitan Adler 
76464220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
765c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
766c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
76764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
7689c564b6cSJohn Hay 	},
7699c564b6cSJohn Hay 
77064220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
77164220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
77264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
77364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
77443e42f36SDoug Ambrisko 	},
77543e42f36SDoug Ambrisko 
77664220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
77764220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
77864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
77964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7806cb38a02SDoug Ambrisko 	},
7816cb38a02SDoug Ambrisko 
78211a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
78311a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
78400ff5de5SMarius Strobl 	    DEFAULT_RCLK,
78511a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
78611a12794SRoman Kurakin 	},
78711a12794SRoman Kurakin 
788f09d9fbaSJohn Baldwin 	/*
789f09d9fbaSJohn Baldwin 	 * Perle boards use Oxford Semiconductor chips, but they store the
790f09d9fbaSJohn Baldwin 	 * Oxford Semiconductor device ID as a subvendor device ID and use
791f09d9fbaSJohn Baldwin 	 * their own device IDs.
792f09d9fbaSJohn Baldwin 	 */
793f09d9fbaSJohn Baldwin 
794f09d9fbaSJohn Baldwin 	{   0x155f, 0x0331, 0xffff, 0,
795edfaa737SEitan Adler 	    "Perle Ultraport4 Express",
796edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
797edfaa737SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
798edfaa737SEitan Adler 	},
799edfaa737SEitan Adler 
800edfaa737SEitan Adler 	{   0x155f, 0xB012, 0xffff, 0,
801edfaa737SEitan Adler 	    "Perle Speed2 LE",
802edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
803edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
804edfaa737SEitan Adler 	},
805edfaa737SEitan Adler 
806edfaa737SEitan Adler 	{   0x155f, 0xB022, 0xffff, 0,
807edfaa737SEitan Adler 	    "Perle Speed2 LE",
808edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
809edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
810edfaa737SEitan Adler 	},
811edfaa737SEitan Adler 
812edfaa737SEitan Adler 	{   0x155f, 0xB004, 0xffff, 0,
813f09d9fbaSJohn Baldwin 	    "Perle Speed4 LE",
814f09d9fbaSJohn Baldwin 	    DEFAULT_RCLK * 8,
815f09d9fbaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
816f09d9fbaSJohn Baldwin 	},
817f09d9fbaSJohn Baldwin 
818edfaa737SEitan Adler 	{   0x155f, 0xB008, 0xffff, 0,
819edfaa737SEitan Adler 	    "Perle Speed8 LE",
820edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
821edfaa737SEitan Adler 	    PUC_PORT_8S, 0x10, 0, 8,
822edfaa737SEitan Adler 	},
823edfaa737SEitan Adler 
824edfaa737SEitan Adler 
8256e9f075aSJohn Baldwin 	/*
8266e9f075aSJohn Baldwin 	 * Oxford Semiconductor PCI Express Expresso family
8276e9f075aSJohn Baldwin 	 *
8286e9f075aSJohn Baldwin 	 * Found in many 'native' PCI Express serial boards such as:
8296e9f075aSJohn Baldwin 	 *
8306e9f075aSJohn Baldwin 	 * eMegatech MP954ER4 (4 port) and MP958ER8 (8 port)
8316e9f075aSJohn Baldwin 	 * <URL:http://www.emegatech.com.tw/pdrs232pcie.html>
8326e9f075aSJohn Baldwin 	 *
8336e9f075aSJohn Baldwin 	 * Lindy 51189 (4 port)
8346e9f075aSJohn Baldwin 	 * <URL:http://www.lindy.com> <URL:http://tinyurl.com/lindy-51189>
8356e9f075aSJohn Baldwin 	 *
8366e9f075aSJohn Baldwin 	 * StarTech.com PEX4S952 (4 port) and PEX8S952 (8 port)
8376e9f075aSJohn Baldwin 	 * <URL:http://www.startech.com>
8386e9f075aSJohn Baldwin 	 */
8396e9f075aSJohn Baldwin 
840a6a64612SAndrey V. Elsukov 	{   0x1415, 0xc138, 0xffff, 0,
841a6a64612SAndrey V. Elsukov 	    "Oxford Semiconductor OXPCIe952 UARTs",
842a6a64612SAndrey V. Elsukov 	    DEFAULT_RCLK * 0x22,
843a6a64612SAndrey V. Elsukov 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
844a6a64612SAndrey V. Elsukov 	    .config_function = puc_config_oxford_pcie
845a6a64612SAndrey V. Elsukov 	},
846a6a64612SAndrey V. Elsukov 
8476e9f075aSJohn Baldwin 	{   0x1415, 0xc158, 0xffff, 0,
8486e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs",
8496e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8506e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8516e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8526e9f075aSJohn Baldwin 	},
8536e9f075aSJohn Baldwin 
8546e9f075aSJohn Baldwin 	{   0x1415, 0xc15d, 0xffff, 0,
8556e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs (function 1)",
8566e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8576e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8586e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8596e9f075aSJohn Baldwin 	},
8606e9f075aSJohn Baldwin 
8616e9f075aSJohn Baldwin 	{   0x1415, 0xc208, 0xffff, 0,
8626e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs",
8636e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8646e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8656e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8666e9f075aSJohn Baldwin 	},
8676e9f075aSJohn Baldwin 
8686e9f075aSJohn Baldwin 	{   0x1415, 0xc20d, 0xffff, 0,
8696e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs (function 1)",
8706e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8716e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8726e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8736e9f075aSJohn Baldwin 	},
8746e9f075aSJohn Baldwin 
8756e9f075aSJohn Baldwin 	{   0x1415, 0xc308, 0xffff, 0,
8766e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs",
8776e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8786e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8796e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8806e9f075aSJohn Baldwin 	},
8816e9f075aSJohn Baldwin 
8826e9f075aSJohn Baldwin 	{   0x1415, 0xc30d, 0xffff, 0,
8836e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs (function 1)",
8846e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8856e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8866e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8876e9f075aSJohn Baldwin 	},
8886e9f075aSJohn Baldwin 
88946ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
89046ce58c7SAndrew Thompson 	    "VScom PCI-100L",
89146ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
89246ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
89346ce58c7SAndrew Thompson 	},
89446ce58c7SAndrew Thompson 
89564220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
89664220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
89764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
89864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
899a58deb46SColin Percival 	},
900a58deb46SColin Percival 
90164220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
90246dd877dSPoul-Henning Kamp 	    "VScom 200Li",
90364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
90464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
90546dd877dSPoul-Henning Kamp 	},
9063e19d3c0SBruce M Simpson 
90764220a7eSMarcel Moolenaar 	/*
90864220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
90964220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
91064220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
91164220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
91264220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
91364220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
91464220a7eSMarcel Moolenaar 	 * access the external UARTs.
91564220a7eSMarcel Moolenaar 	 */
91664220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
91764220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
91864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
91964220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
92064220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
92164220a7eSMarcel Moolenaar 	},
92264220a7eSMarcel Moolenaar 
92364220a7eSMarcel Moolenaar 	/*
92464220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
92564220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
92664220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
92764220a7eSMarcel Moolenaar 	 */
92864220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
92964220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
93064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
93164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
93264220a7eSMarcel Moolenaar 	},
93300ff5de5SMarius Strobl 
93464220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
93564220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
93664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
93764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
93864220a7eSMarcel Moolenaar 	},
93964220a7eSMarcel Moolenaar 
94064220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
94164220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
94264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
94364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
94464220a7eSMarcel Moolenaar 	},
94564220a7eSMarcel Moolenaar 
94664220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
94764220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
94864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
94964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
95064220a7eSMarcel Moolenaar 	},
95164220a7eSMarcel Moolenaar 
95264589ec8SEitan Adler 	{   0x14d2, 0xa007, 0xffff, 0,
95364589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
95464589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
95564589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
95664589ec8SEitan Adler 	},
95764589ec8SEitan Adler 
95864589ec8SEitan Adler 	{   0x14d2, 0xa008, 0xffff, 0,
95964589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
96064589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
96164589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
96264589ec8SEitan Adler 	},
96364589ec8SEitan Adler 
96464220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
96564220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
96664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
96764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
96864220a7eSMarcel Moolenaar 	},
96964220a7eSMarcel Moolenaar 
97064220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
97164220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
97264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
97364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
97464220a7eSMarcel Moolenaar 	},
97564220a7eSMarcel Moolenaar 
9760dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
9770dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
9780dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
9790dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
9800dc908e7SAndrew Thompson 	},
9810dc908e7SAndrew Thompson 
98264220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
98364220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
98464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
98564220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
98664220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
98764220a7eSMarcel Moolenaar 	},
98864220a7eSMarcel Moolenaar 
9897501345eSJohn Hay 	{   0x1fd4, 0x1999, 0xffff, 0,
9907501345eSJohn Hay 	    "Sunix SER5437A",
9917501345eSJohn Hay 	    DEFAULT_RCLK * 8,
9927501345eSJohn Hay 	    PUC_PORT_2S, 0x10, 0, 8,
9937501345eSJohn Hay 	},
9947501345eSJohn Hay 
995d9b73ea9SEitan Adler 	{   0x5372, 0x6873, 0xffff, 0,
996d9b73ea9SEitan Adler 	    "Sun 1040 PCI Quad Serial",
997d9b73ea9SEitan Adler 	    DEFAULT_RCLK,
998d9b73ea9SEitan Adler 	    PUC_PORT_4S, 0x10, 4, 0,
999d9b73ea9SEitan Adler 	},
1000d9b73ea9SEitan Adler 
100164220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
100264220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
100364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
100464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
100564220a7eSMarcel Moolenaar 	},
100664220a7eSMarcel Moolenaar 
1007858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
1008858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
1009858030c4SAndrew Thompson 	    DEFAULT_RCLK,
1010858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
1011858030c4SAndrew Thompson 	},
1012858030c4SAndrew Thompson 
101364220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
101464220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
101564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
101664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
101764220a7eSMarcel Moolenaar 	},
101864220a7eSMarcel Moolenaar 
101964220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
102064220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
102164220a7eSMarcel Moolenaar 	    0,
102264220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
102364220a7eSMarcel Moolenaar 	},
102464220a7eSMarcel Moolenaar 
1025843994aeSJohn Baldwin 	/*
1026843994aeSJohn Baldwin 	 * This is more specific than the generic NM9835 entry that follows, and
1027843994aeSJohn Baldwin 	 * is placed here to _prevent_ puc from claiming this single port card.
1028843994aeSJohn Baldwin 	 *
1029843994aeSJohn Baldwin 	 * uart(4) will claim this device.
1030843994aeSJohn Baldwin 	 */
1031843994aeSJohn Baldwin 	{   0x9710, 0x9835, 0x1000, 1,
1032843994aeSJohn Baldwin 	    "NetMos NM9835 based 1-port serial",
1033843994aeSJohn Baldwin 	    DEFAULT_RCLK,
1034843994aeSJohn Baldwin 	    PUC_PORT_1S, 0x10, 4, 0,
1035843994aeSJohn Baldwin 	},
1036843994aeSJohn Baldwin 
1037045de714SNavdeep Parhar 	{   0x9710, 0x9835, 0x1000, 2,
1038045de714SNavdeep Parhar 	    "NetMos NM9835 based 2-port serial",
1039045de714SNavdeep Parhar 	    DEFAULT_RCLK,
1040045de714SNavdeep Parhar 	    PUC_PORT_2S, 0x10, 4, 0,
1041045de714SNavdeep Parhar 	},
1042045de714SNavdeep Parhar 
104364220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
104464220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
104564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
104664220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
104764220a7eSMarcel Moolenaar 	},
104864220a7eSMarcel Moolenaar 
104964220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
105064220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
105164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
105264220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
105364220a7eSMarcel Moolenaar 	},
105464220a7eSMarcel Moolenaar 
105564220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
105664220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
105764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
105864220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
10591d864e0dSMarcel Moolenaar 	},
10601d864e0dSMarcel Moolenaar 
10611d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3002,
10621d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART",
10631d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10641d864e0dSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
10651d864e0dSMarcel Moolenaar 	},
10661d864e0dSMarcel Moolenaar 
10671d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3003,
10681d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Triple UART",
10691d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10701d864e0dSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 4, 0,
10711d864e0dSMarcel Moolenaar 	},
10721d864e0dSMarcel Moolenaar 
10731d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3004,
10741d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Quad UART",
10751d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
107600ff5de5SMarius Strobl 	    PUC_PORT_4S, 0x10, 4, 0,
10771d864e0dSMarcel Moolenaar 	},
10781d864e0dSMarcel Moolenaar 
10791d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3011,
10801d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Single UART and 1284 Printer port",
10811d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10821d864e0dSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
10831d864e0dSMarcel Moolenaar 	},
10841d864e0dSMarcel Moolenaar 
10851d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3012,
10861d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART and 1284 Printer port",
10871d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10881d864e0dSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
10891d864e0dSMarcel Moolenaar 	},
10901d864e0dSMarcel Moolenaar 
10911d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3020,
10921d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual 1284 Printer port",
10931d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10941d864e0dSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 4, 0,
109564220a7eSMarcel Moolenaar 	},
109664220a7eSMarcel Moolenaar 
109764220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
109864220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
109964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
110064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
110164220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
110264220a7eSMarcel Moolenaar 	},
110364220a7eSMarcel Moolenaar 
110464220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
110564220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
110664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
110764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
110864220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
110964220a7eSMarcel Moolenaar 	},
111064220a7eSMarcel Moolenaar 
111164220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
111264220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
111364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
111464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
111564220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
111664220a7eSMarcel Moolenaar 	},
111764220a7eSMarcel Moolenaar 
111864220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
111964220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
112064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
112164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
112264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
112364220a7eSMarcel Moolenaar 	},
112464220a7eSMarcel Moolenaar 
112564220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
112664220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
112764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
112864220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
112964220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
113064220a7eSMarcel Moolenaar 	},
113164220a7eSMarcel Moolenaar 
113264220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
113364220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
113464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
113564220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
113664220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
113764220a7eSMarcel Moolenaar 	},
113864220a7eSMarcel Moolenaar 
113964220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
114064220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
114164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
114264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
114364220a7eSMarcel Moolenaar 	},
114464220a7eSMarcel Moolenaar 
114564220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
114664220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
114764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
114864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
114964220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
115064220a7eSMarcel Moolenaar 	},
115164220a7eSMarcel Moolenaar 
115264220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
11539c564b6cSJohn Hay };
115464220a7eSMarcel Moolenaar 
115564220a7eSMarcel Moolenaar static int
115664220a7eSMarcel Moolenaar puc_config_amc(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
115764220a7eSMarcel Moolenaar     intptr_t *res)
115864220a7eSMarcel Moolenaar {
115964220a7eSMarcel Moolenaar 	switch (cmd) {
116064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
116164220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
116264220a7eSMarcel Moolenaar 		return (0);
116364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
116464220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
116564220a7eSMarcel Moolenaar 		return (0);
116664220a7eSMarcel Moolenaar 	default:
116764220a7eSMarcel Moolenaar 		break;
116864220a7eSMarcel Moolenaar 	}
116964220a7eSMarcel Moolenaar 	return (ENXIO);
117064220a7eSMarcel Moolenaar }
117164220a7eSMarcel Moolenaar 
117264220a7eSMarcel Moolenaar static int
117364220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
117464220a7eSMarcel Moolenaar     intptr_t *res)
117564220a7eSMarcel Moolenaar {
117664220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
117764220a7eSMarcel Moolenaar 
117864220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
117964220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
118064220a7eSMarcel Moolenaar 			port <<= 1;
118164220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
118264220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
118364220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
118464220a7eSMarcel Moolenaar 		return (0);
118564220a7eSMarcel Moolenaar 	}
118664220a7eSMarcel Moolenaar 	return (ENXIO);
118764220a7eSMarcel Moolenaar }
118864220a7eSMarcel Moolenaar 
118964220a7eSMarcel Moolenaar static int
119022e0612fSJohn Baldwin puc_config_exar(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
119122e0612fSJohn Baldwin     intptr_t *res)
119222e0612fSJohn Baldwin {
119322e0612fSJohn Baldwin 	if (cmd == PUC_CFG_GET_OFS) {
119422e0612fSJohn Baldwin 		*res = port * 0x200;
119522e0612fSJohn Baldwin 		return (0);
119622e0612fSJohn Baldwin 	}
119722e0612fSJohn Baldwin 	return (ENXIO);
119822e0612fSJohn Baldwin }
119922e0612fSJohn Baldwin 
120022e0612fSJohn Baldwin static int
12018de2c77bSRyan Stone puc_config_exar_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
12028de2c77bSRyan Stone     intptr_t *res)
12038de2c77bSRyan Stone {
12048de2c77bSRyan Stone 	if (cmd == PUC_CFG_GET_OFS) {
12058de2c77bSRyan Stone 		*res = port * 0x400;
12068de2c77bSRyan Stone 		return (0);
12078de2c77bSRyan Stone 	}
12088de2c77bSRyan Stone 	return (ENXIO);
12098de2c77bSRyan Stone }
12108de2c77bSRyan Stone 
12118de2c77bSRyan Stone static int
121264220a7eSMarcel Moolenaar puc_config_icbook(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
121364220a7eSMarcel Moolenaar     intptr_t *res)
121464220a7eSMarcel Moolenaar {
121564220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
121664220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
121764220a7eSMarcel Moolenaar 		return (0);
121864220a7eSMarcel Moolenaar 	}
121964220a7eSMarcel Moolenaar 	return (ENXIO);
122064220a7eSMarcel Moolenaar }
122164220a7eSMarcel Moolenaar 
122264220a7eSMarcel Moolenaar static int
12232c89ac5eSEitan Adler puc_config_moxa(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
12242c89ac5eSEitan Adler     intptr_t *res)
12252c89ac5eSEitan Adler {
1226f83255a5SMax Khon 	if (cmd == PUC_CFG_GET_OFS) {
122751cb024fSMax Khon 		const struct puc_cfg *cfg = sc->sc_cfg;
122851cb024fSMax Khon 
122951cb024fSMax Khon 		if (port == 3 && (cfg->device == 0x1045 || cfg->device == 0x1144))
123051cb024fSMax Khon 			port = 7;
123151cb024fSMax Khon 		*res = port * 0x200;
123251cb024fSMax Khon 
12332c89ac5eSEitan Adler 		return 0;
12342c89ac5eSEitan Adler 	}
12352c89ac5eSEitan Adler 	return (ENXIO);
12362c89ac5eSEitan Adler }
12372c89ac5eSEitan Adler 
12382c89ac5eSEitan Adler static int
123964220a7eSMarcel Moolenaar puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
124064220a7eSMarcel Moolenaar     intptr_t *res)
124164220a7eSMarcel Moolenaar {
124264220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
124364220a7eSMarcel Moolenaar 	struct puc_bar *bar;
124464220a7eSMarcel Moolenaar 	uint8_t v0, v1;
124564220a7eSMarcel Moolenaar 
124664220a7eSMarcel Moolenaar 	switch (cmd) {
124764220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
124864220a7eSMarcel Moolenaar 		/*
124964220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
125064220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
125164220a7eSMarcel Moolenaar 		 */
125264220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
125364220a7eSMarcel Moolenaar 		if (bar == NULL)
125464220a7eSMarcel Moolenaar 			return (ENXIO);
125564220a7eSMarcel Moolenaar 		/* Set DLAB in the LCR register of UART 0. */
125664220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0x80);
125764220a7eSMarcel Moolenaar 		/* Write 0 to the SPR register of UART 0. */
125864220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0);
125964220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
126064220a7eSMarcel Moolenaar 		v0 = bus_read_1(bar->b_res, 7);
126164220a7eSMarcel Moolenaar 		/* Write a specific value to the SPR register of UART 0. */
126264220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0x80 + -cfg->clock);
126364220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
126464220a7eSMarcel Moolenaar 		v1 = bus_read_1(bar->b_res, 7);
126564220a7eSMarcel Moolenaar 		/* Clear DLAB in the LCR register of UART 0. */
126664220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0);
126764220a7eSMarcel Moolenaar 		/* Save the two values read-back from the SPR register. */
126864220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
126964220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
127064220a7eSMarcel Moolenaar 			/*
127164220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
127264220a7eSMarcel Moolenaar 			 * by us. This means that the SPAD jumper is set.
127364220a7eSMarcel Moolenaar 			 */
127464220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
127564220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
127664220a7eSMarcel Moolenaar 			return (0);
127764220a7eSMarcel Moolenaar 		}
127864220a7eSMarcel Moolenaar 		if (v0 != 0) {
127964220a7eSMarcel Moolenaar 			/*
128064220a7eSMarcel Moolenaar 			 * The first value doesn't match. This can only mean
128164220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
128264220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
128364220a7eSMarcel Moolenaar 			 */
128464220a7eSMarcel Moolenaar 			if (bootverbose)
128564220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
128664220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
128764220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
128864220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
128964220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
129064220a7eSMarcel Moolenaar 				    "setting\n");
129164220a7eSMarcel Moolenaar 			return (0);
129264220a7eSMarcel Moolenaar 		}
129364220a7eSMarcel Moolenaar 		/*
129464220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't. We know
129564220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set. We also know that the
129664220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
129764220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
129864220a7eSMarcel Moolenaar 		 */
129964220a7eSMarcel Moolenaar 		if (bootverbose)
130064220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
130164220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
130264220a7eSMarcel Moolenaar 		return (0);
130364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
130464220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
130564220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
130664220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
130764220a7eSMarcel Moolenaar 			/*
130864220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
130964220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
131064220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed. Let's hope
131164220a7eSMarcel Moolenaar 			 * not...
131264220a7eSMarcel Moolenaar 			 */
131364220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
131464220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
131564220a7eSMarcel Moolenaar 			/*
131664220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
131764220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
131864220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
131964220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
132064220a7eSMarcel Moolenaar 			 */
132164220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
132264220a7eSMarcel Moolenaar 		} else
132364220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
132464220a7eSMarcel Moolenaar 		return (0);
132564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
132664220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
132764220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
132864220a7eSMarcel Moolenaar 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock)
132964220a7eSMarcel Moolenaar 		    ? PUC_ILR_NONE : PUC_ILR_QUATECH;
133064220a7eSMarcel Moolenaar 		return (0);
133164220a7eSMarcel Moolenaar 	default:
133264220a7eSMarcel Moolenaar 		break;
133364220a7eSMarcel Moolenaar 	}
133464220a7eSMarcel Moolenaar 	return (ENXIO);
133564220a7eSMarcel Moolenaar }
133664220a7eSMarcel Moolenaar 
133764220a7eSMarcel Moolenaar static int
133864220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
133964220a7eSMarcel Moolenaar     intptr_t *res)
134064220a7eSMarcel Moolenaar {
134164220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
134264220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
134364220a7eSMarcel Moolenaar 	struct puc_bar *bar;
134464220a7eSMarcel Moolenaar 	int efir, idx, ofs;
134564220a7eSMarcel Moolenaar 	uint8_t v;
134664220a7eSMarcel Moolenaar 
134764220a7eSMarcel Moolenaar 	switch (cmd) {
134864220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
134964220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
135064220a7eSMarcel Moolenaar 		if (bar == NULL)
135164220a7eSMarcel Moolenaar 			return (ENXIO);
135264220a7eSMarcel Moolenaar 
135364220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
135464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
135564220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
135664220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
135764220a7eSMarcel Moolenaar 		idx = 0;
135864220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
135964220a7eSMarcel Moolenaar 			efir = base[idx];
136064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
136164220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
136264220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
136364220a7eSMarcel Moolenaar 				return (ENXIO);
136464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
136564220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
136664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
136764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
136864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
136964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
137064220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
137164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
137264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
137364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
137464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
137564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
137664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
137764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
137864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
137964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
138064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
138164220a7eSMarcel Moolenaar 			idx++;
138264220a7eSMarcel Moolenaar 		}
138364220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
138464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
138564220a7eSMarcel Moolenaar 		return (0);
138664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
138764220a7eSMarcel Moolenaar 		switch (port) {
138864220a7eSMarcel Moolenaar 		case 0:
138964220a7eSMarcel Moolenaar 			*res = 0x2f8;
139064220a7eSMarcel Moolenaar 			return (0);
139164220a7eSMarcel Moolenaar 		case 1:
139264220a7eSMarcel Moolenaar 			*res = 0x2e8;
139364220a7eSMarcel Moolenaar 			return (0);
139464220a7eSMarcel Moolenaar 		case 2:
139564220a7eSMarcel Moolenaar 			*res = 0x3f8;
139664220a7eSMarcel Moolenaar 			return (0);
139764220a7eSMarcel Moolenaar 		case 3:
139864220a7eSMarcel Moolenaar 			*res = 0x3e8;
139964220a7eSMarcel Moolenaar 			return (0);
140064220a7eSMarcel Moolenaar 		case 4:
140164220a7eSMarcel Moolenaar 			*res = 0x278;
140264220a7eSMarcel Moolenaar 			return (0);
140364220a7eSMarcel Moolenaar 		}
140464220a7eSMarcel Moolenaar 		break;
140564220a7eSMarcel Moolenaar 	default:
140664220a7eSMarcel Moolenaar 		break;
140764220a7eSMarcel Moolenaar 	}
140864220a7eSMarcel Moolenaar 	return (ENXIO);
140964220a7eSMarcel Moolenaar }
141064220a7eSMarcel Moolenaar 
141164220a7eSMarcel Moolenaar static int
141264220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
141364220a7eSMarcel Moolenaar     intptr_t *res)
141464220a7eSMarcel Moolenaar {
141564220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
141664220a7eSMarcel Moolenaar 
141764220a7eSMarcel Moolenaar 	switch (cmd) {
141864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
141964220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
142064220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
142164220a7eSMarcel Moolenaar 			return (0);
142264220a7eSMarcel Moolenaar 		}
142364220a7eSMarcel Moolenaar 		break;
142464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
142564220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
142664220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
142764220a7eSMarcel Moolenaar 			return (0);
142864220a7eSMarcel Moolenaar 		}
142964220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
143064220a7eSMarcel Moolenaar 			switch (port) {
143164220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
143264220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
143364220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
143464220a7eSMarcel Moolenaar 			}
143564220a7eSMarcel Moolenaar 		}
143664220a7eSMarcel Moolenaar 		break;
143764220a7eSMarcel Moolenaar 	default:
143864220a7eSMarcel Moolenaar 		break;
143964220a7eSMarcel Moolenaar 	}
144064220a7eSMarcel Moolenaar 	return (ENXIO);
144164220a7eSMarcel Moolenaar }
144264220a7eSMarcel Moolenaar 
144364220a7eSMarcel Moolenaar static int
144464220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
144564220a7eSMarcel Moolenaar     intptr_t *res)
144664220a7eSMarcel Moolenaar {
144700ff5de5SMarius Strobl 	static const uint16_t dual[] = {
144864220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
144964220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
145064220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
145164220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
145264220a7eSMarcel Moolenaar 	    0xD079, 0
145364220a7eSMarcel Moolenaar 	};
145400ff5de5SMarius Strobl 	static const uint16_t quad[] = {
145564220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
145664220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
145764220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
145864220a7eSMarcel Moolenaar 	    0xB157, 0
145964220a7eSMarcel Moolenaar 	};
146000ff5de5SMarius Strobl 	static const uint16_t octa[] = {
146164220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
146264220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
146364220a7eSMarcel Moolenaar 	};
146400ff5de5SMarius Strobl 	static const struct {
146564220a7eSMarcel Moolenaar 		int ports;
146600ff5de5SMarius Strobl 		const uint16_t *ids;
146764220a7eSMarcel Moolenaar 	} subdevs[] = {
146864220a7eSMarcel Moolenaar 	    { 2, dual },
146964220a7eSMarcel Moolenaar 	    { 4, quad },
147064220a7eSMarcel Moolenaar 	    { 8, octa },
147164220a7eSMarcel Moolenaar 	    { 0, NULL }
147264220a7eSMarcel Moolenaar 	};
147364220a7eSMarcel Moolenaar 	static char desc[64];
147464220a7eSMarcel Moolenaar 	int dev, id;
147564220a7eSMarcel Moolenaar 	uint16_t subdev;
147664220a7eSMarcel Moolenaar 
147764220a7eSMarcel Moolenaar 	switch (cmd) {
14789c418f51SJohn Baldwin 	case PUC_CFG_GET_CLOCK:
14799c418f51SJohn Baldwin 		if (port < 2)
14809c418f51SJohn Baldwin 			*res = DEFAULT_RCLK * 8;
14819c418f51SJohn Baldwin 		else
14829c418f51SJohn Baldwin 			*res = DEFAULT_RCLK;
14839c418f51SJohn Baldwin 		return (0);
148464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
148564220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
148664220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
148764220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
148864220a7eSMarcel Moolenaar 		return (0);
148964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
149064220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
149164220a7eSMarcel Moolenaar 		dev = 0;
149264220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
149364220a7eSMarcel Moolenaar 			id = 0;
149464220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
149564220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
149664220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
149764220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
149864220a7eSMarcel Moolenaar 					return (0);
149964220a7eSMarcel Moolenaar 				}
150064220a7eSMarcel Moolenaar 				id++;
150164220a7eSMarcel Moolenaar 			}
150264220a7eSMarcel Moolenaar 			dev++;
150364220a7eSMarcel Moolenaar 		}
150464220a7eSMarcel Moolenaar 		return (ENXIO);
150564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
150664220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
150764220a7eSMarcel Moolenaar 		return (0);
150864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
1509c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
151064220a7eSMarcel Moolenaar 		return (0);
151164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
151264220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
151364220a7eSMarcel Moolenaar 		return (0);
151464220a7eSMarcel Moolenaar 	default:
151564220a7eSMarcel Moolenaar 		break;
151664220a7eSMarcel Moolenaar 	}
151764220a7eSMarcel Moolenaar 	return (ENXIO);
151864220a7eSMarcel Moolenaar }
151964220a7eSMarcel Moolenaar 
152064220a7eSMarcel Moolenaar static int
1521*d5e0798eSMarius Strobl puc_config_oxford_pci954(struct puc_softc *sc, enum puc_cfg_cmd cmd,
1522*d5e0798eSMarius Strobl     int port __unused, intptr_t *res)
1523*d5e0798eSMarius Strobl {
1524*d5e0798eSMarius Strobl 
1525*d5e0798eSMarius Strobl 	switch (cmd) {
1526*d5e0798eSMarius Strobl 	case PUC_CFG_GET_CLOCK:
1527*d5e0798eSMarius Strobl 		/*
1528*d5e0798eSMarius Strobl 		 * OXu16PCI954 use a 14.7456 MHz clock by default while
1529*d5e0798eSMarius Strobl 		 * OX16PCI954 and OXm16PCI954 employ a 1.8432 MHz one.
1530*d5e0798eSMarius Strobl 		 */
1531*d5e0798eSMarius Strobl 		if (pci_get_revid(sc->sc_dev) == 1)
1532*d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK * 8;
1533*d5e0798eSMarius Strobl 		else
1534*d5e0798eSMarius Strobl 			*res = DEFAULT_RCLK;
1535*d5e0798eSMarius Strobl 		return (0);
1536*d5e0798eSMarius Strobl 	default:
1537*d5e0798eSMarius Strobl 		break;
1538*d5e0798eSMarius Strobl 	}
1539*d5e0798eSMarius Strobl 	return (ENXIO);
1540*d5e0798eSMarius Strobl }
1541*d5e0798eSMarius Strobl 
1542*d5e0798eSMarius Strobl static int
15436e9f075aSJohn Baldwin puc_config_oxford_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
15446e9f075aSJohn Baldwin     intptr_t *res)
15456e9f075aSJohn Baldwin {
15466e9f075aSJohn Baldwin 	const struct puc_cfg *cfg = sc->sc_cfg;
15476e9f075aSJohn Baldwin 	int idx;
15486e9f075aSJohn Baldwin 	struct puc_bar *bar;
15496e9f075aSJohn Baldwin 	uint8_t value;
15506e9f075aSJohn Baldwin 
15516e9f075aSJohn Baldwin 	switch (cmd) {
15526e9f075aSJohn Baldwin 	case PUC_CFG_SETUP:
15536e9f075aSJohn Baldwin 		device_printf(sc->sc_dev, "%d UARTs detected\n",
15546e9f075aSJohn Baldwin 			sc->sc_nports);
15556e9f075aSJohn Baldwin 
15566e9f075aSJohn Baldwin 		/* Set UARTs to enhanced mode */
15576e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
15586e9f075aSJohn Baldwin 		if (bar == NULL)
15596e9f075aSJohn Baldwin 			return (ENXIO);
15606e9f075aSJohn Baldwin 		for (idx = 0; idx < sc->sc_nports; idx++) {
1561a59f78daSJohn Baldwin 			value = bus_read_1(bar->b_res, 0x1000 + (idx << 9) +
1562a59f78daSJohn Baldwin 			    0x92);
15636e9f075aSJohn Baldwin 			bus_write_1(bar->b_res, 0x1000 + (idx << 9) + 0x92,
15646e9f075aSJohn Baldwin 			    value | 0x10);
15656e9f075aSJohn Baldwin 		}
15666e9f075aSJohn Baldwin 		return (0);
15676e9f075aSJohn Baldwin 	case PUC_CFG_GET_LEN:
15686e9f075aSJohn Baldwin 		*res = 0x200;
15696e9f075aSJohn Baldwin 		return (0);
15706e9f075aSJohn Baldwin 	case PUC_CFG_GET_NPORTS:
15716e9f075aSJohn Baldwin 		/*
15726e9f075aSJohn Baldwin 		 * Check if we are being called from puc_bfe_attach()
15736e9f075aSJohn Baldwin 		 * or puc_bfe_probe(). If puc_bfe_probe(), we cannot
15746e9f075aSJohn Baldwin 		 * puc_get_bar(), so we return a value of 16. This has cosmetic
15756e9f075aSJohn Baldwin 		 * side-effects at worst; in PUC_CFG_GET_DESC,
15766e9f075aSJohn Baldwin 		 * (int)sc->sc_cfg_data will not contain the true number of
15776e9f075aSJohn Baldwin 		 * ports in PUC_CFG_GET_DESC, but we are not implementing that
15786e9f075aSJohn Baldwin 		 * call for this device family anyway.
15796e9f075aSJohn Baldwin 		 *
15806e9f075aSJohn Baldwin 		 * The check is for initialisation of sc->sc_bar[idx], which is
15816e9f075aSJohn Baldwin 		 * only done in puc_bfe_attach().
15826e9f075aSJohn Baldwin 		 */
15836e9f075aSJohn Baldwin 		idx = 0;
15846e9f075aSJohn Baldwin 		do {
15856e9f075aSJohn Baldwin 			if (sc->sc_bar[idx++].b_rid != -1) {
15866e9f075aSJohn Baldwin 				sc->sc_cfg_data = 16;
15876e9f075aSJohn Baldwin 				*res = sc->sc_cfg_data;
15886e9f075aSJohn Baldwin 				return (0);
15896e9f075aSJohn Baldwin 			}
15906e9f075aSJohn Baldwin 		} while (idx < PUC_PCI_BARS);
15916e9f075aSJohn Baldwin 
15926e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
15936e9f075aSJohn Baldwin 		if (bar == NULL)
15946e9f075aSJohn Baldwin 			return (ENXIO);
15956e9f075aSJohn Baldwin 
15966e9f075aSJohn Baldwin 		value = bus_read_1(bar->b_res, 0x04);
15976e9f075aSJohn Baldwin 		if (value == 0)
15986e9f075aSJohn Baldwin 			return (ENXIO);
15996e9f075aSJohn Baldwin 
16006e9f075aSJohn Baldwin 		sc->sc_cfg_data = value;
16016e9f075aSJohn Baldwin 		*res = sc->sc_cfg_data;
16026e9f075aSJohn Baldwin 		return (0);
16036e9f075aSJohn Baldwin 	case PUC_CFG_GET_OFS:
16046e9f075aSJohn Baldwin 		*res = 0x1000 + (port << 9);
16056e9f075aSJohn Baldwin 		return (0);
16066e9f075aSJohn Baldwin 	case PUC_CFG_GET_TYPE:
16076e9f075aSJohn Baldwin 		*res = PUC_TYPE_SERIAL;
16086e9f075aSJohn Baldwin 		return (0);
16096e9f075aSJohn Baldwin 	default:
16106e9f075aSJohn Baldwin 		break;
16116e9f075aSJohn Baldwin 	}
16126e9f075aSJohn Baldwin 	return (ENXIO);
16136e9f075aSJohn Baldwin }
16146e9f075aSJohn Baldwin 
16156e9f075aSJohn Baldwin static int
161664220a7eSMarcel Moolenaar puc_config_titan(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
161764220a7eSMarcel Moolenaar     intptr_t *res)
161864220a7eSMarcel Moolenaar {
161964220a7eSMarcel Moolenaar 	switch (cmd) {
162064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
162164220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
162264220a7eSMarcel Moolenaar 		return (0);
162364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
162464220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
162564220a7eSMarcel Moolenaar 		return (0);
162664220a7eSMarcel Moolenaar 	default:
162764220a7eSMarcel Moolenaar 		break;
162864220a7eSMarcel Moolenaar 	}
162964220a7eSMarcel Moolenaar 	return (ENXIO);
163064220a7eSMarcel Moolenaar }
1631