xref: /freebsd/sys/dev/puc/pucdata.c (revision 282211ea8b405dada7d2534b37dc55a969d11dca)
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;
596e9f075aSJohn Baldwin static puc_config_f puc_config_oxford_pcie;
60dc7d0deaSMarcel Moolenaar 
6164220a7eSMarcel Moolenaar const struct puc_cfg puc_pci_devices[] = {
62a27ffb41SDavid E. O'Brien 
6364220a7eSMarcel Moolenaar 	{   0x0009, 0x7168, 0xffff, 0,
6464220a7eSMarcel Moolenaar 	    "Sunix SUN1889",
6564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
6664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
670efcc68bSBruce Evans 	},
680efcc68bSBruce Evans 
6964220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1049,
7064220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
7164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
7264220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
7364220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
74dc7d0deaSMarcel Moolenaar 	},
75dc7d0deaSMarcel Moolenaar 
7664220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104a,
7764220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
7864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
7964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, -1,
8064220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
81a27ffb41SDavid E. O'Brien 	},
82a27ffb41SDavid E. O'Brien 
8364220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104b,
8464220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
8564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, -1,
8764220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
88a27ffb41SDavid E. O'Brien 	},
89a27ffb41SDavid E. O'Brien 
9064220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1223,
9164220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
9264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9364220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
9464220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
95a27ffb41SDavid E. O'Brien 	},
96a27ffb41SDavid E. O'Brien 
9764220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1226,
9864220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
9964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10064220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10164220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
102a27ffb41SDavid E. O'Brien 	},
103a27ffb41SDavid E. O'Brien 
10464220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1282,
10564220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
10664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10764220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10864220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
109a27ffb41SDavid E. O'Brien 	},
110a27ffb41SDavid E. O'Brien 
11164220a7eSMarcel Moolenaar 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
11264220a7eSMarcel Moolenaar 	    "VScom PCI-800",
11364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
11464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1152569e387SDavid E. O'Brien 	},
11664220a7eSMarcel Moolenaar 
11764220a7eSMarcel Moolenaar 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
11864220a7eSMarcel Moolenaar 	    "VScom PCI-400",
11964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
1212569e387SDavid E. O'Brien 	},
12264220a7eSMarcel Moolenaar 
12364220a7eSMarcel Moolenaar 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
12464220a7eSMarcel Moolenaar 	    "VScom PCI-200",
12564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1272569e387SDavid E. O'Brien 	},
128a27ffb41SDavid E. O'Brien 
1299c564b6cSJohn Hay 	/*
13064220a7eSMarcel Moolenaar 	 * Boca Research Turbo Serial 658 (8 serial port) card.
13164220a7eSMarcel Moolenaar 	 * Appears to be the same as Chase Research PLC PCI-FAST8
13264220a7eSMarcel Moolenaar 	 * and Perle PCI-FAST8 Multi-Port serial cards.
1339c564b6cSJohn Hay 	 */
13464220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
13564220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 658",
13664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
13764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1389c564b6cSJohn Hay 	},
1399c564b6cSJohn Hay 
14064220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
14164220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 654",
14264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
14464220a7eSMarcel Moolenaar 	},
1459c564b6cSJohn Hay 
1469c564b6cSJohn Hay 	/*
1479c564b6cSJohn Hay 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
1489c564b6cSJohn Hay 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
1499c564b6cSJohn Hay 	 * into the subsystem fields, and claims that it's a
1509c564b6cSJohn Hay 	 * network/misc (0x02/0x80) device.
1519c564b6cSJohn Hay 	 */
15264220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
15364220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4035",
15464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
15564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1569c564b6cSJohn Hay 	},
1579c564b6cSJohn Hay 
1589c564b6cSJohn Hay 	/*
15964220a7eSMarcel Moolenaar 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
16064220a7eSMarcel Moolenaar 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
16164220a7eSMarcel Moolenaar 	 * into the subsystem fields, and claims that it's a
16264220a7eSMarcel Moolenaar 	 * network/misc (0x02/0x80) device.
1639c564b6cSJohn Hay 	 */
16464220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
16564220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4014",
16664220a7eSMarcel Moolenaar 	    0,
16764220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x20, 4, 0,
1689c564b6cSJohn Hay 	},
1699c564b6cSJohn Hay 
17064220a7eSMarcel Moolenaar 	{   0x10e8, 0x818e, 0xffff, 0,
17164220a7eSMarcel Moolenaar 	    "Applied Micro Circuits 8 Port UART",
17264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
17364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
17464220a7eSMarcel Moolenaar 	    .config_function = puc_config_amc
17564220a7eSMarcel Moolenaar 	},
1769c564b6cSJohn Hay 
17764220a7eSMarcel Moolenaar 	{   0x11fe, 0x8010, 0xffff, 0,
17864220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part A",
17964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18164220a7eSMarcel Moolenaar 	},
18264220a7eSMarcel Moolenaar 
18364220a7eSMarcel Moolenaar 	{   0x11fe, 0x8011, 0xffff, 0,
18464220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part B",
18564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18764220a7eSMarcel Moolenaar 	},
18864220a7eSMarcel Moolenaar 
18964220a7eSMarcel Moolenaar 	{   0x11fe, 0x8012, 0xffff, 0,
19064220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part A",
19164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19364220a7eSMarcel Moolenaar 	},
19464220a7eSMarcel Moolenaar 
19564220a7eSMarcel Moolenaar 	{   0x11fe, 0x8013, 0xffff, 0,
19664220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part B",
19764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19964220a7eSMarcel Moolenaar 	},
20064220a7eSMarcel Moolenaar 
20164220a7eSMarcel Moolenaar 	{   0x11fe, 0x8014, 0xffff, 0,
20264220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/4 RJ45",
20364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
20464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
20564220a7eSMarcel Moolenaar 	},
20664220a7eSMarcel Moolenaar 
20764220a7eSMarcel Moolenaar 	{   0x11fe, 0x8015, 0xffff, 0,
20864220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/Quad",
20964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21164220a7eSMarcel Moolenaar 	},
21264220a7eSMarcel Moolenaar 
21364220a7eSMarcel Moolenaar 	{   0x11fe, 0x8016, 0xffff, 0,
21464220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part A",
21564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21764220a7eSMarcel Moolenaar 	},
21864220a7eSMarcel Moolenaar 
21964220a7eSMarcel Moolenaar 	{   0x11fe, 0x8017, 0xffff, 0,
22064220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part B",
22164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22264220a7eSMarcel Moolenaar 	    PUC_PORT_12S, 0x10, 0, 8,
22364220a7eSMarcel Moolenaar 	},
22464220a7eSMarcel Moolenaar 
22564220a7eSMarcel Moolenaar 	{   0x11fe, 0x8018, 0xffff, 0,
22664220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part A",
22764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
22964220a7eSMarcel Moolenaar 	},
23064220a7eSMarcel Moolenaar 
23164220a7eSMarcel Moolenaar 	{   0x11fe, 0x8019, 0xffff, 0,
23264220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part B",
23364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23564220a7eSMarcel Moolenaar 	},
2369c564b6cSJohn Hay 
2379c564b6cSJohn Hay 	/*
23863fbf504SRobert Watson 	 * IBM SurePOS 300 Series (481033H) serial ports
23963fbf504SRobert Watson 	 * Details can be found on the IBM RSS websites
24063fbf504SRobert Watson 	 */
24163fbf504SRobert Watson 
24263fbf504SRobert Watson 	{   0x1014, 0x0297, 0xffff, 0,
24363fbf504SRobert Watson 	    "IBM SurePOS 300 Series (481033H) serial ports",
24463fbf504SRobert Watson 	    DEFAULT_RCLK,
24563fbf504SRobert Watson 	    PUC_PORT_4S, 0x10, 4, 0
24663fbf504SRobert Watson 	},
24763fbf504SRobert Watson 
24863fbf504SRobert Watson 	/*
2499c564b6cSJohn Hay 	 * SIIG Boards.
2509c564b6cSJohn Hay 	 *
2519c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
25264220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
2539c564b6cSJohn Hay 	 */
2549c564b6cSJohn Hay 
25564220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
25664220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
25764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
25864220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2599c564b6cSJohn Hay 	},
2609c564b6cSJohn Hay 
26164220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
26264220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
26364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
26464220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2659c564b6cSJohn Hay 	},
2669c564b6cSJohn Hay 
26764220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
26864220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
26964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
27064220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2719c564b6cSJohn Hay 	},
2729c564b6cSJohn Hay 
27364220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
27464220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
27564220a7eSMarcel Moolenaar 	    0,
27664220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
2779c564b6cSJohn Hay 	},
2789c564b6cSJohn Hay 
27964220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
28064220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
28164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2839c564b6cSJohn Hay 	},
2849c564b6cSJohn Hay 
28564220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
28664220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
28764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2899c564b6cSJohn Hay 	},
2909c564b6cSJohn Hay 
29164220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
29264220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
29364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2959c564b6cSJohn Hay 	},
2969c564b6cSJohn Hay 
29764220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
29864220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
29964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30064220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3019c564b6cSJohn Hay 	},
3029c564b6cSJohn Hay 
30364220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
30464220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
30564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30664220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3079c564b6cSJohn Hay 	},
3089c564b6cSJohn Hay 
30964220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
31064220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
31164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31264220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3139c564b6cSJohn Hay 	},
3149c564b6cSJohn Hay 
31564220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
31664220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
31764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3199c564b6cSJohn Hay 	},
3209c564b6cSJohn Hay 
32164220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
32264220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
32364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3259c564b6cSJohn Hay 	},
3269c564b6cSJohn Hay 
32764220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
32864220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
32964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3319c564b6cSJohn Hay 	},
3329c564b6cSJohn Hay 
33364220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
33464220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
33564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33664220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3379c564b6cSJohn Hay 	},
3389c564b6cSJohn Hay 
33964220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
34064220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
34164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34264220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3439c564b6cSJohn Hay 	},
3449c564b6cSJohn Hay 
34564220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
34664220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
34764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34864220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3499c564b6cSJohn Hay 	},
3509c564b6cSJohn Hay 
35164220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
35264220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
35364220a7eSMarcel Moolenaar 	    0,
35464220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
3559c564b6cSJohn Hay 	},
3569c564b6cSJohn Hay 
35764220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
35864220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
35964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3619c564b6cSJohn Hay 	},
3629c564b6cSJohn Hay 
36364220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
36464220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
36564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3679c564b6cSJohn Hay 	},
3689c564b6cSJohn Hay 
36964220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
37064220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
37164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3739c564b6cSJohn Hay 	},
3749c564b6cSJohn Hay 
37564220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
37664220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
37764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37864220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
37964220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3809c564b6cSJohn Hay 	},
3819c564b6cSJohn Hay 
38264220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
38364220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
38464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38564220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38664220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3879c564b6cSJohn Hay 	},
3889c564b6cSJohn Hay 
38964220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
39064220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
39164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39264220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
39364220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3949c564b6cSJohn Hay 	},
3959c564b6cSJohn Hay 
39664220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
39764220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
39864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4009c564b6cSJohn Hay 	},
4019c564b6cSJohn Hay 
40264220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
40364220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
40464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4069c564b6cSJohn Hay 	},
4079c564b6cSJohn Hay 
40864220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
40964220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
41064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4129c564b6cSJohn Hay 	},
4139c564b6cSJohn Hay 
41464220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
41564220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
41664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41764220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4189c564b6cSJohn Hay 	},
4199c564b6cSJohn Hay 
42064220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
42164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
42264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42364220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4249c564b6cSJohn Hay 	},
4259c564b6cSJohn Hay 
42664220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
42764220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
42864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42964220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4309c564b6cSJohn Hay 	},
4319c564b6cSJohn Hay 
43264220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
43364220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
43464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
43664220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4379c564b6cSJohn Hay 	},
4389c564b6cSJohn Hay 
43964220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
44064220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
44164220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
44264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
44364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4449c564b6cSJohn Hay 	},
4459c564b6cSJohn Hay 
44664220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
44764220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
44864220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
44964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
45064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4519c564b6cSJohn Hay 	},
4529c564b6cSJohn Hay 
45364220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
45464220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
45564220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
45664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
45764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4589c564b6cSJohn Hay 	},
4599c564b6cSJohn Hay 
46064220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
46164220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
46264220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
46364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
46464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4659c564b6cSJohn Hay 	},
4669c564b6cSJohn Hay 
46764220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
46864220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
46964220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
47064220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4729c564b6cSJohn Hay 	},
4739c564b6cSJohn Hay 
47464220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
47564220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
47664220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
47764220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4799c564b6cSJohn Hay 	},
4809c564b6cSJohn Hay 
48164220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
48264220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
48364220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
48464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
48564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4869c564b6cSJohn Hay 	},
4879c564b6cSJohn Hay 
48864220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
48964220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
49064220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
49164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
49264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
49376353f68SJohn Hay 	},
49476353f68SJohn Hay 
49564220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
49664220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
49764220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
49864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
49964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5009c564b6cSJohn Hay 	},
5019c564b6cSJohn Hay 
50264220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
50364220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
50464220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
50564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
50664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5079c564b6cSJohn Hay 	},
5089c564b6cSJohn Hay 
50964220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
51064220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
51164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
51264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5130ec6e983SJoerg Wunsch 	},
51440f01890SBruce Evans 
51564220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
51664220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
51764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
51864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5199c564b6cSJohn Hay 	},
5209c564b6cSJohn Hay 
521f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
522f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
523f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
524f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
525f6a60febSMaxim Konovalov 	},
526f6a60febSMaxim Konovalov 
52764220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
52864220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
52964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
53064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5319c564b6cSJohn Hay 	},
5329c564b6cSJohn Hay 
53364220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
53464220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
53564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
53664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5379c564b6cSJohn Hay 	},
5389c564b6cSJohn Hay 
53964220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
54064220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
54164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
54264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5439c564b6cSJohn Hay 	},
5449c564b6cSJohn Hay 
5450db1aa0bSStanislav Sedov 	{   0x1393, 0x1682, 0xffff, 0,
5460db1aa0bSStanislav Sedov 	    "Moxa Technologies, CP-168EL/PCIe",
5470db1aa0bSStanislav Sedov 	    DEFAULT_RCLK * 8,
5480db1aa0bSStanislav Sedov 	    PUC_PORT_8S, 0x18, 0, 8,
5490db1aa0bSStanislav Sedov 	},
5500db1aa0bSStanislav Sedov 
55164220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
55264220a7eSMarcel Moolenaar 	    "Cronyx Omega2-PCI",
55364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
55464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
55564220a7eSMarcel Moolenaar 	    .config_function = puc_config_cronyx
556de0d2cadSJohn Hay 	},
557de0d2cadSJohn Hay 
55879aac43eSEd Maste 	{   0x13a8, 0x0258, 0xffff, 0,
55979aac43eSEd Maste 	    "Exar XR17V258IV",
56079aac43eSEd Maste 	    DEFAULT_RCLK * 8,
56179aac43eSEd Maste 	    PUC_PORT_8S, 0x10, 0, -1,
56279aac43eSEd Maste 	},
56379aac43eSEd Maste 
56464220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
56564220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
56664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
56764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5689c564b6cSJohn Hay 	},
5699c564b6cSJohn Hay 
57064220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
57164220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
57264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
57364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5749c564b6cSJohn Hay 	},
5759c564b6cSJohn Hay 
57664220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
57764220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
57864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
57964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5809c564b6cSJohn Hay 	},
5819c564b6cSJohn Hay 
58264220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
58364220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
58464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
58564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
5869c564b6cSJohn Hay 	},
58764220a7eSMarcel Moolenaar 
58864220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
58964220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
59064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
59164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
59264220a7eSMarcel Moolenaar 	},
59364220a7eSMarcel Moolenaar 
59464220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
59564220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
59664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
59764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
59864220a7eSMarcel Moolenaar 	},
59964220a7eSMarcel Moolenaar 
60064220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
60164220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
60264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
60364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
60464220a7eSMarcel Moolenaar 	},
60564220a7eSMarcel Moolenaar 
60613ae6dceSKevin Lo 	{   0x1409, 0x7268, 0xffff, 0,
60713ae6dceSKevin Lo 	    "Sunix SUN1888",
60813ae6dceSKevin Lo 	    0,
60913ae6dceSKevin Lo 	    PUC_PORT_2P, 0x10, 0, 8,
61013ae6dceSKevin Lo 	},
61113ae6dceSKevin Lo 
61264220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
61364220a7eSMarcel Moolenaar 	    NULL,
61464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
61564220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
61664220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
6179c564b6cSJohn Hay 	},
6189c564b6cSJohn Hay 
6199c564b6cSJohn Hay 	/*
6209c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
6219c564b6cSJohn Hay 	 *
6229c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
6236e9f075aSJohn Baldwin 	 * <URL:http://www.plxtech.com/products/uart/>
6249c564b6cSJohn Hay 	 *
6259c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
6269c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
6279c564b6cSJohn Hay 	 */
6289c564b6cSJohn Hay 
6290db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
6300db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
6310db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
6320db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
6330db885bbSDag-Erling Smørgrav 	},
6340db885bbSDag-Erling Smørgrav 
6351d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
6361d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
6371d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
6381d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
6391d860a7eSMarcel Moolenaar 	},
6401d860a7eSMarcel Moolenaar 
641*282211eaSJohn Baldwin 	{   0x1415, 0x9501, 0x14db, 0x2150,
642*282211eaSJohn Baldwin 	    "Kuroutoshikou SERIAL4P-LPPCI2",
643*282211eaSJohn Baldwin 	    DEFAULT_RCLK * 10,
644*282211eaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
645*282211eaSJohn Baldwin 	},
646*282211eaSJohn Baldwin 
64764220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
648c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
649c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
65064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
65183431653SWarner Losh 	},
65283431653SWarner Losh 
65364220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
654c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
655c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
65664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
6579c564b6cSJohn Hay 	},
6589c564b6cSJohn Hay 
65964220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
66064220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
66164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
66264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
66343e42f36SDoug Ambrisko 	},
66443e42f36SDoug Ambrisko 
66564220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
66664220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
66764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
66864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6696cb38a02SDoug Ambrisko 	},
6706cb38a02SDoug Ambrisko 
67111a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
67211a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
67311a12794SRoman Kurakin 	    DEFAULT_RCLK * 10,
67411a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
67511a12794SRoman Kurakin 	},
67611a12794SRoman Kurakin 
677f09d9fbaSJohn Baldwin 	/*
678f09d9fbaSJohn Baldwin 	 * Perle boards use Oxford Semiconductor chips, but they store the
679f09d9fbaSJohn Baldwin 	 * Oxford Semiconductor device ID as a subvendor device ID and use
680f09d9fbaSJohn Baldwin 	 * their own device IDs.
681f09d9fbaSJohn Baldwin 	 */
682f09d9fbaSJohn Baldwin 
683f09d9fbaSJohn Baldwin 	{   0x155f, 0x0331, 0xffff, 0,
684f09d9fbaSJohn Baldwin 	    "Perle Speed4 LE",
685f09d9fbaSJohn Baldwin 	    DEFAULT_RCLK * 8,
686f09d9fbaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
687f09d9fbaSJohn Baldwin 	},
688f09d9fbaSJohn Baldwin 
6896e9f075aSJohn Baldwin 	/*
6906e9f075aSJohn Baldwin 	 * Oxford Semiconductor PCI Express Expresso family
6916e9f075aSJohn Baldwin 	 *
6926e9f075aSJohn Baldwin 	 * Found in many 'native' PCI Express serial boards such as:
6936e9f075aSJohn Baldwin 	 *
6946e9f075aSJohn Baldwin 	 * eMegatech MP954ER4 (4 port) and MP958ER8 (8 port)
6956e9f075aSJohn Baldwin 	 * <URL:http://www.emegatech.com.tw/pdrs232pcie.html>
6966e9f075aSJohn Baldwin 	 *
6976e9f075aSJohn Baldwin 	 * Lindy 51189 (4 port)
6986e9f075aSJohn Baldwin 	 * <URL:http://www.lindy.com> <URL:http://tinyurl.com/lindy-51189>
6996e9f075aSJohn Baldwin 	 *
7006e9f075aSJohn Baldwin 	 * StarTech.com PEX4S952 (4 port) and PEX8S952 (8 port)
7016e9f075aSJohn Baldwin 	 * <URL:http://www.startech.com>
7026e9f075aSJohn Baldwin 	 */
7036e9f075aSJohn Baldwin 
7046e9f075aSJohn Baldwin 	{   0x1415, 0xc158, 0xffff, 0,
7056e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs",
7066e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7076e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7086e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7096e9f075aSJohn Baldwin 	},
7106e9f075aSJohn Baldwin 
7116e9f075aSJohn Baldwin 	{   0x1415, 0xc15d, 0xffff, 0,
7126e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs (function 1)",
7136e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7146e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7156e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7166e9f075aSJohn Baldwin 	},
7176e9f075aSJohn Baldwin 
7186e9f075aSJohn Baldwin 	{   0x1415, 0xc208, 0xffff, 0,
7196e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs",
7206e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7216e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7226e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7236e9f075aSJohn Baldwin 	},
7246e9f075aSJohn Baldwin 
7256e9f075aSJohn Baldwin 	{   0x1415, 0xc20d, 0xffff, 0,
7266e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs (function 1)",
7276e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7286e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7296e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7306e9f075aSJohn Baldwin 	},
7316e9f075aSJohn Baldwin 
7326e9f075aSJohn Baldwin 	{   0x1415, 0xc308, 0xffff, 0,
7336e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs",
7346e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7356e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7366e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7376e9f075aSJohn Baldwin 	},
7386e9f075aSJohn Baldwin 
7396e9f075aSJohn Baldwin 	{   0x1415, 0xc30d, 0xffff, 0,
7406e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs (function 1)",
7416e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7426e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7436e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7446e9f075aSJohn Baldwin 	},
7456e9f075aSJohn Baldwin 
74646ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
74746ce58c7SAndrew Thompson 	    "VScom PCI-100L",
74846ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
74946ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
75046ce58c7SAndrew Thompson 	},
75146ce58c7SAndrew Thompson 
75264220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
75364220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
75464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
75564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
756a58deb46SColin Percival 	},
757a58deb46SColin Percival 
75864220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
75946dd877dSPoul-Henning Kamp 	    "VScom 200Li",
76064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
76164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
76246dd877dSPoul-Henning Kamp 	},
7633e19d3c0SBruce M Simpson 
76464220a7eSMarcel Moolenaar 	/*
76564220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
76664220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
76764220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
76864220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
76964220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
77064220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
77164220a7eSMarcel Moolenaar 	 * access the external UARTs.
77264220a7eSMarcel Moolenaar 	 */
77364220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
77464220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
77564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
77664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
77764220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
77864220a7eSMarcel Moolenaar 	},
77964220a7eSMarcel Moolenaar 
78064220a7eSMarcel Moolenaar 	/*
78164220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
78264220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
78364220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
78464220a7eSMarcel Moolenaar 	 */
78564220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
78664220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
78764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
78864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
78964220a7eSMarcel Moolenaar 	},
79064220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
79164220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
79264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
79364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
79464220a7eSMarcel Moolenaar 	},
79564220a7eSMarcel Moolenaar 
79664220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
79764220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
79864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
79964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
80064220a7eSMarcel Moolenaar 	},
80164220a7eSMarcel Moolenaar 
80264220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
80364220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
80464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
80564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
80664220a7eSMarcel Moolenaar 	},
80764220a7eSMarcel Moolenaar 
80864220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
80964220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
81064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
81164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
81264220a7eSMarcel Moolenaar 	},
81364220a7eSMarcel Moolenaar 
81464220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
81564220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
81664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
81764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
81864220a7eSMarcel Moolenaar 	},
81964220a7eSMarcel Moolenaar 
8200dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
8210dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
8220dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
8230dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
8240dc908e7SAndrew Thompson 	},
8250dc908e7SAndrew Thompson 
82664220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
82764220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
82864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
82964220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
83064220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
83164220a7eSMarcel Moolenaar 	},
83264220a7eSMarcel Moolenaar 
83364220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
83464220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
83564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
83664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
83764220a7eSMarcel Moolenaar 	},
83864220a7eSMarcel Moolenaar 
839858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
840858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
841858030c4SAndrew Thompson 	    DEFAULT_RCLK,
842858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
843858030c4SAndrew Thompson 	},
844858030c4SAndrew Thompson 
84564220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
84664220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
84764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
84864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
84964220a7eSMarcel Moolenaar 	},
85064220a7eSMarcel Moolenaar 
85164220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
85264220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
85364220a7eSMarcel Moolenaar 	    0,
85464220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
85564220a7eSMarcel Moolenaar 	},
85664220a7eSMarcel Moolenaar 
857843994aeSJohn Baldwin 	/*
858843994aeSJohn Baldwin 	 * This is more specific than the generic NM9835 entry that follows, and
859843994aeSJohn Baldwin 	 * is placed here to _prevent_ puc from claiming this single port card.
860843994aeSJohn Baldwin 	 *
861843994aeSJohn Baldwin 	 * uart(4) will claim this device.
862843994aeSJohn Baldwin 	 */
863843994aeSJohn Baldwin 	{   0x9710, 0x9835, 0x1000, 1,
864843994aeSJohn Baldwin 	    "NetMos NM9835 based 1-port serial",
865843994aeSJohn Baldwin 	    DEFAULT_RCLK,
866843994aeSJohn Baldwin 	    PUC_PORT_1S, 0x10, 4, 0,
867843994aeSJohn Baldwin 	},
868843994aeSJohn Baldwin 
869045de714SNavdeep Parhar 	{   0x9710, 0x9835, 0x1000, 2,
870045de714SNavdeep Parhar 	    "NetMos NM9835 based 2-port serial",
871045de714SNavdeep Parhar 	    DEFAULT_RCLK,
872045de714SNavdeep Parhar 	    PUC_PORT_2S, 0x10, 4, 0,
873045de714SNavdeep Parhar 	},
874045de714SNavdeep Parhar 
87564220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
87664220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
87764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
87864220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
87964220a7eSMarcel Moolenaar 	},
88064220a7eSMarcel Moolenaar 
88164220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
88264220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
88364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
88464220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
88564220a7eSMarcel Moolenaar 	},
88664220a7eSMarcel Moolenaar 
88764220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
88864220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
88964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
89064220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
8911d864e0dSMarcel Moolenaar 	},
8921d864e0dSMarcel Moolenaar 
8931d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3002,
8941d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART",
8951d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
8961d864e0dSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
8971d864e0dSMarcel Moolenaar 	},
8981d864e0dSMarcel Moolenaar 
8991d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3003,
9001d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Triple UART",
9011d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
9021d864e0dSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 4, 0,
9031d864e0dSMarcel Moolenaar 	},
9041d864e0dSMarcel Moolenaar 
9051d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3004,
9061d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Quad UART",
9071d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
9081d864e0dSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,0
9091d864e0dSMarcel Moolenaar 	},
9101d864e0dSMarcel Moolenaar 
9111d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3011,
9121d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Single UART and 1284 Printer port",
9131d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
9141d864e0dSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
9151d864e0dSMarcel Moolenaar 	},
9161d864e0dSMarcel Moolenaar 
9171d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3012,
9181d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART and 1284 Printer port",
9191d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
9201d864e0dSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
9211d864e0dSMarcel Moolenaar 	},
9221d864e0dSMarcel Moolenaar 
9231d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3020,
9241d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual 1284 Printer port",
9251d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
9261d864e0dSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 4, 0,
92764220a7eSMarcel Moolenaar 	},
92864220a7eSMarcel Moolenaar 
92964220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
93064220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
93164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
93264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
93364220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
93464220a7eSMarcel Moolenaar 	},
93564220a7eSMarcel Moolenaar 
93664220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
93764220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
93864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
93964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
94064220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
94164220a7eSMarcel Moolenaar 	},
94264220a7eSMarcel Moolenaar 
94364220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
94464220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
94564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
94664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
94764220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
94864220a7eSMarcel Moolenaar 	},
94964220a7eSMarcel Moolenaar 
95064220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
95164220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
95264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
95364220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
95464220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
95564220a7eSMarcel Moolenaar 	},
95664220a7eSMarcel Moolenaar 
95764220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
95864220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
95964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
96064220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
96164220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
96264220a7eSMarcel Moolenaar 	},
96364220a7eSMarcel Moolenaar 
96464220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
96564220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
96664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
96764220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
96864220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
96964220a7eSMarcel Moolenaar 	},
97064220a7eSMarcel Moolenaar 
97164220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
97264220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
97364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
97464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
97564220a7eSMarcel Moolenaar 	},
97664220a7eSMarcel Moolenaar 
97764220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
97864220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
97964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
98064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
98164220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
98264220a7eSMarcel Moolenaar 	},
98364220a7eSMarcel Moolenaar 
98464220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
9859c564b6cSJohn Hay };
98664220a7eSMarcel Moolenaar 
98764220a7eSMarcel Moolenaar static int
98864220a7eSMarcel Moolenaar puc_config_amc(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
98964220a7eSMarcel Moolenaar     intptr_t *res)
99064220a7eSMarcel Moolenaar {
99164220a7eSMarcel Moolenaar 	switch (cmd) {
99264220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
99364220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
99464220a7eSMarcel Moolenaar 		return (0);
99564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
99664220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
99764220a7eSMarcel Moolenaar 		return (0);
99864220a7eSMarcel Moolenaar 	default:
99964220a7eSMarcel Moolenaar 		break;
100064220a7eSMarcel Moolenaar 	}
100164220a7eSMarcel Moolenaar 	return (ENXIO);
100264220a7eSMarcel Moolenaar }
100364220a7eSMarcel Moolenaar 
100464220a7eSMarcel Moolenaar static int
100564220a7eSMarcel Moolenaar puc_config_cronyx(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
100664220a7eSMarcel Moolenaar     intptr_t *res)
100764220a7eSMarcel Moolenaar {
100864220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
100964220a7eSMarcel Moolenaar 		*res = port * 0x200;
101064220a7eSMarcel Moolenaar 		return (0);
101164220a7eSMarcel Moolenaar 	}
101264220a7eSMarcel Moolenaar 	return (ENXIO);
101364220a7eSMarcel Moolenaar }
101464220a7eSMarcel Moolenaar 
101564220a7eSMarcel Moolenaar static int
101664220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
101764220a7eSMarcel Moolenaar     intptr_t *res)
101864220a7eSMarcel Moolenaar {
101964220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
102064220a7eSMarcel Moolenaar 
102164220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
102264220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
102364220a7eSMarcel Moolenaar 			port <<= 1;
102464220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
102564220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
102664220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
102764220a7eSMarcel Moolenaar 		return (0);
102864220a7eSMarcel Moolenaar 	}
102964220a7eSMarcel Moolenaar 	return (ENXIO);
103064220a7eSMarcel Moolenaar }
103164220a7eSMarcel Moolenaar 
103264220a7eSMarcel Moolenaar static int
103364220a7eSMarcel Moolenaar puc_config_icbook(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
103464220a7eSMarcel Moolenaar     intptr_t *res)
103564220a7eSMarcel Moolenaar {
103664220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
103764220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
103864220a7eSMarcel Moolenaar 		return (0);
103964220a7eSMarcel Moolenaar 	}
104064220a7eSMarcel Moolenaar 	return (ENXIO);
104164220a7eSMarcel Moolenaar }
104264220a7eSMarcel Moolenaar 
104364220a7eSMarcel Moolenaar static int
104464220a7eSMarcel Moolenaar puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
104564220a7eSMarcel Moolenaar     intptr_t *res)
104664220a7eSMarcel Moolenaar {
104764220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
104864220a7eSMarcel Moolenaar 	struct puc_bar *bar;
104964220a7eSMarcel Moolenaar 	uint8_t v0, v1;
105064220a7eSMarcel Moolenaar 
105164220a7eSMarcel Moolenaar 	switch (cmd) {
105264220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
105364220a7eSMarcel Moolenaar 		/*
105464220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
105564220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
105664220a7eSMarcel Moolenaar 		 */
105764220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
105864220a7eSMarcel Moolenaar 		if (bar == NULL)
105964220a7eSMarcel Moolenaar 			return (ENXIO);
106064220a7eSMarcel Moolenaar 		/* Set DLAB in the LCR register of UART 0. */
106164220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0x80);
106264220a7eSMarcel Moolenaar 		/* Write 0 to the SPR register of UART 0. */
106364220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0);
106464220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
106564220a7eSMarcel Moolenaar 		v0 = bus_read_1(bar->b_res, 7);
106664220a7eSMarcel Moolenaar 		/* Write a specific value to the SPR register of UART 0. */
106764220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0x80 + -cfg->clock);
106864220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
106964220a7eSMarcel Moolenaar 		v1 = bus_read_1(bar->b_res, 7);
107064220a7eSMarcel Moolenaar 		/* Clear DLAB in the LCR register of UART 0. */
107164220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0);
107264220a7eSMarcel Moolenaar 		/* Save the two values read-back from the SPR register. */
107364220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
107464220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
107564220a7eSMarcel Moolenaar 			/*
107664220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
107764220a7eSMarcel Moolenaar 			 * by us. This means that the SPAD jumper is set.
107864220a7eSMarcel Moolenaar 			 */
107964220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
108064220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
108164220a7eSMarcel Moolenaar 			return (0);
108264220a7eSMarcel Moolenaar 		}
108364220a7eSMarcel Moolenaar 		if (v0 != 0) {
108464220a7eSMarcel Moolenaar 			/*
108564220a7eSMarcel Moolenaar 			 * The first value doesn't match. This can only mean
108664220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
108764220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
108864220a7eSMarcel Moolenaar 			 */
108964220a7eSMarcel Moolenaar 			if (bootverbose)
109064220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
109164220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
109264220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
109364220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
109464220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
109564220a7eSMarcel Moolenaar 				    "setting\n");
109664220a7eSMarcel Moolenaar 			return (0);
109764220a7eSMarcel Moolenaar 		}
109864220a7eSMarcel Moolenaar 		/*
109964220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't. We know
110064220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set. We also know that the
110164220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
110264220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
110364220a7eSMarcel Moolenaar 		 */
110464220a7eSMarcel Moolenaar 		if (bootverbose)
110564220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
110664220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
110764220a7eSMarcel Moolenaar 		return (0);
110864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
110964220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
111064220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
111164220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
111264220a7eSMarcel Moolenaar 			/*
111364220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
111464220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
111564220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed. Let's hope
111664220a7eSMarcel Moolenaar 			 * not...
111764220a7eSMarcel Moolenaar 			 */
111864220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
111964220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
112064220a7eSMarcel Moolenaar 			/*
112164220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
112264220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
112364220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
112464220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
112564220a7eSMarcel Moolenaar 			 */
112664220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
112764220a7eSMarcel Moolenaar 		} else
112864220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
112964220a7eSMarcel Moolenaar 		return (0);
113064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
113164220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
113264220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
113364220a7eSMarcel Moolenaar 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock)
113464220a7eSMarcel Moolenaar 		    ? PUC_ILR_NONE : PUC_ILR_QUATECH;
113564220a7eSMarcel Moolenaar 		return (0);
113664220a7eSMarcel Moolenaar 	default:
113764220a7eSMarcel Moolenaar 		break;
113864220a7eSMarcel Moolenaar 	}
113964220a7eSMarcel Moolenaar 	return (ENXIO);
114064220a7eSMarcel Moolenaar }
114164220a7eSMarcel Moolenaar 
114264220a7eSMarcel Moolenaar static int
114364220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
114464220a7eSMarcel Moolenaar     intptr_t *res)
114564220a7eSMarcel Moolenaar {
114664220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
114764220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
114864220a7eSMarcel Moolenaar 	struct puc_bar *bar;
114964220a7eSMarcel Moolenaar 	int efir, idx, ofs;
115064220a7eSMarcel Moolenaar 	uint8_t v;
115164220a7eSMarcel Moolenaar 
115264220a7eSMarcel Moolenaar 	switch (cmd) {
115364220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
115464220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
115564220a7eSMarcel Moolenaar 		if (bar == NULL)
115664220a7eSMarcel Moolenaar 			return (ENXIO);
115764220a7eSMarcel Moolenaar 
115864220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
115964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
116064220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
116164220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
116264220a7eSMarcel Moolenaar 		idx = 0;
116364220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
116464220a7eSMarcel Moolenaar 			efir = base[idx];
116564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
116664220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
116764220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
116864220a7eSMarcel Moolenaar 				return (ENXIO);
116964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
117064220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
117164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
117264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
117364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
117464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
117564220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
117664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
117764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
117864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
117964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
118064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
118164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
118264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
118364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
118464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
118564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
118664220a7eSMarcel Moolenaar 			idx++;
118764220a7eSMarcel Moolenaar 		}
118864220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
118964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
119064220a7eSMarcel Moolenaar 		return (0);
119164220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
119264220a7eSMarcel Moolenaar 		switch (port) {
119364220a7eSMarcel Moolenaar 		case 0:
119464220a7eSMarcel Moolenaar 			*res = 0x2f8;
119564220a7eSMarcel Moolenaar 			return (0);
119664220a7eSMarcel Moolenaar 		case 1:
119764220a7eSMarcel Moolenaar 			*res = 0x2e8;
119864220a7eSMarcel Moolenaar 			return (0);
119964220a7eSMarcel Moolenaar 		case 2:
120064220a7eSMarcel Moolenaar 			*res = 0x3f8;
120164220a7eSMarcel Moolenaar 			return (0);
120264220a7eSMarcel Moolenaar 		case 3:
120364220a7eSMarcel Moolenaar 			*res = 0x3e8;
120464220a7eSMarcel Moolenaar 			return (0);
120564220a7eSMarcel Moolenaar 		case 4:
120664220a7eSMarcel Moolenaar 			*res = 0x278;
120764220a7eSMarcel Moolenaar 			return (0);
120864220a7eSMarcel Moolenaar 		}
120964220a7eSMarcel Moolenaar 		break;
121064220a7eSMarcel Moolenaar 	default:
121164220a7eSMarcel Moolenaar 		break;
121264220a7eSMarcel Moolenaar 	}
121364220a7eSMarcel Moolenaar 	return (ENXIO);
121464220a7eSMarcel Moolenaar }
121564220a7eSMarcel Moolenaar 
121664220a7eSMarcel Moolenaar static int
121764220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
121864220a7eSMarcel Moolenaar     intptr_t *res)
121964220a7eSMarcel Moolenaar {
122064220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
122164220a7eSMarcel Moolenaar 
122264220a7eSMarcel Moolenaar 	switch (cmd) {
122364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
122464220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
122564220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
122664220a7eSMarcel Moolenaar 			return (0);
122764220a7eSMarcel Moolenaar 		}
122864220a7eSMarcel Moolenaar 		break;
122964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
123064220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
123164220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
123264220a7eSMarcel Moolenaar 			return (0);
123364220a7eSMarcel Moolenaar 		}
123464220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
123564220a7eSMarcel Moolenaar 			switch (port) {
123664220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
123764220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
123864220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
123964220a7eSMarcel Moolenaar 			}
124064220a7eSMarcel Moolenaar 		}
124164220a7eSMarcel Moolenaar 		break;
124264220a7eSMarcel Moolenaar 	default:
124364220a7eSMarcel Moolenaar 		break;
124464220a7eSMarcel Moolenaar 	}
124564220a7eSMarcel Moolenaar 	return (ENXIO);
124664220a7eSMarcel Moolenaar }
124764220a7eSMarcel Moolenaar 
124864220a7eSMarcel Moolenaar static int
124964220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
125064220a7eSMarcel Moolenaar     intptr_t *res)
125164220a7eSMarcel Moolenaar {
125264220a7eSMarcel Moolenaar 	static uint16_t dual[] = {
125364220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
125464220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
125564220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
125664220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
125764220a7eSMarcel Moolenaar 	    0xD079, 0
125864220a7eSMarcel Moolenaar 	};
125964220a7eSMarcel Moolenaar 	static uint16_t quad[] = {
126064220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
126164220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
126264220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
126364220a7eSMarcel Moolenaar 	    0xB157, 0
126464220a7eSMarcel Moolenaar 	};
126564220a7eSMarcel Moolenaar 	static uint16_t octa[] = {
126664220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
126764220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
126864220a7eSMarcel Moolenaar 	};
126964220a7eSMarcel Moolenaar 	static struct {
127064220a7eSMarcel Moolenaar 		int ports;
127164220a7eSMarcel Moolenaar 		uint16_t *ids;
127264220a7eSMarcel Moolenaar 	} subdevs[] = {
127364220a7eSMarcel Moolenaar 	    { 2, dual },
127464220a7eSMarcel Moolenaar 	    { 4, quad },
127564220a7eSMarcel Moolenaar 	    { 8, octa },
127664220a7eSMarcel Moolenaar 	    { 0, NULL }
127764220a7eSMarcel Moolenaar 	};
127864220a7eSMarcel Moolenaar 	static char desc[64];
127964220a7eSMarcel Moolenaar 	int dev, id;
128064220a7eSMarcel Moolenaar 	uint16_t subdev;
128164220a7eSMarcel Moolenaar 
128264220a7eSMarcel Moolenaar 	switch (cmd) {
128364220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
128464220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
128564220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
128664220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
128764220a7eSMarcel Moolenaar 		return (0);
128864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
128964220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
129064220a7eSMarcel Moolenaar 		dev = 0;
129164220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
129264220a7eSMarcel Moolenaar 			id = 0;
129364220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
129464220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
129564220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
129664220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
129764220a7eSMarcel Moolenaar 					return (0);
129864220a7eSMarcel Moolenaar 				}
129964220a7eSMarcel Moolenaar 				id++;
130064220a7eSMarcel Moolenaar 			}
130164220a7eSMarcel Moolenaar 			dev++;
130264220a7eSMarcel Moolenaar 		}
130364220a7eSMarcel Moolenaar 		return (ENXIO);
130464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
130564220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
130664220a7eSMarcel Moolenaar 		return (0);
130764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
1308c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
130964220a7eSMarcel Moolenaar 		return (0);
131064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
131164220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
131264220a7eSMarcel Moolenaar 		return (0);
131364220a7eSMarcel Moolenaar 	default:
131464220a7eSMarcel Moolenaar 		break;
131564220a7eSMarcel Moolenaar 	}
131664220a7eSMarcel Moolenaar 	return (ENXIO);
131764220a7eSMarcel Moolenaar }
131864220a7eSMarcel Moolenaar 
131964220a7eSMarcel Moolenaar static int
13206e9f075aSJohn Baldwin puc_config_oxford_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
13216e9f075aSJohn Baldwin     intptr_t *res)
13226e9f075aSJohn Baldwin {
13236e9f075aSJohn Baldwin 	const struct puc_cfg *cfg = sc->sc_cfg;
13246e9f075aSJohn Baldwin 	int idx;
13256e9f075aSJohn Baldwin 	struct puc_bar *bar;
13266e9f075aSJohn Baldwin 	uint8_t value;
13276e9f075aSJohn Baldwin 
13286e9f075aSJohn Baldwin 	switch (cmd) {
13296e9f075aSJohn Baldwin 	case PUC_CFG_SETUP:
13306e9f075aSJohn Baldwin 		device_printf(sc->sc_dev, "%d UARTs detected\n",
13316e9f075aSJohn Baldwin 			sc->sc_nports);
13326e9f075aSJohn Baldwin 
13336e9f075aSJohn Baldwin 		/* Set UARTs to enhanced mode */
13346e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
13356e9f075aSJohn Baldwin 		if (bar == NULL)
13366e9f075aSJohn Baldwin 			return (ENXIO);
13376e9f075aSJohn Baldwin 
13386e9f075aSJohn Baldwin 		for (idx = 0; idx < sc->sc_nports; idx++) {
13396e9f075aSJohn Baldwin 			value = bus_read_1(bar->b_res, 0x1000 + (idx << 9)
13406e9f075aSJohn Baldwin 				+ 0x92);
13416e9f075aSJohn Baldwin 			bus_write_1(bar->b_res, 0x1000 + (idx << 9) + 0x92,
13426e9f075aSJohn Baldwin 				value | 0x10);
13436e9f075aSJohn Baldwin 		}
13446e9f075aSJohn Baldwin 
13456e9f075aSJohn Baldwin 		return (0);
13466e9f075aSJohn Baldwin 	case PUC_CFG_GET_LEN:
13476e9f075aSJohn Baldwin 		*res = 0x200;
13486e9f075aSJohn Baldwin 		return (0);
13496e9f075aSJohn Baldwin 	case PUC_CFG_GET_NPORTS:
13506e9f075aSJohn Baldwin 		/*
13516e9f075aSJohn Baldwin 		 * Check if we are being called from puc_bfe_attach()
13526e9f075aSJohn Baldwin 		 * or puc_bfe_probe(). If puc_bfe_probe(), we cannot
13536e9f075aSJohn Baldwin 		 * puc_get_bar(), so we return a value of 16. This has cosmetic
13546e9f075aSJohn Baldwin 		 * side-effects at worst; in PUC_CFG_GET_DESC,
13556e9f075aSJohn Baldwin 		 * (int)sc->sc_cfg_data will not contain the true number of
13566e9f075aSJohn Baldwin 		 * ports in PUC_CFG_GET_DESC, but we are not implementing that
13576e9f075aSJohn Baldwin 		 * call for this device family anyway.
13586e9f075aSJohn Baldwin 		 *
13596e9f075aSJohn Baldwin 		 * The check is for initialisation of sc->sc_bar[idx], which is
13606e9f075aSJohn Baldwin 		 * only done in puc_bfe_attach().
13616e9f075aSJohn Baldwin 		 */
13626e9f075aSJohn Baldwin 		idx = 0;
13636e9f075aSJohn Baldwin 		do {
13646e9f075aSJohn Baldwin 			if (sc->sc_bar[idx++].b_rid != -1) {
13656e9f075aSJohn Baldwin 				sc->sc_cfg_data = 16;
13666e9f075aSJohn Baldwin 				*res = sc->sc_cfg_data;
13676e9f075aSJohn Baldwin 				return (0);
13686e9f075aSJohn Baldwin 			}
13696e9f075aSJohn Baldwin 		} while (idx < PUC_PCI_BARS);
13706e9f075aSJohn Baldwin 
13716e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
13726e9f075aSJohn Baldwin 		if (bar == NULL)
13736e9f075aSJohn Baldwin 			return (ENXIO);
13746e9f075aSJohn Baldwin 
13756e9f075aSJohn Baldwin 		value = bus_read_1(bar->b_res, 0x04);
13766e9f075aSJohn Baldwin 		if (value == 0)
13776e9f075aSJohn Baldwin 			return (ENXIO);
13786e9f075aSJohn Baldwin 
13796e9f075aSJohn Baldwin 		sc->sc_cfg_data = value;
13806e9f075aSJohn Baldwin 		*res = sc->sc_cfg_data;
13816e9f075aSJohn Baldwin 		return (0);
13826e9f075aSJohn Baldwin 	case PUC_CFG_GET_OFS:
13836e9f075aSJohn Baldwin 		*res = 0x1000 + (port << 9);
13846e9f075aSJohn Baldwin 		return (0);
13856e9f075aSJohn Baldwin 	case PUC_CFG_GET_TYPE:
13866e9f075aSJohn Baldwin 		*res = PUC_TYPE_SERIAL;
13876e9f075aSJohn Baldwin 		return (0);
13886e9f075aSJohn Baldwin 	default:
13896e9f075aSJohn Baldwin 		break;
13906e9f075aSJohn Baldwin 	}
13916e9f075aSJohn Baldwin 	return (ENXIO);
13926e9f075aSJohn Baldwin }
13936e9f075aSJohn Baldwin 
13946e9f075aSJohn Baldwin static int
139564220a7eSMarcel Moolenaar puc_config_titan(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
139664220a7eSMarcel Moolenaar     intptr_t *res)
139764220a7eSMarcel Moolenaar {
139864220a7eSMarcel Moolenaar 	switch (cmd) {
139964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
140064220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
140164220a7eSMarcel Moolenaar 		return (0);
140264220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
140364220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
140464220a7eSMarcel Moolenaar 		return (0);
140564220a7eSMarcel Moolenaar 	default:
140664220a7eSMarcel Moolenaar 		break;
140764220a7eSMarcel Moolenaar 	}
140864220a7eSMarcel Moolenaar 	return (ENXIO);
140964220a7eSMarcel Moolenaar }
1410