xref: /freebsd/sys/dev/puc/pucdata.c (revision 7501345eede40b589963e8d690c10564e97aa01b)
1098ca2bdSWarner Losh /*-
264220a7eSMarcel Moolenaar  * Copyright (c) 2006 Marcel Moolenaar
364220a7eSMarcel Moolenaar  * All rights reserved.
49c564b6cSJohn Hay  *
59c564b6cSJohn Hay  * Redistribution and use in source and binary forms, with or without
69c564b6cSJohn Hay  * modification, are permitted provided that the following conditions
79c564b6cSJohn Hay  * are met:
864220a7eSMarcel Moolenaar  *
99c564b6cSJohn Hay  * 1. Redistributions of source code must retain the above copyright
109c564b6cSJohn Hay  *    notice, this list of conditions and the following disclaimer.
119c564b6cSJohn Hay  * 2. Redistributions in binary form must reproduce the above copyright
129c564b6cSJohn Hay  *    notice, this list of conditions and the following disclaimer in the
139c564b6cSJohn Hay  *    documentation and/or other materials provided with the distribution.
149c564b6cSJohn Hay  *
159c564b6cSJohn Hay  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
169c564b6cSJohn Hay  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
179c564b6cSJohn Hay  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
189c564b6cSJohn Hay  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
199c564b6cSJohn Hay  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
209c564b6cSJohn Hay  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
219c564b6cSJohn Hay  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
229c564b6cSJohn Hay  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
239c564b6cSJohn Hay  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
249c564b6cSJohn Hay  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
259c564b6cSJohn Hay  */
269c564b6cSJohn Hay 
279c564b6cSJohn Hay #include <sys/cdefs.h>
289c564b6cSJohn Hay __FBSDID("$FreeBSD$");
299c564b6cSJohn Hay 
309c564b6cSJohn Hay /*
319c564b6cSJohn Hay  * PCI "universal" communications card driver configuration data (used to
329c564b6cSJohn Hay  * match/attach the cards).
339c564b6cSJohn Hay  */
349c564b6cSJohn Hay 
359c564b6cSJohn Hay #include <sys/param.h>
3664220a7eSMarcel Moolenaar #include <sys/systm.h>
3764220a7eSMarcel Moolenaar #include <sys/kernel.h>
3864220a7eSMarcel Moolenaar #include <sys/bus.h>
399c564b6cSJohn Hay 
4064220a7eSMarcel Moolenaar #include <machine/resource.h>
41ed0b0e82SWarner Losh #include <machine/bus.h>
4264220a7eSMarcel Moolenaar #include <sys/rman.h>
4364220a7eSMarcel Moolenaar 
449c564b6cSJohn Hay #include <dev/pci/pcivar.h>
459c564b6cSJohn Hay 
4664220a7eSMarcel Moolenaar #include <dev/puc/puc_bus.h>
4764220a7eSMarcel Moolenaar #include <dev/puc/puc_cfg.h>
48482aa6a3SDavid E. O'Brien #include <dev/puc/puc_bfe.h>
499c564b6cSJohn Hay 
5064220a7eSMarcel Moolenaar static puc_config_f puc_config_amc;
5164220a7eSMarcel Moolenaar static puc_config_f puc_config_diva;
5222e0612fSJohn Baldwin static puc_config_f puc_config_exar;
5364220a7eSMarcel Moolenaar static puc_config_f puc_config_icbook;
542c89ac5eSEitan Adler static puc_config_f puc_config_moxa;
55a59f78daSJohn Baldwin static puc_config_f puc_config_oxford_pcie;
5664220a7eSMarcel Moolenaar static puc_config_f puc_config_quatech;
5764220a7eSMarcel Moolenaar static puc_config_f puc_config_syba;
5864220a7eSMarcel Moolenaar static puc_config_f puc_config_siig;
5964220a7eSMarcel Moolenaar static puc_config_f puc_config_timedia;
6064220a7eSMarcel Moolenaar static puc_config_f puc_config_titan;
61dc7d0deaSMarcel Moolenaar 
6264220a7eSMarcel Moolenaar const struct puc_cfg puc_pci_devices[] = {
63a27ffb41SDavid E. O'Brien 
6464220a7eSMarcel Moolenaar 	{   0x0009, 0x7168, 0xffff, 0,
6564220a7eSMarcel Moolenaar 	    "Sunix SUN1889",
6664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
6764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
680efcc68bSBruce Evans 	},
690efcc68bSBruce Evans 
7064220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1049,
7164220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
7264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
7364220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
7464220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
75dc7d0deaSMarcel Moolenaar 	},
76dc7d0deaSMarcel Moolenaar 
7764220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104a,
7864220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
7964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, -1,
8164220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
82a27ffb41SDavid E. O'Brien 	},
83a27ffb41SDavid E. O'Brien 
8464220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x104b,
8564220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
8664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
8764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, -1,
8864220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
89a27ffb41SDavid E. O'Brien 	},
90a27ffb41SDavid E. O'Brien 
9164220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1223,
9264220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
9364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
9464220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
9564220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
96a27ffb41SDavid E. O'Brien 	},
97a27ffb41SDavid E. O'Brien 
9864220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1226,
9964220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
10064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10164220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10264220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
103a27ffb41SDavid E. O'Brien 	},
104a27ffb41SDavid E. O'Brien 
10564220a7eSMarcel Moolenaar 	{   0x103c, 0x1048, 0x103c, 0x1282,
10664220a7eSMarcel Moolenaar 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
10764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
10864220a7eSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 0, -1,
10964220a7eSMarcel Moolenaar 	    .config_function = puc_config_diva
110a27ffb41SDavid E. O'Brien 	},
111a27ffb41SDavid E. O'Brien 
11264220a7eSMarcel Moolenaar 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
11364220a7eSMarcel Moolenaar 	    "VScom PCI-800",
11464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
11564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1162569e387SDavid E. O'Brien 	},
11764220a7eSMarcel Moolenaar 
11864220a7eSMarcel Moolenaar 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
11964220a7eSMarcel Moolenaar 	    "VScom PCI-400",
12064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
1222569e387SDavid E. O'Brien 	},
12364220a7eSMarcel Moolenaar 
12464220a7eSMarcel Moolenaar 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
12564220a7eSMarcel Moolenaar 	    "VScom PCI-200",
12664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
12764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1282569e387SDavid E. O'Brien 	},
129a27ffb41SDavid E. O'Brien 
1309c564b6cSJohn Hay 	/*
13164220a7eSMarcel Moolenaar 	 * Boca Research Turbo Serial 658 (8 serial port) card.
13264220a7eSMarcel Moolenaar 	 * Appears to be the same as Chase Research PLC PCI-FAST8
13364220a7eSMarcel Moolenaar 	 * and Perle PCI-FAST8 Multi-Port serial cards.
1349c564b6cSJohn Hay 	 */
13564220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
13664220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 658",
13764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
13864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
1399c564b6cSJohn Hay 	},
1409c564b6cSJohn Hay 
14164220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
14264220a7eSMarcel Moolenaar 	    "Boca Research Turbo Serial 654",
14364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
14464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
14564220a7eSMarcel Moolenaar 	},
1469c564b6cSJohn Hay 
1479c564b6cSJohn Hay 	/*
1489c564b6cSJohn Hay 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
1499c564b6cSJohn Hay 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
1509c564b6cSJohn Hay 	 * into the subsystem fields, and claims that it's a
1519c564b6cSJohn Hay 	 * network/misc (0x02/0x80) device.
1529c564b6cSJohn Hay 	 */
15364220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
15464220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4035",
15564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
15664220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
1579c564b6cSJohn Hay 	},
1589c564b6cSJohn Hay 
1599c564b6cSJohn Hay 	/*
16064220a7eSMarcel Moolenaar 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
16164220a7eSMarcel Moolenaar 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
16264220a7eSMarcel Moolenaar 	 * into the subsystem fields, and claims that it's a
16364220a7eSMarcel Moolenaar 	 * network/misc (0x02/0x80) device.
1649c564b6cSJohn Hay 	 */
16564220a7eSMarcel Moolenaar 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
16664220a7eSMarcel Moolenaar 	    "Dolphin Peripherals 4014",
16764220a7eSMarcel Moolenaar 	    0,
16864220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x20, 4, 0,
1699c564b6cSJohn Hay 	},
1709c564b6cSJohn Hay 
17164220a7eSMarcel Moolenaar 	{   0x10e8, 0x818e, 0xffff, 0,
17264220a7eSMarcel Moolenaar 	    "Applied Micro Circuits 8 Port UART",
17364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
17464220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
17564220a7eSMarcel Moolenaar 	    .config_function = puc_config_amc
17664220a7eSMarcel Moolenaar 	},
1779c564b6cSJohn Hay 
17864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8010, 0xffff, 0,
17964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part A",
18064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18264220a7eSMarcel Moolenaar 	},
18364220a7eSMarcel Moolenaar 
18464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8011, 0xffff, 0,
18564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 RJ11 part B",
18664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
18764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
18864220a7eSMarcel Moolenaar 	},
18964220a7eSMarcel Moolenaar 
19064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8012, 0xffff, 0,
19164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part A",
19264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
19464220a7eSMarcel Moolenaar 	},
19564220a7eSMarcel Moolenaar 
19664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8013, 0xffff, 0,
19764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 Octa part B",
19864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
19964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
20064220a7eSMarcel Moolenaar 	},
20164220a7eSMarcel Moolenaar 
20264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8014, 0xffff, 0,
20364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/4 RJ45",
20464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
20564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
20664220a7eSMarcel Moolenaar 	},
20764220a7eSMarcel Moolenaar 
20864220a7eSMarcel Moolenaar 	{   0x11fe, 0x8015, 0xffff, 0,
20964220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/Quad",
21064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21264220a7eSMarcel Moolenaar 	},
21364220a7eSMarcel Moolenaar 
21464220a7eSMarcel Moolenaar 	{   0x11fe, 0x8016, 0xffff, 0,
21564220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part A",
21664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
21764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
21864220a7eSMarcel Moolenaar 	},
21964220a7eSMarcel Moolenaar 
22064220a7eSMarcel Moolenaar 	{   0x11fe, 0x8017, 0xffff, 0,
22164220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/16 part B",
22264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22364220a7eSMarcel Moolenaar 	    PUC_PORT_12S, 0x10, 0, 8,
22464220a7eSMarcel Moolenaar 	},
22564220a7eSMarcel Moolenaar 
22664220a7eSMarcel Moolenaar 	{   0x11fe, 0x8018, 0xffff, 0,
22764220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part A",
22864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
22964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23064220a7eSMarcel Moolenaar 	},
23164220a7eSMarcel Moolenaar 
23264220a7eSMarcel Moolenaar 	{   0x11fe, 0x8019, 0xffff, 0,
23364220a7eSMarcel Moolenaar 	    "Comtrol RocketPort 550/8 part B",
23464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 4,
23564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
23664220a7eSMarcel Moolenaar 	},
2379c564b6cSJohn Hay 
2389c564b6cSJohn Hay 	/*
23963fbf504SRobert Watson 	 * IBM SurePOS 300 Series (481033H) serial ports
24063fbf504SRobert Watson 	 * Details can be found on the IBM RSS websites
24163fbf504SRobert Watson 	 */
24263fbf504SRobert Watson 
24363fbf504SRobert Watson 	{   0x1014, 0x0297, 0xffff, 0,
24463fbf504SRobert Watson 	    "IBM SurePOS 300 Series (481033H) serial ports",
24563fbf504SRobert Watson 	    DEFAULT_RCLK,
24663fbf504SRobert Watson 	    PUC_PORT_4S, 0x10, 4, 0
24763fbf504SRobert Watson 	},
24863fbf504SRobert Watson 
24963fbf504SRobert Watson 	/*
2509c564b6cSJohn Hay 	 * SIIG Boards.
2519c564b6cSJohn Hay 	 *
2529c564b6cSJohn Hay 	 * SIIG provides documentation for their boards at:
25364220a7eSMarcel Moolenaar 	 * <URL:http://www.siig.com/downloads.asp>
2549c564b6cSJohn Hay 	 */
2559c564b6cSJohn Hay 
25664220a7eSMarcel Moolenaar 	{   0x131f, 0x1010, 0xffff, 0,
25764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
25864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
25964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2609c564b6cSJohn Hay 	},
2619c564b6cSJohn Hay 
26264220a7eSMarcel Moolenaar 	{   0x131f, 0x1011, 0xffff, 0,
26364220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
26464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
26564220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2669c564b6cSJohn Hay 	},
2679c564b6cSJohn Hay 
26864220a7eSMarcel Moolenaar 	{   0x131f, 0x1012, 0xffff, 0,
26964220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
27064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
27164220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x18, 4, 0,
2729c564b6cSJohn Hay 	},
2739c564b6cSJohn Hay 
27464220a7eSMarcel Moolenaar 	{   0x131f, 0x1021, 0xffff, 0,
27564220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (10x family)",
27664220a7eSMarcel Moolenaar 	    0,
27764220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x18, 8, 0,
2789c564b6cSJohn Hay 	},
2799c564b6cSJohn Hay 
28064220a7eSMarcel Moolenaar 	{   0x131f, 0x1030, 0xffff, 0,
28164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
28264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2849c564b6cSJohn Hay 	},
2859c564b6cSJohn Hay 
28664220a7eSMarcel Moolenaar 	{   0x131f, 0x1031, 0xffff, 0,
28764220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
28864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
28964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2909c564b6cSJohn Hay 	},
2919c564b6cSJohn Hay 
29264220a7eSMarcel Moolenaar 	{   0x131f, 0x1032, 0xffff, 0,
29364220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
29464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
29564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 4, 0,
2969c564b6cSJohn Hay 	},
2979c564b6cSJohn Hay 
29864220a7eSMarcel Moolenaar 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
29964220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
30064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30164220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3029c564b6cSJohn Hay 	},
3039c564b6cSJohn Hay 
30464220a7eSMarcel Moolenaar 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
30564220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
30664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
30764220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3089c564b6cSJohn Hay 	},
3099c564b6cSJohn Hay 
31064220a7eSMarcel Moolenaar 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
31164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
31264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31364220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x18, 4, 0,
3149c564b6cSJohn Hay 	},
3159c564b6cSJohn Hay 
31664220a7eSMarcel Moolenaar 	{   0x131f, 0x1050, 0xffff, 0,
31764220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
31864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
31964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3209c564b6cSJohn Hay 	},
3219c564b6cSJohn Hay 
32264220a7eSMarcel Moolenaar 	{   0x131f, 0x1051, 0xffff, 0,
32364220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
32464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
32564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3269c564b6cSJohn Hay 	},
3279c564b6cSJohn Hay 
32864220a7eSMarcel Moolenaar 	{   0x131f, 0x1052, 0xffff, 0,
32964220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
33064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 4, 0,
3329c564b6cSJohn Hay 	},
3339c564b6cSJohn Hay 
33464220a7eSMarcel Moolenaar 	{   0x131f, 0x2010, 0xffff, 0,
33564220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
33664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
33764220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3389c564b6cSJohn Hay 	},
3399c564b6cSJohn Hay 
34064220a7eSMarcel Moolenaar 	{   0x131f, 0x2011, 0xffff, 0,
34164220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
34264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34364220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3449c564b6cSJohn Hay 	},
3459c564b6cSJohn Hay 
34664220a7eSMarcel Moolenaar 	{   0x131f, 0x2012, 0xffff, 0,
34764220a7eSMarcel Moolenaar 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
34864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
34964220a7eSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
3509c564b6cSJohn Hay 	},
3519c564b6cSJohn Hay 
35264220a7eSMarcel Moolenaar 	{   0x131f, 0x2021, 0xffff, 0,
35364220a7eSMarcel Moolenaar 	    "SIIG Cyber Parallel Dual PCI (20x family)",
35464220a7eSMarcel Moolenaar 	    0,
35564220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
3569c564b6cSJohn Hay 	},
3579c564b6cSJohn Hay 
35864220a7eSMarcel Moolenaar 	{   0x131f, 0x2030, 0xffff, 0,
35964220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
36064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3629c564b6cSJohn Hay 	},
3639c564b6cSJohn Hay 
36464220a7eSMarcel Moolenaar 	{   0x131f, 0x2031, 0xffff, 0,
36564220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
36664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
36764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3689c564b6cSJohn Hay 	},
3699c564b6cSJohn Hay 
37064220a7eSMarcel Moolenaar 	{   0x131f, 0x2032, 0xffff, 0,
37164220a7eSMarcel Moolenaar 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
37264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
3749c564b6cSJohn Hay 	},
3759c564b6cSJohn Hay 
37664220a7eSMarcel Moolenaar 	{   0x131f, 0x2040, 0xffff, 0,
37764220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
37864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
37964220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38064220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3819c564b6cSJohn Hay 	},
3829c564b6cSJohn Hay 
38364220a7eSMarcel Moolenaar 	{   0x131f, 0x2041, 0xffff, 0,
38464220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
38564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
38664220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
38764220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3889c564b6cSJohn Hay 	},
3899c564b6cSJohn Hay 
39064220a7eSMarcel Moolenaar 	{   0x131f, 0x2042, 0xffff, 0,
39164220a7eSMarcel Moolenaar 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
39264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
39364220a7eSMarcel Moolenaar 	    PUC_PORT_1S2P, 0x10, -1, 0,
39464220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
3959c564b6cSJohn Hay 	},
3969c564b6cSJohn Hay 
39764220a7eSMarcel Moolenaar 	{   0x131f, 0x2050, 0xffff, 0,
39864220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
39964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4019c564b6cSJohn Hay 	},
4029c564b6cSJohn Hay 
40364220a7eSMarcel Moolenaar 	{   0x131f, 0x2051, 0xffff, 0,
40464220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
40564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
40664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4079c564b6cSJohn Hay 	},
4089c564b6cSJohn Hay 
40964220a7eSMarcel Moolenaar 	{   0x131f, 0x2052, 0xffff, 0,
41064220a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
41164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
4139c564b6cSJohn Hay 	},
4149c564b6cSJohn Hay 
41564220a7eSMarcel Moolenaar 	{   0x131f, 0x2060, 0xffff, 0,
41664220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
41764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
41864220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4199c564b6cSJohn Hay 	},
4209c564b6cSJohn Hay 
42164220a7eSMarcel Moolenaar 	{   0x131f, 0x2061, 0xffff, 0,
42264220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
42364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
42464220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4259c564b6cSJohn Hay 	},
4269c564b6cSJohn Hay 
42764220a7eSMarcel Moolenaar 	{   0x131f, 0x2062, 0xffff, 0,
42864220a7eSMarcel Moolenaar 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
42964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43064220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
4319c564b6cSJohn Hay 	},
4329c564b6cSJohn Hay 
43364220a7eSMarcel Moolenaar 	{   0x131f, 0x2081, 0xffff, 0,
43464220a7eSMarcel Moolenaar 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
43564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
43664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, -1, -1,
43764220a7eSMarcel Moolenaar 	    .config_function = puc_config_siig
4389c564b6cSJohn Hay 	},
4399c564b6cSJohn Hay 
44064220a7eSMarcel Moolenaar 	{   0x135c, 0x0010, 0xffff, 0,
44164220a7eSMarcel Moolenaar 	    "Quatech QSC-100",
44264220a7eSMarcel Moolenaar 	    -3,	/* max 8x clock rate */
44364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
44464220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4459c564b6cSJohn Hay 	},
4469c564b6cSJohn Hay 
44764220a7eSMarcel Moolenaar 	{   0x135c, 0x0020, 0xffff, 0,
44864220a7eSMarcel Moolenaar 	    "Quatech DSC-100",
44964220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
45064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
45164220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4529c564b6cSJohn Hay 	},
4539c564b6cSJohn Hay 
45464220a7eSMarcel Moolenaar 	{   0x135c, 0x0030, 0xffff, 0,
45564220a7eSMarcel Moolenaar 	    "Quatech DSC-200/300",
45664220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
45764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 0, 8,
45864220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4599c564b6cSJohn Hay 	},
4609c564b6cSJohn Hay 
46164220a7eSMarcel Moolenaar 	{   0x135c, 0x0040, 0xffff, 0,
46264220a7eSMarcel Moolenaar 	    "Quatech QSC-200/300",
46364220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
46464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x14, 0, 8,
46564220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4669c564b6cSJohn Hay 	},
4679c564b6cSJohn Hay 
46864220a7eSMarcel Moolenaar 	{   0x135c, 0x0050, 0xffff, 0,
46964220a7eSMarcel Moolenaar 	    "Quatech ESC-100D",
47064220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
47164220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47264220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4739c564b6cSJohn Hay 	},
4749c564b6cSJohn Hay 
47564220a7eSMarcel Moolenaar 	{   0x135c, 0x0060, 0xffff, 0,
47664220a7eSMarcel Moolenaar 	    "Quatech ESC-100M",
47764220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
47864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, 0, 8,
47964220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4809c564b6cSJohn Hay 	},
4819c564b6cSJohn Hay 
48264220a7eSMarcel Moolenaar 	{   0x135c, 0x0170, 0xffff, 0,
48364220a7eSMarcel Moolenaar 	    "Quatech QSCLP-100",
48464220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
48564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
48664220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
4879c564b6cSJohn Hay 	},
4889c564b6cSJohn Hay 
48964220a7eSMarcel Moolenaar 	{   0x135c, 0x0180, 0xffff, 0,
49064220a7eSMarcel Moolenaar 	    "Quatech DSCLP-100",
49164220a7eSMarcel Moolenaar 	    -1, /* max 3x clock rate */
49264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
49364220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
49476353f68SJohn Hay 	},
49576353f68SJohn Hay 
49664220a7eSMarcel Moolenaar 	{   0x135c, 0x01b0, 0xffff, 0,
49764220a7eSMarcel Moolenaar 	    "Quatech DSCLP-200/300",
49864220a7eSMarcel Moolenaar 	    -1, /* max 2x clock rate */
49964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x18, 0, 8,
50064220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5019c564b6cSJohn Hay 	},
5029c564b6cSJohn Hay 
50364220a7eSMarcel Moolenaar 	{   0x135c, 0x01e0, 0xffff, 0,
50464220a7eSMarcel Moolenaar 	    "Quatech ESCLP-100",
50564220a7eSMarcel Moolenaar 	    -3, /* max 8x clock rate */
50664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
50764220a7eSMarcel Moolenaar 	    .config_function = puc_config_quatech
5089c564b6cSJohn Hay 	},
5099c564b6cSJohn Hay 
51064220a7eSMarcel Moolenaar 	{   0x1393, 0x1040, 0xffff, 0,
51164220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio C104H/PCI",
51264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
51364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5140ec6e983SJoerg Wunsch 	},
51540f01890SBruce Evans 
51664220a7eSMarcel Moolenaar 	{   0x1393, 0x1041, 0xffff, 0,
51764220a7eSMarcel Moolenaar 	    "Moxa Technologies, Smartio CP-104UL/PCI",
51864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
51964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5209c564b6cSJohn Hay 	},
5219c564b6cSJohn Hay 
5222c89ac5eSEitan Adler 	{   0x1393, 0x1042, 0xffff, 0,
5232c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104JU/PCI",
5242c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5252c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x18, 0, 8,
5262c89ac5eSEitan Adler 	},
5272c89ac5eSEitan Adler 
528f6a60febSMaxim Konovalov 	{   0x1393, 0x1043, 0xffff, 0,
529f6a60febSMaxim Konovalov 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
530f6a60febSMaxim Konovalov 	    DEFAULT_RCLK * 8,
531f6a60febSMaxim Konovalov 	    PUC_PORT_4S, 0x18, 0, 8,
532f6a60febSMaxim Konovalov 	},
533f6a60febSMaxim Konovalov 
5342c89ac5eSEitan Adler 	{   0x1393, 0x1045, 0xffff, 0,
5352c89ac5eSEitan Adler 	    "Moxa Technologies, Smartio CP-104EL-A/PCIe",
5362c89ac5eSEitan Adler 	    DEFAULT_RCLK * 8,
5372c89ac5eSEitan Adler 	    PUC_PORT_4S, 0x14, 0, -1,
5382c89ac5eSEitan Adler 		.config_function = puc_config_moxa
5392c89ac5eSEitan Adler 	},
5402c89ac5eSEitan Adler 
5418efbf264SJohn Baldwin 	{   0x1393, 0x1120, 0xffff, 0,
5428efbf264SJohn Baldwin 	    "Moxa Technologies, CP-112UL",
5438efbf264SJohn Baldwin 	    DEFAULT_RCLK * 8,
5448efbf264SJohn Baldwin 	    PUC_PORT_2S, 0x18, 0, 8,
5458efbf264SJohn Baldwin 	},
5468efbf264SJohn Baldwin 
54764220a7eSMarcel Moolenaar 	{   0x1393, 0x1141, 0xffff, 0,
54864220a7eSMarcel Moolenaar 	    "Moxa Technologies, Industio CP-114",
54964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
55064220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x18, 0, 8,
5519c564b6cSJohn Hay 	},
5529c564b6cSJohn Hay 
55364220a7eSMarcel Moolenaar 	{   0x1393, 0x1680, 0xffff, 0,
55464220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168H/PCI",
55564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
55664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5579c564b6cSJohn Hay 	},
5589c564b6cSJohn Hay 
55964220a7eSMarcel Moolenaar 	{   0x1393, 0x1681, 0xffff, 0,
56064220a7eSMarcel Moolenaar 	    "Moxa Technologies, C168U/PCI",
56164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
56264220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x18, 0, 8,
5639c564b6cSJohn Hay 	},
5649c564b6cSJohn Hay 
5650db1aa0bSStanislav Sedov 	{   0x1393, 0x1682, 0xffff, 0,
5660db1aa0bSStanislav Sedov 	    "Moxa Technologies, CP-168EL/PCIe",
5670db1aa0bSStanislav Sedov 	    DEFAULT_RCLK * 8,
5680db1aa0bSStanislav Sedov 	    PUC_PORT_8S, 0x18, 0, 8,
5690db1aa0bSStanislav Sedov 	},
5700db1aa0bSStanislav Sedov 
57122e0612fSJohn Baldwin 	{   0x13a8, 0x0152, 0xffff, 0,
57222e0612fSJohn Baldwin 	    "Exar XR17C/D152",
57322e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
57422e0612fSJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, -1,
57522e0612fSJohn Baldwin 	    .config_function = puc_config_exar
57622e0612fSJohn Baldwin 	},
57722e0612fSJohn Baldwin 
57822e0612fSJohn Baldwin 	{   0x13a8, 0x0154, 0xffff, 0,
57922e0612fSJohn Baldwin 	    "Exar XR17C154",
58022e0612fSJohn Baldwin 	    DEFAULT_RCLK * 8,
58122e0612fSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, -1,
58222e0612fSJohn Baldwin 	    .config_function = puc_config_exar
58322e0612fSJohn Baldwin 	},
58422e0612fSJohn Baldwin 
58564220a7eSMarcel Moolenaar 	{   0x13a8, 0x0158, 0xffff, 0,
58622e0612fSJohn Baldwin 	    "Exar XR17C158",
58764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
58864220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, -1,
58922e0612fSJohn Baldwin 	    .config_function = puc_config_exar
590de0d2cadSJohn Hay 	},
591de0d2cadSJohn Hay 
59279aac43eSEd Maste 	{   0x13a8, 0x0258, 0xffff, 0,
59379aac43eSEd Maste 	    "Exar XR17V258IV",
59479aac43eSEd Maste 	    DEFAULT_RCLK * 8,
59579aac43eSEd Maste 	    PUC_PORT_8S, 0x10, 0, -1,
59679aac43eSEd Maste 	},
59779aac43eSEd Maste 
59864220a7eSMarcel Moolenaar 	{   0x1407, 0x0100, 0xffff, 0,
59964220a7eSMarcel Moolenaar 	    "Lava Computers Dual Serial",
60064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
60164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6029c564b6cSJohn Hay 	},
6039c564b6cSJohn Hay 
60464220a7eSMarcel Moolenaar 	{   0x1407, 0x0101, 0xffff, 0,
60564220a7eSMarcel Moolenaar 	    "Lava Computers Quatro A",
60664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
60764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6089c564b6cSJohn Hay 	},
6099c564b6cSJohn Hay 
61064220a7eSMarcel Moolenaar 	{   0x1407, 0x0102, 0xffff, 0,
61164220a7eSMarcel Moolenaar 	    "Lava Computers Quatro B",
61264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
61364220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6149c564b6cSJohn Hay 	},
6159c564b6cSJohn Hay 
61664220a7eSMarcel Moolenaar 	{   0x1407, 0x0120, 0xffff, 0,
61764220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI A",
61864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
61964220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
6209c564b6cSJohn Hay 	},
62164220a7eSMarcel Moolenaar 
62264220a7eSMarcel Moolenaar 	{   0x1407, 0x0121, 0xffff, 0,
62364220a7eSMarcel Moolenaar 	    "Lava Computers Quattro-PCI B",
62464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
62564220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
62664220a7eSMarcel Moolenaar 	},
62764220a7eSMarcel Moolenaar 
62864220a7eSMarcel Moolenaar 	{   0x1407, 0x0180, 0xffff, 0,
62964220a7eSMarcel Moolenaar 	    "Lava Computers Octo A",
63064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
63164220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
63264220a7eSMarcel Moolenaar 	},
63364220a7eSMarcel Moolenaar 
63464220a7eSMarcel Moolenaar 	{   0x1407, 0x0181, 0xffff, 0,
63564220a7eSMarcel Moolenaar 	    "Lava Computers Octo B",
63664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
63764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
63864220a7eSMarcel Moolenaar 	},
63964220a7eSMarcel Moolenaar 
64013ae6dceSKevin Lo 	{   0x1409, 0x7268, 0xffff, 0,
64113ae6dceSKevin Lo 	    "Sunix SUN1888",
64213ae6dceSKevin Lo 	    0,
64313ae6dceSKevin Lo 	    PUC_PORT_2P, 0x10, 0, 8,
64413ae6dceSKevin Lo 	},
64513ae6dceSKevin Lo 
64664220a7eSMarcel Moolenaar 	{   0x1409, 0x7168, 0xffff, 0,
64764220a7eSMarcel Moolenaar 	    NULL,
64864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
64964220a7eSMarcel Moolenaar 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
65064220a7eSMarcel Moolenaar 	    .config_function = puc_config_timedia
6519c564b6cSJohn Hay 	},
6529c564b6cSJohn Hay 
6539c564b6cSJohn Hay 	/*
6549c564b6cSJohn Hay 	 * Boards with an Oxford Semiconductor chip.
6559c564b6cSJohn Hay 	 *
6569c564b6cSJohn Hay 	 * Oxford Semiconductor provides documentation for their chip at:
6576e9f075aSJohn Baldwin 	 * <URL:http://www.plxtech.com/products/uart/>
6589c564b6cSJohn Hay 	 *
6599c564b6cSJohn Hay 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
6609c564b6cSJohn Hay 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
6619c564b6cSJohn Hay 	 */
662acdfc36aSEitan Adler 	{
663acdfc36aSEitan Adler 		0x1415, 0x9501, 0x10fc ,0xc070,
664acdfc36aSEitan Adler 		"I-O DATA RSA-PCI2/R",
665acdfc36aSEitan Adler 		DEFAULT_RCLK * 8,
666acdfc36aSEitan Adler 		PUC_PORT_2S, 0x10, 0, 8,
667acdfc36aSEitan Adler 	},
6689c564b6cSJohn Hay 
6690db885bbSDag-Erling Smørgrav 	{   0x1415, 0x9501, 0x131f, 0x2050,
6700db885bbSDag-Erling Smørgrav 	    "SIIG Cyber 4 PCI 16550",
6710db885bbSDag-Erling Smørgrav 	    DEFAULT_RCLK * 10,
6720db885bbSDag-Erling Smørgrav 	    PUC_PORT_4S, 0x10, 0, 8,
6730db885bbSDag-Erling Smørgrav 	},
6740db885bbSDag-Erling Smørgrav 
6751d860a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0x131f, 0x2051,
6761d860a7eSMarcel Moolenaar 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
6771d860a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 10,
6781d860a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
6791d860a7eSMarcel Moolenaar 	},
6801d860a7eSMarcel Moolenaar 
68130ced0d8SJohn Baldwin 	{   0x1415, 0x9501, 0x131f, 0x2052,
68230ced0d8SJohn Baldwin 	    "SIIG Quartet Serial 850",
68330ced0d8SJohn Baldwin 	    DEFAULT_RCLK * 10,
68430ced0d8SJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
68530ced0d8SJohn Baldwin 	},
68630ced0d8SJohn Baldwin 
687282211eaSJohn Baldwin 	{   0x1415, 0x9501, 0x14db, 0x2150,
688282211eaSJohn Baldwin 	    "Kuroutoshikou SERIAL4P-LPPCI2",
689282211eaSJohn Baldwin 	    DEFAULT_RCLK * 10,
690282211eaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
691282211eaSJohn Baldwin 	},
692282211eaSJohn Baldwin 
69364220a7eSMarcel Moolenaar 	{   0x1415, 0x9501, 0xffff, 0,
694c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
695c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
69664220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
69783431653SWarner Losh 	},
69883431653SWarner Losh 
69910414b71SJohn Baldwin 	{   0x1415, 0x950a, 0x131f, 0x2030,
70010414b71SJohn Baldwin 	    "SIIG Cyber 2S PCIe",
70110414b71SJohn Baldwin 	    DEFAULT_RCLK * 10,
70210414b71SJohn Baldwin 	    PUC_PORT_2S, 0x10, 0, 8,
70310414b71SJohn Baldwin 	},
70410414b71SJohn Baldwin 
70564220a7eSMarcel Moolenaar 	{   0x1415, 0x950a, 0xffff, 0,
706c44bdcb0SDag-Erling Smørgrav 	    "Oxford Semiconductor OX16PCI954 UARTs",
707c44bdcb0SDag-Erling Smørgrav 	    DEFAULT_RCLK,
70864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
7099c564b6cSJohn Hay 	},
7109c564b6cSJohn Hay 
71164220a7eSMarcel Moolenaar 	{   0x1415, 0x9511, 0xffff, 0,
71264220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
71364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
71464220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
71543e42f36SDoug Ambrisko 	},
71643e42f36SDoug Ambrisko 
71764220a7eSMarcel Moolenaar 	{   0x1415, 0x9521, 0xffff, 0,
71864220a7eSMarcel Moolenaar 	    "Oxford Semiconductor OX16PCI952 UARTs",
71964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
72064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
7216cb38a02SDoug Ambrisko 	},
7226cb38a02SDoug Ambrisko 
72311a12794SRoman Kurakin 	{   0x1415, 0x9538, 0xffff, 0,
72411a12794SRoman Kurakin 	    "Oxford Semiconductor OX16PCI958 UARTs",
72511a12794SRoman Kurakin 	    DEFAULT_RCLK * 10,
72611a12794SRoman Kurakin 	    PUC_PORT_8S, 0x18, 0, 8,
72711a12794SRoman Kurakin 	},
72811a12794SRoman Kurakin 
729f09d9fbaSJohn Baldwin 	/*
730f09d9fbaSJohn Baldwin 	 * Perle boards use Oxford Semiconductor chips, but they store the
731f09d9fbaSJohn Baldwin 	 * Oxford Semiconductor device ID as a subvendor device ID and use
732f09d9fbaSJohn Baldwin 	 * their own device IDs.
733f09d9fbaSJohn Baldwin 	 */
734f09d9fbaSJohn Baldwin 
735f09d9fbaSJohn Baldwin 	{   0x155f, 0x0331, 0xffff, 0,
736f09d9fbaSJohn Baldwin 	    "Perle Speed4 LE",
737f09d9fbaSJohn Baldwin 	    DEFAULT_RCLK * 8,
738f09d9fbaSJohn Baldwin 	    PUC_PORT_4S, 0x10, 0, 8,
739f09d9fbaSJohn Baldwin 	},
740f09d9fbaSJohn Baldwin 
7416e9f075aSJohn Baldwin 	/*
7426e9f075aSJohn Baldwin 	 * Oxford Semiconductor PCI Express Expresso family
7436e9f075aSJohn Baldwin 	 *
7446e9f075aSJohn Baldwin 	 * Found in many 'native' PCI Express serial boards such as:
7456e9f075aSJohn Baldwin 	 *
7466e9f075aSJohn Baldwin 	 * eMegatech MP954ER4 (4 port) and MP958ER8 (8 port)
7476e9f075aSJohn Baldwin 	 * <URL:http://www.emegatech.com.tw/pdrs232pcie.html>
7486e9f075aSJohn Baldwin 	 *
7496e9f075aSJohn Baldwin 	 * Lindy 51189 (4 port)
7506e9f075aSJohn Baldwin 	 * <URL:http://www.lindy.com> <URL:http://tinyurl.com/lindy-51189>
7516e9f075aSJohn Baldwin 	 *
7526e9f075aSJohn Baldwin 	 * StarTech.com PEX4S952 (4 port) and PEX8S952 (8 port)
7536e9f075aSJohn Baldwin 	 * <URL:http://www.startech.com>
7546e9f075aSJohn Baldwin 	 */
7556e9f075aSJohn Baldwin 
756a6a64612SAndrey V. Elsukov 	{   0x1415, 0xc138, 0xffff, 0,
757a6a64612SAndrey V. Elsukov 	    "Oxford Semiconductor OXPCIe952 UARTs",
758a6a64612SAndrey V. Elsukov 	    DEFAULT_RCLK * 0x22,
759a6a64612SAndrey V. Elsukov 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
760a6a64612SAndrey V. Elsukov 	    .config_function = puc_config_oxford_pcie
761a6a64612SAndrey V. Elsukov 	},
762a6a64612SAndrey V. Elsukov 
7636e9f075aSJohn Baldwin 	{   0x1415, 0xc158, 0xffff, 0,
7646e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs",
7656e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7666e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7676e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7686e9f075aSJohn Baldwin 	},
7696e9f075aSJohn Baldwin 
7706e9f075aSJohn Baldwin 	{   0x1415, 0xc15d, 0xffff, 0,
7716e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe952 UARTs (function 1)",
7726e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7736e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7746e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7756e9f075aSJohn Baldwin 	},
7766e9f075aSJohn Baldwin 
7776e9f075aSJohn Baldwin 	{   0x1415, 0xc208, 0xffff, 0,
7786e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs",
7796e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7806e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7816e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7826e9f075aSJohn Baldwin 	},
7836e9f075aSJohn Baldwin 
7846e9f075aSJohn Baldwin 	{   0x1415, 0xc20d, 0xffff, 0,
7856e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe954 UARTs (function 1)",
7866e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7876e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7886e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7896e9f075aSJohn Baldwin 	},
7906e9f075aSJohn Baldwin 
7916e9f075aSJohn Baldwin 	{   0x1415, 0xc308, 0xffff, 0,
7926e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs",
7936e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
7946e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
7956e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
7966e9f075aSJohn Baldwin 	},
7976e9f075aSJohn Baldwin 
7986e9f075aSJohn Baldwin 	{   0x1415, 0xc30d, 0xffff, 0,
7996e9f075aSJohn Baldwin 	    "Oxford Semiconductor OXPCIe958 UARTs (function 1)",
8006e9f075aSJohn Baldwin 	    DEFAULT_RCLK * 0x22,
8016e9f075aSJohn Baldwin 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
8026e9f075aSJohn Baldwin 	    .config_function = puc_config_oxford_pcie
8036e9f075aSJohn Baldwin 	},
8046e9f075aSJohn Baldwin 
80546ce58c7SAndrew Thompson 	{   0x14d2, 0x8010, 0xffff, 0,
80646ce58c7SAndrew Thompson 	    "VScom PCI-100L",
80746ce58c7SAndrew Thompson 	    DEFAULT_RCLK * 8,
80846ce58c7SAndrew Thompson 	    PUC_PORT_1S, 0x14, 0, 0,
80946ce58c7SAndrew Thompson 	},
81046ce58c7SAndrew Thompson 
81164220a7eSMarcel Moolenaar 	{   0x14d2, 0x8020, 0xffff, 0,
81264220a7eSMarcel Moolenaar 	    "VScom PCI-200L",
81364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
81464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x14, 4, 0,
815a58deb46SColin Percival 	},
816a58deb46SColin Percival 
81764220a7eSMarcel Moolenaar 	{   0x14d2, 0x8028, 0xffff, 0,
81846dd877dSPoul-Henning Kamp 	    "VScom 200Li",
81964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
82064220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x20, 0, 8,
82146dd877dSPoul-Henning Kamp 	},
8223e19d3c0SBruce M Simpson 
82364220a7eSMarcel Moolenaar 	/*
82464220a7eSMarcel Moolenaar 	 * VScom (Titan?) PCI-800L.  More modern variant of the
82564220a7eSMarcel Moolenaar 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
82664220a7eSMarcel Moolenaar 	 * two of them obviously implemented as macro cells in
82764220a7eSMarcel Moolenaar 	 * the ASIC.  This causes the weird port access pattern
82864220a7eSMarcel Moolenaar 	 * below, where two of the IO port ranges each access
82964220a7eSMarcel Moolenaar 	 * one of the ASIC UARTs, and a block of IO addresses
83064220a7eSMarcel Moolenaar 	 * access the external UARTs.
83164220a7eSMarcel Moolenaar 	 */
83264220a7eSMarcel Moolenaar 	{   0x14d2, 0x8080, 0xffff, 0,
83364220a7eSMarcel Moolenaar 	    "Titan VScom PCI-800L",
83464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
83564220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x14, -1, -1,
83664220a7eSMarcel Moolenaar 	    .config_function = puc_config_titan
83764220a7eSMarcel Moolenaar 	},
83864220a7eSMarcel Moolenaar 
83964220a7eSMarcel Moolenaar 	/*
84064220a7eSMarcel Moolenaar 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
84164220a7eSMarcel Moolenaar 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
84264220a7eSMarcel Moolenaar 	 * device ID 3 and PCI device 1 device ID 4.
84364220a7eSMarcel Moolenaar 	 */
84464220a7eSMarcel Moolenaar 	{   0x14d2, 0xa003, 0xffff, 0,
84564220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
84664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
84764220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
84864220a7eSMarcel Moolenaar 	},
84964220a7eSMarcel Moolenaar 	{   0x14d2, 0xa004, 0xffff, 0,
85064220a7eSMarcel Moolenaar 	    "Titan PCI-800H",
85164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
85264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
85364220a7eSMarcel Moolenaar 	},
85464220a7eSMarcel Moolenaar 
85564220a7eSMarcel Moolenaar 	{   0x14d2, 0xa005, 0xffff, 0,
85664220a7eSMarcel Moolenaar 	    "Titan PCI-200H",
85764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
85864220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
85964220a7eSMarcel Moolenaar 	},
86064220a7eSMarcel Moolenaar 
86164220a7eSMarcel Moolenaar 	{   0x14d2, 0xe020, 0xffff, 0,
86264220a7eSMarcel Moolenaar 	    "Titan VScom PCI-200HV2",
86364220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
86464220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
86564220a7eSMarcel Moolenaar 	},
86664220a7eSMarcel Moolenaar 
86764589ec8SEitan Adler 	{   0x14d2, 0xa007, 0xffff, 0,
86864589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
86964589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
87064589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
87164589ec8SEitan Adler 	},
87264589ec8SEitan Adler 
87364589ec8SEitan Adler 	{   0x14d2, 0xa008, 0xffff, 0,
87464589ec8SEitan Adler 	    "Titan VScom PCIex-800H",
87564589ec8SEitan Adler 	    DEFAULT_RCLK * 8,
87664589ec8SEitan Adler 	    PUC_PORT_4S, 0x10, 0, 8,
87764589ec8SEitan Adler 	},
87864589ec8SEitan Adler 
87964220a7eSMarcel Moolenaar 	{   0x14db, 0x2130, 0xffff, 0,
88064220a7eSMarcel Moolenaar 	    "Avlab Technology, PCI IO 2S",
88164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
88264220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
88364220a7eSMarcel Moolenaar 	},
88464220a7eSMarcel Moolenaar 
88564220a7eSMarcel Moolenaar 	{   0x14db, 0x2150, 0xffff, 0,
88664220a7eSMarcel Moolenaar 	    "Avlab Low Profile PCI 4 Serial",
88764220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
88864220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,
88964220a7eSMarcel Moolenaar 	},
89064220a7eSMarcel Moolenaar 
8910dc908e7SAndrew Thompson 	{   0x14db, 0x2152, 0xffff, 0,
8920dc908e7SAndrew Thompson 	    "Avlab Low Profile PCI 4 Serial",
8930dc908e7SAndrew Thompson 	    DEFAULT_RCLK,
8940dc908e7SAndrew Thompson 	    PUC_PORT_4S, 0x10, 4, 0,
8950dc908e7SAndrew Thompson 	},
8960dc908e7SAndrew Thompson 
89764220a7eSMarcel Moolenaar 	{   0x1592, 0x0781, 0xffff, 0,
89864220a7eSMarcel Moolenaar 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
89964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
90064220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 0, -1,
90164220a7eSMarcel Moolenaar 	    .config_function = puc_config_syba
90264220a7eSMarcel Moolenaar 	},
90364220a7eSMarcel Moolenaar 
904*7501345eSJohn Hay 	{   0x1fd4, 0x1999, 0xffff, 0,
905*7501345eSJohn Hay 	    "Sunix SER5437A",
906*7501345eSJohn Hay 	    DEFAULT_RCLK * 8,
907*7501345eSJohn Hay 	    PUC_PORT_2S, 0x10, 0, 8,
908*7501345eSJohn Hay 	},
909*7501345eSJohn Hay 
910d9b73ea9SEitan Adler 	{    0x5372, 0x6873, 0xffff, 0,
911d9b73ea9SEitan Adler 	     "Sun 1040 PCI Quad Serial",
912d9b73ea9SEitan Adler 	     DEFAULT_RCLK,
913d9b73ea9SEitan Adler 	     PUC_PORT_4S, 0x10, 4, 0,
914d9b73ea9SEitan Adler 	},
915d9b73ea9SEitan Adler 
91664220a7eSMarcel Moolenaar 	{   0x6666, 0x0001, 0xffff, 0,
91764220a7eSMarcel Moolenaar 	    "Decision Computer Inc, PCCOM 4-port serial",
91864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
91964220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x1c, 0, 8,
92064220a7eSMarcel Moolenaar 	},
92164220a7eSMarcel Moolenaar 
922858030c4SAndrew Thompson 	{   0x6666, 0x0002, 0xffff, 0,
923858030c4SAndrew Thompson 	    "Decision Computer Inc, PCCOM 8-port serial",
924858030c4SAndrew Thompson 	    DEFAULT_RCLK,
925858030c4SAndrew Thompson 	    PUC_PORT_8S, 0x1c, 0, 8,
926858030c4SAndrew Thompson 	},
927858030c4SAndrew Thompson 
92864220a7eSMarcel Moolenaar 	{   0x6666, 0x0004, 0xffff, 0,
92964220a7eSMarcel Moolenaar 	    "PCCOM dual port RS232/422/485",
93064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
93164220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x1c, 0, 8,
93264220a7eSMarcel Moolenaar 	},
93364220a7eSMarcel Moolenaar 
93464220a7eSMarcel Moolenaar 	{   0x9710, 0x9815, 0xffff, 0,
93564220a7eSMarcel Moolenaar 	    "NetMos NM9815 Dual 1284 Printer port",
93664220a7eSMarcel Moolenaar 	    0,
93764220a7eSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 8, 0,
93864220a7eSMarcel Moolenaar 	},
93964220a7eSMarcel Moolenaar 
940843994aeSJohn Baldwin 	/*
941843994aeSJohn Baldwin 	 * This is more specific than the generic NM9835 entry that follows, and
942843994aeSJohn Baldwin 	 * is placed here to _prevent_ puc from claiming this single port card.
943843994aeSJohn Baldwin 	 *
944843994aeSJohn Baldwin 	 * uart(4) will claim this device.
945843994aeSJohn Baldwin 	 */
946843994aeSJohn Baldwin 	{   0x9710, 0x9835, 0x1000, 1,
947843994aeSJohn Baldwin 	    "NetMos NM9835 based 1-port serial",
948843994aeSJohn Baldwin 	    DEFAULT_RCLK,
949843994aeSJohn Baldwin 	    PUC_PORT_1S, 0x10, 4, 0,
950843994aeSJohn Baldwin 	},
951843994aeSJohn Baldwin 
952045de714SNavdeep Parhar 	{   0x9710, 0x9835, 0x1000, 2,
953045de714SNavdeep Parhar 	    "NetMos NM9835 based 2-port serial",
954045de714SNavdeep Parhar 	    DEFAULT_RCLK,
955045de714SNavdeep Parhar 	    PUC_PORT_2S, 0x10, 4, 0,
956045de714SNavdeep Parhar 	},
957045de714SNavdeep Parhar 
95864220a7eSMarcel Moolenaar 	{   0x9710, 0x9835, 0xffff, 0,
95964220a7eSMarcel Moolenaar 	    "NetMos NM9835 Dual UART and 1284 Printer port",
96064220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
96164220a7eSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
96264220a7eSMarcel Moolenaar 	},
96364220a7eSMarcel Moolenaar 
96464220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0x1000, 0x0006,
96564220a7eSMarcel Moolenaar 	    "NetMos NM9845 6 Port UART",
96664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
96764220a7eSMarcel Moolenaar 	    PUC_PORT_6S, 0x10, 4, 0,
96864220a7eSMarcel Moolenaar 	},
96964220a7eSMarcel Moolenaar 
97064220a7eSMarcel Moolenaar 	{   0x9710, 0x9845, 0xffff, 0,
97164220a7eSMarcel Moolenaar 	    "NetMos NM9845 Quad UART and 1284 Printer port",
97264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
97364220a7eSMarcel Moolenaar 	    PUC_PORT_4S1P, 0x10, 4, 0,
9741d864e0dSMarcel Moolenaar 	},
9751d864e0dSMarcel Moolenaar 
9761d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3002,
9771d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART",
9781d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
9791d864e0dSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 4, 0,
9801d864e0dSMarcel Moolenaar 	},
9811d864e0dSMarcel Moolenaar 
9821d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3003,
9831d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Triple UART",
9841d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
9851d864e0dSMarcel Moolenaar 	    PUC_PORT_3S, 0x10, 4, 0,
9861d864e0dSMarcel Moolenaar 	},
9871d864e0dSMarcel Moolenaar 
9881d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3004,
9891d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Quad UART",
9901d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
9911d864e0dSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 4, 0,0
9921d864e0dSMarcel Moolenaar 	},
9931d864e0dSMarcel Moolenaar 
9941d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3011,
9951d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Single UART and 1284 Printer port",
9961d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
9971d864e0dSMarcel Moolenaar 	    PUC_PORT_1S1P, 0x10, 4, 0,
9981d864e0dSMarcel Moolenaar 	},
9991d864e0dSMarcel Moolenaar 
10001d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3012,
10011d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual UART and 1284 Printer port",
10021d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10031d864e0dSMarcel Moolenaar 	    PUC_PORT_2S1P, 0x10, 4, 0,
10041d864e0dSMarcel Moolenaar 	},
10051d864e0dSMarcel Moolenaar 
10061d864e0dSMarcel Moolenaar 	{   0x9710, 0x9865, 0xa000, 0x3020,
10071d864e0dSMarcel Moolenaar 	    "NetMos NM9865 Dual 1284 Printer port",
10081d864e0dSMarcel Moolenaar 	    DEFAULT_RCLK,
10091d864e0dSMarcel Moolenaar 	    PUC_PORT_2P, 0x10, 4, 0,
101064220a7eSMarcel Moolenaar 	},
101164220a7eSMarcel Moolenaar 
101264220a7eSMarcel Moolenaar 	{   0xb00c, 0x021c, 0xffff, 0,
101364220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Lite",
101464220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
101564220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
101664220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
101764220a7eSMarcel Moolenaar 	},
101864220a7eSMarcel Moolenaar 
101964220a7eSMarcel Moolenaar 	{   0xb00c, 0x031c, 0xffff, 0,
102064220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Pro",
102164220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
102264220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
102364220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
102464220a7eSMarcel Moolenaar 	},
102564220a7eSMarcel Moolenaar 
102664220a7eSMarcel Moolenaar 	{   0xb00c, 0x041c, 0xffff, 0,
102764220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Lite",
102864220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
102964220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
103064220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
103164220a7eSMarcel Moolenaar 	},
103264220a7eSMarcel Moolenaar 
103364220a7eSMarcel Moolenaar 	{   0xb00c, 0x051c, 0xffff, 0,
103464220a7eSMarcel Moolenaar 	    "IC Book Labs Ironclad x8 Pro",
103564220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
103664220a7eSMarcel Moolenaar 	    PUC_PORT_8S, 0x10, 0, 8,
103764220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
103864220a7eSMarcel Moolenaar 	},
103964220a7eSMarcel Moolenaar 
104064220a7eSMarcel Moolenaar 	{   0xb00c, 0x081c, 0xffff, 0,
104164220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Pro",
104264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK * 8,
104364220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
104464220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
104564220a7eSMarcel Moolenaar 	},
104664220a7eSMarcel Moolenaar 
104764220a7eSMarcel Moolenaar 	{   0xb00c, 0x091c, 0xffff, 0,
104864220a7eSMarcel Moolenaar 	    "IC Book Labs Dreadnought x16 Lite",
104964220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
105064220a7eSMarcel Moolenaar 	    PUC_PORT_16S, 0x10, 0, 8,
105164220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
105264220a7eSMarcel Moolenaar 	},
105364220a7eSMarcel Moolenaar 
105464220a7eSMarcel Moolenaar 	{   0xb00c, 0x0a1c, 0xffff, 0,
105564220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x2 Low Profile",
105664220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
105764220a7eSMarcel Moolenaar 	    PUC_PORT_2S, 0x10, 0, 8,
105864220a7eSMarcel Moolenaar 	},
105964220a7eSMarcel Moolenaar 
106064220a7eSMarcel Moolenaar 	{   0xb00c, 0x0b1c, 0xffff, 0,
106164220a7eSMarcel Moolenaar 	    "IC Book Labs Gunboat x4 Low Profile",
106264220a7eSMarcel Moolenaar 	    DEFAULT_RCLK,
106364220a7eSMarcel Moolenaar 	    PUC_PORT_4S, 0x10, 0, 8,
106464220a7eSMarcel Moolenaar 	    .config_function = puc_config_icbook
106564220a7eSMarcel Moolenaar 	},
106664220a7eSMarcel Moolenaar 
106764220a7eSMarcel Moolenaar 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
10689c564b6cSJohn Hay };
106964220a7eSMarcel Moolenaar 
107064220a7eSMarcel Moolenaar static int
107164220a7eSMarcel Moolenaar puc_config_amc(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
107264220a7eSMarcel Moolenaar     intptr_t *res)
107364220a7eSMarcel Moolenaar {
107464220a7eSMarcel Moolenaar 	switch (cmd) {
107564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
107664220a7eSMarcel Moolenaar 		*res = 8 * (port & 1);
107764220a7eSMarcel Moolenaar 		return (0);
107864220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
107964220a7eSMarcel Moolenaar 		*res = 0x14 + (port >> 1) * 4;
108064220a7eSMarcel Moolenaar 		return (0);
108164220a7eSMarcel Moolenaar 	default:
108264220a7eSMarcel Moolenaar 		break;
108364220a7eSMarcel Moolenaar 	}
108464220a7eSMarcel Moolenaar 	return (ENXIO);
108564220a7eSMarcel Moolenaar }
108664220a7eSMarcel Moolenaar 
108764220a7eSMarcel Moolenaar static int
108864220a7eSMarcel Moolenaar puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
108964220a7eSMarcel Moolenaar     intptr_t *res)
109064220a7eSMarcel Moolenaar {
109164220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
109264220a7eSMarcel Moolenaar 
109364220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_OFS) {
109464220a7eSMarcel Moolenaar 		if (cfg->subdevice == 0x1282)		/* Everest SP */
109564220a7eSMarcel Moolenaar 			port <<= 1;
109664220a7eSMarcel Moolenaar 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
109764220a7eSMarcel Moolenaar 			port = (port == 3) ? 4 : port;
109864220a7eSMarcel Moolenaar 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
109964220a7eSMarcel Moolenaar 		return (0);
110064220a7eSMarcel Moolenaar 	}
110164220a7eSMarcel Moolenaar 	return (ENXIO);
110264220a7eSMarcel Moolenaar }
110364220a7eSMarcel Moolenaar 
110464220a7eSMarcel Moolenaar static int
110522e0612fSJohn Baldwin puc_config_exar(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
110622e0612fSJohn Baldwin     intptr_t *res)
110722e0612fSJohn Baldwin {
110822e0612fSJohn Baldwin 	if (cmd == PUC_CFG_GET_OFS) {
110922e0612fSJohn Baldwin 		*res = port * 0x200;
111022e0612fSJohn Baldwin 		return (0);
111122e0612fSJohn Baldwin 	}
111222e0612fSJohn Baldwin 	return (ENXIO);
111322e0612fSJohn Baldwin }
111422e0612fSJohn Baldwin 
111522e0612fSJohn Baldwin static int
111664220a7eSMarcel Moolenaar puc_config_icbook(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
111764220a7eSMarcel Moolenaar     intptr_t *res)
111864220a7eSMarcel Moolenaar {
111964220a7eSMarcel Moolenaar 	if (cmd == PUC_CFG_GET_ILR) {
112064220a7eSMarcel Moolenaar 		*res = PUC_ILR_DIGI;
112164220a7eSMarcel Moolenaar 		return (0);
112264220a7eSMarcel Moolenaar 	}
112364220a7eSMarcel Moolenaar 	return (ENXIO);
112464220a7eSMarcel Moolenaar }
112564220a7eSMarcel Moolenaar 
112664220a7eSMarcel Moolenaar static int
11272c89ac5eSEitan Adler puc_config_moxa(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
11282c89ac5eSEitan Adler     intptr_t *res)
11292c89ac5eSEitan Adler {
11302c89ac5eSEitan Adler 	const struct puc_cfg *cfg = sc->sc_cfg;
11312c89ac5eSEitan Adler 
11322c89ac5eSEitan Adler 	if (cmd == PUC_CFG_GET_OFS && cfg->device == 0x1045) {
11332c89ac5eSEitan Adler 		*res = ((port == 3) ? 7 : port) * 0x200;
11342c89ac5eSEitan Adler 		return 0;
11352c89ac5eSEitan Adler 	}
11362c89ac5eSEitan Adler 	return (ENXIO);
11372c89ac5eSEitan Adler }
11382c89ac5eSEitan Adler 
11392c89ac5eSEitan Adler static int
114064220a7eSMarcel Moolenaar puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
114164220a7eSMarcel Moolenaar     intptr_t *res)
114264220a7eSMarcel Moolenaar {
114364220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
114464220a7eSMarcel Moolenaar 	struct puc_bar *bar;
114564220a7eSMarcel Moolenaar 	uint8_t v0, v1;
114664220a7eSMarcel Moolenaar 
114764220a7eSMarcel Moolenaar 	switch (cmd) {
114864220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
114964220a7eSMarcel Moolenaar 		/*
115064220a7eSMarcel Moolenaar 		 * Check if the scratchpad register is enabled or if the
115164220a7eSMarcel Moolenaar 		 * interrupt status and options registers are active.
115264220a7eSMarcel Moolenaar 		 */
115364220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
115464220a7eSMarcel Moolenaar 		if (bar == NULL)
115564220a7eSMarcel Moolenaar 			return (ENXIO);
115664220a7eSMarcel Moolenaar 		/* Set DLAB in the LCR register of UART 0. */
115764220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0x80);
115864220a7eSMarcel Moolenaar 		/* Write 0 to the SPR register of UART 0. */
115964220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0);
116064220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
116164220a7eSMarcel Moolenaar 		v0 = bus_read_1(bar->b_res, 7);
116264220a7eSMarcel Moolenaar 		/* Write a specific value to the SPR register of UART 0. */
116364220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 7, 0x80 + -cfg->clock);
116464220a7eSMarcel Moolenaar 		/* Read back the contents of the SPR register of UART 0. */
116564220a7eSMarcel Moolenaar 		v1 = bus_read_1(bar->b_res, 7);
116664220a7eSMarcel Moolenaar 		/* Clear DLAB in the LCR register of UART 0. */
116764220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 3, 0);
116864220a7eSMarcel Moolenaar 		/* Save the two values read-back from the SPR register. */
116964220a7eSMarcel Moolenaar 		sc->sc_cfg_data = (v0 << 8) | v1;
117064220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
117164220a7eSMarcel Moolenaar 			/*
117264220a7eSMarcel Moolenaar 			 * The SPR register echoed the two values written
117364220a7eSMarcel Moolenaar 			 * by us. This means that the SPAD jumper is set.
117464220a7eSMarcel Moolenaar 			 */
117564220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "warning: extra features "
117664220a7eSMarcel Moolenaar 			    "not usable -- SPAD compatibility enabled\n");
117764220a7eSMarcel Moolenaar 			return (0);
117864220a7eSMarcel Moolenaar 		}
117964220a7eSMarcel Moolenaar 		if (v0 != 0) {
118064220a7eSMarcel Moolenaar 			/*
118164220a7eSMarcel Moolenaar 			 * The first value doesn't match. This can only mean
118264220a7eSMarcel Moolenaar 			 * that the SPAD jumper is not set and that a non-
118364220a7eSMarcel Moolenaar 			 * standard fixed clock multiplier jumper is set.
118464220a7eSMarcel Moolenaar 			 */
118564220a7eSMarcel Moolenaar 			if (bootverbose)
118664220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "fixed clock rate "
118764220a7eSMarcel Moolenaar 				    "multiplier of %d\n", 1 << v0);
118864220a7eSMarcel Moolenaar 			if (v0 < -cfg->clock)
118964220a7eSMarcel Moolenaar 				device_printf(sc->sc_dev, "warning: "
119064220a7eSMarcel Moolenaar 				    "suboptimal fixed clock rate multiplier "
119164220a7eSMarcel Moolenaar 				    "setting\n");
119264220a7eSMarcel Moolenaar 			return (0);
119364220a7eSMarcel Moolenaar 		}
119464220a7eSMarcel Moolenaar 		/*
119564220a7eSMarcel Moolenaar 		 * The first value matched, but the second didn't. We know
119664220a7eSMarcel Moolenaar 		 * that the SPAD jumper is not set. We also know that the
119764220a7eSMarcel Moolenaar 		 * clock rate multiplier is software controlled *and* that
119864220a7eSMarcel Moolenaar 		 * we just programmed it to the maximum allowed.
119964220a7eSMarcel Moolenaar 		 */
120064220a7eSMarcel Moolenaar 		if (bootverbose)
120164220a7eSMarcel Moolenaar 			device_printf(sc->sc_dev, "clock rate multiplier of "
120264220a7eSMarcel Moolenaar 			    "%d selected\n", 1 << -cfg->clock);
120364220a7eSMarcel Moolenaar 		return (0);
120464220a7eSMarcel Moolenaar 	case PUC_CFG_GET_CLOCK:
120564220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
120664220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
120764220a7eSMarcel Moolenaar 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
120864220a7eSMarcel Moolenaar 			/*
120964220a7eSMarcel Moolenaar 			 * XXX With the SPAD jumper applied, there's no
121064220a7eSMarcel Moolenaar 			 * easy way of knowing if there's also a clock
121164220a7eSMarcel Moolenaar 			 * rate multiplier jumper installed. Let's hope
121264220a7eSMarcel Moolenaar 			 * not...
121364220a7eSMarcel Moolenaar 			 */
121464220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK;
121564220a7eSMarcel Moolenaar 		} else if (v0 == 0) {
121664220a7eSMarcel Moolenaar 			/*
121764220a7eSMarcel Moolenaar 			 * No clock rate multiplier jumper installed,
121864220a7eSMarcel Moolenaar 			 * so we programmed the board with the maximum
121964220a7eSMarcel Moolenaar 			 * multiplier allowed as given to us in the
122064220a7eSMarcel Moolenaar 			 * clock field of the config record (negated).
122164220a7eSMarcel Moolenaar 			 */
122264220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << -cfg->clock;
122364220a7eSMarcel Moolenaar 		} else
122464220a7eSMarcel Moolenaar 			*res = DEFAULT_RCLK << v0;
122564220a7eSMarcel Moolenaar 		return (0);
122664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_ILR:
122764220a7eSMarcel Moolenaar 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
122864220a7eSMarcel Moolenaar 		v1 = sc->sc_cfg_data & 0xff;
122964220a7eSMarcel Moolenaar 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock)
123064220a7eSMarcel Moolenaar 		    ? PUC_ILR_NONE : PUC_ILR_QUATECH;
123164220a7eSMarcel Moolenaar 		return (0);
123264220a7eSMarcel Moolenaar 	default:
123364220a7eSMarcel Moolenaar 		break;
123464220a7eSMarcel Moolenaar 	}
123564220a7eSMarcel Moolenaar 	return (ENXIO);
123664220a7eSMarcel Moolenaar }
123764220a7eSMarcel Moolenaar 
123864220a7eSMarcel Moolenaar static int
123964220a7eSMarcel Moolenaar puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
124064220a7eSMarcel Moolenaar     intptr_t *res)
124164220a7eSMarcel Moolenaar {
124264220a7eSMarcel Moolenaar 	static int base[] = { 0x251, 0x3f0, 0 };
124364220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
124464220a7eSMarcel Moolenaar 	struct puc_bar *bar;
124564220a7eSMarcel Moolenaar 	int efir, idx, ofs;
124664220a7eSMarcel Moolenaar 	uint8_t v;
124764220a7eSMarcel Moolenaar 
124864220a7eSMarcel Moolenaar 	switch (cmd) {
124964220a7eSMarcel Moolenaar 	case PUC_CFG_SETUP:
125064220a7eSMarcel Moolenaar 		bar = puc_get_bar(sc, cfg->rid);
125164220a7eSMarcel Moolenaar 		if (bar == NULL)
125264220a7eSMarcel Moolenaar 			return (ENXIO);
125364220a7eSMarcel Moolenaar 
125464220a7eSMarcel Moolenaar 		/* configure both W83877TFs */
125564220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0x89);
125664220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
125764220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0x87);
125864220a7eSMarcel Moolenaar 		idx = 0;
125964220a7eSMarcel Moolenaar 		while (base[idx] != 0) {
126064220a7eSMarcel Moolenaar 			efir = base[idx];
126164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x09);
126264220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
126364220a7eSMarcel Moolenaar 			if ((v & 0x0f) != 0x0c)
126464220a7eSMarcel Moolenaar 				return (ENXIO);
126564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
126664220a7eSMarcel Moolenaar 			v = bus_read_1(bar->b_res, efir + 1);
126764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
126864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
126964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x16);
127064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
127164220a7eSMarcel Moolenaar 			ofs = base[idx] & 0x300;
127264220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x23);
127364220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
127464220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x24);
127564220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
127664220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x25);
127764220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
127864220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x17);
127964220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x03);
128064220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir, 0x28);
128164220a7eSMarcel Moolenaar 			bus_write_1(bar->b_res, efir + 1, 0x43);
128264220a7eSMarcel Moolenaar 			idx++;
128364220a7eSMarcel Moolenaar 		}
128464220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x250, 0xaa);
128564220a7eSMarcel Moolenaar 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
128664220a7eSMarcel Moolenaar 		return (0);
128764220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
128864220a7eSMarcel Moolenaar 		switch (port) {
128964220a7eSMarcel Moolenaar 		case 0:
129064220a7eSMarcel Moolenaar 			*res = 0x2f8;
129164220a7eSMarcel Moolenaar 			return (0);
129264220a7eSMarcel Moolenaar 		case 1:
129364220a7eSMarcel Moolenaar 			*res = 0x2e8;
129464220a7eSMarcel Moolenaar 			return (0);
129564220a7eSMarcel Moolenaar 		case 2:
129664220a7eSMarcel Moolenaar 			*res = 0x3f8;
129764220a7eSMarcel Moolenaar 			return (0);
129864220a7eSMarcel Moolenaar 		case 3:
129964220a7eSMarcel Moolenaar 			*res = 0x3e8;
130064220a7eSMarcel Moolenaar 			return (0);
130164220a7eSMarcel Moolenaar 		case 4:
130264220a7eSMarcel Moolenaar 			*res = 0x278;
130364220a7eSMarcel Moolenaar 			return (0);
130464220a7eSMarcel Moolenaar 		}
130564220a7eSMarcel Moolenaar 		break;
130664220a7eSMarcel Moolenaar 	default:
130764220a7eSMarcel Moolenaar 		break;
130864220a7eSMarcel Moolenaar 	}
130964220a7eSMarcel Moolenaar 	return (ENXIO);
131064220a7eSMarcel Moolenaar }
131164220a7eSMarcel Moolenaar 
131264220a7eSMarcel Moolenaar static int
131364220a7eSMarcel Moolenaar puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
131464220a7eSMarcel Moolenaar     intptr_t *res)
131564220a7eSMarcel Moolenaar {
131664220a7eSMarcel Moolenaar 	const struct puc_cfg *cfg = sc->sc_cfg;
131764220a7eSMarcel Moolenaar 
131864220a7eSMarcel Moolenaar 	switch (cmd) {
131964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
132064220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
132164220a7eSMarcel Moolenaar 			*res = (port > 4) ? 8 * (port - 4) : 0;
132264220a7eSMarcel Moolenaar 			return (0);
132364220a7eSMarcel Moolenaar 		}
132464220a7eSMarcel Moolenaar 		break;
132564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
132664220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_8S) {
132764220a7eSMarcel Moolenaar 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
132864220a7eSMarcel Moolenaar 			return (0);
132964220a7eSMarcel Moolenaar 		}
133064220a7eSMarcel Moolenaar 		if (cfg->ports == PUC_PORT_2S1P) {
133164220a7eSMarcel Moolenaar 			switch (port) {
133264220a7eSMarcel Moolenaar 			case 0: *res = 0x10; return (0);
133364220a7eSMarcel Moolenaar 			case 1: *res = 0x14; return (0);
133464220a7eSMarcel Moolenaar 			case 2: *res = 0x1c; return (0);
133564220a7eSMarcel Moolenaar 			}
133664220a7eSMarcel Moolenaar 		}
133764220a7eSMarcel Moolenaar 		break;
133864220a7eSMarcel Moolenaar 	default:
133964220a7eSMarcel Moolenaar 		break;
134064220a7eSMarcel Moolenaar 	}
134164220a7eSMarcel Moolenaar 	return (ENXIO);
134264220a7eSMarcel Moolenaar }
134364220a7eSMarcel Moolenaar 
134464220a7eSMarcel Moolenaar static int
134564220a7eSMarcel Moolenaar puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
134664220a7eSMarcel Moolenaar     intptr_t *res)
134764220a7eSMarcel Moolenaar {
134864220a7eSMarcel Moolenaar 	static uint16_t dual[] = {
134964220a7eSMarcel Moolenaar 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
135064220a7eSMarcel Moolenaar 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
135164220a7eSMarcel Moolenaar 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
135264220a7eSMarcel Moolenaar 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
135364220a7eSMarcel Moolenaar 	    0xD079, 0
135464220a7eSMarcel Moolenaar 	};
135564220a7eSMarcel Moolenaar 	static uint16_t quad[] = {
135664220a7eSMarcel Moolenaar 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
135764220a7eSMarcel Moolenaar 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
135864220a7eSMarcel Moolenaar 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
135964220a7eSMarcel Moolenaar 	    0xB157, 0
136064220a7eSMarcel Moolenaar 	};
136164220a7eSMarcel Moolenaar 	static uint16_t octa[] = {
136264220a7eSMarcel Moolenaar 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
136364220a7eSMarcel Moolenaar 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
136464220a7eSMarcel Moolenaar 	};
136564220a7eSMarcel Moolenaar 	static struct {
136664220a7eSMarcel Moolenaar 		int ports;
136764220a7eSMarcel Moolenaar 		uint16_t *ids;
136864220a7eSMarcel Moolenaar 	} subdevs[] = {
136964220a7eSMarcel Moolenaar 	    { 2, dual },
137064220a7eSMarcel Moolenaar 	    { 4, quad },
137164220a7eSMarcel Moolenaar 	    { 8, octa },
137264220a7eSMarcel Moolenaar 	    { 0, NULL }
137364220a7eSMarcel Moolenaar 	};
137464220a7eSMarcel Moolenaar 	static char desc[64];
137564220a7eSMarcel Moolenaar 	int dev, id;
137664220a7eSMarcel Moolenaar 	uint16_t subdev;
137764220a7eSMarcel Moolenaar 
137864220a7eSMarcel Moolenaar 	switch (cmd) {
13799c418f51SJohn Baldwin 	case PUC_CFG_GET_CLOCK:
13809c418f51SJohn Baldwin 		if (port < 2)
13819c418f51SJohn Baldwin 			*res = DEFAULT_RCLK * 8;
13829c418f51SJohn Baldwin 		else
13839c418f51SJohn Baldwin 			*res = DEFAULT_RCLK;
13849c418f51SJohn Baldwin 		return (0);
138564220a7eSMarcel Moolenaar 	case PUC_CFG_GET_DESC:
138664220a7eSMarcel Moolenaar 		snprintf(desc, sizeof(desc),
138764220a7eSMarcel Moolenaar 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
138864220a7eSMarcel Moolenaar 		*res = (intptr_t)desc;
138964220a7eSMarcel Moolenaar 		return (0);
139064220a7eSMarcel Moolenaar 	case PUC_CFG_GET_NPORTS:
139164220a7eSMarcel Moolenaar 		subdev = pci_get_subdevice(sc->sc_dev);
139264220a7eSMarcel Moolenaar 		dev = 0;
139364220a7eSMarcel Moolenaar 		while (subdevs[dev].ports != 0) {
139464220a7eSMarcel Moolenaar 			id = 0;
139564220a7eSMarcel Moolenaar 			while (subdevs[dev].ids[id] != 0) {
139664220a7eSMarcel Moolenaar 				if (subdev == subdevs[dev].ids[id]) {
139764220a7eSMarcel Moolenaar 					sc->sc_cfg_data = subdevs[dev].ports;
139864220a7eSMarcel Moolenaar 					*res = sc->sc_cfg_data;
139964220a7eSMarcel Moolenaar 					return (0);
140064220a7eSMarcel Moolenaar 				}
140164220a7eSMarcel Moolenaar 				id++;
140264220a7eSMarcel Moolenaar 			}
140364220a7eSMarcel Moolenaar 			dev++;
140464220a7eSMarcel Moolenaar 		}
140564220a7eSMarcel Moolenaar 		return (ENXIO);
140664220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
140764220a7eSMarcel Moolenaar 		*res = (port == 1 || port == 3) ? 8 : 0;
140864220a7eSMarcel Moolenaar 		return (0);
140964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
1410c1163871SMarcel Moolenaar 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
141164220a7eSMarcel Moolenaar 		return (0);
141264220a7eSMarcel Moolenaar 	case PUC_CFG_GET_TYPE:
141364220a7eSMarcel Moolenaar 		*res = PUC_TYPE_SERIAL;
141464220a7eSMarcel Moolenaar 		return (0);
141564220a7eSMarcel Moolenaar 	default:
141664220a7eSMarcel Moolenaar 		break;
141764220a7eSMarcel Moolenaar 	}
141864220a7eSMarcel Moolenaar 	return (ENXIO);
141964220a7eSMarcel Moolenaar }
142064220a7eSMarcel Moolenaar 
142164220a7eSMarcel Moolenaar static int
14226e9f075aSJohn Baldwin puc_config_oxford_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
14236e9f075aSJohn Baldwin     intptr_t *res)
14246e9f075aSJohn Baldwin {
14256e9f075aSJohn Baldwin 	const struct puc_cfg *cfg = sc->sc_cfg;
14266e9f075aSJohn Baldwin 	int idx;
14276e9f075aSJohn Baldwin 	struct puc_bar *bar;
14286e9f075aSJohn Baldwin 	uint8_t value;
14296e9f075aSJohn Baldwin 
14306e9f075aSJohn Baldwin 	switch (cmd) {
14316e9f075aSJohn Baldwin 	case PUC_CFG_SETUP:
14326e9f075aSJohn Baldwin 		device_printf(sc->sc_dev, "%d UARTs detected\n",
14336e9f075aSJohn Baldwin 			sc->sc_nports);
14346e9f075aSJohn Baldwin 
14356e9f075aSJohn Baldwin 		/* Set UARTs to enhanced mode */
14366e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
14376e9f075aSJohn Baldwin 		if (bar == NULL)
14386e9f075aSJohn Baldwin 			return (ENXIO);
14396e9f075aSJohn Baldwin 		for (idx = 0; idx < sc->sc_nports; idx++) {
1440a59f78daSJohn Baldwin 			value = bus_read_1(bar->b_res, 0x1000 + (idx << 9) +
1441a59f78daSJohn Baldwin 			    0x92);
14426e9f075aSJohn Baldwin 			bus_write_1(bar->b_res, 0x1000 + (idx << 9) + 0x92,
14436e9f075aSJohn Baldwin 			    value | 0x10);
14446e9f075aSJohn Baldwin 		}
14456e9f075aSJohn Baldwin 		return (0);
14466e9f075aSJohn Baldwin 	case PUC_CFG_GET_LEN:
14476e9f075aSJohn Baldwin 		*res = 0x200;
14486e9f075aSJohn Baldwin 		return (0);
14496e9f075aSJohn Baldwin 	case PUC_CFG_GET_NPORTS:
14506e9f075aSJohn Baldwin 		/*
14516e9f075aSJohn Baldwin 		 * Check if we are being called from puc_bfe_attach()
14526e9f075aSJohn Baldwin 		 * or puc_bfe_probe(). If puc_bfe_probe(), we cannot
14536e9f075aSJohn Baldwin 		 * puc_get_bar(), so we return a value of 16. This has cosmetic
14546e9f075aSJohn Baldwin 		 * side-effects at worst; in PUC_CFG_GET_DESC,
14556e9f075aSJohn Baldwin 		 * (int)sc->sc_cfg_data will not contain the true number of
14566e9f075aSJohn Baldwin 		 * ports in PUC_CFG_GET_DESC, but we are not implementing that
14576e9f075aSJohn Baldwin 		 * call for this device family anyway.
14586e9f075aSJohn Baldwin 		 *
14596e9f075aSJohn Baldwin 		 * The check is for initialisation of sc->sc_bar[idx], which is
14606e9f075aSJohn Baldwin 		 * only done in puc_bfe_attach().
14616e9f075aSJohn Baldwin 		 */
14626e9f075aSJohn Baldwin 		idx = 0;
14636e9f075aSJohn Baldwin 		do {
14646e9f075aSJohn Baldwin 			if (sc->sc_bar[idx++].b_rid != -1) {
14656e9f075aSJohn Baldwin 				sc->sc_cfg_data = 16;
14666e9f075aSJohn Baldwin 				*res = sc->sc_cfg_data;
14676e9f075aSJohn Baldwin 				return (0);
14686e9f075aSJohn Baldwin 			}
14696e9f075aSJohn Baldwin 		} while (idx < PUC_PCI_BARS);
14706e9f075aSJohn Baldwin 
14716e9f075aSJohn Baldwin 		bar = puc_get_bar(sc, cfg->rid);
14726e9f075aSJohn Baldwin 		if (bar == NULL)
14736e9f075aSJohn Baldwin 			return (ENXIO);
14746e9f075aSJohn Baldwin 
14756e9f075aSJohn Baldwin 		value = bus_read_1(bar->b_res, 0x04);
14766e9f075aSJohn Baldwin 		if (value == 0)
14776e9f075aSJohn Baldwin 			return (ENXIO);
14786e9f075aSJohn Baldwin 
14796e9f075aSJohn Baldwin 		sc->sc_cfg_data = value;
14806e9f075aSJohn Baldwin 		*res = sc->sc_cfg_data;
14816e9f075aSJohn Baldwin 		return (0);
14826e9f075aSJohn Baldwin 	case PUC_CFG_GET_OFS:
14836e9f075aSJohn Baldwin 		*res = 0x1000 + (port << 9);
14846e9f075aSJohn Baldwin 		return (0);
14856e9f075aSJohn Baldwin 	case PUC_CFG_GET_TYPE:
14866e9f075aSJohn Baldwin 		*res = PUC_TYPE_SERIAL;
14876e9f075aSJohn Baldwin 		return (0);
14886e9f075aSJohn Baldwin 	default:
14896e9f075aSJohn Baldwin 		break;
14906e9f075aSJohn Baldwin 	}
14916e9f075aSJohn Baldwin 	return (ENXIO);
14926e9f075aSJohn Baldwin }
14936e9f075aSJohn Baldwin 
14946e9f075aSJohn Baldwin static int
149564220a7eSMarcel Moolenaar puc_config_titan(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
149664220a7eSMarcel Moolenaar     intptr_t *res)
149764220a7eSMarcel Moolenaar {
149864220a7eSMarcel Moolenaar 	switch (cmd) {
149964220a7eSMarcel Moolenaar 	case PUC_CFG_GET_OFS:
150064220a7eSMarcel Moolenaar 		*res = (port < 3) ? 0 : (port - 2) << 3;
150164220a7eSMarcel Moolenaar 		return (0);
150264220a7eSMarcel Moolenaar 	case PUC_CFG_GET_RID:
150364220a7eSMarcel Moolenaar 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
150464220a7eSMarcel Moolenaar 		return (0);
150564220a7eSMarcel Moolenaar 	default:
150664220a7eSMarcel Moolenaar 		break;
150764220a7eSMarcel Moolenaar 	}
150864220a7eSMarcel Moolenaar 	return (ENXIO);
150964220a7eSMarcel Moolenaar }
1510