Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!munnari.OZ.AU!news.Hawaii.Edu!news.uoregon.edu!hammer.uoregon.edu!hunter.premier.net!www.nntp.primenet.com!nntp.primenet.com!news.bbnplanet.com!cam-news-hub1.bbnplanet.com!news.mathworks.com!uunet!in1.uu.net!news.zipnet.net!usenet From: gunclers@juno.com (Guncler/Loeb) Newsgroups: comp.unix.bsd.freebsd.misc,alt.comp.periphs.mainboard.asus Subject: Re: Problem with com ports on ASUS P55T2P4 (solution)<<I DON'T GET IT Date: Sun, 03 Nov 1996 04:58:57 GMT Organization: ZipLink -- America's Hottest ISP Lines: 122 Message-ID: <327c24ad.5191456@news.ziplink.net> References: <5513ro$2i8@bpeters.uucp> <558fep$18l@adv.IAEhv.nl> Reply-To: gunclers@juno.com NNTP-Posting-Host: ip1-max2-nyc.zipnet.net Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Newsreader: Forte Agent .99f/32.275 Xref: euryale.cc.adfa.oz.au comp.unix.bsd.freebsd.misc:30486 alt.comp.periphs.mainboard.asus:27243 Hmm... sorry, Arjan, I am a newbie when it comes to this stuff. What does one do with what you have written here? Apologies for my ignorance-- Sam On 30 Oct 1996 21:56:57 +0100, devet@adv.IAEhv.nl (Arjan de Vet) wrote: >In article <5513ro$2i8@bpeters.uucp>, >Bruce Peterson <peterson@mail.cyberoptics.com> wrote: > >>I just purchased an ASUS P55T2P4 motherboard (P120) for use with FreeBSD >>2.1.5. I connected my modem (28.8kbps, 38400 dte) to a com port on the >>motherboard, but uucp gave up about 100k into each call, with an error >>message saying "Too many protocol 'i' errors." The received packets arrive >>continuously, and the acks are transmitted regularly, as observed from modem >>LED activity. The second com port on the motherboard exhibited the same >>problem. I put an old ISA i/o board (with a 16550 UART) into the system, >>and uucp went for an hour and a half with no errors. The only other boards >>in the system are an ISA Tseng ET4000 VGA board and an Adaptec 1542 SCSI >>adapter. >> >>Is there a known problem with the UART design on this motherboard, or >>could this be a defective unit? > >Yes, I had exactly the same. The following kernel patch for >sys/i386/isa/sio.c fixes it. > >Arjan > >--- sio.c.2.1.5 Sat Apr 13 17:01:25 1996 >+++ sio.c Tue Oct 15 21:38:27 1996 >@@ -443,7 +443,7 @@ > * XXX what about the UART bug avoided by waiting in comparam()? > * We don't want to to wait long enough to drain at 2 bps. > */ >- outb(iobase + com_cfcr, CFCR_DLAB); >+ outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS); > outb(iobase + com_dlbl, COMBRD(9600) & 0xff); > outb(iobase + com_dlbh, (u_int) COMBRD(9600) >> 8); > outb(iobase + com_cfcr, CFCR_8BITS); >@@ -1601,6 +1601,8 @@ > int cflag; > struct com_s *com; > int divisor; >+ u_char dlbh; >+ u_char dlbl; > int error; > Port_t iobase; > int s; >@@ -1712,8 +1714,18 @@ > > if (divisor != 0) { > outb(iobase + com_cfcr, cfcr | CFCR_DLAB); >- outb(iobase + com_dlbl, divisor & 0xFF); >- outb(iobase + com_dlbh, (u_int) divisor >> 8); >+ /* >+ * Only set the divisor registers if they would change, >+ * since on some 16550 incompatibles (UMC8669F), setting >+ * them while input is arriving them loses sync until >+ * data stops arriving. >+ */ >+ dlbl = divisor & 0xFF; >+ if (inb(iobase + com_dlbl) != dlbl) >+ outb(iobase + com_dlbl, dlbl); >+ dlbh = (u_int) divisor >> 8; >+ if (inb(iobase + com_dlbh) != dlbh) >+ outb(iobase + com_dlbh, dlbh); > } > outb(iobase + com_cfcr, com->cfcr_image = cfcr); > if (!(tp->t_state & TS_TTSTOP)) >@@ -2115,6 +2127,8 @@ > struct siocnstate *sp; > { > int divisor; >+ u_char dlbh; >+ u_char dlbl; > Port_t iobase; > > /* >@@ -2127,12 +2141,22 @@ > outb(iobase + com_ier, 0); /* spltty() doesn't stop siointr() */ > siocntxwait(); > sp->cfcr = inb(iobase + com_cfcr); >- outb(iobase + com_cfcr, CFCR_DLAB); >+ outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS); > sp->dlbl = inb(iobase + com_dlbl); > sp->dlbh = inb(iobase + com_dlbh); >+ /* >+ * Only set the divisor registers if they would change, since on >+ * some 16550 incompatibles (Startech), setting them clears the >+ * data input register. This also reduces the effects of the >+ * UMC8669F bug. >+ */ > divisor = ttspeedtab(comdefaultrate, comspeedtab); >- outb(iobase + com_dlbl, divisor & 0xFF); >- outb(iobase + com_dlbh, (u_int) divisor >> 8); >+ dlbl = divisor & 0xFF; >+ if (sp->dlbl != dlbl) >+ outb(iobase + com_dlbl, dlbl); >+ dlbh = (u_int) divisor >> 8; >+ if (sp->dlbh != dlbh) >+ outb(iobase + com_dlbh, dlbh); > outb(iobase + com_cfcr, CFCR_8BITS); > sp->mcr = inb(iobase + com_mcr); > /* >@@ -2154,9 +2178,11 @@ > */ > siocntxwait(); > iobase = siocniobase; >- outb(iobase + com_cfcr, CFCR_DLAB); >- outb(iobase + com_dlbl, sp->dlbl); >- outb(iobase + com_dlbh, sp->dlbh); >+ outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS); >+ if (sp->dlbl != inb(iobase + com_dlbl)) >+ outb(iobase + com_dlbl, sp->dlbl); >+ if (sp->dlbh != inb(iobase + com_dlbh)) >+ outb(iobase + com_dlbh, sp->dlbh); > outb(iobase + com_cfcr, sp->cfcr); > /* > * XXX damp oscillations of MCR_DTR and MCR_RTS by not restoring them.