xref: /freebsd/sys/dev/puc/pucdata.c (revision 11a12794a96d02439daa52cf39bc9c198911fa0d)
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_cronyx;
5264220a7eSMarcel Moolenaar static puc_config_f puc_config_diva;
5364220a7eSMarcel Moolenaar static puc_config_f puc_config_icbook;
5464220a7eSMarcel Moolenaar static puc_config_f puc_config_quatech;
5564220a7eSMarcel Moolenaar static puc_config_f puc_config_syba;
5664220a7eSMarcel Moolenaar static puc_config_f puc_config_siig;
5764220a7eSMarcel Moolenaar static puc_config_f puc_config_timedia;
5864220a7eSMarcel Moolenaar static puc_config_f puc_config_titan;
59dc7d0deaSMarcel Moolenaar 
6064220a7eSMarcel Moolenaar const struct puc_cfg puc_pci_devices[] = {
61a27ffb41SDavid E. O'Brien 
6264220a7eSMarcel Moolenaar 	{   0x0009, 0x7168, 0xffff, 0,
6364220a7eSMarcel Moolenaar 	    "Sunix SUN1889",
6464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
6564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
660efcc68bSBruce Evans 	},
670efcc68bSBruce Evans 
6864220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1049,
6964220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
7064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
7164220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
7264220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
73dc7d0deaSMarcel Moolenaar 	},
74dc7d0deaSMarcel Moolenaar 
7564220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104a,
7664220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
7764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
7864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, -1,
7964220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
80a27ffb41SDavid E. O'Brien 	},
81a27ffb41SDavid E. O'Brien 
8264220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104b,
8364220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
8464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, -1,
8664220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
87a27ffb41SDavid E. O'Brien 	},
88a27ffb41SDavid E. O'Brien 
8964220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1223,
9064220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
9164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9264220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
9364220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
94a27ffb41SDavid E. O'Brien 	},
95a27ffb41SDavid E. O'Brien 
9664220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1226,
9764220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
9864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9964220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10064220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
101a27ffb41SDavid E. O'Brien 	},
102a27ffb41SDavid E. O'Brien 
10364220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1282,
10464220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
10564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10664220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10764220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
108a27ffb41SDavid E. O'Brien 	},
109a27ffb41SDavid E. O'Brien 
11064220a7eSMarcel Moolenaar 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
11164220a7eSMarcel Moolenaar 	    "VScom PCI-800",
11264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
11364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1142569e387SDavid E. O'Brien 	},
11564220a7eSMarcel Moolenaar 
11664220a7eSMarcel Moolenaar 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
11764220a7eSMarcel Moolenaar 	    "VScom PCI-400",
11864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
11964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
1202569e387SDavid E. O'Brien 	},
12164220a7eSMarcel Moolenaar 
12264220a7eSMarcel Moolenaar 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
12364220a7eSMarcel Moolenaar 	    "VScom PCI-200",
12464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1262569e387SDavid E. O'Brien 	},
127a27ffb41SDavid E. O'Brien 
1289c564b6cSJohn Hay 	/*
12964220a7eSMarcel Moolenaar 	 * Boca Research Turbo Serial 658 (8 serial port) card.
13064220a7eSMarcel Moolenaar 	 * Appears to be the same as Chase Research PLC PCI-FAST8
13164220a7eSMarcel Moolenaar 	 * and Perle PCI-FAST8 Multi-Port serial cards.
1329c564b6cSJohn Hay 	 */
13364220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
13464220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 658",
13564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
13664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1379c564b6cSJohn Hay 	},
1389c564b6cSJohn Hay 
13964220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
14064220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 654",
14164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
14364220a7eSMarcel Moolenaar 	},
1449c564b6cSJohn Hay 
1459c564b6cSJohn Hay 	/*
1469c564b6cSJohn Hay 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
1479c564b6cSJohn Hay 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
1489c564b6cSJohn Hay 	 * into the subsystem fields, and claims that it's a
1499c564b6cSJohn Hay 	 * network/misc (0x02/0x80) device.
1509c564b6cSJohn Hay 	 */
15164220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
15264220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4035",
15364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
15464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1559c564b6cSJohn Hay 	},
1569c564b6cSJohn Hay 
1579c564b6cSJohn Hay 	/*
15864220a7eSMarcel Moolenaar 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
15964220a7eSMarcel Moolenaar 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
16064220a7eSMarcel Moolenaar 	 * into the subsystem fields, and claims that it's a
16164220a7eSMarcel Moolenaar 	 * network/misc (0x02/0x80) device.
1629c564b6cSJohn Hay 	 */
16364220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
16464220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4014",
16564220a7eSMarcel Moolenaar 	    0,
16664220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x20, 4, 0,
1679c564b6cSJohn Hay 	},
1689c564b6cSJohn Hay 
16964220a7eSMarcel Moolenaar 	{   0x10e8, 0x818e, 0xffff, 0,
17064220a7eSMarcel Moolenaar 	    "Applied Micro Circuits 8 Port UART",
17164220a7eSMarcel Moolenaar             DEFAULT_RCLK,
17264220a7eSMarcel Moolenaar             PUC_PORT_8S, 0x14, -1, -1,
17364220a7eSMarcel Moolenaar 	    .config_function = puc_config_amc
17464220a7eSMarcel Moolenaar         },
1759c564b6cSJohn Hay 
17664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8010, 0xffff, 0,
17764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part A",
17864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
17964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18064220a7eSMarcel Moolenaar 	},
18164220a7eSMarcel Moolenaar 
18264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8011, 0xffff, 0,
18364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part B",
18464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18664220a7eSMarcel Moolenaar 	},
18764220a7eSMarcel Moolenaar 
18864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8012, 0xffff, 0,
18964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part A",
19064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19264220a7eSMarcel Moolenaar 	},
19364220a7eSMarcel Moolenaar 
19464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8013, 0xffff, 0,
19564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part B",
19664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19864220a7eSMarcel Moolenaar 	},
19964220a7eSMarcel Moolenaar 
20064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8014, 0xffff, 0,
20164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/4 RJ45",
20264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
20364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
20464220a7eSMarcel Moolenaar 	},
20564220a7eSMarcel Moolenaar 
20664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8015, 0xffff, 0,
20764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/Quad",
20864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
20964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21064220a7eSMarcel Moolenaar 	},
21164220a7eSMarcel Moolenaar 
21264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8016, 0xffff, 0,
21364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part A",
21464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21664220a7eSMarcel Moolenaar 	},
21764220a7eSMarcel Moolenaar 
21864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8017, 0xffff, 0,
21964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part B",
22064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22164220a7eSMarcel Moolenaar 	    PUC_PORT_12S, 0x10, 0, 8,
22264220a7eSMarcel Moolenaar 	},
22364220a7eSMarcel Moolenaar 
22464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8018, 0xffff, 0,
22564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part A",
22664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
22864220a7eSMarcel Moolenaar 	},
22964220a7eSMarcel Moolenaar 
23064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8019, 0xffff, 0,
23164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part B",
23264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23464220a7eSMarcel Moolenaar 	},
2359c564b6cSJohn Hay 
2369c564b6cSJohn Hay 	/*
2379c564b6cSJohn Hay 	 * SIIG Boards.
2389c564b6cSJohn Hay 	 *
2399c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
24064220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
2419c564b6cSJohn Hay 	 */
2429c564b6cSJohn Hay 
24364220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
24464220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
24564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
24664220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2479c564b6cSJohn Hay 	},
2489c564b6cSJohn Hay 
24964220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
25064220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
25164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
25264220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2539c564b6cSJohn Hay 	},
2549c564b6cSJohn Hay 
25564220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
25664220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
25764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
25864220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2599c564b6cSJohn Hay 	},
2609c564b6cSJohn Hay 
26164220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
26264220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
26364220a7eSMarcel Moolenaar 	    0,
26464220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
2659c564b6cSJohn Hay 	},
2669c564b6cSJohn Hay 
26764220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
26864220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
26964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
27064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2719c564b6cSJohn Hay 	},
2729c564b6cSJohn Hay 
27364220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
27464220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
27564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
27664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2779c564b6cSJohn Hay 	},
2789c564b6cSJohn Hay 
27964220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
28064220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
28164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2839c564b6cSJohn Hay 	},
2849c564b6cSJohn Hay 
28564220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
28664220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
28764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28864220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
2899c564b6cSJohn Hay 	},
2909c564b6cSJohn Hay 
29164220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
29264220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
29364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29464220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
2959c564b6cSJohn Hay 	},
2969c564b6cSJohn Hay 
29764220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
29864220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
29964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30064220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3019c564b6cSJohn Hay 	},
3029c564b6cSJohn Hay 
30364220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
30464220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
30564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3079c564b6cSJohn Hay 	},
3089c564b6cSJohn Hay 
30964220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
31064220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
31164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3139c564b6cSJohn Hay 	},
3149c564b6cSJohn Hay 
31564220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
31664220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
31764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3199c564b6cSJohn Hay 	},
3209c564b6cSJohn Hay 
32164220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
32264220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
32364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32464220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3259c564b6cSJohn Hay 	},
3269c564b6cSJohn Hay 
32764220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
32864220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
32964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33064220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3319c564b6cSJohn Hay 	},
3329c564b6cSJohn Hay 
33364220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
33464220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
33564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33664220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3379c564b6cSJohn Hay 	},
3389c564b6cSJohn Hay 
33964220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
34064220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
34164220a7eSMarcel Moolenaar 	    0,
34264220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
3439c564b6cSJohn Hay 	},
3449c564b6cSJohn Hay 
34564220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
34664220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
34764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3499c564b6cSJohn Hay 	},
3509c564b6cSJohn Hay 
35164220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
35264220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
35364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3559c564b6cSJohn Hay 	},
3569c564b6cSJohn Hay 
35764220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
35864220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
35964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3619c564b6cSJohn Hay 	},
3629c564b6cSJohn Hay 
36364220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
36464220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
36564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36664220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
36764220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3689c564b6cSJohn Hay 	},
3699c564b6cSJohn Hay 
37064220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
37164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
37264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37364220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
37464220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3759c564b6cSJohn Hay 	},
3769c564b6cSJohn Hay 
37764220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
37864220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
37964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38064220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38164220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3829c564b6cSJohn Hay 	},
3839c564b6cSJohn Hay 
38464220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
38564220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
38664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
3889c564b6cSJohn Hay 	},
3899c564b6cSJohn Hay 
39064220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
39164220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
39264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
3949c564b6cSJohn Hay 	},
3959c564b6cSJohn Hay 
39664220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
39764220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
39864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4009c564b6cSJohn Hay 	},
4019c564b6cSJohn Hay 
40264220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
40364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
40464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40564220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4069c564b6cSJohn Hay 	},
4079c564b6cSJohn Hay 
40864220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
40964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
41064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41164220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4129c564b6cSJohn Hay 	},
4139c564b6cSJohn Hay 
41464220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
41564220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
41664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41764220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4189c564b6cSJohn Hay 	},
4199c564b6cSJohn Hay 
42064220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
42164220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
42264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
42464220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4259c564b6cSJohn Hay 	},
4269c564b6cSJohn Hay 
42764220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
42864220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
42964220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
43064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
43164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4329c564b6cSJohn Hay 	},
4339c564b6cSJohn Hay 
43464220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
43564220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
43664220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
43764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
43864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4399c564b6cSJohn Hay 	},
4409c564b6cSJohn Hay 
44164220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
44264220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
44364220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
44464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
44564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4469c564b6cSJohn Hay 	},
4479c564b6cSJohn Hay 
44864220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
44964220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
45064220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
45164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
45264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4539c564b6cSJohn Hay 	},
4549c564b6cSJohn Hay 
45564220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
45664220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
45764220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
45864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
45964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4609c564b6cSJohn Hay 	},
4619c564b6cSJohn Hay 
46264220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
46364220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
46464220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
46564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
46664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4679c564b6cSJohn Hay 	},
4689c564b6cSJohn Hay 
46964220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
47064220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
47164220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
47264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
47364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4749c564b6cSJohn Hay 	},
4759c564b6cSJohn Hay 
47664220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
47764220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
47864220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
47964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
48064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
48176353f68SJohn Hay 	},
48276353f68SJohn Hay 
48364220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
48464220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
48564220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
48664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
48764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4889c564b6cSJohn Hay 	},
4899c564b6cSJohn Hay 
49064220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
49164220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
49264220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
49364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
49464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4959c564b6cSJohn Hay 	},
4969c564b6cSJohn Hay 
49764220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
49864220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
49964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
50064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5010ec6e983SJoerg Wunsch 	},
50240f01890SBruce Evans 
50364220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
50464220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
50564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
50664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5079c564b6cSJohn Hay 	},
5089c564b6cSJohn Hay 
509f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
510f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
511f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
512f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
513f6a60febSMaxim Konovalov 	},
514f6a60febSMaxim Konovalov 
51564220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
51664220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
51764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
51864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5199c564b6cSJohn Hay 	},
5209c564b6cSJohn Hay 
52164220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
52264220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
52364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
52464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5259c564b6cSJohn Hay 	},
5269c564b6cSJohn Hay 
52764220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
52864220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
52964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
53064220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5319c564b6cSJohn Hay 	},
5329c564b6cSJohn Hay 
53364220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
53464220a7eSMarcel Moolenaar 	    "Cronyx Omega2-PCI",
53564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
53664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
53764220a7eSMarcel Moolenaar 	    .config_function = puc_config_cronyx
538de0d2cadSJohn Hay 	},
539de0d2cadSJohn Hay 
54064220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
54164220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
54264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
54364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5449c564b6cSJohn Hay 	},
5459c564b6cSJohn Hay 
54664220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
54764220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
54864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
54964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5509c564b6cSJohn Hay 	},
5519c564b6cSJohn Hay 
55264220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
55364220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
55464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
55564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5569c564b6cSJohn Hay 	},
5579c564b6cSJohn Hay 
55864220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
55964220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
56064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
56164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5629c564b6cSJohn Hay 	},
56364220a7eSMarcel Moolenaar 
56464220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
56564220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
56664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
56764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
56864220a7eSMarcel Moolenaar 	},
56964220a7eSMarcel Moolenaar 
57064220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
57164220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
57264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
57364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
57464220a7eSMarcel Moolenaar 	},
57564220a7eSMarcel Moolenaar 
57664220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
57764220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
57864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
57964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
58064220a7eSMarcel Moolenaar 	},
58164220a7eSMarcel Moolenaar 
58264220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
58364220a7eSMarcel Moolenaar 	    NULL,
58464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
58564220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
58664220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
5879c564b6cSJohn Hay 	},
5889c564b6cSJohn Hay 
5899c564b6cSJohn Hay 	/*
5909c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
5919c564b6cSJohn Hay 	 *
5929c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
5939c564b6cSJohn Hay 	 * <URL:http://www.oxsemi.com/products/uarts/index.html>
5949c564b6cSJohn Hay 	 *
5959c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
5969c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
5979c564b6cSJohn Hay 	 */
5989c564b6cSJohn Hay 
5990db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
6000db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
6010db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
6020db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
6030db885bbSDag-Erling Smørgrav 	},
6040db885bbSDag-Erling Smørgrav 
6051d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
6061d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
6071d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
6081d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
6091d860a7eSMarcel Moolenaar 	},
6101d860a7eSMarcel Moolenaar 
61164220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
612c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
613c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
61464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
61583431653SWarner Losh 	},
61683431653SWarner Losh 
61764220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
618c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
619c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
62064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
6219c564b6cSJohn Hay 	},
6229c564b6cSJohn Hay 
62364220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
62464220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
62564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
62664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
62743e42f36SDoug Ambrisko 	},
62843e42f36SDoug Ambrisko 
62964220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
63064220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
63164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
63264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6336cb38a02SDoug Ambrisko 	},
6346cb38a02SDoug Ambrisko 
63511a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
63611a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
63711a12794SRoman Kurakin 	    DEFAULT_RCLK * 10,
63811a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
63911a12794SRoman Kurakin 	},
64011a12794SRoman Kurakin 
64146ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
64246ce58c7SAndrew Thompson 	    "VScom PCI-100L",
64346ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
64446ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
64546ce58c7SAndrew Thompson 	},
64646ce58c7SAndrew Thompson 
64764220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
64864220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
64964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
65064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
651a58deb46SColin Percival 	},
652a58deb46SColin Percival 
65364220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
65446dd877dSPoul-Henning Kamp 	    "VScom 200Li",
65564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
65664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
65746dd877dSPoul-Henning Kamp 	},
6583e19d3c0SBruce M Simpson 
65964220a7eSMarcel Moolenaar 	/*
66064220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
66164220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
66264220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
66364220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
66464220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
66564220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
66664220a7eSMarcel Moolenaar 	 * access the external UARTs.
66764220a7eSMarcel Moolenaar 	 */
66864220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
66964220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
67064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
67164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
67264220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
67364220a7eSMarcel Moolenaar 	},
67464220a7eSMarcel Moolenaar 
67564220a7eSMarcel Moolenaar 	/*
67664220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
67764220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
67864220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
67964220a7eSMarcel Moolenaar 	 */
68064220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
68164220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
68264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
68364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
68464220a7eSMarcel Moolenaar 	},
68564220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
68664220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
68764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
68864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
68964220a7eSMarcel Moolenaar 	},
69064220a7eSMarcel Moolenaar 
69164220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
69264220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
69364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
69464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
69564220a7eSMarcel Moolenaar 	},
69664220a7eSMarcel Moolenaar 
69764220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
69864220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
69964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
70064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
70164220a7eSMarcel Moolenaar 	},
70264220a7eSMarcel Moolenaar 
70364220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
70464220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
70564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
70664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
70764220a7eSMarcel Moolenaar 	},
70864220a7eSMarcel Moolenaar 
70964220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
71064220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
71164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
71264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
71364220a7eSMarcel Moolenaar 	},
71464220a7eSMarcel Moolenaar 
7150dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
7160dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
7170dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
7180dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
7190dc908e7SAndrew Thompson 	},
7200dc908e7SAndrew Thompson 
72164220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
72264220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
72364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
72464220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
72564220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
72664220a7eSMarcel Moolenaar 	},
72764220a7eSMarcel Moolenaar 
72864220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
72964220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
73064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
73164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
73264220a7eSMarcel Moolenaar 	},
73364220a7eSMarcel Moolenaar 
734858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
735858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
736858030c4SAndrew Thompson 	    DEFAULT_RCLK,
737858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
738858030c4SAndrew Thompson 	},
739858030c4SAndrew Thompson 
74064220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
74164220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
74264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
74364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
74464220a7eSMarcel Moolenaar 	},
74564220a7eSMarcel Moolenaar 
74664220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
74764220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
74864220a7eSMarcel Moolenaar 	    0,
74964220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
75064220a7eSMarcel Moolenaar 	},
75164220a7eSMarcel Moolenaar 
75264220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
75364220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
75464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
75564220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
75664220a7eSMarcel Moolenaar 	},
75764220a7eSMarcel Moolenaar 
75864220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
75964220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
76064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
76164220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
76264220a7eSMarcel Moolenaar 	},
76364220a7eSMarcel Moolenaar 
76464220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
76564220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
76664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
76764220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
76864220a7eSMarcel Moolenaar 	},
76964220a7eSMarcel Moolenaar 
77064220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
77164220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
77264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
77364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
77464220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
77564220a7eSMarcel Moolenaar 	},
77664220a7eSMarcel Moolenaar 
77764220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
77864220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
77964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
78064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
78164220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
78264220a7eSMarcel Moolenaar 	},
78364220a7eSMarcel Moolenaar 
78464220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
78564220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
78664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
78764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
78864220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
78964220a7eSMarcel Moolenaar 	},
79064220a7eSMarcel Moolenaar 
79164220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
79264220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
79364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
79464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
79564220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
79664220a7eSMarcel Moolenaar 	},
79764220a7eSMarcel Moolenaar 
79864220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
79964220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
80064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
80164220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
80264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
80364220a7eSMarcel Moolenaar 	},
80464220a7eSMarcel Moolenaar 
80564220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
80664220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
80764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
80864220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
80964220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
81064220a7eSMarcel Moolenaar 	},
81164220a7eSMarcel Moolenaar 
81264220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
81364220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
81464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
81564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
81664220a7eSMarcel Moolenaar 	},
81764220a7eSMarcel Moolenaar 
81864220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
81964220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
82064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
82164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
82264220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
82364220a7eSMarcel Moolenaar 	},
82464220a7eSMarcel Moolenaar 
82564220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
8269c564b6cSJohn Hay };
82764220a7eSMarcel Moolenaar 
82864220a7eSMarcel Moolenaar static int
82964220a7eSMarcel Moolenaar puc_config_amc(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
83064220a7eSMarcel Moolenaar     intptr_t *res)
83164220a7eSMarcel Moolenaar {
83264220a7eSMarcel Moolenaar 	switch (cmd) {
83364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
83464220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
83564220a7eSMarcel Moolenaar 		return (0);
83664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
83764220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
83864220a7eSMarcel Moolenaar 		return (0);
83964220a7eSMarcel Moolenaar 	default:
84064220a7eSMarcel Moolenaar 		break;
84164220a7eSMarcel Moolenaar 	}
84264220a7eSMarcel Moolenaar 	return (ENXIO);
84364220a7eSMarcel Moolenaar }
84464220a7eSMarcel Moolenaar 
84564220a7eSMarcel Moolenaar static int
84664220a7eSMarcel Moolenaar puc_config_cronyx(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
84764220a7eSMarcel Moolenaar     intptr_t *res)
84864220a7eSMarcel Moolenaar {
84964220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
85064220a7eSMarcel Moolenaar 		*res = port * 0x200;
85164220a7eSMarcel Moolenaar 		return (0);
85264220a7eSMarcel Moolenaar 	}
85364220a7eSMarcel Moolenaar 	return (ENXIO);
85464220a7eSMarcel Moolenaar }
85564220a7eSMarcel Moolenaar 
85664220a7eSMarcel Moolenaar static int
85764220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
85864220a7eSMarcel Moolenaar     intptr_t *res)
85964220a7eSMarcel Moolenaar {
86064220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
86164220a7eSMarcel Moolenaar 
86264220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
86364220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
86464220a7eSMarcel Moolenaar 			port <<= 1;
86564220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
86664220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
86764220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
86864220a7eSMarcel Moolenaar 		return (0);
86964220a7eSMarcel Moolenaar 	}
87064220a7eSMarcel Moolenaar 	return (ENXIO);
87164220a7eSMarcel Moolenaar }
87264220a7eSMarcel Moolenaar 
87364220a7eSMarcel Moolenaar static int
87464220a7eSMarcel Moolenaar puc_config_icbook(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
87564220a7eSMarcel Moolenaar     intptr_t *res)
87664220a7eSMarcel Moolenaar {
87764220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
87864220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
87964220a7eSMarcel Moolenaar 		return (0);
88064220a7eSMarcel Moolenaar 	}
88164220a7eSMarcel Moolenaar 	return (ENXIO);
88264220a7eSMarcel Moolenaar }
88364220a7eSMarcel Moolenaar 
88464220a7eSMarcel Moolenaar static int
88564220a7eSMarcel Moolenaar puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
88664220a7eSMarcel Moolenaar     intptr_t *res)
88764220a7eSMarcel Moolenaar {
88864220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
88964220a7eSMarcel Moolenaar 	struct puc_bar *bar;
89064220a7eSMarcel Moolenaar 	uint8_t v0, v1;
89164220a7eSMarcel Moolenaar 
89264220a7eSMarcel Moolenaar 	switch (cmd) {
89364220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
89464220a7eSMarcel Moolenaar 		/*
89564220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
89664220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
89764220a7eSMarcel Moolenaar 		 */
89864220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
89964220a7eSMarcel Moolenaar 		if (bar == NULL)
90064220a7eSMarcel Moolenaar 			return (ENXIO);
90164220a7eSMarcel Moolenaar 		/* Set DLAB in the LCR register of UART 0. */
90264220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0x80);
90364220a7eSMarcel Moolenaar 		/* Write 0 to the SPR register of UART 0. */
90464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0);
90564220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
90664220a7eSMarcel Moolenaar 		v0 = bus_read_1(bar->b_res, 7);
90764220a7eSMarcel Moolenaar 		/* Write a specific value to the SPR register of UART 0. */
90864220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0x80 + -cfg->clock);
90964220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
91064220a7eSMarcel Moolenaar 		v1 = bus_read_1(bar->b_res, 7);
91164220a7eSMarcel Moolenaar 		/* Clear DLAB in the LCR register of UART 0. */
91264220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0);
91364220a7eSMarcel Moolenaar 		/* Save the two values read-back from the SPR register. */
91464220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
91564220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
91664220a7eSMarcel Moolenaar 			/*
91764220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
91864220a7eSMarcel Moolenaar 			 * by us. This means that the SPAD jumper is set.
91964220a7eSMarcel Moolenaar 			 */
92064220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
92164220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
92264220a7eSMarcel Moolenaar 			return (0);
92364220a7eSMarcel Moolenaar 		}
92464220a7eSMarcel Moolenaar 		if (v0 != 0) {
92564220a7eSMarcel Moolenaar 			/*
92664220a7eSMarcel Moolenaar 			 * The first value doesn't match. This can only mean
92764220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
92864220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
92964220a7eSMarcel Moolenaar 			 */
93064220a7eSMarcel Moolenaar 			if (bootverbose)
93164220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
93264220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
93364220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
93464220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
93564220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
93664220a7eSMarcel Moolenaar 				    "setting\n");
93764220a7eSMarcel Moolenaar 			return (0);
93864220a7eSMarcel Moolenaar 		}
93964220a7eSMarcel Moolenaar 		/*
94064220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't. We know
94164220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set. We also know that the
94264220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
94364220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
94464220a7eSMarcel Moolenaar 		 */
94564220a7eSMarcel Moolenaar 		if (bootverbose)
94664220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
94764220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
94864220a7eSMarcel Moolenaar 		return (0);
94964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
95064220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
95164220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
95264220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
95364220a7eSMarcel Moolenaar 			/*
95464220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
95564220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
95664220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed. Let's hope
95764220a7eSMarcel Moolenaar 			 * not...
95864220a7eSMarcel Moolenaar 			 */
95964220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
96064220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
96164220a7eSMarcel Moolenaar 			/*
96264220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
96364220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
96464220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
96564220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
96664220a7eSMarcel Moolenaar 			 */
96764220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
96864220a7eSMarcel Moolenaar 		} else
96964220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
97064220a7eSMarcel Moolenaar 		return (0);
97164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
97264220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
97364220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
97464220a7eSMarcel Moolenaar 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock)
97564220a7eSMarcel Moolenaar 		    ? PUC_ILR_NONE : PUC_ILR_QUATECH;
97664220a7eSMarcel Moolenaar 		return (0);
97764220a7eSMarcel Moolenaar 	default:
97864220a7eSMarcel Moolenaar 		break;
97964220a7eSMarcel Moolenaar 	}
98064220a7eSMarcel Moolenaar 	return (ENXIO);
98164220a7eSMarcel Moolenaar }
98264220a7eSMarcel Moolenaar 
98364220a7eSMarcel Moolenaar static int
98464220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
98564220a7eSMarcel Moolenaar     intptr_t *res)
98664220a7eSMarcel Moolenaar {
98764220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
98864220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
98964220a7eSMarcel Moolenaar 	struct puc_bar *bar;
99064220a7eSMarcel Moolenaar 	int efir, idx, ofs;
99164220a7eSMarcel Moolenaar 	uint8_t v;
99264220a7eSMarcel Moolenaar 
99364220a7eSMarcel Moolenaar 	switch (cmd) {
99464220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
99564220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
99664220a7eSMarcel Moolenaar 		if (bar == NULL)
99764220a7eSMarcel Moolenaar 			return (ENXIO);
99864220a7eSMarcel Moolenaar 
99964220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
100064220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
100164220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
100264220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
100364220a7eSMarcel Moolenaar 		idx = 0;
100464220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
100564220a7eSMarcel Moolenaar 			efir = base[idx];
100664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
100764220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
100864220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
100964220a7eSMarcel Moolenaar 				return (ENXIO);
101064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
101164220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
101264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
101364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
101464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
101564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
101664220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
101764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
101864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
101964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
102064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
102164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
102264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
102364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
102464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
102564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
102664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
102764220a7eSMarcel Moolenaar 			idx++;
102864220a7eSMarcel Moolenaar 		}
102964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
103064220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
103164220a7eSMarcel Moolenaar 		return (0);
103264220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
103364220a7eSMarcel Moolenaar 		switch (port) {
103464220a7eSMarcel Moolenaar 		case 0:
103564220a7eSMarcel Moolenaar 			*res = 0x2f8;
103664220a7eSMarcel Moolenaar 			return (0);
103764220a7eSMarcel Moolenaar 		case 1:
103864220a7eSMarcel Moolenaar 			*res = 0x2e8;
103964220a7eSMarcel Moolenaar 			return (0);
104064220a7eSMarcel Moolenaar 		case 2:
104164220a7eSMarcel Moolenaar 			*res = 0x3f8;
104264220a7eSMarcel Moolenaar 			return (0);
104364220a7eSMarcel Moolenaar 		case 3:
104464220a7eSMarcel Moolenaar 			*res = 0x3e8;
104564220a7eSMarcel Moolenaar 			return (0);
104664220a7eSMarcel Moolenaar 		case 4:
104764220a7eSMarcel Moolenaar 			*res = 0x278;
104864220a7eSMarcel Moolenaar 			return (0);
104964220a7eSMarcel Moolenaar 		}
105064220a7eSMarcel Moolenaar 		break;
105164220a7eSMarcel Moolenaar 	default:
105264220a7eSMarcel Moolenaar 		break;
105364220a7eSMarcel Moolenaar 	}
105464220a7eSMarcel Moolenaar 	return (ENXIO);
105564220a7eSMarcel Moolenaar }
105664220a7eSMarcel Moolenaar 
105764220a7eSMarcel Moolenaar static int
105864220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
105964220a7eSMarcel Moolenaar     intptr_t *res)
106064220a7eSMarcel Moolenaar {
106164220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
106264220a7eSMarcel Moolenaar 
106364220a7eSMarcel Moolenaar 	switch (cmd) {
106464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
106564220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
106664220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
106764220a7eSMarcel Moolenaar 			return (0);
106864220a7eSMarcel Moolenaar 		}
106964220a7eSMarcel Moolenaar 		break;
107064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
107164220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
107264220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
107364220a7eSMarcel Moolenaar 			return (0);
107464220a7eSMarcel Moolenaar 		}
107564220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
107664220a7eSMarcel Moolenaar 			switch (port) {
107764220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
107864220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
107964220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
108064220a7eSMarcel Moolenaar 			}
108164220a7eSMarcel Moolenaar 		}
108264220a7eSMarcel Moolenaar 		break;
108364220a7eSMarcel Moolenaar 	default:
108464220a7eSMarcel Moolenaar 		break;
108564220a7eSMarcel Moolenaar 	}
108664220a7eSMarcel Moolenaar 	return (ENXIO);
108764220a7eSMarcel Moolenaar }
108864220a7eSMarcel Moolenaar 
108964220a7eSMarcel Moolenaar static int
109064220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
109164220a7eSMarcel Moolenaar     intptr_t *res)
109264220a7eSMarcel Moolenaar {
109364220a7eSMarcel Moolenaar 	static uint16_t dual[] = {
109464220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
109564220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
109664220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
109764220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
109864220a7eSMarcel Moolenaar 	    0xD079, 0
109964220a7eSMarcel Moolenaar 	};
110064220a7eSMarcel Moolenaar 	static uint16_t quad[] = {
110164220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
110264220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
110364220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
110464220a7eSMarcel Moolenaar 	    0xB157, 0
110564220a7eSMarcel Moolenaar 	};
110664220a7eSMarcel Moolenaar 	static uint16_t octa[] = {
110764220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
110864220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
110964220a7eSMarcel Moolenaar 	};
111064220a7eSMarcel Moolenaar 	static struct {
111164220a7eSMarcel Moolenaar 		int ports;
111264220a7eSMarcel Moolenaar 		uint16_t *ids;
111364220a7eSMarcel Moolenaar 	} subdevs[] = {
111464220a7eSMarcel Moolenaar 	    { 2, dual },
111564220a7eSMarcel Moolenaar 	    { 4, quad },
111664220a7eSMarcel Moolenaar 	    { 8, octa },
111764220a7eSMarcel Moolenaar 	    { 0, NULL }
111864220a7eSMarcel Moolenaar 	};
111964220a7eSMarcel Moolenaar 	static char desc[64];
112064220a7eSMarcel Moolenaar 	int dev, id;
112164220a7eSMarcel Moolenaar 	uint16_t subdev;
112264220a7eSMarcel Moolenaar 
112364220a7eSMarcel Moolenaar 	switch (cmd) {
112464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
112564220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
112664220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
112764220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
112864220a7eSMarcel Moolenaar 		return (0);
112964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
113064220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
113164220a7eSMarcel Moolenaar 		dev = 0;
113264220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
113364220a7eSMarcel Moolenaar 			id = 0;
113464220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
113564220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
113664220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
113764220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
113864220a7eSMarcel Moolenaar 					return (0);
113964220a7eSMarcel Moolenaar 				}
114064220a7eSMarcel Moolenaar 				id++;
114164220a7eSMarcel Moolenaar 			}
114264220a7eSMarcel Moolenaar 			dev++;
114364220a7eSMarcel Moolenaar 		}
114464220a7eSMarcel Moolenaar 		return (ENXIO);
114564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
114664220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
114764220a7eSMarcel Moolenaar 		return (0);
114864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
1149c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
115064220a7eSMarcel Moolenaar 		return (0);
115164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
115264220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
115364220a7eSMarcel Moolenaar 		return (0);
115464220a7eSMarcel Moolenaar 	default:
115564220a7eSMarcel Moolenaar 		break;
115664220a7eSMarcel Moolenaar 	}
115764220a7eSMarcel Moolenaar 	return (ENXIO);
115864220a7eSMarcel Moolenaar }
115964220a7eSMarcel Moolenaar 
116064220a7eSMarcel Moolenaar static int
116164220a7eSMarcel Moolenaar puc_config_titan(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
116264220a7eSMarcel Moolenaar     intptr_t *res)
116364220a7eSMarcel Moolenaar {
116464220a7eSMarcel Moolenaar 	switch (cmd) {
116564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
116664220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
116764220a7eSMarcel Moolenaar 		return (0);
116864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
116964220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
117064220a7eSMarcel Moolenaar 		return (0);
117164220a7eSMarcel Moolenaar 	default:
117264220a7eSMarcel Moolenaar 		break;
117364220a7eSMarcel Moolenaar 	}
117464220a7eSMarcel Moolenaar 	return (ENXIO);
117564220a7eSMarcel Moolenaar }
1176