xref: /freebsd/sys/dev/puc/pucdata.c (revision 5bcc8e2fbd8d13ed94076446f766b845a875020f)
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;
5364220a7eSMarcel Moolenaar static puc_config_f puc_config_icbook;
542c89ac5eSEitan Adler static puc_config_f puc_config_moxa;
55a59f78daSJohn Baldwin static puc_config_f puc_config_oxford_pcie;
5664220a7eSMarcel Moolenaar static puc_config_f puc_config_quatech;
5764220a7eSMarcel Moolenaar static puc_config_f puc_config_syba;
5864220a7eSMarcel Moolenaar static puc_config_f puc_config_siig;
5964220a7eSMarcel Moolenaar static puc_config_f puc_config_timedia;
6064220a7eSMarcel Moolenaar static puc_config_f puc_config_titan;
61dc7d0deaSMarcel Moolenaar 
6264220a7eSMarcel Moolenaar const struct puc_cfg puc_pci_devices[] = {
63a27ffb41SDavid E. O'Brien 
6464220a7eSMarcel Moolenaar 	{   0x0009, 0x7168, 0xffff, 0,
6564220a7eSMarcel Moolenaar 	    "Sunix SUN1889",
6664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
6764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
680efcc68bSBruce Evans 	},
690efcc68bSBruce Evans 
7064220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1049,
7164220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
7264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
7364220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
7464220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
75dc7d0deaSMarcel Moolenaar 	},
76dc7d0deaSMarcel Moolenaar 
7764220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104a,
7864220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
7964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, -1,
8164220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
82a27ffb41SDavid E. O'Brien 	},
83a27ffb41SDavid E. O'Brien 
8464220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104b,
8564220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
8664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, -1,
8864220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
89a27ffb41SDavid E. O'Brien 	},
90a27ffb41SDavid E. O'Brien 
9164220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1223,
9264220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
9364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9464220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
9564220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
96a27ffb41SDavid E. O'Brien 	},
97a27ffb41SDavid E. O'Brien 
9864220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1226,
9964220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
10064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10164220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10264220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
103a27ffb41SDavid E. O'Brien 	},
104a27ffb41SDavid E. O'Brien 
10564220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1282,
10664220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
10764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10864220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10964220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
110a27ffb41SDavid E. O'Brien 	},
111a27ffb41SDavid E. O'Brien 
11264220a7eSMarcel Moolenaar 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
11364220a7eSMarcel Moolenaar 	    "VScom PCI-800",
11464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
11564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1162569e387SDavid E. O'Brien 	},
11764220a7eSMarcel Moolenaar 
11864220a7eSMarcel Moolenaar 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
11964220a7eSMarcel Moolenaar 	    "VScom PCI-400",
12064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
1222569e387SDavid E. O'Brien 	},
12364220a7eSMarcel Moolenaar 
12464220a7eSMarcel Moolenaar 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
12564220a7eSMarcel Moolenaar 	    "VScom PCI-200",
12664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1282569e387SDavid E. O'Brien 	},
129a27ffb41SDavid E. O'Brien 
1309c564b6cSJohn Hay 	/*
13164220a7eSMarcel Moolenaar 	 * Boca Research Turbo Serial 658 (8 serial port) card.
13264220a7eSMarcel Moolenaar 	 * Appears to be the same as Chase Research PLC PCI-FAST8
13364220a7eSMarcel Moolenaar 	 * and Perle PCI-FAST8 Multi-Port serial cards.
1349c564b6cSJohn Hay 	 */
13564220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
13664220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 658",
13764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
13864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1399c564b6cSJohn Hay 	},
1409c564b6cSJohn Hay 
14164220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
14264220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 654",
14364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
14564220a7eSMarcel Moolenaar 	},
1469c564b6cSJohn Hay 
1479c564b6cSJohn Hay 	/*
1489c564b6cSJohn Hay 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
1499c564b6cSJohn Hay 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
1509c564b6cSJohn Hay 	 * into the subsystem fields, and claims that it's a
1519c564b6cSJohn Hay 	 * network/misc (0x02/0x80) device.
1529c564b6cSJohn Hay 	 */
15364220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
15464220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4035",
15564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
15664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1579c564b6cSJohn Hay 	},
1589c564b6cSJohn Hay 
1599c564b6cSJohn Hay 	/*
16064220a7eSMarcel Moolenaar 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
16164220a7eSMarcel Moolenaar 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
16264220a7eSMarcel Moolenaar 	 * into the subsystem fields, and claims that it's a
16364220a7eSMarcel Moolenaar 	 * network/misc (0x02/0x80) device.
1649c564b6cSJohn Hay 	 */
16564220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
16664220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4014",
16764220a7eSMarcel Moolenaar 	    0,
16864220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x20, 4, 0,
1699c564b6cSJohn Hay 	},
1709c564b6cSJohn Hay 
17164220a7eSMarcel Moolenaar 	{   0x10e8, 0x818e, 0xffff, 0,
17264220a7eSMarcel Moolenaar 	    "Applied Micro Circuits 8 Port UART",
17364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
17464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
17564220a7eSMarcel Moolenaar 	    .config_function = puc_config_amc
17664220a7eSMarcel Moolenaar 	},
1779c564b6cSJohn Hay 
17864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8010, 0xffff, 0,
17964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part A",
18064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18264220a7eSMarcel Moolenaar 	},
18364220a7eSMarcel Moolenaar 
18464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8011, 0xffff, 0,
18564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part B",
18664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18864220a7eSMarcel Moolenaar 	},
18964220a7eSMarcel Moolenaar 
19064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8012, 0xffff, 0,
19164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part A",
19264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19464220a7eSMarcel Moolenaar 	},
19564220a7eSMarcel Moolenaar 
19664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8013, 0xffff, 0,
19764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part B",
19864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
20064220a7eSMarcel Moolenaar 	},
20164220a7eSMarcel Moolenaar 
20264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8014, 0xffff, 0,
20364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/4 RJ45",
20464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
20564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
20664220a7eSMarcel Moolenaar 	},
20764220a7eSMarcel Moolenaar 
20864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8015, 0xffff, 0,
20964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/Quad",
21064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21264220a7eSMarcel Moolenaar 	},
21364220a7eSMarcel Moolenaar 
21464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8016, 0xffff, 0,
21564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part A",
21664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21864220a7eSMarcel Moolenaar 	},
21964220a7eSMarcel Moolenaar 
22064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8017, 0xffff, 0,
22164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part B",
22264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22364220a7eSMarcel Moolenaar 	    PUC_PORT_12S, 0x10, 0, 8,
22464220a7eSMarcel Moolenaar 	},
22564220a7eSMarcel Moolenaar 
22664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8018, 0xffff, 0,
22764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part A",
22864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23064220a7eSMarcel Moolenaar 	},
23164220a7eSMarcel Moolenaar 
23264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8019, 0xffff, 0,
23364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part B",
23464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23664220a7eSMarcel Moolenaar 	},
2379c564b6cSJohn Hay 
2389c564b6cSJohn Hay 	/*
23963fbf504SRobert Watson 	 * IBM SurePOS 300 Series (481033H) serial ports
24063fbf504SRobert Watson 	 * Details can be found on the IBM RSS websites
24163fbf504SRobert Watson 	 */
24263fbf504SRobert Watson 
24363fbf504SRobert Watson 	{   0x1014, 0x0297, 0xffff, 0,
24463fbf504SRobert Watson 	    "IBM SurePOS 300 Series (481033H) serial ports",
24563fbf504SRobert Watson 	    DEFAULT_RCLK,
24663fbf504SRobert Watson 	    PUC_PORT_4S, 0x10, 4, 0
24763fbf504SRobert Watson 	},
24863fbf504SRobert Watson 
24963fbf504SRobert Watson 	/*
2509c564b6cSJohn Hay 	 * SIIG Boards.
2519c564b6cSJohn Hay 	 *
2529c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
25364220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
2549c564b6cSJohn Hay 	 */
2559c564b6cSJohn Hay 
25664220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
25764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
25864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
25964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2609c564b6cSJohn Hay 	},
2619c564b6cSJohn Hay 
26264220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
26364220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
26464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
26564220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2669c564b6cSJohn Hay 	},
2679c564b6cSJohn Hay 
26864220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
26964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
27064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
27164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2729c564b6cSJohn Hay 	},
2739c564b6cSJohn Hay 
27464220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
27564220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
27664220a7eSMarcel Moolenaar 	    0,
27764220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
2789c564b6cSJohn Hay 	},
2799c564b6cSJohn Hay 
28064220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
28164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
28264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2849c564b6cSJohn Hay 	},
2859c564b6cSJohn Hay 
28664220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
28764220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
28864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2909c564b6cSJohn Hay 	},
2919c564b6cSJohn Hay 
29264220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
29364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
29464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2969c564b6cSJohn Hay 	},
2979c564b6cSJohn Hay 
29864220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
29964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
30064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30164220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3029c564b6cSJohn Hay 	},
3039c564b6cSJohn Hay 
30464220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
30564220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
30664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30764220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3089c564b6cSJohn Hay 	},
3099c564b6cSJohn Hay 
31064220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
31164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
31264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31364220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3149c564b6cSJohn Hay 	},
3159c564b6cSJohn Hay 
31664220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
31764220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
31864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3209c564b6cSJohn Hay 	},
3219c564b6cSJohn Hay 
32264220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
32364220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
32464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3269c564b6cSJohn Hay 	},
3279c564b6cSJohn Hay 
32864220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
32964220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
33064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3329c564b6cSJohn Hay 	},
3339c564b6cSJohn Hay 
33464220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
33564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
33664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3389c564b6cSJohn Hay 	},
3399c564b6cSJohn Hay 
34064220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
34164220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
34264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34364220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3449c564b6cSJohn Hay 	},
3459c564b6cSJohn Hay 
34664220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
34764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
34864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3509c564b6cSJohn Hay 	},
3519c564b6cSJohn Hay 
35264220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
35364220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
35464220a7eSMarcel Moolenaar 	    0,
35564220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
3569c564b6cSJohn Hay 	},
3579c564b6cSJohn Hay 
35864220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
35964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
36064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3629c564b6cSJohn Hay 	},
3639c564b6cSJohn Hay 
36464220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
36564220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
36664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3689c564b6cSJohn Hay 	},
3699c564b6cSJohn Hay 
37064220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
37164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
37264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3749c564b6cSJohn Hay 	},
3759c564b6cSJohn Hay 
37664220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
37764220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
37864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37964220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38064220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3819c564b6cSJohn Hay 	},
3829c564b6cSJohn Hay 
38364220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
38464220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
38564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38664220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38764220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3889c564b6cSJohn Hay 	},
3899c564b6cSJohn Hay 
39064220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
39164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
39264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39364220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
39464220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3959c564b6cSJohn Hay 	},
3969c564b6cSJohn Hay 
39764220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
39864220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
39964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4019c564b6cSJohn Hay 	},
4029c564b6cSJohn Hay 
40364220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
40464220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
40564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4079c564b6cSJohn Hay 	},
4089c564b6cSJohn Hay 
40964220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
41064220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
41164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4139c564b6cSJohn Hay 	},
4149c564b6cSJohn Hay 
41564220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
41664220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
41764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41864220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4199c564b6cSJohn Hay 	},
4209c564b6cSJohn Hay 
42164220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
42264220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
42364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42464220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4259c564b6cSJohn Hay 	},
4269c564b6cSJohn Hay 
42764220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
42864220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
42964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43064220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4319c564b6cSJohn Hay 	},
4329c564b6cSJohn Hay 
43364220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
43464220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
43564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
43764220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4389c564b6cSJohn Hay 	},
4399c564b6cSJohn Hay 
44064220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
44164220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
44264220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
44364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
44464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4459c564b6cSJohn Hay 	},
4469c564b6cSJohn Hay 
44764220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
44864220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
44964220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
45064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
45164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4529c564b6cSJohn Hay 	},
4539c564b6cSJohn Hay 
45464220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
45564220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
45664220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
45764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
45864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4599c564b6cSJohn Hay 	},
4609c564b6cSJohn Hay 
46164220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
46264220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
46364220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
46464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
46564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4669c564b6cSJohn Hay 	},
4679c564b6cSJohn Hay 
46864220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
46964220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
47064220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
47164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4739c564b6cSJohn Hay 	},
4749c564b6cSJohn Hay 
47564220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
47664220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
47764220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
47864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4809c564b6cSJohn Hay 	},
4819c564b6cSJohn Hay 
48264220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
48364220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
48464220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
48564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
48664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4879c564b6cSJohn Hay 	},
4889c564b6cSJohn Hay 
48964220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
49064220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
49164220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
49264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
49364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
49476353f68SJohn Hay 	},
49576353f68SJohn Hay 
49664220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
49764220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
49864220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
49964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
50064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5019c564b6cSJohn Hay 	},
5029c564b6cSJohn Hay 
50364220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
50464220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
50564220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
50664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
50764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5089c564b6cSJohn Hay 	},
5099c564b6cSJohn Hay 
510f83255a5SMax Khon 	{   0x1393, 0x1024, 0xffff, 0,
511f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102E/PCIe",
512f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
51351cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
51451cb024fSMax Khon 	        .config_function = puc_config_moxa
515f83255a5SMax Khon 	},
516f83255a5SMax Khon 
517f83255a5SMax Khon 	{   0x1393, 0x1025, 0xffff, 0,
518f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-102EL/PCIe",
519f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
52051cb024fSMax Khon 	    PUC_PORT_2S, 0x14, 0, -1,
52151cb024fSMax Khon 	        .config_function = puc_config_moxa
522f83255a5SMax Khon 	},
523f83255a5SMax Khon 
52464220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
52564220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
52664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
52764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5280ec6e983SJoerg Wunsch 	},
52940f01890SBruce Evans 
53064220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
53164220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
53264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
53364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5349c564b6cSJohn Hay 	},
5359c564b6cSJohn Hay 
5362c89ac5eSEitan Adler 	{   0x1393, 0x1042, 0xffff, 0,
5372c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104JU/PCI",
5382c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5392c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x18, 0, 8,
5402c89ac5eSEitan Adler 	},
5412c89ac5eSEitan Adler 
542f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
543f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
544f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
545f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
546f6a60febSMaxim Konovalov 	},
547f6a60febSMaxim Konovalov 
5482c89ac5eSEitan Adler 	{   0x1393, 0x1045, 0xffff, 0,
5492c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104EL-A/PCIe",
5502c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5512c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x14, 0, -1,
5522c89ac5eSEitan Adler 		.config_function = puc_config_moxa
5532c89ac5eSEitan Adler 	},
5542c89ac5eSEitan Adler 
5558efbf264SJohn Baldwin 	{   0x1393, 0x1120, 0xffff, 0,
5568efbf264SJohn Baldwin 	    "Moxa Technologies, CP-112UL",
5578efbf264SJohn Baldwin 	    DEFAULT_RCLK * 8,
5588efbf264SJohn Baldwin 	    PUC_PORT_2S, 0x18, 0, 8,
5598efbf264SJohn Baldwin 	},
5608efbf264SJohn Baldwin 
56164220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
56264220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
56364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
56464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5659c564b6cSJohn Hay 	},
5669c564b6cSJohn Hay 
567f83255a5SMax Khon 	{   0x1393, 0x1144, 0xffff, 0,
568f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-114EL/PCIe",
569f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
570f83255a5SMax Khon 	    PUC_PORT_4S, 0x14, 0, -1,
571f83255a5SMax Khon 		.config_function = puc_config_moxa
572f83255a5SMax Khon 	},
573f83255a5SMax Khon 
574f83255a5SMax Khon 	{   0x1393, 0x1182, 0xffff, 0,
575f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-118EL-A/PCIe",
576f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
57751cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
57851cb024fSMax Khon 		.config_function = puc_config_moxa
579f83255a5SMax Khon 	},
580f83255a5SMax Khon 
58164220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
58264220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
58364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
58464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5859c564b6cSJohn Hay 	},
5869c564b6cSJohn Hay 
58764220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
58864220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
58964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
59064220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5919c564b6cSJohn Hay 	},
5929c564b6cSJohn Hay 
5930db1aa0bSStanislav Sedov 	{   0x1393, 0x1682, 0xffff, 0,
5940db1aa0bSStanislav Sedov 	    "Moxa Technologies, CP-168EL/PCIe",
5950db1aa0bSStanislav Sedov 	    DEFAULT_RCLK * 8,
5960db1aa0bSStanislav Sedov 	    PUC_PORT_8S, 0x18, 0, 8,
5970db1aa0bSStanislav Sedov 	},
5980db1aa0bSStanislav Sedov 
599f83255a5SMax Khon 	{   0x1393, 0x1683, 0xffff, 0,
600f83255a5SMax Khon 	    "Moxa Technologies, Smartio CP-168EL-A/PCIe",
601f83255a5SMax Khon 	    DEFAULT_RCLK * 8,
60251cb024fSMax Khon 	    PUC_PORT_8S, 0x14, 0, -1,
60351cb024fSMax Khon 		.config_function = puc_config_moxa
604f83255a5SMax Khon 	},
605f83255a5SMax Khon 
60622e0612fSJohn Baldwin 	{   0x13a8, 0x0152, 0xffff, 0,
60722e0612fSJohn Baldwin 	    "Exar XR17C/D152",
60822e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
60922e0612fSJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, -1,
61022e0612fSJohn Baldwin 	    .config_function = puc_config_exar
61122e0612fSJohn Baldwin 	},
61222e0612fSJohn Baldwin 
61322e0612fSJohn Baldwin 	{   0x13a8, 0x0154, 0xffff, 0,
61422e0612fSJohn Baldwin 	    "Exar XR17C154",
61522e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
61622e0612fSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, -1,
61722e0612fSJohn Baldwin 	    .config_function = puc_config_exar
61822e0612fSJohn Baldwin 	},
61922e0612fSJohn Baldwin 
62064220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
62122e0612fSJohn Baldwin 	    "Exar XR17C158",
62264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
62364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
62422e0612fSJohn Baldwin 	    .config_function = puc_config_exar
625de0d2cadSJohn Hay 	},
626de0d2cadSJohn Hay 
62779aac43eSEd Maste 	{   0x13a8, 0x0258, 0xffff, 0,
62879aac43eSEd Maste 	    "Exar XR17V258IV",
62979aac43eSEd Maste 	    DEFAULT_RCLK * 8,
63079aac43eSEd Maste 	    PUC_PORT_8S, 0x10, 0, -1,
63179aac43eSEd Maste 	},
63279aac43eSEd Maste 
633*5bcc8e2fSEitan Adler 	{   0x13fe, 0x1600, 0x1602, 0x0002,
634*5bcc8e2fSEitan Adler 	    "Advantech PCI-1602",
635*5bcc8e2fSEitan Adler 	    DEFAULT_RCLK * 8,
636*5bcc8e2fSEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
637*5bcc8e2fSEitan Adler 	},
638*5bcc8e2fSEitan Adler 
63964220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
64064220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
64164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
64264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6439c564b6cSJohn Hay 	},
6449c564b6cSJohn Hay 
64564220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
64664220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
64764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
64864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6499c564b6cSJohn Hay 	},
6509c564b6cSJohn Hay 
65164220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
65264220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
65364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
65464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6559c564b6cSJohn Hay 	},
6569c564b6cSJohn Hay 
65764220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
65864220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
65964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
66064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6619c564b6cSJohn Hay 	},
66264220a7eSMarcel Moolenaar 
66364220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
66464220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
66564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
66664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
66764220a7eSMarcel Moolenaar 	},
66864220a7eSMarcel Moolenaar 
66964220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
67064220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
67164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
67264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
67364220a7eSMarcel Moolenaar 	},
67464220a7eSMarcel Moolenaar 
67564220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
67664220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
67764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
67864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
67964220a7eSMarcel Moolenaar 	},
68064220a7eSMarcel Moolenaar 
68113ae6dceSKevin Lo 	{   0x1409, 0x7268, 0xffff, 0,
68213ae6dceSKevin Lo 	    "Sunix SUN1888",
68313ae6dceSKevin Lo 	    0,
68413ae6dceSKevin Lo 	    PUC_PORT_2P, 0x10, 0, 8,
68513ae6dceSKevin Lo 	},
68613ae6dceSKevin Lo 
68764220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
68864220a7eSMarcel Moolenaar 	    NULL,
68964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
69064220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
69164220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
6929c564b6cSJohn Hay 	},
6939c564b6cSJohn Hay 
6949c564b6cSJohn Hay 	/*
6959c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
6969c564b6cSJohn Hay 	 *
6979c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
6986e9f075aSJohn Baldwin 	 * <URL:http://www.plxtech.com/products/uart/>
6999c564b6cSJohn Hay 	 *
7009c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
7019c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
7029c564b6cSJohn Hay 	 */
703acdfc36aSEitan Adler 	{
704acdfc36aSEitan Adler 		0x1415, 0x9501, 0x10fc ,0xc070,
705acdfc36aSEitan Adler 		"I-O DATA RSA-PCI2/R",
706acdfc36aSEitan Adler 		DEFAULT_RCLK * 8,
707acdfc36aSEitan Adler 		PUC_PORT_2S, 0x10, 0, 8,
708acdfc36aSEitan Adler 	},
7099c564b6cSJohn Hay 
7100db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
7110db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
7120db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
7130db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
7140db885bbSDag-Erling Smørgrav 	},
7150db885bbSDag-Erling Smørgrav 
7161d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
7171d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
7181d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
7191d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
7201d860a7eSMarcel Moolenaar 	},
7211d860a7eSMarcel Moolenaar 
72230ced0d8SJohn Baldwin 	{   0x1415, 0x9501, 0x131f, 0x2052,
72330ced0d8SJohn Baldwin 	    "SIIG Quartet Serial 850",
72430ced0d8SJohn Baldwin 	    DEFAULT_RCLK * 10,
72530ced0d8SJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
72630ced0d8SJohn Baldwin 	},
72730ced0d8SJohn Baldwin 
728282211eaSJohn Baldwin 	{   0x1415, 0x9501, 0x14db, 0x2150,
729282211eaSJohn Baldwin 	    "Kuroutoshikou SERIAL4P-LPPCI2",
730282211eaSJohn Baldwin 	    DEFAULT_RCLK * 10,
731282211eaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
732282211eaSJohn Baldwin 	},
733282211eaSJohn Baldwin 
73464220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
735c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
736c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
73764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
73883431653SWarner Losh 	},
73983431653SWarner Losh 
74010414b71SJohn Baldwin 	{   0x1415, 0x950a, 0x131f, 0x2030,
74110414b71SJohn Baldwin 	    "SIIG Cyber 2S PCIe",
74210414b71SJohn Baldwin 	    DEFAULT_RCLK * 10,
74310414b71SJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, 8,
74410414b71SJohn Baldwin 	},
74510414b71SJohn Baldwin 
7460dfbbaceSEitan Adler 	{   0x1415, 0x950a, 0x131f, 0x2032,
7470dfbbaceSEitan Adler 	    "SIIG Cyber Serial Dual PCI 16C850",
7480dfbbaceSEitan Adler 	    DEFAULT_RCLK * 10,
7490dfbbaceSEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
7500dfbbaceSEitan Adler 	},
7510dfbbaceSEitan Adler 
75264220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
753c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
754c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
75564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
7569c564b6cSJohn Hay 	},
7579c564b6cSJohn Hay 
75864220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
75964220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
76064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
76164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
76243e42f36SDoug Ambrisko 	},
76343e42f36SDoug Ambrisko 
76464220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
76564220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
76664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
76764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7686cb38a02SDoug Ambrisko 	},
7696cb38a02SDoug Ambrisko 
77011a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
77111a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
77211a12794SRoman Kurakin 	    DEFAULT_RCLK * 10,
77311a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
77411a12794SRoman Kurakin 	},
77511a12794SRoman Kurakin 
776f09d9fbaSJohn Baldwin 	/*
777f09d9fbaSJohn Baldwin 	 * Perle boards use Oxford Semiconductor chips, but they store the
778f09d9fbaSJohn Baldwin 	 * Oxford Semiconductor device ID as a subvendor device ID and use
779f09d9fbaSJohn Baldwin 	 * their own device IDs.
780f09d9fbaSJohn Baldwin 	 */
781f09d9fbaSJohn Baldwin 
782f09d9fbaSJohn Baldwin 	{   0x155f, 0x0331, 0xffff, 0,
783edfaa737SEitan Adler 	    "Perle Ultraport4 Express",
784edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
785edfaa737SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
786edfaa737SEitan Adler 	},
787edfaa737SEitan Adler 
788edfaa737SEitan Adler 	{   0x155f, 0xB012, 0xffff, 0,
789edfaa737SEitan Adler 	    "Perle Speed2 LE",
790edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
791edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
792edfaa737SEitan Adler 	},
793edfaa737SEitan Adler 
794edfaa737SEitan Adler 	{   0x155f, 0xB022, 0xffff, 0,
795edfaa737SEitan Adler 	    "Perle Speed2 LE",
796edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
797edfaa737SEitan Adler 	    PUC_PORT_2S, 0x10, 0, 8,
798edfaa737SEitan Adler 	},
799edfaa737SEitan Adler 
800edfaa737SEitan Adler 	{   0x155f, 0xB004, 0xffff, 0,
801f09d9fbaSJohn Baldwin 	    "Perle Speed4 LE",
802f09d9fbaSJohn Baldwin 	    DEFAULT_RCLK * 8,
803f09d9fbaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
804f09d9fbaSJohn Baldwin 	},
805f09d9fbaSJohn Baldwin 
806edfaa737SEitan Adler 	{   0x155f, 0xB008, 0xffff, 0,
807edfaa737SEitan Adler 	    "Perle Speed8 LE",
808edfaa737SEitan Adler 	    DEFAULT_RCLK * 8,
809edfaa737SEitan Adler 	    PUC_PORT_8S, 0x10, 0, 8,
810edfaa737SEitan Adler 	},
811edfaa737SEitan Adler 
812edfaa737SEitan Adler 
8136e9f075aSJohn Baldwin 	/*
8146e9f075aSJohn Baldwin 	 * Oxford Semiconductor PCI Express Expresso family
8156e9f075aSJohn Baldwin 	 *
8166e9f075aSJohn Baldwin 	 * Found in many 'native' PCI Express serial boards such as:
8176e9f075aSJohn Baldwin 	 *
8186e9f075aSJohn Baldwin 	 * eMegatech MP954ER4 (4 port) and MP958ER8 (8 port)
8196e9f075aSJohn Baldwin 	 * <URL:http://www.emegatech.com.tw/pdrs232pcie.html>
8206e9f075aSJohn Baldwin 	 *
8216e9f075aSJohn Baldwin 	 * Lindy 51189 (4 port)
8226e9f075aSJohn Baldwin 	 * <URL:http://www.lindy.com> <URL:http://tinyurl.com/lindy-51189>
8236e9f075aSJohn Baldwin 	 *
8246e9f075aSJohn Baldwin 	 * StarTech.com PEX4S952 (4 port) and PEX8S952 (8 port)
8256e9f075aSJohn Baldwin 	 * <URL:http://www.startech.com>
8266e9f075aSJohn Baldwin 	 */
8276e9f075aSJohn Baldwin 
828a6a64612SAndrey V. Elsukov 	{   0x1415, 0xc138, 0xffff, 0,
829a6a64612SAndrey V. Elsukov 	    "Oxford Semiconductor OXPCIe952 UARTs",
830a6a64612SAndrey V. Elsukov 	    DEFAULT_RCLK * 0x22,
831a6a64612SAndrey V. Elsukov 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
832a6a64612SAndrey V. Elsukov 	    .config_function = puc_config_oxford_pcie
833a6a64612SAndrey V. Elsukov 	},
834a6a64612SAndrey V. Elsukov 
8356e9f075aSJohn Baldwin 	{   0x1415, 0xc158, 0xffff, 0,
8366e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs",
8376e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8386e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8396e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8406e9f075aSJohn Baldwin 	},
8416e9f075aSJohn Baldwin 
8426e9f075aSJohn Baldwin 	{   0x1415, 0xc15d, 0xffff, 0,
8436e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs (function 1)",
8446e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8456e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8466e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8476e9f075aSJohn Baldwin 	},
8486e9f075aSJohn Baldwin 
8496e9f075aSJohn Baldwin 	{   0x1415, 0xc208, 0xffff, 0,
8506e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs",
8516e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8526e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8536e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8546e9f075aSJohn Baldwin 	},
8556e9f075aSJohn Baldwin 
8566e9f075aSJohn Baldwin 	{   0x1415, 0xc20d, 0xffff, 0,
8576e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs (function 1)",
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, 0xc308, 0xffff, 0,
8646e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs",
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, 0xc30d, 0xffff, 0,
8716e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs (function 1)",
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 
87746ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
87846ce58c7SAndrew Thompson 	    "VScom PCI-100L",
87946ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
88046ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
88146ce58c7SAndrew Thompson 	},
88246ce58c7SAndrew Thompson 
88364220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
88464220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
88564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
88664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
887a58deb46SColin Percival 	},
888a58deb46SColin Percival 
88964220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
89046dd877dSPoul-Henning Kamp 	    "VScom 200Li",
89164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
89264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
89346dd877dSPoul-Henning Kamp 	},
8943e19d3c0SBruce M Simpson 
89564220a7eSMarcel Moolenaar 	/*
89664220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
89764220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
89864220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
89964220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
90064220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
90164220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
90264220a7eSMarcel Moolenaar 	 * access the external UARTs.
90364220a7eSMarcel Moolenaar 	 */
90464220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
90564220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
90664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
90764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
90864220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
90964220a7eSMarcel Moolenaar 	},
91064220a7eSMarcel Moolenaar 
91164220a7eSMarcel Moolenaar 	/*
91264220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
91364220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
91464220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
91564220a7eSMarcel Moolenaar 	 */
91664220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
91764220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
91864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
91964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
92064220a7eSMarcel Moolenaar 	},
92164220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
92264220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
92364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
92464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
92564220a7eSMarcel Moolenaar 	},
92664220a7eSMarcel Moolenaar 
92764220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
92864220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
92964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
93064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
93164220a7eSMarcel Moolenaar 	},
93264220a7eSMarcel Moolenaar 
93364220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
93464220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
93564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
93664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
93764220a7eSMarcel Moolenaar 	},
93864220a7eSMarcel Moolenaar 
93964589ec8SEitan Adler 	{   0x14d2, 0xa007, 0xffff, 0,
94064589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
94164589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
94264589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
94364589ec8SEitan Adler 	},
94464589ec8SEitan Adler 
94564589ec8SEitan Adler 	{   0x14d2, 0xa008, 0xffff, 0,
94664589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
94764589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
94864589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
94964589ec8SEitan Adler 	},
95064589ec8SEitan Adler 
95164220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
95264220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
95364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
95464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
95564220a7eSMarcel Moolenaar 	},
95664220a7eSMarcel Moolenaar 
95764220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
95864220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
95964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
96064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
96164220a7eSMarcel Moolenaar 	},
96264220a7eSMarcel Moolenaar 
9630dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
9640dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
9650dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
9660dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
9670dc908e7SAndrew Thompson 	},
9680dc908e7SAndrew Thompson 
96964220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
97064220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
97164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
97264220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
97364220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
97464220a7eSMarcel Moolenaar 	},
97564220a7eSMarcel Moolenaar 
9767501345eSJohn Hay 	{   0x1fd4, 0x1999, 0xffff, 0,
9777501345eSJohn Hay 	    "Sunix SER5437A",
9787501345eSJohn Hay 	    DEFAULT_RCLK * 8,
9797501345eSJohn Hay 	    PUC_PORT_2S, 0x10, 0, 8,
9807501345eSJohn Hay 	},
9817501345eSJohn Hay 
982d9b73ea9SEitan Adler 	{    0x5372, 0x6873, 0xffff, 0,
983d9b73ea9SEitan Adler 	     "Sun 1040 PCI Quad Serial",
984d9b73ea9SEitan Adler 	     DEFAULT_RCLK,
985d9b73ea9SEitan Adler 	     PUC_PORT_4S, 0x10, 4, 0,
986d9b73ea9SEitan Adler 	},
987d9b73ea9SEitan Adler 
98864220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
98964220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
99064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
99164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
99264220a7eSMarcel Moolenaar 	},
99364220a7eSMarcel Moolenaar 
994858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
995858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
996858030c4SAndrew Thompson 	    DEFAULT_RCLK,
997858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
998858030c4SAndrew Thompson 	},
999858030c4SAndrew Thompson 
100064220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
100164220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
100264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
100364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
100464220a7eSMarcel Moolenaar 	},
100564220a7eSMarcel Moolenaar 
100664220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
100764220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
100864220a7eSMarcel Moolenaar 	    0,
100964220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
101064220a7eSMarcel Moolenaar 	},
101164220a7eSMarcel Moolenaar 
1012843994aeSJohn Baldwin 	/*
1013843994aeSJohn Baldwin 	 * This is more specific than the generic NM9835 entry that follows, and
1014843994aeSJohn Baldwin 	 * is placed here to _prevent_ puc from claiming this single port card.
1015843994aeSJohn Baldwin 	 *
1016843994aeSJohn Baldwin 	 * uart(4) will claim this device.
1017843994aeSJohn Baldwin 	 */
1018843994aeSJohn Baldwin 	{   0x9710, 0x9835, 0x1000, 1,
1019843994aeSJohn Baldwin 	    "NetMos NM9835 based 1-port serial",
1020843994aeSJohn Baldwin 	    DEFAULT_RCLK,
1021843994aeSJohn Baldwin 	    PUC_PORT_1S, 0x10, 4, 0,
1022843994aeSJohn Baldwin 	},
1023843994aeSJohn Baldwin 
1024045de714SNavdeep Parhar 	{   0x9710, 0x9835, 0x1000, 2,
1025045de714SNavdeep Parhar 	    "NetMos NM9835 based 2-port serial",
1026045de714SNavdeep Parhar 	    DEFAULT_RCLK,
1027045de714SNavdeep Parhar 	    PUC_PORT_2S, 0x10, 4, 0,
1028045de714SNavdeep Parhar 	},
1029045de714SNavdeep Parhar 
103064220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
103164220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
103264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
103364220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
103464220a7eSMarcel Moolenaar 	},
103564220a7eSMarcel Moolenaar 
103664220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
103764220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
103864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
103964220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
104064220a7eSMarcel Moolenaar 	},
104164220a7eSMarcel Moolenaar 
104264220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
104364220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
104464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
104564220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
10461d864e0dSMarcel Moolenaar 	},
10471d864e0dSMarcel Moolenaar 
10481d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3002,
10491d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART",
10501d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10511d864e0dSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
10521d864e0dSMarcel Moolenaar 	},
10531d864e0dSMarcel Moolenaar 
10541d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3003,
10551d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Triple UART",
10561d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10571d864e0dSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 4, 0,
10581d864e0dSMarcel Moolenaar 	},
10591d864e0dSMarcel Moolenaar 
10601d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3004,
10611d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Quad UART",
10621d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10631d864e0dSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,0
10641d864e0dSMarcel Moolenaar 	},
10651d864e0dSMarcel Moolenaar 
10661d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3011,
10671d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Single UART and 1284 Printer port",
10681d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10691d864e0dSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
10701d864e0dSMarcel Moolenaar 	},
10711d864e0dSMarcel Moolenaar 
10721d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3012,
10731d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART and 1284 Printer port",
10741d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10751d864e0dSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
10761d864e0dSMarcel Moolenaar 	},
10771d864e0dSMarcel Moolenaar 
10781d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3020,
10791d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual 1284 Printer port",
10801d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10811d864e0dSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 4, 0,
108264220a7eSMarcel Moolenaar 	},
108364220a7eSMarcel Moolenaar 
108464220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
108564220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
108664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
108764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
108864220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
108964220a7eSMarcel Moolenaar 	},
109064220a7eSMarcel Moolenaar 
109164220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
109264220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
109364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
109464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
109564220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
109664220a7eSMarcel Moolenaar 	},
109764220a7eSMarcel Moolenaar 
109864220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
109964220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
110064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
110164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
110264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
110364220a7eSMarcel Moolenaar 	},
110464220a7eSMarcel Moolenaar 
110564220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
110664220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
110764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
110864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
110964220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
111064220a7eSMarcel Moolenaar 	},
111164220a7eSMarcel Moolenaar 
111264220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
111364220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
111464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
111564220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
111664220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
111764220a7eSMarcel Moolenaar 	},
111864220a7eSMarcel Moolenaar 
111964220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
112064220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
112164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
112264220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
112364220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
112464220a7eSMarcel Moolenaar 	},
112564220a7eSMarcel Moolenaar 
112664220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
112764220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
112864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
112964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
113064220a7eSMarcel Moolenaar 	},
113164220a7eSMarcel Moolenaar 
113264220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
113364220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
113464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
113564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
113664220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
113764220a7eSMarcel Moolenaar 	},
113864220a7eSMarcel Moolenaar 
113964220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
11409c564b6cSJohn Hay };
114164220a7eSMarcel Moolenaar 
114264220a7eSMarcel Moolenaar static int
114364220a7eSMarcel Moolenaar puc_config_amc(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
114464220a7eSMarcel Moolenaar     intptr_t *res)
114564220a7eSMarcel Moolenaar {
114664220a7eSMarcel Moolenaar 	switch (cmd) {
114764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
114864220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
114964220a7eSMarcel Moolenaar 		return (0);
115064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
115164220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
115264220a7eSMarcel Moolenaar 		return (0);
115364220a7eSMarcel Moolenaar 	default:
115464220a7eSMarcel Moolenaar 		break;
115564220a7eSMarcel Moolenaar 	}
115664220a7eSMarcel Moolenaar 	return (ENXIO);
115764220a7eSMarcel Moolenaar }
115864220a7eSMarcel Moolenaar 
115964220a7eSMarcel Moolenaar static int
116064220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
116164220a7eSMarcel Moolenaar     intptr_t *res)
116264220a7eSMarcel Moolenaar {
116364220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
116464220a7eSMarcel Moolenaar 
116564220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
116664220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
116764220a7eSMarcel Moolenaar 			port <<= 1;
116864220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
116964220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
117064220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
117164220a7eSMarcel Moolenaar 		return (0);
117264220a7eSMarcel Moolenaar 	}
117364220a7eSMarcel Moolenaar 	return (ENXIO);
117464220a7eSMarcel Moolenaar }
117564220a7eSMarcel Moolenaar 
117664220a7eSMarcel Moolenaar static int
117722e0612fSJohn Baldwin puc_config_exar(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
117822e0612fSJohn Baldwin     intptr_t *res)
117922e0612fSJohn Baldwin {
118022e0612fSJohn Baldwin 	if (cmd == PUC_CFG_GET_OFS) {
118122e0612fSJohn Baldwin 		*res = port * 0x200;
118222e0612fSJohn Baldwin 		return (0);
118322e0612fSJohn Baldwin 	}
118422e0612fSJohn Baldwin 	return (ENXIO);
118522e0612fSJohn Baldwin }
118622e0612fSJohn Baldwin 
118722e0612fSJohn Baldwin static int
118864220a7eSMarcel Moolenaar puc_config_icbook(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
118964220a7eSMarcel Moolenaar     intptr_t *res)
119064220a7eSMarcel Moolenaar {
119164220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
119264220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
119364220a7eSMarcel Moolenaar 		return (0);
119464220a7eSMarcel Moolenaar 	}
119564220a7eSMarcel Moolenaar 	return (ENXIO);
119664220a7eSMarcel Moolenaar }
119764220a7eSMarcel Moolenaar 
119864220a7eSMarcel Moolenaar static int
11992c89ac5eSEitan Adler puc_config_moxa(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
12002c89ac5eSEitan Adler     intptr_t *res)
12012c89ac5eSEitan Adler {
1202f83255a5SMax Khon 	if (cmd == PUC_CFG_GET_OFS) {
120351cb024fSMax Khon 		const struct puc_cfg *cfg = sc->sc_cfg;
120451cb024fSMax Khon 
120551cb024fSMax Khon 		if (port == 3 && (cfg->device == 0x1045 || cfg->device == 0x1144))
120651cb024fSMax Khon 			port = 7;
120751cb024fSMax Khon 		*res = port * 0x200;
120851cb024fSMax Khon 
12092c89ac5eSEitan Adler 		return 0;
12102c89ac5eSEitan Adler 	}
12112c89ac5eSEitan Adler 	return (ENXIO);
12122c89ac5eSEitan Adler }
12132c89ac5eSEitan Adler 
12142c89ac5eSEitan Adler static int
121564220a7eSMarcel Moolenaar puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
121664220a7eSMarcel Moolenaar     intptr_t *res)
121764220a7eSMarcel Moolenaar {
121864220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
121964220a7eSMarcel Moolenaar 	struct puc_bar *bar;
122064220a7eSMarcel Moolenaar 	uint8_t v0, v1;
122164220a7eSMarcel Moolenaar 
122264220a7eSMarcel Moolenaar 	switch (cmd) {
122364220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
122464220a7eSMarcel Moolenaar 		/*
122564220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
122664220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
122764220a7eSMarcel Moolenaar 		 */
122864220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
122964220a7eSMarcel Moolenaar 		if (bar == NULL)
123064220a7eSMarcel Moolenaar 			return (ENXIO);
123164220a7eSMarcel Moolenaar 		/* Set DLAB in the LCR register of UART 0. */
123264220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0x80);
123364220a7eSMarcel Moolenaar 		/* Write 0 to the SPR register of UART 0. */
123464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0);
123564220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
123664220a7eSMarcel Moolenaar 		v0 = bus_read_1(bar->b_res, 7);
123764220a7eSMarcel Moolenaar 		/* Write a specific value to the SPR register of UART 0. */
123864220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0x80 + -cfg->clock);
123964220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
124064220a7eSMarcel Moolenaar 		v1 = bus_read_1(bar->b_res, 7);
124164220a7eSMarcel Moolenaar 		/* Clear DLAB in the LCR register of UART 0. */
124264220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0);
124364220a7eSMarcel Moolenaar 		/* Save the two values read-back from the SPR register. */
124464220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
124564220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
124664220a7eSMarcel Moolenaar 			/*
124764220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
124864220a7eSMarcel Moolenaar 			 * by us. This means that the SPAD jumper is set.
124964220a7eSMarcel Moolenaar 			 */
125064220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
125164220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
125264220a7eSMarcel Moolenaar 			return (0);
125364220a7eSMarcel Moolenaar 		}
125464220a7eSMarcel Moolenaar 		if (v0 != 0) {
125564220a7eSMarcel Moolenaar 			/*
125664220a7eSMarcel Moolenaar 			 * The first value doesn't match. This can only mean
125764220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
125864220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
125964220a7eSMarcel Moolenaar 			 */
126064220a7eSMarcel Moolenaar 			if (bootverbose)
126164220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
126264220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
126364220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
126464220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
126564220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
126664220a7eSMarcel Moolenaar 				    "setting\n");
126764220a7eSMarcel Moolenaar 			return (0);
126864220a7eSMarcel Moolenaar 		}
126964220a7eSMarcel Moolenaar 		/*
127064220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't. We know
127164220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set. We also know that the
127264220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
127364220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
127464220a7eSMarcel Moolenaar 		 */
127564220a7eSMarcel Moolenaar 		if (bootverbose)
127664220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
127764220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
127864220a7eSMarcel Moolenaar 		return (0);
127964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
128064220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
128164220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
128264220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
128364220a7eSMarcel Moolenaar 			/*
128464220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
128564220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
128664220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed. Let's hope
128764220a7eSMarcel Moolenaar 			 * not...
128864220a7eSMarcel Moolenaar 			 */
128964220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
129064220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
129164220a7eSMarcel Moolenaar 			/*
129264220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
129364220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
129464220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
129564220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
129664220a7eSMarcel Moolenaar 			 */
129764220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
129864220a7eSMarcel Moolenaar 		} else
129964220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
130064220a7eSMarcel Moolenaar 		return (0);
130164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
130264220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
130364220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
130464220a7eSMarcel Moolenaar 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock)
130564220a7eSMarcel Moolenaar 		    ? PUC_ILR_NONE : PUC_ILR_QUATECH;
130664220a7eSMarcel Moolenaar 		return (0);
130764220a7eSMarcel Moolenaar 	default:
130864220a7eSMarcel Moolenaar 		break;
130964220a7eSMarcel Moolenaar 	}
131064220a7eSMarcel Moolenaar 	return (ENXIO);
131164220a7eSMarcel Moolenaar }
131264220a7eSMarcel Moolenaar 
131364220a7eSMarcel Moolenaar static int
131464220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
131564220a7eSMarcel Moolenaar     intptr_t *res)
131664220a7eSMarcel Moolenaar {
131764220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
131864220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
131964220a7eSMarcel Moolenaar 	struct puc_bar *bar;
132064220a7eSMarcel Moolenaar 	int efir, idx, ofs;
132164220a7eSMarcel Moolenaar 	uint8_t v;
132264220a7eSMarcel Moolenaar 
132364220a7eSMarcel Moolenaar 	switch (cmd) {
132464220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
132564220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
132664220a7eSMarcel Moolenaar 		if (bar == NULL)
132764220a7eSMarcel Moolenaar 			return (ENXIO);
132864220a7eSMarcel Moolenaar 
132964220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
133064220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
133164220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
133264220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
133364220a7eSMarcel Moolenaar 		idx = 0;
133464220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
133564220a7eSMarcel Moolenaar 			efir = base[idx];
133664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
133764220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
133864220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
133964220a7eSMarcel Moolenaar 				return (ENXIO);
134064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
134164220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
134264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
134364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
134464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
134564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
134664220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
134764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
134864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
134964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
135064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
135164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
135264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
135364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
135464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
135564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
135664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
135764220a7eSMarcel Moolenaar 			idx++;
135864220a7eSMarcel Moolenaar 		}
135964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
136064220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
136164220a7eSMarcel Moolenaar 		return (0);
136264220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
136364220a7eSMarcel Moolenaar 		switch (port) {
136464220a7eSMarcel Moolenaar 		case 0:
136564220a7eSMarcel Moolenaar 			*res = 0x2f8;
136664220a7eSMarcel Moolenaar 			return (0);
136764220a7eSMarcel Moolenaar 		case 1:
136864220a7eSMarcel Moolenaar 			*res = 0x2e8;
136964220a7eSMarcel Moolenaar 			return (0);
137064220a7eSMarcel Moolenaar 		case 2:
137164220a7eSMarcel Moolenaar 			*res = 0x3f8;
137264220a7eSMarcel Moolenaar 			return (0);
137364220a7eSMarcel Moolenaar 		case 3:
137464220a7eSMarcel Moolenaar 			*res = 0x3e8;
137564220a7eSMarcel Moolenaar 			return (0);
137664220a7eSMarcel Moolenaar 		case 4:
137764220a7eSMarcel Moolenaar 			*res = 0x278;
137864220a7eSMarcel Moolenaar 			return (0);
137964220a7eSMarcel Moolenaar 		}
138064220a7eSMarcel Moolenaar 		break;
138164220a7eSMarcel Moolenaar 	default:
138264220a7eSMarcel Moolenaar 		break;
138364220a7eSMarcel Moolenaar 	}
138464220a7eSMarcel Moolenaar 	return (ENXIO);
138564220a7eSMarcel Moolenaar }
138664220a7eSMarcel Moolenaar 
138764220a7eSMarcel Moolenaar static int
138864220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
138964220a7eSMarcel Moolenaar     intptr_t *res)
139064220a7eSMarcel Moolenaar {
139164220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
139264220a7eSMarcel Moolenaar 
139364220a7eSMarcel Moolenaar 	switch (cmd) {
139464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
139564220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
139664220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
139764220a7eSMarcel Moolenaar 			return (0);
139864220a7eSMarcel Moolenaar 		}
139964220a7eSMarcel Moolenaar 		break;
140064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
140164220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
140264220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
140364220a7eSMarcel Moolenaar 			return (0);
140464220a7eSMarcel Moolenaar 		}
140564220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
140664220a7eSMarcel Moolenaar 			switch (port) {
140764220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
140864220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
140964220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
141064220a7eSMarcel Moolenaar 			}
141164220a7eSMarcel Moolenaar 		}
141264220a7eSMarcel Moolenaar 		break;
141364220a7eSMarcel Moolenaar 	default:
141464220a7eSMarcel Moolenaar 		break;
141564220a7eSMarcel Moolenaar 	}
141664220a7eSMarcel Moolenaar 	return (ENXIO);
141764220a7eSMarcel Moolenaar }
141864220a7eSMarcel Moolenaar 
141964220a7eSMarcel Moolenaar static int
142064220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
142164220a7eSMarcel Moolenaar     intptr_t *res)
142264220a7eSMarcel Moolenaar {
142364220a7eSMarcel Moolenaar 	static uint16_t dual[] = {
142464220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
142564220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
142664220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
142764220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
142864220a7eSMarcel Moolenaar 	    0xD079, 0
142964220a7eSMarcel Moolenaar 	};
143064220a7eSMarcel Moolenaar 	static uint16_t quad[] = {
143164220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
143264220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
143364220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
143464220a7eSMarcel Moolenaar 	    0xB157, 0
143564220a7eSMarcel Moolenaar 	};
143664220a7eSMarcel Moolenaar 	static uint16_t octa[] = {
143764220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
143864220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
143964220a7eSMarcel Moolenaar 	};
144064220a7eSMarcel Moolenaar 	static struct {
144164220a7eSMarcel Moolenaar 		int ports;
144264220a7eSMarcel Moolenaar 		uint16_t *ids;
144364220a7eSMarcel Moolenaar 	} subdevs[] = {
144464220a7eSMarcel Moolenaar 	    { 2, dual },
144564220a7eSMarcel Moolenaar 	    { 4, quad },
144664220a7eSMarcel Moolenaar 	    { 8, octa },
144764220a7eSMarcel Moolenaar 	    { 0, NULL }
144864220a7eSMarcel Moolenaar 	};
144964220a7eSMarcel Moolenaar 	static char desc[64];
145064220a7eSMarcel Moolenaar 	int dev, id;
145164220a7eSMarcel Moolenaar 	uint16_t subdev;
145264220a7eSMarcel Moolenaar 
145364220a7eSMarcel Moolenaar 	switch (cmd) {
14549c418f51SJohn Baldwin 	case PUC_CFG_GET_CLOCK:
14559c418f51SJohn Baldwin 		if (port < 2)
14569c418f51SJohn Baldwin 			*res = DEFAULT_RCLK * 8;
14579c418f51SJohn Baldwin 		else
14589c418f51SJohn Baldwin 			*res = DEFAULT_RCLK;
14599c418f51SJohn Baldwin 		return (0);
146064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
146164220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
146264220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
146364220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
146464220a7eSMarcel Moolenaar 		return (0);
146564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
146664220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
146764220a7eSMarcel Moolenaar 		dev = 0;
146864220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
146964220a7eSMarcel Moolenaar 			id = 0;
147064220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
147164220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
147264220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
147364220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
147464220a7eSMarcel Moolenaar 					return (0);
147564220a7eSMarcel Moolenaar 				}
147664220a7eSMarcel Moolenaar 				id++;
147764220a7eSMarcel Moolenaar 			}
147864220a7eSMarcel Moolenaar 			dev++;
147964220a7eSMarcel Moolenaar 		}
148064220a7eSMarcel Moolenaar 		return (ENXIO);
148164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
148264220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
148364220a7eSMarcel Moolenaar 		return (0);
148464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
1485c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
148664220a7eSMarcel Moolenaar 		return (0);
148764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
148864220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
148964220a7eSMarcel Moolenaar 		return (0);
149064220a7eSMarcel Moolenaar 	default:
149164220a7eSMarcel Moolenaar 		break;
149264220a7eSMarcel Moolenaar 	}
149364220a7eSMarcel Moolenaar 	return (ENXIO);
149464220a7eSMarcel Moolenaar }
149564220a7eSMarcel Moolenaar 
149664220a7eSMarcel Moolenaar static int
14976e9f075aSJohn Baldwin puc_config_oxford_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
14986e9f075aSJohn Baldwin     intptr_t *res)
14996e9f075aSJohn Baldwin {
15006e9f075aSJohn Baldwin 	const struct puc_cfg *cfg = sc->sc_cfg;
15016e9f075aSJohn Baldwin 	int idx;
15026e9f075aSJohn Baldwin 	struct puc_bar *bar;
15036e9f075aSJohn Baldwin 	uint8_t value;
15046e9f075aSJohn Baldwin 
15056e9f075aSJohn Baldwin 	switch (cmd) {
15066e9f075aSJohn Baldwin 	case PUC_CFG_SETUP:
15076e9f075aSJohn Baldwin 		device_printf(sc->sc_dev, "%d UARTs detected\n",
15086e9f075aSJohn Baldwin 			sc->sc_nports);
15096e9f075aSJohn Baldwin 
15106e9f075aSJohn Baldwin 		/* Set UARTs to enhanced mode */
15116e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
15126e9f075aSJohn Baldwin 		if (bar == NULL)
15136e9f075aSJohn Baldwin 			return (ENXIO);
15146e9f075aSJohn Baldwin 		for (idx = 0; idx < sc->sc_nports; idx++) {
1515a59f78daSJohn Baldwin 			value = bus_read_1(bar->b_res, 0x1000 + (idx << 9) +
1516a59f78daSJohn Baldwin 			    0x92);
15176e9f075aSJohn Baldwin 			bus_write_1(bar->b_res, 0x1000 + (idx << 9) + 0x92,
15186e9f075aSJohn Baldwin 			    value | 0x10);
15196e9f075aSJohn Baldwin 		}
15206e9f075aSJohn Baldwin 		return (0);
15216e9f075aSJohn Baldwin 	case PUC_CFG_GET_LEN:
15226e9f075aSJohn Baldwin 		*res = 0x200;
15236e9f075aSJohn Baldwin 		return (0);
15246e9f075aSJohn Baldwin 	case PUC_CFG_GET_NPORTS:
15256e9f075aSJohn Baldwin 		/*
15266e9f075aSJohn Baldwin 		 * Check if we are being called from puc_bfe_attach()
15276e9f075aSJohn Baldwin 		 * or puc_bfe_probe(). If puc_bfe_probe(), we cannot
15286e9f075aSJohn Baldwin 		 * puc_get_bar(), so we return a value of 16. This has cosmetic
15296e9f075aSJohn Baldwin 		 * side-effects at worst; in PUC_CFG_GET_DESC,
15306e9f075aSJohn Baldwin 		 * (int)sc->sc_cfg_data will not contain the true number of
15316e9f075aSJohn Baldwin 		 * ports in PUC_CFG_GET_DESC, but we are not implementing that
15326e9f075aSJohn Baldwin 		 * call for this device family anyway.
15336e9f075aSJohn Baldwin 		 *
15346e9f075aSJohn Baldwin 		 * The check is for initialisation of sc->sc_bar[idx], which is
15356e9f075aSJohn Baldwin 		 * only done in puc_bfe_attach().
15366e9f075aSJohn Baldwin 		 */
15376e9f075aSJohn Baldwin 		idx = 0;
15386e9f075aSJohn Baldwin 		do {
15396e9f075aSJohn Baldwin 			if (sc->sc_bar[idx++].b_rid != -1) {
15406e9f075aSJohn Baldwin 				sc->sc_cfg_data = 16;
15416e9f075aSJohn Baldwin 				*res = sc->sc_cfg_data;
15426e9f075aSJohn Baldwin 				return (0);
15436e9f075aSJohn Baldwin 			}
15446e9f075aSJohn Baldwin 		} while (idx < PUC_PCI_BARS);
15456e9f075aSJohn Baldwin 
15466e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
15476e9f075aSJohn Baldwin 		if (bar == NULL)
15486e9f075aSJohn Baldwin 			return (ENXIO);
15496e9f075aSJohn Baldwin 
15506e9f075aSJohn Baldwin 		value = bus_read_1(bar->b_res, 0x04);
15516e9f075aSJohn Baldwin 		if (value == 0)
15526e9f075aSJohn Baldwin 			return (ENXIO);
15536e9f075aSJohn Baldwin 
15546e9f075aSJohn Baldwin 		sc->sc_cfg_data = value;
15556e9f075aSJohn Baldwin 		*res = sc->sc_cfg_data;
15566e9f075aSJohn Baldwin 		return (0);
15576e9f075aSJohn Baldwin 	case PUC_CFG_GET_OFS:
15586e9f075aSJohn Baldwin 		*res = 0x1000 + (port << 9);
15596e9f075aSJohn Baldwin 		return (0);
15606e9f075aSJohn Baldwin 	case PUC_CFG_GET_TYPE:
15616e9f075aSJohn Baldwin 		*res = PUC_TYPE_SERIAL;
15626e9f075aSJohn Baldwin 		return (0);
15636e9f075aSJohn Baldwin 	default:
15646e9f075aSJohn Baldwin 		break;
15656e9f075aSJohn Baldwin 	}
15666e9f075aSJohn Baldwin 	return (ENXIO);
15676e9f075aSJohn Baldwin }
15686e9f075aSJohn Baldwin 
15696e9f075aSJohn Baldwin static int
157064220a7eSMarcel Moolenaar puc_config_titan(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
157164220a7eSMarcel Moolenaar     intptr_t *res)
157264220a7eSMarcel Moolenaar {
157364220a7eSMarcel Moolenaar 	switch (cmd) {
157464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
157564220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
157664220a7eSMarcel Moolenaar 		return (0);
157764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
157864220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
157964220a7eSMarcel Moolenaar 		return (0);
158064220a7eSMarcel Moolenaar 	default:
158164220a7eSMarcel Moolenaar 		break;
158264220a7eSMarcel Moolenaar 	}
158364220a7eSMarcel Moolenaar 	return (ENXIO);
158464220a7eSMarcel Moolenaar }
1585