From owner-FreeBSD-net-jp@jp.freebsd.org  Wed Apr 29 20:33:15 1998
Received: by jaz.jp.freebsd.org (8.8.8+3.0Wbeta7/8.7.3) id UAA12657
	Wed, 29 Apr 1998 20:33:15 +0900 (JST)
Received: by jaz.jp.freebsd.org (8.8.8+3.0Wbeta7/8.7.3) with ESMTP id UAB12638
	for <FreeBSD-net-jp@jp.freebsd.org>; Wed, 29 Apr 1998 20:33:11 +0900 (JST)
Received: from mxs.meshnet.or.jp (tksm2DS48.tks.mesh.ad.jp [133.205.221.198]) by meshsv88.tk.mesh.ad.jp (8.8.8+2.7Wbeta7/3.5Wpl1-98042414) with ESMTP id UAA29671 for <FreeBSD-net-jp@jp.freebsd.org>; Wed, 29 Apr 1998 20:33:09 +0900 (JST)
Received: foo.bar.org; Wed, 29 Apr 1998 20:33:08 +0900 (JST)
Message-Id: <Lucky.199804291133.UAA00333.Lucky>
To: FreeBSD-net-jp@jp.freebsd.org
From: Shiba <shiba@mxs.meshnet.or.jp>
In-Reply-To: Your message of "Mon, 01 Dec 1997 13:40:38 +0900"
	<Lucky.199712010440.NAA25423.Lucky>
References: <Lucky.199712010440.NAA25423.Lucky>
X-Mailer: Mew version 1.93b27 on XEmacs 20.4 (Emerald)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Date: Wed, 29 Apr 1998 20:33:09 +0900
X-Dispatcher: imput version 010101
Lines: 122
Reply-To: FreeBSD-net-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute [version 2.1 (Alpha) patchlevel=24]
X-Sequence: FreeBSD-net-jp 609
Subject: [FreeBSD-net-jp 609] Re: How to use TA + FBSD as OCN router
Errors-To: owner-FreeBSD-net-jp@jp.freebsd.org
Sender: owner-FreeBSD-net-jp@jp.freebsd.org

>>>>> <Lucky.199712010440.NAA25423.Lucky> $B$G(B

> 	Winbond W83977TF$B$O99$K!"(B926K bps 1,5M bps$B$b;}$C$F$$$k(B
> 	$B$h$&$J$N$G$9$,!"2?=h$+$K(Bdata sheet$B$"$j$^$;$s$+(B?

$B$G!":n@.$7$^$7$?!#J,$+$kJ}$K$O$o$+$j$^$9!#(B(3.0 4/29)

--- i386/isa/sio.c.orig	Wed Apr 29 18:36:58 1998
+++ i386/isa/sio.c	Wed Apr 29 19:53:20 1998
@@ -149,6 +149,32 @@
 #define COM_IIR_TXRDYBUG(dev) ((dev)->id_flags & COM_C_IIR_TXRDYBUG)
 #define	COM_FIFOSIZE(dev)	(((dev)->id_flags & 0xff000000) >> 24)
 
+/* winbond W83977TF */
+#ifdef WINBOND
+#define COM_WIN14(dev) ((dev)->id_flags & 0x40000)
+#define COM_WIN24(dev) ((dev)->id_flags & 0x80000)
+#define ENTER_CRITICAL(port)						\
+	s = spltty();						\
+	disable_intr();						\
+	/* write ini value twice to enter config mode */	\
+	outb(port, 0x87); outb(port, 0x87);
+
+#define EXIT_CRITICAL(port)						\
+	outb(port, 0xaa);	/* exit config mode */	\
+	enable_intr();						\
+	splx(s);
+
+#define INDEX_CR(port,x)	outb(port, x)
+#define WRITE_CR(port,x)	outb(port + 1, x)
+#define READ_CR(port)	inb(port + 1)
+
+#define BASE24M(port) INDEX_CR(port,0xf0);WRITE_CR(port,2);
+#define BASE14M(port) INDEX_CR(port,0xf0);WRITE_CR(port,3);
+
+#define DIVISOR24(x) (x*13)
+#define DIVISOR14(x) (DIVISOR24(x) >> 3)
+#endif
+
 #define	com_scr		7	/* scratch register for 16450-16550 (R/W) */
 
 /*
@@ -408,6 +434,9 @@
 	{ 38400,	COMBRD(38400) },
 	{ 57600,	COMBRD(57600) },
 	{ 115200,	COMBRD(115200) },
+#ifdef WINBOND
+	{ 230400,4},{307200,3},{460800,2},
+#endif
 	{ -1,		-1 }
 };
 
@@ -787,6 +816,7 @@
 	enable_intr();
 
 	result = IO_COMSIZE;
+#if 0
 	for (fn = 0; fn < sizeof failures; ++fn)
 		if (failures[fn]) {
 			outb(iobase + com_mcr, 0);
@@ -795,6 +825,7 @@
 				printf("sio%d: probe test %d failed\n",
 				       dev->id_unit, fn);
 		}
+#endif
 	return (result);
 }
 
@@ -1014,7 +1045,52 @@
 				printf(" lookalike with %d bytes FIFO",
 				    com->tx_fifo_size);
 		}
-
+#ifdef WINBOND
+		{
+		  int s;
+		  u_char id, rev;
+		  u_int wport = 0x3f0;
+		  /* device ID */
+		  ENTER_CRITICAL(wport);
+		  INDEX_CR(wport,0x20);
+		  id = READ_CR(wport);
+		  INDEX_CR(wport,0x21);
+		  rev = READ_CR(wport);
+		  EXIT_CRITICAL(wport);
+		  if (id != 0x97 /*&& rev != 0x73*/)
+		    {
+		      wport = 0x370;
+		      /* device ID */
+		      ENTER_CRITICAL(wport);
+		      INDEX_CR(wport,0x20);
+		      id = READ_CR(wport);
+		      INDEX_CR(wport,0x21);
+		      rev = READ_CR(wport);
+		      EXIT_CRITICAL(wport);
+		    }
+		  if (id == 0x97 /*&& rev == 0x73*/)
+		    {
+		      u_char logical_dev;
+		      logical_dev = (iobase == 0x3f8) ? 2: 3;
+		      ENTER_CRITICAL(wport);
+		      INDEX_CR(wport,7);
+		      WRITE_CR(wport,logical_dev);
+		      if (COM_WIN14(isdp))
+			{
+			  BASE14M(wport);
+		          printf (" Winbond base clock 14MHz");
+			}
+#if 0
+		      if (COM_WIN24(isdp))
+			{
+			  BASE24M(wport);
+		          printf ("base clock 24MHz");
+			}
+#endif
+		      EXIT_CRITICAL(wport);
+		    }
+		}
+#endif
 		break;
 	}
 	
