xref: /freebsd/sys/dev/puc/pucdata.c (revision 63fbf5047e8b1e87e7bfc000e53f9031097cd955)
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 	/*
23763fbf504SRobert Watson 	 * IBM SurePOS 300 Series (481033H) serial ports
23863fbf504SRobert Watson 	 * Details can be found on the IBM RSS websites
23963fbf504SRobert Watson 	 */
24063fbf504SRobert Watson 
24163fbf504SRobert Watson 	{   0x1014, 0x0297, 0xffff, 0,
24263fbf504SRobert Watson 	    "IBM SurePOS 300 Series (481033H) serial ports",
24363fbf504SRobert Watson 	    DEFAULT_RCLK,
24463fbf504SRobert Watson 	    PUC_PORT_4S, 0x10, 4, 0
24563fbf504SRobert Watson 	},
24663fbf504SRobert Watson 
24763fbf504SRobert Watson 	/*
2489c564b6cSJohn Hay 	 * SIIG Boards.
2499c564b6cSJohn Hay 	 *
2509c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
25164220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
2529c564b6cSJohn Hay 	 */
2539c564b6cSJohn Hay 
25464220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
25564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
25664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
25764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2589c564b6cSJohn Hay 	},
2599c564b6cSJohn Hay 
26064220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
26164220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
26264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
26364220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2649c564b6cSJohn Hay 	},
2659c564b6cSJohn Hay 
26664220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
26764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
26864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
26964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2709c564b6cSJohn Hay 	},
2719c564b6cSJohn Hay 
27264220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
27364220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
27464220a7eSMarcel Moolenaar 	    0,
27564220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
2769c564b6cSJohn Hay 	},
2779c564b6cSJohn Hay 
27864220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
27964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
28064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2829c564b6cSJohn Hay 	},
2839c564b6cSJohn Hay 
28464220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
28564220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
28664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2889c564b6cSJohn Hay 	},
2899c564b6cSJohn Hay 
29064220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
29164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
29264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2949c564b6cSJohn Hay 	},
2959c564b6cSJohn Hay 
29664220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
29764220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
29864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29964220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3009c564b6cSJohn Hay 	},
3019c564b6cSJohn Hay 
30264220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
30364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
30464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30564220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3069c564b6cSJohn Hay 	},
3079c564b6cSJohn Hay 
30864220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
30964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
31064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31164220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3129c564b6cSJohn Hay 	},
3139c564b6cSJohn Hay 
31464220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
31564220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
31664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3189c564b6cSJohn Hay 	},
3199c564b6cSJohn Hay 
32064220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
32164220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
32264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3249c564b6cSJohn Hay 	},
3259c564b6cSJohn Hay 
32664220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
32764220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
32864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3309c564b6cSJohn Hay 	},
3319c564b6cSJohn Hay 
33264220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
33364220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
33464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33564220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3369c564b6cSJohn Hay 	},
3379c564b6cSJohn Hay 
33864220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
33964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
34064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3429c564b6cSJohn Hay 	},
3439c564b6cSJohn Hay 
34464220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
34564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
34664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3489c564b6cSJohn Hay 	},
3499c564b6cSJohn Hay 
35064220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
35164220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
35264220a7eSMarcel Moolenaar 	    0,
35364220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
3549c564b6cSJohn Hay 	},
3559c564b6cSJohn Hay 
35664220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
35764220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
35864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
35964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3609c564b6cSJohn Hay 	},
3619c564b6cSJohn Hay 
36264220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
36364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
36464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3669c564b6cSJohn Hay 	},
3679c564b6cSJohn Hay 
36864220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
36964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
37064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3729c564b6cSJohn Hay 	},
3739c564b6cSJohn Hay 
37464220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
37564220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
37664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37764220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
37864220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3799c564b6cSJohn Hay 	},
3809c564b6cSJohn Hay 
38164220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
38264220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
38364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38464220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38564220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3869c564b6cSJohn Hay 	},
3879c564b6cSJohn Hay 
38864220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
38964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
39064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39164220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
39264220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3939c564b6cSJohn Hay 	},
3949c564b6cSJohn Hay 
39564220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
39664220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
39764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
3999c564b6cSJohn Hay 	},
4009c564b6cSJohn Hay 
40164220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
40264220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
40364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4059c564b6cSJohn Hay 	},
4069c564b6cSJohn Hay 
40764220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
40864220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
40964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4119c564b6cSJohn Hay 	},
4129c564b6cSJohn Hay 
41364220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
41464220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
41564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41664220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4179c564b6cSJohn Hay 	},
4189c564b6cSJohn Hay 
41964220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
42064220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
42164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42264220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4239c564b6cSJohn Hay 	},
4249c564b6cSJohn Hay 
42564220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
42664220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
42764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42864220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4299c564b6cSJohn Hay 	},
4309c564b6cSJohn Hay 
43164220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
43264220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
43364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
43564220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4369c564b6cSJohn Hay 	},
4379c564b6cSJohn Hay 
43864220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
43964220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
44064220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
44164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
44264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4439c564b6cSJohn Hay 	},
4449c564b6cSJohn Hay 
44564220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
44664220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
44764220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
44864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
44964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4509c564b6cSJohn Hay 	},
4519c564b6cSJohn Hay 
45264220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
45364220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
45464220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
45564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
45664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4579c564b6cSJohn Hay 	},
4589c564b6cSJohn Hay 
45964220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
46064220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
46164220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
46264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
46364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4649c564b6cSJohn Hay 	},
4659c564b6cSJohn Hay 
46664220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
46764220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
46864220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
46964220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4719c564b6cSJohn Hay 	},
4729c564b6cSJohn Hay 
47364220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
47464220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
47564220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
47664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4789c564b6cSJohn Hay 	},
4799c564b6cSJohn Hay 
48064220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
48164220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
48264220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
48364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
48464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4859c564b6cSJohn Hay 	},
4869c564b6cSJohn Hay 
48764220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
48864220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
48964220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
49064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
49164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
49276353f68SJohn Hay 	},
49376353f68SJohn Hay 
49464220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
49564220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
49664220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
49764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
49864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4999c564b6cSJohn Hay 	},
5009c564b6cSJohn Hay 
50164220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
50264220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
50364220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
50464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
50564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5069c564b6cSJohn Hay 	},
5079c564b6cSJohn Hay 
50864220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
50964220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
51064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
51164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5120ec6e983SJoerg Wunsch 	},
51340f01890SBruce Evans 
51464220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
51564220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
51664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
51764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5189c564b6cSJohn Hay 	},
5199c564b6cSJohn Hay 
520f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
521f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
522f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
523f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
524f6a60febSMaxim Konovalov 	},
525f6a60febSMaxim Konovalov 
52664220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
52764220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
52864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
52964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5309c564b6cSJohn Hay 	},
5319c564b6cSJohn Hay 
53264220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
53364220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
53464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
53564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5369c564b6cSJohn Hay 	},
5379c564b6cSJohn Hay 
53864220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
53964220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
54064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
54164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5429c564b6cSJohn Hay 	},
5439c564b6cSJohn Hay 
5440db1aa0bSStanislav Sedov 	{   0x1393, 0x1682, 0xffff, 0,
5450db1aa0bSStanislav Sedov 	    "Moxa Technologies, CP-168EL/PCIe",
5460db1aa0bSStanislav Sedov 	    DEFAULT_RCLK * 8,
5470db1aa0bSStanislav Sedov 	    PUC_PORT_8S, 0x18, 0, 8,
5480db1aa0bSStanislav Sedov 	},
5490db1aa0bSStanislav Sedov 
55064220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
55164220a7eSMarcel Moolenaar 	    "Cronyx Omega2-PCI",
55264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
55364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
55464220a7eSMarcel Moolenaar 	    .config_function = puc_config_cronyx
555de0d2cadSJohn Hay 	},
556de0d2cadSJohn Hay 
55764220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
55864220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
55964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
56064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5619c564b6cSJohn Hay 	},
5629c564b6cSJohn Hay 
56364220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
56464220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
56564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
56664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5679c564b6cSJohn Hay 	},
5689c564b6cSJohn Hay 
56964220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
57064220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
57164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
57264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5739c564b6cSJohn Hay 	},
5749c564b6cSJohn Hay 
57564220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
57664220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
57764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
57864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5799c564b6cSJohn Hay 	},
58064220a7eSMarcel Moolenaar 
58164220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
58264220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
58364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
58464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
58564220a7eSMarcel Moolenaar 	},
58664220a7eSMarcel Moolenaar 
58764220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
58864220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
58964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
59064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
59164220a7eSMarcel Moolenaar 	},
59264220a7eSMarcel Moolenaar 
59364220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
59464220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
59564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
59664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
59764220a7eSMarcel Moolenaar 	},
59864220a7eSMarcel Moolenaar 
59913ae6dceSKevin Lo 	{   0x1409, 0x7268, 0xffff, 0,
60013ae6dceSKevin Lo 	    "Sunix SUN1888",
60113ae6dceSKevin Lo 	    0,
60213ae6dceSKevin Lo 	    PUC_PORT_2P, 0x10, 0, 8,
60313ae6dceSKevin Lo 	},
60413ae6dceSKevin Lo 
60564220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
60664220a7eSMarcel Moolenaar 	    NULL,
60764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
60864220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
60964220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
6109c564b6cSJohn Hay 	},
6119c564b6cSJohn Hay 
6129c564b6cSJohn Hay 	/*
6139c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
6149c564b6cSJohn Hay 	 *
6159c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
6169c564b6cSJohn Hay 	 * <URL:http://www.oxsemi.com/products/uarts/index.html>
6179c564b6cSJohn Hay 	 *
6189c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
6199c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
6209c564b6cSJohn Hay 	 */
6219c564b6cSJohn Hay 
6220db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
6230db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
6240db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
6250db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
6260db885bbSDag-Erling Smørgrav 	},
6270db885bbSDag-Erling Smørgrav 
6281d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
6291d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
6301d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
6311d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
6321d860a7eSMarcel Moolenaar 	},
6331d860a7eSMarcel Moolenaar 
63464220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
635c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
636c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
63764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
63883431653SWarner Losh 	},
63983431653SWarner Losh 
64064220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
641c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
642c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
64364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
6449c564b6cSJohn Hay 	},
6459c564b6cSJohn Hay 
64664220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
64764220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
64864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
64964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
65043e42f36SDoug Ambrisko 	},
65143e42f36SDoug Ambrisko 
65264220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
65364220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
65464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
65564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6566cb38a02SDoug Ambrisko 	},
6576cb38a02SDoug Ambrisko 
65811a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
65911a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
66011a12794SRoman Kurakin 	    DEFAULT_RCLK * 10,
66111a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
66211a12794SRoman Kurakin 	},
66311a12794SRoman Kurakin 
66446ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
66546ce58c7SAndrew Thompson 	    "VScom PCI-100L",
66646ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
66746ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
66846ce58c7SAndrew Thompson 	},
66946ce58c7SAndrew Thompson 
67064220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
67164220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
67264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
67364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
674a58deb46SColin Percival 	},
675a58deb46SColin Percival 
67664220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
67746dd877dSPoul-Henning Kamp 	    "VScom 200Li",
67864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
67964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
68046dd877dSPoul-Henning Kamp 	},
6813e19d3c0SBruce M Simpson 
68264220a7eSMarcel Moolenaar 	/*
68364220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
68464220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
68564220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
68664220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
68764220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
68864220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
68964220a7eSMarcel Moolenaar 	 * access the external UARTs.
69064220a7eSMarcel Moolenaar 	 */
69164220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
69264220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
69364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
69464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
69564220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
69664220a7eSMarcel Moolenaar 	},
69764220a7eSMarcel Moolenaar 
69864220a7eSMarcel Moolenaar 	/*
69964220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
70064220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
70164220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
70264220a7eSMarcel Moolenaar 	 */
70364220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
70464220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
70564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
70664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
70764220a7eSMarcel Moolenaar 	},
70864220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
70964220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
71064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
71164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
71264220a7eSMarcel Moolenaar 	},
71364220a7eSMarcel Moolenaar 
71464220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
71564220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
71664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
71764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
71864220a7eSMarcel Moolenaar 	},
71964220a7eSMarcel Moolenaar 
72064220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
72164220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
72264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
72364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
72464220a7eSMarcel Moolenaar 	},
72564220a7eSMarcel Moolenaar 
72664220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
72764220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
72864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
72964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
73064220a7eSMarcel Moolenaar 	},
73164220a7eSMarcel Moolenaar 
73264220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
73364220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
73464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
73564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
73664220a7eSMarcel Moolenaar 	},
73764220a7eSMarcel Moolenaar 
7380dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
7390dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
7400dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
7410dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
7420dc908e7SAndrew Thompson 	},
7430dc908e7SAndrew Thompson 
74464220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
74564220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
74664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
74764220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
74864220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
74964220a7eSMarcel Moolenaar 	},
75064220a7eSMarcel Moolenaar 
75164220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
75264220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
75364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
75464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
75564220a7eSMarcel Moolenaar 	},
75664220a7eSMarcel Moolenaar 
757858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
758858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
759858030c4SAndrew Thompson 	    DEFAULT_RCLK,
760858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
761858030c4SAndrew Thompson 	},
762858030c4SAndrew Thompson 
76364220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
76464220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
76564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
76664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
76764220a7eSMarcel Moolenaar 	},
76864220a7eSMarcel Moolenaar 
76964220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
77064220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
77164220a7eSMarcel Moolenaar 	    0,
77264220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
77364220a7eSMarcel Moolenaar 	},
77464220a7eSMarcel Moolenaar 
775843994aeSJohn Baldwin 	/*
776843994aeSJohn Baldwin 	 * This is more specific than the generic NM9835 entry that follows, and
777843994aeSJohn Baldwin 	 * is placed here to _prevent_ puc from claiming this single port card.
778843994aeSJohn Baldwin 	 *
779843994aeSJohn Baldwin 	 * uart(4) will claim this device.
780843994aeSJohn Baldwin 	 */
781843994aeSJohn Baldwin 	{   0x9710, 0x9835, 0x1000, 1,
782843994aeSJohn Baldwin 	    "NetMos NM9835 based 1-port serial",
783843994aeSJohn Baldwin 	    DEFAULT_RCLK,
784843994aeSJohn Baldwin 	    PUC_PORT_1S, 0x10, 4, 0,
785843994aeSJohn Baldwin 	},
786843994aeSJohn Baldwin 
78764220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
78864220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
78964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
79064220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
79164220a7eSMarcel Moolenaar 	},
79264220a7eSMarcel Moolenaar 
79364220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
79464220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
79564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
79664220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
79764220a7eSMarcel Moolenaar 	},
79864220a7eSMarcel Moolenaar 
79964220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
80064220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
80164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
80264220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
80364220a7eSMarcel Moolenaar 	},
80464220a7eSMarcel Moolenaar 
80564220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
80664220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
80764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
80864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
80964220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
81064220a7eSMarcel Moolenaar 	},
81164220a7eSMarcel Moolenaar 
81264220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
81364220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
81464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
81564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
81664220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
81764220a7eSMarcel Moolenaar 	},
81864220a7eSMarcel Moolenaar 
81964220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
82064220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
82164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
82264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
82364220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
82464220a7eSMarcel Moolenaar 	},
82564220a7eSMarcel Moolenaar 
82664220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
82764220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
82864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
82964220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
83064220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
83164220a7eSMarcel Moolenaar 	},
83264220a7eSMarcel Moolenaar 
83364220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
83464220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
83564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
83664220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
83764220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
83864220a7eSMarcel Moolenaar 	},
83964220a7eSMarcel Moolenaar 
84064220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
84164220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
84264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
84364220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
84464220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
84564220a7eSMarcel Moolenaar 	},
84664220a7eSMarcel Moolenaar 
84764220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
84864220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
84964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
85064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
85164220a7eSMarcel Moolenaar 	},
85264220a7eSMarcel Moolenaar 
85364220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
85464220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
85564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
85664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
85764220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
85864220a7eSMarcel Moolenaar 	},
85964220a7eSMarcel Moolenaar 
86064220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
8619c564b6cSJohn Hay };
86264220a7eSMarcel Moolenaar 
86364220a7eSMarcel Moolenaar static int
86464220a7eSMarcel Moolenaar puc_config_amc(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
86564220a7eSMarcel Moolenaar     intptr_t *res)
86664220a7eSMarcel Moolenaar {
86764220a7eSMarcel Moolenaar 	switch (cmd) {
86864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
86964220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
87064220a7eSMarcel Moolenaar 		return (0);
87164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
87264220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
87364220a7eSMarcel Moolenaar 		return (0);
87464220a7eSMarcel Moolenaar 	default:
87564220a7eSMarcel Moolenaar 		break;
87664220a7eSMarcel Moolenaar 	}
87764220a7eSMarcel Moolenaar 	return (ENXIO);
87864220a7eSMarcel Moolenaar }
87964220a7eSMarcel Moolenaar 
88064220a7eSMarcel Moolenaar static int
88164220a7eSMarcel Moolenaar puc_config_cronyx(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
88264220a7eSMarcel Moolenaar     intptr_t *res)
88364220a7eSMarcel Moolenaar {
88464220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
88564220a7eSMarcel Moolenaar 		*res = port * 0x200;
88664220a7eSMarcel Moolenaar 		return (0);
88764220a7eSMarcel Moolenaar 	}
88864220a7eSMarcel Moolenaar 	return (ENXIO);
88964220a7eSMarcel Moolenaar }
89064220a7eSMarcel Moolenaar 
89164220a7eSMarcel Moolenaar static int
89264220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
89364220a7eSMarcel Moolenaar     intptr_t *res)
89464220a7eSMarcel Moolenaar {
89564220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
89664220a7eSMarcel Moolenaar 
89764220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
89864220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
89964220a7eSMarcel Moolenaar 			port <<= 1;
90064220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
90164220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
90264220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
90364220a7eSMarcel Moolenaar 		return (0);
90464220a7eSMarcel Moolenaar 	}
90564220a7eSMarcel Moolenaar 	return (ENXIO);
90664220a7eSMarcel Moolenaar }
90764220a7eSMarcel Moolenaar 
90864220a7eSMarcel Moolenaar static int
90964220a7eSMarcel Moolenaar puc_config_icbook(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
91064220a7eSMarcel Moolenaar     intptr_t *res)
91164220a7eSMarcel Moolenaar {
91264220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
91364220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
91464220a7eSMarcel Moolenaar 		return (0);
91564220a7eSMarcel Moolenaar 	}
91664220a7eSMarcel Moolenaar 	return (ENXIO);
91764220a7eSMarcel Moolenaar }
91864220a7eSMarcel Moolenaar 
91964220a7eSMarcel Moolenaar static int
92064220a7eSMarcel Moolenaar puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
92164220a7eSMarcel Moolenaar     intptr_t *res)
92264220a7eSMarcel Moolenaar {
92364220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
92464220a7eSMarcel Moolenaar 	struct puc_bar *bar;
92564220a7eSMarcel Moolenaar 	uint8_t v0, v1;
92664220a7eSMarcel Moolenaar 
92764220a7eSMarcel Moolenaar 	switch (cmd) {
92864220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
92964220a7eSMarcel Moolenaar 		/*
93064220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
93164220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
93264220a7eSMarcel Moolenaar 		 */
93364220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
93464220a7eSMarcel Moolenaar 		if (bar == NULL)
93564220a7eSMarcel Moolenaar 			return (ENXIO);
93664220a7eSMarcel Moolenaar 		/* Set DLAB in the LCR register of UART 0. */
93764220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0x80);
93864220a7eSMarcel Moolenaar 		/* Write 0 to the SPR register of UART 0. */
93964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0);
94064220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
94164220a7eSMarcel Moolenaar 		v0 = bus_read_1(bar->b_res, 7);
94264220a7eSMarcel Moolenaar 		/* Write a specific value to the SPR register of UART 0. */
94364220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0x80 + -cfg->clock);
94464220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
94564220a7eSMarcel Moolenaar 		v1 = bus_read_1(bar->b_res, 7);
94664220a7eSMarcel Moolenaar 		/* Clear DLAB in the LCR register of UART 0. */
94764220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0);
94864220a7eSMarcel Moolenaar 		/* Save the two values read-back from the SPR register. */
94964220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
95064220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
95164220a7eSMarcel Moolenaar 			/*
95264220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
95364220a7eSMarcel Moolenaar 			 * by us. This means that the SPAD jumper is set.
95464220a7eSMarcel Moolenaar 			 */
95564220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
95664220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
95764220a7eSMarcel Moolenaar 			return (0);
95864220a7eSMarcel Moolenaar 		}
95964220a7eSMarcel Moolenaar 		if (v0 != 0) {
96064220a7eSMarcel Moolenaar 			/*
96164220a7eSMarcel Moolenaar 			 * The first value doesn't match. This can only mean
96264220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
96364220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
96464220a7eSMarcel Moolenaar 			 */
96564220a7eSMarcel Moolenaar 			if (bootverbose)
96664220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
96764220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
96864220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
96964220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
97064220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
97164220a7eSMarcel Moolenaar 				    "setting\n");
97264220a7eSMarcel Moolenaar 			return (0);
97364220a7eSMarcel Moolenaar 		}
97464220a7eSMarcel Moolenaar 		/*
97564220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't. We know
97664220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set. We also know that the
97764220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
97864220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
97964220a7eSMarcel Moolenaar 		 */
98064220a7eSMarcel Moolenaar 		if (bootverbose)
98164220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
98264220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
98364220a7eSMarcel Moolenaar 		return (0);
98464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
98564220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
98664220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
98764220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
98864220a7eSMarcel Moolenaar 			/*
98964220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
99064220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
99164220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed. Let's hope
99264220a7eSMarcel Moolenaar 			 * not...
99364220a7eSMarcel Moolenaar 			 */
99464220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
99564220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
99664220a7eSMarcel Moolenaar 			/*
99764220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
99864220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
99964220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
100064220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
100164220a7eSMarcel Moolenaar 			 */
100264220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
100364220a7eSMarcel Moolenaar 		} else
100464220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
100564220a7eSMarcel Moolenaar 		return (0);
100664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
100764220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
100864220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
100964220a7eSMarcel Moolenaar 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock)
101064220a7eSMarcel Moolenaar 		    ? PUC_ILR_NONE : PUC_ILR_QUATECH;
101164220a7eSMarcel Moolenaar 		return (0);
101264220a7eSMarcel Moolenaar 	default:
101364220a7eSMarcel Moolenaar 		break;
101464220a7eSMarcel Moolenaar 	}
101564220a7eSMarcel Moolenaar 	return (ENXIO);
101664220a7eSMarcel Moolenaar }
101764220a7eSMarcel Moolenaar 
101864220a7eSMarcel Moolenaar static int
101964220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
102064220a7eSMarcel Moolenaar     intptr_t *res)
102164220a7eSMarcel Moolenaar {
102264220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
102364220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
102464220a7eSMarcel Moolenaar 	struct puc_bar *bar;
102564220a7eSMarcel Moolenaar 	int efir, idx, ofs;
102664220a7eSMarcel Moolenaar 	uint8_t v;
102764220a7eSMarcel Moolenaar 
102864220a7eSMarcel Moolenaar 	switch (cmd) {
102964220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
103064220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
103164220a7eSMarcel Moolenaar 		if (bar == NULL)
103264220a7eSMarcel Moolenaar 			return (ENXIO);
103364220a7eSMarcel Moolenaar 
103464220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
103564220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
103664220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
103764220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
103864220a7eSMarcel Moolenaar 		idx = 0;
103964220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
104064220a7eSMarcel Moolenaar 			efir = base[idx];
104164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
104264220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
104364220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
104464220a7eSMarcel Moolenaar 				return (ENXIO);
104564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
104664220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
104764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
104864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
104964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
105064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
105164220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
105264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
105364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
105464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
105564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
105664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
105764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
105864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
105964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
106064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
106164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
106264220a7eSMarcel Moolenaar 			idx++;
106364220a7eSMarcel Moolenaar 		}
106464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
106564220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
106664220a7eSMarcel Moolenaar 		return (0);
106764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
106864220a7eSMarcel Moolenaar 		switch (port) {
106964220a7eSMarcel Moolenaar 		case 0:
107064220a7eSMarcel Moolenaar 			*res = 0x2f8;
107164220a7eSMarcel Moolenaar 			return (0);
107264220a7eSMarcel Moolenaar 		case 1:
107364220a7eSMarcel Moolenaar 			*res = 0x2e8;
107464220a7eSMarcel Moolenaar 			return (0);
107564220a7eSMarcel Moolenaar 		case 2:
107664220a7eSMarcel Moolenaar 			*res = 0x3f8;
107764220a7eSMarcel Moolenaar 			return (0);
107864220a7eSMarcel Moolenaar 		case 3:
107964220a7eSMarcel Moolenaar 			*res = 0x3e8;
108064220a7eSMarcel Moolenaar 			return (0);
108164220a7eSMarcel Moolenaar 		case 4:
108264220a7eSMarcel Moolenaar 			*res = 0x278;
108364220a7eSMarcel Moolenaar 			return (0);
108464220a7eSMarcel Moolenaar 		}
108564220a7eSMarcel Moolenaar 		break;
108664220a7eSMarcel Moolenaar 	default:
108764220a7eSMarcel Moolenaar 		break;
108864220a7eSMarcel Moolenaar 	}
108964220a7eSMarcel Moolenaar 	return (ENXIO);
109064220a7eSMarcel Moolenaar }
109164220a7eSMarcel Moolenaar 
109264220a7eSMarcel Moolenaar static int
109364220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
109464220a7eSMarcel Moolenaar     intptr_t *res)
109564220a7eSMarcel Moolenaar {
109664220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
109764220a7eSMarcel Moolenaar 
109864220a7eSMarcel Moolenaar 	switch (cmd) {
109964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
110064220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
110164220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
110264220a7eSMarcel Moolenaar 			return (0);
110364220a7eSMarcel Moolenaar 		}
110464220a7eSMarcel Moolenaar 		break;
110564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
110664220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
110764220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
110864220a7eSMarcel Moolenaar 			return (0);
110964220a7eSMarcel Moolenaar 		}
111064220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
111164220a7eSMarcel Moolenaar 			switch (port) {
111264220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
111364220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
111464220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
111564220a7eSMarcel Moolenaar 			}
111664220a7eSMarcel Moolenaar 		}
111764220a7eSMarcel Moolenaar 		break;
111864220a7eSMarcel Moolenaar 	default:
111964220a7eSMarcel Moolenaar 		break;
112064220a7eSMarcel Moolenaar 	}
112164220a7eSMarcel Moolenaar 	return (ENXIO);
112264220a7eSMarcel Moolenaar }
112364220a7eSMarcel Moolenaar 
112464220a7eSMarcel Moolenaar static int
112564220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
112664220a7eSMarcel Moolenaar     intptr_t *res)
112764220a7eSMarcel Moolenaar {
112864220a7eSMarcel Moolenaar 	static uint16_t dual[] = {
112964220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
113064220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
113164220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
113264220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
113364220a7eSMarcel Moolenaar 	    0xD079, 0
113464220a7eSMarcel Moolenaar 	};
113564220a7eSMarcel Moolenaar 	static uint16_t quad[] = {
113664220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
113764220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
113864220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
113964220a7eSMarcel Moolenaar 	    0xB157, 0
114064220a7eSMarcel Moolenaar 	};
114164220a7eSMarcel Moolenaar 	static uint16_t octa[] = {
114264220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
114364220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
114464220a7eSMarcel Moolenaar 	};
114564220a7eSMarcel Moolenaar 	static struct {
114664220a7eSMarcel Moolenaar 		int ports;
114764220a7eSMarcel Moolenaar 		uint16_t *ids;
114864220a7eSMarcel Moolenaar 	} subdevs[] = {
114964220a7eSMarcel Moolenaar 	    { 2, dual },
115064220a7eSMarcel Moolenaar 	    { 4, quad },
115164220a7eSMarcel Moolenaar 	    { 8, octa },
115264220a7eSMarcel Moolenaar 	    { 0, NULL }
115364220a7eSMarcel Moolenaar 	};
115464220a7eSMarcel Moolenaar 	static char desc[64];
115564220a7eSMarcel Moolenaar 	int dev, id;
115664220a7eSMarcel Moolenaar 	uint16_t subdev;
115764220a7eSMarcel Moolenaar 
115864220a7eSMarcel Moolenaar 	switch (cmd) {
115964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
116064220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
116164220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
116264220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
116364220a7eSMarcel Moolenaar 		return (0);
116464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
116564220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
116664220a7eSMarcel Moolenaar 		dev = 0;
116764220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
116864220a7eSMarcel Moolenaar 			id = 0;
116964220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
117064220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
117164220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
117264220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
117364220a7eSMarcel Moolenaar 					return (0);
117464220a7eSMarcel Moolenaar 				}
117564220a7eSMarcel Moolenaar 				id++;
117664220a7eSMarcel Moolenaar 			}
117764220a7eSMarcel Moolenaar 			dev++;
117864220a7eSMarcel Moolenaar 		}
117964220a7eSMarcel Moolenaar 		return (ENXIO);
118064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
118164220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
118264220a7eSMarcel Moolenaar 		return (0);
118364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
1184c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
118564220a7eSMarcel Moolenaar 		return (0);
118664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
118764220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
118864220a7eSMarcel Moolenaar 		return (0);
118964220a7eSMarcel Moolenaar 	default:
119064220a7eSMarcel Moolenaar 		break;
119164220a7eSMarcel Moolenaar 	}
119264220a7eSMarcel Moolenaar 	return (ENXIO);
119364220a7eSMarcel Moolenaar }
119464220a7eSMarcel Moolenaar 
119564220a7eSMarcel Moolenaar static int
119664220a7eSMarcel Moolenaar puc_config_titan(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
119764220a7eSMarcel Moolenaar     intptr_t *res)
119864220a7eSMarcel Moolenaar {
119964220a7eSMarcel Moolenaar 	switch (cmd) {
120064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
120164220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
120264220a7eSMarcel Moolenaar 		return (0);
120364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
120464220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
120564220a7eSMarcel Moolenaar 		return (0);
120664220a7eSMarcel Moolenaar 	default:
120764220a7eSMarcel Moolenaar 		break;
120864220a7eSMarcel Moolenaar 	}
120964220a7eSMarcel Moolenaar 	return (ENXIO);
121064220a7eSMarcel Moolenaar }
1211