Comtrol Rocketport driver is severely hosed under 6.x-STABLE

Karl Denninger karl at denninger.net
Thu Sep 7 13:31:44 PDT 2006


Nope - still got the same issues.  

I have an application that does heavy serial I/O in non-canonical mode and
uses raw I/O termios (Vmin, Vtime, etc) heavily.

It works perfectly under 5.x and has worked properly under previous versions
back to 4.x under both the Comtrol and Digiboard drivers.

With or without these patches, its screwed on 6.x.  I'm getting double,
triple, sometimes even more copies of frames into the read buffer - returns
from SELECT which are reporting data already read (and it can be read(2)
again!), etc.

Not good...

Here's a boot dmesg of one of the machines that's misbehaving...

I'm going to shut off SMP in this kernel (all these machines ARE hyperthreaded
CPUs) and see if that helps, but the patches appear to make no difference.

Copyright (c) 1992-2006 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
	The Regents of the University of California. All rights reserved.
FreeBSD 6.1-STABLE #2: Thu Sep  7 14:48:03 CDT 2006
    karl at FS.denninger.net:/usr/obj/usr/src/sys/KSD-SMP
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Intel(R) Pentium(R) 4 CPU 2.40GHz (2394.01-MHz 686-class CPU)
  Origin = "GenuineIntel"  Id = 0xf29  Stepping = 9
  Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
  Features2=0x4400<CNTX-ID,<b14>>
  Logical CPUs per core: 2
real memory  = 267862016 (255 MB)
avail memory = 252432384 (240 MB)
ACPI APIC Table: <DELL   PE400SC>
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
 cpu0 (BSP): APIC ID:  0
 cpu1 (AP): APIC ID:  1
ioapic0: Changing APIC ID to 2
ioapic0 <Version 2.0> irqs 0-23 on motherboard
kbd1 at kbdmux0
ath_hal: 0.9.17.2 (AR5210, AR5211, AR5212, RF5111, RF5112, RF2413, RF5413)
acpi0: <DELL PE400SC> on motherboard
acpi0: Power Button (fixed)
Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
acpi_timer0: <24-bit timer at 3.579545MHz> port 0x808-0x80b on acpi0
cpu0: <ACPI CPU> on acpi0
cpu1: <ACPI CPU> on acpi0
acpi_button0: <Power Button> on acpi0
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
agp0: <Intel 82875P host to AGP bridge> mem 0xe8000000-0xefffffff at device 0.0 on pci0
pcib1: <PCI-PCI bridge> at device 1.0 on pci0
pci1: <PCI bus> on pcib1
pci1: <display, VGA> at device 0.0 (no driver attached)
uhci0: <Intel 82801EB (ICH5) USB controller USB-A> port 0xff80-0xff9f irq 16 at device 29.0 on pci0
uhci0: [GIANT-LOCKED]
usb0: <Intel 82801EB (ICH5) USB controller USB-A> on uhci0
usb0: USB revision 1.0
uhub0: Intel UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
uhci1: <Intel 82801EB (ICH5) USB controller USB-B> port 0xff60-0xff7f irq 19 at device 29.1 on pci0
uhci1: [GIANT-LOCKED]
usb1: <Intel 82801EB (ICH5) USB controller USB-B> on uhci1
usb1: USB revision 1.0
uhub1: Intel UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub1: 2 ports with 2 removable, self powered
uhci2: <Intel 82801EB (ICH5) USB controller USB-C> port 0xff40-0xff5f irq 18 at device 29.2 on pci0
uhci2: [GIANT-LOCKED]
usb2: <Intel 82801EB (ICH5) USB controller USB-C> on uhci2
usb2: USB revision 1.0
uhub2: Intel UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub2: 2 ports with 2 removable, self powered
uhci3: <Intel 82801EB (ICH5) USB controller USB-D> port 0xff20-0xff3f irq 16 at device 29.3 on pci0
uhci3: [GIANT-LOCKED]
usb3: <Intel 82801EB (ICH5) USB controller USB-D> on uhci3
usb3: USB revision 1.0
uhub3: Intel UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub3: 2 ports with 2 removable, self powered
ehci0: <Intel 82801EB/R (ICH5) USB 2.0 controller> mem 0xffa80800-0xffa80bff irq 23 at device 29.7 on pci0
ehci0: [GIANT-LOCKED]
usb4: EHCI version 1.0
usb4: companion controllers, 2 ports each: usb0 usb1 usb2 usb3
usb4: <Intel 82801EB/R (ICH5) USB 2.0 controller> on ehci0
usb4: USB revision 2.0
uhub4: Intel EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
uhub4: 8 ports with 8 removable, self powered
pcib2: <ACPI PCI-PCI bridge> at device 30.0 on pci0
pci2: <ACPI PCI bus> on pcib2
twe0: <3ware Storage Controller. Driver version 1.50.01.002> port 0xcef0-0xceff mem 0xfe000000-0xfe7fffff irq 22 at device 1.0 on pci2
twe0: [GIANT-LOCKED]
twe0: 2 ports, Firmware FE8S 1.05.00.068, BIOS BE7X 1.08.00.048
rp0: <RocketPort PCI Quad> port 0xcf00-0xcf3f irq 17 at device 2.0 on pci2
RocketPort0 = 4 ports.
pcib3: <PCI-PCI bridge> at device 3.0 on pci2
pci3: <PCI bus> on pcib3
fxp0: <Intel 82558 Pro/100 Ethernet> port 0xbf80-0xbf9f mem 0xf8001000-0xf8001fff,0xfdc00000-0xfdcfffff irq 19 at device 4.0 on pci3
miibus0: <MII bus> on fxp0
inphy0: <i82555 10/100 media interface> on miibus0
inphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
fxp0: Ethernet address: 00:d0:b7:6f:ce:e8
fxp1: <Intel 82558 Pro/100 Ethernet> port 0xbfe0-0xbfff mem 0xf8000000-0xf8000fff,0xfdd00000-0xfddfffff irq 18 at device 5.0 on pci3
miibus1: <MII bus> on fxp1
inphy1: <i82555 10/100 media interface> on miibus1
inphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
fxp1: Ethernet address: 00:d0:b7:6f:ce:e9
em0: <Intel(R) PRO/1000 Network Connection Version - 6.1.4> port 0xcf40-0xcf7f mem 0xfdfe0000-0xfdffffff irq 18 at device 12.0 on pci2
em0: Ethernet address: 00:0c:f1:c9:df:c5
em0: [FAST]
isab0: <PCI-ISA bridge> at device 31.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel ICH5 UDMA100 controller> port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0xffa0-0xffaf mem 0xfebffc00-0xfebfffff irq 18 at device 31.1 on pci0
ata0: <ATA channel 0> on atapci0
ata1: <ATA channel 1> on atapci0
atapci1: <Intel ICH5 SATA150 controller> port 0xfe00-0xfe07,0xfe10-0xfe13,0xfe20-0xfe27,0xfe30-0xfe33,0xfea0-0xfeaf irq 18 at device 31.2 on pci0
ata2: <ATA channel 0> on atapci1
ata3: <ATA channel 1> on atapci1
pci0: <serial bus, SMBus> at device 31.3 (no driver attached)
pcm0: <Intel ICH5 (82801EB)> port 0xee00-0xeeff,0xedc0-0xedff mem 0xfebffa00-0xfebffbff,0xfebff900-0xfebff9ff irq 17 at device 31.5 on pci0
pcm0: primary codec not ready!
pcm0: <Analog Devices AD1980 AC97 Codec>
fdc0: <floppy drive controller> port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on acpi0
fdc0: [FAST]
fd0: <1440-KB 3.5" drive> on fdc0 drive 0
atkbdc0: <Keyboard controller (i8042)> port 0x60,0x64 irq 1 on acpi0
atkbd0: <AT Keyboard> irq 1 on atkbdc0
kbd0 at atkbd0
atkbd0: [GIANT-LOCKED]
sio0: <16550A-compatible COM port> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
sio0: type 16550A
sio1: <16550A-compatible COM port> port 0x2f8-0x2ff irq 3 on acpi0
sio1: type 16550A
pmtimer0 on isa0
orm0: <ISA Option ROMs> at iomem 0xc0000-0xcafff,0xcb000-0xcbfff,0xcc000-0xcc7ff,0xcc800-0xcdfff,0xce000-0xcffff on isa0
ppc0: parallel port not found.
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
Timecounters tick every 1.000 msec
ipfw2 (+ipv6) initialized, divert loadable, rule-based forwarding disabled, default to deny, logging disabled
acd0: CDROM <Lite-On LTN486S 48x Max/YDS6> at ata1-master UDMA33
ad4: 476940MB <HDS725050KLA360 K2AOA51A> at ata2-master SATA150
ad6: 476940MB <HDS725050KLA360 K2AOA51A> at ata3-master SATA150
twed0: <Unit 0, JBOD, Normal> on twe0
twed0: 476940MB (976773168 sectors)
twed1: <Unit 1, JBOD, Normal> on twe0
twed1: 476940MB (976773168 sectors)
SMP: AP CPU #1 Launched!
GEOM_MIRROR: Device b500 created (id=1654021267).
GEOM_MIRROR: Device b500: provider ad4s1 detected.
GEOM_MIRROR: Device b500: provider ad6s1 detected.
GEOM_MIRROR: Device b500: provider ad6s1 activated.
GEOM_MIRROR: Device b500: provider ad4s1 activated.
GEOM_MIRROR: Device b500: provider mirror/b500 launched.
Trying to mount root from ufs:/dev/mirror/b500a
em0: link state changed to UP

