xref: /freebsd/sys/dev/puc/pucdata.c (revision 4f52dfbb8d6c4d446500c5b097e3806ec219fbd4)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2006 Marcel Moolenaar
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 
32 /*
33  * PCI "universal" communications card driver configuration data (used to
34  * match/attach the cards).
35  */
36 
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/kernel.h>
40 #include <sys/bus.h>
41 #include <sys/sysctl.h>
42 
43 #include <machine/resource.h>
44 #include <machine/bus.h>
45 #include <sys/rman.h>
46 
47 #include <dev/ic/ns16550.h>
48 
49 #include <dev/pci/pcireg.h>
50 #include <dev/pci/pcivar.h>
51 
52 #include <dev/puc/puc_bus.h>
53 #include <dev/puc/puc_cfg.h>
54 #include <dev/puc/puc_bfe.h>
55 
56 static puc_config_f puc_config_advantech;
57 static puc_config_f puc_config_amc;
58 static puc_config_f puc_config_diva;
59 static puc_config_f puc_config_exar;
60 static puc_config_f puc_config_exar_pcie;
61 static puc_config_f puc_config_icbook;
62 static puc_config_f puc_config_moxa;
63 static puc_config_f puc_config_oxford_pci954;
64 static puc_config_f puc_config_oxford_pcie;
65 static puc_config_f puc_config_quatech;
66 static puc_config_f puc_config_syba;
67 static puc_config_f puc_config_siig;
68 static puc_config_f puc_config_sunix;
69 static puc_config_f puc_config_timedia;
70 static puc_config_f puc_config_titan;
71 
72 const struct puc_cfg puc_pci_devices[] = {
73 	{   0x0009, 0x7168, 0xffff, 0,
74 	    "Sunix SUN1889",
75 	    DEFAULT_RCLK * 8,
76 	    PUC_PORT_2S, 0x10, 0, 8,
77 	},
78 
79 	{   0x103c, 0x1048, 0x103c, 0x1049,
80 	    "HP Diva Serial [GSP] Multiport UART - Tosca Console",
81 	    DEFAULT_RCLK,
82 	    PUC_PORT_3S, 0x10, 0, -1,
83 	    .config_function = puc_config_diva
84 	},
85 
86 	{   0x103c, 0x1048, 0x103c, 0x104a,
87 	    "HP Diva Serial [GSP] Multiport UART - Tosca Secondary",
88 	    DEFAULT_RCLK,
89 	    PUC_PORT_2S, 0x10, 0, -1,
90 	    .config_function = puc_config_diva
91 	},
92 
93 	{   0x103c, 0x1048, 0x103c, 0x104b,
94 	    "HP Diva Serial [GSP] Multiport UART - Maestro SP2",
95 	    DEFAULT_RCLK,
96 	    PUC_PORT_4S, 0x10, 0, -1,
97 	    .config_function = puc_config_diva
98 	},
99 
100 	{   0x103c, 0x1048, 0x103c, 0x1223,
101 	    "HP Diva Serial [GSP] Multiport UART - Superdome Console",
102 	    DEFAULT_RCLK,
103 	    PUC_PORT_3S, 0x10, 0, -1,
104 	    .config_function = puc_config_diva
105 	},
106 
107 	{   0x103c, 0x1048, 0x103c, 0x1226,
108 	    "HP Diva Serial [GSP] Multiport UART - Keystone SP2",
109 	    DEFAULT_RCLK,
110 	    PUC_PORT_3S, 0x10, 0, -1,
111 	    .config_function = puc_config_diva
112 	},
113 
114 	{   0x103c, 0x1048, 0x103c, 0x1282,
115 	    "HP Diva Serial [GSP] Multiport UART - Everest SP2",
116 	    DEFAULT_RCLK,
117 	    PUC_PORT_3S, 0x10, 0, -1,
118 	    .config_function = puc_config_diva
119 	},
120 
121 	{   0x10b5, 0x1076, 0x10b5, 0x1076,
122 	    "VScom PCI-800",
123 	    DEFAULT_RCLK * 8,
124 	    PUC_PORT_8S, 0x18, 0, 8,
125 	},
126 
127 	{   0x10b5, 0x1077, 0x10b5, 0x1077,
128 	    "VScom PCI-400",
129 	    DEFAULT_RCLK * 8,
130 	    PUC_PORT_4S, 0x18, 0, 8,
131 	},
132 
133 	{   0x10b5, 0x1103, 0x10b5, 0x1103,
134 	    "VScom PCI-200",
135 	    DEFAULT_RCLK * 8,
136 	    PUC_PORT_2S, 0x18, 4, 0,
137 	},
138 
139 	/*
140 	 * Boca Research Turbo Serial 658 (8 serial port) card.
141 	 * Appears to be the same as Chase Research PLC PCI-FAST8
142 	 * and Perle PCI-FAST8 Multi-Port serial cards.
143 	 */
144 	{   0x10b5, 0x9050, 0x12e0, 0x0021,
145 	    "Boca Research Turbo Serial 658",
146 	    DEFAULT_RCLK * 4,
147 	    PUC_PORT_8S, 0x18, 0, 8,
148 	},
149 
150 	{   0x10b5, 0x9050, 0x12e0, 0x0031,
151 	    "Boca Research Turbo Serial 654",
152 	    DEFAULT_RCLK * 4,
153 	    PUC_PORT_4S, 0x18, 0, 8,
154 	},
155 
156 	/*
157 	 * Dolphin Peripherals 4035 (dual serial port) card.  PLX 9050, with
158 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
159 	 * into the subsystem fields, and claims that it's a
160 	 * network/misc (0x02/0x80) device.
161 	 */
162 	{   0x10b5, 0x9050, 0xd84d, 0x6808,
163 	    "Dolphin Peripherals 4035",
164 	    DEFAULT_RCLK,
165 	    PUC_PORT_2S, 0x18, 4, 0,
166 	},
167 
168 	/*
169 	 * Dolphin Peripherals 4014 (dual parallel port) card.  PLX 9050, with
170 	 * a seemingly-lame EEPROM setup that puts the Dolphin IDs
171 	 * into the subsystem fields, and claims that it's a
172 	 * network/misc (0x02/0x80) device.
173 	 */
174 	{   0x10b5, 0x9050, 0xd84d, 0x6810,
175 	    "Dolphin Peripherals 4014",
176 	    0,
177 	    PUC_PORT_2P, 0x20, 4, 0,
178 	},
179 
180 	{   0x10e8, 0x818e, 0xffff, 0,
181 	    "Applied Micro Circuits 8 Port UART",
182 	    DEFAULT_RCLK,
183 	    PUC_PORT_8S, 0x14, -1, -1,
184 	    .config_function = puc_config_amc
185 	},
186 
187 	/*
188 	 * The following members of the Digi International Neo series are
189 	 * based on Exar PCI chips, f. e. the 8 port variants on XR17V258IV.
190 	 * Accordingly, the PCIe versions of these cards incorporate a PLX
191 	 * PCIe-PCI-bridge.
192 	 */
193 
194 	{   0x114f, 0x00b0, 0xffff, 0,
195 	    "Digi Neo PCI 4 Port",
196 	    DEFAULT_RCLK * 8,
197 	    PUC_PORT_4S, 0x10, 0, -1,
198 	    .config_function = puc_config_exar
199 	},
200 
201 	{   0x114f, 0x00b1, 0xffff, 0,
202 	    "Digi Neo PCI 8 Port",
203 	    DEFAULT_RCLK * 8,
204 	    PUC_PORT_8S, 0x10, 0, -1,
205 	    .config_function = puc_config_exar
206 	},
207 
208 	{   0x114f, 0x00f0, 0xffff, 0,
209 	    "Digi Neo PCIe 8 Port",
210 	    DEFAULT_RCLK * 8,
211 	    PUC_PORT_8S, 0x10, 0, -1,
212 	    .config_function = puc_config_exar
213 	},
214 
215 	{   0x114f, 0x00f1, 0xffff, 0,
216 	    "Digi Neo PCIe 4 Port",
217 	    DEFAULT_RCLK * 8,
218 	    PUC_PORT_4S, 0x10, 0, -1,
219 	    .config_function = puc_config_exar
220 	},
221 
222 	{   0x114f, 0x00f2, 0xffff, 0,
223 	    "Digi Neo PCIe 4 Port RJ45",
224 	    DEFAULT_RCLK * 8,
225 	    PUC_PORT_4S, 0x10, 0, -1,
226 	    .config_function = puc_config_exar
227 	},
228 
229 	{   0x114f, 0x00f3, 0xffff, 0,
230 	    "Digi Neo PCIe 8 Port RJ45",
231 	    DEFAULT_RCLK * 8,
232 	    PUC_PORT_8S, 0x10, 0, -1,
233 	    .config_function = puc_config_exar
234 	},
235 
236 	{   0x11fe, 0x8010, 0xffff, 0,
237 	    "Comtrol RocketPort 550/8 RJ11 part A",
238 	    DEFAULT_RCLK * 4,
239 	    PUC_PORT_4S, 0x10, 0, 8,
240 	},
241 
242 	{   0x11fe, 0x8011, 0xffff, 0,
243 	    "Comtrol RocketPort 550/8 RJ11 part B",
244 	    DEFAULT_RCLK * 4,
245 	    PUC_PORT_4S, 0x10, 0, 8,
246 	},
247 
248 	{   0x11fe, 0x8012, 0xffff, 0,
249 	    "Comtrol RocketPort 550/8 Octa part A",
250 	    DEFAULT_RCLK * 4,
251 	    PUC_PORT_4S, 0x10, 0, 8,
252 	},
253 
254 	{   0x11fe, 0x8013, 0xffff, 0,
255 	    "Comtrol RocketPort 550/8 Octa part B",
256 	    DEFAULT_RCLK * 4,
257 	    PUC_PORT_4S, 0x10, 0, 8,
258 	},
259 
260 	{   0x11fe, 0x8014, 0xffff, 0,
261 	    "Comtrol RocketPort 550/4 RJ45",
262 	    DEFAULT_RCLK * 4,
263 	    PUC_PORT_4S, 0x10, 0, 8,
264 	},
265 
266 	{   0x11fe, 0x8015, 0xffff, 0,
267 	    "Comtrol RocketPort 550/Quad",
268 	    DEFAULT_RCLK * 4,
269 	    PUC_PORT_4S, 0x10, 0, 8,
270 	},
271 
272 	{   0x11fe, 0x8016, 0xffff, 0,
273 	    "Comtrol RocketPort 550/16 part A",
274 	    DEFAULT_RCLK * 4,
275 	    PUC_PORT_4S, 0x10, 0, 8,
276 	},
277 
278 	{   0x11fe, 0x8017, 0xffff, 0,
279 	    "Comtrol RocketPort 550/16 part B",
280 	    DEFAULT_RCLK * 4,
281 	    PUC_PORT_12S, 0x10, 0, 8,
282 	},
283 
284 	{   0x11fe, 0x8018, 0xffff, 0,
285 	    "Comtrol RocketPort 550/8 part A",
286 	    DEFAULT_RCLK * 4,
287 	    PUC_PORT_4S, 0x10, 0, 8,
288 	},
289 
290 	{   0x11fe, 0x8019, 0xffff, 0,
291 	    "Comtrol RocketPort 550/8 part B",
292 	    DEFAULT_RCLK * 4,
293 	    PUC_PORT_4S, 0x10, 0, 8,
294 	},
295 
296 	/*
297 	 * IBM SurePOS 300 Series (481033H) serial ports
298 	 * Details can be found on the IBM RSS websites
299 	 */
300 
301 	{   0x1014, 0x0297, 0xffff, 0,
302 	    "IBM SurePOS 300 Series (481033H) serial ports",
303 	    DEFAULT_RCLK,
304 	    PUC_PORT_4S, 0x10, 4, 0
305 	},
306 
307 	/*
308 	 * SIIG Boards.
309 	 *
310 	 * SIIG provides documentation for their boards at:
311 	 * <URL:http://www.siig.com/downloads.asp>
312 	 */
313 
314 	{   0x131f, 0x1010, 0xffff, 0,
315 	    "SIIG Cyber I/O PCI 16C550 (10x family)",
316 	    DEFAULT_RCLK,
317 	    PUC_PORT_1S1P, 0x18, 4, 0,
318 	},
319 
320 	{   0x131f, 0x1011, 0xffff, 0,
321 	    "SIIG Cyber I/O PCI 16C650 (10x family)",
322 	    DEFAULT_RCLK,
323 	    PUC_PORT_1S1P, 0x18, 4, 0,
324 	},
325 
326 	{   0x131f, 0x1012, 0xffff, 0,
327 	    "SIIG Cyber I/O PCI 16C850 (10x family)",
328 	    DEFAULT_RCLK,
329 	    PUC_PORT_1S1P, 0x18, 4, 0,
330 	},
331 
332 	{   0x131f, 0x1021, 0xffff, 0,
333 	    "SIIG Cyber Parallel Dual PCI (10x family)",
334 	    0,
335 	    PUC_PORT_2P, 0x18, 8, 0,
336 	},
337 
338 	{   0x131f, 0x1030, 0xffff, 0,
339 	    "SIIG Cyber Serial Dual PCI 16C550 (10x family)",
340 	    DEFAULT_RCLK,
341 	    PUC_PORT_2S, 0x18, 4, 0,
342 	},
343 
344 	{   0x131f, 0x1031, 0xffff, 0,
345 	    "SIIG Cyber Serial Dual PCI 16C650 (10x family)",
346 	    DEFAULT_RCLK,
347 	    PUC_PORT_2S, 0x18, 4, 0,
348 	},
349 
350 	{   0x131f, 0x1032, 0xffff, 0,
351 	    "SIIG Cyber Serial Dual PCI 16C850 (10x family)",
352 	    DEFAULT_RCLK,
353 	    PUC_PORT_2S, 0x18, 4, 0,
354 	},
355 
356 	{   0x131f, 0x1034, 0xffff, 0,	/* XXX really? */
357 	    "SIIG Cyber 2S1P PCI 16C550 (10x family)",
358 	    DEFAULT_RCLK,
359 	    PUC_PORT_2S1P, 0x18, 4, 0,
360 	},
361 
362 	{   0x131f, 0x1035, 0xffff, 0,	/* XXX really? */
363 	    "SIIG Cyber 2S1P PCI 16C650 (10x family)",
364 	    DEFAULT_RCLK,
365 	    PUC_PORT_2S1P, 0x18, 4, 0,
366 	},
367 
368 	{   0x131f, 0x1036, 0xffff, 0,	/* XXX really? */
369 	    "SIIG Cyber 2S1P PCI 16C850 (10x family)",
370 	    DEFAULT_RCLK,
371 	    PUC_PORT_2S1P, 0x18, 4, 0,
372 	},
373 
374 	{   0x131f, 0x1050, 0xffff, 0,
375 	    "SIIG Cyber 4S PCI 16C550 (10x family)",
376 	    DEFAULT_RCLK,
377 	    PUC_PORT_4S, 0x18, 4, 0,
378 	},
379 
380 	{   0x131f, 0x1051, 0xffff, 0,
381 	    "SIIG Cyber 4S PCI 16C650 (10x family)",
382 	    DEFAULT_RCLK,
383 	    PUC_PORT_4S, 0x18, 4, 0,
384 	},
385 
386 	{   0x131f, 0x1052, 0xffff, 0,
387 	    "SIIG Cyber 4S PCI 16C850 (10x family)",
388 	    DEFAULT_RCLK,
389 	    PUC_PORT_4S, 0x18, 4, 0,
390 	},
391 
392 	{   0x131f, 0x2010, 0xffff, 0,
393 	    "SIIG Cyber I/O PCI 16C550 (20x family)",
394 	    DEFAULT_RCLK,
395 	    PUC_PORT_1S1P, 0x10, 4, 0,
396 	},
397 
398 	{   0x131f, 0x2011, 0xffff, 0,
399 	    "SIIG Cyber I/O PCI 16C650 (20x family)",
400 	    DEFAULT_RCLK,
401 	    PUC_PORT_1S1P, 0x10, 4, 0,
402 	},
403 
404 	{   0x131f, 0x2012, 0xffff, 0,
405 	    "SIIG Cyber I/O PCI 16C850 (20x family)",
406 	    DEFAULT_RCLK,
407 	    PUC_PORT_1S1P, 0x10, 4, 0,
408 	},
409 
410 	{   0x131f, 0x2021, 0xffff, 0,
411 	    "SIIG Cyber Parallel Dual PCI (20x family)",
412 	    0,
413 	    PUC_PORT_2P, 0x10, 8, 0,
414 	},
415 
416 	{   0x131f, 0x2030, 0xffff, 0,
417 	    "SIIG Cyber Serial Dual PCI 16C550 (20x family)",
418 	    DEFAULT_RCLK,
419 	    PUC_PORT_2S, 0x10, 4, 0,
420 	},
421 
422 	{   0x131f, 0x2031, 0xffff, 0,
423 	    "SIIG Cyber Serial Dual PCI 16C650 (20x family)",
424 	    DEFAULT_RCLK,
425 	    PUC_PORT_2S, 0x10, 4, 0,
426 	},
427 
428 	{   0x131f, 0x2032, 0xffff, 0,
429 	    "SIIG Cyber Serial Dual PCI 16C850 (20x family)",
430 	    DEFAULT_RCLK,
431 	    PUC_PORT_2S, 0x10, 4, 0,
432 	},
433 
434 	{   0x131f, 0x2040, 0xffff, 0,
435 	    "SIIG Cyber 2P1S PCI 16C550 (20x family)",
436 	    DEFAULT_RCLK,
437 	    PUC_PORT_1S2P, 0x10, -1, 0,
438 	    .config_function = puc_config_siig
439 	},
440 
441 	{   0x131f, 0x2041, 0xffff, 0,
442 	    "SIIG Cyber 2P1S PCI 16C650 (20x family)",
443 	    DEFAULT_RCLK,
444 	    PUC_PORT_1S2P, 0x10, -1, 0,
445 	    .config_function = puc_config_siig
446 	},
447 
448 	{   0x131f, 0x2042, 0xffff, 0,
449 	    "SIIG Cyber 2P1S PCI 16C850 (20x family)",
450 	    DEFAULT_RCLK,
451 	    PUC_PORT_1S2P, 0x10, -1, 0,
452 	    .config_function = puc_config_siig
453 	},
454 
455 	{   0x131f, 0x2050, 0xffff, 0,
456 	    "SIIG Cyber 4S PCI 16C550 (20x family)",
457 	    DEFAULT_RCLK,
458 	    PUC_PORT_4S, 0x10, 4, 0,
459 	},
460 
461 	{   0x131f, 0x2051, 0xffff, 0,
462 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
463 	    DEFAULT_RCLK,
464 	    PUC_PORT_4S, 0x10, 4, 0,
465 	},
466 
467 	{   0x131f, 0x2052, 0xffff, 0,
468 	    "SIIG Cyber 4S PCI 16C850 (20x family)",
469 	    DEFAULT_RCLK,
470 	    PUC_PORT_4S, 0x10, 4, 0,
471 	},
472 
473 	{   0x131f, 0x2060, 0xffff, 0,
474 	    "SIIG Cyber 2S1P PCI 16C550 (20x family)",
475 	    DEFAULT_RCLK,
476 	    PUC_PORT_2S1P, 0x10, 4, 0,
477 	},
478 
479 	{   0x131f, 0x2061, 0xffff, 0,
480 	    "SIIG Cyber 2S1P PCI 16C650 (20x family)",
481 	    DEFAULT_RCLK,
482 	    PUC_PORT_2S1P, 0x10, 4, 0,
483 	},
484 
485 	{   0x131f, 0x2062, 0xffff, 0,
486 	    "SIIG Cyber 2S1P PCI 16C850 (20x family)",
487 	    DEFAULT_RCLK,
488 	    PUC_PORT_2S1P, 0x10, 4, 0,
489 	},
490 
491 	{   0x131f, 0x2081, 0xffff, 0,
492 	    "SIIG PS8000 8S PCI 16C650 (20x family)",
493 	    DEFAULT_RCLK,
494 	    PUC_PORT_8S, 0x10, -1, -1,
495 	    .config_function = puc_config_siig
496 	},
497 
498 	{   0x135c, 0x0010, 0xffff, 0,
499 	    "Quatech QSC-100",
500 	    -3,	/* max 8x clock rate */
501 	    PUC_PORT_4S, 0x14, 0, 8,
502 	    .config_function = puc_config_quatech
503 	},
504 
505 	{   0x135c, 0x0020, 0xffff, 0,
506 	    "Quatech DSC-100",
507 	    -1, /* max 2x clock rate */
508 	    PUC_PORT_2S, 0x14, 0, 8,
509 	    .config_function = puc_config_quatech
510 	},
511 
512 	{   0x135c, 0x0030, 0xffff, 0,
513 	    "Quatech DSC-200/300",
514 	    -1, /* max 2x clock rate */
515 	    PUC_PORT_2S, 0x14, 0, 8,
516 	    .config_function = puc_config_quatech
517 	},
518 
519 	{   0x135c, 0x0040, 0xffff, 0,
520 	    "Quatech QSC-200/300",
521 	    -3, /* max 8x clock rate */
522 	    PUC_PORT_4S, 0x14, 0, 8,
523 	    .config_function = puc_config_quatech
524 	},
525 
526 	{   0x135c, 0x0050, 0xffff, 0,
527 	    "Quatech ESC-100D",
528 	    -3, /* max 8x clock rate */
529 	    PUC_PORT_8S, 0x14, 0, 8,
530 	    .config_function = puc_config_quatech
531 	},
532 
533 	{   0x135c, 0x0060, 0xffff, 0,
534 	    "Quatech ESC-100M",
535 	    -3, /* max 8x clock rate */
536 	    PUC_PORT_8S, 0x14, 0, 8,
537 	    .config_function = puc_config_quatech
538 	},
539 
540 	{   0x135c, 0x0170, 0xffff, 0,
541 	    "Quatech QSCLP-100",
542 	    -1, /* max 2x clock rate */
543 	    PUC_PORT_4S, 0x18, 0, 8,
544 	    .config_function = puc_config_quatech
545 	},
546 
547 	{   0x135c, 0x0180, 0xffff, 0,
548 	    "Quatech DSCLP-100",
549 	    -1, /* max 3x clock rate */
550 	    PUC_PORT_2S, 0x18, 0, 8,
551 	    .config_function = puc_config_quatech
552 	},
553 
554 	{   0x135c, 0x01b0, 0xffff, 0,
555 	    "Quatech DSCLP-200/300",
556 	    -1, /* max 2x clock rate */
557 	    PUC_PORT_2S, 0x18, 0, 8,
558 	    .config_function = puc_config_quatech
559 	},
560 
561 	{   0x135c, 0x01e0, 0xffff, 0,
562 	    "Quatech ESCLP-100",
563 	    -3, /* max 8x clock rate */
564 	    PUC_PORT_8S, 0x10, 0, 8,
565 	    .config_function = puc_config_quatech
566 	},
567 
568 	{   0x1393, 0x1024, 0xffff, 0,
569 	    "Moxa Technologies, Smartio CP-102E/PCIe",
570 	    DEFAULT_RCLK * 8,
571 	    PUC_PORT_2S, 0x14, 0, -1,
572 	    .config_function = puc_config_moxa
573 	},
574 
575 	{   0x1393, 0x1025, 0xffff, 0,
576 	    "Moxa Technologies, Smartio CP-102EL/PCIe",
577 	    DEFAULT_RCLK * 8,
578 	    PUC_PORT_2S, 0x14, 0, -1,
579 	    .config_function = puc_config_moxa
580 	},
581 
582 	{   0x1393, 0x1040, 0xffff, 0,
583 	    "Moxa Technologies, Smartio C104H/PCI",
584 	    DEFAULT_RCLK * 8,
585 	    PUC_PORT_4S, 0x18, 0, 8,
586 	},
587 
588 	{   0x1393, 0x1041, 0xffff, 0,
589 	    "Moxa Technologies, Smartio CP-104UL/PCI",
590 	    DEFAULT_RCLK * 8,
591 	    PUC_PORT_4S, 0x18, 0, 8,
592 	},
593 
594 	{   0x1393, 0x1042, 0xffff, 0,
595 	    "Moxa Technologies, Smartio CP-104JU/PCI",
596 	    DEFAULT_RCLK * 8,
597 	    PUC_PORT_4S, 0x18, 0, 8,
598 	},
599 
600 	{   0x1393, 0x1043, 0xffff, 0,
601 	    "Moxa Technologies, Smartio CP-104EL/PCIe",
602 	    DEFAULT_RCLK * 8,
603 	    PUC_PORT_4S, 0x18, 0, 8,
604 	},
605 
606 	{   0x1393, 0x1045, 0xffff, 0,
607 	    "Moxa Technologies, Smartio CP-104EL-A/PCIe",
608 	    DEFAULT_RCLK * 8,
609 	    PUC_PORT_4S, 0x14, 0, -1,
610 	    .config_function = puc_config_moxa
611 	},
612 
613 	{   0x1393, 0x1120, 0xffff, 0,
614 	    "Moxa Technologies, CP-112UL",
615 	    DEFAULT_RCLK * 8,
616 	    PUC_PORT_2S, 0x18, 0, 8,
617 	},
618 
619 	{   0x1393, 0x1141, 0xffff, 0,
620 	    "Moxa Technologies, Industio CP-114",
621 	    DEFAULT_RCLK * 8,
622 	    PUC_PORT_4S, 0x18, 0, 8,
623 	},
624 
625 	{   0x1393, 0x1144, 0xffff, 0,
626 	    "Moxa Technologies, Smartio CP-114EL/PCIe",
627 	    DEFAULT_RCLK * 8,
628 	    PUC_PORT_4S, 0x14, 0, -1,
629 	    .config_function = puc_config_moxa
630 	},
631 
632 	{   0x1393, 0x1182, 0xffff, 0,
633 	    "Moxa Technologies, Smartio CP-118EL-A/PCIe",
634 	    DEFAULT_RCLK * 8,
635 	    PUC_PORT_8S, 0x14, 0, -1,
636 	    .config_function = puc_config_moxa
637 	},
638 
639 	{   0x1393, 0x1680, 0xffff, 0,
640 	    "Moxa Technologies, C168H/PCI",
641 	    DEFAULT_RCLK * 8,
642 	    PUC_PORT_8S, 0x18, 0, 8,
643 	},
644 
645 	{   0x1393, 0x1681, 0xffff, 0,
646 	    "Moxa Technologies, C168U/PCI",
647 	    DEFAULT_RCLK * 8,
648 	    PUC_PORT_8S, 0x18, 0, 8,
649 	},
650 
651 	{   0x1393, 0x1682, 0xffff, 0,
652 	    "Moxa Technologies, CP-168EL/PCIe",
653 	    DEFAULT_RCLK * 8,
654 	    PUC_PORT_8S, 0x18, 0, 8,
655 	},
656 
657 	{   0x1393, 0x1683, 0xffff, 0,
658 	    "Moxa Technologies, Smartio CP-168EL-A/PCIe",
659 	    DEFAULT_RCLK * 8,
660 	    PUC_PORT_8S, 0x14, 0, -1,
661 	    .config_function = puc_config_moxa
662 	},
663 
664 	{   0x13a8, 0x0152, 0xffff, 0,
665 	    "Exar XR17C/D152",
666 	    DEFAULT_RCLK * 8,
667 	    PUC_PORT_2S, 0x10, 0, -1,
668 	    .config_function = puc_config_exar
669 	},
670 
671 	{   0x13a8, 0x0154, 0xffff, 0,
672 	    "Exar XR17C154",
673 	    DEFAULT_RCLK * 8,
674 	    PUC_PORT_4S, 0x10, 0, -1,
675 	    .config_function = puc_config_exar
676 	},
677 
678 	{   0x13a8, 0x0158, 0xffff, 0,
679 	    "Exar XR17C158",
680 	    DEFAULT_RCLK * 8,
681 	    PUC_PORT_8S, 0x10, 0, -1,
682 	    .config_function = puc_config_exar
683 	},
684 
685 	{   0x13a8, 0x0258, 0xffff, 0,
686 	    "Exar XR17V258IV",
687 	    DEFAULT_RCLK * 8,
688 	    PUC_PORT_8S, 0x10, 0, -1,
689 	    .config_function = puc_config_exar
690 	},
691 
692 	/* The XR17V358 uses the 125MHz PCIe clock as its reference clock. */
693 	{   0x13a8, 0x0358, 0xffff, 0,
694 	    "Exar XR17V358",
695 	    125000000,
696 	    PUC_PORT_8S, 0x10, 0, -1,
697 	    .config_function = puc_config_exar_pcie
698 	},
699 
700 	/*
701 	 * The Advantech PCI-1602 Rev. A use the first two ports of an Oxford
702 	 * Semiconductor OXuPCI954.  Note these boards have a hardware bug in
703 	 * that they drive the RS-422/485 transmitters after power-on until a
704 	 * driver initalizes the UARTs.
705 	 */
706 	{   0x13fe, 0x1600, 0x1602, 0x0002,
707 	    "Advantech PCI-1602 Rev. A",
708 	    DEFAULT_RCLK * 8,
709 	    PUC_PORT_2S, 0x10, 0, 8,
710 	    .config_function = puc_config_advantech
711 	},
712 
713 	/* Advantech PCI-1602 Rev. B1/PCI-1603 are also based on OXuPCI952. */
714 	{   0x13fe, 0xa102, 0x13fe, 0xa102,
715 	    "Advantech 2-port PCI (PCI-1602 Rev. B1/PCI-1603)",
716 	    DEFAULT_RCLK * 8,
717 	    PUC_PORT_2S, 0x10, 4, 0,
718 	    .config_function = puc_config_advantech
719 	},
720 
721 	{   0x1407, 0x0100, 0xffff, 0,
722 	    "Lava Computers Dual Serial",
723 	    DEFAULT_RCLK,
724 	    PUC_PORT_2S, 0x10, 4, 0,
725 	},
726 
727 	{   0x1407, 0x0101, 0xffff, 0,
728 	    "Lava Computers Quatro A",
729 	    DEFAULT_RCLK,
730 	    PUC_PORT_2S, 0x10, 4, 0,
731 	},
732 
733 	{   0x1407, 0x0102, 0xffff, 0,
734 	    "Lava Computers Quatro B",
735 	    DEFAULT_RCLK,
736 	    PUC_PORT_2S, 0x10, 4, 0,
737 	},
738 
739 	{   0x1407, 0x0120, 0xffff, 0,
740 	    "Lava Computers Quattro-PCI A",
741 	    DEFAULT_RCLK,
742 	    PUC_PORT_2S, 0x10, 4, 0,
743 	},
744 
745 	{   0x1407, 0x0121, 0xffff, 0,
746 	    "Lava Computers Quattro-PCI B",
747 	    DEFAULT_RCLK,
748 	    PUC_PORT_2S, 0x10, 4, 0,
749 	},
750 
751 	{   0x1407, 0x0180, 0xffff, 0,
752 	    "Lava Computers Octo A",
753 	    DEFAULT_RCLK,
754 	    PUC_PORT_4S, 0x10, 4, 0,
755 	},
756 
757 	{   0x1407, 0x0181, 0xffff, 0,
758 	    "Lava Computers Octo B",
759 	    DEFAULT_RCLK,
760 	    PUC_PORT_4S, 0x10, 4, 0,
761 	},
762 
763 	{   0x1409, 0x7268, 0xffff, 0,
764 	    "Sunix SUN1888",
765 	    0,
766 	    PUC_PORT_2P, 0x10, 0, 8,
767 	},
768 
769 	{   0x1409, 0x7168, 0xffff, 0,
770 	    NULL,
771 	    DEFAULT_RCLK * 8,
772 	    PUC_PORT_NONSTANDARD, 0x10, -1, -1,
773 	    .config_function = puc_config_timedia
774 	},
775 
776 	/*
777 	 * Boards with an Oxford Semiconductor chip.
778 	 *
779 	 * Oxford Semiconductor provides documentation for their chip at:
780 	 * <URL:http://www.plxtech.com/products/uart/>
781 	 *
782 	 * As sold by Kouwell <URL:http://www.kouwell.com/>.
783 	 * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports.
784 	 */
785 	{
786 	    0x1415, 0x9501, 0x10fc, 0xc070,
787 	    "I-O DATA RSA-PCI2/R",
788 	    DEFAULT_RCLK * 8,
789 	    PUC_PORT_2S, 0x10, 0, 8,
790 	},
791 
792 	{   0x1415, 0x9501, 0x131f, 0x2050,
793 	    "SIIG Cyber 4 PCI 16550",
794 	    DEFAULT_RCLK * 10,
795 	    PUC_PORT_4S, 0x10, 0, 8,
796 	},
797 
798 	{   0x1415, 0x9501, 0x131f, 0x2051,
799 	    "SIIG Cyber 4S PCI 16C650 (20x family)",
800 	    DEFAULT_RCLK * 10,
801 	    PUC_PORT_4S, 0x10, 0, 8,
802 	},
803 
804 	{   0x1415, 0x9501, 0x131f, 0x2052,
805 	    "SIIG Quartet Serial 850",
806 	    DEFAULT_RCLK * 10,
807 	    PUC_PORT_4S, 0x10, 0, 8,
808 	},
809 
810 	{   0x1415, 0x9501, 0x14db, 0x2150,
811 	    "Kuroutoshikou SERIAL4P-LPPCI2",
812 	    DEFAULT_RCLK * 10,
813 	    PUC_PORT_4S, 0x10, 0, 8,
814 	},
815 
816 	{   0x1415, 0x9501, 0xffff, 0,
817 	    "Oxford Semiconductor OX16PCI954 UARTs",
818 	    0,
819 	    PUC_PORT_4S, 0x10, 0, 8,
820 	    .config_function = puc_config_oxford_pci954
821 	},
822 
823 	{   0x1415, 0x950a, 0x131f, 0x2030,
824 	    "SIIG Cyber 2S PCIe",
825 	    DEFAULT_RCLK * 10,
826 	    PUC_PORT_2S, 0x10, 0, 8,
827 	},
828 
829 	{   0x1415, 0x950a, 0x131f, 0x2032,
830 	    "SIIG Cyber Serial Dual PCI 16C850",
831 	    DEFAULT_RCLK * 10,
832 	    PUC_PORT_4S, 0x10, 0, 8,
833 	},
834 
835 	{   0x1415, 0x950a, 0x131f, 0x2061,
836 	    "SIIG Cyber 2SP1 PCIe",
837 	    DEFAULT_RCLK * 10,
838 	    PUC_PORT_2S, 0x10, 0, 8,
839 	},
840 
841 	{   0x1415, 0x950a, 0xffff, 0,
842 	    "Oxford Semiconductor OX16PCI954 UARTs",
843 	    DEFAULT_RCLK,
844 	    PUC_PORT_4S, 0x10, 0, 8,
845 	},
846 
847 	{   0x1415, 0x9511, 0xffff, 0,
848 	    "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)",
849 	    DEFAULT_RCLK,
850 	    PUC_PORT_4S, 0x10, 0, 8,
851 	},
852 
853 	{   0x1415, 0x9521, 0xffff, 0,
854 	    "Oxford Semiconductor OX16PCI952 UARTs",
855 	    DEFAULT_RCLK,
856 	    PUC_PORT_2S, 0x10, 4, 0,
857 	},
858 
859 	{   0x1415, 0x9538, 0xffff, 0,
860 	    "Oxford Semiconductor OX16PCI958 UARTs",
861 	    DEFAULT_RCLK,
862 	    PUC_PORT_8S, 0x18, 0, 8,
863 	},
864 
865 	/*
866 	 * Perle boards use Oxford Semiconductor chips, but they store the
867 	 * Oxford Semiconductor device ID as a subvendor device ID and use
868 	 * their own device IDs.
869 	 */
870 
871 	{   0x155f, 0x0331, 0xffff, 0,
872 	    "Perle Ultraport4 Express",
873 	    DEFAULT_RCLK * 8,
874 	    PUC_PORT_4S, 0x10, 0, 8,
875 	},
876 
877 	{   0x155f, 0xB012, 0xffff, 0,
878 	    "Perle Speed2 LE",
879 	    DEFAULT_RCLK * 8,
880 	    PUC_PORT_2S, 0x10, 0, 8,
881 	},
882 
883 	{   0x155f, 0xB022, 0xffff, 0,
884 	    "Perle Speed2 LE",
885 	    DEFAULT_RCLK * 8,
886 	    PUC_PORT_2S, 0x10, 0, 8,
887 	},
888 
889 	{   0x155f, 0xB004, 0xffff, 0,
890 	    "Perle Speed4 LE",
891 	    DEFAULT_RCLK * 8,
892 	    PUC_PORT_4S, 0x10, 0, 8,
893 	},
894 
895 	{   0x155f, 0xB008, 0xffff, 0,
896 	    "Perle Speed8 LE",
897 	    DEFAULT_RCLK * 8,
898 	    PUC_PORT_8S, 0x10, 0, 8,
899 	},
900 
901 
902 	/*
903 	 * Oxford Semiconductor PCI Express Expresso family
904 	 *
905 	 * Found in many 'native' PCI Express serial boards such as:
906 	 *
907 	 * eMegatech MP954ER4 (4 port) and MP958ER8 (8 port)
908 	 * <URL:http://www.emegatech.com.tw/pdrs232pcie.html>
909 	 *
910 	 * Lindy 51189 (4 port)
911 	 * <URL:http://www.lindy.com> <URL:http://tinyurl.com/lindy-51189>
912 	 *
913 	 * StarTech.com PEX4S952 (4 port) and PEX8S952 (8 port)
914 	 * <URL:http://www.startech.com>
915 	 */
916 
917 	{   0x1415, 0xc11b, 0xffff, 0,
918 	    "Oxford Semiconductor OXPCIe952 1S1P",
919 	    DEFAULT_RCLK * 0x22,
920 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
921 	    .config_function = puc_config_oxford_pcie
922 	},
923 
924 	{   0x1415, 0xc138, 0xffff, 0,
925 	    "Oxford Semiconductor OXPCIe952 UARTs",
926 	    DEFAULT_RCLK * 0x22,
927 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
928 	    .config_function = puc_config_oxford_pcie
929 	},
930 
931 	{   0x1415, 0xc158, 0xffff, 0,
932 	    "Oxford Semiconductor OXPCIe952 UARTs",
933 	    DEFAULT_RCLK * 0x22,
934 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
935 	    .config_function = puc_config_oxford_pcie
936 	},
937 
938 	{   0x1415, 0xc15d, 0xffff, 0,
939 	    "Oxford Semiconductor OXPCIe952 UARTs (function 1)",
940 	    DEFAULT_RCLK * 0x22,
941 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
942 	    .config_function = puc_config_oxford_pcie
943 	},
944 
945 	{   0x1415, 0xc208, 0xffff, 0,
946 	    "Oxford Semiconductor OXPCIe954 UARTs",
947 	    DEFAULT_RCLK * 0x22,
948 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
949 	    .config_function = puc_config_oxford_pcie
950 	},
951 
952 	{   0x1415, 0xc20d, 0xffff, 0,
953 	    "Oxford Semiconductor OXPCIe954 UARTs (function 1)",
954 	    DEFAULT_RCLK * 0x22,
955 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
956 	    .config_function = puc_config_oxford_pcie
957 	},
958 
959 	{   0x1415, 0xc308, 0xffff, 0,
960 	    "Oxford Semiconductor OXPCIe958 UARTs",
961 	    DEFAULT_RCLK * 0x22,
962 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
963 	    .config_function = puc_config_oxford_pcie
964 	},
965 
966 	{   0x1415, 0xc30d, 0xffff, 0,
967 	    "Oxford Semiconductor OXPCIe958 UARTs (function 1)",
968 	    DEFAULT_RCLK * 0x22,
969 	    PUC_PORT_NONSTANDARD, 0x10, 0, -1,
970 	    .config_function = puc_config_oxford_pcie
971 	},
972 
973 	{   0x14d2, 0x8010, 0xffff, 0,
974 	    "VScom PCI-100L",
975 	    DEFAULT_RCLK * 8,
976 	    PUC_PORT_1S, 0x14, 0, 0,
977 	},
978 
979 	{   0x14d2, 0x8020, 0xffff, 0,
980 	    "VScom PCI-200L",
981 	    DEFAULT_RCLK * 8,
982 	    PUC_PORT_2S, 0x14, 4, 0,
983 	},
984 
985 	{   0x14d2, 0x8028, 0xffff, 0,
986 	    "VScom 200Li",
987 	    DEFAULT_RCLK,
988 	    PUC_PORT_2S, 0x20, 0, 8,
989 	},
990 
991 	/*
992 	 * VScom (Titan?) PCI-800L.  More modern variant of the
993 	 * PCI-800.  Uses 6 discrete 16550 UARTs, plus another
994 	 * two of them obviously implemented as macro cells in
995 	 * the ASIC.  This causes the weird port access pattern
996 	 * below, where two of the IO port ranges each access
997 	 * one of the ASIC UARTs, and a block of IO addresses
998 	 * access the external UARTs.
999 	 */
1000 	{   0x14d2, 0x8080, 0xffff, 0,
1001 	    "Titan VScom PCI-800L",
1002 	    DEFAULT_RCLK * 8,
1003 	    PUC_PORT_8S, 0x14, -1, -1,
1004 	    .config_function = puc_config_titan
1005 	},
1006 
1007 	/*
1008 	 * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers
1009 	 * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has
1010 	 * device ID 3 and PCI device 1 device ID 4.
1011 	 */
1012 	{   0x14d2, 0xa003, 0xffff, 0,
1013 	    "Titan PCI-800H",
1014 	    DEFAULT_RCLK * 8,
1015 	    PUC_PORT_4S, 0x10, 0, 8,
1016 	},
1017 
1018 	{   0x14d2, 0xa004, 0xffff, 0,
1019 	    "Titan PCI-800H",
1020 	    DEFAULT_RCLK * 8,
1021 	    PUC_PORT_4S, 0x10, 0, 8,
1022 	},
1023 
1024 	{   0x14d2, 0xa005, 0xffff, 0,
1025 	    "Titan PCI-200H",
1026 	    DEFAULT_RCLK * 8,
1027 	    PUC_PORT_2S, 0x10, 0, 8,
1028 	},
1029 
1030 	{   0x14d2, 0xe020, 0xffff, 0,
1031 	    "Titan VScom PCI-200HV2",
1032 	    DEFAULT_RCLK * 8,
1033 	    PUC_PORT_2S, 0x10, 4, 0,
1034 	},
1035 
1036 	{   0x14d2, 0xa007, 0xffff, 0,
1037 	    "Titan VScom PCIex-800H",
1038 	    DEFAULT_RCLK * 8,
1039 	    PUC_PORT_4S, 0x10, 0, 8,
1040 	},
1041 
1042 	{   0x14d2, 0xa008, 0xffff, 0,
1043 	    "Titan VScom PCIex-800H",
1044 	    DEFAULT_RCLK * 8,
1045 	    PUC_PORT_4S, 0x10, 0, 8,
1046 	},
1047 
1048 	{   0x14db, 0x2130, 0xffff, 0,
1049 	    "Avlab Technology, PCI IO 2S",
1050 	    DEFAULT_RCLK,
1051 	    PUC_PORT_2S, 0x10, 4, 0,
1052 	},
1053 
1054 	{   0x14db, 0x2150, 0xffff, 0,
1055 	    "Avlab Low Profile PCI 4 Serial",
1056 	    DEFAULT_RCLK,
1057 	    PUC_PORT_4S, 0x10, 4, 0,
1058 	},
1059 
1060 	{   0x14db, 0x2152, 0xffff, 0,
1061 	    "Avlab Low Profile PCI 4 Serial",
1062 	    DEFAULT_RCLK,
1063 	    PUC_PORT_4S, 0x10, 4, 0,
1064 	},
1065 
1066 	{   0x1592, 0x0781, 0xffff, 0,
1067 	    "Syba Tech Ltd. PCI-4S2P-550-ECP",
1068 	    DEFAULT_RCLK,
1069 	    PUC_PORT_4S1P, 0x10, 0, -1,
1070 	    .config_function = puc_config_syba
1071 	},
1072 
1073 	{   0x1fd4, 0x1999, 0x1fd4, 0x0002,
1074 	    "Sunix SER5xxxx 2-port serial",
1075 	    DEFAULT_RCLK * 8,
1076 	    PUC_PORT_2S, 0x10, 0, 8,
1077 	},
1078 
1079 	{   0x1fd4, 0x1999, 0x1fd4, 0x0004,
1080 	    "Sunix SER5xxxx 4-port serial",
1081 	    DEFAULT_RCLK * 8,
1082 	    PUC_PORT_4S, 0x10, 0, 8,
1083 	},
1084 
1085 	{   0x1fd4, 0x1999, 0x1fd4, 0x0008,
1086 	    "Sunix SER5xxxx 8-port serial",
1087 	    DEFAULT_RCLK * 8,
1088 	    PUC_PORT_8S, -1, -1, -1,
1089 	    .config_function = puc_config_sunix
1090 	},
1091 
1092 	{   0x1fd4, 0x1999, 0x1fd4, 0x0101,
1093 	    "Sunix MIO5xxxx 1-port serial and 1284 Printer port",
1094 	    DEFAULT_RCLK * 8,
1095 	    PUC_PORT_1S1P, -1, -1, -1,
1096 	    .config_function = puc_config_sunix
1097 	},
1098 
1099 	{   0x1fd4, 0x1999, 0x1fd4, 0x0102,
1100 	    "Sunix MIO5xxxx 2-port serial and 1284 Printer port",
1101 	    DEFAULT_RCLK * 8,
1102 	    PUC_PORT_2S1P, -1, -1, -1,
1103 	    .config_function = puc_config_sunix
1104 	},
1105 
1106 	{   0x1fd4, 0x1999, 0x1fd4, 0x0104,
1107 	    "Sunix MIO5xxxx 4-port serial and 1284 Printer port",
1108 	    DEFAULT_RCLK * 8,
1109 	    PUC_PORT_4S1P, -1, -1, -1,
1110 	    .config_function = puc_config_sunix
1111 	},
1112 
1113 	{   0x5372, 0x6872, 0xffff, 0,
1114 	    "Feasso PCI FPP-02 2S1P",
1115 	    DEFAULT_RCLK,
1116 	    PUC_PORT_2S1P, 0x10, 4, 0,
1117 	},
1118 
1119 	{   0x5372, 0x6873, 0xffff, 0,
1120 	    "Sun 1040 PCI Quad Serial",
1121 	    DEFAULT_RCLK,
1122 	    PUC_PORT_4S, 0x10, 4, 0,
1123 	},
1124 
1125 	{   0x6666, 0x0001, 0xffff, 0,
1126 	    "Decision Computer Inc, PCCOM 4-port serial",
1127 	    DEFAULT_RCLK,
1128 	    PUC_PORT_4S, 0x1c, 0, 8,
1129 	},
1130 
1131 	{   0x6666, 0x0002, 0xffff, 0,
1132 	    "Decision Computer Inc, PCCOM 8-port serial",
1133 	    DEFAULT_RCLK,
1134 	    PUC_PORT_8S, 0x1c, 0, 8,
1135 	},
1136 
1137 	{   0x6666, 0x0004, 0xffff, 0,
1138 	    "PCCOM dual port RS232/422/485",
1139 	    DEFAULT_RCLK,
1140 	    PUC_PORT_2S, 0x1c, 0, 8,
1141 	},
1142 
1143 	{   0x9710, 0x9815, 0xffff, 0,
1144 	    "NetMos NM9815 Dual 1284 Printer port",
1145 	    0,
1146 	    PUC_PORT_2P, 0x10, 8, 0,
1147 	},
1148 
1149 	/*
1150 	 * This is more specific than the generic NM9835 entry, and is placed
1151 	 * here to _prevent_ puc(4) from claiming this single port card.
1152 	 *
1153 	 * uart(4) will claim this device.
1154 	 */
1155 	{   0x9710, 0x9835, 0x1000, 1,
1156 	    "NetMos NM9835 based 1-port serial",
1157 	    DEFAULT_RCLK,
1158 	    PUC_PORT_1S, 0x10, 4, 0,
1159 	},
1160 
1161 	{   0x9710, 0x9835, 0x1000, 2,
1162 	    "NetMos NM9835 based 2-port serial",
1163 	    DEFAULT_RCLK,
1164 	    PUC_PORT_2S, 0x10, 4, 0,
1165 	},
1166 
1167 	{   0x9710, 0x9835, 0xffff, 0,
1168 	    "NetMos NM9835 Dual UART and 1284 Printer port",
1169 	    DEFAULT_RCLK,
1170 	    PUC_PORT_2S1P, 0x10, 4, 0,
1171 	},
1172 
1173 	{   0x9710, 0x9845, 0x1000, 0x0006,
1174 	    "NetMos NM9845 6 Port UART",
1175 	    DEFAULT_RCLK,
1176 	    PUC_PORT_6S, 0x10, 4, 0,
1177 	},
1178 
1179 	{   0x9710, 0x9845, 0xffff, 0,
1180 	    "NetMos NM9845 Quad UART and 1284 Printer port",
1181 	    DEFAULT_RCLK,
1182 	    PUC_PORT_4S1P, 0x10, 4, 0,
1183 	},
1184 
1185 	{   0x9710, 0x9865, 0xa000, 0x3002,
1186 	    "NetMos NM9865 Dual UART",
1187 	    DEFAULT_RCLK,
1188 	    PUC_PORT_2S, 0x10, 4, 0,
1189 	},
1190 
1191 	{   0x9710, 0x9865, 0xa000, 0x3003,
1192 	    "NetMos NM9865 Triple UART",
1193 	    DEFAULT_RCLK,
1194 	    PUC_PORT_3S, 0x10, 4, 0,
1195 	},
1196 
1197 	{   0x9710, 0x9865, 0xa000, 0x3004,
1198 	    "NetMos NM9865 Quad UART",
1199 	    DEFAULT_RCLK,
1200 	    PUC_PORT_4S, 0x10, 4, 0,
1201 	},
1202 
1203 	{   0x9710, 0x9865, 0xa000, 0x3011,
1204 	    "NetMos NM9865 Single UART and 1284 Printer port",
1205 	    DEFAULT_RCLK,
1206 	    PUC_PORT_1S1P, 0x10, 4, 0,
1207 	},
1208 
1209 	{   0x9710, 0x9865, 0xa000, 0x3012,
1210 	    "NetMos NM9865 Dual UART and 1284 Printer port",
1211 	    DEFAULT_RCLK,
1212 	    PUC_PORT_2S1P, 0x10, 4, 0,
1213 	},
1214 
1215 	{   0x9710, 0x9865, 0xa000, 0x3020,
1216 	    "NetMos NM9865 Dual 1284 Printer port",
1217 	    DEFAULT_RCLK,
1218 	    PUC_PORT_2P, 0x10, 4, 0,
1219 	},
1220 
1221 	{   0xb00c, 0x021c, 0xffff, 0,
1222 	    "IC Book Labs Gunboat x4 Lite",
1223 	    DEFAULT_RCLK,
1224 	    PUC_PORT_4S, 0x10, 0, 8,
1225 	    .config_function = puc_config_icbook
1226 	},
1227 
1228 	{   0xb00c, 0x031c, 0xffff, 0,
1229 	    "IC Book Labs Gunboat x4 Pro",
1230 	    DEFAULT_RCLK,
1231 	    PUC_PORT_4S, 0x10, 0, 8,
1232 	    .config_function = puc_config_icbook
1233 	},
1234 
1235 	{   0xb00c, 0x041c, 0xffff, 0,
1236 	    "IC Book Labs Ironclad x8 Lite",
1237 	    DEFAULT_RCLK,
1238 	    PUC_PORT_8S, 0x10, 0, 8,
1239 	    .config_function = puc_config_icbook
1240 	},
1241 
1242 	{   0xb00c, 0x051c, 0xffff, 0,
1243 	    "IC Book Labs Ironclad x8 Pro",
1244 	    DEFAULT_RCLK,
1245 	    PUC_PORT_8S, 0x10, 0, 8,
1246 	    .config_function = puc_config_icbook
1247 	},
1248 
1249 	{   0xb00c, 0x081c, 0xffff, 0,
1250 	    "IC Book Labs Dreadnought x16 Pro",
1251 	    DEFAULT_RCLK * 8,
1252 	    PUC_PORT_16S, 0x10, 0, 8,
1253 	    .config_function = puc_config_icbook
1254 	},
1255 
1256 	{   0xb00c, 0x091c, 0xffff, 0,
1257 	    "IC Book Labs Dreadnought x16 Lite",
1258 	    DEFAULT_RCLK,
1259 	    PUC_PORT_16S, 0x10, 0, 8,
1260 	    .config_function = puc_config_icbook
1261 	},
1262 
1263 	{   0xb00c, 0x0a1c, 0xffff, 0,
1264 	    "IC Book Labs Gunboat x2 Low Profile",
1265 	    DEFAULT_RCLK,
1266 	    PUC_PORT_2S, 0x10, 0, 8,
1267 	},
1268 
1269 	{   0xb00c, 0x0b1c, 0xffff, 0,
1270 	    "IC Book Labs Gunboat x4 Low Profile",
1271 	    DEFAULT_RCLK,
1272 	    PUC_PORT_4S, 0x10, 0, 8,
1273 	    .config_function = puc_config_icbook
1274 	},
1275 
1276 	{ 0xffff, 0, 0xffff, 0, NULL, 0 }
1277 };
1278 
1279 static int
1280 puc_config_advantech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
1281     intptr_t *res __unused)
1282 {
1283 	const struct puc_cfg *cfg;
1284 	struct resource *cres;
1285 	struct puc_bar *bar;
1286 	device_t cdev, dev;
1287 	bus_size_t off;
1288 	int base, crtype, fixed, high, i, oxpcie;
1289 	uint8_t acr, func, mask;
1290 
1291 	if (cmd != PUC_CFG_SETUP)
1292 		return (ENXIO);
1293 
1294 	base = fixed = oxpcie = 0;
1295 	crtype = SYS_RES_IOPORT;
1296 	acr = mask = 0x0;
1297 	func = high = 1;
1298 	off = 0x60;
1299 
1300 	cfg = sc->sc_cfg;
1301 	switch (cfg->subvendor) {
1302 	case 0x13fe:
1303 		switch (cfg->device) {
1304 		case 0xa102:
1305 			high = 0;
1306 			break;
1307 		default:
1308 			break;
1309 		}
1310 	default:
1311 		break;
1312 	}
1313 	if (fixed == 1)
1314 		goto setup;
1315 
1316 	dev = sc->sc_dev;
1317 	cdev = pci_find_dbsf(pci_get_domain(dev), pci_get_bus(dev),
1318 	    pci_get_slot(dev), func);
1319 	if (cdev == NULL) {
1320 		device_printf(dev, "could not find config function\n");
1321 		return (ENXIO);
1322 	}
1323 
1324 	i = PCIR_BAR(0);
1325 	cres = bus_alloc_resource_any(cdev, crtype, &i, RF_ACTIVE);
1326 	if (cres == NULL) {
1327 		device_printf(dev, "could not allocate config resource\n");
1328 		return (ENXIO);
1329 	}
1330 
1331 	if (oxpcie == 0) {
1332 		mask = bus_read_1(cres, off);
1333 		if (pci_get_function(dev) == 1)
1334 			base = 4;
1335 	}
1336 
1337  setup:
1338 	for (i = 0; i < sc->sc_nports; ++i) {
1339 		device_printf(dev, "port %d: ", i);
1340 		bar = puc_get_bar(sc, cfg->rid + i * cfg->d_rid);
1341 		if (bar == NULL) {
1342 			printf("could not get BAR\n");
1343 			continue;
1344 		}
1345 
1346 		if (fixed == 0) {
1347 			if ((mask & (1 << (base + i))) == 0) {
1348 				acr = 0;
1349 				printf("RS-232\n");
1350 			} else {
1351 				acr = (high == 1 ? 0x18 : 0x10);
1352 				printf("RS-422/RS-485, active-%s auto-DTR\n",
1353 				    high == 1 ? "high" : "low");
1354 			}
1355 		}
1356 
1357 		bus_write_1(bar->b_res, REG_SPR, REG_ACR);
1358 		bus_write_1(bar->b_res, REG_ICR, acr);
1359 	}
1360 
1361 	bus_release_resource(cdev, crtype, rman_get_rid(cres), cres);
1362 	return (0);
1363 }
1364 
1365 static int
1366 puc_config_amc(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd, int port,
1367     intptr_t *res)
1368 {
1369 
1370 	switch (cmd) {
1371 	case PUC_CFG_GET_OFS:
1372 		*res = 8 * (port & 1);
1373 		return (0);
1374 	case PUC_CFG_GET_RID:
1375 		*res = 0x14 + (port >> 1) * 4;
1376 		return (0);
1377 	default:
1378 		break;
1379 	}
1380 	return (ENXIO);
1381 }
1382 
1383 static int
1384 puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
1385     intptr_t *res)
1386 {
1387 	const struct puc_cfg *cfg = sc->sc_cfg;
1388 
1389 	if (cmd == PUC_CFG_GET_OFS) {
1390 		if (cfg->subdevice == 0x1282)		/* Everest SP */
1391 			port <<= 1;
1392 		else if (cfg->subdevice == 0x104b)	/* Maestro SP2 */
1393 			port = (port == 3) ? 4 : port;
1394 		*res = port * 8 + ((port > 2) ? 0x18 : 0);
1395 		return (0);
1396 	}
1397 	return (ENXIO);
1398 }
1399 
1400 static int
1401 puc_config_exar(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1402     int port, intptr_t *res)
1403 {
1404 
1405 	if (cmd == PUC_CFG_GET_OFS) {
1406 		*res = port * 0x200;
1407 		return (0);
1408 	}
1409 	return (ENXIO);
1410 }
1411 
1412 static int
1413 puc_config_exar_pcie(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1414     int port, intptr_t *res)
1415 {
1416 
1417 	if (cmd == PUC_CFG_GET_OFS) {
1418 		*res = port * 0x400;
1419 		return (0);
1420 	}
1421 	return (ENXIO);
1422 }
1423 
1424 static int
1425 puc_config_icbook(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1426     int port __unused, intptr_t *res)
1427 {
1428 
1429 	if (cmd == PUC_CFG_GET_ILR) {
1430 		*res = PUC_ILR_DIGI;
1431 		return (0);
1432 	}
1433 	return (ENXIO);
1434 }
1435 
1436 static int
1437 puc_config_moxa(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
1438     intptr_t *res)
1439 {
1440 	const struct puc_cfg *cfg = sc->sc_cfg;
1441 
1442 	if (cmd == PUC_CFG_GET_OFS) {
1443 		if (port == 3 && (cfg->device == 0x1045 ||
1444 		    cfg->device == 0x1144))
1445 			port = 7;
1446 		*res = port * 0x200;
1447 
1448 		return 0;
1449 	}
1450 	return (ENXIO);
1451 }
1452 
1453 static int
1454 puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd,
1455     int port __unused, intptr_t *res)
1456 {
1457 	const struct puc_cfg *cfg = sc->sc_cfg;
1458 	struct puc_bar *bar;
1459 	uint8_t v0, v1;
1460 
1461 	switch (cmd) {
1462 	case PUC_CFG_SETUP:
1463 		/*
1464 		 * Check if the scratchpad register is enabled or if the
1465 		 * interrupt status and options registers are active.
1466 		 */
1467 		bar = puc_get_bar(sc, cfg->rid);
1468 		if (bar == NULL)
1469 			return (ENXIO);
1470 		bus_write_1(bar->b_res, REG_LCR, LCR_DLAB);
1471 		bus_write_1(bar->b_res, REG_SPR, 0);
1472 		v0 = bus_read_1(bar->b_res, REG_SPR);
1473 		bus_write_1(bar->b_res, REG_SPR, 0x80 + -cfg->clock);
1474 		v1 = bus_read_1(bar->b_res, REG_SPR);
1475 		bus_write_1(bar->b_res, REG_LCR, 0);
1476 		sc->sc_cfg_data = (v0 << 8) | v1;
1477 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
1478 			/*
1479 			 * The SPR register echoed the two values written
1480 			 * by us.  This means that the SPAD jumper is set.
1481 			 */
1482 			device_printf(sc->sc_dev, "warning: extra features "
1483 			    "not usable -- SPAD compatibility enabled\n");
1484 			return (0);
1485 		}
1486 		if (v0 != 0) {
1487 			/*
1488 			 * The first value doesn't match.  This can only mean
1489 			 * that the SPAD jumper is not set and that a non-
1490 			 * standard fixed clock multiplier jumper is set.
1491 			 */
1492 			if (bootverbose)
1493 				device_printf(sc->sc_dev, "fixed clock rate "
1494 				    "multiplier of %d\n", 1 << v0);
1495 			if (v0 < -cfg->clock)
1496 				device_printf(sc->sc_dev, "warning: "
1497 				    "suboptimal fixed clock rate multiplier "
1498 				    "setting\n");
1499 			return (0);
1500 		}
1501 		/*
1502 		 * The first value matched, but the second didn't.  We know
1503 		 * that the SPAD jumper is not set.  We also know that the
1504 		 * clock rate multiplier is software controlled *and* that
1505 		 * we just programmed it to the maximum allowed.
1506 		 */
1507 		if (bootverbose)
1508 			device_printf(sc->sc_dev, "clock rate multiplier of "
1509 			    "%d selected\n", 1 << -cfg->clock);
1510 		return (0);
1511 	case PUC_CFG_GET_CLOCK:
1512 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
1513 		v1 = sc->sc_cfg_data & 0xff;
1514 		if (v0 == 0 && v1 == 0x80 + -cfg->clock) {
1515 			/*
1516 			 * XXX With the SPAD jumper applied, there's no
1517 			 * easy way of knowing if there's also a clock
1518 			 * rate multiplier jumper installed.  Let's hope
1519 			 * not ...
1520 			 */
1521 			*res = DEFAULT_RCLK;
1522 		} else if (v0 == 0) {
1523 			/*
1524 			 * No clock rate multiplier jumper installed,
1525 			 * so we programmed the board with the maximum
1526 			 * multiplier allowed as given to us in the
1527 			 * clock field of the config record (negated).
1528 			 */
1529 			*res = DEFAULT_RCLK << -cfg->clock;
1530 		} else
1531 			*res = DEFAULT_RCLK << v0;
1532 		return (0);
1533 	case PUC_CFG_GET_ILR:
1534 		v0 = (sc->sc_cfg_data >> 8) & 0xff;
1535 		v1 = sc->sc_cfg_data & 0xff;
1536 		*res = (v0 == 0 && v1 == 0x80 + -cfg->clock) ?
1537 		    PUC_ILR_NONE : PUC_ILR_QUATECH;
1538 		return (0);
1539 	default:
1540 		break;
1541 	}
1542 	return (ENXIO);
1543 }
1544 
1545 static int
1546 puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
1547     intptr_t *res)
1548 {
1549 	static int base[] = { 0x251, 0x3f0, 0 };
1550 	const struct puc_cfg *cfg = sc->sc_cfg;
1551 	struct puc_bar *bar;
1552 	int efir, idx, ofs;
1553 	uint8_t v;
1554 
1555 	switch (cmd) {
1556 	case PUC_CFG_SETUP:
1557 		bar = puc_get_bar(sc, cfg->rid);
1558 		if (bar == NULL)
1559 			return (ENXIO);
1560 
1561 		/* configure both W83877TFs */
1562 		bus_write_1(bar->b_res, 0x250, 0x89);
1563 		bus_write_1(bar->b_res, 0x3f0, 0x87);
1564 		bus_write_1(bar->b_res, 0x3f0, 0x87);
1565 		idx = 0;
1566 		while (base[idx] != 0) {
1567 			efir = base[idx];
1568 			bus_write_1(bar->b_res, efir, 0x09);
1569 			v = bus_read_1(bar->b_res, efir + 1);
1570 			if ((v & 0x0f) != 0x0c)
1571 				return (ENXIO);
1572 			bus_write_1(bar->b_res, efir, 0x16);
1573 			v = bus_read_1(bar->b_res, efir + 1);
1574 			bus_write_1(bar->b_res, efir, 0x16);
1575 			bus_write_1(bar->b_res, efir + 1, v | 0x04);
1576 			bus_write_1(bar->b_res, efir, 0x16);
1577 			bus_write_1(bar->b_res, efir + 1, v & ~0x04);
1578 			ofs = base[idx] & 0x300;
1579 			bus_write_1(bar->b_res, efir, 0x23);
1580 			bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2);
1581 			bus_write_1(bar->b_res, efir, 0x24);
1582 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2);
1583 			bus_write_1(bar->b_res, efir, 0x25);
1584 			bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2);
1585 			bus_write_1(bar->b_res, efir, 0x17);
1586 			bus_write_1(bar->b_res, efir + 1, 0x03);
1587 			bus_write_1(bar->b_res, efir, 0x28);
1588 			bus_write_1(bar->b_res, efir + 1, 0x43);
1589 			idx++;
1590 		}
1591 		bus_write_1(bar->b_res, 0x250, 0xaa);
1592 		bus_write_1(bar->b_res, 0x3f0, 0xaa);
1593 		return (0);
1594 	case PUC_CFG_GET_OFS:
1595 		switch (port) {
1596 		case 0:
1597 			*res = 0x2f8;
1598 			return (0);
1599 		case 1:
1600 			*res = 0x2e8;
1601 			return (0);
1602 		case 2:
1603 			*res = 0x3f8;
1604 			return (0);
1605 		case 3:
1606 			*res = 0x3e8;
1607 			return (0);
1608 		case 4:
1609 			*res = 0x278;
1610 			return (0);
1611 		}
1612 		break;
1613 	default:
1614 		break;
1615 	}
1616 	return (ENXIO);
1617 }
1618 
1619 static int
1620 puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
1621     intptr_t *res)
1622 {
1623 	const struct puc_cfg *cfg = sc->sc_cfg;
1624 
1625 	switch (cmd) {
1626 	case PUC_CFG_GET_OFS:
1627 		if (cfg->ports == PUC_PORT_8S) {
1628 			*res = (port > 4) ? 8 * (port - 4) : 0;
1629 			return (0);
1630 		}
1631 		break;
1632 	case PUC_CFG_GET_RID:
1633 		if (cfg->ports == PUC_PORT_8S) {
1634 			*res = 0x10 + ((port > 4) ? 0x10 : 4 * port);
1635 			return (0);
1636 		}
1637 		if (cfg->ports == PUC_PORT_2S1P) {
1638 			switch (port) {
1639 			case 0: *res = 0x10; return (0);
1640 			case 1: *res = 0x14; return (0);
1641 			case 2: *res = 0x1c; return (0);
1642 			}
1643 		}
1644 		break;
1645 	default:
1646 		break;
1647 	}
1648 	return (ENXIO);
1649 }
1650 
1651 static int
1652 puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
1653     intptr_t *res)
1654 {
1655 	static const uint16_t dual[] = {
1656 	    0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085,
1657 	    0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079,
1658 	    0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079,
1659 	    0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079,
1660 	    0xD079, 0
1661 	};
1662 	static const uint16_t quad[] = {
1663 	    0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157,
1664 	    0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159,
1665 	    0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056,
1666 	    0xB157, 0
1667 	};
1668 	static const uint16_t octa[] = {
1669 	    0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166,
1670 	    0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0
1671 	};
1672 	static const struct {
1673 		int ports;
1674 		const uint16_t *ids;
1675 	} subdevs[] = {
1676 	    { 2, dual },
1677 	    { 4, quad },
1678 	    { 8, octa },
1679 	    { 0, NULL }
1680 	};
1681 	static char desc[64];
1682 	int dev, id;
1683 	uint16_t subdev;
1684 
1685 	switch (cmd) {
1686 	case PUC_CFG_GET_CLOCK:
1687 		if (port < 2)
1688 			*res = DEFAULT_RCLK * 8;
1689 		else
1690 			*res = DEFAULT_RCLK;
1691 		return (0);
1692 	case PUC_CFG_GET_DESC:
1693 		snprintf(desc, sizeof(desc),
1694 		    "Timedia technology %d Port Serial", (int)sc->sc_cfg_data);
1695 		*res = (intptr_t)desc;
1696 		return (0);
1697 	case PUC_CFG_GET_NPORTS:
1698 		subdev = pci_get_subdevice(sc->sc_dev);
1699 		dev = 0;
1700 		while (subdevs[dev].ports != 0) {
1701 			id = 0;
1702 			while (subdevs[dev].ids[id] != 0) {
1703 				if (subdev == subdevs[dev].ids[id]) {
1704 					sc->sc_cfg_data = subdevs[dev].ports;
1705 					*res = sc->sc_cfg_data;
1706 					return (0);
1707 				}
1708 				id++;
1709 			}
1710 			dev++;
1711 		}
1712 		return (ENXIO);
1713 	case PUC_CFG_GET_OFS:
1714 		*res = (port == 1 || port == 3) ? 8 : 0;
1715 		return (0);
1716 	case PUC_CFG_GET_RID:
1717 		*res = 0x10 + ((port > 3) ? port - 2 : port >> 1) * 4;
1718 		return (0);
1719 	case PUC_CFG_GET_TYPE:
1720 		*res = PUC_TYPE_SERIAL;
1721 		return (0);
1722 	default:
1723 		break;
1724 	}
1725 	return (ENXIO);
1726 }
1727 
1728 static int
1729 puc_config_oxford_pci954(struct puc_softc *sc, enum puc_cfg_cmd cmd,
1730     int port __unused, intptr_t *res)
1731 {
1732 
1733 	switch (cmd) {
1734 	case PUC_CFG_GET_CLOCK:
1735 		/*
1736 		 * OXu16PCI954 use a 14.7456 MHz clock by default while
1737 		 * OX16PCI954 and OXm16PCI954 employ a 1.8432 MHz one.
1738 		 */
1739 		if (pci_get_revid(sc->sc_dev) == 1)
1740 			*res = DEFAULT_RCLK * 8;
1741 		else
1742 			*res = DEFAULT_RCLK;
1743 		return (0);
1744 	default:
1745 		break;
1746 	}
1747 	return (ENXIO);
1748 }
1749 
1750 static int
1751 puc_config_oxford_pcie(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
1752     intptr_t *res)
1753 {
1754 	const struct puc_cfg *cfg = sc->sc_cfg;
1755 	int idx;
1756 	struct puc_bar *bar;
1757 	uint8_t value;
1758 
1759 	switch (cmd) {
1760 	case PUC_CFG_SETUP:
1761 		device_printf(sc->sc_dev, "%d UARTs detected\n",
1762 			sc->sc_nports);
1763 
1764 		/* Set UARTs to enhanced mode */
1765 		bar = puc_get_bar(sc, cfg->rid);
1766 		if (bar == NULL)
1767 			return (ENXIO);
1768 		for (idx = 0; idx < sc->sc_nports; idx++) {
1769 			value = bus_read_1(bar->b_res, 0x1000 + (idx << 9) +
1770 			    0x92);
1771 			bus_write_1(bar->b_res, 0x1000 + (idx << 9) + 0x92,
1772 			    value | 0x10);
1773 		}
1774 		return (0);
1775 	case PUC_CFG_GET_LEN:
1776 		*res = 0x200;
1777 		return (0);
1778 	case PUC_CFG_GET_NPORTS:
1779 		/*
1780 		 * Check if we are being called from puc_bfe_attach()
1781 		 * or puc_bfe_probe().  If puc_bfe_probe(), we cannot
1782 		 * puc_get_bar(), so we return a value of 16.  This has
1783 		 * cosmetic side-effects at worst; in PUC_CFG_GET_DESC,
1784 		 * sc->sc_cfg_data will not contain the true number of
1785 		 * ports in PUC_CFG_GET_DESC, but we are not implementing
1786 		 * that call for this device family anyway.
1787 		 *
1788 		 * The check is for initialization of sc->sc_bar[idx],
1789 		 * which is only done in puc_bfe_attach().
1790 		 */
1791 		idx = 0;
1792 		do {
1793 			if (sc->sc_bar[idx++].b_rid != -1) {
1794 				sc->sc_cfg_data = 16;
1795 				*res = sc->sc_cfg_data;
1796 				return (0);
1797 			}
1798 		} while (idx < PUC_PCI_BARS);
1799 
1800 		bar = puc_get_bar(sc, cfg->rid);
1801 		if (bar == NULL)
1802 			return (ENXIO);
1803 
1804 		value = bus_read_1(bar->b_res, 0x04);
1805 		if (value == 0)
1806 			return (ENXIO);
1807 
1808 		sc->sc_cfg_data = value;
1809 		*res = sc->sc_cfg_data;
1810 		return (0);
1811 	case PUC_CFG_GET_OFS:
1812 		*res = 0x1000 + (port << 9);
1813 		return (0);
1814 	case PUC_CFG_GET_TYPE:
1815 		*res = PUC_TYPE_SERIAL;
1816 		return (0);
1817 	default:
1818 		break;
1819 	}
1820 	return (ENXIO);
1821 }
1822 
1823 static int
1824 puc_config_sunix(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port,
1825     intptr_t *res)
1826 {
1827 	int error;
1828 
1829 	switch (cmd) {
1830 	case PUC_CFG_GET_OFS:
1831 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
1832 		if (error != 0)
1833 			return (error);
1834 		*res = (*res == PUC_TYPE_SERIAL) ? (port & 3) * 8 : 0;
1835 		return (0);
1836 	case PUC_CFG_GET_RID:
1837 		error = puc_config(sc, PUC_CFG_GET_TYPE, port, res);
1838 		if (error != 0)
1839 			return (error);
1840 		*res = (*res == PUC_TYPE_SERIAL && port <= 3) ? 0x10 : 0x14;
1841 		return (0);
1842 	default:
1843 		break;
1844 	}
1845 	return (ENXIO);
1846 }
1847 
1848 static int
1849 puc_config_titan(struct puc_softc *sc __unused, enum puc_cfg_cmd cmd,
1850     int port, intptr_t *res)
1851 {
1852 
1853 	switch (cmd) {
1854 	case PUC_CFG_GET_OFS:
1855 		*res = (port < 3) ? 0 : (port - 2) << 3;
1856 		return (0);
1857 	case PUC_CFG_GET_RID:
1858 		*res = 0x14 + ((port >= 2) ? 0x0c : port << 2);
1859 		return (0);
1860 	default:
1861 		break;
1862 	}
1863 	return (ENXIO);
1864 }
1865