diff options
author | marcel <marcel@FreeBSD.org> | 2006-04-28 21:21:53 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2006-04-28 21:21:53 +0000 |
commit | 193a6144b9612bafde9b4382a221e917496b8601 (patch) | |
tree | 5e43b7350101e478e59289d09768df4e1a830e0d /sys/dev/puc/pucdata.c | |
parent | ca65c8d400f4a855b84394629b8695274cf7bfb4 (diff) | |
download | FreeBSD-src-193a6144b9612bafde9b4382a221e917496b8601.zip FreeBSD-src-193a6144b9612bafde9b4382a221e917496b8601.tar.gz |
Rewrite of puc(4). Significant changes are:
o Properly use rman(9) to manage resources. This eliminates the
need to puc-specific hacks to rman. It also allows devinfo(8)
to be used to find out the specific assignment of resources to
serial/parallel ports.
o Compress the PCI device "database" by optimizing for the common
case and to use a procedural interface to handle the exceptions.
The procedural interface also generalizes the need to setup the
hardware (program chipsets, program clock frequencies).
o Eliminate the need for PUC_FASTINTR. Serdev devices are fast by
default and non-serdev devices are handled by the bus.
o Use the serdev I/F to collect interrupt status and to handle
interrupts across ports in priority order.
o Sync the PCI device configuration to include devices found in
NetBSD and not yet merged to FreeBSD.
o Add support for Quatech 2, 4 and 8 port UARTs.
o Add support for a couple dozen Timedia serial cards as found
in Linux.
Diffstat (limited to 'sys/dev/puc/pucdata.c')
-rw-r--r-- | sys/dev/puc/pucdata.c | 2225 |
1 files changed, 1035 insertions, 1190 deletions
diff --git a/sys/dev/puc/pucdata.c b/sys/dev/puc/pucdata.c index ff4c230..a1d1d4d 100644 --- a/sys/dev/puc/pucdata.c +++ b/sys/dev/puc/pucdata.c @@ -1,22 +1,16 @@ -/* $NetBSD: pucdata.c,v 1.25 2001/12/16 22:23:01 thorpej Exp $ */ - /*- - * Copyright (c) 1998, 1999 Christopher G. Demetriou. All rights reserved. + * Copyright (c) 2006 Marcel Moolenaar + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Christopher G. Demetriou - * for the NetBSD Project. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -39,801 +33,550 @@ __FBSDID("$FreeBSD$"); */ #include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/bus.h> + +#include <machine/resource.h> +#include <sys/rman.h> -#include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> -#include <dev/sio/sioreg.h> -#include <dev/puc/pucvar.h> - -#define COM_FREQ DEFAULT_RCLK - -int puc_config_win877(struct puc_softc *); - -const struct puc_device_description puc_devices[] = { - - { "Sunix SUN1889", - { 0x0009, 0x7168, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 8 }, - }, - }, - - { "Diva Serial [GSP] Multiport UART", - { 0x103c, 0x1048, 0x103c, 0x1282 }, - { 0xffff, 0xffff, 0xffff, 0xffff }, - { - { PUC_PORT_TYPE_UART, 0x10, 0x00, 0, PUC_FLAGS_MEMORY }, - { PUC_PORT_TYPE_UART, 0x10, 0x10, 0, PUC_FLAGS_MEMORY }, - { PUC_PORT_TYPE_UART, 0x10, 0x38, 0, PUC_FLAGS_MEMORY }, - }, - }, - - { "Comtrol RocketPort 550/4 RJ45", - { 0x11fe, 0x8014, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - }, - }, - - { "Comtrol RocketPort 550/Quad", - { 0x11fe, 0x8015, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - }, - }, - - { "Comtrol RocketPort 550/8 RJ11 part A", - { 0x11fe, 0x8010, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - }, - }, - { "Comtrol RocketPort 550/8 RJ11 part B", - { 0x11fe, 0x8011, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - }, - }, - - { "Comtrol RocketPort 550/8 Octa part A", - { 0x11fe, 0x8012, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - }, - }, - { "Comtrol RocketPort 550/8 Octa part B", - { 0x11fe, 0x8013, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - }, - }, - - { "Comtrol RocketPort 550/8 part A", - { 0x11fe, 0x8018, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - }, - }, - { "Comtrol RocketPort 550/8 part B", - { 0x11fe, 0x8019, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - }, - }, - - { "Comtrol RocketPort 550/16 part A", - { 0x11fe, 0x8016, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - }, - }, - { "Comtrol RocketPort 550/16 part B", - { 0x11fe, 0x8017, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x20, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x28, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x30, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x38, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x40, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x48, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x50, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x10, 0x58, COM_FREQ * 4 }, - }, + +#include <dev/puc/puc_bfe.h> +#include <dev/puc/puc_bus.h> +#include <dev/puc/puc_cfg.h> + +static puc_config_f puc_config_amc; +static puc_config_f puc_config_cronyx; +static puc_config_f puc_config_diva; +static puc_config_f puc_config_icbook; +static puc_config_f puc_config_quatech; +static puc_config_f puc_config_syba; +static puc_config_f puc_config_siig; +static puc_config_f puc_config_timedia; +static puc_config_f puc_config_titan; + +const struct puc_cfg puc_pci_devices[] = { + + { 0x0009, 0x7168, 0xffff, 0, + "Sunix SUN1889", + DEFAULT_RCLK * 8, + PUC_PORT_2S, 0x10, 0, 8, + }, + + { 0x103c, 0x1048, 0x103c, 0x1049, + "HP Diva Serial [GSP] Multiport UART - Tosca Console", + DEFAULT_RCLK, + PUC_PORT_3S, 0x10, 0, -1, + .config_function = puc_config_diva + }, + + { 0x103c, 0x1048, 0x103c, 0x104a, + "HP Diva Serial [GSP] Multiport UART - Tosca Secondary", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 0, -1, + .config_function = puc_config_diva + }, + + { 0x103c, 0x1048, 0x103c, 0x104b, + "HP Diva Serial [GSP] Multiport UART - Maestro SP2", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 0, -1, + .config_function = puc_config_diva + }, + + { 0x103c, 0x1048, 0x103c, 0x1223, + "HP Diva Serial [GSP] Multiport UART - Superdome Console", + DEFAULT_RCLK, + PUC_PORT_3S, 0x10, 0, -1, + .config_function = puc_config_diva + }, + + { 0x103c, 0x1048, 0x103c, 0x1226, + "HP Diva Serial [GSP] Multiport UART - Keystone SP2", + DEFAULT_RCLK, + PUC_PORT_3S, 0x10, 0, -1, + .config_function = puc_config_diva + }, + + { 0x103c, 0x1048, 0x103c, 0x1282, + "HP Diva Serial [GSP] Multiport UART - Everest SP2", + DEFAULT_RCLK, + PUC_PORT_3S, 0x10, 0, -1, + .config_function = puc_config_diva + }, + + { 0x10b5, 0x1076, 0x10b5, 0x1076, + "VScom PCI-800", + DEFAULT_RCLK * 8, + PUC_PORT_8S, 0x18, 0, 8, + }, + + { 0x10b5, 0x1077, 0x10b5, 0x1077, + "VScom PCI-400", + DEFAULT_RCLK * 8, + PUC_PORT_4S, 0x18, 0, 8, + }, + + { 0x10b5, 0x1103, 0x10b5, 0x1103, + "VScom PCI-200", + DEFAULT_RCLK * 8, + PUC_PORT_2S, 0x18, 4, 0, }, /* - * XXX no entry because I have no data: - * XXX Dolphin Peripherals 4006 (single parallel) + * Boca Research Turbo Serial 658 (8 serial port) card. + * Appears to be the same as Chase Research PLC PCI-FAST8 + * and Perle PCI-FAST8 Multi-Port serial cards. */ + { 0x10b5, 0x9050, 0x12e0, 0x0021, + "Boca Research Turbo Serial 658", + DEFAULT_RCLK * 4, + PUC_PORT_8S, 0x18, 0, 8, + }, + + { 0x10b5, 0x9050, 0x12e0, 0x0031, + "Boca Research Turbo Serial 654", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x18, 0, 8, + }, /* - * Dolphin Peripherals 4014 (dual parallel port) card. PLX 9050, with + * Dolphin Peripherals 4035 (dual serial port) card. PLX 9050, with * a seemingly-lame EEPROM setup that puts the Dolphin IDs * into the subsystem fields, and claims that it's a * network/misc (0x02/0x80) device. */ - { "Dolphin Peripherals 4014", - { 0x10b5, 0x9050, 0xd84d, 0x6810 }, - { 0xffff, 0xffff, 0xffff, 0xffff }, - { - { PUC_PORT_TYPE_LPT, 0x20, 0x00, 0x00 }, - { PUC_PORT_TYPE_LPT, 0x24, 0x00, 0x00 }, - }, + { 0x10b5, 0x9050, 0xd84d, 0x6808, + "Dolphin Peripherals 4035", + DEFAULT_RCLK, + PUC_PORT_2S, 0x18, 4, 0, }, /* - * XXX Dolphin Peripherals 4025 (single serial) - * (clashes with Dolphin Peripherals 4036 (2s variant) - */ - - /* - * Dolphin Peripherals 4035 (dual serial port) card. PLX 9050, with + * Dolphin Peripherals 4014 (dual parallel port) card. PLX 9050, with * a seemingly-lame EEPROM setup that puts the Dolphin IDs * into the subsystem fields, and claims that it's a * network/misc (0x02/0x80) device. */ - { "Dolphin Peripherals 4035", - { 0x10b5, 0x9050, 0xd84d, 0x6808 }, - { 0xffff, 0xffff, 0xffff, 0xffff }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, + { 0x10b5, 0x9050, 0xd84d, 0x6810, + "Dolphin Peripherals 4014", + 0, + PUC_PORT_2P, 0x20, 4, 0, }, - /* - * Dolphin Peripherals 4036 (dual serial port) card. - * (Dolpin 4025 has the same ID but only one port) - */ - { "Dolphin Peripherals 4036", - { 0x1409, 0x7168, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 8 }, - }, + { 0x10e8, 0x818e, 0xffff, 0, + "Applied Micro Circuits 8 Port UART", + DEFAULT_RCLK, + PUC_PORT_8S, 0x14, -1, -1, + .config_function = puc_config_amc + }, + + { 0x11fe, 0x8010, 0xffff, 0, + "Comtrol RocketPort 550/8 RJ11 part A", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x10, 0, 8, }, - /* - * XXX no entry because I have no data: - * XXX Dolphin Peripherals 4078 (dual serial and single parallel) - */ + { 0x11fe, 0x8011, 0xffff, 0, + "Comtrol RocketPort 550/8 RJ11 part B", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x10, 0, 8, + }, + + { 0x11fe, 0x8012, 0xffff, 0, + "Comtrol RocketPort 550/8 Octa part A", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x10, 0, 8, + }, + { 0x11fe, 0x8013, 0xffff, 0, + "Comtrol RocketPort 550/8 Octa part B", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x10, 0, 8, + }, + + { 0x11fe, 0x8014, 0xffff, 0, + "Comtrol RocketPort 550/4 RJ45", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x10, 0, 8, + }, + + { 0x11fe, 0x8015, 0xffff, 0, + "Comtrol RocketPort 550/Quad", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x10, 0, 8, + }, + + { 0x11fe, 0x8016, 0xffff, 0, + "Comtrol RocketPort 550/16 part A", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x10, 0, 8, + }, + + { 0x11fe, 0x8017, 0xffff, 0, + "Comtrol RocketPort 550/16 part B", + DEFAULT_RCLK * 4, + PUC_PORT_12S, 0x10, 0, 8, + }, + + { 0x11fe, 0x8018, 0xffff, 0, + "Comtrol RocketPort 550/8 part A", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x10, 0, 8, + }, + + { 0x11fe, 0x8019, 0xffff, 0, + "Comtrol RocketPort 550/8 part B", + DEFAULT_RCLK * 4, + PUC_PORT_4S, 0x10, 0, 8, + }, /* * SIIG Boards. * * SIIG provides documentation for their boards at: - * <URL:http://www.siig.com/driver.htm> - * - * Please excuse the weird ordering, it's the order they - * use in their documentation. + * <URL:http://www.siig.com/downloads.asp> */ - /* - * SIIG "10x" family boards. - */ + { 0x131f, 0x1010, 0xffff, 0, + "SIIG Cyber I/O PCI 16C550 (10x family)", + DEFAULT_RCLK, + PUC_PORT_1S1P, 0x18, 4, 0, + }, - /* SIIG Cyber Serial PCI 16C550 (10x family): 1S */ - { "SIIG Cyber Serial PCI 16C550 (10x family)", - { 0x131f, 0x1000, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber Serial PCI 16C650 (10x family): 1S */ - { "SIIG Cyber Serial PCI 16C650 (10x family)", - { 0x131f, 0x1001, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber Serial PCI 16C850 (10x family): 1S */ - { "SIIG Cyber Serial PCI 16C850 (10x family)", - { 0x131f, 0x1002, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber I/O PCI 16C550 (10x family): 1S, 1P */ - { "SIIG Cyber I/O PCI 16C550 (10x family)", - { 0x131f, 0x1010, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x1c, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber I/O PCI 16C650 (10x family): 1S, 1P */ - { "SIIG Cyber I/O PCI 16C650 (10x family)", - { 0x131f, 0x1011, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x1c, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber I/O PCI 16C850 (10x family): 1S, 1P */ - { "SIIG Cyber I/O PCI 16C850 (10x family)", - { 0x131f, 0x1012, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x1c, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber Parallel PCI (10x family): 1P */ - { "SIIG Cyber Parallel PCI (10x family)", - { 0x131f, 0x1020, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_LPT, 0x18, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber Parallel Dual PCI (10x family): 2P */ - { "SIIG Cyber Parallel Dual PCI (10x family)", - { 0x131f, 0x1021, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_LPT, 0x18, 0x00, 0x00 }, - { PUC_PORT_TYPE_LPT, 0x20, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber Serial Dual PCI 16C550 (10x family): 2S */ - { "SIIG Cyber Serial Dual PCI 16C550 (10x family)", - { 0x131f, 0x1030, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber Serial Dual PCI 16C650 (10x family): 2S */ - { "SIIG Cyber Serial Dual PCI 16C650 (10x family)", - { 0x131f, 0x1031, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber Serial Dual PCI 16C850 (10x family): 2S */ - { "SIIG Cyber Serial Dual PCI 16C850 (10x family)", - { 0x131f, 0x1032, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber 2S1P PCI 16C550 (10x family): 2S, 1P */ - { "SIIG Cyber 2S1P PCI 16C550 (10x family)", - { 0x131f, 0x1034, 0, 0 }, /* XXX really? */ - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x20, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber 2S1P PCI 16C650 (10x family): 2S, 1P */ - { "SIIG Cyber 2S1P PCI 16C650 (10x family)", - { 0x131f, 0x1035, 0, 0 }, /* XXX really? */ - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x20, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber 2S1P PCI 16C850 (10x family): 2S, 1P */ - { "SIIG Cyber 2S1P PCI 16C850 (10x family)", - { 0x131f, 0x1036, 0, 0 }, /* XXX really? */ - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x20, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber 4S PCI 16C550 (10x family): 4S */ - { "SIIG Cyber 4S PCI 16C550 (10x family)", - { 0x131f, 0x1050, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x20, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x24, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber 4S PCI 16C650 (10x family): 4S */ - { "SIIG Cyber 4S PCI 16C650 (10x family)", - { 0x131f, 0x1051, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x20, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x24, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber 4S PCI 16C850 (10x family): 4S */ - { "SIIG Cyber 4S PCI 16C850 (10x family)", - { 0x131f, 0x1052, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x20, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x24, 0x00, COM_FREQ }, - }, + { 0x131f, 0x1011, 0xffff, 0, + "SIIG Cyber I/O PCI 16C650 (10x family)", + DEFAULT_RCLK, + PUC_PORT_1S1P, 0x18, 4, 0, }, - /* - * SIIG "20x" family boards. - */ + { 0x131f, 0x1012, 0xffff, 0, + "SIIG Cyber I/O PCI 16C850 (10x family)", + DEFAULT_RCLK, + PUC_PORT_1S1P, 0x18, 4, 0, + }, - /* SIIG Cyber Parallel PCI (20x family): 1P */ - { "SIIG Cyber Parallel PCI (20x family)", - { 0x131f, 0x2020, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_LPT, 0x10, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber Parallel Dual PCI (20x family): 2P */ - { "SIIG Cyber Parallel Dual PCI (20x family)", - { 0x131f, 0x2021, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_LPT, 0x10, 0x00, 0x00 }, - { PUC_PORT_TYPE_LPT, 0x18, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber 2P1S PCI 16C550 (20x family): 1S, 2P */ - { "SIIG Cyber 2P1S PCI 16C550 (20x family)", - { 0x131f, 0x2040, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x14, 0x00, 0x00 }, - { PUC_PORT_TYPE_LPT, 0x1c, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber 2P1S PCI 16C650 (20x family): 1S, 2P */ - { "SIIG Cyber 2P1S PCI 16C650 (20x family)", - { 0x131f, 0x2041, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x14, 0x00, 0x00 }, - { PUC_PORT_TYPE_LPT, 0x1c, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber 2P1S PCI 16C850 (20x family): 1S, 2P */ - { "SIIG Cyber 2P1S PCI 16C850 (20x family)", - { 0x131f, 0x2042, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x14, 0x00, 0x00 }, - { PUC_PORT_TYPE_LPT, 0x1c, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber Serial PCI 16C550 (20x family): 1S */ - { "SIIG Cyber Serial PCI 16C550 (20x family)", - { 0x131f, 0x2000, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber Serial PCI 16C650 (20x family): 1S */ - { "SIIG Cyber Serial PCI 16C650 (20x family)", - { 0x131f, 0x2001, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber Serial PCI 16C850 (20x family): 1S */ - { "SIIG Cyber Serial PCI 16C850 (20x family)", - { 0x131f, 0x2002, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber I/O PCI 16C550 (20x family): 1S, 1P */ - { "SIIG Cyber I/O PCI 16C550 (20x family)", - { 0x131f, 0x2010, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x14, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber I/O PCI 16C650 (20x family): 1S, 1P */ - { "SIIG Cyber I/O PCI 16C650 (20x family)", - { 0x131f, 0x2011, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x14, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber I/O PCI 16C850 (20x family): 1S, 1P */ - { "SIIG Cyber I/O PCI 16C850 (20x family)", - { 0x131f, 0x2012, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x14, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber Serial Dual PCI 16C550 (20x family): 2S */ - { "SIIG Cyber Serial Dual PCI 16C550 (20x family)", - { 0x131f, 0x2030, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber Serial Dual PCI 16C650 (20x family): 2S */ - { "SIIG Cyber Serial Dual PCI 16C650 (20x family)", - { 0x131f, 0x2031, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber Serial Dual PCI 16C850 (20x family): 2S */ - { "SIIG Cyber Serial Dual PCI 16C850 (20x family)", - { 0x131f, 0x2032, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber 2S1P PCI 16C550 (20x family): 2S, 1P */ - { "SIIG Cyber 2S1P PCI 16C550 (20x family)", - { 0x131f, 0x2060, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x18, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber 2S1P PCI 16C650 (20x family): 2S, 1P */ - { "SIIG Cyber 2S1P PCI 16C650 (20x family)", - { 0x131f, 0x2061, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x18, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber 2S1P PCI 16C850 (20x family): 2S, 1P */ - { "SIIG Cyber 2S1P PCI 16C850 (20x family)", - { 0x131f, 0x2062, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x18, 0x00, 0x00 }, - }, - }, - - /* SIIG Cyber 4S PCI 16C550 (20x family): 4S */ - { "SIIG Cyber 4S PCI 16C550 (20x family)", - { 0x131f, 0x2050, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber 4S PCI 16C650 (20x family): 4S */ - { "SIIG Cyber 4S PCI 16C650 (20x family)", - { 0x131f, 0x2051, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, - }, - - /* SIIG Cyber 4S PCI 16C850 (20x family): 4S */ - { "SIIG Cyber 4S PCI 16C850 (20x family)", - { 0x131f, 0x2052, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, - }, - - /* VScom PCI-200L: 2S */ - { "VScom PCI-200L", - { 0x14d2, 0x8020, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 8 }, - }, - }, - - /* VScom PCI-400: 4S */ - { "VScom PCI-400", - { 0x10b5, 0x1077, 0x10b5, 0x1077 }, - { 0xffff, 0xffff, 0xffff, 0xffff }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x18, COM_FREQ * 8 }, - }, - }, - - /* VScom PCI-800: 8S */ - { "VScom PCI-800", - { 0x10b5, 0x1076, 0x10b5, 0x1076 }, - { 0xffff, 0xffff, 0xffff, 0xffff }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x18, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x20, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x28, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x30, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x38, COM_FREQ * 8 }, - }, + { 0x131f, 0x1021, 0xffff, 0, + "SIIG Cyber Parallel Dual PCI (10x family)", + 0, + PUC_PORT_2P, 0x18, 8, 0, }, - /* - * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers - * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has - * device ID 3 and PCI device 1 device ID 4. - */ - { "Titan PCI-800H", - { 0x14d2, 0xa003, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 8 }, - }, - }, - { "Titan PCI-800H", - { 0x14d2, 0xa004, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 8 }, - }, - }, - { "Titan PCI-200H", - { 0x14d2, 0xa005, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 8 }, - }, - }, - - { "Titan VScom PCI-200HV2", /* 2S */ - { 0x14d2, 0xe020, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ * 8 }, - }, + + { 0x131f, 0x1030, 0xffff, 0, + "SIIG Cyber Serial Dual PCI 16C550 (10x family)", + DEFAULT_RCLK, + PUC_PORT_2S, 0x18, 4, 0, }, - /* - * VScom (Titan?) PCI-800L. More modern variant of the - * PCI-800. Uses 6 discrete 16550 UARTs, plus another - * two of them obviously implemented as macro cells in - * the ASIC. This causes the weird port access pattern - * below, where two of the IO port ranges each access - * one of the ASIC UARTs, and a block of IO addresses - * access the external UARTs. - */ - { "Titan VScom PCI-800L", - { 0x14d2, 0x8080, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x20, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x20, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x20, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x20, 0x18, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x20, 0x20, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x20, 0x28, COM_FREQ * 8 }, - }, + + { 0x131f, 0x1031, 0xffff, 0, + "SIIG Cyber Serial Dual PCI 16C650 (10x family)", + DEFAULT_RCLK, + PUC_PORT_2S, 0x18, 4, 0, }, - /* - * NEC PK-UG-X001 K56flex PCI Modem card. - * Uses NEC MARTH bridge chip and Rockwell RCVDL56ACF/SP. - */ - { "NEC PK-UG-X001 K56flex PCI Modem", - { 0x1033, 0x0074, 0x1033, 0x8014 }, - { 0xffff, 0xffff, 0xffff, 0xffff }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - }, - }, - - /* NEC PK-UG-X008 */ - { "NEC PK-UG-X008", - { 0x1033, 0x007d, 0x1033, 0x8012 }, - { 0xffff, 0xffff, 0xffff, 0xffff }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - }, - }, - - /* Lava Computers 2SP-PCI */ - { "Lava Computers 2SP-PCI parallel port", - { 0x1407, 0x8000, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_LPT, 0x10, 0x00, 0x00 }, - }, - }, - - /* Lava Computers 2SP-PCI and Quattro-PCI serial ports */ - { "Lava Computers dual serial port", - { 0x1407, 0x0100, 0, 0 }, - { 0xffff, 0xfffc, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - }, - }, - - /* Lava Computers newer Quattro-PCI serial ports */ - { "Lava Computers Quattro-PCI serial port", - { 0x1407, 0x0120, 0, 0 }, - { 0xffff, 0xfffc, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - }, - }, - - /* Lava Computers DSerial PCI serial ports */ - { "Lava Computers serial port", - { 0x1407, 0x0110, 0, 0 }, - { 0xffff, 0xfffc, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - }, - }, - - /* Lava Computers Octopus-550 serial ports */ - { "Lava Computers Octopus-550 8-port serial", - { 0x1407, 0x0180, 0, 0 }, - { 0xffff, 0xfffc, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, - }, - - /* US Robotics (3Com) PCI Modems */ - { "US Robotics (3Com) 3CP5609 PCI 16550 Modem", - { 0x12b9, 0x1008, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - }, - }, - - /* Actiontec 56K PCI Master */ - { "Actiontec 56K PCI Master", - { 0x11c1, 0x0480, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - }, + { 0x131f, 0x1032, 0xffff, 0, + "SIIG Cyber Serial Dual PCI 16C850 (10x family)", + DEFAULT_RCLK, + PUC_PORT_2S, 0x18, 4, 0, + }, + + { 0x131f, 0x1034, 0xffff, 0, /* XXX really? */ + "SIIG Cyber 2S1P PCI 16C550 (10x family)", + DEFAULT_RCLK, + PUC_PORT_2S1P, 0x18, 4, 0, + }, + + { 0x131f, 0x1035, 0xffff, 0, /* XXX really? */ + "SIIG Cyber 2S1P PCI 16C650 (10x family)", + DEFAULT_RCLK, + PUC_PORT_2S1P, 0x18, 4, 0, + }, + + { 0x131f, 0x1036, 0xffff, 0, /* XXX really? */ + "SIIG Cyber 2S1P PCI 16C850 (10x family)", + DEFAULT_RCLK, + PUC_PORT_2S1P, 0x18, 4, 0, + }, + + { 0x131f, 0x1050, 0xffff, 0, + "SIIG Cyber 4S PCI 16C550 (10x family)", + DEFAULT_RCLK, + PUC_PORT_4S, 0x18, 4, 0, + }, + + { 0x131f, 0x1051, 0xffff, 0, + "SIIG Cyber 4S PCI 16C650 (10x family)", + DEFAULT_RCLK, + PUC_PORT_4S, 0x18, 4, 0, + }, + + { 0x131f, 0x1052, 0xffff, 0, + "SIIG Cyber 4S PCI 16C850 (10x family)", + DEFAULT_RCLK, + PUC_PORT_4S, 0x18, 4, 0, + }, + + { 0x131f, 0x2010, 0xffff, 0, + "SIIG Cyber I/O PCI 16C550 (20x family)", + DEFAULT_RCLK, + PUC_PORT_1S1P, 0x10, 4, 0, + }, + + { 0x131f, 0x2011, 0xffff, 0, + "SIIG Cyber I/O PCI 16C650 (20x family)", + DEFAULT_RCLK, + PUC_PORT_1S1P, 0x10, 4, 0, + }, + + { 0x131f, 0x2012, 0xffff, 0, + "SIIG Cyber I/O PCI 16C850 (20x family)", + DEFAULT_RCLK, + PUC_PORT_1S1P, 0x10, 4, 0, + }, + + { 0x131f, 0x2021, 0xffff, 0, + "SIIG Cyber Parallel Dual PCI (20x family)", + 0, + PUC_PORT_2P, 0x10, 8, 0, + }, + + { 0x131f, 0x2030, 0xffff, 0, + "SIIG Cyber Serial Dual PCI 16C550 (20x family)", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x131f, 0x2031, 0xffff, 0, + "SIIG Cyber Serial Dual PCI 16C650 (20x family)", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x131f, 0x2032, 0xffff, 0, + "SIIG Cyber Serial Dual PCI 16C850 (20x family)", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x131f, 0x2040, 0xffff, 0, + "SIIG Cyber 2P1S PCI 16C550 (20x family)", + DEFAULT_RCLK, + PUC_PORT_1S2P, 0x10, -1, 0, + .config_function = puc_config_siig + }, + + { 0x131f, 0x2041, 0xffff, 0, + "SIIG Cyber 2P1S PCI 16C650 (20x family)", + DEFAULT_RCLK, + PUC_PORT_1S2P, 0x10, -1, 0, + .config_function = puc_config_siig + }, + + { 0x131f, 0x2042, 0xffff, 0, + "SIIG Cyber 2P1S PCI 16C850 (20x family)", + DEFAULT_RCLK, + PUC_PORT_1S2P, 0x10, -1, 0, + .config_function = puc_config_siig + }, + + { 0x131f, 0x2050, 0xffff, 0, + "SIIG Cyber 4S PCI 16C550 (20x family)", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 4, 0, + }, + + { 0x131f, 0x2051, 0xffff, 0, + "SIIG Cyber 4S PCI 16C650 (20x family)", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 4, 0, + }, + + { 0x131f, 0x2052, 0xffff, 0, + "SIIG Cyber 4S PCI 16C850 (20x family)", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 4, 0, + }, + + { 0x131f, 0x2060, 0xffff, 0, + "SIIG Cyber 2S1P PCI 16C550 (20x family)", + DEFAULT_RCLK, + PUC_PORT_2S1P, 0x10, 4, 0, + }, + + { 0x131f, 0x2061, 0xffff, 0, + "SIIG Cyber 2S1P PCI 16C650 (20x family)", + DEFAULT_RCLK, + PUC_PORT_2S1P, 0x10, 4, 0, + }, + + { 0x131f, 0x2062, 0xffff, 0, + "SIIG Cyber 2S1P PCI 16C850 (20x family)", + DEFAULT_RCLK, + PUC_PORT_2S1P, 0x10, 4, 0, + }, + + { 0x131f, 0x2081, 0xffff, 0, + "SIIG PS8000 8S PCI 16C650 (20x family)", + DEFAULT_RCLK, + PUC_PORT_8S, 0x10, -1, -1, + .config_function = puc_config_siig + }, + + { 0x135c, 0x0010, 0xffff, 0, + "Quatech QSC-100", + -3, /* max 8x clock rate */ + PUC_PORT_4S, 0x14, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x135c, 0x0020, 0xffff, 0, + "Quatech DSC-100", + -1, /* max 2x clock rate */ + PUC_PORT_2S, 0x14, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x135c, 0x0030, 0xffff, 0, + "Quatech DSC-200/300", + -1, /* max 2x clock rate */ + PUC_PORT_2S, 0x14, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x135c, 0x0040, 0xffff, 0, + "Quatech QSC-200/300", + -3, /* max 8x clock rate */ + PUC_PORT_4S, 0x14, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x135c, 0x0050, 0xffff, 0, + "Quatech ESC-100D", + -3, /* max 8x clock rate */ + PUC_PORT_8S, 0x14, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x135c, 0x0060, 0xffff, 0, + "Quatech ESC-100M", + -3, /* max 8x clock rate */ + PUC_PORT_8S, 0x14, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x135c, 0x0170, 0xffff, 0, + "Quatech QSCLP-100", + -1, /* max 2x clock rate */ + PUC_PORT_4S, 0x18, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x135c, 0x0180, 0xffff, 0, + "Quatech DSCLP-100", + -1, /* max 3x clock rate */ + PUC_PORT_2S, 0x18, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x135c, 0x01b0, 0xffff, 0, + "Quatech DSCLP-200/300", + -1, /* max 2x clock rate */ + PUC_PORT_2S, 0x18, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x135c, 0x01e0, 0xffff, 0, + "Quatech ESCLP-100", + -3, /* max 8x clock rate */ + PUC_PORT_8S, 0x10, 0, 8, + .config_function = puc_config_quatech + }, + + { 0x1393, 0x1040, 0xffff, 0, + "Moxa Technologies, Smartio C104H/PCI", + DEFAULT_RCLK * 8, + PUC_PORT_4S, 0x18, 0, 8, + }, + + { 0x1393, 0x1041, 0xffff, 0, + "Moxa Technologies, Smartio CP-104UL/PCI", + DEFAULT_RCLK * 8, + PUC_PORT_4S, 0x18, 0, 8, + }, + + { 0x1393, 0x1141, 0xffff, 0, + "Moxa Technologies, Industio CP-114", + DEFAULT_RCLK * 8, + PUC_PORT_4S, 0x18, 0, 8, + }, + + { 0x1393, 0x1680, 0xffff, 0, + "Moxa Technologies, C168H/PCI", + DEFAULT_RCLK * 8, + PUC_PORT_8S, 0x18, 0, 8, + }, + + { 0x1393, 0x1681, 0xffff, 0, + "Moxa Technologies, C168U/PCI", + DEFAULT_RCLK * 8, + PUC_PORT_8S, 0x18, 0, 8, + }, + + { 0x13a8, 0x0158, 0xffff, 0, + "Cronyx Omega2-PCI", + DEFAULT_RCLK * 8, + PUC_PORT_8S, 0x10, 0, -1, + .config_function = puc_config_cronyx + }, + + { 0x1407, 0x0100, 0xffff, 0, + "Lava Computers Dual Serial", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x1407, 0x0101, 0xffff, 0, + "Lava Computers Quatro A", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x1407, 0x0102, 0xffff, 0, + "Lava Computers Quatro B", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x1407, 0x0120, 0xffff, 0, + "Lava Computers Quattro-PCI A", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x1407, 0x0121, 0xffff, 0, + "Lava Computers Quattro-PCI B", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x1407, 0x0180, 0xffff, 0, + "Lava Computers Octo A", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 4, 0, + }, + + { 0x1407, 0x0181, 0xffff, 0, + "Lava Computers Octo B", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 4, 0, + }, + + { 0x1409, 0x7168, 0xffff, 0, + NULL, + DEFAULT_RCLK * 8, + PUC_PORT_NONSTANDARD, 0x10, -1, -1, + .config_function = puc_config_timedia }, /* @@ -846,442 +589,544 @@ const struct puc_device_description puc_devices[] = { * I/O Flex PCI I/O Card Model-223 with 4 serial and 1 parallel ports. */ - /* Oxford Semiconductor OX12PCI840 PCI Parallel port */ - { "Oxford Semiconductor OX12PCI840 Parallel port", - { 0x1415, 0x8403, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_LPT, 0x10, 0x00, 0x00 }, - }, - }, - - /* Oxford Semiconductor OX16PCI954 PCI UARTs */ - { "Oxford Semiconductor OX16PCI954 UARTs", - { 0x1415, 0x9501, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - }, - }, - - /* Oxford Semiconductor OX16PCI954 PCI UARTs */ - { "Oxford Semiconductor OX16PCI954 UARTs", - { 0x1415, 0x950a, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - }, - }, - - /* Oxford Semiconductor OXCB950 PCI/CardBus UARTs */ - { "Oxford Semiconductor OXCB950 UART", - { 0x1415, 0x950b, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - /* { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, */ - { PUC_PORT_TYPE_COM, 0x10, 0x00, 16384000 }, - }, + { 0x1415, 0x9501, 0xffff, 0, + "Oxford Semiconductor OX16PCI954 UARTs", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 0, 8, }, - /* - * Oxford Semiconductor OX9160/OX16PCI954 PCI UARTS - * Second chip on Exsys EX-41098 8x cards - */ - { "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)", - { 0x1415, 0x9511, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - }, - }, - - /* Oxford Semiconductor OX16PCI954 PCI Parallel port */ - { "Oxford Semiconductor OX16PCI954 Parallel port", - { 0x1415, 0x9513, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_LPT, 0x10, 0x00, 0x00 }, - }, - }, - - /* NetMos 2S1P PCI 16C650 : 2S, 1P */ - { "NetMos NM9835 Dual UART and 1284 Printer port", - { 0x9710, 0x9835, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x18, 0x00, 0x00 }, - }, - }, - - /* NetMos 4S0P PCI: 4S, 0P */ - { "NetMos NM9845 Quad UART", - { 0x9710, 0x9845, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, - }, - - /* NetMos 0S1P PCI: 0S, 1P */ - { "NetMos NM9805 1284 Printer port", - { 0x9710, 0x9805, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_LPT, 0x10, 0x00, 0x00 }, - }, - }, + { 0x1415, 0x950a, 0xffff, 0, + "Oxford Semiconductor OX16PCI954 UARTs", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 0, 8, + }, - /* - * This is the Middle Digital, Inc. PCI-Weasel, which - * uses a PCI interface implemented in FPGA. - */ - { "Middle Digital, Inc. Weasel serial port", - { 0xdeaf, 0x9051, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - }, - }, - - /* SD-LAB PCI I/O Card 4S2P */ - { "Syba Tech Ltd. PCI-4S2P-550-ECP", - { 0x1592, 0x0781, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x2e8, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x2f8, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x10, 0x000, 0x00 }, - { PUC_PORT_TYPE_COM, 0x10, 0x3e8, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x3f8, COM_FREQ }, - { PUC_PORT_TYPE_LPT, 0x10, 0x000, 0x00 }, - }, - .init = puc_config_win877, - }, - - /* Moxa Technologies Co., Ltd. PCI I/O Card 4S RS232 */ - { "Moxa Technologies, Smartio C104H/PCI", - { 0x1393, 0x1040, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x18, COM_FREQ * 8 }, - }, - }, - - /* Moxa Technologies Co., Ltd. PCI I/O Card 4S RS232 */ - { "Moxa Technologies, Smartio CP-104UL/PCI", - { 0x1393, 0x1041, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x18, COM_FREQ * 8 }, - }, - }, - - /* Moxa Technologies Co., Ltd. PCI I/O Card 4S RS232/422/485 */ - { "Moxa Technologies, Industio CP-114", - { 0x1393, 0x1141, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x18, COM_FREQ * 8 }, - }, - }, - - /* Moxa Technologies Co., Ltd. PCI I/O Card 8S RS232 */ - { "Moxa Technologies, C168H/PCI", - { 0x1393, 0x1680, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x18, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x20, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x28, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x30, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x38, COM_FREQ * 8 }, - }, - }, - - /* Moxa Technologies Co., Ltd. PCI I/O Card 8S RS232 */ - { "Moxa Technologies, C168U/PCI", - { 0x1393, 0x1681, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x08, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x10, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x18, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x20, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x28, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x30, COM_FREQ * 8 }, - { PUC_PORT_TYPE_COM, 0x18, 0x38, COM_FREQ * 8 }, - }, - }, - - { "Avlab Technology, PCI IO 2S", - { 0x14db, 0x2130, 0, 0 }, - { 0xffff, 0xfffc, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - }, - }, - - /* Avlab Technology, Inc. Low Profile PCI 4 Serial: 4S */ - { "Avlab Low Profile PCI 4 Serial", - { 0x14db, 0x2150, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - }, - }, - - /* Decision Computer Inc, serial ports */ - { "Decision Computer Inc, PCCOM 4-port serial", - { 0x6666, 0x0001, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x18, COM_FREQ }, - }, - }, - - { "PCCOM dual port RS232/422/485", - { 0x6666, 0x0004, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x1c, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x1c, 0x08, COM_FREQ }, - }, - }, - - { "IC Book Labs Gunboat x2 Low Profile", - { 0xb00c, 0x0a1c, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - }, - }, - - { "IC Book Labs Gunboat x4 Lite", - { 0xb00c, 0x021c, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - }, - PUC_ILR_TYPE_DIGI, { 0x07 }, - }, - - { "IC Book Labs Gunboat x4 Pro", - { 0xb00c, 0x031c, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - }, - PUC_ILR_TYPE_DIGI, { 0x07 }, - }, - - { "IC Book Labs Gunboat x4 Low Profile", - { 0xb00c, 0x0b1c, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - }, - PUC_ILR_TYPE_DIGI, { 0x07 }, - }, - - { "IC Book Labs Ironclad x8 Lite", - { 0xb00c, 0x041c, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x20, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x28, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x30, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x38, COM_FREQ }, - }, - PUC_ILR_TYPE_DIGI, { 0x07 }, - }, - - { "IC Book Labs Ironclad x8 Pro", - { 0xb00c, 0x051c, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x20, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x28, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x30, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x38, COM_FREQ }, - }, - PUC_ILR_TYPE_DIGI, { 0x07 }, - }, - - { "IC Book Labs Dreadnought x16 Lite", - { 0xb00c, 0x091c, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x20, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x28, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x30, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x38, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x40, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x48, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x50, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x58, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x60, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x68, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x70, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x78, COM_FREQ }, - }, - PUC_ILR_TYPE_DIGI, { 0x07, 0x47 }, - }, - - { "IC Book Labs Dreadnought x16 Pro", - { 0xb00c, 0x081c, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x20, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x28, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x30, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x38, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x40, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x48, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x50, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x58, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x60, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x68, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x70, COM_FREQ * 8, 0x200000 }, - { PUC_PORT_TYPE_COM, 0x10, 0x78, COM_FREQ * 8, 0x200000 }, - }, - PUC_ILR_TYPE_DIGI, { 0x07, 0x47 }, - }, - - { "Cronyx Omega2-PCI", - { 0x13a8, 0x0158, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_UART, 0x010, 0x000, COM_FREQ * 8, PUC_FLAGS_MEMORY }, - { PUC_PORT_TYPE_UART, 0x010, 0x200, COM_FREQ * 8, PUC_FLAGS_MEMORY }, - { PUC_PORT_TYPE_UART, 0x010, 0x400, COM_FREQ * 8, PUC_FLAGS_MEMORY }, - { PUC_PORT_TYPE_UART, 0x010, 0x600, COM_FREQ * 8, PUC_FLAGS_MEMORY }, - { PUC_PORT_TYPE_UART, 0x010, 0x800, COM_FREQ * 8, PUC_FLAGS_MEMORY }, - { PUC_PORT_TYPE_UART, 0x010, 0xA00, COM_FREQ * 8, PUC_FLAGS_MEMORY }, - { PUC_PORT_TYPE_UART, 0x010, 0xC00, COM_FREQ * 8, PUC_FLAGS_MEMORY }, - { PUC_PORT_TYPE_UART, 0x010, 0xE00, COM_FREQ * 8, PUC_FLAGS_MEMORY }, - }, + { 0x1415, 0x9511, 0xffff, 0, + "Oxford Semiconductor OX9160/OX16PCI954 UARTs (function 1)", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 0, 8, + }, + + { 0x1415, 0x9521, 0xffff, 0, + "Oxford Semiconductor OX16PCI952 UARTs", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x14d2, 0x8020, 0xffff, 0, + "VScom PCI-200L", + DEFAULT_RCLK * 8, + PUC_PORT_2S, 0x14, 4, 0, + }, + + { 0x14d2, 0x8028, 0xffff, 0, + "VScom 200Li", + DEFAULT_RCLK, + PUC_PORT_2S, 0x20, 0, 8, }, /* - * Boca Research Turbo Serial 654 (4 serial port) card. - * Appears to be the same as Chase Research PLC PCI-FAST4 - * and Perle PCI-FAST4 Multi-Port serial cards. + * VScom (Titan?) PCI-800L. More modern variant of the + * PCI-800. Uses 6 discrete 16550 UARTs, plus another + * two of them obviously implemented as macro cells in + * the ASIC. This causes the weird port access pattern + * below, where two of the IO port ranges each access + * one of the ASIC UARTs, and a block of IO addresses + * access the external UARTs. */ - { "Boca Research Turbo Serial 654", - { 0x10b5, 0x9050, 0x12e0, 0x0031 }, - { 0xffff, 0xffff, 0xffff, 0xffff }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x18, COM_FREQ * 4 }, - }, + { 0x14d2, 0x8080, 0xffff, 0, + "Titan VScom PCI-800L", + DEFAULT_RCLK * 8, + PUC_PORT_8S, 0x14, -1, -1, + .config_function = puc_config_titan }, /* - * Boca Research Turbo Serial 658 (8 serial port) card. - * Appears to be the same as Chase Research PLC PCI-FAST8 - * and Perle PCI-FAST8 Multi-Port serial cards. + * VScom PCI-800H. Uses 8 16950 UART, behind a PCI chips that offers + * 4 com port on PCI device 0 and 4 on PCI device 1. PCI device 0 has + * device ID 3 and PCI device 1 device ID 4. */ - { "Boca Research Turbo Serial 658", - { 0x10b5, 0x9050, 0x12e0, 0x0021 }, - { 0xffff, 0xffff, 0xffff, 0xffff }, - { - { PUC_PORT_TYPE_COM, 0x18, 0x00, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x08, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x10, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x18, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x20, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x28, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x30, COM_FREQ * 4 }, - { PUC_PORT_TYPE_COM, 0x18, 0x38, COM_FREQ * 4 }, - }, - }, - - { "Dell RAC III Virtual UART", - { 0x1028, 0x0008, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x14, 0x00, COM_FREQ * 128 }, - }, - }, - - { "Dell RAC IV/ERA Virtual UART", - { 0x1028, 0x0012, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x14, 0x00, DEFAULT_RCLK * 128 }, - }, - }, - { /* "VScom 200Li" 00=14D2 02=8028 uart@20 uart@+8 */ - "VScom 200Li", - { 0x14d2, 0x8028, 0, 0 }, - { 0xffff, 0xffff, 0, 0 }, - { - { PUC_PORT_TYPE_COM, 0x20, 0x00, DEFAULT_RCLK }, - { PUC_PORT_TYPE_COM, 0x20, 0x08, DEFAULT_RCLK }, - }, + { 0x14d2, 0xa003, 0xffff, 0, + "Titan PCI-800H", + DEFAULT_RCLK * 8, + PUC_PORT_4S, 0x10, 0, 8, + }, + { 0x14d2, 0xa004, 0xffff, 0, + "Titan PCI-800H", + DEFAULT_RCLK * 8, + PUC_PORT_4S, 0x10, 0, 8, + }, + + { 0x14d2, 0xa005, 0xffff, 0, + "Titan PCI-200H", + DEFAULT_RCLK * 8, + PUC_PORT_2S, 0x10, 0, 8, + }, + + { 0x14d2, 0xe020, 0xffff, 0, + "Titan VScom PCI-200HV2", + DEFAULT_RCLK * 8, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x14db, 0x2130, 0xffff, 0, + "Avlab Technology, PCI IO 2S", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x14db, 0x2150, 0xffff, 0, + "Avlab Low Profile PCI 4 Serial", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 4, 0, }, - { 0 } + { 0x1592, 0x0781, 0xffff, 0, + "Syba Tech Ltd. PCI-4S2P-550-ECP", + DEFAULT_RCLK, + PUC_PORT_4S1P, 0x10, 0, -1, + .config_function = puc_config_syba + }, + + { 0x6666, 0x0001, 0xffff, 0, + "Decision Computer Inc, PCCOM 4-port serial", + DEFAULT_RCLK, + PUC_PORT_4S, 0x1c, 0, 8, + }, + + { 0x6666, 0x0004, 0xffff, 0, + "PCCOM dual port RS232/422/485", + DEFAULT_RCLK, + PUC_PORT_2S, 0x1c, 0, 8, + }, + + { 0x9710, 0x9815, 0xffff, 0, + "NetMos NM9815 Dual 1284 Printer port", + 0, + PUC_PORT_2P, 0x10, 8, 0, + }, + + { 0x9710, 0x9835, 0xffff, 0, + "NetMos NM9835 Dual UART and 1284 Printer port", + DEFAULT_RCLK, + PUC_PORT_2S1P, 0x10, 4, 0, + }, + + { 0x9710, 0x9845, 0x1000, 0x0006, + "NetMos NM9845 6 Port UART", + DEFAULT_RCLK, + PUC_PORT_6S, 0x10, 4, 0, + }, + + { 0x9710, 0x9845, 0xffff, 0, + "NetMos NM9845 Quad UART and 1284 Printer port", + DEFAULT_RCLK, + PUC_PORT_4S1P, 0x10, 4, 0, + }, + + { 0xb00c, 0x021c, 0xffff, 0, + "IC Book Labs Gunboat x4 Lite", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 0, 8, + .config_function = puc_config_icbook + }, + + { 0xb00c, 0x031c, 0xffff, 0, + "IC Book Labs Gunboat x4 Pro", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 0, 8, + .config_function = puc_config_icbook + }, + + { 0xb00c, 0x041c, 0xffff, 0, + "IC Book Labs Ironclad x8 Lite", + DEFAULT_RCLK, + PUC_PORT_8S, 0x10, 0, 8, + .config_function = puc_config_icbook + }, + + { 0xb00c, 0x051c, 0xffff, 0, + "IC Book Labs Ironclad x8 Pro", + DEFAULT_RCLK, + PUC_PORT_8S, 0x10, 0, 8, + .config_function = puc_config_icbook + }, + + { 0xb00c, 0x081c, 0xffff, 0, + "IC Book Labs Dreadnought x16 Pro", + DEFAULT_RCLK * 8, + PUC_PORT_16S, 0x10, 0, 8, + .config_function = puc_config_icbook + }, + + { 0xb00c, 0x091c, 0xffff, 0, + "IC Book Labs Dreadnought x16 Lite", + DEFAULT_RCLK, + PUC_PORT_16S, 0x10, 0, 8, + .config_function = puc_config_icbook + }, + + { 0xb00c, 0x0a1c, 0xffff, 0, + "IC Book Labs Gunboat x2 Low Profile", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 0, 8, + }, + + { 0xb00c, 0x0b1c, 0xffff, 0, + "IC Book Labs Gunboat x4 Low Profile", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 0, 8, + .config_function = puc_config_icbook + }, + + { 0xffff, 0, 0xffff, 0, NULL, 0 } }; + +static int +puc_config_amc(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, + intptr_t *res) +{ + switch (cmd) { + case PUC_CFG_GET_OFS: + *res = 8 * (port & 1); + return (0); + case PUC_CFG_GET_RID: + *res = 0x14 + (port >> 1) * 4; + return (0); + default: + break; + } + return (ENXIO); +} + +static int +puc_config_cronyx(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, + intptr_t *res) +{ + if (cmd == PUC_CFG_GET_OFS) { + *res = port * 0x200; + return (0); + } + return (ENXIO); +} + +static int +puc_config_diva(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, + intptr_t *res) +{ + const struct puc_cfg *cfg = sc->sc_cfg; + + if (cmd == PUC_CFG_GET_OFS) { + if (cfg->subdevice == 0x1282) /* Everest SP */ + port <<= 1; + else if (cfg->subdevice == 0x104b) /* Maestro SP2 */ + port = (port == 3) ? 4 : port; + *res = port * 8 + ((port > 2) ? 0x18 : 0); + return (0); + } + return (ENXIO); +} + +static int +puc_config_icbook(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, + intptr_t *res) +{ + if (cmd == PUC_CFG_GET_ILR) { + *res = PUC_ILR_DIGI; + return (0); + } + return (ENXIO); +} + +static int +puc_config_quatech(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, + intptr_t *res) +{ + const struct puc_cfg *cfg = sc->sc_cfg; + struct puc_bar *bar; + uint8_t v0, v1; + + switch (cmd) { + case PUC_CFG_SETUP: + /* + * Check if the scratchpad register is enabled or if the + * interrupt status and options registers are active. + */ + bar = puc_get_bar(sc, cfg->rid); + if (bar == NULL) + return (ENXIO); + /* Set DLAB in the LCR register of UART 0. */ + bus_write_1(bar->b_res, 3, 0x80); + /* Write 0 to the SPR register of UART 0. */ + bus_write_1(bar->b_res, 7, 0); + /* Read back the contents of the SPR register of UART 0. */ + v0 = bus_read_1(bar->b_res, 7); + /* Write a specific value to the SPR register of UART 0. */ + bus_write_1(bar->b_res, 7, 0x80 + -cfg->clock); + /* Read back the contents of the SPR register of UART 0. */ + v1 = bus_read_1(bar->b_res, 7); + /* Clear DLAB in the LCR register of UART 0. */ + bus_write_1(bar->b_res, 3, 0); + /* Save the two values read-back from the SPR register. */ + sc->sc_cfg_data = (v0 << 8) | v1; + if (v0 == 0 && v1 == 0x80 + -cfg->clock) { + /* + * The SPR register echoed the two values written + * by us. This means that the SPAD jumper is set. + */ + device_printf(sc->sc_dev, "warning: extra features " + "not usable -- SPAD compatibility enabled\n"); + return (0); + } + if (v0 != 0) { + /* + * The first value doesn't match. This can only mean + * that the SPAD jumper is not set and that a non- + * standard fixed clock multiplier jumper is set. + */ + if (bootverbose) + device_printf(sc->sc_dev, "fixed clock rate " + "multiplier of %d\n", 1 << v0); + if (v0 < -cfg->clock) + device_printf(sc->sc_dev, "warning: " + "suboptimal fixed clock rate multiplier " + "setting\n"); + return (0); + } + /* + * The first value matched, but the second didn't. We know + * that the SPAD jumper is not set. We also know that the + * clock rate multiplier is software controlled *and* that + * we just programmed it to the maximum allowed. + */ + if (bootverbose) + device_printf(sc->sc_dev, "clock rate multiplier of " + "%d selected\n", 1 << -cfg->clock); + return (0); + case PUC_CFG_GET_CLOCK: + v0 = (sc->sc_cfg_data >> 8) & 0xff; + v1 = sc->sc_cfg_data & 0xff; + if (v0 == 0 && v1 == 0x80 + -cfg->clock) { + /* + * XXX With the SPAD jumper applied, there's no + * easy way of knowing if there's also a clock + * rate multiplier jumper installed. Let's hope + * not... + */ + *res = DEFAULT_RCLK; + } else if (v0 == 0) { + /* + * No clock rate multiplier jumper installed, + * so we programmed the board with the maximum + * multiplier allowed as given to us in the + * clock field of the config record (negated). + */ + *res = DEFAULT_RCLK << -cfg->clock; + } else + *res = DEFAULT_RCLK << v0; + return (0); + case PUC_CFG_GET_ILR: + v0 = (sc->sc_cfg_data >> 8) & 0xff; + v1 = sc->sc_cfg_data & 0xff; + *res = (v0 == 0 && v1 == 0x80 + -cfg->clock) + ? PUC_ILR_NONE : PUC_ILR_QUATECH; + return (0); + default: + break; + } + return (ENXIO); +} + +static int +puc_config_syba(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, + intptr_t *res) +{ + static int base[] = { 0x251, 0x3f0, 0 }; + const struct puc_cfg *cfg = sc->sc_cfg; + struct puc_bar *bar; + int efir, idx, ofs; + uint8_t v; + + switch (cmd) { + case PUC_CFG_SETUP: + bar = puc_get_bar(sc, cfg->rid); + if (bar == NULL) + return (ENXIO); + + /* configure both W83877TFs */ + bus_write_1(bar->b_res, 0x250, 0x89); + bus_write_1(bar->b_res, 0x3f0, 0x87); + bus_write_1(bar->b_res, 0x3f0, 0x87); + idx = 0; + while (base[idx] != 0) { + efir = base[idx]; + bus_write_1(bar->b_res, efir, 0x09); + v = bus_read_1(bar->b_res, efir + 1); + if ((v & 0x0f) != 0x0c) + return (ENXIO); + bus_write_1(bar->b_res, efir, 0x16); + v = bus_read_1(bar->b_res, efir + 1); + bus_write_1(bar->b_res, efir, 0x16); + bus_write_1(bar->b_res, efir + 1, v | 0x04); + bus_write_1(bar->b_res, efir, 0x16); + bus_write_1(bar->b_res, efir + 1, v & ~0x04); + ofs = base[idx] & 0x300; + bus_write_1(bar->b_res, efir, 0x23); + bus_write_1(bar->b_res, efir + 1, (ofs + 0x78) >> 2); + bus_write_1(bar->b_res, efir, 0x24); + bus_write_1(bar->b_res, efir + 1, (ofs + 0xf8) >> 2); + bus_write_1(bar->b_res, efir, 0x25); + bus_write_1(bar->b_res, efir + 1, (ofs + 0xe8) >> 2); + bus_write_1(bar->b_res, efir, 0x17); + bus_write_1(bar->b_res, efir + 1, 0x03); + bus_write_1(bar->b_res, efir, 0x28); + bus_write_1(bar->b_res, efir + 1, 0x43); + idx++; + } + bus_write_1(bar->b_res, 0x250, 0xaa); + bus_write_1(bar->b_res, 0x3f0, 0xaa); + return (0); + case PUC_CFG_GET_OFS: + switch (port) { + case 0: + *res = 0x2f8; + return (0); + case 1: + *res = 0x2e8; + return (0); + case 2: + *res = 0x3f8; + return (0); + case 3: + *res = 0x3e8; + return (0); + case 4: + *res = 0x278; + return (0); + } + break; + default: + break; + } + return (ENXIO); +} + +static int +puc_config_siig(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, + intptr_t *res) +{ + const struct puc_cfg *cfg = sc->sc_cfg; + + switch (cmd) { + case PUC_CFG_GET_OFS: + if (cfg->ports == PUC_PORT_8S) { + *res = (port > 4) ? 8 * (port - 4) : 0; + return (0); + } + break; + case PUC_CFG_GET_RID: + if (cfg->ports == PUC_PORT_8S) { + *res = 0x10 + ((port > 4) ? 0x10 : 4 * port); + return (0); + } + if (cfg->ports == PUC_PORT_2S1P) { + switch (port) { + case 0: *res = 0x10; return (0); + case 1: *res = 0x14; return (0); + case 2: *res = 0x1c; return (0); + } + } + break; + default: + break; + } + return (ENXIO); +} + +static int +puc_config_timedia(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, + intptr_t *res) +{ + static uint16_t dual[] = { + 0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085, + 0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079, + 0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079, + 0x9137, 0x9138, 0x9237, 0x9238, 0xA079, 0xB079, 0xC079, + 0xD079, 0 + }; + static uint16_t quad[] = { + 0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157, + 0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159, + 0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056, + 0xB157, 0 + }; + static uint16_t octa[] = { + 0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166, + 0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0 + }; + static struct { + int ports; + uint16_t *ids; + } subdevs[] = { + { 2, dual }, + { 4, quad }, + { 8, octa }, + { 0, NULL } + }; + static char desc[64]; + int dev, id; + uint16_t subdev; + + switch (cmd) { + case PUC_CFG_GET_DESC: + snprintf(desc, sizeof(desc), + "Timedia technology %d Port Serial", (int)sc->sc_cfg_data); + *res = (intptr_t)desc; + return (0); + case PUC_CFG_GET_NPORTS: + subdev = pci_get_subdevice(sc->sc_dev); + dev = 0; + while (subdevs[dev].ports != 0) { + id = 0; + while (subdevs[dev].ids[id] != 0) { + if (subdev == subdevs[dev].ids[id]) { + sc->sc_cfg_data = subdevs[dev].ports; + *res = sc->sc_cfg_data; + return (0); + } + id++; + } + dev++; + } + return (ENXIO); + case PUC_CFG_GET_OFS: + *res = (port == 1 || port == 3) ? 8 : 0; + return (0); + case PUC_CFG_GET_RID: + *res = (port > 3) ? port - 2 : port >> 1; + return (0); + case PUC_CFG_GET_TYPE: + *res = PUC_TYPE_SERIAL; + return (0); + default: + break; + } + return (ENXIO); +} + +static int +puc_config_titan(struct puc_softc *sc, enum puc_cfg_cmd cmd, int port, + intptr_t *res) +{ + switch (cmd) { + case PUC_CFG_GET_OFS: + *res = (port < 3) ? 0 : (port - 2) << 3; + return (0); + case PUC_CFG_GET_RID: + *res = 0x14 + ((port >= 2) ? 0x0c : port << 2); + return (0); + default: + break; + } + return (ENXIO); +} |