--
-- 
Karl Denninger (karl at denninger.net) Internet Consultant & Kids Rights Activist
http://www.denninger.net	My home on the net - links to everything I do!
http://scubaforum.org		Your UNCENSORED place to talk about DIVING!
http://genesis3.blogspot.com	Musings Of A Sentient Mind





On Thu, Sep 07, 2006 at 11:21:51AM -0700, Doug Ambrisko wrote:
> Karl Denninger writes:
> | 
> | There is a severe problem (or set of problmes) with the Comtrol Rocketport
> | driver under FreeBSD 6.x, to the point that the driver is basically unusable.
> | 
> | The driver is returning duplicate input frames and otherwise misbehaving
> | badly.  There were no problems under FreeBSD 5.x.
> | 
> | Does anyone know what has changed in the tty subsystem between 5.x and 6.x,
> | or, alternatively if there is no update on this, is there a KNOWN WORKING
> | PROPERLY multiport serial board under 6.x?
> | 
> | This has totally hosed a number of my field installations when they attempted
> | to go from the 5.x operating environment to 6.x!
> | 
> | Thanks in advance....
> 
> Try this for 6.1 in /sys/dev/rp:
> 
> Index: rp.c
> ===================================================================
> RCS file: /usr/local/cvsroot/freebsd/src/sys/dev/rp/rp.c,v
> retrieving revision 1.67.2.1
> diff -u -p -r1.67.2.1 rp.c
> --- rp.c	8 Nov 2005 15:35:27 -0000	1.67.2.1
> +++ rp.c	7 Sep 2006 18:19:44 -0000
> @@ -37,15 +37,18 @@ __FBSDID("$FreeBSD: src/sys/dev/rp/rp.c,
>  /* 
>   * rp.c - for RocketPort FreeBSD
>   */
> +#include <sys/cdefs.h>
>  
>  #include "opt_compat.h"
>  
>  #include <sys/param.h>
> +#include <sys/proc.h>
>  #include <sys/systm.h>
>  #include <sys/fcntl.h>
>  #include <sys/malloc.h>
>  #include <sys/serial.h>
>  #include <sys/tty.h>
> +#include <sys/dkstat.h>
>  #include <sys/conf.h>
>  #include <sys/kernel.h>
>  #include <machine/resource.h>
> @@ -57,7 +60,7 @@ __FBSDID("$FreeBSD: src/sys/dev/rp/rp.c,
>  #include <dev/rp/rpreg.h>
>  #include <dev/rp/rpvar.h>
>  
> -static const char RocketPortVersion[] = "3.02";
> +static const char RocketPortVersion[] = "1.0";
>  
>  static Byte_t RData[RDATASIZE] =
>  {
> @@ -116,6 +119,8 @@ Byte_t rp_sBitMapSetTbl[8] =
>     0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
>  };
>  
> +int next_unit_number = 0;
> +int num_devices_found = 0;
>  /***************************************************************************
>  Function: sReadAiopID
>  Purpose:  Read the AIOP idenfication number directly from an AIOP.
> @@ -587,6 +592,9 @@ static void rp_do_receive(struct rp_port
>  	unsigned	int	CharNStat;
>  	int	ToRecv, wRecv, ch, ttynocopy;
>  
> +	if (tp->t_state & TS_TBLOCK)
> +		return;
> +
>  	ToRecv = sGetRxCnt(cp);
>  	if(ToRecv == 0)
>  		return;
> @@ -615,7 +623,7 @@ static void rp_do_receive(struct rp_port
>  			CharNStat = rp_readch2(cp,sGetTxRxDataIO(cp));
>  			ch = CharNStat & 0xff;
>  
> -			if((CharNStat & STMBREAK) || (CharNStat & STMFRAMEH))
> +			if((CharNStat & STMBREAKH) || (CharNStat & STMFRAMEH))
>  				ch |= TTY_FE;
>  			else if (CharNStat & STMPARITYH)
>  				ch |= TTY_PE;
> @@ -645,6 +653,12 @@ static void rp_do_receive(struct rp_port
>  			if ( ToRecv > RXFIFO_SIZE ) {
>  				ToRecv = RXFIFO_SIZE;
>  			}
> +			if ((tp->t_rawq.c_cc + ToRecv > tp->t_ihiwat) &&
> +			    ((tp->t_cflag & CRTS_IFLOW) ||
> +			     (tp->t_iflag & IXOFF)) &&
> +			    !(tp->t_state & TS_TBLOCK))
> +				ttyblock(tp);
> +
>  			wRecv = ToRecv >> 1;
>  			if ( wRecv ) {
>  				rp_readmultich2(cp,sGetTxRxDataIO(cp),(u_int16_t *)rp->RxBuf,wRecv);
> @@ -686,6 +700,7 @@ static void rp_handle_port(struct rp_por
>  	IntMask = sGetChanIntID(cp);
>  	IntMask = IntMask & rp->rp_intmask;
>  	ChanStatus = sGetChanStatus(cp);
> +	
>  	if(IntMask & RXF_TRIG)
>  		if(!(tp->t_state & TS_TBLOCK) && (tp->t_state & TS_CARR_ON) && (tp->t_state & TS_ISOPEN)) {
>  			rp_do_receive(rp, tp, cp, ChanStatus);
> @@ -769,22 +784,23 @@ rp_attachcommon(CONTROLLER_T *ctlp, int 
>  
>  	unit = device_get_unit(ctlp->dev);
>  
> -	printf("RocketPort%d (Version %s) %d ports.\n", unit,
> -		RocketPortVersion, num_ports);
> +	printf("RocketPort%d = %d ports.\n", unit, num_ports);
>  	rp_num_ports[unit] = num_ports;
>  	callout_handle_init(&rp_callout_handle);
>  
>  	ctlp->rp = rp = (struct rp_port *)
> -		malloc(sizeof(struct rp_port) * num_ports, M_TTYS, M_NOWAIT | M_ZERO);
> +		malloc(sizeof(struct rp_port) * (num_ports+1), M_TTYS, M_NOWAIT | M_ZERO);
>  	if (rp == NULL) {
>  		device_printf(ctlp->dev, "rp_attachcommon: Could not malloc rp_ports structures.\n");
>  		retval = ENOMEM;
>  		goto nogo;
>  	}
> -
> +/*	else {
> +		device_printf(ctlp->dev, "malloc'd rp_ports structures=%08x.\n", rp);
> +	}*/
>  	count = unit * 32;      /* board times max ports per card SG */
>  
> -	bzero(rp, sizeof(struct rp_port) * num_ports);
> +	bzero(rp, sizeof(struct rp_port) * (num_ports+1));
>  	oldspl = spltty();
>  	rp_addr(unit) = rp;
>  	splx(oldspl);
> @@ -1016,9 +1032,10 @@ rpmodem(struct tty *tp, int sigon, int s
>  	}
>  	return (0);
>  }
> -
> +#define B460800 460800
> +#define B921600 921600
>  static struct speedtab baud_table[] = {
> -	{B0,	0},		{B50,	BRD50},		{B75,	BRD75},
> +	{B0,	BRD0},		{B50,	BRD50},		{B75,	BRD75},
>  	{B110,	BRD110}, 	{B134,	BRD134}, 	{B150,	BRD150},
>  	{B200,	BRD200}, 	{B300,	BRD300}, 	{B600,	BRD600},
>  	{B1200,	BRD1200},	{B1800,	BRD1800},	{B2400,	BRD2400},
> @@ -1028,7 +1045,19 @@ static struct speedtab baud_table[] = {
>  	{B115200, BRD115200},	{B230400, BRD230400},
>  	{-1,	-1}
>  };
> -
> +#ifdef DJA
> +static struct speedtab ab_baud_table[] = {
> +	{B0,	AB_BRD0},	{B50,	AB_BRD50},	{B75,	AB_BRD75},
> +	{B110,	AB_BRD110}, 	{B134,	AB_BRD134}, 	{B150,	AB_BRD150},
> +	{B200,	AB_BRD200}, 	{B300,	AB_BRD300}, 	{B600,	AB_BRD600},
> +	{B1200,	AB_BRD1200},	{B1800,	AB_BRD1800},	{B2400,	AB_BRD2400},
> +	{B4800,	AB_BRD4800},	{B9600,	AB_BRD9600},	{B19200, AB_BRD19200},
> +	{B38400, AB_BRD38400},	{B7200,	AB_BRD7200},	{B14400, AB_BRD14400},
> +	{B57600, AB_BRD57600},	{B76800, AB_BRD76800},	{B115200, AB_BRD115200},
> +	{B230400,AB_BRD230400}, {B460800,AB_BRD460800}, {B921600, AB_BRD921600}, 
> +	{-1,	-1}
> +};
> +#endif
>  static int
>  rpparam(tp, t)
>  	struct tty *tp;
> @@ -1042,7 +1071,6 @@ rpparam(tp, t)
>  	int	devshift;
>  #endif
>  
> -
>  	rp = tp->t_sc;
>  	cp = &rp->rp_channel;
>  	oldspl = spltty();
> @@ -1059,7 +1087,12 @@ rpparam(tp, t)
>  	oflag = t->c_oflag;
>  	lflag = t->c_lflag;
>  
> -	ospeed = ttspeedtab(t->c_ispeed, baud_table);
> +#if DJA
> +	if (cardIsRocketportPlus(ctl->dev))
> +		ospeed = ttspeedtab(t->c_ispeed, ab_baud_table);
> +	else
> +#endif		
> +		ospeed = ttspeedtab(t->c_ispeed, baud_table);
>  	if(ospeed < 0 || t->c_ispeed != t->c_ospeed)
>  		return(EINVAL);
>  
> Index: rp_isa.c
> ===================================================================
> RCS file: /usr/local/cvsroot/freebsd/src/sys/dev/rp/rp_isa.c,v
> retrieving revision 1.7
> diff -u -p -r1.7 rp_isa.c
> --- rp_isa.c	6 Jan 2005 01:43:11 -0000	1.7
> +++ rp_isa.c	7 Sep 2006 18:19:44 -0000
> @@ -63,8 +63,8 @@ struct ISACONTROLLER_T {
>  	int		MReg1IO;	/* offset1 of the Mudbac controller for this controller */
>  	int		MReg2IO;	/* offset2 of the Mudbac controller for this controller */
>  	int		MReg3IO;	/* offset3 of the Mudbac controller for this controller */
> -	Byte_t		MReg2;
> -	Byte_t		MReg3;
> +	unsigned char	MReg2;
> +	unsigned char	MReg3;
>  };
>  typedef struct ISACONTROLLER_T ISACONTROLLER_t;
>  
> @@ -140,6 +140,12 @@ static rp_aiop2rid_t rp_isa_aiop2rid;
>  static rp_aiop2off_t rp_isa_aiop2off;
>  static rp_ctlmask_t rp_isa_ctlmask;
>  
> +/*
> +struct isa_driver rpdriver = {
> +	rpprobe, rpattach, "rp" 
> +	};
> +*/
> +
>  static int
>  rp_probe(device_t dev)
>  {
> @@ -149,6 +155,9 @@ rp_probe(device_t dev)
>  	CONTROLLER_t *ctlp;
>  	int retval;
>  
> +	if (num_devices_found >= 4)
> +		return (ENXIO);
> +
>  	/*
>  	 * We have no PnP RocketPort cards.
>  	 * (At least according to LINT)
> @@ -156,8 +165,8 @@ rp_probe(device_t dev)
>  	if (isa_get_logicalid(dev) != 0)
>  		return (ENXIO);
>  
> -	/* We need IO port resource to configure an ISA device. */
> -	if (bus_get_resource_count(dev, SYS_RES_IOPORT, 0) == 0)
> +	/* We need IO port resource to configure an ISA device.  */
> +	if (bus_get_resource_start(dev, SYS_RES_IOPORT, 0) == 0)
>  		return (ENXIO);
>  
>  	unit = device_get_unit(dev);
> @@ -176,20 +185,23 @@ rp_probe(device_t dev)
>  
>  	/* The IO ports of AIOPs for an ISA controller are discrete. */
>  	ctlp->io_num = 1;
> -	ctlp->io_rid = malloc(sizeof(*(ctlp->io_rid)) * MAX_AIOPS_PER_BOARD, M_DEVBUF, M_NOWAIT | M_ZERO);
> -	ctlp->io = malloc(sizeof(*(ctlp->io)) * MAX_AIOPS_PER_BOARD, M_DEVBUF, M_NOWAIT | M_ZERO);
> +	ctlp->io_rid = malloc(sizeof(*(ctlp->io_rid)) * MAX_AIOPS_PER_BOARD, M_DEVBUF, M_NOWAIT/* | M_ZERO*/);
> +	ctlp->io = malloc(sizeof(*(ctlp->io)) * MAX_AIOPS_PER_BOARD, M_DEVBUF, M_NOWAIT/* | M_ZERO*/);
>  	if (ctlp->io_rid == NULL || ctlp->io == NULL) {
>  		device_printf(dev, "rp_attach: Out of memory.\n");
>  		retval = ENOMEM;
>  		goto nogo;
>  	}
> +	bzero(ctlp->io_rid, sizeof(*(ctlp->io_rid)) * MAX_AIOPS_PER_BOARD);
> +	bzero(ctlp->io, sizeof(*(ctlp->io)) * MAX_AIOPS_PER_BOARD);
>  
> -	ctlp->bus_ctlp = malloc(sizeof(ISACONTROLLER_t) * 1, M_DEVBUF, M_NOWAIT | M_ZERO);
> +	ctlp->bus_ctlp = malloc(sizeof(ISACONTROLLER_t) * 1, M_DEVBUF, M_NOWAIT/* | M_ZERO*/);
>  	if (ctlp->bus_ctlp == NULL) {
>  		device_printf(dev, "rp_attach: Out of memory.\n");
>  		retval = ENOMEM;
>  		goto nogo;
>  	}
> +	bzero(ctlp->bus_ctlp, sizeof(ISACONTROLLER_t) * 1);
>  
>  	ctlp->io_rid[0] = 0;
>  	if (rp_controller != NULL) {
> @@ -218,6 +230,7 @@ rp_probe(device_t dev)
>  	if (rp_controller == NULL)
>  		rp_controller = controller;
>  	rp_nisadevs++;
> +	num_devices_found++;
>  
>  	device_set_desc(dev, "RocketPort ISA");
>  
> @@ -416,7 +429,7 @@ sInitController(	CONTROLLER_T *CtlP,
>  	CtlP->NumAiop = 0;
>  	for(i=0; i < AiopNum; i++)
>  	{
> -		if (CtlP->io[i] == NULL) {
> +		if (i > 0 /*CtlP->io[i] == NULL*/) {
>  			CtlP->io_rid[i] = i;
>  			aiop_base = rman_get_start(CtlP->io[0]) + 0x400 * i;
>  			if (rp_nisadevs == 0)
> Index: rp_pci.c
> ===================================================================
> RCS file: /usr/local/cvsroot/freebsd/src/sys/dev/rp/rp_pci.c,v
> retrieving revision 1.11.2.1
> diff -u -p -r1.11.2.1 rp_pci.c
> --- rp_pci.c	14 Feb 2006 23:09:10 -0000	1.11.2.1
> +++ rp_pci.c	7 Sep 2006 18:19:44 -0000
> @@ -67,8 +67,19 @@ __FBSDID("$FreeBSD: src/sys/dev/rp/rp_pc
>  #define RP_DEVICE_ID_4J		0x0007
>  #define RP_DEVICE_ID_6M		0x000C
>  #define RP_DEVICE_ID_4M		0x000D
> -#define RP_DEVICE_ID_UPCI_32	0x0801
> -#define RP_DEVICE_ID_UPCI_8O	0x0805
> +#define RP_DEVICE_ID_PL4	0x000A
> +#define RP_DEVICE_ID_PL8	0x000B
> +#define RP_DEVICE_ID_PL2	0x000E
> +#define RP_DEVICE_ID_U32	0x0801
> +#define RP_DEVICE_ID_U8PL	0x0802
> +#define RP_DEVICE_ID_U16	0x0803
> +#define RP_DEVICE_ID_U8QO	0x0805
> +#define RP_DEVICE_ID_UP8QO	0x080B
> +#define RP_DEVICE_ID_UP2	0x080E
> +#define RP_DEVICE_ID_UP2SMPTE	0x080F
> +#define RP_DEVICE_ID_UP4J	0x0810
> +#define RP_DEVICE_ID_UP8J	0x0811
> +#define RP_DEVICE_ID_UP422QO	0x0812
>  
>  /**************************************************************************
>    MUDBAC remapped for PCI
> @@ -76,9 +87,20 @@ __FBSDID("$FreeBSD: src/sys/dev/rp/rp_pc
>  
>  #define _CFG_INT_PCI	0x40
>  #define _PCI_INT_FUNC	0x3A
> +#define _UPCI_INT_FUNC	0x4C		
>  
>  #define PCI_STROB	0x2000
> +#define UPCI_STROB_C	0x0000
> +#define UPCI_STROB_S	0x0001
> +
>  #define INTR_EN_PCI	0x0010
> +#define INTR_EN_UPCI	0x0081
> +
> +#define _UPCI_GPIO	0x54
> +#define _UPCI_QUAD_IN	0x0000
> +#define _UPCI_OCTAL_IN	0x4000
> +
> +#define _UPCI_RING_IND 	0xc0          
>  
>  /***************************************************************************
>  Function: sPCIControllerEOI
> @@ -101,6 +123,40 @@ Return:   Byte_t: The controller interru
>  */
>  #define sPCIGetControllerIntStatus(CTLP) ((rp_readio2(CTLP, 0, _PCI_INT_FUNC) >> 8) & 0x1f)
>  
> +/***************************************************************************
> + *  Returns the state of RI. The following products have RI:  
> + *  UPCI 4/8 port, RP Plus 4/8 port, RP Plus 2 port 232/422.  
> + *  For all other devices, this function returns 0.
> + *
> + *  Returns:  1 if RI is set, else 0.
> + */
> +int sGetChanRI(CHANNEL_T * ChP)
> +{
> +	CONTROLLER_t *CtlP = ChP->CtlP;
> +	int ChanNum = ChP->ChanNum;
> +	int RingInd;
> +
> +	switch (pci_get_device(CtlP->dev)) {
> +	case RP_DEVICE_ID_U32:
> +	case RP_DEVICE_ID_U8PL:
> +	case RP_DEVICE_ID_U16:
> +	case RP_DEVICE_ID_U8QO:
> +		RingInd = !(rp_readio1(CtlP, 0, _UPCI_RING_IND) & rp_sBitMapSetTbl[ChanNum]);
> +		break;
> +	case RP_DEVICE_ID_PL4:
> +	case RP_DEVICE_ID_PL8:
> +	case RP_DEVICE_ID_PL2:
> +	case RP_DEVICE_ID_UP8QO:
> +	case RP_DEVICE_ID_UP2:
> +		RingInd = rp_readch1(ChP, ((ChanNum * 2) + (_CHN_STAT0 + 8))) & DSR_ACT;
> +		break;
> +	default:
> +		RingInd = 0;
> +	}
> +
> +	return RingInd;
> +}
> +
>  static devclass_t rp_devclass;
>  
>  static int rp_pciprobe(device_t dev);
> @@ -115,7 +171,7 @@ static int sPCIInitController( CONTROLLE
>  			       int IRQNum,
>  			       Byte_t Frequency,
>  			       int PeriodicOnly,
> -			       int VendorDevice);
> +			       uint16_t VendorDevice);
>  static rp_aiop2rid_t rp_pci_aiop2rid;
>  static rp_aiop2off_t rp_pci_aiop2off;
>  static rp_ctlmask_t rp_pci_ctlmask;
> @@ -129,12 +185,88 @@ static int
>  rp_pciprobe(device_t dev)
>  {
>  	char *s;
> +	uint16_t	VenDev;
>  
> -	s = NULL;
> -	if (pci_get_vendor(dev) == RP_VENDOR_ID)
> -		s = "RocketPort PCI";
> +	if (num_devices_found >= 4)
> +		return ENXIO;
>  
> +	s = NULL;
> +	if (pci_get_vendor(dev) == RP_VENDOR_ID) {
> +		VenDev = pci_get_device(dev);
> +		switch( VenDev ) {
> +		case RP_DEVICE_ID_4Q:
> +			s = "RocketPort PCI Quad";
> +			break;
> +		case RP_DEVICE_ID_4J:
> +			s = "RocketPort PCI 4J";
> +			break;
> +		case RP_DEVICE_ID_4M:
> +			s = "RocketModem II PCI 4";
> +			break;
> +		case RP_DEVICE_ID_PL4:
> +			s = "RocketPort Plus PCI Quad";
> +			break;
> +		case RP_DEVICE_ID_6M:
> +			s = "RocketModem II PCI 6";
> +			break;
> +		case RP_DEVICE_ID_8O:
> +			s = "RocketPort PCI Octa";
> +			break;
> +		case RP_DEVICE_ID_8J:
> +			s = "RocketPort PCI 8J";
> +			break;
> +		case RP_DEVICE_ID_8I:
> +			s = "RocketPort PCI 8";
> +			break;
> +		case RP_DEVICE_ID_U8PL:
> +			s = "RocketPort Universal PCI 8 Low Profile";
> +			break;
> +		case RP_DEVICE_ID_U8QO:
> +			s = "RocketPort Universal PCI Quad/Octa";
> +			break;
> +		case RP_DEVICE_ID_16I:
> +			s = "RocketPort PCI 16";
> +			break;
> +		case RP_DEVICE_ID_U16:
> +			s = "RocketPort Universal PCI 16";
> +			break;
> +		case RP_DEVICE_ID_32I:
> +			s = "RocketPort PCI 32";
> +			break;
> +		case RP_DEVICE_ID_U32:
> +			s = "RocketPort Universal PCI 32";
> +			break;
> +		case RP_DEVICE_ID_PL8:
> +			s = "RocketPort Plus PCI Octa";
> +			break;
> +		case RP_DEVICE_ID_PL2:
> +			s = "RocketPort Plus PCI 2";
> +			break;
> +		case RP_DEVICE_ID_UP8QO:
> +			s = "RocketPort Plus Universal PCI Quad/Octa";
> +			break;
> +		case RP_DEVICE_ID_UP2:
> +			s = "RocketPort Plus Universal PCI 2";
> +			break;
> +		case RP_DEVICE_ID_UP2SMPTE:
> +			s = "RocketPort Plus Universal PCI 2 SMPTE";
> +			break;
> +		case RP_DEVICE_ID_UP4J:
> +			s = "RocketPort Plus Universal PCI 4J";
> +			break;
> +		case RP_DEVICE_ID_UP8J:
> +			s = "RocketPort Plus Universal PCI 8J";
> +			break;
> +		case RP_DEVICE_ID_UP422QO:
> +			s = "RocketPort Plus Universal PCI 422 Quad/Octa";
> +			break;
> +		default:
> +			s = NULL;
> +			break;
> +		}
> +	}
>  	if (s != NULL) {
> +		num_devices_found++;
>  		device_set_desc(dev, s);
>  		return (BUS_PROBE_DEFAULT);
>  	}
> @@ -150,10 +282,14 @@ rp_pciattach(device_t dev)
>  	CONTROLLER_t	*ctlp;
>  	int	unit;
>  	int	retval;
> -	u_int32_t	stcmd;
> -
> +	uint32_t	stcmd;
> +	uint16_t	VenDev;
> +	
> +	VenDev = pci_get_device(dev);
>  	ctlp = device_get_softc(dev);
>  	bzero(ctlp, sizeof(*ctlp));
> +
> +	ctlp->CtlID = CTLID_0001;	/* controller type 1 */
>  	ctlp->dev = dev;
>  	unit = device_get_unit(dev);
>  	ctlp->aiop2rid = rp_pci_aiop2rid;
> @@ -168,7 +304,11 @@ rp_pciattach(device_t dev)
>  	}
>  
>  	/* The IO ports of AIOPs for a PCI controller are continuous. */
> -	ctlp->io_num = 1;
> +	if (cardIsUPCI(ctlp->dev))	/* if RocketPort UPCI with PLX chip */
> +		ctlp->io_num = 2;	/*  then setup two base addresses */
> +	else
> +		ctlp->io_num = 1;	/*  or just setup one base address */
> +
>  	ctlp->io_rid = malloc(sizeof(*(ctlp->io_rid)) * ctlp->io_num, M_DEVBUF, M_NOWAIT | M_ZERO);
>  	ctlp->io = malloc(sizeof(*(ctlp->io)) * ctlp->io_num, M_DEVBUF, M_NOWAIT | M_ZERO);
>  	if (ctlp->io_rid == NULL || ctlp->io == NULL) {
> @@ -179,15 +319,14 @@ rp_pciattach(device_t dev)
>  
>  	ctlp->bus_ctlp = NULL;
>  
> -	switch (pci_get_device(dev)) {
> -	case RP_DEVICE_ID_UPCI_32:
> -	case RP_DEVICE_ID_UPCI_8O:
> -		ctlp->io_rid[0] = PCIR_BAR(2);
> -		break;
> -	default:
> -		ctlp->io_rid[0] = PCIR_BAR(0);
> -		break;
> +	if (cardIsUPCI(ctlp->dev)) {    /* if RocketPort UPCI with PLX chip */
> +		ctlp->io_rid[0] = 0x18; /*  then setup two base addresses */
> +		ctlp->io_rid[1] = 0x14;
>  	}
> +	else {
> +		ctlp->io_rid[0] = 0x10; /*  or just setup one base address */
> +	}
> +
>  	ctlp->io[0] = bus_alloc_resource_any(dev, SYS_RES_IOPORT,
>  		&ctlp->io_rid[0], RF_ACTIVE);
>  	if(ctlp->io[0] == NULL) {
> @@ -195,7 +334,16 @@ rp_pciattach(device_t dev)
>  		retval = ENXIO;
>  		goto nogo;
>  	}
> -
> +	if (cardIsUPCI(ctlp->dev)) {    /* if RocketPort UPCI with PLX chip */
> +		ctlp->io[1] = bus_alloc_resource(dev, SYS_RES_IOPORT, &ctlp->io_rid[1], 0, ~0, 1, RF_ACTIVE);
> +		/*device_printf(dev, "ioaddr (%x) mapping for RocketPort(UPCI) i
> +s %08x.\n", ctlp->io_rid[1], ctlp->io[1]);*/
> +		if(ctlp->io[1] == NULL) {
> +		device_printf(dev, "ioaddr mapping failed for RocketPort (UPCI).\n");
> +			retval = ENXIO;
> +			goto nogo;
> +		}
> +	}
>  	num_aiops = sPCIInitController(ctlp,
>  				       MAX_AIOPS_PER_BOARD, 0,
>  				       FREQ_DIS, 0, pci_get_device(dev));
> @@ -265,20 +413,74 @@ rp_pcireleaseresource(CONTROLLER_t *ctlp
>  	rp_releaseresource(ctlp);
>  }
>  
> -static int
> +static int 
>  sPCIInitController( CONTROLLER_t *CtlP,
>  		    int AiopNum,
>  		    int IRQNum,
>  		    Byte_t Frequency,
>  		    int PeriodicOnly,
> -		    int VendorDevice)
> +		    uint16_t VendorDevice)
>  {
> -	int		i;
> -
> -	CtlP->CtlID = CTLID_0001;	/* controller release 1 */
> -
> -	sPCIControllerEOI(CtlP);
> +	int		i, AiopChanCnt, gpio_dat;
>  
> +	if (cardIsUPCI(CtlP->dev))	/* if RocketPort UPCI with PLX chip */
> +		rp_writeio2(CtlP, 1, _UPCI_INT_FUNC, 0x0000); /* disable ints */
> +	else		
> +		sPCIControllerEOI(CtlP);
> +
> +	switch( VendorDevice ) {
> +	case RP_DEVICE_ID_4Q:
> +	case RP_DEVICE_ID_4J:
> +	case RP_DEVICE_ID_4M:
> +	case RP_DEVICE_ID_PL4:
> +	case RP_DEVICE_ID_UP4J:
> +		AiopChanCnt = 4;
> +		AiopNum = 1;
> +		break;
> +	case RP_DEVICE_ID_6M:
> +		AiopChanCnt = 6;
> +		AiopNum = 1;
> +		break;
> +	case RP_DEVICE_ID_8O:
> +	case RP_DEVICE_ID_8J:
> +	case RP_DEVICE_ID_8I:
> +	case RP_DEVICE_ID_U8PL:
> +	case RP_DEVICE_ID_U8QO:
> +		AiopNum = 1;
> +		AiopChanCnt = 8;
> +		break;
> +	case RP_DEVICE_ID_16I:
> +	case RP_DEVICE_ID_U16:
> +		AiopNum = 2;
> +		AiopChanCnt = 8;
> +		break;
> +	case RP_DEVICE_ID_32I:
> +	case RP_DEVICE_ID_U32:
> +		AiopNum = 4;
> +		AiopChanCnt = 8;
> +		break;
> +	case RP_DEVICE_ID_PL8:
> +	case RP_DEVICE_ID_UP8J:
> +	case RP_DEVICE_ID_UP8QO:
> +	case RP_DEVICE_ID_UP422QO:
> +		AiopNum = 2;
> +		AiopChanCnt = 4;
> +		break;
> +	case RP_DEVICE_ID_PL2:
> +	case RP_DEVICE_ID_UP2:
> +	case RP_DEVICE_ID_UP2SMPTE:
> +		AiopNum = 1;
> +		AiopChanCnt = 2;
> +		break;
> +	default:
> +		AiopNum = 1;
> +#if notdef
> +      		AiopChanCnt = 8;
> +#else
> +      		AiopChanCnt = sReadAiopNumChan(CtlP, 0);
> +#endif /* notdef */
> +			break;
> +	}
>  	/* Init AIOPs */
>  	CtlP->NumAiop = 0;
>  	for(i=0; i < AiopNum; i++)
> @@ -290,39 +492,24 @@ sPCIInitController( CONTROLLER_t *CtlP,
>  		{
>  			break;				/* done looking for AIOPs */
>  		}
> -
> -		switch( VendorDevice ) {
> -		case RP_DEVICE_ID_4Q:
> -		case RP_DEVICE_ID_4J:
> -		case RP_DEVICE_ID_4M:
> -      			CtlP->AiopNumChan[i] = 4;
> -			break;
> -		case RP_DEVICE_ID_6M:
> -      			CtlP->AiopNumChan[i] = 6;
> -			break;
> -		case RP_DEVICE_ID_8O:
> -		case RP_DEVICE_ID_8J:
> -		case RP_DEVICE_ID_8I:
> -		case RP_DEVICE_ID_16I:
> -		case RP_DEVICE_ID_32I:
> -      			CtlP->AiopNumChan[i] = 8;
> -			break;
> -		default:
> -#if notdef
> -      			CtlP->AiopNumChan[i] = 8;
> -#else
> -      			CtlP->AiopNumChan[i] = sReadAiopNumChan(CtlP, i);
> -#endif /* notdef */
> -			break;
> -		}
> +		if (VendorDevice == RP_DEVICE_ID_U8QO) {  /* if UPCI QUAD/OCTAL board */
> +			gpio_dat = rp_readio2(CtlP, 1, _UPCI_GPIO); /* read GPIO reg */
> +			if (!(gpio_dat & _UPCI_OCTAL_IN)) /*  if quad cable attached, */
> +				AiopChanCnt = 4;	  /*    set for only four channels */
> +		}			
> +		CtlP->AiopNumChan[i] = AiopChanCnt;
>  		/*device_printf(CtlP->dev, "%d channels.\n", CtlP->AiopNumChan[i]);*/
>  		rp_writeaiop2(CtlP, i, _INDX_ADDR,_CLK_PRE);	/* clock prescaler */
> -		/*device_printf(CtlP->dev, "configuring clock prescaler.\n");*/
> -		rp_writeaiop1(CtlP, i, _INDX_DATA,CLOCK_PRESC);
> -		/*device_printf(CtlP->dev, "configured clock prescaler.\n");*/
> +		if (cardIsRocketportPlus(CtlP->dev)) {
> +			rp_writeaiop1(CtlP, i, _INDX_DATA, AB_CLOCK_PRESC);
> +			/*device_printf(CtlP->dev, "configured clock prescaler (%04x = %02x).\n",_CLK_PRE, AB_CLOCK_PRESC);*/
> +		}			
> +		else {
> +			rp_writeaiop1(CtlP, i, _INDX_DATA, CLOCK_PRESC);
> +			/*device_printf(CtlP->dev, "configured clock prescaler (%04x = %02x).\n",_CLK_PRE, CLOCK_PRESC);*/
> +		}			
>  		CtlP->NumAiop++;				/* bump count of AIOPs */
>  	}
> -
>  	if(CtlP->NumAiop == 0)
>  		return(-1);
>  	else
> @@ -355,7 +542,80 @@ rp_pci_aiop2off(int aiop, int offset)
>  static unsigned char
>  rp_pci_ctlmask(CONTROLLER_t *ctlp)
>  {
> -	return sPCIGetControllerIntStatus(ctlp);
> +	int		cmsk;
> +	unsigned char 	cret=0;
> +	
> +	if (cardIsUPCI(ctlp->dev)) {	/* if RocketPort UPCI with PLX chip */
> +		cmsk = rp_readio2(ctlp, 1, _UPCI_GPIO);
> +		if (cmsk & UINTSTAT0)	/* convert PLX int bits to AIOPIC int bits */
> +			cret |= INTSTAT0;
> +		if (cmsk & UINTSTAT1)
> +			cret |= INTSTAT1;
> +		if (cmsk & UINTSTAT2)
> +			cret |= INTSTAT2;
> +		if (cmsk & UINTSTAT3)
> +			cret |= INTSTAT3;
> +		cmsk = rp_readio2(ctlp, 1, _UPCI_INT_FUNC); /* get int active bit */
> +		if (cmsk & UINTACT)
> +			cret |= 0x10;
> +		return cret;
> +	}		
> +	else {
> +		return sPCIGetControllerIntStatus(ctlp);
> +	}			
> +}
> +int 
> +cardIsUPCI(device_t dev)
> +{
> +	uint16_t	VenDev;
> +	int		upci_fnd;
> +	
> +	upci_fnd = FALSE;
> +	VenDev = pci_get_device(dev);
> +	switch( VenDev ) {
> +	case RP_DEVICE_ID_U8PL:
> +	case RP_DEVICE_ID_U8QO:
> +	case RP_DEVICE_ID_U16:
> +	case RP_DEVICE_ID_U32:
> +	case RP_DEVICE_ID_UP8QO:
> +	case RP_DEVICE_ID_UP2:
> +	case RP_DEVICE_ID_UP2SMPTE:
> +	case RP_DEVICE_ID_UP4J:
> +	case RP_DEVICE_ID_UP8J:
> +	case RP_DEVICE_ID_UP422QO:
> +		upci_fnd = TRUE;			/* controller with PLX9030 chip */
> +		break;
> +	default:
> +		upci_fnd = FALSE;
> +		break;
> +	}
> +	return(upci_fnd);
> +}
> +int 
> +cardIsRocketportPlus(device_t dev)
> +{
> +	uint16_t	VenDev;
> +	int		rpl_fnd;
> +	
> +	rpl_fnd = FALSE;
> +	VenDev = pci_get_device(dev);
> +	switch( VenDev ) {
> +	case RP_DEVICE_ID_PL4:
> +	case RP_DEVICE_ID_PL8:
> +	case RP_DEVICE_ID_PL2:
> +	case RP_DEVICE_ID_UP8QO:
> +	case RP_DEVICE_ID_UP2:
> +	case RP_DEVICE_ID_UP2SMPTE:
> +	case RP_DEVICE_ID_UP4J:
> +	case RP_DEVICE_ID_UP8J:
> +	case RP_DEVICE_ID_UP422QO:
> +		rpl_fnd = TRUE;			/* RocketPort Plus board */
> +		break;
> +	default:
> +		rpl_fnd = FALSE;
> +		break;
> +	}
> +	return(rpl_fnd);
>  }
>  
>  static device_method_t rp_pcimethods[] = {
> Index: rpreg.h
> ===================================================================
> RCS file: /usr/local/cvsroot/freebsd/src/sys/dev/rp/rpreg.h,v
> retrieving revision 1.7
> diff -u -p -r1.7 rpreg.h
> --- rpreg.h	6 Jan 2005 01:43:11 -0000	1.7
> +++ rpreg.h	7 Sep 2006 18:19:44 -0000
> @@ -133,6 +133,8 @@ typedef unsigned int DWordIO_t;
>  /* Controller ID numbers */
>  #define CTLID_NULL  -1		    /* no controller exists */
>  #define CTLID_0001  0x0001	    /* controller release 1 */
> +#define CTLID_0002  0x0002	    /* controller with PLX9030 chip */
> +#define CTLID_0003  0x0003	    /* Rocketport Plus board */
>  
>  /* AIOP ID numbers, identifies AIOP type implementing channel */
>  #define AIOPID_NULL -1		    /* no AIOP or channel exists */
> @@ -213,8 +215,11 @@ Channel Register Offsets - Indexed - Int
>  #define _BAUD	    0xFF4    /* Baud Rate		       16  Write */
>  #define _CLK_PRE    0xFF6    /* Clock Prescaler 		8  Write */
>  
> +/************************************************************************
> +        Baud rate divisors using mod 9 clock prescaler and 36.873 clock
> +************************************************************************/
>  #define CLOCK_PRESC 0x19	  /* mod 9 (divide by 10) prescale */
> -
> +#define BRD0              3     /* tps remapped for 57.6KB */
>  #define BRD50		  4607
>  #define BRD75		  3071
>  #define BRD110		  2094
> @@ -238,6 +243,35 @@ Channel Register Offsets - Indexed - Int
>  #define BRD76800	  2
>  #define BRD115200	  1
>  #define BRD230400	  0
> +/************************************************************************
> +        Baud rate divisors using mod 2 clock prescaler and 44.2368 clock
> +************************************************************************/
> +#define AB_CLOCK_PRESC 0x12          /* mod 2 prescale */
> +#define AB_BRD0		     3     /* tps remapped for 57.6KB */
> +#define AB_BRD50             18431
> +#define AB_BRD75             12287
> +#define AB_BRD110            8377
> +#define AB_BRD134            6852 
> +#define AB_BRD150            6143
> +#define AB_BRD200            4607
> +#define AB_BRD300            3071
> +#define AB_BRD600            1535
> +#define AB_BRD1200           767
> +#define AB_BRD1800           511
> +#define AB_BRD2400           383
> +#define AB_BRD4800           191
> +#define AB_BRD7200           127
> +#define AB_BRD9600           95
> +#define AB_BRD14400          63
> +#define AB_BRD19200          47
> +#define AB_BRD28800          31
> +#define AB_BRD38400          23
> +#define AB_BRD57600          15
> +#define AB_BRD76800          11
> +#define AB_BRD115200         7
> +#define AB_BRD230400         3
> +#define AB_BRD460800         2
> +#define AB_BRD921600         0
>  
>  #define STMBREAK   0x08        /* BREAK */
>  #define STMFRAME   0x04        /* framing error */
> @@ -316,6 +350,12 @@ Channel Register Offsets - Indexed - Int
>  #define INTSTAT2  0x04	      /* AIOP 2 interrupt status */
>  #define INTSTAT3  0x08	      /* AIOP 3 interrupt status */
>  
> +#define UINTACT   0x04	      /* UPCI AIOP Interrupt active */
> +#define UINTSTAT0 0x04	      /* UPCI AIOP 0 interrupt status */
> +#define UINTSTAT1 0x20	      /* UPCI AIOP 1 interrupt status */
> +#define UINTSTAT2 0x100	      /* UPCI AIOP 2 interrupt status */
> +#define UINTSTAT3 0x800       /* UPCI AIOP 3 interrupt status */
> +
>  #define INTR_EN   0x08	      /* allow interrupts to host */
>  #define INT_STROB 0x04	      /* strobe and clear interrupt line (EOI) */
>  
> @@ -1004,7 +1044,12 @@ void sEnInterrupts(CHANNEL_T *ChP,Word_t
>  void sDisInterrupts(CHANNEL_T *ChP,Word_t Flags);
>  int rp_attachcommon(CONTROLLER_T *ctlp, int num_aiops, int num_ports);
>  void rp_releaseresource(CONTROLLER_t *ctlp);
> +int cardIsUPCI(device_t dev);
> +int cardIsRocketportPlus(device_t dev);
> +int sGetChanRI(CHANNEL_T * ChP);
>  void rp_untimeout(void);
> +extern int next_unit_number;
> +extern int num_devices_found;
>  
>  #ifndef ROCKET_C
>  extern Byte_t R[RDATASIZE];
> Index: rpvar.h
> ===================================================================
> RCS file: /usr/local/cvsroot/freebsd/src/sys/dev/rp/rpvar.h,v
> retrieving revision 1.8
> diff -u -p -r1.8 rpvar.h
> --- rpvar.h	6 Jan 2005 01:43:11 -0000	1.8
> +++ rpvar.h	7 Sep 2006 18:19:44 -0000
> @@ -63,8 +63,8 @@ struct rp_port {
>  	int			rp_xmit_stopped:1;
>  	CONTROLLER_t *		rp_ctlp;
>  	CHANNEL_t		rp_channel;
> -	unsigned short		TxBuf[TXFIFO_SIZE/2 +1];
> -	unsigned short		RxBuf[RXFIFO_SIZE/2 +1];
> +	unsigned short		TxBuf[TXFIFO_SIZE/2 + 1];
> +	unsigned short		RxBuf[RXFIFO_SIZE/2 + 1];
>  };
>  
>  /* Actually not used */
> 
> This works for me and supports more HW.
> 
> Doug A.
> _______________________________________________
> freebsd-stable at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-stable
> To unsubscribe, send any mail to "freebsd-stable-unsubscribe at freebsd.org"
> 
> 
> %SPAMBLOCK-SYS: Matched [@freebsd.org+], message ok




More information about the freebsd-stable mailing list