diff -u --recursive --new-file v2.1.110/linux/Documentation/Configure.help linux/Documentation/Configure.help
--- v2.1.110/linux/Documentation/Configure.help	Tue Jul 21 00:15:29 1998
+++ linux/Documentation/Configure.help	Fri Jul 24 11:10:17 1998
@@ -5,15 +5,19 @@
 # development kernels and need not be completely stable.
 #
 # Translations of this file available on the WWW:
+#
 #   - http://jf.gee.kyoto-u.ac.jp/JF/JF-ftp/euc/Configure.help.euc
 # is a Japanese translation, maintained by Tetsuyasu YAMADA
-# (tetsu@cauchy.nslab.ntt.jp). 
+# (tetsu@cauchy.nslab.ntt.co.jp).
 #   - http://nevod.perm.su/service/linux/doc/kernel/Configure.help 
 # is a Russian translation, maintained by kaf@linux.nevod.perm.su.
 #   - http://www.linux-kheops.com/traduc/kernels/
 # has a French translation of the whole kernel, including
 # Configure.help. This is maintained by David Bourgin
 # (dbourgin@wsc.com). 
+#   - http://visar.csustan.edu/~carlos/ contains Spanish translations 
+# of the 2.0 kernel documentation files, produced by Carlos Perelló 
+# Marín (fperllo@ehome.encis.es). 
 #   - ftp://ftp-pavia1.linux.it/pub/linux/Configure.help
 # is a work-in-progress effort of the Italian translation team,
 # currently only for the 2.0 version of this file, maintained 
@@ -31,7 +35,7 @@
 # Documentation/Changes. Make sure to read the toplevel kernel README 
 # file as well.
 #
-# Format of this file: description<nl>variable<nl>helptext<nl><nl>. If
+# Format of this file: description<nl>variable<nl>help text<nl><nl>. If
 # the question being documented is of type "choice", we list only the
 # first occurring config variable. The help texts may contain empty
 # lines, but every non-empty line must be indented two positions.
@@ -152,36 +156,58 @@
 
 Loop device support
 CONFIG_BLK_DEV_LOOP
-  Saying Y here will allow you to mount a file as a file system. This
-  is useful if you want to check an ISO9660 file system before burning
-  the CD, or if you want to use floppy images without first writing
-  them to floppy.
+  Saying Y here will allow you to use a regular file as a block
+  device; you can then create a file system on that block device and
+  mount it just as you would mount other block devices such as hard drive
+  partitions, CDROM drives or floppy drives.
+
+  This is useful if you want to check an ISO 9660 file system before
+  burning the CD, or if you want to use floppy images without first
+  writing them to floppy.
+
+  The loop device driver can also be used to "hide" a filesystem in a
+  disk partition, floppy, or regular file, either using encryption
+  (scrambling the data) or steganography (hiding the data in the low
+  bits of, say, a sound file). This is also safe if the file resides
+  on a remote file server. If you want to do this, you will first have
+  to acquire and install a kernel patch from
+  ftp://ftp.replay.com/pub/crypto/linux/all, and then you need to say
+  Y to this option.
 
-  This option also allows you to mount a filesystem with encryption.
-  (Note that an alternative way to encrypt filesystems is provided by
+  Note that alternative ways use encrypted filesystems are provided by
   the cfs package, which can be gotten via FTP (user: anonymous) from
-  ftp://ftp.replay.com/pub/crypto/disk).
-
-  To use the loop device, you need a recent version of mount
-  (available via FTP (user: anonymous) from
+  ftp://ftp.replay.com/pub/crypto/disk/, and the newer tcfs package,
+  available at http://tcfs.dia.unisa.it/. These do not require any
+  kernel support and you can say N here if you want to use one of
+  them.
+
+  To use the loop device, you need the losetup utility and a recent
+  version of the mount program, both contained in the util-linux
+  package (available via FTP (user: anonymous) from
   ftp://ftp.win.tue.nl/pub/linux/util/).
 
   Note that this loop device has nothing to do with the loopback
   device used for network connections from the machine to itself.
 
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called loop.o.
+
   Most users will answer N here.
 
 Network Block Device support
 CONFIG_BLK_DEV_NBD
-  Saying Y here will allow your computer to serve as a client for
-  network block devices - it will be able to use block devices
-  exported by servers (mount filesystems on them etc.). Communication
-  between client and server works over TCP/IP networking, but to the
-  client program this is hidden: it looks like a regular local file
-  access to a special file such as /dev/nd0. It also allows you to run
-  a block-device in userland (making server and client physically the
-  same computer, communicating using the loopback network device). 
-  Read Documentation/nbd.txt for details.
+  Saying Y here will allow your computer to be a client for network
+  block devices - it will be able to use block devices exported by
+  servers (mount filesystems on them etc.). Communication between
+  client and server works over TCP/IP networking, but to the client
+  program this is hidden: it looks like a regular local file access to
+  a special file such as /dev/nd0. It also allows you to run a
+  block-device in userland (making server and client physically the
+  same computer, communicating using the loopback network device).
+  Read Documentation/nbd.txt for more information, especially about
+  where to find the server code.
 
   Note that this has nothing to do with the network file system NFS;
   you can say N here even if you intend to use NFS.
@@ -268,7 +294,7 @@
   along with other IDE devices, as "hdb" or "hdc", or something
   similar (check the boot messages with dmesg). If this is your only
   CDROM drive, you can say N to all other CDROM options, but be sure
-  to say Y to "ISO9660 cdrom filesystem support".
+  to say Y or M to "ISO 9660 CDROM filesystem support".
 
   Read the CDROM-HOWTO, available via FTP (user: anonymous) in
   ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO and the file
@@ -561,8 +587,8 @@
   must also have at least one parallel port protocol driver in your
   system. Among the devices supported by this driver are the
   MicroSolutions backpack CD-ROM drives and the Freecom Power CD. If
-  you have such a CD-ROM drive, you should also say Y to "ISO9660
-  cdrom filesystem support" below, because that's the filesystem used
+  you have such a CD-ROM drive, you should also say Y or M to "ISO 9660
+  CDROM filesystem support" below, because that's the filesystem used
   on CDROMs.
 
 Parallel port ATAPI disks
@@ -582,7 +608,7 @@
   This option enables the high-level driver for ATAPI tape devices
   connected through a parallel port.  If you chose to build PARIDE
   support into your kernel, you may answer Y here to build in the
-  parallel port ATAPI tape driver, otherwise you should answer M
+  parallel port ATAPI disk driver, otherwise you should answer M
   to build it as a loadable module.  The module will be called pt.o.
   You must also have at least one parallel port protocol driver in
   your system.  Among the devices supported by this driver is the
@@ -670,20 +696,20 @@
   adapter that is used in some portable hard drives.  If you chose to 
   build PARIDE support into your kernel, you may answer Y here to 
   build in the protocol driver, otherwise you should answer M to 
-  build it as a loadable module.  The module will be called fit2.o.
+  build it as a loadable module.  The module will be called ktti.o.  
   You must also have a high-level driver for the type of device 
   that you want to support.
 
 FIT TD-3000 protocol
 CONFIG_PARIDE_FIT3
-  This option enables support for the TD-3000 parallel port IDE protocol
-  from Fidelity International Technology. This protocol is used in newer
-  models of their portable disk, CD-ROM and PD/CD devices.   If you chose
-  to build PARIDE support into your kernel, you may answer Y here to
-  build in the protocol driver, otherwise you should answer M to
-  build it as a loadable module.  The module will be called fit3.o.
-  You must also have a high-level driver for the type of device
-  that you want to support.
+  This option enables support for the TD-3000 parallel port IDE
+  protocol from Fidelity International Technology. This protocol is
+  used in newer models of their portable disk, CD-ROM and PD/CD
+  devices. If you chose to build PARIDE support into your kernel, you
+  may answer Y here to build in the protocol driver, otherwise you
+  should answer M to build it as a loadable module. The module will be
+  called fit3.o. You must also have a high-level driver for the type
+  of device that you want to support.
 
 FreeCom power protocol
 CONFIG_PARIDE_FRPW 
@@ -830,24 +856,6 @@
   after the ADFS partition.  You are probably using this system, so
   you should say Y here.
 
-IDE card support
-CONFIG_BLK_DEV_IDE_CARDS
-  On Acorn systems, enable this if you wish to use an IDE interface
-  expansion card. If you do not or are unsure, say N to this.
-
-ICS IDE interface
-CONFIG_BLK_DEV_IDE_ICS
-  On Acorn systems, enable this if you wish to use the ICS IDE
-  interface card.  This is not required for ICS partition support.
-  If you are unsure, say N to this.
-
-ADFS partition support
-CONFIG_BLK_DEV_PART
-  This allows Linux on Acorn systems to determine its partitions in
-  the 'non-ADFS' partition area of the hard disk - usually located
-  after the ADFS partition.  You are probably using this system, so
-  you should enable it.
-
 Boot support (linear, striped)
 CONFIG_MD_BOOT
   To boot with an initial linear or striped md device you have to say
@@ -906,7 +914,7 @@
 
 Support for DECstation
 CONFIG_DECSTATION
-  The DECStation 3100 (with a MIPS R2000 series CPU) and DECStation
+  The DECstation 3100 (with a MIPS R2000 series CPU) and DECstation
   5000/xxx (MIPS R3000 series CPU) are also sometimes labeled
   PMAX. They often run the Ultrix operating system. To compile a Linux
   kernel that runs on these, say Y here. For details about Linux on
@@ -1030,13 +1038,13 @@
 
 Sun floppy controller support
 CONFIG_BLK_DEV_SUNFD
-  This is support for floppy drives on Sun Sparc workstations. Say Y
+  This is support for floppy drives on Sun SPARC workstations. Say Y
   if you have a floppy drive, otherwise N. Easy.
 
 Alpha system type
 CONFIG_ALPHA_AVANTI
   Find out what type of Alpha motherboard you have. You will probably
-  want to read the Linux/Alpha homepage on the WWW at
+  want to read the Linux/Alpha home page on the WWW at
   http://www.azstarnet.com/~axplinux/ (to browse the WWW, you need to
   have access to a machine on the Internet that has a program like
   lynx or netscape) and also the Alpha-HOWTO, available via FTP (user:
@@ -1400,7 +1408,7 @@
 Solaris binary emulation
 CONFIG_SOLARIS_EMUL
   This is experimental code which will enable you to run (many)
-  Solaris binaries on your Sparc Linux machine.  
+  Solaris binaries on your SPARC Linux machine.  
 
   This code is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -1438,6 +1446,12 @@
 
   If you don't know what to do, choose "386".
 
+VGA text console
+CONFIG_VGA_CONSOLE
+  Saying Y here will allow you to use Linux in text mode through a
+  display that complies with the generic VGA standard. Virtually
+  everyone wants that. Say Y.
+
 Video mode selection support
 CONFIG_VIDEO_SELECT
   This enables support for text mode selection on kernel startup. If
@@ -1453,6 +1467,102 @@
   Documentation/svga.txt for more information about the Video mode
   selection support. If unsure, say N.
 
+Support for frame buffer devices (EXPERIMENTAL)
+CONFIG_FB
+  The frame buffer device provides an abstraction for the graphics
+  hardware. It represents the frame buffer of some video hardware and
+  allows application software to access the graphics hardware through
+  a well-defined interface, so the software doesn't need to know
+  anything about the low-level (hardware register) stuff. This works
+  across the different architectures supported by Linux and makes the
+  implementation of application programs easier and more portable; at
+  this point, an X server exists which uses the frame buffer device
+  exclusively.
+
+  The device is accessed through special device nodes, usually located
+  in the /dev directory, i.e. /dev/fb*.
+
+  Please read the file Documentation/fb/framebuffer.txt for more
+  information.
+
+  If you want to play with it, say Y here and to the driver for your
+  graphics board, below. If unsure, say N.
+
+Open Firmware frame buffer device support 
+CONFIG_FB_OF
+  Say Y if you want support with Open Firmware for your graphics board.
+
+S3 Trio frame buffer device support 
+CONFIG_FB_S3TRIO
+  If you have a S3 Trio say Y. Say N for S3 Virge. 
+
+ATI Mach64 display support
+CONFIG_FB_ATY
+  This driver supports graphics boards with the ATI Mach64 chips.
+
+VGA chipset support (text only)
+CONFIG_FB_VGA
+  This is the frame buffer device driver for generic VGA chips. This
+  driver works only in text mode; if you want graphics mode, say Y to
+  "VESA VGA graphics console" as well.
+
+TGA frame buffer support' 
+CONFIG_FB_TGA
+  This is the frame buffer device driver for generic TGA graphic cards.
+  Say Y if you have one of those.
+
+VESA VGA graphics console
+CONFIG_FB_VESA
+  This is the frame buffer device driver for generic VESA graphic cards.
+  Please read Documentation/fb/vesafb.txt.
+
+MDA dual-headed support
+CONFIG_FB_MDA
+  Say Y here if you have an old MDA or monochrome Hercules graphics
+  adapter in your system acting as a second head ( = video card).  Do 
+  not enable this driver if your MDA card is the primary card in your
+  system; the normal VGA driver will handle it.
+  
+  This driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want).
+  The module will be called mdafb.o.  If you want to compile it as
+  a module, say M here and read Documentation/modules.txt.
+  
+  If unsure, say N.
+
+###
+### Somebody please explain the following options
+###
+# Virtual Frame Buffer support (ONLY FOR TESTING!)
+# CONFIG_FB_VIRTUAL
+#
+# Advanced low level driver options
+# CONFIG_FBCON_ADVANCED
+#
+# Monochrome support
+# CONFIG_FBCON_MFB
+#
+# 2 bpp packed pixels support
+# CONFIG_FBCON_CFB2
+#
+# 4 bpp packed pixels support
+# CONFIG_FBCON_CFB4
+#
+# 8 bpp packed pixels support
+# CONFIG_FBCON_CFB8
+#
+# 16 bpp packed pixels support
+# CONFIG_FBCON_CFB16
+#
+# 24 bpp packed pixels support
+# CONFIG_FBCON_CFB24
+#
+# 32 bpp packed pixels support
+# CONFIG_FBCON_CFB32
+#
+# VGA characters/attributes support
+# CONFIG_FBCON_VGA
+
 Parallel-port support
 CONFIG_PARPORT
   If you want to use devices connected to your machine's parallel port
@@ -1702,27 +1812,65 @@
 
 IP: firewalling
 CONFIG_IP_FIREWALL
-  Complete rewrite of IP firewalling support.  Requires new ipfwadm.
-  This was previously called CONFIG_IP_FIREWALL_CHAINS in patch sets
-  released by the author, but now it is and will be the standard
-  firewalling implementation for 2.1.x and onward.
-
-  More powerful than the old IP firewalling but also provides similar
-  structure to original firewalling for experienced users.  IP
-  accounting and packet logging are automatically included with firewall
-  chains.  See
-  http://www.adelaide.net.au/~rustcorp for new ipfwadm (called ipchains).
+  If you want to configure your Linux box as a packet filter firewall
+  for a local TCP/IP based network, say Y here. You may want to read
+  the FIREWALL-HOWTO, available via FTP (user: anonymous) in
+  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
+
+  Also, you will need the ipchains tool (available on the WWW at
+  http://www.adelaide.net.au/~rustcorp/) to allow selective blocking
+  of Internet traffic based on type, origin and destination. 
+  Note that the Linux firewall code has changed and the old program
+  called ipfwadm won't work anymore.
+
+  The type of firewall provided by ipchains and this kernel support is
+  called a "packet filter". The other type of firewall, a
+  "proxy-based" one, is more secure but more intrusive and more
+  bothersome to set up; it inspects the network traffic much more
+  closely, modifies it and has knowledge about the higher level
+  protocols, which a packet filter lacks. Moreover, proxy-based
+  firewalls often require changes to the programs running on the local
+  clients. Proxy-based firewalls don't need support by the kernel, but
+  they are often combined with a packet filter, which only works if
+  you say Y here.
+
+  The firewalling code will only work if IP forwarding is enabled in
+  your kernel. You can do that by saying Y to "/proc filesystem
+  support" and "Sysctl support" below and executing the line
+
+    echo "1" > /proc/sys/net/ipv4/ip_forward
+
+  at boot time after the /proc filesystem has been mounted.  
+
+  You need to say Y to "IP firewalling" in order to be able to use IP
+  masquerading (masquerading means that local computers can chat with
+  an outside host, but that outside host is made to think that it is
+  talking to the firewall box -- makes the local network completely
+  invisible to the outside world and avoids the need to allocate
+  globally valid IP host addresses for the machines on the local net)
+  and IP packet logging and accounting (keeping track of what is using
+  all your network bandwidth) and IP transparent proxying (makes the
+  computers on the local network think they're talking to a remote
+  computer, while in reality the traffic is redirected by your Linux
+  firewall to a local proxy server).
+
   If in doubt, say N here.
 
 IP: firewall packet netlink device
 CONFIG_IP_FIREWALL_NETLINK
-  If you say Y here, then packets which hit your Linux firewall can
-  be copied to optional user space monitoring software that can then
-  respond accordingly: see the ipchains source distributions for an
-  example if this.  To use this, you need to create a character
-  special file under /dev with major number 36 and minor number 3
-  using mknod ("man mknod"), and you need (to write) a program that
-  reads from that device and takes appropriate action.
+  If you say Y here and then packets hit your Linux firewall and are
+  blocked, the first 128 bytes of each such packet are passed on to
+  optional user space monitoring software that can then look for
+  attacks and take actions such as paging the administrator of the
+  site. 
+
+  To use this, you need to create a character special file under /dev
+  with major number 36 and minor number 3 using mknod ("man mknod"),
+  and you need (to write) a program that reads from that device and
+  takes appropriate action.
+
+  With the ipchains tool you can specify which packets you want to go
+  to this device, as well as how many bytes from each packet.
 
 IP: kernel level autoconfiguration
 CONFIG_IP_PNP
@@ -1842,7 +1990,7 @@
   If you say Y here, you should also say Y to "IP: always defragment",
   below. If you say Y here, then the modules ip_masq_ftp.o (for ftp
   transfers through the firewall), ip_masq_irc.o (for irc chats
-  through the firewall), and ip_masq_raudio.o (for realaudio downloads
+  through the firewall), and ip_masq_raudio.o (for RealAudio downloads
   through the firewall) will automatically be compiled. Modules are
   pieces of code which can be inserted in and removed from the running
   kernel whenever you want; read Documentation/modules.txt for
@@ -1917,10 +2065,10 @@
   you might also want to say Y here, to have a more reliable firewall
   (otherwise second and further fragments will always be accepted by
   the firewall). When using "IP: transparent proxying", this option is
-  implicit, although it is safe to say Y here. Do not say Y to this
-  option except when running either a firewall that is the sole link
-  to your network or a transparent proxy. Never ever say Y to this for
-  a normal router or host.
+  implicit, although it is safe to say Y here. Only say Y here if
+  running either a firewall that is the sole link to your network or a
+  transparent proxy; never ever say Y here for a normal router or
+  host.
 
 IP: aliasing support
 CONFIG_IP_ALIAS
@@ -1996,8 +2144,8 @@
   Y here; you'll then have to run the program rarp ("man rarp") on
   your box.
 
-  If you actually want to use a diskless Sun 3 machine as an Xterminal
-  to Linux, say Y here and fetch Linux-Xkernel from
+  If you actually want to use a diskless Sun 3 machine as an X
+  terminal to Linux, say Y here and fetch Linux-Xkernel from
   ftp://sunsite.unc.edu/pub/Linux/system/network/boot.net/.
 
   Superior solutions to the problem of booting and configuring
@@ -2175,7 +2323,7 @@
 CONFIG_IPX_INTERN
   Every IPX network has an address that identifies it. Sometimes it is
   useful to give an IPX "network" address to your Linux box as well
-  (for example if your box is acting as a fileserver for different IPX
+  (for example if your box is acting as a file server for different IPX
   networks: it will then be accessible from everywhere using the same
   address).  The way this is done is to create a virtual internal
   "network" inside your box and to assign an IPX address to this
@@ -2216,19 +2364,19 @@
   The module will be called af_spx.o. If you want to compile it as a
   module, say M here and read Documentation/modules.txt.
 
-Appletalk DDP
+AppleTalk DDP
 CONFIG_ATALK
-  Appletalk is the way Apple computers speak to each other on a
+  AppleTalk is the way Apple computers speak to each other on a
   network. If your Linux box is connected to such a network and you
   want to join the conversation, say Y. You will need to use the
   netatalk package so that your Linux box can act as a print and file
-  server for Macs as well as access Appletalk printers. Check out
+  server for Macs as well as access AppleTalk printers. Check out
   http://threepio.hitchcock.org/cgi-bin/faq/netatalk/faq.pl on the WWW
   for details (to browse the WWW, you need to have access to a machine
   on the Internet that has a program like lynx or netscape). EtherTalk
-  is the name used for Appletalk over Ethernet and the cheaper and
-  slower LocalTalk is appletalk over a proprietary apple network using
-  serial links. Ethertalk and Localtalk are fully supported by Linux.
+  is the name used for AppleTalk over Ethernet and the cheaper and
+  slower LocalTalk is AppleTalk over a proprietary apple network using
+  serial links. EtherTalk and LocalTalk are fully supported by Linux.
   The NET-2-HOWTO, available via FTP (user: anonymous) in
   ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO contains valuable
   information as well.
@@ -2243,14 +2391,14 @@
   the GNU boycott of Apple is over, so even politically correct people
   are allowed to say Y here.
 
-Appletalk-IP driver support
+AppleTalk-IP driver support
 CONFIG_IPDDP
-  This allows IP networking for users who only have Appletalk
+  This allows IP networking for users who only have AppleTalk
   networking available.  This feature is experimental. With this
-  driver, you can either encapsulate IP inside Appletalk (e.g. if your
-  Linux box is stuck on an Appletalk only network) or decapsulate
+  driver, you can either encapsulate IP inside AppleTalk (e.g. if your
+  Linux box is stuck on an AppleTalk only network) or decapsulate
   (e.g. if you want your Linux box to act as an Internet gateway for a
-  zoo of appletalk connected Macs). You decide which one of the two
+  zoo of AppleTalk connected Macs). You decide which one of the two
   you want in the following two questions; you can say Y to only one
   of them. Please see Documentation/networking/ipddp.txt for more
   information.
@@ -2260,23 +2408,23 @@
   The module is called ipddp.o. If you want to compile it as a module,
   say M here and read Documentation/modules.txt.
 
-IP to Appletalk-IP Encapsulation support
+IP to AppleTalk-IP Encapsulation support
 CONFIG_IPDDP_ENCAP
   If you say Y here, the kernel will be able to encapsulate IP packets
-  inside Appletalk frames; this is useful if your Linux box is stuck
-  on an Appletalk network (which hopefully contains a decapsulator
+  inside AppleTalk frames; this is useful if your Linux box is stuck
+  on an AppleTalk network (which hopefully contains a decapsulator
   somewhere). Please see Documentation/networking/ipddp.txt for more
-  information. If you say Y here, you cannot say Y to "Appletalk-IP to
+  information. If you say Y here, you cannot say Y to "AppleTalk-IP to
   IP Decapsulation support", below.
 
-Appletalk-IP to IP Decapsulation support
+AppleTalk-IP to IP Decapsulation support
 CONFIG_IPDDP_DECAP
   If you say Y here, the kernel will be able to decapsulate
-  Appletalk-IP frames to IP packets; this is useful if you want your
-  Linux box to act as an Internet gateway for an Appletalk
+  AppleTalk-IP frames to IP packets; this is useful if you want your
+  Linux box to act as an Internet gateway for an AppleTalk
   network. Please see Documentation/networking/ipddp.txt for more
   information. If you say Y here, you cannot say Y to "IP to
-  Appletalk-IP Encapsulation support", above.
+  AppleTalk-IP Encapsulation support", above.
 
 Apple/Farallon LocalTalk PC card support
 CONFIG_LTPC
@@ -2292,7 +2440,7 @@
   This allows you to use COPS AppleTalk cards to connect to LocalTalk
   networks. You also need version 1.3.3 or later of the netatalk
   package.  This driver is experimental, which means that it may not
-  work.  This driver will only work if you choose "Appletalk DDP"
+  work.  This driver will only work if you choose "AppleTalk DDP"
   networking support, above.
   Please read the file Documentation/networking/cops.txt. 
 
@@ -2328,11 +2476,11 @@
   use a low speed TNC (a Terminal Node Controller acts as a kind of
   modem connecting your computer's serial port to your radio's
   microphone input and speaker output) supporting the KISS protocol or
-  one of the various SCC cards that are supported by the Ottawa PI,
-  the Gracilis Packetwin or the generic Z8530 driver. Another option
-  are the Baycom modem serial and parallel port hacks or the sound card
-  modem (supported by their own drivers). If you say Y here, you also
-  have to say Y to one of those drivers. 
+  one of the various SCC cards that are supported by the generic Z8530
+  or the DMA SCC driver. Another option are the Baycom modem serial
+  and parallel port hacks or the sound card modem (supported by their
+  own drivers). If you say Y here, you also have to say Y to one of
+  those drivers.
 
   Information about where to get supporting software for Linux amateur
   radio as well as information about how to configure an AX.25 port is
@@ -2450,34 +2598,36 @@
 
 High-speed (DMA) SCC driver for AX.25
 CONFIG_DMASCC
-  This is a driver for high-speed SCC boards (used to connect your
-  computer to your amateur radio and send Internet traffic over the
-  radio), i.e. those supporting DMA on one port. Currently, only
-  Ottawa PI/PI2 boards (see http://hydra.carleton.ca/info/pi2.html)
-  and Gracilis PackeTwin boards (see http://www.paccomm.com/; to
-  browse the WWW, you need to have access to a machine on the Internet
-  that has a program like lynx or netscape) are supported and detected
-  automatically.
-
-  If you have one of these cards, you can say Y here and should read
-  the HAM-HOWTO, available via FTP (user: anonymous) in
-  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
+  This is a driver for high-speed SCC boards, i.e. those supporting
+  DMA on one port. You usually use those boards to connect your
+  computer to an amateur radio modem (such as the WA4DSY 56kbps
+  modem), in order to send and receive AX.25 packet radio network
+  traffic.
+
+  Currently, this driver supports Ottawa PI/PI2
+  (http://hydra.carleton.ca/info/pi2.html) and Gracilis PackeTwin
+  (http://www.paccomm.com/) boards. They are detected automatically.
+  If you have one of these cards, say Y here and read the HAM-HOWTO,
+  available via FTP (user: anonymous) in
+  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/.
 
-  This driver operates multiple boards simultaneously. If you compile
-  this driver as a module, it will be called dmascc.o. If you don't
-  give any parameter to the driver, all possible I/O addresses are
-  probed. This could irritate other devices that are currently not in
-  use. You may specify the list of addresses to be probed by
-  "dmascc=addr1,addr2,..." (when compiled into the kernel image) or
-  "io=addr1,addr2,..." (when loaded as a module). The network
+  This driver can operate multiple boards simultaneously. If you compile
+  it as a module (by saying M instead of Y), it will be called dmascc.o.
+  If you don't pass any parameter to the driver, all possible I/O
+  addresses are probed. This could irritate other devices that are
+  currently not in use. You may specify the list of addresses to be
+  probed by "dmascc=addr1,addr2,..." (when compiled into the kernel
+  image) or "io=addr1,addr2,..." (when loaded as a module). The network
   interfaces will be called dmascc0 and dmascc1 for the board detected
-  first, dmascc2 and dmascc3 for the second one, and so on. Before you
-  configure each interface with ifconfig, you MUST set certain
-  parameters, such as channel access timing, clock mode, and DMA
-  channel. This is accomplished with a small utility program called
-  dmascc_cfg, which is part of the ax25-utils package. Alternatively,
-  you may download the utility from
-  http://www.oevsv.at/~oe1kib/Linux.html.
+  first, dmascc2 and dmascc3 for the second one, and so on. 
+
+  Before you configure each interface with ifconfig, you MUST set
+  certain parameters, such as channel access timing, clock mode, and
+  DMA channel. This is accomplished with a small utility program,
+  dmascc_cfg, available at
+  http://www.nt.tuwien.ac.at/~kkudielk/Linux/. (To browse the WWW, you
+  need to have access to a machine on the Internet that has a program
+  like lynx or netscape).
 
 Z8530 SCC driver for AX.25
 CONFIG_SCC
@@ -2520,10 +2670,10 @@
   say M here and read Documentation/modules.txt. This is recommended.
   The module will be called baycom_par.o.
 
-BAYCOM epp driver for AX.25
+BAYCOM EPP driver for AX.25
 CONFIG_BAYCOM_EPP
   This is a driver for Baycom style simple amateur radio modems that
-  connect to a parallel interface. The driver supports the epp
+  connect to a parallel interface. The driver supports the EPP
   designs. To configure the driver, use the sethdlc utility available
   in the standard ax25 utilities package. For information on the
   modems, see http://www.baycom.de (to browse the WWW, you need to
@@ -2576,7 +2726,7 @@
 
 Sound card modem driver for AX.25
 CONFIG_SOUNDMODEM
-  This experimental driver allows a standard SoundBlaster or
+  This experimental driver allows a standard Sound Blaster or
   WindowsSoundSystem compatible sound card to be used as a packet radio
   modem (NOT as a telephone modem!), to send digital traffic over
   amateur radio. 
@@ -2594,11 +2744,11 @@
   say M here and read Documentation/modules.txt. This is recommended.
   The module will be called soundmodem.o.
 
-Sound card modem support for SoundBlaster and compatible cards
+Sound card modem support for Sound Blaster and compatible cards
 CONFIG_SOUNDMODEM_SBC
-  This option enables the soundmodem driver to use SoundBlaster and
+  This option enables the soundmodem driver to use Sound Blaster and
   compatible cards. If you have a dual mode card (i.e. a WSS cards
-  with a SoundBlaster emulation) you should say N here and Y to
+  with a Sound Blaster emulation) you should say N here and Y to
   "Sound card modem support for WSS and Crystal cards", below, because
   this usually results in better performance. This option also supports
   SB16/32/64 in full duplex mode.
@@ -2791,11 +2941,14 @@
   If you want to use a SCSI hard disk, SCSI tape drive, SCSI CDROM or
   any other SCSI device under Linux, say Y and make sure that you know
   the name of your SCSI host adapter (the card inside your computer
-  that "speaks" the SCSI protocol), because you will be asked for
-  it. You also need to say Y here if you want support for the parallel
-  port version of the 100MB IOMEGA ZIP drive. Please read the
-  SCSI-HOWTO, available via FTP (user: anonymous) in
-  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.  
+  that "speaks" the SCSI protocol, also called SCSI controller),
+  because you will be asked for it. 
+
+  You also need to say Y here if you want support for the parallel
+  port version of the 100MB IOMEGA ZIP drive.
+
+  Please read the SCSI-HOWTO, available via FTP (user: anonymous) in
+  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -2824,7 +2977,7 @@
 
 SCSI tape support
 CONFIG_CHR_DEV_ST
-  If you want to use a SCSI tapedrive under Linux, say Y and read the
+  If you want to use a SCSI tape drive under Linux, say Y and read the
   SCSI-HOWTO, available via FTP (user: anonymous) in
   ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO and
   drivers/scsi/README.st in the kernel source. This is NOT for SCSI
@@ -2840,8 +2993,8 @@
 CONFIG_BLK_DEV_SR
   If you want to use a SCSI CDROM under Linux, say Y and read the
   SCSI-HOWTO and the CDROM-HOWTO from
-  sunsite.unc.edu:/pub/Linux/docs/HOWTO. Also make sure to say Y to
-  "ISO9660 cdrom filesystem support" later. 
+  sunsite.unc.edu:/pub/Linux/docs/HOWTO. Also make sure to say Y or M 
+  to "ISO 9660 CDROM filesystem support" later. 
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -2984,7 +3137,7 @@
 CONFIG_OVERRIDE_CMDS
   Say Y here if you want to override the default maximum number of
   commands that a single device on the aic7xxx controller is allowed
-  to have active at one time. This option only effects tagged queueing
+  to have active at one time. This option only affects tagged queueing
   capable devices. The driver uses a "failsafe" value of 8 by default.
   This is much lower than many devices can handle, but left in place
   for safety's sake. If you say Y here, you can adjust the number of
@@ -3221,46 +3374,59 @@
 CONFIG_SCSI_NCR53C8XX
   This is the BSD ncr driver adapted to linux for the NCR53C8XX family
   of PCI-SCSI controllers. This driver supports parity checking,
-  tagged command queuing and fast synchronous data transfers up to 80 MB/s 
-  with wide FAST-40 LVD devices and controllers.
+  tagged command queuing and fast synchronous data transfers up to 80
+  MB/s with wide FAST-40 LVD devices and controllers.
+
   The NCR53C860 and NCR53C875 support FAST-20 transfers. The NCR53C895 
   supports FAST-40 transfers with Ultra2 LVD devices.
+
   Please read drivers/scsi/README.ncr53c8xx for more information.
 
 synchronous data transfers frequency
 CONFIG_SCSI_NCR53C8XX_SYNC
-  The SCSI Parallel Interface-2 Standard defines 4 classes of transfer 
-  rates: FAST-5, FAST-10, FAST-20 and FAST-40. The numbers are respectively 
-  the maximum data transfer rates in mega-transfers per second for each 
-  class. For example, a FAST-20 Wide 16 device is able to transfer data 
-  at up to 40 MB/s. 
-  You may specify 0 if you want to only use asynchronous data transfers.
-  Otherwise, specify a value between 5 and 40, depending on the capability  
-  of your SCSI controller. Note that 40 should normally be ok since the 
-  driver narrows the value according to controllers capabilities.
-  This option has no effect for adapters with NVRAM, since the driver will 
-  get this information from the user set-up. It also can be overriden using 
-  a boot setup option, as follow (example):
-  'ncr53c8xx=sync:12' will allow the driver to negotiate for FAST-20  
-  synchronous data transfer (20 mega-transfers per second).
-  The normal answer therefore is not to go with the default but to select 
-  the maximum value 40 allowing the driver to use the maximum value 
-  supported by each controller.
-  There is no safe option other than using good cabling, right terminations 
-  and SCSI conformant devices.
+  The SCSI Parallel Interface-2 Standard defines 4 classes of transfer
+  rates: FAST-5, FAST-10, FAST-20 and FAST-40. The numbers are
+  respectively the maximum data transfer rates in mega-transfers per
+  second for each class. For example, a FAST-20 Wide 16 device is able
+  to transfer data at 40 million 16 bit packets per second for a total
+  rate of 40 MB/s.
+
+  You may specify 0 if you want to only use asynchronous data
+  transfers. This is the safest and slowest option. Otherwise, specify
+  a value between 5 and 40, depending on the capability of your SCSI
+  controller. The higher the number, the faster the data transfer.
+  Note that 40 should normally be ok since the driver decreases the
+  value automatically according to the controller's capabilities.
+
+  Your answer to this question is ignored for controllers with NVRAM,
+  since the driver will get this information from the user set-up. It
+  also can be overridden using a boot setup option, as follows
+  (example): 'ncr53c8xx=sync:12' will allow the driver to negotiate
+  for FAST-20 synchronous data transfer (20 mega-transfers per
+  second).
+
+  The normal answer therefore is not to go with the default but to
+  select the maximum value 40 allowing the driver to use the maximum
+  value supported by each controller. If this causes problems with
+  your SCSI devices, you should come back and decrease the value.
+
+  There is no safe option other than using good cabling, right
+  terminations and SCSI conformant devices.
 
 use normal IO
 CONFIG_SCSI_NCR53C8XX_IOMAPPED
-  This option allows you to force the driver to use normal IO.
-  Memory mapped IO has less latency than normal IO and works for most
-  Intel-based hardware.
-  Under Linux/Alpha only normal IO is currently supported by the
-  driver and so, this option has no effect.
-  The normal answer therefore is N.
+  If you say Y here, the driver will use normal IO, as opposed to
+  memory mapped IO. Memory mapped IO has less latency than normal IO
+  and works for most Intel-based hardware. Under Linux/Alpha only
+  normal IO is currently supported by the driver and so, this option
+  has no effect on those systems. 
+
+  The normal answer therefore is N; try Y only if you encounter SCSI
+  related problems.
 
 not allow targets to disconnect
 CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
-  This option is only provided for safety if you suspect some SCSI 
+  This option is only provided for safety if you suspect some SCSI
   device of yours to not support properly the target-disconnect
   feature. In that case, you would say Y here. In general however, to
   not allow targets to disconnect is not reasonable if there is more
@@ -3268,20 +3434,24 @@
 
 default tagged command queue depth
 CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
-  This option allows you to enable tagged command queuing support at
-  linux start-up and to define the default value for the number of 
-  tags per device. If you do not want tagged command queuing to be 
-  used by the driver you must enter either 0 or 1 for this option.
+  "Tagged command queuing" is a feature of SCSI-2 which improves
+  performance: the host adapter can send several SCSI commands to a
+  device's queue even if previous commands haven't finished yet. Some
+  SCSI devices don't implement this properly; if you want to disable
+  this feature, enter 0 or 1 here (it doesn't matter which).
+
   The default value is 8 and should be supported by most hard disks.
   This option has no effect for adapters with NVRAM, since the driver 
   will get this information from the user set-up. It also can be 
-  overriden using a boot setup option, as follow (example):
+  overridden using a boot setup option, as follows (example):
   'ncr53c8xx=tags:4/t2t3q16/t0u2q10' will set default queue depth to 4, 
   set queue depth to 16 for target 2 and target 3 on controller 0 and 
   set queue depth to 10 for target 0 / lun 2 on controller 1.
+
   The normal answer therefore is to go with the default 8 and to use 
   a boot command line option for devices that need to use a different 
   command queue depth.
+
   There is no safe option other than using good SCSI devices.
 
 maximum number of queued commands
@@ -3289,25 +3459,33 @@
   This option allows you to specify the maximum number of commands
   that can be queued to any device, when tagged command queuing is
   possible.  The default value is 32. Minimum is 2, maximum is 64.
-  For value less than 32, this option only spares a few memory 
+  For value less than 32, this option only saves a little memory 
   (8*7*(32-MAXTAGS) bytes), so using less than 32 isn't worth it.
   For value greater than 32, latency on reselection will be increased 
   by 1 or 2 micro-seconds. So, the normal answer here is to go with the 
   default value 32 unless you are using very large hard disks with 
-  large cache (>= 1MB) that are able to get advantage of more than 
+  large cache (>= 1MB) that are able to take advantage of more than 
   32 tagged commands.
+
   There is no safe option and the default answer is recommended.
- 
+
 assume boards are SYMBIOS compatible
 CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
   This option allows you to enable some features depending on GPIO
-  wiring.  These General Purpose Input/Output pins can be used for
+  wiring. These General Purpose Input/Output pins can be used for
   vendor specific features or implementation of the standard SYMBIOS
-  features.  Genuine SYMBIOS boards use GPIO0 in output for controller
-  LED and GPIO3 bit as a flag indicating singled-ended/differential
-  interface. The Tekram DC-390U/F boards uses a different GPIO wiring.
-  This option is useless if all your boards have NVRAM, since the driver 
-  is able to detect the board type from the NVRAM format.
+  features. Genuine SYMBIOS controllers use GPIO0 in output for
+  controller LED and GPIO3 bit as a flag indicating
+  singled-ended/differential interface. The Tekram DC-390U/F boards
+  uses a different GPIO wiring.
+  
+  Your answer to this question is ignored if all your controllers have
+  NVRAM, since the driver is able to detect the board type from the
+  NVRAM format.
+
+  If all the controllers in your system are genuine SYMBIOS boards or
+  use BIOS and drivers from SYMBIOS, you would want to say Y here,
+  otherwise N. N is the safe answer.
 
 enable profiling statistics gathering
 CONFIG_SCSI_NCR53C8XX_PROFILE
@@ -3315,6 +3493,7 @@
   These statistics are not very accurate due to the low frequency 
   of the kernel clock (100 Hz on i386) and have performance impact 
   on systems that use very fast devices.
+
   The normal answer therefore is N.
 
 IBMMCA SCSI support
@@ -3552,7 +3731,7 @@
   adapter can send several SCSI commands to a device's queue even if
   previous commands haven't finished yet. Some SCSI devices don't
   implement this properly, so the safe answer is N.
-
+        
 enable elevator sorting
 CONFIG_SCSI_EATA_LINKED_COMMANDS
   This is a feature of SCSI-2 which improves performance: the host
@@ -3709,51 +3888,6 @@
   This enables support for the Powertec SCSI card on Acorn systems.  If
   you have one of these, say Y.  If unsure, say N.  
 
-AcornSCSI support
-CONFIG_SCSI_ACORNSCSI_3
-  This enables support for the Acorn SCSI card (aka30).  If you have an
-  Acorn system with one of these, say Y.  If unsure, say N.
-
-Acorn SCSI tagged queue support
-CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
-  Say Y here to enable tagged queuing support on the Acorn SCSI card.
-
-Acorn SCSI Synchronous transfers support
-CONFIG_SCSI_ACORNSCSI_SYNC
-  Say Y here to enable synchronous transfer negociation with all targets
-  on the Acorn SCSI card.
-
-Oak SCSI support
-CONFIG_SCSI_OAK1
-  This enables support for the Oak SCSI card.  If you have an Acorn system
-  with one of these, say Y.  If unsure, say N.
-
-Cumana SCSI I support
-CONFIG_SCSI_CUMANA_1
-  This enables support for the Cumana SCSI I card.  If you have an Acorn
-  system with one of these, say Y.  If unsure, say N.
-
-Cumana SCSI II support
-CONFIG_SCSI_CUMANA_2
-  This enables support for the Cumana SCSI II card.  If you have an Acorn
-  system with one of these, say Y.  If unsure, say N.
-
-EcoSCSI support
-CONFIG_SCSI_ECOSCSI
-  This enables support for the EcoSCSI card - a small card that sits in
-  the Econet socket.  If you have an Acorn system with one of these,
-  say Y.  If unsure, say N.
-
-EESOX SCSI support
-CONFIG_SCSI_EESOXSCSI
-  This enables support for the EESOX SCSI card.  If you have an Acorn
-  system with one of these, say Y, otherwise say N.
-
-Powertec SCSI support
-CONFIG_SCSI_POWERTECSCSI
-  This enables support for the Powertec SCSI card on Acorn systems.  If
-  you have one of these, say Y.  If unsure, say N.  
-
 Network device support?
 CONFIG_NETDEVICES
   You can say N here if you don't intend to connect to any other
@@ -3775,7 +3909,7 @@
   plan to use more than one network card under Linux), available from
   sunsite.unc.edu:/pub/Linux/docs/HOWTO/mini) or if you want to use
   SLIP (Serial Line Internet Protocol is the protocol used to send
-  Internet traffic over telephone lines or nullmodem cables) or CSLIP
+  Internet traffic over telephone lines or null modem cables) or CSLIP
   (compressed SLIP) or PPP (Point to Point Protocol, a better and
   newer replacement for SLIP) or PLIP (Parallel Line Internet Protocol
   is mainly used to create a mini network by connecting the parallel
@@ -3814,7 +3948,7 @@
   Slip/CSlip server for other people to dial in.  SLIP (Serial Line
   Internet Protocol) is a protocol used to send Internet traffic
   over telephone lines or serial cables (also known as
-  nullmodems); nowadays, the protocol PPP is more common than SLIP. 
+  null modems); nowadays, the PPP is a more common protocol than SLIP. 
 
   Normally, your access provider has to support SLIP in order for you
   to be able to use it, but there is now a SLIP emulator called SLiRP
@@ -3864,7 +3998,7 @@
   Just occasionally you may need to run IP over hostile serial
   networks that don't pass all control characters or are only seven
   bit. Saying Y here adds an extra mode you can use with SLIP:
-  "slip6". In this mode, SLIP will only send normal ascii symbols over
+  "slip6". In this mode, SLIP will only send normal ASCII symbols over
   the serial device. Naturally, this has to be supported at the other
   end of the link as well. It's good enough, for example, to run IP
   over the async ports of a Camtec JNT Pad. If unsure, say N.
@@ -3909,7 +4043,7 @@
 
 Wireless LAN (non-hamradio)
 CONFIG_NET_RADIO
-  Support for wireless LAN's and everything having to do with radio,
+  Support for wireless LANs and everything having to do with radio,
   but not with amateur radio. Note that the answer to this question
   won't directly affect the kernel: saying N will just cause this
   configure script to skip all the questions about radio
@@ -3950,11 +4084,11 @@
   a Radio LAN (wireless Ethernet-like Local Area Network) using the
   radio frequencies 900 MHz and 2.4 GHz.
   
-  This driver support the ISA version of the Wavelan card. A separate
-  driver for the pcmcia hardware is available in David Hinds's
+  This driver support the ISA version of the WaveLAN card. A separate
+  driver for the pcmcia hardware is available in David Hinds'
   pcmcia-cs package (see the file Documentation/Changes for location).
 
-  If you want to use an ISA Wavelan card under Linux, say Y and read
+  If you want to use an ISA WaveLAN card under Linux, say Y and read
   the Ethernet-HOWTO, available via FTP (user: anonymous) in
   ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO. Some more specific
   information is contained in Documentation/networking/wavelan.txt and
@@ -3970,58 +4104,6 @@
   module, say M here and read Documentation/modules.txt as well as
   Documentation/networking/net-modules.txt.
 
-AIMSlab RadioTrack (aka RadioReveal) support
-CONFIG_RADIO_RTRACK
-  Choose Y here if you have one of these FM radio cards, and then fill
-  in the port address below.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API.  Information on 
-  this API and pointers to "v4l" programs may be found on the WWW at
-  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
-  you need to have access to a machine on the Internet that has a 
-  program like lynx or netscape.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-aimslab.o.
-
-RadioTrack i/o port
-CONFIG_RADIO_RTRACK_PORT
-  Enter either 0x30f or 0x20f here.  The card default is 0x30f, if you
-  haven't changed the jumper setting on the card.
-
-Aztech/Packard Bell Radio
-CONFIG_RADIO_AZTECH
-  Choose Y here if you have one of these FM radio cards, and then fill
-  in the port address below.
-  
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-aztech.o.
-
-Aztech/Packard Bell radio card i/o port
-CONFIG_RADIO_AZTECH_PORT
-  Enter either 0x350 or 0x358 here.  The card default is 0x350, if you
-  haven't changed the setting of jumper JP3 on the card.  Removing the
-  jumper sets the card to 0x358.
-
-SF16FMI Radio
-CONFIG_RADIO_SF16FMI
-  Choose Y here if you have one of these FM radio cards, and then fill
-  in the port address below.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called radio-sf16fmi.o
-
-SF16FMI I/O port (0x284 or 0x384)
-CONFIG_RADIO_SF16FMI_PORT
-  Enter the I/O port of your SF16FMI radio card.
-
 LAPB over Ethernet driver
 CONFIG_LAPBETHER
   This is a driver for a pseudo device (typically called /dev/lapb0)
@@ -4055,9 +4137,9 @@
   Pactor 1 and GTOR using a standard PC sound card. If unsure,
   say N.
 
-Shortwave radio modem driver support for SoundBlaster and compatible cards
+Shortwave radio modem driver support for Sound Blaster and compatible cards
 CONFIG_HFMODEM_SBC
-  This option enables the hfmodem driver to use SoundBlaster and
+  This option enables the hfmodem driver to use Sound Blaster and
   compatible cards. It requires a 16bit capable card, i.e.
   SB16 or better, or ESS1688 or newer.
 
@@ -4509,16 +4591,23 @@
 Ethernet (10 or 100Mbit)
 CONFIG_NET_ETHERNET
   Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common
-  type of Local Area Networks (LANs) in universities or companies.
-  10-base-2 or Thinnet (10 Mbps over coaxial cable, linking computers
-  in a chain), 10-base-T or TwistedPair (10 Mbps over twisted pair
-  telephone cable, linking computers to a central hub) and
-  100-base-<whatever> (100 Mbps) are common types of Ethernet. 
+  type of Local Area Network (LAN) in universities and companies.
+
+  Common varieties of Ethernet are: 10BASE-2 or Thinnet (10 Mbps over
+  coaxial cable, linking computers in a chain), 10BASE-T or twisted
+  pair (10 Mbps over twisted pair cable, linking computers to central
+  hubs), 10BASE-F (10 Mbps over optical fiber links, using hubs),
+  100BASE-TX (100 Mbps over two twisted pair cables, using hubs),
+  100BASE-T4 (100 Mbps over 4 standard voice-grade twisted pair
+  cables, using hubs), 100BASE-FX (100 Mbps over optical fiber links)
+  [the 100BASE varieties are also known as Fast Ethernet], and Gigabit
+  Ethernet (1 Gbps over optical fiber or short copper links).
 
   If your Linux machine will be connected to an Ethernet and you have
-  an Ethernet network card installed in your computer, say Y here and
-  read the Ethernet-HOWTO, available via FTP (user: anonymous) from
-  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO. 
+  an Ethernet network interface card (NIC) installed in your computer,
+  say Y here and read the Ethernet-HOWTO, available via FTP (user:
+  anonymous) from ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO. You will
+  then also have to say Y to the driver for your particular NIC.
 
   Note that the answer to this question won't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -4527,7 +4616,7 @@
 Sun LANCE Ethernet support
 CONFIG_SUN_LANCE
   This is support for lance Ethernet cards on Sun workstations such as
-  the Sparcstation IPC (any Sparc with a network interface 'le0' under
+  the SPARCstation IPC (any SPARC with a network interface 'le0' under
   SunOS basically). 
 
   This driver is also available as a module ( = code which can be
@@ -4623,6 +4712,19 @@
   it as a module, say M here and read Documentation/modules.txt as
   well as Documentation/networking/net-modules.txt.
 
+PCI NE2000 support
+CONFIG_NE2K_PCI
+  This driver is for NE2000 compatible PCI cards. It will not work
+  with ISA NE2000 cards. If you have a PCI NE2000 network (Ethernet)
+  card, say Y and read the Ethernet-HOWTO, available via FTP (user:
+  anonymous) in ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ne2k-pci.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt as well as
+  Documentation/networking/net-modules.txt.
+
 Racal-Interlan (Micom) NI cards
 CONFIG_NET_VENDOR_RACAL
   If you have a network (Ethernet) card belonging to this class, such
@@ -4814,11 +4916,11 @@
 Other ISA cards
 CONFIG_NET_ISA
   If your network (Ethernet) card hasn't been mentioned yet and its
-  bus system (that's the way the components of the card talk to each
-  other) is ISA (as opposed to EISA, VLB or PCI), say Y. Make sure you
-  know the name of your card. Read the Ethernet-HOWTO, available via
-  FTP (user: anonymous) in ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
-  If unsure, say Y.
+  bus system (that's the way the cards talks to the other components
+  of your computer) is ISA (as opposed to EISA, VLB or PCI), say Y.
+  Make sure you know the name of your card. Read the Ethernet-HOWTO,
+  available via FTP (user: anonymous) in
+  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO. If unsure, say Y.
 
   Note that the answer to this question doesn't directly affect the
   kernel: saying N will just cause this configure script to skip all
@@ -4874,7 +4976,7 @@
 ARCnet COM90xx (normal) chipset driver
 CONFIG_ARCNET_COM90xx
   This is the chipset driver for the standard COM90xx cards. If you
-  have always used the old arcnet driver without knowing what type of
+  have always used the old ARCnet driver without knowing what type of
   card you had, this is probably the one for you. 
 
   This driver is also available as a module ( = code which can be
@@ -5008,10 +5110,10 @@
   module, say M here and read Documentation/modules.txt as well as
   Documentation/networking/net-modules.txt. 
 
-EtherExpressPro support
+EtherExpress PRO support
 CONFIG_EEXPRESS_PRO
   If you have a network (Ethernet) card of this type, say Y. Note
-  however that the EtherExpressPro 100 Ethernet card has its own
+  however that the EtherExpress PRO/100 Ethernet card has its own
   separate driver. Please read the Ethernet-HOWTO, available via FTP
   (user: anonymous) in ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
 
@@ -5213,9 +5315,9 @@
   module, say M here and read Documentation/modules.txt as well as
   Documentation/networking/net-modules.txt.
 
-EtherExpressPro/100 support
+EtherExpress PRO/100 support
 CONFIG_EEXPRESS_PRO100
-  If you have an Intel EtherExpressPro 100 PCI network (Ethernet)
+  If you have an Intel EtherExpress PRO/100 PCI network (Ethernet)
   card, say Y and read the Ethernet-HOWTO, available via FTP (user:
   anonymous) in ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
 
@@ -5237,27 +5339,16 @@
   module, say M here and read Documentation/modules.txt as well as
   Documentation/networking/net-modules.txt.
 
-PCI NE2000 Support
-CONFIG_NE2K_PCI
-  This driver is for NE2000 compatible PCI cards.  It will not work
-  with ISA NE2000 cards.  If you have a network (Ethernet) card of
-  this type, say Y and read the Ethernet-HOWTO, available via FTP
-  (user: anonymous) in ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ne2k-pci.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt as well as
-  Documentation/networking/net-modules.txt.
-
-
 TI ThunderLAN support (EXPERIMENTAL)
 CONFIG_TLAN
-  If you have a TLAN based network card which is supported by this
-  driver, say Y and read the Ethernet-HOWTO, available via FTP (user:
-  anonymous) in ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO. Devices
-  currently supported are the Compaq Netelligent 10, Netelligent
-  10/100, and Internal NetFlex 3.
+  If you have a PCI Ethernet network card based on the ThunderLAN chip
+  which is supported by this driver, say Y and read the
+  Ethernet-HOWTO, available via FTP (user: anonymous) in
+  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
+
+  Devices currently supported by this driver are Compaq Netelligent,
+  Compaq NetFlex and Olicom cards. Please read the file
+  Documentation/tlan.txt for details.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5301,7 +5392,7 @@
   (user: anonymous) ftp://cb-iris.stanford.edu/pub/pcmcia and say N
   here.
 
-  Laptop user want to read the Linux Laptop homepage at
+  Laptop users should read the Linux Laptop home page at
   http://www.cs.utexas.edu/users/kharker/linux-laptop/ (to browse the
   WWW, you need to have access to a machine on the Internet that has a
   program like lynx or netscape). 
@@ -5382,11 +5473,11 @@
   SysKonnect TR4/16(+) ISA (SK-4190), SysKonnect TR4/16(+) PCI
   (SK-4590), SysKonnect TR4/16 PCI (SK-4591) adapters.
 
-  If you have such an adapter and would like to use it, say Y or M
-  and read the Token-Ring mini-HOWTO, available via FTP (user:  anonymous)
+  If you have such an adapter and would like to use it, say Y or M and
+  read the Token-Ring mini-HOWTO, available via FTP (user: anonymous)
   from ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
 
-  Also read the sktr.txt in linux/Documentation/networking or check
+  Also read the file linux/Documentation/networking/sktr.txt or check
   the Linux-SNA WWW site for the latest information at
   http://samba.anu.edu.au/linux-sna/documents/drivers/SysKonnect/
 
@@ -5439,26 +5530,6 @@
   If you wish to compile a kernel for the EBSA-110, then you should
   always answer Y to this.
 
-Acorn Ether1 card
-CONFIG_ARM_ETHER1
-  If you have an Acorn system with one of these (AKA25) network cards,
-  you should say Y to this option if you wish to use it with Linux.
-
-Acorn/ANT Ether3 card
-CONFIG_ARM_ETHER3
-  If you have an Acorn system with one of these network cards, you
-  should say Y to this option if you wish to use it with Linux.
-
-I Cubed EtherH card
-CONFIG_ARM_ETHERH
-  If you have an Acorn system with one of these network cards, you
-  should say Y to this option if you wish to use it with Linux.
-
-EBSA-110 ethernet interface
-CONFIG_AM79C961A
-  If you wish to compile a kernel for the EBSA-110, then you should
-  always answer Y to this.
-
 Support CDROM drives that are not SCSI or IDE/ATAPI
 CONFIG_CD_NO_IDESCSI
   If you have a CDROM drive that is neither SCSI nor IDE/ATAPI, say Y
@@ -5483,8 +5554,9 @@
   read Documentation/modules.txt. 
 
   If you want to use any of these CDROM drivers, you also have to say
-  Y to "ISO9660 cdrom filesystem support" below (this answer will get
-  "defaulted" for you if you enable any of the Linux CDROM drivers).
+  Y or M to "ISO 9660 CDROM filesystem support" below (this answer will
+  get "defaulted" for you if you enable any of the Linux CDROM
+  drivers).
 
 Sony CDU31A/CDU33A CDROM support
 CONFIG_CDU31A
@@ -5498,7 +5570,7 @@
   how to pass options to the kernel. The lilo procedure is also
   explained in the SCSI-HOWTO. 
 
-  If you say Y here, you should also say Y to "ISO9660 cdrom
+  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs. 
 
@@ -5523,7 +5595,7 @@
   If the driver doesn't work out of the box, you might want to have a
   look at drivers/cdrom/mcd.h.  
 
-  If you say Y here, you should also say Y to "ISO9660 cdrom
+  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs. 
 
@@ -5541,7 +5613,7 @@
   able to support more than one drive, but each drive needs a separate
   interface card. Please read the file Documentation/cdrom/mcdx. 
 
-  If you say Y here, you should also say Y to "ISO9660 cdrom
+  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs. 
 
@@ -5553,11 +5625,11 @@
 Matsushita/Panasonic/Creative, Longshine, TEAC CDROM support
 CONFIG_SBPCD
   This driver supports most of the drives which use the Panasonic or
-  SoundBlaster interface. Please read the file
+  Sound Blaster interface. Please read the file
   Documentation/cdrom/sbpcd.
 
   The Matsushita CR-521, CR-522, CR-523, CR-562, CR-563 drives
-  (sometimes labeled "Creative"), the CreativeLabs CD200, the
+  (sometimes labeled "Creative"), the Creative Labs CD200, the
   Longshine LCS-7260, the "IBM External ISA CDROM" (in fact a CR-56x
   model), the TEAC CD-55A fall under this category. Some other
   "electrically compatible" drives (Vertos, Genoa, some Funai models)
@@ -5579,7 +5651,7 @@
   module, only one controller card (but with up to four drives) is
   usable.
 
-  If you say Y here, you should also say Y to "ISO9660 cdrom
+  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs. 
 
@@ -5604,7 +5676,7 @@
   - is NOT for CDROM drives with IDE/ATAPI interfaces, such as Aztech
   CDA269-031SE. Please read the file Documentation/cdrom/aztcd. 
 
-  If you say Y here, you should also say Y to "ISO9660 cdrom
+  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs.
 
@@ -5618,7 +5690,7 @@
   This is the driver for the older Sony CDU-535 and CDU-531 CDROM
   drives. Please read the file Documentation/cdrom/sonycd535.
 
-  If you say Y here, you should also say Y to "ISO9660 cdrom
+  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs.
 
@@ -5634,7 +5706,7 @@
   in the file linux/drivers/cdrom/gscd.h before compiling the
   kernel. Please read the file Documentation/cdrom/gscd. 
 
-  If you say Y here, you should also say Y to "ISO9660 cdrom
+  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs. 
 
@@ -5649,7 +5721,7 @@
   cm260 host adapter card, say Y here.  Please also read the file
   Documentation/cdrom/cm206. 
 
-  If you say Y here, you should also say Y to "ISO9660 cdrom
+  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs. 
 
@@ -5666,7 +5738,7 @@
   Optics Storage 8001 drive; use the IDE-ATAPI CDROM driver for that
   one. Please read the file Documentation/cdrom/optcd. 
 
-  If you say Y here, you should also say Y to "ISO9660 cdrom
+  If you say Y here, you should also say Y or M to "ISO 9660 CDROM
   filesystem support" below, because that's the filesystem used on
   CDROMs. 
 
@@ -5678,9 +5750,9 @@
 Sanyo CDR-H94A CDROM support
 CONFIG_SJCD
   If this is your CDROM drive, say Y here and read the file
-  Documentation/cdrom/sjcd. You should then also say Y to "ISO9660
-  cdrom filesystem support" below, because that's the filesystem used
-  on CDROMs. 
+  Documentation/cdrom/sjcd. You should then also say Y or M to
+  "ISO 9660 CDROM filesystem support" below, because that's the
+  filesystem used on CDROMs.
 
   This driver is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
@@ -5815,7 +5887,7 @@
   to a specific group id (gid). Trying to translate names everywhere
   will decrease performance of file openings. Normally translations
   are used only in system configuration files but not in ordinary user
-  filespace. So you should change the gid of directories containing
+  file space. So you should change the gid of directories containing
   context-dependent files to some special group like "adm" (group id
   4) and enable this option. As a result, users will not notice any
   performance degradation resulting from filename translation.
@@ -5958,7 +6030,7 @@
   root partition cannot be compiled as a module, and so this could be
   dangerous. Most everyone wants to say Y here.
 
-ISO9660 cdrom filesystem support
+ISO 9660 CDROM filesystem support
 CONFIG_ISO9660_FS
   This is the standard filesystem used on CDROMs. It was previously
   known as "High Sierra Filesystem" and is called "hsfs" on other Unix
@@ -5978,7 +6050,7 @@
 
 Microsoft Joliet cdrom extensions
 CONFIG_JOLIET
-  Joliet is a Microsoft extension for the ISO9660 CDROM filesystem
+  Joliet is a Microsoft extension for the ISO 9660 CDROM filesystem
   which allows for long filenames in unicode format (unicode is the
   new 16 bit character code, successor to ASCII, which encodes the
   characters of almost all languages of the world; see
@@ -6065,7 +6137,7 @@
   disadvantage is that Linux becomes susceptible to DOS viruses and
   that UMSDOS is somewhat slower than ext2fs.  Another use of umsdos
   is to write files with long unix filenames to MSDOS floppies; it
-  also allows unix style softlinks and owner/permissions of files on
+  also allows Unix-style softlinks and owner/permissions of files on
   MSDOS floppies. You will need a program called umssync in order to
   make use of umsdos; read Documentation/filesystems/umsdos.txt. 
 
@@ -6112,6 +6184,9 @@
   Administrator's Guide, available via FTP (user: anonymous) in
   ftp://sunsite.unc.edu/pub/Linux/docs/LDP, on its man page: "man
   nfs", and in the NFS-HOWTO.
+  
+  An alternative to NFS is provided by the Coda filesystem; see "Coda
+  filesystem support" below.
 
   If you say Y here, you should have said Y to TCP/IP networking also.
   This option would enlarge your kernel by about 27 kB. 
@@ -6122,12 +6197,12 @@
   say M here and read Documentation/modules.txt. 
 
   If you are configuring a diskless machine which will mount its root
-  filesystem over NFS (in order to do that, check out the netboot
-  package, available via FTP (user: anonymous) from
-  ftp://sunsite.unc.edu/pub/Linux/system/boot/ethernet/, extract with
-  "tar xzvf filename", and say Y to "Root file system on NFS" and to
-  "IP: kernel level autoconfiguration"), then you cannot compile this
-  driver as a module.
+  filesystem over NFS at boot time, say Y here and to "Root file
+  system on NFS" and to "IP: kernel level autoconfiguration". You
+  cannot compile this driver as a module in this case. There are two
+  packages designed for booting diskless machines over the net:
+  netboot and etherboot, both available via FTP (user: anonymous) from
+  ftp://sunsite.unc.edu/pub/Linux/system/boot/ethernet/ .
 
   If you don't know what all this is about, say N.
 
@@ -6191,10 +6266,12 @@
 NTFS read-write support (experimental)
 CONFIG_NTFS_RW
   If you say Y here, you will (hopefully) be able to write to NTFS
-  file systems as well as to read from them.  The read-write support
+  file systems as well as read from them.  The read-write support
   in NTFS is far from being complete and is not well tested. If you
-  enable this, be prepared to recover the NTFS volume from tape. If
-  unsure, say N.
+  enable this, back up your NTFS volume first since it may get
+  damaged.
+
+  If unsure, say N.
 
 System V and Coherent filesystem support
 CONFIG_SYSV_FS
@@ -6231,12 +6308,7 @@
 Amiga FFS filesystem support
 CONFIG_AFFS_FS
   The Fast File System (FFS) is the common filesystem used on hard
-  disks by Amiga(tm) Systems since AmigaOS Version 1.3 (34.20). With
-  this driver you can also mount diskfiles used by Bernd Schmidt's
-  Un*X Amiga Emulator (http://www.freiburg.linux.de/~uae/; to browse
-  the WWW, you need to have access to a machine on the Internet that
-  has a program like lynx or netscape). If you want to do the latter,
-  you will also need to say Y to "Loop device support", above. Say Y
+  disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20). Say Y
   if you want to be able to read and write files from and to an Amiga
   FFS partition on your hard drive. Amiga floppies however cannot be
   read with this driver due to an incompatibility of the floppy
@@ -6244,6 +6316,13 @@
   PCs and workstations. Read Documentation/filesystems/affs.txt and
   fs/affs/Changes. 
 
+  With this driver you can also mount disk files used by Bernd
+  Schmidt's Un*X Amiga Emulator (http://www.freiburg.linux.de/~uae/;
+  to browse the WWW, you need to have access to a machine on the
+  Internet that has a program like lynx or netscape). If you want to
+  do this, you will also need to say Y or M to "Loop device support",
+  above.
+
   This filesystem is also available as a module ( = code which can be
   inserted in and removed from the running kernel whenever you want).
   The module is called affs.o. If you want to compile it as a module,
@@ -6295,7 +6374,7 @@
   If you are not a part of a fairly large, distributed network, you
   probably do not need an automounter, and can say N here.
 
-BSD UFS filesystem support (read only)
+UFS filesystem support (read only)
 CONFIG_UFS_FS
   BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
   OpenBSD and NeXTstep) use a filesystem called UFS. Some System V
@@ -6329,7 +6408,7 @@
   first sector a new partition table in disklabel format. Saying Y
   here allows you to read these disklabels and further mount FreeBSD
   partitions read-only from within Linux if you have also said Y to
-  "BSD ufs filesystem support", above. If you don't know what all this
+  "UFS filesystem support", above. If you don't know what all this
   is about, say N.
 
 SMD disklabel (Sun partition tables) support
@@ -6337,8 +6416,8 @@
   Like most systems, SunOS uses its own hard disk partition table
   format, incompatible with all others. Saying Y here allows you to
   read these partition tables and further mount SunOS disks read-only
-  from within Linux if you have also said Y to "BSD ufs filesystem
-  support", above. This is mainly used to carry data from a Sparc
+  from within Linux if you have also said Y to "UFS filesystem
+  support", above. This is mainly used to carry data from a SPARC
   under SunOS to your Linux box via a removable medium like
   magneto-optical or ZIP drives; note however that a good portable way
   to transport files and directories between unixes (and even other
@@ -6351,13 +6430,13 @@
   Like most systems, Solaris x86 uses its own hard disk partition
   table format, incompatible with all others. Saying Y here allows you
   to read these partition tables and further mount Solaris x86 disks
-  read-only from within Linux if you have also said Y to "BSD ufs
+  read-only from within Linux if you have also said Y to "UFS
   filesystem support", above.
 
 ADFS filesystem support (read only) (EXPERIMENTAL)
 CONFIG_ADFS_FS
   The Acorn Disc Filing System is the standard filesystem of the
-  RiscOS operating system which runs on Acorn's ARM based Risc PC
+  RiscOS operating system which runs on Acorn's ARM-based Risc PC
   systems and the Acorn Archimedes range of machines. If you say Y
   here, Linux will be able to read from ADFS partitions on hard drives
   and from ADFS-formatted floppy discs.
@@ -6402,9 +6481,9 @@
   (WfW), Windows 95, Windows NT and Lan Manager use to share files and
   printers over local networks. Saying Y here allows you to mount
   their filesystems (often called "shares" in this context) and access
-  them just like any other unix directory. Currently, this works only
+  them just like any other Unix directory. Currently, this works only
   if the Windows machines use TCP/IP as the underlying transport
-  protocol, and not Netbeui. For details, read
+  protocol, and not NetBEUI. For details, read
   Documentation/filesystems/smbfs.txt and the SMB-HOWTO, available via
   FTP (user: anonymous) from
   ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
@@ -6530,7 +6609,7 @@
 
 nls: Native language codepages and Unicode support
 CONFIG_NLS
-  This is required by the FAT and NTFS filesystems and by the ISO9660
+  This is required by the FAT and NTFS filesystems and by the ISO 9660
   filesystem when it is compiled with Joliet support. Joliet is a
   Microsoft extension for CDROMs that supports Unicode. This allows
   translation between different character sets. 
@@ -6831,17 +6910,20 @@
 
 Virtual terminal
 CONFIG_VT
-  This includes support for a terminal device with display and
-  keyboard devices. Only people using embedded systems want to say N
-  here; most everybody else says Y. If unsure, say Y, or else you
-  won't be able to do much with your new shiny Linux system :-)
+  If you say Y here, you will get support for a terminal device with
+  display and keyboard devices. These are called "virtual" because you
+  can run several virtual terminals on one physical terminal; however,
+  you need at least one virtual terminal device in order to make use
+  of a physical terminal. Only people using embedded systems want to
+  say N here; most everybody else says Y. If unsure, say Y, or else
+  you won't be able to do much with your new shiny Linux system :-)
 
 Support for console on virtual terminal
 CONFIG_VT_CONSOLE
   If you say Y here, by default all kernel messages will be sent to
-  the device /dev/tty0 which corresponds to the virtual terminal you
-  have visible on your display. You should say Y here unless you only
-  want to have the kernel messages output on a serial port (in which
+  the device /dev/tty0 which corresponds to the virtual terminal that
+  is visible on your display. You should say Y here unless you only
+  want to have the kernel messages output to a serial port (in which
   case you probably want to say Y to "Console on serial port", below).
 
 Software generated cursor
@@ -6852,13 +6934,6 @@
   or change their color depending on the virtual console you're on.
   See Documentation/VGA-softcursor.txt for more information.
 
-Acorn's ADFS filesystem support (read only) (EXPERIMENTAL)
-CONFIG_ADFS_FS
-  The Advanced Disk File System is the filesystem used on floppy and
-  hard disks by Acorn Systems.  Currently in development, as a read-
-  only driver for hard disks.  These should be the first partition
-  (eg. /dev/[sh]d?1) on each of your drives.  If unsure, say N.
-
 Standard/generic serial support
 CONFIG_SERIAL
   This selects whether you want to include the driver for the standard
@@ -7019,8 +7094,8 @@
 
 Hayes ESP serial port support
 CONFIG_ESPSERIAL
-  This is a driver which supports Hayes ESP serial ports.  It uses DMA
-  to transfer data to and from the host.  Make sure to read
+  This is a driver which supports Hayes ESP serial ports.  Both single
+  port cards and multiport cards are supported.  Make sure to read
   Documentation/hayes-esp.txt. 
 
   To compile this driver as a module ( = code which can be inserted in
@@ -7028,48 +7103,6 @@
   and read Documentation/modules.txt. The module will be called esp.o.
   If unsure, say N.
 
-Hayes ESP serial port DMA channel
-CONFIG_ESPSERIAL_DMA_CHANNEL
-  This is the DMA channel to be used to transfer data to and from the
-  host.  One DMA channel is shared between all the ESP ports.  Valid
-  values are 1 and 3.
-
-Hayes ESP serial port receive trigger level
-CONFIG_ESPSERIAL_RX_TRIGGER
-  This is the trigger level (in bytes) of the receive FIFO. Larger
-  values may result in fewer interrupts and hence better performance;
-  however, a value too high could result in data loss. Valid values
-  are 1 through 1023.
-
-Hayes ESP serial port transmit trigger level
-CONFIG_ESPSERIAL_TX_TRIGGER
-  This is the trigger level (in bytes) of the transmit FIFO. Larger
-  values may result in fewer interrupts and hence better performance;
-  however, a value too high could result in degraded transmit
-  performance. Valid values are 1 through 1023.
-
-Hayes ESP serial port flow off level
-CONFIG_ESPSERIAL_FLOW_OFF
-  This is the level (in bytes) at which the ESP port will "flow off"
-  the remote transmitter (i.e. tell him to stop stop sending more
-  bytes).  Valid values are 1 through 1023.  This value should be
-  greater than the receive trigger level and the flow on level.
-
-Hayes ESP serial port flow on level
-CONFIG_ESPSERIAL_FLOW_ON
-  This is the level (in bytes) at which the ESP port will "flow on"
-  the remote transmitter (i.e. tell him to resume sending bytes) after
-  having flowed it off.  Valid values are 1 through 1023.  This value
-  should be less than the flow off level, but greater than the receive
-  trigger level.
-
-Hayes ESP serial port receiver timeout
-CONFIG_ESPSERIAL_RX_TMOUT
-  This is the amount of time that the ESP port will wait after
-  receiving the final character before signaling an interrupt.  Valid
-  values are 0 through 255.  A value too high will increase latency,
-  and a value too low will cause unnecessary interrupts.
-
 Parallel printer support
 CONFIG_PRINTER
   If you intend to attach a printer to the parallel port of your Linux
@@ -7216,10 +7249,10 @@
 Support for user miscellaneous modules
 CONFIG_UMISC
   This option forces generic miscellaneous minor device support in the
-  kernel, and allows later loading of user miscellaneous device
-  modules, such as drivers for optic pens and touchscreens. Unless you
-  need such specific modules, or are willing to write/test one, just
-  say N.
+  kernel, and allows later loading of user miscellaneous character
+  device modules, such as drivers for optic pens and touchscreens.
+  Unless you need such specific modules, or are willing to write/test
+  one, just say N.
 
 QIC-02 tape support
 CONFIG_QIC02_TAPE
@@ -7591,7 +7624,7 @@
   for the Linux kernel). 
 
   If you are running Linux on a laptop, you may also want to read the
-  Linux Laptop homepage on the WWW at
+  Linux Laptop home page on the WWW at
   http://www.cs.utexas.edu/users/kharker/linux-laptop/ (to browse the
   WWW, you need to have access to a machine on the Internet that has a
   program like lynx or netscape). 
@@ -7826,17 +7859,6 @@
   The module will be called nvram.o. If you want to compile it as a
   module, say M here and read Documentation/modules.txt.
 
-Atomwide Serial Support
-CONFIG_ATOMWIDE_SERIAL
-  If you have an Atomwide Serial card for an Acorn system, say Y to
-  this option.  The driver can handle 1, 2, or 3 port cards.
-  If unsure, say N
-
-The Serial Port Dual Serial Port
-CONFIG_DUALSP_SERIAL
-  If you have the Serial Port's dual serial card for an Acorn system,
-  say Y to this option.  If unsure, say N
-
 PC joystick support
 CONFIG_JOYSTICK
   If you have a PC compatible analog or digital joystick, you can say
@@ -7892,7 +7914,7 @@
   ftp://sunsite.unc.edu/pub/Linux/kernel/patches/console/ and in the
   pcsp patch at ftp://dwmw2.robinson.cam.ac.uk/pub/kernel/ .
 
-Support for Aztech Sound Galaxy (non-Pnp) cards
+Support for Aztech Sound Galaxy (non-PnP) cards
 CONFIG_SOUND_SGALAXY
   This module initializes the older non Plug and Play sound galaxy cards
   from Aztech. It supports the Waverider Pro 32 - 3D and the Galaxy
@@ -7907,13 +7929,13 @@
 
 100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support
 CONFIG_SOUND_SB
-  Answer Y if you have an original SoundBlaster card made by
+  Answer Y if you have an original Sound Blaster card made by
   Creative Labs or a 100% hardware compatible clone (like the
   Thunderboard or SM Games). If your card was in the list of supported
   cards look at the card specific instructions in the
   drivers/sound/Readme.cards file before answering this question. For
   an unknown card you may answer Y if the card claims to be
-  SoundBlaster compatible. 
+  Sound Blaster-compatible. 
 
   Please read Documentation/sound/Soundblaster.
 
@@ -8053,7 +8075,7 @@
 CONFIG_MAD16_OLDCARD
   Answer Y (or M) if you have an older card based on the C928
   or Mozart chipset and you want to have  MIDI support. If you
-  enable this option you also need to enable support for SoundBlaster.
+  enable this option you also need to enable support for Sound Blaster.
 
 Support for Crystal CS4232 based (PnP) cards
 CONFIG_SOUND_CS4232
@@ -8159,7 +8181,7 @@
 
 SB32/AWE support
 CONFIG_AWE32_SYNTH
-  Say Y here if you have a SoundBlaster SB32, AWE32-PnP, SB AWE64 or
+  Say Y here if you have a Sound Blaster SB32, AWE32-PnP, SB AWE64 or
   similar sound card. See drivers/sound/lowlevel/README.awe,
   Documentation/sound/AWE32 and the Soundblaster-AWE mini-HOWTO,
   available via FTP (user: anonymous) from
@@ -8169,7 +8191,7 @@
 CONFIG_AEDSP16
   Answer Y if you have a Gallant's Audio Excel DSP 16 card. This card
   can emulate either an SBPro or a Microsoft Sound System card, so you
-  should have said Y to either "SoundBlaster (SB, SBPro, SB16, clones)
+  should have said Y to either "Sound Blaster (SB, SBPro, SB16, clones)
   support" or "Microsoft Sound System support", above, and you need to
   answer the "MSS emulation" and "SBPro emulation" questions below
   accordingly. You should say Y to one and only one of these two
@@ -8195,34 +8217,34 @@
 Audio Excel DSP 16 (SBPro emulation)
 CONFIG_AEDSP16_SBPRO
   Answer Y if you want your audio card to emulate Sound Blaster Pro.
-  You should then say Y to "SoundBlaster (SB, SBPro, SB16, clones)
+  You should then say Y to "Sound Blaster (SB, SBPro, SB16, clones)
   support" and N to "Audio Excel DSP 16 (MSS emulation)".
 
-Ensoniq ES1370 based PCI soundcards
+Ensoniq ES1370 based PCI sound cards
 CONFIG_SOUND_ES1370
-  Say Y or M if you have a PCI soundcard utilizing the Ensoniq
+  Say Y or M if you have a PCI sound card utilizing the Ensoniq
   ES1370 chipset, such as Ensoniq's AudioPCI (non-97). To find
-  out if your soundcard uses an ES1370 without removing your
+  out if your sound card uses an ES1370 without removing your
   computer's cover, use lspci -n and look for the PCI ID 
   1274:5000. Since Ensoniq was bought by Creative Labs,
-  SoundBlaster 64/PCI models are either ES1370 or ES1371 based.
+  Sound Blaster 64/PCI models are either ES1370 or ES1371 based.
   This driver differs slightly from OSS/Free, so PLEASE READ
   Documentation/sound/es1370.
 
-Ensoniq ES1371 based PCI soundcards
+Ensoniq ES1371 based PCI sound cards
 CONFIG_SOUND_ES1371
-  Say Y or M if you have a PCI soundcard utilizing the Ensoniq
+  Say Y or M if you have a PCI sound card utilizing the Ensoniq
   ES1371 chipset, such as Ensoniq's AudioPCI97. To find out if
-  your soundcard uses an ES1371 without removing your computer's
+  your sound card uses an ES1371 without removing your computer's
   cover, use lspci -n and look for the PCI ID 1274:1371. Since
-  Ensoniq was bought by Creative Labs, SoundBlaster 64/PCI
+  Ensoniq was bought by Creative Labs, Sound Blaster 64/PCI
   models are either ES1370 or ES1371 based. This driver differs
   slightly from OSS/Free, so PLEASE READ Documentation/sound/es1371.
 
-S3 SonicVibes based PCI soundcards
+S3 SonicVibes based PCI sound cards
 CONFIG_SOUND_SONICVIBES
-  Say Y or M if you have a PCI soundcard utilizing the S3
-  SonicVibes chipset. To find out if your soundcard uses a
+  Say Y or M if you have a PCI sound card utilizing the S3
+  SonicVibes chipset. To find out if your sound card uses a
   SonicVibes chip without removing your computer's cover, use
   lspci -n and look for the PCI ID 5333:CA00. This driver 
   differs slightly from OSS/Free, so PLEASE READ
@@ -8472,7 +8494,7 @@
 
 HiSax Support for Am7930 (EXPERIMENTAL)
 CONFIG_HISAX_AMD7930
-  This enables HiSax support for the AMD7930 chips on some sparcs.
+  This enables HiSax support for the AMD7930 chips on some SPARCs.
   This code is not finished yet.
 
 HiSax Support for EURO/DSS1
@@ -8573,20 +8595,20 @@
 
 Support for AP1000 multicomputer
 CONFIG_AP1000
-  This enables support for a sparc based parallel multi-computer
+  This enables support for a SPARC based parallel multi-computer
   called AP1000+. For details on our efforts to port Linux to this
   machine see http://cap.anu.edu.au/cap/projects/linux (to browse the
   WWW, you need to have access to a machine on the Internet that has a
   program like lynx or netscape) or mail to hackers@cafe.anu.edu.au
 
-Sparc ESP SCSI support
+SPARC ESP SCSI support
 CONFIG_SCSI_SUNESP
   This is the driver for the Sun ESP SCSI host adapter. The ESP
   chipset is present in most SPARC-based computers.
 
-Sparc /dev/openprom compatibility driver
+SPARC /dev/openprom compatibility driver
 CONFIG_SUN_OPENPROMIO
-  This driver provides user programs with an interface to the Sparc
+  This driver provides user programs with an interface to the SPARC
   PROM device tree. The driver implements a SunOS-compatible
   interface and a NetBSD-compatible interface. 
 
@@ -9132,15 +9154,103 @@
 
 Video For Linux
 CONFIG_VIDEO_DEV
-  Support for audio/video capture and overlay devices. The exact
-  capabilities of each device vary. User tools for this are available
-  from ftp://ftp.uk.linux.org/pub/linux/video4linux.  
+  Support for audio/video capture and overlay devices and FM radio
+  cards. The exact capabilities of each device vary. User tools for
+  this are available from
+  ftp://ftp.uk.linux.org/pub/linux/video4linux.
 
   This driver is also available as a module called videodev.o ( = code
   which can be inserted in and removed from the running kernel
   whenever you want). If you want to compile it as a module, say M
   here and read Documentation/modules.txt.
 
+AIMSlab RadioTrack (aka RadioReveal) support
+CONFIG_RADIO_RTRACK
+  Choose Y here if you have one of these FM radio cards, and then fill
+  in the port address below.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video for Linux API.  Information on 
+  this API and pointers to "v4l" programs may be found on the WWW at
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
+  you need to have access to a machine on the Internet that has a 
+  program like lynx or netscape.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called radio-aimslab.o.
+
+RadioTrack i/o port
+CONFIG_RADIO_RTRACK_PORT
+  Enter either 0x30f or 0x20f here.  The card default is 0x30f, if you
+  haven't changed the jumper setting on the card.
+
+Aztech/Packard Bell Radio
+CONFIG_RADIO_AZTECH
+  Choose Y here if you have one of these FM radio cards, and then fill
+  in the port address below.
+  
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video for Linux API.  Information on 
+  this API and pointers to "v4l" programs may be found on the WWW at
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
+  you need to have access to a machine on the Internet that has a 
+  program like lynx or netscape.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called radio-aztech.o.
+
+Aztech/Packard Bell radio card i/o port
+CONFIG_RADIO_AZTECH_PORT
+  Enter either 0x350 or 0x358 here.  The card default is 0x350, if you
+  haven't changed the setting of jumper JP3 on the card.  Removing the
+  jumper sets the card to 0x358.
+
+SF16FMI Radio
+CONFIG_RADIO_SF16FMI
+  Choose Y here if you have one of these FM radio cards, and then fill
+  in the port address below.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video for Linux API.  Information on 
+  this API and pointers to "v4l" programs may be found on the WWW at
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
+  you need to have access to a machine on the Internet that has a 
+  program like lynx or netscape.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called radio-sf16fmi.o
+
+SF16FMI I/O port (0x284 or 0x384)
+CONFIG_RADIO_SF16FMI_PORT
+  Enter the I/O port of your SF16FMI radio card.
+
+Zoltrix Radio
+CONFIG_RADIO_ZOLTRIX
+  Choose Y here if you have one of these FM radio cards, and then fill
+  in the port address below.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video for Linux API.  Information on 
+  this API and pointers to "v4l" programs may be found on the WWW at
+  http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
+  you need to have access to a machine on the Internet that has a 
+  program like lynx or netscape.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called radio-zoltrix.o
+
+ZOLTRIX I/O port (0x20c or 0x30c)
+CONFIG_RADIO_ZOLTRIX_PORT
+  Enter the I/O port of your Zoltrix radio card.
+
 BT848 Video For Linux
 CONFIG_VIDEO_BT848
   Support for BT848 based frame grabber/overlay boards. This includes
@@ -9186,39 +9296,11 @@
   from the running kernel whenever you want). If you want to compile
   it as a module, say M here and read Documentation/modules.txt.
 
-# drivers/video section
-Open Firmware frame buffer device support 
-CONFIG_FB_OF
-  Say Y if you want support with Open Firmware for your graphics board.
-
-S3 Trio frame buffer device support 
-CONFIG_FB_S3TRIO
-  If you have a S3 Trio say Y. Say N for S3 Virge. 
-
-ATI Mach64 display support
-CONFIG_FB_ATY
-  This driver supports graphics boards with the ATI Mach64 chips.
-
-MDA dual-headed support
-CONFIG_FB_MDA
-  Say Y here if you have an old MDA or monochrome Hercules graphics
-  adapter in your system acting as a second head ( = videocard).  Do 
-  not enable this driver if your MDA card is the primary card in your
-  system; the normal VGA driver will handle it.
-  
-  This driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want).
-  The module will be called mdafb.o.  If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
-  
-  If unsure, say N.
-
-
-CPU Optimisation
+CPU Optimization
 CONFIG_CPU_ARM2
   This selects the processor type of your CPU.  This is only used to
-  determine C compiler optimisation options, and can affect the
-  compatability of the kernel on other processors.  If you specify
+  determine C compiler optimization options, and can affect the
+  compatibility of the kernel on other processors.  If you specify
   ARM6, the kernel should work on all 32-bit processors.  If you
   specify ARM2, ARM250 or ARM3, it should work on all 26-bit
   processors.  If you're not sure, set it to "None".
@@ -9232,8 +9314,8 @@
 
 Build Tools Selection
 CONFIG_BINUTILS_NEW
-  Say Y here if you're using GCC 2.8.1/EGCS with a binutils version >= 2.8.1
-  to compile the kernel.  Otherwise, say N.
+  Say Y here if you're using GCC 2.8.1/EGCS with a binutils 
+  version >= 2.8.1 to compile the kernel. Otherwise, say N.
 
 Compile kernel with frame pointer
 CONFIG_FRAME_POINTER
@@ -9247,9 +9329,9 @@
 
 #
 # A couple of things I keep forgetting:
-#   capitalize: Appletalk, Ethernet, DMA, FTP, Internet, Intel, IRQ, 
-#               Linux, NetWare, NFS, PCI, SCSI
-#   two words:  hard drive, hard disk, sound card
+#   capitalize: AppleTalk, Ethernet, DMA, FTP, Internet, Intel, IRQ, 
+#               Linux, NetWare, NFS, PCI, SCSI, SPARC
+#   two words:  hard drive, hard disk, sound card, home page
 #   other:      it's safe to save; daemon
 #
 # This is used by Emacs' spell checker ispell.el:
@@ -9259,20 +9341,20 @@
 # LocalWords:  cdrom diskless netboot nfs xzvf ATAPI MB ide pavia rubini pl pd
 # LocalWords:  HD CDROMs IDECD NEC MITSUMI filesystem XT XD PCI BIOS cezar ATEN
 # LocalWords:  ISA EISA Microchannel VESA BIOSes IPC SYSVIPC ipc Ctrl dmesg hlt
-# LocalWords:  BINFMT Linkable http ac uk jo html GCC Sparc AVANTI CABRIOLET EB
+# LocalWords:  BINFMT Linkable http ac uk jo html GCC SPARC AVANTI CABRIOLET EB
 # LocalWords:  netscape gcc LD CC toplevel MODVERSIONS insmod rmmod modprobe IP
 # LocalWords:  genksyms INET loopback gatewaying ethernet PPP ARP Arp MEMSIZE
 # LocalWords:  howto multicasting MULTICAST MBONE firewalling ipfw ACCT resp ip
 # LocalWords:  proc acct IPIP encapsulator decapsulator klogd PCTCP RARP EXT PS
 # LocalWords:  telnetting subnetted NAGLE rlogin NOSR ttyS TGA techinfo mbone nl
-# LocalWords:  Mb SKB IPX Novell dosemu Appletalk DDP ATALK tapedrive vmalloc
+# LocalWords:  Mb SKB IPX Novell dosemu Appletalk DDP ATALK vmalloc visar ehome
 # LocalWords:  SD CHR scsi thingy SG CD LUNs LUN jukebox Adaptec BusLogic EATA
 # LocalWords:  buslogic DMA DPT ATT eata dma PIO UltraStor fdomain umsdos ext
 # LocalWords:  QLOGIC qlogic TMC seagate Trantor ultrastor FASST wd NETDEVICES
-# LocalWords:  unix BBS linux nullmodem CSLIP PLIP Kirch's LDP CSlip SL SCC IRQ
+# LocalWords:  unix BBS linux CSLIP PLIP Kirch's LDP CSlip SL SCC IRQ csustan
 # LocalWords:  Turbo Laplink plip NCSA port's ReQuest IRQs EQL SMC AMD PCnet NE
-# LocalWords:  COM ELPLUS Com EtherLinkIII VLB Arcnet arcnet Cabletron DEPCA DE
-# LocalWords:  depca EtherWorks EWRK ewrk SEEQ EtherExpressPro EEXPRESS NI xxx
+# LocalWords:  COM ELPLUS Com EtherLinkIII VLB Arcnet Cabletron DEPCA DE carlos
+# LocalWords:  depca EtherWorks EWRK ewrk SEEQ EtherExpress EEXPRESS NI xxx dia
 # LocalWords:  EtherExpress WaveLAN wavelan PCLAN HPLAN VG SK Ansel Xen de ZNET
 # LocalWords:  PCMCIA cb stanford pcmcia LAN TEC RealTek ATP atp DLINK NetTools
 # LocalWords:  TR Sony CDU caddyless cdu Mitsumi MCD cd mcd XA MultiSession CDA
@@ -9285,7 +9367,7 @@
 # LocalWords:  PSMOUSE Compaq trackballs Travelmate Inport ATIXL ATI busmice ld
 # LocalWords:  gpm config QIC DYNCONF FTAPE Stor Ftape ftape pcsndrv manpage NT
 # LocalWords:  readprofile diskdrives org com masq EtherTalk tcp netrom sunacm
-# LocalWords:  misc AIC aic pio nullmodems scc Portmaster eql GIS PhotoCDs MCDX
+# LocalWords:  misc AIC aic pio scc Portmaster eql GIS PhotoCDs MCDX Perell PG
 # LocalWords:  mcdx gscd optcd sjcd ISP hdparm Workgroups Lan samba PARIDE PCD
 # LocalWords:  filesystems smbfs ATA ppp PCTech RZ www powerquest txt CMD ESDI
 # LocalWords:  chipset FB multicast MROUTE appletalk ifconfig IBMTR multiport
@@ -9297,14 +9379,14 @@
 # LocalWords:  dartmouth flowerpt MultiMaster FlashPoint tudelft etherexpress
 # LocalWords:  ICL EtherTeam ETH IDESCSI TXC SmartRAID SmartCache httpd sjc dlp
 # LocalWords:  thesphere TwoServers BOOTP DHCP ncpfs BPQETHER BPQ chipsets MG
-# LocalWords:  bsd comp Sparcstation le SunOS ie Gracilis PackeTwin PT pt LU FX
-# LocalWords:  FX TEAC SoundBlaster CR CreativeLabs LCS mS ramdisk IDETAPE cmd
+# LocalWords:  bsd comp SPARCstation le SunOS ie Gracilis PackeTwin PT pt LU FX
+# LocalWords:  FX TEAC CR LCS mS ramdisk IDETAPE cmd fperllo encis tcfs unisa
 # LocalWords:  Vertos Genoa Funai hsfs NCP NetWare tgz APM apm ioctls UltraLite
-# LocalWords:  TravelMate CDT LCD backlight VC RPC Mips DECStation AXP barlow
+# LocalWords:  TravelMate CDT LCD backlight VC RPC Mips AXP barlow cdrecord pg
 # LocalWords:  PMAX MILO Alphas Multia Tseng linuxelf endian mipsel mips drv HT
 # LocalWords:  KERNELD kerneld callouts AdvanSys advansys Admin WDT DataStor EP
 # LocalWords:  wdt hdb hdc bugfix SiS vlb Acculogic CSA DTC dtc Holtek ht QDI
-# LocalWords:  QD qd UMC umc ALI ali lena fnet fr homepage azstarnet axplinux
+# LocalWords:  QD qd UMC umc ALI ali lena fnet fr azstarnet axplinux cdr fb MDA
 # LocalWords:  Avanti XL AlphaStations Jensen DECpc AXPpci UDB Cabriolet MCA RC
 # LocalWords:  AlphaPC mca AOUT OUTput PPro sipx gwdg lo nwe FourPort Boca unm
 # LocalWords:  Keepalive linefill RELCOM keepalive analogue CDR conf CDI INIT
@@ -9319,13 +9401,13 @@
 # LocalWords:  DIGI Xe Xeve digiboard UMISC touchscreens mtu ethernets HBAs MEX
 # LocalWords:  Shifflett netcom js jshiffle WIC DECchip ELCP EtherPower dst RTC
 # LocalWords:  rtc SMP lp Digi Intl RightSwitch DGRS dgrs AFFS Amiga UFS SDL AP
-# LocalWords:  Solaris RISCom riscom syncPPP PCBIT pcbit sparc anu au artoo ufs
+# LocalWords:  Solaris RISCom riscom syncPPP PCBIT pcbit sparc anu au artoo MFB
 # LocalWords:  hitchcock Crynwr cnam pktdrvr NCSA's CyDROM CyCDROM FreeBSD NeXT
 # LocalWords:  NeXTstep disklabel disklabels SMD FFS tm AmigaOS diskfiles Un IQ
 # LocalWords:  Bernd informatik rwth aachen uae affs multihosting bytecode java
 # LocalWords:  applets applet JDK ncsa cabi SNI Alphatronix readme LANs scarab
-# LocalWords:  winsock RNIS caltech OSPF honour Honouring Mbit Localtalk DEFRAG
-# LocalWords:  localtalk download Packetwin Baycom baycom interwork ascii JNT
+# LocalWords:  winsock RNIS caltech OSPF honour Honouring Mbit LocalTalk DEFRAG
+# LocalWords:  localtalk download Packetwin Baycom baycom interwork ASCII JNT
 # LocalWords:  Camtec proxying indyramp defragment defragmented UDP FAS FASXX
 # LocalWords:  FastSCSI SIO FDC qlogicfas QLogic qlogicisp setbaycom ife ee LJ
 # LocalWords:  ethz ch Travelmates ProAudioSpectrum ProAudio SoundMan SB SBPro
@@ -9338,14 +9420,14 @@
 # LocalWords:  setsync NEGO MPARITY autotuning prefetch PIIX cdwrite utils rc
 # LocalWords:  PCWATCHDOG berkprod bitgate boldt ucsb jf kyoto jp euc Tetsuyasu 
 # LocalWords:  YAMADA tetsu cauchy nslab ntt nevod perm su doc kaf kheops wsc
-# LocalWords:  traduc Bourgin dbourgin helptext menuconfig kfill READMEs HOWTOs
+# LocalWords:  traduc Bourgin dbourgin menuconfig kfill READMEs HOWTOs Virge WA
 # LocalWords:  IDEDISK IDEFLOPPY EIDE firewalls QMAGIC ZMAGIC LocalWords opti
 # LocalWords:  SVGATextMode vga svga Xterminal Xkernel syr jmwobus comfaqs dhcp
 # LocalWords:  IPv IPng interoperability ipng ipv radio's tapr pkthome PLP nano
 # LocalWords:  Ses Mhz sethdlc SOUNDMODEM WindowsSoundSystem smdiag pcf inka ES
 # LocalWords:  smmixer ptt circ soundmodem MKISS FDDI DEFEA DEFPA DEFXX redhat
 # LocalWords:  HyperNews khg mconv sed lina wuftpd MicroChannel netlink irc cum
-# LocalWords:  raudio realaudio PPROP NETBIOS GUI IBMMCA ELMC Racal Interlan fi
+# LocalWords:  raudio RealAudio PPROP NETBIOS GUI IBMMCA ELMC Racal Interlan fi
 # LocalWords:  eth shapecfg src esp PCWD PREVSTAT bootparam sig bitwizard SBC
 # LocalWords:  downloads AFSK TCM FP Karn KA FSK RUH LinkSys cron mouseman LLC
 # LocalWords:  SyQuest SyQuest's CCITT MicroSolutions BPCD bpcd ESPSERIAL PROM
@@ -9357,13 +9439,13 @@
 # LocalWords:  Rhotron BioData's Multiface AMIGAMOUSE COPCON Amiga's bitplanes
 # LocalWords:  ATARIMOUSE MFPSER SCC's MegaSTE ESCC Atari's GVPIOEXT DMASOUND
 # LocalWords:  fdutils cisco univercd rpcg htm iface lapb LAPBETHER tpqic qic
-# LocalWords:  SYNTH xd en binfmt aout ipip terra ipx fileserver sd sr sg wic
+# LocalWords:  SYNTH xd en binfmt aout ipip terra ipx sd sr sg wic framebuffer
 # LocalWords:  ibmmca lapbether mkiss dlci sdla fmv eepro eexpress ni hp ne es
 # LocalWords:  ibmtr isofs ROMFS romfs pcxx cyclades istallion psaux msbusmouse
 # LocalWords:  atixlmouse sbin softdog pcwd USS Lite ACI miroSOUND PCM miroPCM
 # LocalWords:  microcontroller miro Voxware downloading teles acsi slm gvp ltpc
 # LocalWords:  atari ariadne amigamouse atarimouse builtin IPDDP maths bradford
-# LocalWords:  LocalTalk AppleTalk Farallon PhoneNet Zubkoff lnz SCCB HAPN WANs
+# LocalWords:  AppleTalk Farallon PhoneNet Zubkoff lnz SCCB HAPN WANs vesafb nt
 # LocalWords:  wanrouter WANPIPE multiprotocol Mbps wanpipe EtherWORKS nodma SC
 # LocalWords:  smp HiSax SiemensChipSet Siemens AVM Elsa ITK hisax PCC MICROR
 # LocalWords:  Mircolink EURO DSS Spellcaster BRI sc spellcast Digiboards GPIO
@@ -9371,7 +9453,7 @@
 # LocalWords:  loader's PCnetPCI automounter AUTOFS amd autofs VT Gallant's Pnp
 # LocalWords:  AEDSP aedsp enskip tik Sysctl sysctl PARPORT parport pnp IDs EPP
 # LocalWords:  Autoprobe bart patrickr HDLS READBACK AB usr DAMA DS SparQ aten
-# LocalWords:  Symbios PCscsi tmscsim RoamAbout GHz Hinds' contrib mathematik
+# LocalWords:  Symbios PCscsi tmscsim RoamAbout GHz Hinds contrib mathematik ok
 # LocalWords:  darmstadt okir DIGIEPCA International's Xem digiepca epca bootup
 # LocalWords:  zorro CAPI AVMB capi avmb VP SYN syncookies EM em pc Ethertalk
 # LocalWords:  Dayna DL Daynatalk LT PhoneNET ATB Daystar queueing CMDS SCBs ls
@@ -9380,8 +9462,8 @@
 # LocalWords:  stuttgart rdist TRANS hostnames mango jukeboxes ESS userland PD
 # LocalWords:  hardlinked NAMETRANS env mtab fstab umount nologin runlevel gid
 # LocalWords:  transname filespace adm Nodename hostname uname Kernelname bootp
-# LocalWords:  KERNNAME kname ktype kernelname Kerneltype KERNTYPE Alt RX
-# LocalWords:  dataless kerneltype SYSNAME Netbeui Comtrol Rocketport palmtop
+# LocalWords:  KERNNAME kname ktype kernelname Kerneltype KERNTYPE Alt RX mdafb
+# LocalWords:  dataless kerneltype SYSNAME Comtrol Rocketport palmtop
 # LocalWords:  nvram SYSRQ SysRq PrintScreen sysrq NVRAMs NvRAM Shortwave RTTY
 # LocalWords:  HFMODEM shortwave Sitor Amtor Pactor GTOR hfmodem hayes TX TMOUT
 # LocalWords:  IDEPCI IDEDMA idedma PDC pdc TRM trm raidtools luthien nuclecu
@@ -9390,8 +9472,8 @@
 # LocalWords:  misconfigured autoconfiguration IPGRE ICMP tracert ipautofw PIM
 # LocalWords:  netis rlynch autofw ipportfw monmouth ipsubs portforwarding pimd
 # LocalWords:  portfw PIMSM netweb usc pim pf EUI aggregatable PB decapsulate
-# LocalWords:  ipddp Decapsulation DECAP bool HAMRADIO tcpdump af CDs tx
-# LocalWords:  ethertap multisession PPC MMIO GDT GDTH ICP gdth hamradio LAN's
+# LocalWords:  ipddp Decapsulation DECAP bool HAMRADIO tcpdump af CDs tx FBCON
+# LocalWords:  ethertap multisession PPC MMIO GDT GDTH ICP gdth hamradio  bpp
 # LocalWords:  lmh weejock AIMSlab RadioTrack RTRACK HZP OptoSCC TRX rx TRXECHO
 # LocalWords:  DMASCC paccomm dmascc addr cfg oevsv oe kib picpar FDX baudrate
 # LocalWords:  baudrates fdx HDX hdx PSK kanren frforum QoS SCHED CBQ SCH sched
@@ -9424,9 +9506,14 @@
 # LocalWords:  teletext WinTV saa iproute tc Quadra Performa PowerBook tor AUN
 # LocalWords:  setserial compsoc steve Econet econet AUNUDP psched TEQL TLE CLS
 # LocalWords:  teql FW Ingres TwistedPair MTRR MTRRs mtrr cfs crypto TD ktti KT
-# LocalWords:  PHd ICS ipchains adelaide rustcorp syslog epp Cumana
+# LocalWords:  PHd ICS ipchains adelaide rustcorp syslog Cumana steganography
 # LocalWords:  AcornSCSI EcoSCSI EESOX EESOXSCSI Powertec POWERTECSCSI dec SF
 # LocalWords:  RadioReveal gatekeeper aimslab aztech FMI sf fmi RTL rtl cesdis
 # LocalWords:  Yellowfin gsfc nasa gov yellowfin pcnet Mylex LNE lne EtherH hs
 # LocalWords:  EBSA chattr RiscOS Winmodem AGP Atomwide DUALSP pcsp robinson
-# LocalWords:  SGALAXY Waverider DSPxxx TRXPRO AudioTrix OSWF MOT
+# LocalWords:  SGALAXY Waverider DSPxxx TRXPRO AudioTrix OSWF MOT CFB DSY kbps
+# LocalWords:  tuwien kkudielk LVD mega lun MAXTAGS Gbps arcnet Olicom SKTR SNA
+# LocalWords:  SysKonnect sktr sna etherboot ufs NetBEUI MultiSound MSNDCLAS
+# LocalWords:  MSNDINIT MSNDPERM MSNDPIN PNDSPINI PNDSPERM Ensoniq's
+# LocalWords:  AudioPCI lspci SonicVibes sonicvibes SPARCs roadrunner
+# LocalWords:  swansea shtml Zoltrix zoltrix BINUTILS EGCS binutils VIDC DACs
diff -u --recursive --new-file v2.1.110/linux/Documentation/VGA-softcursor.txt linux/Documentation/VGA-softcursor.txt
--- v2.1.110/linux/Documentation/VGA-softcursor.txt	Wed Jun 24 22:54:01 1998
+++ linux/Documentation/VGA-softcursor.txt	Tue Jul 21 10:28:23 1998
@@ -31,3 +31,10 @@
    The third parameter consists of character attribute bits you want to set.
 Bit setting takes place before bit toggling, so you can simply clear a bit by 
 including it in both the set mask and the toggle mask.
+
+Examples:
+=========
+
+To get normal blinking underline, use: echo -e '\033[?2c'
+To get blinking block, use:            echo -e '\033[?6c'
+To get red non-blinking block, use:    echo -e '\033[?17;0;64c'
diff -u --recursive --new-file v2.1.110/linux/Documentation/hayes-esp.txt linux/Documentation/hayes-esp.txt
--- v2.1.110/linux/Documentation/hayes-esp.txt	Wed Jun 24 22:54:02 1998
+++ linux/Documentation/hayes-esp.txt	Fri Jul 24 11:10:17 1998
@@ -1,4 +1,4 @@
-HAYES ESP DRIVER VERSION 2.0
+HAYES ESP DRIVER VERSION 2.1
 
 A big thanks to the people at Hayes, especially Alan Adamson.  Their support
 has enabled me to provide enhancements to the driver.
@@ -6,20 +6,26 @@
 Please report your experiences with this driver to me (arobinso@nyx.net).  I
 am looking for both positive and negative feedback.
 
-*** IMPORTANT CHANGES FOR 2.0 ***
+*** IMPORTANT CHANGES FOR 2.1 ***
 Support for PIO mode.  Five situations will cause PIO mode to be used:
 1) A multiport card is detected.  PIO mode will always be used.  (8 port cards
 do not support DMA).
 2) The DMA channel is set to an invalid value (anything other than 1 or 3).
 3) The DMA buffer/channel could not be allocated.  The port will revert to PIO
 mode until it is reopened.
-4) Less than 33 bytes need to be transferred to/from the FIFOs.  PIO mode will
-be used for that transfer only.
+4) Less than a specified number of bytes need to be transferred to/from the
+FIFOs.  PIO mode will be used for that transfer only.
 5) A port needs to do a DMA transfer and another port is already using the
 DMA channel.  PIO mode will be used for that transfer only.
 
-A patch for setserial (2.12) is included to allow the ESP enhanced mode
-configuration to be viewed and changed.
+Since the Hayes ESP seems to conflict with other cards (notably sound cards)
+when using DMA, DMA is turned off by default.  To use DMA, it must be turned
+on explicitly, either with the "dma=" option described below or with
+setserial.  A multiport card can be forced into DMA mode by using setserial;
+however, most multiport cards don't support DMA.
+
+The latest version of setserial allows the enhanced configuration of the ESP
+card to be viewed and modified.
 ***
 
 This package contains the files needed to compile a module to support the Hayes
@@ -33,20 +39,9 @@
   reducing CPU load
 - Supports primary and secondary ports
 
-To compile/install:
 
-Examine the first section of esp.h to verify that the definitions are
-acceptable.  If they are not, change them.
-DMA_CHANNEL must be either 1 or 3.
-ESP_BH should be set to a value not in use by the system.  If the system
-is not configured with RISCOM8 support, the default should be fine.
-
-Examine the Makefile, and make any appropriate changes.
-
-Type 'make' to compile the module.  The module will be called 'esp.o'.  Typing
-'make install' will install the module in /lib/modules/misc.  The module can
-be inserted and removed as usual (insmod, rmmod, etc.).  The IRQs to use can
-be specified by using the irq= option.  The format is:
+If the driver is compiled as a module, the IRQs to use can be specified by
+using the irq= option.  The format is:
 
 irq=[0x100],[0x140],[0x180],[0x200],[0x240],[0x280],[0x300],[0x380]
 
@@ -101,6 +96,12 @@
 receive timeout to 255, the insmod command would be:
 
 insmod esp rx_timeout=255
+
+The pio_threshold= option sets the threshold (in number of characters) for
+using PIO mode instead of DMA mode.  For example, if this value is 32,
+transfers of 32 bytes or less will always use PIO mode.
+
+insmod esp pio_threshold=32
 
 Multiple options can be listed on the insmod command line by separating each
 option with a space.  For example:
diff -u --recursive --new-file v2.1.110/linux/Documentation/networking/tlan.txt linux/Documentation/networking/tlan.txt
--- v2.1.110/linux/Documentation/networking/tlan.txt	Wed Dec 31 16:00:00 1969
+++ linux/Documentation/networking/tlan.txt	Fri Jul 24 11:15:05 1998
@@ -0,0 +1,140 @@
+TLAN driver for Linux, version 1.0
+README
+
+Well, I'm back.  The TLAN driver seems pretty stable, so I'm
+declaring this cycle of development finished, and calling the
+driver 1.0.  I will, of course continue to work on improving
+the driver, and work towards a 2.0 release.
+
+
+James
+james@sovereign.org
+
+
+
+I.  Supported Devices.
+
+    Only PCI devices will work with this driver.
+
+    Supported:
+    Vendor ID	Device ID	Name
+    0e11	ae32		Compaq Netelligent 10/100 TX PCI UTP
+    0e11	ae34		Compaq Netelligent 10 T PCI UTP
+    0e11	ae35		Compaq Integrated NetFlex 3/P
+    0e11	ae40		Compaq Netelligent Dual 10/100 TX PCI UTP
+    0e11	ae43		Compaq Netelligent Integrated 10/100 TX UTP
+    0e11	b011		Compaq Netelligent 10/100 TX Embedded UTP
+    0e11	b012		Compaq Netelligent 10 T/2 PCI UTP/Coax
+    0e11	b030		Compaq Netelligent 10/100 TX UTP
+    0e11	f130		Compaq NetFlex 3/P
+    0e11	f150		Compaq NetFlex 3/P
+    108d	0012		Olicom OC-2325	
+    108d	0013		Olicom OC-2183
+    108d	0014		Olicom OC-2326	
+
+
+    Caveats:
+    
+    I am not sure if 100BaseTX daughterboards (for those cards which
+    support such things) will work.  I haven't had any solid evidence
+    either way.
+
+    However, if a card supports 100BaseTx without requiring an add
+    on daughterboard, it should work with 100BaseTx.
+
+    The "Netelligent 10 T/2 PCI UTP/Coax" (b012) device is untested,
+    but I do not expect any problems.
+    
+
+II.  Building the Driver.
+
+    The TLAN driver may be compiled into the kernel, or it may be compiled
+    as a module separately, or in the kernel.  A patch is included for
+    2.0.29 (which also works for 2.0.30, 2.0.31, and 2.0.32).
+
+    To compile it as part of the kernel:
+        1. Download and untar the TLAN driver package.
+	2. If your kernel is 2.1.45 or later, you do not need to patch the
+           kernel sources.  Copy the tlan.c and tlan.h to drivers/net in
+           the kernel source tree.
+        3. Otherwise, apply the appropriate patch for your kernel.  For
+	   example:
+
+	       cd /usr/src/linux
+               patch -p1 < kernel.2.0.29
+
+        4. Copy the files tlan.c and tlan.h from the TLAN package to the
+           directory drivers/net in the Linux kernel source tree.
+        5. Configure your kernel for the TLAN driver.  Answer 'Y' when
+           prompted to ask about experimental code (the first question).
+           Then answer 'Y' when prompted if to include TI ThunderLAN
+           support.  If you want the driver compiled as a module, answer 'M'
+           instead of 'Y'.
+        6. Make the kernel and, if necessary, the modules.
+    
+    To compile the TLAN driver independently:
+        1. Download and untar the TLAN driver package.
+        2. Change to the tlan directory.
+        3. If you are NOT using a versioned kernel (ie, want an non-
+           versioned module), edit the Makefile, and comment out the
+           line:
+                 MODVERSIONS = -DMODVERSIONS
+        4. Run 'make'.
+
+
+III.  Driver Options
+	1. You can append debug=x to the end of the insmod line to get
+           debug messages, where x is a bit field where the bits mean
+	   the following:
+	   
+	   0x01		Turn on general debugging messages.
+	   0x02		Turn on receive debugging messages.
+	   0x04		Turn on transmit debugging messages.
+	   0x08		Turn on list debugging messsages.
+
+	2. You can append aui=1 to the end of the insmod line to cause
+           the adapter to use the AUI interface instead of the 10 Base T
+           interface.  This is also what to do if you want to use the BNC
+	   connector on a TLAN based device.  (Setting this option on a
+	   device that does not have an AUI/BNC connector will probably
+	   cause it to not function correctly.)
+
+	4. You can set duplex=1 to force half duplex, and duplex=2 to
+	   force full duplex.
+
+	5. You can set speed=10 to force 10Mbs operation, and speed=100Mbs
+	   to force 100Mbs operation. (I'm not sure what will happen
+	   if a card which only supports 10Mbs is forced into 100Mbs
+	   mode.)
+
+	3. If the driver is built into the kernel, you can use the 3rd
+	   and 4th parameters to set aui and debug respectively.  For
+	   example:
+
+	   ether=0,0,0x1,0x7,eth0
+
+	   This sets aui to 0x1 and debug to 0x7, assuming eth0 is a
+	   supported TLAN device.
+
+	   The bits in the third byte are assigned as follows:
+
+		0x01 = aui
+		0x02 = use SA_INTERRUPT flag when reserving the irq.
+		0x04 = use half duplex
+		0x08 = use full duplex
+		0x10 = use 10BaseT
+		0x20 = use 100BaseTx
+
+
+IV.  Things to try if you have problems.
+	1. Make sure your card's PCI id is among those listed in
+	   section I, above.
+	1. Make sure routing is correct.
+	2. If you are using a 2.1.x kernel, try to duplicate the
+	   problem on a 2.0.x (preferably 2.0.29 or 2.0.30) kernel.
+
+
+There is also a tlan mailing list which you can join by sending "subscribe tlan"
+in the body of an email to majordomo@vuser.vu.union.edu.
+
+
diff -u --recursive --new-file v2.1.110/linux/Documentation/sound/AWE32 linux/Documentation/sound/AWE32
--- v2.1.110/linux/Documentation/sound/AWE32	Thu Jul 16 18:09:22 1998
+++ linux/Documentation/sound/AWE32	Wed Jul 22 13:43:56 1998
@@ -65,7 +65,7 @@
 is not working. You should use the patch available at 
 http://members.xoom.com/yar/history.html. If you are using stable kernel
 releases 2.0.x, then get the latest version (3.8s9) of 
-OSS/Free at http://members.xoom.com/yar/ossfree38s9-linux20x.tar.gz
+OSS/Free at ftp://ftp.4front-tech.com/ossfree/ossfree38s9-linux20x.tar.gz
 and gunzip/untar it in /usr/src/ (assuming you keep your kernel source in
 /usr/src/linux).  Then go to /usr/src/linux/ and view the README file. That
 file contains info about kernel compilation and installation.
@@ -89,8 +89,8 @@
 Now recompile the kernel (make dep; make (b)zImage; make modules; 
 make modules_install), update your boot loader and boot new kernel.
 
-6) Now download awesfx program 
-http://members.xoom.com/yar/awesfx-0.4.2.tgz here. Compile it.
+6) Now download awesfx program from
+http://bahamut.mm.t.u-tokyo.ac.jp/~iwai/awedrv/index.html#Latest. Compile it.
 Copy sfxload program to /bin (or /sbin if you wish). To enable AWE midi 
 synthesis you should also get the sound bank file for general midi from
 http://members.xoom.com/yar/synthgm.sbk.gz. Copy it to
@@ -110,7 +110,7 @@
 To play midi files you should get one of these programs:
 
 Playmidi 2.4 or higher: http://playmidi.openprojects.net
-Drvmidi 4.2.b: http://members.xoom.com/yar/awemidi-0.4.2b.tgz
+Drvmidi 4.2.b: http://bahamut.mm.t.u-tokyo.ac.jp/~iwai/awedrv/index.html#Latest
 
 (These are available at all major Linux FTP sites and may already be
  in your distribution)
diff -u --recursive --new-file v2.1.110/linux/Documentation/tlan.txt linux/Documentation/tlan.txt
--- v2.1.110/linux/Documentation/tlan.txt	Tue Jul 21 00:15:29 1998
+++ linux/Documentation/tlan.txt	Wed Dec 31 16:00:00 1969
@@ -1,135 +0,0 @@
-TLAN driver for Linux, version 1.0
-README
-
-Well, I'm back.  The TLAN driver seems pretty stable, so I'm
-declaring this cycle of development finished, and calling the
-driver 1.0.  I will, of course continue to work on improving
-the driver, and work towards a 2.0 release.
-
-
-
-I.  Supported Devices.
-
-    Only PCI devices will work with this driver.
-
-    Supported:
-    Vendor ID	Device ID	Name
-    0e11	ae32		Compaq Netelligent 10/100 TX PCI UTP
-    0e11	ae34		Compaq Netelligent 10 T PCI UTP
-    0e11	ae35		Compaq Integrated NetFlex 3/P
-    0e11	ae40		Compaq Netelligent Dual 10/100 TX PCI UTP
-    0e11	ae43		Compaq Netelligent Integrated 10/100 TX UTP
-    0e11	b011		Compaq Netelligent 10/100 TX Embedded UTP
-    0e11	b012		Compaq Netelligent 10 T/2 PCI UTP/Coax
-    0e11	b030		Compaq Netelligent 10/100 TX UTP
-    0e11	f130		Compaq NetFlex 3/P
-    0e11	f150		Compaq NetFlex 3/P
-    108d	0012		Olicom OC-2325	
-    108d	0013		Olicom OC-2183
-    108d	0014		Olicom OC-2326	
-
-
-    Caveats:
-    
-    I am not sure if 100BaseTX daughterboards (for those cards which
-    support such things) will work.  I haven't had any solid evidence
-    either way.
-
-    However, if a card supports 100BaseTx without requiring an add
-    on daughterboard, it should work with 100BaseTx.
-
-    The "Netelligent 10 T/2 PCI UTP/Coax" (b012) device is untested,
-    but I do not expect any problems.
-    
-
-II.  Building the Driver.
-
-    The TLAN driver may be compiled into the kernel, or it may be compiled
-    as a module separately, or in the kernel.  A patch is included for
-    2.0.29 (which also works for 2.0.30, 2.0.31, and 2.0.32).
-
-    To compile it as part of the kernel:
-        1. Download and untar the TLAN driver package.
-	2. If your kernel is 2.1.45 or later, you do not need to patch the
-           kernel sources.  Copy the tlan.c and tlan.h to drivers/net in
-           the kernel source tree.
-        3. Otherwise, apply the appropriate patch for your kernel.  For
-	   example:
-
-	       cd /usr/src/linux
-               patch -p1 < kernel.2.0.29
-
-        4. Copy the files tlan.c and tlan.h from the TLAN package to the
-           directory drivers/net in the Linux kernel source tree.
-        5. Configure your kernel for the TLAN driver.  Answer 'Y' when
-           prompted to ask about experimental code (the first question).
-           Then answer 'Y' when prompted if to include TI ThunderLAN
-           support.  If you want the driver compiled as a module, answer 'M'
-           instead of 'Y'.
-        6. Make the kernel and, if necessary, the modules.
-    
-    To compile the TLAN driver independently:
-        1. Download and untar the TLAN driver package.
-        2. Change to the tlan directory.
-        3. If you are NOT using a versioned kernel (ie, want an non-
-           versioned module), edit the Makefile, and comment out the
-           line:
-                 MODVERSIONS = -DMODVERSIONS
-        4. Run 'make'.
-
-
-III.  Driver Options
-	1. You can append debug=x to the end of the insmod line to get
-           debug messages, where x is a bit field where the bits mean
-	   the following:
-	   
-	   0x01		Turn on general debugging messages.
-	   0x02		Turn on receive debugging messages.
-	   0x04		Turn on transmit debugging messages.
-	   0x08		Turn on list debugging messsages.
-
-	2. You can append aui=1 to the end of the insmod line to cause
-           the adapter to use the AUI interface instead of the 10 Base T
-           interface.  This is also what to do if you want to use the BNC
-	   connector on a TLAN based device.  (Setting this option on a
-	   device that does not have an AUI/BNC connector will probably
-	   cause it to not function correctly.)
-
-	4. You can set duplex=1 to force half duplex, and duplex=2 to
-	   force full duplex.
-
-	5. You can set speed=10 to force 10Mbs operation, and speed=100Mbs
-	   to force 100Mbs operation. (I'm not sure what will happen
-	   if a card which only supports 10Mbs is forced into 100Mbs
-	   mode.)
-
-	3. If the driver is built into the kernel, you can use the 3rd
-	   and 4th parameters to set aui and debug respectively.  For
-	   example:
-
-	   ether=0,0,0x1,0x7,eth0
-
-	   This sets aui to 0x1 and debug to 0x7, assuming eth0 is a
-	   supported TLAN device.
-
-	   The bits in the third byte are assigned as follows:
-
-		0x01 = aui
-		0x02 = use SA_INTERRUPT flag when reserving the irq.
-		0x04 = use half duplex
-		0x08 = use full duplex
-		0x10 = use 10BaseT
-		0x20 = use 100BaseTx
-
-
-IV.  Things to try if you have problems.
-	1. Make sure your card's PCI id is among those listed in
-	   section I, above.
-	1. Make sure routing is correct.
-	2. If you are using a 2.1.x kernel, try to duplicate the
-	   problem on a 2.0.x (preferably 2.0.29 or 2.0.30) kernel.
-
-
-There is also a tlan mailing list which you can join by sending "subscribe tlan"
-in the body of an email to majordomo@vuser.vu.union.edu.
-
diff -u --recursive --new-file v2.1.110/linux/Makefile linux/Makefile
--- v2.1.110/linux/Makefile	Tue Jul 21 00:15:29 1998
+++ linux/Makefile	Tue Jul 21 00:23:48 1998
@@ -1,6 +1,6 @@
 VERSION = 2
 PATCHLEVEL = 1
-SUBLEVEL = 110
+SUBLEVEL = 111
 
 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
 
diff -u --recursive --new-file v2.1.110/linux/arch/alpha/kernel/entry.S linux/arch/alpha/kernel/entry.S
--- v2.1.110/linux/arch/alpha/kernel/entry.S	Tue Jun 23 10:01:19 1998
+++ linux/arch/alpha/kernel/entry.S	Wed Jul 22 12:44:48 1998
@@ -30,10 +30,12 @@
 /*
  * task structure offsets
  */
-#define TASK_STATE	 0
-#define TASK_FLAGS	 8
-#define TASK_SIGPENDING	16
-#define TASK_SIZE	24	
+#define TASK_STATE		0
+#define TASK_FLAGS		8
+#define TASK_SIGPENDING		16
+#define TASK_ADDR_LIMIT		24	
+#define TASK_EXEC_DOMAIN	32
+#define TASK_NEED_RESCHED	40
 
 /*
  * task flags (must match include/linux/sched.h):
@@ -616,8 +618,7 @@
 	and	$0,8,$0
 	beq	$0,restore_all
 ret_from_reschedule:
-	lda	$0,need_resched
-	ldl	$2,0($0)
+	ldq	$2,TASK_NEED_RESCHED($8)
 	lda	$4,init_task_union
 	bne	$2,reschedule
 	xor	$4,$8,$4
diff -u --recursive --new-file v2.1.110/linux/arch/alpha/kernel/ptrace.c linux/arch/alpha/kernel/ptrace.c
--- v2.1.110/linux/arch/alpha/kernel/ptrace.c	Thu May  7 22:51:46 1998
+++ linux/arch/alpha/kernel/ptrace.c	Wed Jul 22 12:44:48 1998
@@ -23,13 +23,13 @@
 
 #ifdef DEBUG
 
-  enum {
-      DBG_MEM		= (1<<0),
-      DBG_BPT		= (1<<1),
-      DBG_MEM_ALL	= (1<<2)
-  };
+enum {
+	DBG_MEM		= (1<<0),
+	DBG_BPT		= (1<<1),
+	DBG_MEM_ALL	= (1<<2)
+};
 
-  int debug_mask = DBG_BPT;
+int debug_mask = DBG_BPT;
 
 # define DBG(fac,args)	{if ((fac) & debug_mask) printk args;}
 
@@ -150,7 +150,7 @@
  * no checking.
  */
 static unsigned long get_long(struct task_struct * tsk,
-	struct vm_area_struct * vma, unsigned long addr)
+			      struct vm_area_struct * vma, unsigned long addr)
 {
 	pgd_t * pgdir;
 	pmd_t * pgmiddle;
@@ -158,7 +158,7 @@
 	unsigned long page;
 
 	DBG(DBG_MEM_ALL, ("getting long at 0x%lx\n", addr));
-repeat:
+ repeat:
 	pgdir = pgd_offset(vma->vm_mm, addr);
 	if (pgd_none(*pgdir)) {
 		handle_mm_fault(tsk, vma, addr, 0);
@@ -185,7 +185,7 @@
 		goto repeat;
 	}
 	page = pte_page(*pgtable);
-/* this is a hack for non-kernel-mapped video buffers and similar */
+	/* this is a hack for non-kernel-mapped video buffers and similar */
 	if (MAP_NR(page) >= max_mapnr)
 		return 0;
 	page += addr & ~PAGE_MASK;
@@ -202,14 +202,14 @@
  * even if a debugger scribbles breakpoints into it.  -M.U-
  */
 static void put_long(struct task_struct * tsk, struct vm_area_struct * vma,
-	unsigned long addr, unsigned long data)
+		     unsigned long addr, unsigned long data)
 {
 	pgd_t *pgdir;
 	pmd_t *pgmiddle;
 	pte_t *pgtable;
 	unsigned long page;
 
-repeat:
+ repeat:
 	pgdir = pgd_offset(vma->vm_mm, addr);
 	if (!pgd_present(*pgdir)) {
 		handle_mm_fault(tsk, vma, addr, 1);
@@ -240,11 +240,14 @@
 		handle_mm_fault(tsk, vma, addr, 1);
 		goto repeat;
 	}
-/* this is a hack for non-kernel-mapped video buffers and similar */
+
+	/* This is a hack for non-kernel-mapped video buffers and similar.  */
 	if (MAP_NR(page) < max_mapnr)
 		*(unsigned long *) (page + (addr & ~PAGE_MASK)) = data;
-/* we're bypassing pagetables, so we have to set the dirty bit ourselves */
-/* this should also re-instate whatever read-only mode there was before */
+
+	/* We're bypassing pagetables, so we have to set the dirty bit
+	   ourselves.  This should also re-instate whatever read-only
+	   mode there was before.  */
 	set_pte(pgtable, pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
 	flush_tlb();
 }
@@ -296,11 +299,11 @@
 		addr -= align;
 		low = get_long(tsk, vma, addr);
 		if (align) {
-		    unsigned long high;
+			unsigned long high;
 
-		    high = get_long(tsk, vma_high, addr + sizeof(long));
-		    low >>= align * 8;
-		    low  |= high << (64 - align * 8);
+			high = get_long(tsk, vma_high, addr + sizeof(long));
+			low >>= align * 8;
+			low  |= high << (64 - align * 8);
 		}
 		*result = low;
 	} else {
@@ -317,7 +320,7 @@
  * within the task area. It then calls put_long() to write a long.
  */
 static int write_long(struct task_struct * tsk, unsigned long addr,
-	unsigned long data)
+		      unsigned long data)
 {
 	struct vm_area_struct * vma = find_extend_vma(tsk, addr);
 
@@ -361,7 +364,7 @@
 
 	res = read_long(tsk, addr, &l);
 	if (res < 0)
-	  return res;
+		return res;
 
 	if (align == 0) {
 		*data = l;
@@ -388,7 +391,7 @@
 
 	res = read_long(tsk, addr, &l);
 	if (res < 0)
-	  return res;
+		return res;
 
 	if (align == 0) {
 		l = (l & 0xffffffff00000000UL) | ((unsigned long) data <<  0);
@@ -410,7 +413,7 @@
 	pc  = get_reg(child, REG_PC);
 	res = read_int(child, pc, &insn);
 	if (res < 0)
-	  return res;
+		return res;
 
 	op_code = insn >> 26;
 	if (op_code >= 0x30) {
@@ -423,31 +426,31 @@
 		 * branch (emulation can be tricky for fp branches).
 		 */
 		displ = ((s32)(insn << 11)) >> 9;
-		child->debugreg[nsaved++] = pc + 4;
+		child->tss.debugreg[nsaved++] = pc + 4;
 		if (displ)		/* guard against unoptimized code */
-		  child->debugreg[nsaved++] = pc + 4 + displ;
+			child->tss.debugreg[nsaved++] = pc + 4 + displ;
 		DBG(DBG_BPT, ("execing branch\n"));
 	} else if (op_code == 0x1a) {
 		reg_b = (insn >> 16) & 0x1f;
-		child->debugreg[nsaved++] = get_reg(child, reg_b);
+		child->tss.debugreg[nsaved++] = get_reg(child, reg_b);
 		DBG(DBG_BPT, ("execing jump\n"));
 	} else {
-		child->debugreg[nsaved++] = pc + 4;
+		child->tss.debugreg[nsaved++] = pc + 4;
 		DBG(DBG_BPT, ("execing normal insn\n"));
 	}
 
 	/* install breakpoints: */
 	for (i = 0; i < nsaved; ++i) {
-		res = read_int(child, child->debugreg[i], &insn);
+		res = read_int(child, child->tss.debugreg[i], &insn);
 		if (res < 0)
-		  return res;
-		child->debugreg[i + 2] = insn;
-		DBG(DBG_BPT, ("    -> next_pc=%lx\n", child->debugreg[i]));
-		res = write_int(child, child->debugreg[i], BREAKINST);
+			return res;
+		child->tss.debugreg[i + 2] = insn;
+		DBG(DBG_BPT, ("    -> next_pc=%lx\n", child->tss.debugreg[i]));
+		res = write_int(child, child->tss.debugreg[i], BREAKINST);
 		if (res < 0)
-		  return res;
+			return res;
 	}
-	child->debugreg[4] = nsaved;
+	child->tss.debugreg[4] = nsaved;
 	return 0;
 }
 
@@ -457,17 +460,18 @@
  */
 int ptrace_cancel_bpt(struct task_struct * child)
 {
-	int i, nsaved = child->debugreg[4];
+	int i, nsaved = child->tss.debugreg[4];
 
-	child->debugreg[4] = 0;
+	child->tss.debugreg[4] = 0;
 
 	if (nsaved > 2) {
-	    printk("ptrace_cancel_bpt: bogus nsaved: %d!\n", nsaved);
-	    nsaved = 2;
+		printk("ptrace_cancel_bpt: bogus nsaved: %d!\n", nsaved);
+		nsaved = 2;
 	}
 
 	for (i = 0; i < nsaved; ++i) {
-		write_int(child, child->debugreg[i], child->debugreg[i + 2]);
+		write_int(child, child->tss.debugreg[i],
+			  child->tss.debugreg[i + 2]);
 	}
 	return (nsaved != 0);
 }
@@ -506,7 +510,8 @@
 		     (current->uid != child->uid) ||
 		     (current->gid != child->egid) ||
 		     (current->gid != child->sgid) ||
-		     (current->gid != child->gid)) && !capable(CAP_SYS_PTRACE))
+		     (current->gid != child->gid))
+		    && !capable(CAP_SYS_PTRACE))
 			goto out;
 		/* the same process cannot be attached many times */
 		if (child->flags & PF_PTRACED)
@@ -537,107 +542,107 @@
 	}
 
 	switch (request) {
-	/* when I and D space are separate, these will need to be fixed. */
-		case PTRACE_PEEKTEXT: /* read word at location addr. */
-		case PTRACE_PEEKDATA: {
-			unsigned long tmp;
-
-			ret = read_long(child, addr, &tmp);
-			DBG(DBG_MEM, ("peek %#lx->%#lx\n", addr, tmp));
-			if (ret < 0)
-				goto out;
-			regs.r0 = 0;	/* special return: no errors */
-			ret = tmp;
+	/* When I and D space are separate, these will need to be fixed.  */
+	case PTRACE_PEEKTEXT: /* read word at location addr. */
+	case PTRACE_PEEKDATA: {
+		unsigned long tmp;
+
+		ret = read_long(child, addr, &tmp);
+		DBG(DBG_MEM, ("peek %#lx->%#lx\n", addr, tmp));
+		if (ret < 0)
 			goto out;
-		}
+		regs.r0 = 0;	/* special return: no errors */
+		ret = tmp;
+		goto out;
+	}
 
 	/* read register number ADDR. */
-		case PTRACE_PEEKUSR:
-			regs.r0 = 0;	/* special return: no errors */
-			DBG(DBG_MEM, ("peek $%ld=%#lx\n", addr, regs.r0));
-			ret = get_reg(child, addr);
-			goto out;
-
-	/* when I and D space are separate, this will have to be fixed. */
-		case PTRACE_POKETEXT: /* write the word at location addr. */
-		case PTRACE_POKEDATA:
-			DBG(DBG_MEM, ("poke %#lx<-%#lx\n", addr, data));
-			ret = write_long(child, addr, data);
-			goto out;
-
-		case PTRACE_POKEUSR: /* write the specified register */
-			DBG(DBG_MEM, ("poke $%ld<-%#lx\n", addr, data));
-			ret = put_reg(child, addr, data);
-			goto out;
+	case PTRACE_PEEKUSR:
+		regs.r0 = 0;	/* special return: no errors */
+		DBG(DBG_MEM, ("peek $%ld=%#lx\n", addr, regs.r0));
+		ret = get_reg(child, addr);
+		goto out;
 
-		case PTRACE_SYSCALL: /* continue and stop at next
-					(return from) syscall */
-		case PTRACE_CONT: { /* restart after signal. */
-			ret = -EIO;
-			if ((unsigned long) data > _NSIG)
-				goto out;
-			if (request == PTRACE_SYSCALL)
-				child->flags |= PF_TRACESYS;
-			else
-				child->flags &= ~PF_TRACESYS;
-			child->exit_code = data;
-			wake_up_process(child);
-        /* make sure single-step breakpoint is gone. */
-			ptrace_cancel_bpt(child);
-			ret = data;
-			goto out;
-		}
+	/* When I and D space are separate, this will have to be fixed.  */
+	case PTRACE_POKETEXT: /* write the word at location addr. */
+	case PTRACE_POKEDATA:
+		DBG(DBG_MEM, ("poke %#lx<-%#lx\n", addr, data));
+		ret = write_long(child, addr, data);
+		goto out;
 
-/*
- * make the child exit.  Best I can do is send it a sigkill.
- * perhaps it should be put in the status that it wants to
- * exit.
- */
-		case PTRACE_KILL: {
-			if (child->state != TASK_ZOMBIE) {
-				wake_up_process(child);
-				child->exit_code = SIGKILL;
-			}
-        /* make sure single-step breakpoint is gone. */
-			ptrace_cancel_bpt(child);
-			ret = 0;
-			goto out;
-		}
+	case PTRACE_POKEUSR: /* write the specified register */
+		DBG(DBG_MEM, ("poke $%ld<-%#lx\n", addr, data));
+		ret = put_reg(child, addr, data);
+		goto out;
 
-		case PTRACE_SINGLESTEP: {  /* execute single instruction. */
-			ret = -EIO;
-			if ((unsigned long) data > _NSIG)
-				goto out;
-			child->debugreg[4] = -1;	/* mark single-stepping */
+	case PTRACE_SYSCALL: /* continue and stop at next
+				(return from) syscall */
+	case PTRACE_CONT: { /* restart after signal. */
+		ret = -EIO;
+		if ((unsigned long) data > _NSIG)
+			goto out;
+		if (request == PTRACE_SYSCALL)
+			child->flags |= PF_TRACESYS;
+		else
 			child->flags &= ~PF_TRACESYS;
-			wake_up_process(child);
-			child->exit_code = data;
-	/* give it a chance to run. */
-			ret = 0;
-			goto out;
-		}
+		child->exit_code = data;
+		wake_up_process(child);
+		/* make sure single-step breakpoint is gone. */
+		ptrace_cancel_bpt(child);
+		ret = data;
+		goto out;
+	}
 
-		case PTRACE_DETACH: { /* detach a process that was attached. */
-			ret = -EIO;
-			if ((unsigned long) data > _NSIG)
-				goto out;
-			child->flags &= ~(PF_PTRACED|PF_TRACESYS);
+	/*
+	 * Make the child exit.  Best I can do is send it a sigkill.
+	 * perhaps it should be put in the status that it wants to
+	 * exit.
+	 */
+	case PTRACE_KILL: {
+		if (child->state != TASK_ZOMBIE) {
 			wake_up_process(child);
-			child->exit_code = data;
-			REMOVE_LINKS(child);
-			child->p_pptr = child->p_opptr;
-			SET_LINKS(child);
-			/* make sure single-step breakpoint is gone. */
-			ptrace_cancel_bpt(child);
-			ret = 0;
-			goto out;
+			child->exit_code = SIGKILL;
 		}
+		/* make sure single-step breakpoint is gone. */
+		ptrace_cancel_bpt(child);
+		ret = 0;
+		goto out;
+	}
 
-		default:
-		  ret = -EIO;
-		  goto out;
-	  }
-out:
+	case PTRACE_SINGLESTEP: {  /* execute single instruction. */
+		ret = -EIO;
+		if ((unsigned long) data > _NSIG)
+			goto out;
+		child->tss.debugreg[4] = -1;	/* mark single-stepping */
+		child->flags &= ~PF_TRACESYS;
+		wake_up_process(child);
+		child->exit_code = data;
+		/* give it a chance to run. */
+		ret = 0;
+		goto out;
+	}
+
+	case PTRACE_DETACH: { /* detach a process that was attached. */
+		ret = -EIO;
+		if ((unsigned long) data > _NSIG)
+			goto out;
+		child->flags &= ~(PF_PTRACED|PF_TRACESYS);
+		wake_up_process(child);
+		child->exit_code = data;
+		REMOVE_LINKS(child);
+		child->p_pptr = child->p_opptr;
+		SET_LINKS(child);
+		/* make sure single-step breakpoint is gone. */
+		ptrace_cancel_bpt(child);
+		ret = 0;
+		goto out;
+	}
+
+	default:
+		ret = -EIO;
+		goto out;
+	}
+ out:
 	unlock_kernel();
 	return ret;
 }
@@ -645,7 +650,7 @@
 asmlinkage void syscall_trace(void)
 {
 	if ((current->flags & (PF_PTRACED|PF_TRACESYS))
-			!= (PF_PTRACED|PF_TRACESYS))
+	    != (PF_PTRACED|PF_TRACESYS))
 		return;
 	current->exit_code = SIGTRAP;
 	current->state = TASK_STOPPED;
diff -u --recursive --new-file v2.1.110/linux/arch/i386/defconfig linux/arch/i386/defconfig
--- v2.1.110/linux/arch/i386/defconfig	Tue Jul 21 00:15:30 1998
+++ linux/arch/i386/defconfig	Fri Jul 24 23:16:50 1998
@@ -65,7 +65,6 @@
 # CONFIG_BLK_DEV_CMD640_ENHANCED is not set
 CONFIG_BLK_DEV_RZ1000=y
 CONFIG_BLK_DEV_IDEPCI=y
-CONFIG_BLK_DEV_IDEDMA=y
 # CONFIG_IDE_CHIPSETS is not set
 
 #
@@ -189,6 +188,7 @@
 # CONFIG_DGRS is not set
 CONFIG_EEXPRESS_PRO100=y
 # CONFIG_NE2K_PCI is not set
+# CONFIG_TLAN is not set
 # CONFIG_NET_POCKET is not set
 # CONFIG_FDDI is not set
 # CONFIG_DLCI is not set
diff -u --recursive --new-file v2.1.110/linux/arch/i386/kernel/process.c linux/arch/i386/kernel/process.c
--- v2.1.110/linux/arch/i386/kernel/process.c	Tue Jul 21 00:15:30 1998
+++ linux/arch/i386/kernel/process.c	Wed Jul 22 14:45:23 1998
@@ -115,8 +115,8 @@
 	if (current->pid != 0)
 		goto out;
 	/* endless idle loop with no priority at all */
-	current->priority = -100;
-	current->counter = -100;
+	current->priority = 0;
+	current->counter = 0;
 	for (;;) {
 		/*
 		 *	We are locked at this point. So we can safely call
@@ -152,7 +152,7 @@
 
 int cpu_idle(void *unused)
 {
-	current->priority = -100;
+	current->priority = 0;
 	while(1)
 	{
 		if(current_cpu_data.hlt_works_ok &&
@@ -169,7 +169,7 @@
 			unlock_kernel();
 		}
 		/* endless idle loop with no priority at all */
-		current->counter = -100;
+		current->counter = 0;
 		schedule();
 	}
 }
diff -u --recursive --new-file v2.1.110/linux/arch/i386/kernel/smp.c linux/arch/i386/kernel/smp.c
--- v2.1.110/linux/arch/i386/kernel/smp.c	Tue Jul 21 00:15:30 1998
+++ linux/arch/i386/kernel/smp.c	Wed Jul 22 14:46:29 1998
@@ -1199,18 +1199,6 @@
  * enabled in a civilised fashion. That will also boost performance.
  */
 
-unsigned int TIME64 (void)
-{
-        unsigned int dummy,low;
-
-        __asm__("rdtsc"
-                :"=a" (low),
-                 "=d" (dummy));
-        return low;
-}
-
-int ipi_timestamp;
-
 void smp_message_pass(int target, int msg, unsigned long data, int wait)
 {
 	unsigned long cfg;
@@ -1424,7 +1412,7 @@
 
 	__save_flags(flags);
 	__cli();
-	smp_message_pass(MSG_ALL_BUT_SELF, MSG_RESCHEDULE, 0L, 2);
+	smp_message_pass(cpu, MSG_RESCHEDULE, 0L, 2);
 	__restore_flags(flags);
 }
 
@@ -1520,15 +1508,14 @@
 	 * want to be able to accept NMI tlb invalidates
 	 * during this time.
 	 */
-	spin_lock(&irq_controller_lock);
-	ack_APIC_irq ();
-	spin_unlock(&irq_controller_lock);
-
+	ack_APIC_irq();
 	smp_local_timer_interrupt(regs);
 }
 
 /*
- * Reschedule call back
+ * Reschedule call back. Nothing to do,
+ * all the work is done automatically when
+ * we return from the interrupt.
  */
 asmlinkage void smp_reschedule_interrupt(void)
 {
diff -u --recursive --new-file v2.1.110/linux/drivers/block/Config.in linux/drivers/block/Config.in
--- v2.1.110/linux/drivers/block/Config.in	Wed Jul  1 19:38:53 1998
+++ linux/drivers/block/Config.in	Fri Jul 24 11:34:07 1998
@@ -25,7 +25,8 @@
       bool '   RZ1000 chipset bugfix/support' CONFIG_BLK_DEV_RZ1000
       bool '   Generic PCI IDE chipset support' CONFIG_BLK_DEV_IDEPCI
       if [ "$CONFIG_BLK_DEV_IDEPCI" = "y" ]; then
-        bool '     Generic PCI bus-master DMA support' CONFIG_BLK_DEV_IDEDMA
+	# Either the DMA code is buggy or the DMA hardware is unreliable. FIXME.
+        #bool '     Generic PCI bus-master DMA support' CONFIG_BLK_DEV_IDEDMA
         if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
           bool '     OPTi 82C621 chipset enhanced support (EXPERIMENTAL)' CONFIG_BLK_DEV_OPTI621
           if [ "$CONFIG_BLK_DEV_IDEDMA" = "y" ]; then
diff -u --recursive --new-file v2.1.110/linux/drivers/char/Config.in linux/drivers/char/Config.in
--- v2.1.110/linux/drivers/char/Config.in	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/Config.in	Fri Jul 24 11:10:17 1998
@@ -39,14 +39,6 @@
      bool 'Specialix DTR/RTS pin is RTS' CONFIG_SPECIALIX_RTSCTS
    fi 
    tristate 'Hayes ESP serial port support' CONFIG_ESPSERIAL
-   if [ "$CONFIG_ESPSERIAL" = "y" -o "$CONFIG_ESPSERIAL" = "m" ]; then
-     int '  DMA channel' CONFIG_ESPSERIAL_DMA_CHANNEL 1
-     int '  Receive FIFO trigger level' CONFIG_ESPSERIAL_RX_TRIGGER 768
-     int '  Transmit FIFO trigger level' CONFIG_ESPSERIAL_TX_TRIGGER 768
-     int '  Hardware flow off level' CONFIG_ESPSERIAL_FLOW_OFF 1016
-     int '  Hardware flow on level' CONFIG_ESPSERIAL_FLOW_ON 944
-     int '  Receiver timeout' CONFIG_ESPSERIAL_RX_TMOUT 128
-   fi
 fi
 if [ "$CONFIG_PARPORT" != "n" ]; then
   dep_tristate 'Parallel printer support' CONFIG_PRINTER $CONFIG_PARPORT
diff -u --recursive --new-file v2.1.110/linux/drivers/char/Makefile linux/drivers/char/Makefile
--- v2.1.110/linux/drivers/char/Makefile	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/Makefile	Wed Jul 22 13:45:52 1998
@@ -381,12 +381,13 @@
   endif
 endif                                             
 
-ifeq ($(CONFIG_MISC_RADIO),y)
-L_OBJS += radio.o
-  ifeq ($(CONFIG_RADIO_RTRACK),y)
-  L_OBJS += rtrack.o
+ifeq ($(CONFIG_RADIO_ZOLTRIX),y)
+L_OBJS += radio-zoltrix.o
+else
+  ifeq ($(CONFIG_RADIO_ZOLTRIX),m)
+  M_OBJS += radio-zoltrix.o
   endif
-endif
+endif                                             
 
 ifeq ($(CONFIG_QIC02_TAPE),y)
 L_OBJS += tpqic02.o
diff -u --recursive --new-file v2.1.110/linux/drivers/char/bttv.c linux/drivers/char/bttv.c
--- v2.1.110/linux/drivers/char/bttv.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/bttv.c	Tue Jul 21 12:55:39 1998
@@ -58,7 +58,7 @@
 #include <linux/version.h>
 #include <asm/uaccess.h>
 
-#include "i2c.h"
+#include <linux/i2c.h>
 #include "bttv.h"
 #include "tuner.h"
 
diff -u --recursive --new-file v2.1.110/linux/drivers/char/bttv.h linux/drivers/char/bttv.h
--- v2.1.110/linux/drivers/char/bttv.h	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/bttv.h	Tue Jul 21 12:55:39 1998
@@ -26,7 +26,7 @@
 #include <linux/types.h>
 #include <linux/wait.h>
 
-#include "i2c.h"
+#include <linux/i2c.h>
 #include "msp3400.h"
 #include "bt848.h"
 #include <linux/videodev.h>
diff -u --recursive --new-file v2.1.110/linux/drivers/char/console.c linux/drivers/char/console.c
--- v2.1.110/linux/drivers/char/console.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/console.c	Tue Jul 21 10:28:23 1998
@@ -137,7 +137,6 @@
 		    unsigned int cols, int do_clear);
 static void blank_screen(void);
 static void unblank_screen(void);
-static void update_attr(int currcons);
 static void gotoxy(int currcons, int new_x, int new_y);
 static void save_cur(int currcons);
 static void reset_terminal(int currcons, int do_clear);
@@ -145,8 +144,6 @@
 
 static int printable = 0;		/* Is console ready for printing? */
 
-static unsigned short console_charmask = 0x0ff;
-
 int do_poke_blanked_console = 0;
 int console_blanked = 0;
 
@@ -191,12 +188,6 @@
 	return p;
 }
 
-/* FIXME: Can we do the whole scrollback logic here and call the driver
- *	  only for changing the display? Yes, there is some magic with
- *	  blanked screens, but we could unblank here. (Argh, there might
- *	  be some problems with unblanking since this is called from real
- *	  interrupts...)  --mj
- */
 static inline void scrolldelta(int lines)
 {
 	int currcons = fg_console;
@@ -226,7 +217,6 @@
 scrdown(int currcons, unsigned int t, unsigned int b, int nr)
 {
 	unsigned short *s;
-	unsigned int count;
 	unsigned int step;
 
 	if (t+nr >= b)
@@ -235,22 +225,68 @@
 		return;
 	if (IS_VISIBLE && sw->con_scroll(vc_cons[currcons].d, t, b, SM_DOWN, nr))
 		return;
-	s = (unsigned short *) (origin+video_size_row*(b-nr-1));
+	s = (unsigned short *) (origin+video_size_row*t);
 	step = video_num_columns * nr;
-	count = b - t - nr;
-	while (count--) {
-		scr_memcpyw(s + step, s, video_size_row);
-		s -= video_num_columns;
-	}
-	count = nr;
-	while (count--) {
-		s += video_num_columns;
-		scr_memsetw(s, video_erase_char, video_size_row);
+	scr_memmovew(s + step, s, (b-t-nr)*video_size_row);
+	scr_memsetw(s, video_erase_char, 2*step);
+}
+
+static void do_update_region(int currcons, unsigned long start, int count)
+{
+#ifndef VT_BUF_VRAM_ONLY
+	unsigned int xx, yy, offset;
+	u16 *p;
+
+	if (start < origin) {
+		count -= origin - start;
+		start = origin;
+	}
+	if (count <= 0)
+		return;
+	offset = (start - origin) / 2;
+	xx = offset % video_num_columns;
+	yy = offset / video_num_columns;
+	p = (u16 *) start;
+	for(;;) {
+		u16 attrib = scr_readw(p) & 0xff00;
+		int startx = xx;
+		u16 *q = p;
+		while (xx < video_num_columns && count) {
+			if (attrib != (scr_readw(p) & 0xff00)) {
+				if (p > q)
+					sw->con_putcs(vc_cons[currcons].d, q, p-q, yy, startx);
+				startx = xx;
+				q = p;
+				attrib = scr_readw(p) & 0xff00;
+			}
+			p++;
+			xx++;
+			count--;
+		}
+		if (p > q)
+			sw->con_putcs(vc_cons[currcons].d, q, p-q, yy, startx);
+		if (!count)
+			break;
+		xx = 0;
+		yy++;
 	}
+#endif
 }
 
-static void update_attr(int currcons)
+void update_region(int currcons, unsigned long start, int count)
+{
+	if (DO_UPDATE)
+		do_update_region(currcons, start, count);
+}
+
+/* Structure of attributes is hardware-dependent */
+
+static u8 build_attr(int currcons, u8 _color, u8 _intensity, u8 _blink, u8 _underline, u8 _reverse)
 {
+	if (sw->con_build_attr)
+		return sw->con_build_attr(vc_cons[currcons].d, _color, _intensity, _blink, _underline, _reverse);
+
+#ifndef VT_BUF_VRAM_ONLY
 /*
  * ++roman: I completely changed the attribute format for monochrome
  * mode (!can_do_color). The formerly used MDA (monochrome display
@@ -260,74 +296,64 @@
  *  Bit 2   : underline
  *  Bit 3   : reverse
  *  Bit 7   : blink
- *
- * ++Geert: TODO: Because the attributes have different meanings
- * for monochrome and color, they should really be converted if
- * can_do_color changes...
- *
- * FIXME: Monochrome attributes on MDA/HGC/etc
  */
-	if (!can_do_color) {
-		/* Special treatment for monochrome */
-		attr = intensity |
-			(underline ? 4 : 0) |
-			((reverse ^ decscnm) ? 8 : 0) |
-			(blink ? 0x80 : 0);
-		video_erase_char = ' ' | ((reverse ^ decscnm) ? 0x800 : 0);
-		return;
-	}
-	attr = color;
-	if (can_do_color) {
-		if (underline)
-			attr = (attr & 0xf0) | ulcolor;
-		else if (intensity == 0)
-			attr = (attr & 0xf0) | halfcolor;
-	}
-	if (reverse ^ decscnm)
-		attr = reverse_video_char(attr);
-	if (blink)
-		attr ^= 0x80;
-	if (intensity == 2)
-		attr ^= 0x08;
-	if (decscnm)
-		video_erase_char = (reverse_video_char(color) << 8) | ' ';
-	else
-		video_erase_char = (color << 8) | ' ';
+	{
+	u8 a = color;
+	if (!can_do_color)
+		return _intensity |
+		       (_underline ? 4 : 0) |
+		       (_reverse ? 8 : 0) |
+		       (_blink ? 0x80 : 0);
+	if (_underline)
+		a = (a & 0xf0) | ulcolor;
+	else if (_intensity == 0)
+		a = (a & 0xf0) | halfcolor;
+	if (_reverse)
+		a = ((a) & 0x88) | ((((a) >> 4) | ((a) << 4)) & 0x77);
+	if (_blink)
+		a ^= 0x80;
+	if (_intensity == 2)
+		a ^= 0x08;
+	return a;
+	}
+#else
+	return 0;
+#endif
+}
+
+static void update_attr(int currcons)
+{
+	attr = build_attr(currcons, color, intensity, blink, underline, reverse ^ decscnm);
+	video_erase_char = (build_attr(currcons, color, 1, 0, 0, decscnm) << 8) | ' ';
 }
 
 /* Note: inverting the screen twice should revert to the original state */
+
 void invert_screen(int currcons, int offset, int count, int viewed)
 {
 	unsigned short *p;
-	int xx = (offset >> 1) % video_num_columns;
-	int yy = (offset >> 1) / video_num_columns;
 
 	count /= 2;
 	p = screenpos(currcons, offset, viewed);
-	if (can_do_color)
-		while (count--) {
-			unsigned short old = scr_readw(p);
-			unsigned short new = reverse_video_short(old);
-			scr_writew(new, p);
-			p++;
-			if (DO_UPDATE) {
-				sw->con_putc(vc_cons[currcons].d, new, yy, xx);
-				if (++xx == video_num_columns)
-					xx = 0, ++yy;
-			}
-		}
-	else
-		while (count--) {
-			unsigned short old = scr_readw(p);
-			unsigned short new = reverse_video_short_mono(old);
-			scr_writew(new, p);
-			p++;
-			if (DO_UPDATE) {
-				sw->con_putc(vc_cons[currcons].d, new, yy, xx);
-				if (++xx == video_num_columns)
-					xx = 0, ++yy;
-			}
+	if (sw->con_invert_region)
+		sw->con_invert_region(vc_cons[currcons].d, p, count);
+#ifndef VT_BUF_VRAM_ONLY
+	else {
+		int col = can_do_color;
+		u16 *q = p;
+		int cnt = count;
+
+		while (cnt--) {
+			u16 a = *q;
+			if (col)
+				a = ((a) & 0x88ff) | (((a) & 0x7000) >> 4) | (((a) & 0x0700) << 4);
+			else
+				a ^= 0x0800;
+			*q++ = a;
 		}
+	}
+#endif
+	update_region(currcons, (unsigned long) p, count);
 }
 
 /* used by selection: complement pointer position */
@@ -348,23 +374,16 @@
 		unsigned short new;
 		p = screenpos(currcons, offset, 1);
 		old = scr_readw(p);
-		oldx = (offset >> 1) % video_num_columns;
-		oldy = (offset >> 1) / video_num_columns;
-		new = complement_video_short(old);
+		new = old ^ complement_mask;
 		scr_writew(new, p);
-		if (DO_UPDATE)
+		if (DO_UPDATE) {
+			oldx = (offset >> 1) % video_num_columns;
+			oldy = (offset >> 1) / video_num_columns;
 			sw->con_putc(vc_cons[currcons].d, new, oldy, oldx);
+		}
 	}
 }
 
-/* used by selection - convert a screen word to a glyph number */
-int scrw2glyph(unsigned short scr_word)
-{
-	return ( video_mode_512ch )
-		? ((scr_word & 0x0800) >> 3) + (scr_word & 0x00ff)
-		: scr_word & 0x00ff;
-}
-
 static void insert_char(int currcons, unsigned int nr)
 {
 	unsigned short *p, *q = (unsigned short *) pos;
@@ -410,18 +429,45 @@
 	}
 }
 
-static inline void hide_cursor(int currcons)
+static int softcursor_original;
+
+static void add_softcursor(int currcons)
+{
+	int i = scr_readw((u16 *) pos);
+	u32 type = cursor_type;
+
+	if (softcursor_original != -1) return;
+	softcursor_original = i;
+	if (! (type & 0x10)) return;
+	i |= ((type >> 8) & 0xff00 );
+	i ^= ((type) & 0xff00 );
+	if ((type & 0x20) && ((softcursor_original & 0x7000) == (i & 0x7000))) i ^= 0x7000;
+	if ((type & 0x40) && ((i & 0x700) == ((i & 0x7000) >> 4))) i ^= 0x0700;
+	scr_writew(i, (u16 *) pos);
+	if (DO_UPDATE)
+		sw->con_putc(vc_cons[currcons].d, i, y, x);
+}
+
+static void hide_cursor(int currcons)
 {
-    sw->con_cursor(vc_cons[currcons].d,CM_ERASE);
+	if (softcursor_original != -1) {
+		scr_writew(softcursor_original,(u16 *) pos);
+		if (DO_UPDATE)
+			sw->con_putc(vc_cons[currcons].d, softcursor_original, y, x);
+		softcursor_original = -1;
+	}
+	sw->con_cursor(vc_cons[currcons].d,CM_ERASE);
 }
 
 void set_cursor(int currcons)
 {
     if (!IS_FG || console_blanked || vcmode == KD_GRAPHICS)
 	return;
-    if (deccm)
-	sw->con_cursor(vc_cons[currcons].d,CM_DRAW);
-    else
+    if (deccm) {
+	add_softcursor(currcons);
+	if ((cursor_type & 0x0f) != 1)
+	    sw->con_cursor(vc_cons[currcons].d,CM_DRAW);
+    } else
 	hide_cursor(currcons);
 }
 
@@ -451,8 +497,7 @@
 {
 	int currcons = fg_console;
 	int redraw = 1;
-	int xx, yy, startx, attrib, old_console;
-	unsigned short *p, *q;
+	int old_console;
 	static int lock = 0;
 	struct vc_data **display;
 
@@ -482,30 +527,11 @@
 	}
 	if (redraw) {
 		set_origin(currcons);
-		if (sw->con_switch (vc_cons[currcons].d)) {
+		if (sw->con_switch(vc_cons[currcons].d))
 			/* Update the screen contents */
-			p = (unsigned short *)origin;
-			attrib = scr_readw(p) & 0xff00;
-			for (yy = 0; yy < video_num_lines; yy++) {
-				q = p;
-				for (startx = xx = 0; xx < video_num_columns; xx++) {
-					if (attrib != (scr_readw(p) & 0xff00)) {
-						if (p > q)
-							sw->con_putcs (vc_cons[currcons].d, q,
-								       p - q, yy, startx);
-						startx = xx;
-						q = p;
-						attrib = (scr_readw(p) & 0xff00);
-					}
-					p++;
-				}
-				if (p > q)
-					sw->con_putcs (vc_cons[currcons].d, q,
-						       p - q, yy, startx);
-			}
-		}
+			do_update_region(currcons, origin, screenbuf_size/2);
 	}
-	set_cursor (currcons);
+	set_cursor(currcons);
 	set_leds();
 	compute_shiftstate();
 	lock = 0;
@@ -526,7 +552,11 @@
     sw = conswitchp;
     cons_num = currcons;
     display_fg = &master_display_fg;
+    hi_font_mask = 0;
+    complement_mask = 0;
     sw->con_init(vc_cons[currcons].d, 1);
+    if (!complement_mask)
+        complement_mask = can_do_color ? 0x7700 : 0x0800;
     video_size_row = video_num_columns<<1;
     video_screen_size = video_num_lines*video_size_row;
 }
@@ -577,17 +607,12 @@
  * [this is to be used together with some user program
  * like resize that changes the hardware videomode]
  */
-/* FIXME: Cursor sometimes disappears when resizing */
-/* FIXME: We could also take data from the scrollback buffer */
 int vc_resize(unsigned int lines, unsigned int cols,
 	      unsigned int first, unsigned int last)
 {
 	unsigned int cc, ll, ss, sr, todo = 0;
-	unsigned int occ, oll, oss, osr;
-	unsigned short *p;
 	unsigned int currcons = fg_console, i;
 	unsigned short *newscreens[MAX_NR_CONSOLES];
-	unsigned long ol, nl, rlth, rrem;
 
 	cc = (cols ? cols : video_num_columns);
 	ll = (lines ? lines : video_num_lines);
@@ -599,7 +624,7 @@
 		    (cc == video_num_columns && ll == video_num_lines))
 			newscreens[currcons] = NULL;
 		else {
-			p = (unsigned short *) kmalloc(ss, GFP_USER);
+			unsigned short *p = (unsigned short *) kmalloc(ss, GFP_USER);
 			if (!p) {
 				for (i = 0; i< currcons; i++)
 					if (newscreens[i])
@@ -614,6 +639,8 @@
 		return 0;
 
 	for (currcons = first; currcons <= last; currcons++) {
+		unsigned int occ, oll, oss, osr;
+		unsigned long ol, nl, nlend, rlth, rrem;
 		if (!newscreens[currcons] || !vc_cons_allocated(currcons))
 			continue;
 
@@ -631,10 +658,12 @@
 		rrem = sr - rlth;
 		ol = origin;
 		nl = (long) newscreens[currcons];
+		nlend = nl + ss;
 		if (ll < oll)
 			ol += (oll - ll) * osr;
 
 		update_attr(currcons);
+
 		while (ol < scr_end) {
 			scr_memcpyw((unsigned short *) nl, (unsigned short *) ol, rlth);
 			if (rrem)
@@ -642,7 +671,8 @@
 			ol += osr;
 			nl += sr;
 		}
-
+		if (nlend > nl)
+			scr_memsetw((void *) nl, video_erase_char, nlend - nl);
 		if (kmalloced)
 			kfree_s(screenbuf, oss);
 		screenbuf = newscreens[currcons];
@@ -650,9 +680,6 @@
 		screenbuf_size = ss;
 		set_origin(currcons);
 
-		if (scr_end > nl)
-			scr_memsetw((void *) nl, video_erase_char, scr_end - nl);
-
 		/* do part of a reset_terminal() */
 		top = 0;
 		bottom = video_num_lines;
@@ -1111,7 +1138,6 @@
 				break;
 			case 25:		/* Cursor on/off */
 				deccm = on_off;
-				set_cursor(currcons);
 				break;
 			case 1000:
 				report_mouse = on_off ? 2 : 0;
@@ -1172,13 +1198,11 @@
 				bell_duration = DEFAULT_BELL_DURATION;
 			break;
 		case 12: /* bring specified console to the front */
-			/* FIXME: Use console_bh for switching! */
 			if (par[1] >= 1 && vc_cons_allocated(par[1]-1))
-				update_screen(par[1]-1);
+				set_console(par[1] - 1);
 			break;
 		case 13: /* unblank the screen */
-			/* FIXME: call poke_blanked_console? */
-			unblank_screen();
+			poke_blanked_console();
 			break;
 		case 14: /* set vesa powerdown interval */
 			vesa_off_interval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ;
@@ -1494,12 +1518,14 @@
 			set_mode(currcons,0);
 			return;
 		case 'c':
-			if (par[0])
-				cursor_type = par[0] | (par[1]<<8) | (par[2]<<16);
-			else
-				cursor_type = CUR_DEFAULT;
-			set_cursor(currcons);
-			return;
+			if (ques) {
+				if (par[0])
+					cursor_type = par[0] | (par[1]<<8) | (par[2]<<16);
+				else
+					cursor_type = CUR_DEFAULT;
+				return;
+			}
+			break;
 		case 'n':
 			if (!ques) {
 				if (par[0] == 5)
@@ -1698,6 +1724,7 @@
 	unsigned int currcons;
 	unsigned long draw_from = 0, draw_to = 0;
 	struct vt_struct *vt = (struct vt_struct *)tty->driver_data;
+	u16 himask, charmask;
 
 #if CONFIG_AP1000
         ap_write(1,buf,count);
@@ -1721,8 +1748,11 @@
 			return 0; /* ?? are error codes legal here ?? */
 	}
 
+	himask = hi_font_mask;
+	charmask = himask ? 0x1ff : 0xff;
+
 	/* undraw cursor first */
-	if (DO_UPDATE)
+	if (IS_FG)
 		hide_cursor(currcons);
 
 	/* clear the selection */
@@ -1730,7 +1760,7 @@
 		clear_selection();
 
 	disable_bh(CONSOLE_BH);
-	while (count) {
+	while (!tty->stopped && count) {
 		enable_bh(CONSOLE_BH);
 		if (from_user)
 			__get_user(c, buf);
@@ -1810,7 +1840,7 @@
                                 /* Bad hash table -- hope for the best */
                                 tc = c;
                         }
-			if (tc & ~console_charmask)
+			if (tc & ~charmask)
                                 continue; /* Conversion failed */
 
 			if (need_wrap || decim)
@@ -1821,11 +1851,10 @@
 			}
 			if (decim)
 				insert_char(currcons, 1);
-			scr_writew(c = video_mode_512ch ?
-			   ((attr & 0xf7) << 8) + ((tc & 0x100) << 3) +
-			   (tc & 0x0ff) : (attr << 8) + tc,
-			   (unsigned short *) pos);
-
+			scr_writew(himask ?
+				     ((attr & ~himask) << 8) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
+				     (attr << 8) + tc,
+				   (u16 *) pos);
 			if (DO_UPDATE && draw_x < 0) {
 				draw_x = x;
 				draw_from = pos;
@@ -1862,6 +1891,7 @@
 	if (want_console >= 0) {
 		if (want_console != fg_console) {
 			clear_selection();
+			hide_cursor(fg_console);
 			save_screen();
 			change_console(want_console);
 			/* we only changed when the console had already
@@ -2364,6 +2394,7 @@
 void do_blank_screen(int nopowersave)
 {
 	int currcons = fg_console;
+	int i;
 
 	if (console_blanked)
 		return;
@@ -2395,8 +2426,11 @@
 	}
 
 	save_screen();
-	sw->con_blank(vc_cons[currcons].d, 1);
+	/* In case we need to reset origin, blanking hook returns 1 */
+	i = sw->con_blank(vc_cons[currcons].d, 1);
 	console_blanked = fg_console + 1;
+	if (i)
+		set_origin(currcons);
 
 	if(!nopowersave)
 	{
@@ -2523,85 +2557,80 @@
 /*
  *  Font switching
  *
- *  Currently we only support 8 pixels wide fonts, at a maximum height
- *  of 32 pixels. Userspace fontdata is stored with 32 bytes reserved
- *  for each character which is kinda wasty, but this is done in order
- *  to maintain compatibility with the EGA/VGA fonts. It is upto the
- *  actual low-level console-driver convert data into its favorite
+ *  Currently we only support fonts up to 32 pixels wide, at a maximum height
+ *  of 32 pixels. Userspace fontdata is stored with 32 bytes (shorts/ints, 
+ *  depending on width) reserved for each character which is kinda wasty, but 
+ *  this is done in order to maintain compatibility with the EGA/VGA fonts. It 
+ *  is upto the actual low-level console-driver convert data into its favorite
  *  format (maybe we should add a `fontoffset' field to the `display'
  *  structure so we wont have to convert the fontdata all the time.
  *  /Jes
  */
 
-#define cmapsz 8192
+#define max_font_size 32768
 
-int con_set_font (char *arg, int w, int h, int chars)
+int con_font_op(int currcons, struct console_font_op *op)
 {
-	int ch512;
-	int i = -EINVAL;
-	int s = cmapsz;
-	char *charmap;
+	int rc = -EINVAL;
+	int size, set;
+	u8 *temp;
+	struct console_font_op old_op;
 
-	if (vt_cons[fg_console]->vc_mode != KD_TEXT)
+	if (vt_cons[currcons]->vc_mode != KD_TEXT)
 		goto quit;
-	if (w != 8 || h < 0 || h >= 32)
-		goto quit;
-	if (chars == 256)
-		ch512 = 0;
-	else if (chars == 512) {
-		ch512 = 1;
-		s += s;
+	memcpy(&old_op, &op, sizeof(op));
+	if (op->op == KD_FONT_OP_SET) {
+		if (op->charcount > 512)
+			goto quit;
+		if (!op->height) {		/* Need to guess font height [compat] */
+			int h, i;
+			u8 *charmap = op->data, tmp;
+			rc = -EFAULT;
+			for (h = 32; h > 0; h--)
+				for (i = 0; i < op->charcount; i++) {
+					if (get_user(tmp, &charmap[32*i+h-1]))
+						goto quit;
+					if (tmp)
+						goto nonzero;
+				}
+			rc = -EINVAL;
+			goto quit;
+		nonzero:
+			rc = -EINVAL;
+			op->height = h;
+		}
+		if (op->width > 32 || op->height > 32)
+			goto quit;
+		size = (op->width+7)/8 * 32 * op->charcount;
+		if (size > max_font_size)
+			return -ENOSPC;
+		set = 1;
+	} else if (op->op == KD_FONT_OP_GET) {
+		size = max_font_size;
+		set = 0;
 	} else
-		goto quit;
-	s = ch512 ? 2*cmapsz : cmapsz;
-	charmap = kmalloc(s, GFP_USER);
-	if (!charmap)
+		return sw->con_font_op(vc_cons[currcons].d, op);
+	temp = kmalloc(size, GFP_KERNEL);
+	if (!temp)
 		return -ENOMEM;
-	i = -EFAULT;
-	if (copy_from_user(charmap, arg, s))
-		goto done;
-	if (!h) {			/* No height given, try guessing */
-		for (h = 32; h > 0; h--)
-			for (i = 0; i < chars; i++)
-				if (charmap[32*i+h-1])
-					goto nonzero;
-		return -EINVAL;		/* Empty fonts not allowed */
-	}
-	nonzero:
-	i = conswitchp->con_set_font(vc_cons[fg_console].d, w, h, charmap);
-	if ( !i ) {
-		hashtable_contents_valid = 0;
-		video_mode_512ch = ch512;
-		console_charmask = ch512 ? 0x1ff : 0x0ff;
-	}
-done:
-	kfree(charmap);
-quit:
-	return i;
-}
-
-int con_get_font (char *arg, int *w, int *h, int *chars)
-{
-	int num = video_mode_512ch ? 512 : 256;
-	char *charmap;
-	int s = video_mode_512ch ? 2*cmapsz : cmapsz;
-	int i;
-
-	if (num < *chars)
-		return -ENOSPC;
-	if (vt_cons[fg_console]->vc_mode != KD_TEXT)
-		return -EINVAL;
-	*chars = num;
-	*w = 8;
-	charmap = kmalloc(s, GFP_USER);
-	if (!charmap)
-		return -ENOMEM;
-	memset(charmap, 0, s);
-	i = conswitchp->con_get_font(vc_cons[fg_console].d, w, h, charmap);
-	if (!i && copy_to_user(arg, charmap, s))
-		i = -EINVAL;
-	kfree(charmap);
-	return i;
+	if (set && copy_from_user(temp, op->data, size)) {
+		rc = -EFAULT;
+		goto quit2;
+	}
+	op->data = temp;
+	rc = sw->con_font_op(vc_cons[currcons].d, op);
+	op->data = old_op.data;
+	if (!rc && !set) {
+		int c = (op->width+7)/8 * 32 * op->charcount;
+		if (op->width > old_op.width ||
+		    op->height > old_op.height ||
+		    op->charcount > old_op.charcount)
+			rc = -ENOSPC;
+		else if (copy_to_user(old_op.data, op->data, c))
+			rc = -EFAULT;
+	}
+quit2:	kfree_s(temp, size);
+quit:	return rc;
 }
 
 /*
@@ -2609,9 +2638,14 @@
  */
 
 /* used by selection */
-unsigned short screen_word(int currcons, int offset, int viewed)
+u16 screen_glyph(int currcons, int offset)
 {
-	return scr_readw(screenpos(currcons, offset, viewed));
+	u16 w = scr_readw(screenpos(currcons, offset, 1));
+	u16 c = w & 0xff;
+
+	if (w & hi_font_mask)
+		c |= 0x100;
+	return c;
 }
 
 /* used by vcs - note the word offset */
diff -u --recursive --new-file v2.1.110/linux/drivers/char/console_macros.h linux/drivers/char/console_macros.h
--- v2.1.110/linux/drivers/char/console_macros.h	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/console_macros.h	Tue Jul 21 10:28:23 1998
@@ -63,6 +63,8 @@
 #define bell_duration	(vc_cons[currcons].d->vc_bell_duration)
 #define cursor_type	(vc_cons[currcons].d->vc_cursor_type)
 #define display_fg	(vc_cons[currcons].d->vc_display_fg)
+#define complement_mask (vc_cons[currcons].d->vc_complement_mask)
+#define hi_font_mask	(vc_cons[currcons].d->vc_hi_font_mask)
 
 #define vcmode		(vt_cons[currcons]->vc_mode)
 
diff -u --recursive --new-file v2.1.110/linux/drivers/char/esp.c linux/drivers/char/esp.c
--- v2.1.110/linux/drivers/char/esp.c	Wed May 20 19:10:38 1998
+++ linux/drivers/char/esp.c	Fri Jul 24 11:10:16 1998
@@ -65,7 +65,7 @@
 #include <linux/malloc.h>
 #include <asm/uaccess.h>
 
-#include "esp.h"
+#include <linux/hayesesp.h>
 
 #define NR_PORTS 64	/* maximum number of ports */
 #define NR_PRIMARY 8	/* maximum number of primary ports */
@@ -74,12 +74,13 @@
 static int irq[NR_PRIMARY] = {0,0,0,0,0,0,0,0};	/* IRQ for each base port */
 static unsigned int divisor[NR_PRIMARY] = {0,0,0,0,0,0,0,0};
 	/* custom divisor for each port */
-static unsigned int dma = CONFIG_ESPSERIAL_DMA_CHANNEL; /* DMA channel */
-static unsigned int rx_trigger = CONFIG_ESPSERIAL_RX_TRIGGER;
-static unsigned int tx_trigger = CONFIG_ESPSERIAL_TX_TRIGGER;
-static unsigned int flow_off = CONFIG_ESPSERIAL_FLOW_OFF;
-static unsigned int flow_on = CONFIG_ESPSERIAL_FLOW_ON;
-static unsigned int rx_timeout = CONFIG_ESPSERIAL_RX_TMOUT;
+static unsigned int dma = ESP_DMA_CHANNEL; /* DMA channel */
+static unsigned int rx_trigger = ESP_RX_TRIGGER;
+static unsigned int tx_trigger = ESP_TX_TRIGGER;
+static unsigned int flow_off = ESP_FLOW_OFF;
+static unsigned int flow_on = ESP_FLOW_ON;
+static unsigned int rx_timeout = ESP_RX_TMOUT;
+static unsigned int pio_threshold = ESP_PIO_THRESHOLD;
 
 MODULE_PARM(irq, "1-8i");
 MODULE_PARM(divisor, "1-8i");
@@ -89,6 +90,8 @@
 MODULE_PARM(flow_off, "i");
 MODULE_PARM(flow_on, "i");
 MODULE_PARM(rx_timeout, "i");
+MODULE_PARM(pio_threshold, "i");
+
 /* END */
 
 static char *dma_buffer;
@@ -100,7 +103,7 @@
 #define WAKEUP_CHARS 1024
 
 static char *serial_name = "ESP serial driver";
-static char *serial_version = "2.0";
+static char *serial_version = "2.1";
 
 static DECLARE_TASK_QUEUE(tq_esp);
 
@@ -696,7 +699,7 @@
 		if (num_bytes) {
 			if (dma_bytes ||
 			    (info->stat_flags & ESP_STAT_USE_PIO) ||
-			    (num_bytes <= ESP_PIO_THRESHOLD))
+			    (num_bytes <= info->config.pio_threshold))
 				receive_chars_pio(info, num_bytes);
 			else
 				receive_chars_dma(info, num_bytes);
@@ -723,7 +726,7 @@
 			if (num_bytes) {
 				if (dma_bytes ||
 				    (info->stat_flags & ESP_STAT_USE_PIO) ||
-				    (num_bytes <= ESP_PIO_THRESHOLD))
+				    (num_bytes <= info->config.pio_threshold))
 					transmit_chars_pio(info, num_bytes);
 				else
 					transmit_chars_dma(info, num_bytes);
@@ -853,10 +856,10 @@
 
 	/* set FIFO trigger levels */
 	serial_out(info, UART_ESI_CMD1, ESI_SET_TRIGGER);
-	serial_out(info, UART_ESI_CMD2, rx_trigger >> 8);
-	serial_out(info, UART_ESI_CMD2, rx_trigger);
-	serial_out(info, UART_ESI_CMD2, tx_trigger >> 8);
-	serial_out(info, UART_ESI_CMD2, tx_trigger);
+	serial_out(info, UART_ESI_CMD2, info->config.rx_trigger >> 8);
+	serial_out(info, UART_ESI_CMD2, info->config.rx_trigger);
+	serial_out(info, UART_ESI_CMD2, info->config.tx_trigger >> 8);
+	serial_out(info, UART_ESI_CMD2, info->config.tx_trigger);
 
 	/* Set clock scaling and wait states */
 	serial_out(info, UART_ESI_CMD1, ESI_SET_PRESCALAR);
@@ -910,7 +913,7 @@
 
 	/* set receive character timeout */
 	serial_out(info, UART_ESI_CMD1, ESI_SET_RX_TIMEOUT);
-	serial_out(info, UART_ESI_CMD2, rx_timeout);
+	serial_out(info, UART_ESI_CMD2, info->config.rx_timeout);
 
 	/* clear all flags except the "never DMA" flag */
 	info->stat_flags &= ESP_STAT_NEVER_DMA;
@@ -1229,10 +1232,10 @@
 
 	/* Set high/low water */
 	serial_out(info, UART_ESI_CMD1, ESI_SET_FLOW_LVL);
-	serial_out(info, UART_ESI_CMD2, flow_off >> 8);
-	serial_out(info, UART_ESI_CMD2, flow_off);
-	serial_out(info, UART_ESI_CMD2, flow_on >> 8);
-	serial_out(info, UART_ESI_CMD2, flow_on);
+	serial_out(info, UART_ESI_CMD2, info->config.flow_off >> 8);
+	serial_out(info, UART_ESI_CMD2, info->config.flow_off);
+	serial_out(info, UART_ESI_CMD2, info->config.flow_on >> 8);
+	serial_out(info, UART_ESI_CMD2, info->config.flow_on);
 
 	restore_flags(flags);
 }
@@ -1283,10 +1286,10 @@
 static int rs_write(struct tty_struct * tty, int from_user,
 		    const unsigned char *buf, int count)
 {
-	int	c, ret = 0;
+	int	c, t, ret = 0;
 	struct esp_struct *info = (struct esp_struct *)tty->driver_data;
 	unsigned long flags;
-				
+
 	if (serial_paranoia_check(info, tty->device, "rs_write"))
 		return 0;
 
@@ -1295,40 +1298,56 @@
 	    
 	if (from_user)
 		down(&tmp_buf_sem);
-	save_flags(flags);
+
 	while (1) {
-		cli();		
-		c = MIN(count, MIN(ESP_XMIT_SIZE - info->xmit_cnt - 1,
-				   ESP_XMIT_SIZE - info->xmit_head));
+		/* Thanks to R. Wolff for suggesting how to do this with */
+		/* interrupts enabled */
+
+		c = count;
+		t = ESP_XMIT_SIZE - info->xmit_cnt - 1;
+		
+		if (t < c)
+			c = t;
+
+		t = ESP_XMIT_SIZE - info->xmit_head;
+		
+		if (t < c)
+			c = t;
+
 		if (c <= 0)
 			break;
 
 		if (from_user) {
 			c -= copy_from_user(tmp_buf, buf, c);
+
 			if (!c) {
 				if (!ret)
 					ret = -EFAULT;
 				break;
 			}
-			c = MIN(c, MIN(ESP_XMIT_SIZE - info->xmit_cnt - 1,
-				       ESP_XMIT_SIZE - info->xmit_head));
+
 			memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
 		} else
 			memcpy(info->xmit_buf + info->xmit_head, buf, c);
+
 		info->xmit_head = (info->xmit_head + c) & (ESP_XMIT_SIZE-1);
 		info->xmit_cnt += c;
-		restore_flags(flags);
 		buf += c;
 		count -= c;
 		ret += c;
 	}
+
 	if (from_user)
 		up(&tmp_buf_sem);
+	
+	save_flags(flags); cli();
+
 	if (info->xmit_cnt && !tty->stopped && !(info->IER & UART_IER_THRI)) {
 		info->IER |= UART_IER_THRI;
 		serial_out(info, UART_ESI_CMD1, ESI_SET_SRV_MASK);
 		serial_out(info, UART_ESI_CMD2, info->IER);
 	}
+
 	restore_flags(flags);
 	return ret;
 }
@@ -1418,7 +1437,7 @@
 	serial_out(info, UART_ESI_CMD1, ESI_SET_SRV_MASK);
 	serial_out(info, UART_ESI_CMD2, info->IER);
 	serial_out(info, UART_ESI_CMD1, ESI_SET_RX_TIMEOUT);
-	serial_out(info, UART_ESI_CMD2, rx_timeout);
+	serial_out(info, UART_ESI_CMD2, info->config.rx_timeout);
 	sti();
 }
 
@@ -1447,24 +1466,40 @@
 	tmp.closing_wait = info->closing_wait;
 	tmp.custom_divisor = info->custom_divisor;
 	tmp.hub6 = 0;
-	tmp.reserved_char[0] = 'E';
-	tmp.reserved_char[1] = rx_timeout;
-	tmp.reserved[0] = rx_trigger;
-	tmp.reserved[1] = tx_trigger;
-	tmp.reserved[2] = flow_off;
-	tmp.reserved[3] = flow_on;
 	if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
 		return -EFAULT;
 	return 0;
 }
 
+static int get_esp_config(struct esp_struct * info,
+			  struct hayes_esp_config * retinfo)
+{
+	struct hayes_esp_config tmp;
+  
+	if (!retinfo)
+		return -EFAULT;
+
+	memset(&tmp, 0, sizeof(tmp));
+	tmp.rx_timeout = info->config.rx_timeout;
+	tmp.rx_trigger = info->config.rx_trigger;
+	tmp.tx_trigger = info->config.tx_trigger;
+	tmp.flow_off = info->config.flow_off;
+	tmp.flow_on = info->config.flow_on;
+	tmp.pio_threshold = info->config.pio_threshold;
+	tmp.dma_channel = (info->stat_flags & ESP_STAT_NEVER_DMA ? 0 : dma);
+
+	if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
+		return -EFAULT;
+
+	return 0;
+}
+
 static int set_serial_info(struct esp_struct * info,
 			   struct serial_struct * new_info)
 {
 	struct serial_struct new_serial;
 	struct esp_struct old_info;
 	unsigned int change_irq;
-	unsigned int change_flow;
 	int retval = 0;
 	struct esp_struct *current_async;
 
@@ -1480,21 +1515,10 @@
 	    (new_serial.irq < 2) ||
 	    (new_serial.irq == 6) ||
 	    (new_serial.irq == 8) ||
-	    (new_serial.irq == 13) ||
-	    (new_serial.reserved[3] >= new_serial.reserved[2]) ||
-	    (new_serial.reserved[0] < 1) ||
-	    (new_serial.reserved[1] < 1) ||
-	    (new_serial.reserved[2] < 1) ||
-	    (new_serial.reserved[3] < 1) ||
-	    (new_serial.reserved[0] > 1023) ||
-	    (new_serial.reserved[1] > 1023) ||
-	    (new_serial.reserved[2] > 1023) ||
-	    (new_serial.reserved[3] > 1023))
+	    (new_serial.irq == 13))
 		return -EINVAL;
 
 	change_irq = new_serial.irq != info->irq;
-	change_flow = ((new_serial.reserved[2] != flow_off) ||
-		       (new_serial.reserved[3] != flow_on));
 
 	if (change_irq && (info->line % 8))
 		return -EINVAL;
@@ -1539,40 +1563,6 @@
 		info->custom_divisor = new_serial.custom_divisor;
 		info->close_delay = new_serial.close_delay * HZ/100;
 		info->closing_wait = new_serial.closing_wait * HZ/100;
-		flow_off = new_serial.reserved[2];
-		flow_on = new_serial.reserved[3];
-
-		if ((new_serial.reserved[0] != rx_trigger) ||
-		    (new_serial.reserved[1] != tx_trigger)) {
-			unsigned long flags;
-
-			rx_trigger = new_serial.reserved[0];
-			tx_trigger = new_serial.reserved[1];
-			save_flags(flags); cli();
-			serial_out(info, UART_ESI_CMD1, ESI_SET_TRIGGER);
-			serial_out(info, UART_ESI_CMD2, rx_trigger >> 8);
-			serial_out(info, UART_ESI_CMD2, rx_trigger);
-			serial_out(info, UART_ESI_CMD2, tx_trigger >> 8);
-			serial_out(info, UART_ESI_CMD2, tx_trigger);
-			restore_flags(flags);
-		}
-
-		if (((unsigned char)(new_serial.reserved_char[1]) !=
-		     rx_timeout)) {
-			unsigned long flags;
-
-			rx_timeout = (unsigned char)
-				(new_serial.reserved_char[1]);
-			save_flags(flags); cli();
-
-			if (info->IER & UART_IER_RDI) {
-				serial_out(info, UART_ESI_CMD1,
-					   ESI_SET_RX_TIMEOUT);
-				serial_out(info, UART_ESI_CMD2, rx_timeout);
-			}
-
-			restore_flags(flags);
-		}
 
 		if (change_irq) {
 			/*
@@ -1602,8 +1592,7 @@
 	if (info->flags & ASYNC_INITIALIZED) {
 		if (((old_info.flags & ASYNC_SPD_MASK) !=
 		     (info->flags & ASYNC_SPD_MASK)) ||
-		    (old_info.custom_divisor != info->custom_divisor) ||
-		    change_flow) {
+		    (old_info.custom_divisor != info->custom_divisor)) {
 			if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
 				info->tty->alt_speed = 57600;
 			if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
@@ -1620,6 +1609,141 @@
 	return retval;
 }
 
+static int set_esp_config(struct esp_struct * info,
+			  struct hayes_esp_config * new_info)
+{
+	struct hayes_esp_config new_config;
+	unsigned int change_dma;
+	int retval = 0;
+	struct esp_struct *current_async;
+
+	/* Perhaps a non-sysadmin user should be able to do some of these */
+	/* operations.  I haven't decided yet. */
+
+	if (!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+
+	if (copy_from_user(&new_config, new_info, sizeof(new_config)))
+		return -EFAULT;
+
+	if ((new_config.flow_on >= new_config.flow_off) ||
+	    (new_config.rx_trigger < 1) ||
+	    (new_config.tx_trigger < 1) ||
+	    (new_config.flow_off < 1) ||
+	    (new_config.flow_on < 1) ||
+	    (new_config.rx_trigger > 1023) ||
+	    (new_config.tx_trigger > 1023) ||
+	    (new_config.flow_off > 1023) ||
+	    (new_config.flow_on > 1023) ||
+	    (new_config.pio_threshold < 0) ||
+	    (new_config.pio_threshold > 1024))
+		return -EINVAL;
+
+	if ((new_config.dma_channel != 1) && (new_config.dma_channel != 3))
+		new_config.dma_channel = 0;
+
+	if (info->stat_flags & ESP_STAT_NEVER_DMA)
+		change_dma = new_config.dma_channel;
+	else
+		change_dma = (new_config.dma_channel != dma);
+
+	if (change_dma) {
+		if (new_config.dma_channel) {
+			/* PIO mode to DMA mode transition OR */
+			/* change current DMA channel */
+			
+			current_async = ports;
+
+			while (current_async) {
+				if (current_async == info) {
+					if (current_async->count > 1)
+						return -EBUSY;
+				} else if (current_async->count)
+					return -EBUSY;
+					
+				current_async =
+					current_async->next_port;
+			}
+
+			shutdown(info);
+			dma = new_config.dma_channel;
+			info->stat_flags &= ~ESP_STAT_NEVER_DMA;
+			
+                        /* all ports must use the same DMA channel */
+
+			current_async = ports;
+
+			while (current_async) {
+				esp_basic_init(current_async);
+				current_async = current_async->next_port;
+			}
+		} else {
+			/* DMA mode to PIO mode only */
+			
+			if (info->count > 1)
+				return -EBUSY;
+
+			shutdown(info);
+			info->stat_flags |= ESP_STAT_NEVER_DMA;
+			esp_basic_init(info);
+		}
+	}
+
+	info->config.pio_threshold = new_config.pio_threshold;
+
+	if ((new_config.flow_off != info->config.flow_off) ||
+	    (new_config.flow_on != info->config.flow_on)) {
+		unsigned long flags;
+
+		info->config.flow_off = new_config.flow_off;
+		info->config.flow_on = new_config.flow_on;
+		save_flags(flags); cli();
+		serial_out(info, UART_ESI_CMD1, ESI_SET_FLOW_LVL);
+		serial_out(info, UART_ESI_CMD2, new_config.flow_off >> 8);
+		serial_out(info, UART_ESI_CMD2, new_config.flow_off);
+		serial_out(info, UART_ESI_CMD2, new_config.flow_on >> 8);
+		serial_out(info, UART_ESI_CMD2, new_config.flow_on);
+		restore_flags(flags);
+	}
+
+	if ((new_config.rx_trigger != info->config.rx_trigger) ||
+	    (new_config.tx_trigger != info->config.tx_trigger)) {
+		unsigned long flags;
+
+		info->config.rx_trigger = new_config.rx_trigger;
+		info->config.tx_trigger = new_config.tx_trigger;
+		save_flags(flags); cli();
+		serial_out(info, UART_ESI_CMD1, ESI_SET_TRIGGER);
+		serial_out(info, UART_ESI_CMD2,
+			   new_config.rx_trigger >> 8);
+		serial_out(info, UART_ESI_CMD2, new_config.rx_trigger);
+		serial_out(info, UART_ESI_CMD2,
+			   new_config.tx_trigger >> 8);
+		serial_out(info, UART_ESI_CMD2, new_config.tx_trigger);
+		restore_flags(flags);
+	}
+
+	if (new_config.rx_timeout != info->config.rx_timeout) {
+		unsigned long flags;
+
+		info->config.rx_timeout = new_config.rx_timeout;
+		save_flags(flags); cli();
+
+		if (info->IER & UART_IER_RDI) {
+			serial_out(info, UART_ESI_CMD1,
+				   ESI_SET_RX_TIMEOUT);
+			serial_out(info, UART_ESI_CMD2,
+				   new_config.rx_timeout);
+		}
+
+		restore_flags(flags);
+	}
+
+	if (!(info->flags & ASYNC_INITIALIZED))
+		retval = startup(info);
+
+	return retval;
+}
 
 /*
  * get_lsr_info - get line status register info
@@ -1741,7 +1865,8 @@
 	if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
 	    (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGWILD)  &&
 	    (cmd != TIOCSERSWILD) && (cmd != TIOCSERGSTRUCT) &&
-	    (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
+	    (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT) &&
+	    (cmd != TIOCGHAYESESP) && (cmd != TIOCSHAYESESP)) {
 		if (tty->flags & (1 << TTY_IO_ERROR))
 		    return -EIO;
 	}
@@ -1826,6 +1951,12 @@
 				return error;
 
 			return 0;
+	case TIOCGHAYESESP:
+		return (get_esp_config(info,
+				       (struct hayes_esp_config *)arg));
+	case TIOCSHAYESESP:
+		return (set_esp_config(info,
+				       (struct hayes_esp_config *)arg));
 
 		default:
 			return -ENOIOCTLCMD;
@@ -2513,6 +2644,12 @@
 		info->tqueue_hangup.data = info;
 		info->callout_termios = esp_callout_driver.init_termios;
 		info->normal_termios = esp_driver.init_termios;
+		info->config.rx_timeout = rx_timeout;
+		info->config.rx_trigger = rx_trigger;
+		info->config.tx_trigger = tx_trigger;
+		info->config.flow_on = flow_on;
+		info->config.flow_off = flow_off;
+		info->config.pio_threshold = pio_threshold;
 		info->next_port = ports;
 		ports = info;
 		printk(KERN_INFO "ttyP%d at 0x%04x (irq = %d) is an ESP ",
diff -u --recursive --new-file v2.1.110/linux/drivers/char/esp.h linux/drivers/char/esp.h
--- v2.1.110/linux/drivers/char/esp.h	Tue Feb 17 13:12:46 1998
+++ linux/drivers/char/esp.h	Wed Dec 31 16:00:00 1969
@@ -1,107 +0,0 @@
-#ifndef ESP_H
-#define ESP_H
-
-#define ESP_IN_MAJOR	57	/* major dev # for dial in */
-#define ESP_OUT_MAJOR	58	/* major dev # for dial out */
-#define ESPC_SCALE 	3
-#define UART_ESI_BASE	0x00
-#define UART_ESI_SID	0x01
-#define UART_ESI_RX	0x02
-#define UART_ESI_TX	0x02
-#define UART_ESI_CMD1	0x04
-#define UART_ESI_CMD2	0x05
-#define UART_ESI_STAT1	0x04
-#define UART_ESI_STAT2	0x05
-#define UART_ESI_RWS	0x07
-
-#define UART_IER_DMA_TMOUT	0x80
-#define UART_IER_DMA_TC		0x08
-
-#define ESI_SET_IRQ		0x04
-#define ESI_SET_DMA_TMOUT	0x05
-#define ESI_SET_SRV_MASK	0x06
-#define ESI_SET_ERR_MASK	0x07
-#define ESI_SET_FLOW_CNTL	0x08
-#define ESI_SET_FLOW_CHARS	0x09
-#define ESI_SET_FLOW_LVL	0x0a
-#define ESI_SET_TRIGGER		0x0b
-#define ESI_SET_RX_TIMEOUT	0x0c
-#define ESI_SET_FLOW_TMOUT	0x0d
-#define ESI_WRITE_UART		0x0e
-#define ESI_READ_UART		0x0f
-#define ESI_SET_MODE		0x10
-#define ESI_GET_ERR_STAT	0x12
-#define ESI_GET_UART_STAT	0x13
-#define ESI_GET_RX_AVAIL	0x14
-#define ESI_GET_TX_AVAIL	0x15
-#define ESI_START_DMA_RX	0x16
-#define ESI_START_DMA_TX	0x17
-#define ESI_ISSUE_BREAK		0x1a
-#define ESI_FLUSH_RX		0x1b
-#define ESI_FLUSH_TX		0x1c
-#define ESI_SET_BAUD		0x1d
-#define ESI_SET_ENH_IRQ		0x1f
-#define ESI_SET_REINTR		0x20
-#define ESI_SET_PRESCALAR	0x23
-#define ESI_NO_COMMAND		0xff
-
-#define ESP_STAT_RX_TIMEOUT	0x01
-#define ESP_STAT_DMA_RX		0x02
-#define ESP_STAT_DMA_TX		0x04
-#define ESP_STAT_NEVER_DMA      0x08
-#define ESP_STAT_USE_PIO        0x10
-
-/* Always use PIO for this number (or less) of bytes */
-#define ESP_PIO_THRESHOLD       32
-
-#define ESP_EVENT_WRITE_WAKEUP	0
-#define ESP_MAGIC		0x53ee
-#define ESP_XMIT_SIZE		4096
-
-struct esp_struct {
-	int			magic;
-	int			port;
-	int			irq;
-	int			flags; 		/* defined in tty.h */
-	struct tty_struct 	*tty;
-	int			read_status_mask;
-	int			ignore_status_mask;
-	int			timeout;
-	int			stat_flags;
-	int			custom_divisor;
-	int			close_delay;
-	unsigned short		closing_wait;
-	unsigned short		closing_wait2;
-	int			IER; 	/* Interrupt Enable Register */
-	int			MCR; 	/* Modem control register */
-	unsigned long		event;
-	unsigned long		last_active;
-	int			line;
-	int			count;	    /* # of fd on device */
-	int			blocked_open; /* # of blocked opens */
-	long			session; /* Session of opening process */
-	long			pgrp; /* pgrp of opening process */
-	unsigned char 		*xmit_buf;
-	int			xmit_head;
-	int			xmit_tail;
-	int			xmit_cnt;
-	struct tq_struct	tqueue;
-	struct tq_struct	tqueue_hangup;
-	struct termios		normal_termios;
-	struct termios		callout_termios;
-	struct wait_queue	*open_wait;
-	struct wait_queue	*close_wait;
-	struct wait_queue	*delta_msr_wait;
-	struct wait_queue	*break_wait;
-	struct async_icount	icount;	/* kernel counters for the 4 input interrupts */
-	struct esp_struct	*next_port; /* For the linked list */
-};
-
-struct esp_pio_buffer
-{
-	unsigned char data[1024];
-	struct esp_pio_buffer *next;
-};
-
-#endif /* ESP_H */
-
diff -u --recursive --new-file v2.1.110/linux/drivers/char/i2c.c linux/drivers/char/i2c.c
--- v2.1.110/linux/drivers/char/i2c.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/i2c.c	Tue Jul 21 12:55:39 1998
@@ -15,8 +15,7 @@
 #include <linux/locks.h>
 #include <linux/sched.h>
 #include <linux/malloc.h>
-
-#include "i2c.h"
+#include <linux/i2c.h>
 
 #define REGPRINT(x)   if (verbose)   (x)
 #define I2C_DEBUG(x)  if (i2c_debug) (x)
diff -u --recursive --new-file v2.1.110/linux/drivers/char/i2c.h linux/drivers/char/i2c.h
--- v2.1.110/linux/drivers/char/i2c.h	Wed Jun 24 22:54:05 1998
+++ linux/drivers/char/i2c.h	Wed Dec 31 16:00:00 1969
@@ -1,166 +0,0 @@
-#ifndef I2C_H
-#define I2C_H
-
-/*
- * linux i2c interface.  Works a little bit like the scsi subsystem.
- * There are:
- *
- *     i2c          the basic control module        (like scsi_mod)
- *     bus driver   a driver with a i2c bus         (host adapter driver)
- *     chip driver  a driver for a chip connected
- *                  to a i2c bus                    (cdrom/hd driver)
- *
- * A device will be attached to one bus and one chip driver.  Every chip
- * driver gets a unique ID.
- *
- * A chip driver can provide a ioctl-like callback for the
- * communication with other parts of the kernel (not every i2c chip is
- * useful without other devices, a TV card tuner for example). 
- *
- * "i2c internal" parts of the structs: only the i2c module is allowed to
- * write to them, for others they are read-only.
- *
- */
-
-#define I2C_BUS_MAX       4    /* max # of bus drivers  */
-#define I2C_DRIVER_MAX    8    /* max # of chip drivers */
-#define I2C_DEVICE_MAX    8    /* max # if devices per bus/driver */
-
-struct i2c_bus;
-struct i2c_driver;
-struct i2c_device;
-
-#define I2C_DRIVERID_MSP3400     1
-#define I2C_DRIVERID_TUNER       2
-#define I2C_DRIVERID_VIDEOTEXT	 3
-
-#define I2C_BUSID_BT848		1	/* I2C bus on a BT848 */
-
-/*
- * struct for a driver for a i2c chip (tuner, soundprocessor,
- * videotext, ... ).
- *
- * a driver will register within the i2c module.  The i2c module will
- * callback the driver (i2c_attach) for every device it finds on a i2c
- * bus at the specified address.  If the driver decides to "accept"
- * the, device, it must return a struct i2c_device, and NULL
- * otherwise.
- *
- * i2c_detach = i2c_attach ** -1
- * 
- * i2c_command will be used to pass commands to the driver in a
- * ioctl-line manner.
- *
- */
-
-struct i2c_driver 
-{
-    char           name[32];         /* some useful label         */
-    int            id;               /* device type ID            */
-    unsigned char  addr_l, addr_h;   /* address range of the chip */
-
-    int (*attach)(struct i2c_device *device);
-    int (*detach)(struct i2c_device *device);
-    int (*command)(struct i2c_device *device,unsigned int cmd, void *arg);
-
-    /* i2c internal */
-    struct i2c_device   *devices[I2C_DEVICE_MAX];
-    int                 devcount;
-};
-
-
-/*
- * this holds the informations about a i2c bus available in the system.
- * 
- * a chip with a i2c bus interface (like bt848) registers the bus within
- * the i2c module. This struct provides functions to access the i2c bus.
- * 
- * One must hold the spinlock to access the i2c bus (XXX: is the irqsave
- * required? Maybe better use a semaphore?). 
- * [-AC-] having a spinlock_irqsave is only needed if we have drivers wishing
- *	  to bang their i2c bus from an interrupt.
- * 
- * attach/detach_inform is a callback to inform the bus driver about
- * attached chip drivers.
- *
- */
-
-/* needed: unsigned long flags */
-
-#define LOCK_I2C_BUS(bus)    spin_lock_irqsave(&(bus->bus_lock),flags);
-#define UNLOCK_I2C_BUS(bus)  spin_unlock_irqrestore(&(bus->bus_lock),flags);
-
-struct i2c_bus 
-{
-	char  name[32];         /* some useful label */
-	int   id;
-	void  *data;            /* free for use by the bus driver */
-
-	spinlock_t bus_lock;
-
-	/* attach/detach inform callbacks */
-	void    (*attach_inform)(struct i2c_bus *bus, int id);
-	void    (*detach_inform)(struct i2c_bus *bus, int id);
-
-	/* Software I2C */
-	void    (*i2c_setlines)(struct i2c_bus *bus, int ctrl, int data);
-	int     (*i2c_getdataline)(struct i2c_bus *bus);
-
-	/* Hardware I2C */
-	int     (*i2c_read)(struct i2c_bus *bus, unsigned char addr);
-	int     (*i2c_write)(struct i2c_bus *bus, unsigned char addr,
-			 unsigned char b1, unsigned char b2, int both);
-
-	/* internal data for i2c module */
-	struct i2c_device   *devices[I2C_DEVICE_MAX];
-	int                 devcount;
-};
-
-
-/*
- *	This holds per-device data for a i2c device
- */
-
-struct i2c_device 
-{
-	char           name[32];         /* some useful label */
-	void           *data;            /* free for use by the chip driver */
-	unsigned char  addr;             /* chip addr */
-
-	/* i2c internal */
-	struct i2c_bus     *bus;
-	struct i2c_driver  *driver;
-};
-
-
-/* ------------------------------------------------------------------- */
-/* i2c module functions                                                */
-
-/* register/unregister a i2c bus */
-int i2c_register_bus(struct i2c_bus *bus);
-int i2c_unregister_bus(struct i2c_bus *bus);
-
-/* register/unregister a chip driver */
-int i2c_register_driver(struct i2c_driver *driver);
-int i2c_unregister_driver(struct i2c_driver *driver);
-
-/* send a command to a chip using the ioctl-like callback interface */
-int i2c_control_device(struct i2c_bus *bus, int id,
-		       unsigned int cmd, void *arg);
-
-/* i2c bus access functions */
-void    i2c_start(struct i2c_bus *bus);
-void    i2c_stop(struct i2c_bus *bus);
-void    i2c_one(struct i2c_bus *bus);
-void    i2c_zero(struct i2c_bus *bus);
-int     i2c_ack(struct i2c_bus *bus);
-
-int     i2c_sendbyte(struct i2c_bus *bus,unsigned char data,int wait_for_ack);
-unsigned char i2c_readbyte(struct i2c_bus *bus,int last);
-
-/* i2c (maybe) hardware functions */
-int     i2c_read(struct i2c_bus *bus, unsigned char addr);
-int     i2c_write(struct i2c_bus *bus, unsigned char addr,
-		  unsigned char b1, unsigned char b2, int both);
-
-#endif /* I2C_H */
diff -u --recursive --new-file v2.1.110/linux/drivers/char/lp.c linux/drivers/char/lp.c
--- v2.1.110/linux/drivers/char/lp.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/lp.c	Thu Jul 23 16:29:33 1998
@@ -323,8 +323,8 @@
 		return -ENXIO;
 
 	lp_table[minor].last_error = 0;
-	lp_table[minor].irq_detected = 1;
-	lp_table[minor].irq_missed = 0;
+	lp_table[minor].irq_detected = 0;
+	lp_table[minor].irq_missed = 1;
 
 	w_ctr(minor, LP_PSELECP | LP_PINITP);
 
diff -u --recursive --new-file v2.1.110/linux/drivers/char/msp3400.c linux/drivers/char/msp3400.c
--- v2.1.110/linux/drivers/char/msp3400.c	Wed Jun 24 22:54:05 1998
+++ linux/drivers/char/msp3400.c	Tue Jul 21 12:55:39 1998
@@ -43,7 +43,7 @@
 #define __KERNEL_SYSCALLS__
 #include <linux/unistd.h>
 
-#include "i2c.h"
+#include <linux/i2c.h>
 #include <linux/videodev.h>
 
 #include "msp3400.h"
diff -u --recursive --new-file v2.1.110/linux/drivers/char/saa5249.c linux/drivers/char/saa5249.c
--- v2.1.110/linux/drivers/char/saa5249.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/saa5249.c	Tue Jul 21 12:55:39 1998
@@ -52,7 +52,7 @@
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <stdarg.h>
-#include "i2c.h"
+#include <linux/i2c.h>
 #include <linux/videotext.h>
 #include <linux/videodev.h>
 
diff -u --recursive --new-file v2.1.110/linux/drivers/char/selection.c linux/drivers/char/selection.c
--- v2.1.110/linux/drivers/char/selection.c	Thu Jul 16 18:09:25 1998
+++ linux/drivers/char/selection.c	Tue Jul 21 10:28:23 1998
@@ -42,8 +42,6 @@
 static int sel_buffer_lth = 0;
 static char *sel_buffer = NULL;
 
-#define sel_pos(n)   inverse_translate(scrw2glyph(screen_word(sel_cons, n, 1)))
-
 /* clear_selection, highlight and highlight_pointer can be called
    from interrupt (via scrollback/front) */
 
@@ -57,6 +55,12 @@
 inline static void
 highlight_pointer(const int where) {
 	complement_pos(sel_cons, where);
+}
+
+static unsigned char
+sel_pos(int n)
+{
+	return inverse_translate(screen_glyph(sel_cons, n));
 }
 
 /* remove the current selection highlight, if any,
diff -u --recursive --new-file v2.1.110/linux/drivers/char/tuner.c linux/drivers/char/tuner.c
--- v2.1.110/linux/drivers/char/tuner.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/char/tuner.c	Tue Jul 21 12:55:39 1998
@@ -7,7 +7,7 @@
 #include <linux/errno.h>
 #include <linux/malloc.h>
 
-#include "i2c.h"
+#include <linux/i2c.h>
 #include <linux/videodev.h>
 
 #include "tuner.h"
diff -u --recursive --new-file v2.1.110/linux/drivers/char/vc_screen.c linux/drivers/char/vc_screen.c
--- v2.1.110/linux/drivers/char/vc_screen.c	Wed Jul  1 19:38:54 1998
+++ linux/drivers/char/vc_screen.c	Wed Jul 22 13:40:04 1998
@@ -170,7 +170,7 @@
 	long p = *ppos;
 	long viewed, attr, size, written;
 	const char *buf0;
-	unsigned short *org = NULL;
+	u16 *org0 = NULL, *org = NULL;
 
 	attr = (currcons & 128);
 	currcons = (currcons & 127);
@@ -193,7 +193,7 @@
 
 	buf0 = buf;
 	if (!attr) {
-		org = screen_pos(currcons, p, viewed);
+		org0 = org = screen_pos(currcons, p, viewed);
 		while (count > 0) {
 			unsigned char c;
 			count--;
@@ -211,8 +211,8 @@
 				putconsxy(currcons, header+2);
 		}
 		if (count > 0) {
-		    p -= HEADER_SIZE;
-			org = screen_pos(currcons, p/2, viewed);
+			p -= HEADER_SIZE;
+			org0 = org = screen_pos(currcons, p/2, viewed);
 			if ((p & 1) && count > 0) {
 			    char c;
 				count--;
@@ -244,9 +244,8 @@
 #endif
 		}
 	}
-	if (currcons == fg_console)
-		/* Horribly inefficient if count < screen size.  */
-		update_screen(currcons);
+	if (org0)
+		update_region(currcons, (unsigned long)(org0), org-org0);
 	written = buf - buf0;
 	*ppos += written;
 	RETURN( written );
diff -u --recursive --new-file v2.1.110/linux/drivers/char/vt.c linux/drivers/char/vt.c
--- v2.1.110/linux/drivers/char/vt.c	Thu Jul 16 18:09:25 1998
+++ linux/drivers/char/vt.c	Tue Jul 21 10:28:23 1998
@@ -32,6 +32,10 @@
 #include <linux/kbd_diacr.h>
 #include <linux/selection.h>
 
+#ifdef CONFIG_FB_COMPAT_XPMAC
+#include <asm/vc_ioctl.h>
+#endif /* CONFIG_FB_COMPAT_XPMAC */
+
 char vt_dont_switch = 0;
 extern struct tty_driver console_driver;
 
@@ -57,7 +61,6 @@
 asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int on);
 #endif
 
-unsigned int video_mode_512ch;
 unsigned int video_font_height;
 unsigned int default_font_height;
 unsigned int video_scan_lines;
@@ -215,9 +218,12 @@
 		    if (kbd->kbdmode != VC_UNICODE)
 				return -EINVAL;
 
+		/* ++Geert: non-PC keyboards may generate keycode zero */
+#if !defined(__mc68000__) && !defined(__powerpc__)
 		/* assignment to entry 0 only tests validity of args */
 		if (!i)
 			break;
+#endif
 
 		if (!(key_map = key_maps[s])) {
 			int j;
@@ -370,26 +376,37 @@
 do_fontx_ioctl(int cmd, struct consolefontdesc *user_cfd, int perm)
 {
 	struct consolefontdesc cfdarg;
+	struct console_font_op op;
 	int i;
 
 	if (copy_from_user(&cfdarg, user_cfd, sizeof(struct consolefontdesc))) 
 		return -EFAULT;
-	if (vt_cons[fg_console]->vc_mode != KD_TEXT)
-		return -EINVAL;
  	
 	switch (cmd) {
 	case PIO_FONTX:
 		if (!perm)
 			return -EPERM;
-		return con_set_font(cfdarg.chardata, 8, cfdarg.charheight, cfdarg.charcount);
+		op.op = KD_FONT_OP_SET;
+		op.flags = 0;
+		op.width = 8;
+		op.height = cfdarg.charheight;
+		op.charcount = cfdarg.charcount;
+		op.data = cfdarg.chardata;
+		return con_font_op(fg_console, &op);
 	case GIO_FONTX: {
-		int w, h;
-		int c= cfdarg.charcount;
 		if (!cfdarg.chardata)
 			return 0;
-		i = con_get_font(cfdarg.chardata, &w, &h, &c);
+		op.op = KD_FONT_OP_GET;
+		op.flags = 0;
+		op.width = 8;
+		op.height = cfdarg.charheight;
+		op.charcount = cfdarg.charcount;
+		op.data = cfdarg.chardata;
+		i = con_font_op(fg_console, &op);
 		if (i)
 			return i;
+		cfdarg.charheight = op.height;
+		cfdarg.charcount = op.charcount;
 		if (copy_to_user(user_cfd, &cfdarg, sizeof(struct consolefontdesc)))
 			return -EFAULT;
 		return 0;
@@ -929,14 +946,28 @@
 		return 0;
   	}
 
-	case PIO_FONT:
+	case PIO_FONT: {
+		struct console_font_op op;
 		if (!perm)
 			return -EPERM;
-		return con_set_font((char *)arg, 8, 0, 256);
+		op.op = KD_FONT_OP_SET;
+		op.flags = KD_FONT_FLAG_DONT_RECALC;	/* Compatibility */
+		op.width = 8;
+		op.height = 0;
+		op.charcount = 256;
+		op.data = (char *) arg;
+		return con_font_op(fg_console, &op);
+	}
 
 	case GIO_FONT: {
-		int w, h, s=256;
-		return con_get_font((char *)arg, &w, &h, &s);
+		struct console_font_op op;
+		op.op = KD_FONT_OP_GET;
+		op.flags = 0;
+		op.width = 8;
+		op.height = 32;
+		op.charcount = 256;
+		op.data = (char *) arg;
+		return con_font_op(fg_console, &op);
 	}
 
 	case PIO_CMAP:
@@ -961,14 +992,31 @@
 		   font is not saved. */
 		return -ENOSYS;
 #else
-
-		i = con_set_font(NULL, 0, 0, 0);	/* Set font to default */
+		{
+		struct console_font_op op;
+		op.op = KD_FONT_SET_DEFAULT;
+		op.data = NULL;
+		i = con_font_op(fg_console, &op);
 		if (i) return i;
 		con_set_default_unimap();
 		return 0;
+		}
 #endif
 	}
 
+	case KDFONTOP: {
+		struct console_font_op op;
+		if (copy_from_user(&op, (void *) arg, sizeof(op)))
+			return -EFAULT;
+		if (!perm && op.op != KD_FONT_OP_GET)
+			return -EPERM;
+		i = con_font_op(console, &op);
+		if (i) return i;
+		if (copy_to_user((void *) arg, &op, sizeof(op)))
+			return -EFAULT;
+		return 0;
+	}
+
 	case PIO_SCRNMAP:
 		if (!perm)
 			return -EPERM;
@@ -1009,6 +1057,76 @@
 		   return -EPERM;
 		vt_dont_switch = 0;
 		return 0;
+#ifdef CONFIG_FB_COMPAT_XPMAC
+	case VC_GETMODE:
+		{
+			struct vc_mode mode;
+
+			i = verify_area(VERIFY_WRITE, (void *) arg,
+					sizeof(struct vc_mode));
+			if (i == 0)
+				i = console_getmode(&mode);
+			if (i)
+				return i;
+			if (copy_to_user((void *) arg, &mode, sizeof(mode)))
+				return -EFAULT;
+			return 0;
+		}
+	case VC_SETMODE:
+	case VC_INQMODE:
+		{
+			struct vc_mode mode;
+
+			if (!perm)
+				return -EPERM;
+			i = verify_area(VERIFY_READ, (void *) arg,
+					sizeof(struct vc_mode));
+			if (i)
+				return i;
+			if (copy_from_user(&mode, (void *) arg, sizeof(mode)))
+				return -EFAULT;
+			return console_setmode(&mode, cmd == VC_SETMODE);
+		}
+	case VC_SETCMAP:
+		{
+			unsigned char cmap[3][256], *p;
+			int n_entries, cmap_size, i, j;
+
+			if (!perm)
+				return -EPERM;
+			if (arg == (unsigned long) VC_POWERMODE_INQUIRY
+			    || arg <= VESA_POWERDOWN) {
+				/* compatibility hack: VC_POWERMODE
+				   was changed from 0x766a to 0x766c */
+				return console_powermode((int) arg);
+			}
+			i = verify_area(VERIFY_READ, (void *) arg,
+					sizeof(int));
+			if (i)
+				return i;
+			if (get_user(cmap_size, (int *) arg))
+				return -EFAULT;
+			if (cmap_size % 3)
+				return -EINVAL;
+			n_entries = cmap_size / 3;
+			if ((unsigned) n_entries > 256)
+				return -EINVAL;
+			p = (unsigned char *) (arg + sizeof(int));
+			for (j = 0; j < n_entries; ++j)
+				for (i = 0; i < 3; ++i)
+					if (get_user(cmap[i][j], p++))
+						return -EFAULT;
+			return console_setcmap(n_entries, cmap[0],
+					       cmap[1], cmap[2]);
+		}
+	case VC_GETCMAP:
+		/* not implemented yet */
+		return -ENOIOCTLCMD;
+	case VC_POWERMODE:
+		if (!perm)
+			return -EPERM;
+		return console_powermode((int) arg);
+#endif /* CONFIG_FB_COMPAT_XPMAC */
 	default:
 		return -ENOIOCTLCMD;
 	}
diff -u --recursive --new-file v2.1.110/linux/drivers/net/3c509.c linux/drivers/net/3c509.c
--- v2.1.110/linux/drivers/net/3c509.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/net/3c509.c	Tue Jul 21 09:56:27 1998
@@ -775,10 +775,6 @@
 MODULE_PARM(irq,"1-8i");
 MODULE_PARM(xcvr,"1-8i");
 
-MODULE_PARM(debug,"i");
-MODULE_PARM(irq,"1-8i");
-MODULE_PARM(xcvr,"1-8i");
-
 int
 init_module(void)
 {
diff -u --recursive --new-file v2.1.110/linux/drivers/net/Config.in linux/drivers/net/Config.in
--- v2.1.110/linux/drivers/net/Config.in	Wed Jun 24 22:54:06 1998
+++ linux/drivers/net/Config.in	Fri Jul 24 11:15:05 1998
@@ -116,10 +116,10 @@
       tristate 'Mylex EISA LNE390A/B support (EXPERIMENTAL)' CONFIG_LNE390
     fi
     tristate 'PCI NE2000 support' CONFIG_NE2K_PCI
+    tristate 'TI ThunderLAN support' CONFIG_TLAN
     if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
       tristate 'Racal-Interlan EISA ES3210 support (EXPERIMENTAL)' CONFIG_ES3210
       tristate 'SMC EtherPower II (EXPERIMENTAL)' CONFIG_EPIC100
-      tristate 'TI ThunderLAN support (EXPERIMENTAL)' CONFIG_TLAN
       bool 'Zenith Z-Note support (EXPERIMENTAL)' CONFIG_ZNET
     fi
   fi
diff -u --recursive --new-file v2.1.110/linux/drivers/net/Makefile linux/drivers/net/Makefile
--- v2.1.110/linux/drivers/net/Makefile	Tue Jul 21 00:15:31 1998
+++ linux/drivers/net/Makefile	Wed Jul 22 13:45:52 1998
@@ -279,13 +279,11 @@
 L_OBJS += slip.o
   ifeq ($(CONFIG_SLIP_COMPRESSED),y)
   CONFIG_SLHC_BUILTIN = y
-  CONFIG_PPPDEF_BUILTIN = y
   endif
 else
   ifeq ($(CONFIG_SLIP),m)
     ifeq ($(CONFIG_SLIP_COMPRESSED),y)
     CONFIG_SLHC_MODULE = y
-    CONFIG_PPPDEF_MODULE = y
   endif
   M_OBJS += slip.o
   endif
diff -u --recursive --new-file v2.1.110/linux/drivers/net/apricot.c linux/drivers/net/apricot.c
--- v2.1.110/linux/drivers/net/apricot.c	Thu Feb 12 20:56:07 1998
+++ linux/drivers/net/apricot.c	Wed Dec 31 16:00:00 1969
@@ -1,1031 +0,0 @@
-/* apricot.c: An Apricot 82596 ethernet driver for linux. */
-/*
-    Apricot
-    	Written 1994 by Mark Evans.
-	This driver is for the Apricot 82596 bus-master interface
-
-        Modularised 12/94 Mark Evans
-
-    Driver skeleton
-	Written 1993 by Donald Becker.
-	Copyright 1993 United States Government as represented by the Director,
-	National Security Agency.  This software may only be used and distributed
-	according to the terms of the GNU Public License as modified by SRC,
-	incorporated herein by reference.
-
-	The author may be reached as becker@super.org or
-	C/O Supercomputing Research Ctr., 17100 Science Dr., Bowie MD 20715
-
-
-*/
-
-static const char *version = "apricot.c:v0.2 05/12/94\n";
-
-#include <linux/module.h>
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/ptrace.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/malloc.h>
-#include <linux/interrupt.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/init.h>
-
-#include <asm/bitops.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-
-#ifndef HAVE_PORTRESERVE
-#define check_region(addr, size)	0
-#define request_region(addr, size,name)	do ; while(0)
-#endif
-
-#ifndef HAVE_ALLOC_SKB
-#define alloc_skb(size, priority) (struct sk_buff *) kmalloc(size,priority)
-#define kfree_skbmem(buff, size) kfree_s(buff,size)
-#endif
-
-#define APRICOT_DEBUG 1
-
-#ifdef APRICOT_DEBUG
-int i596_debug = APRICOT_DEBUG;
-#else
-int i596_debug = 1;
-#endif
-
-#define APRICOT_TOTAL_SIZE 17
-
-#define I596_NULL -1
-
-#define CMD_EOL		0x8000	/* The last command of the list, stop. */
-#define CMD_SUSP	0x4000	/* Suspend after doing cmd. */
-#define CMD_INTR	0x2000	/* Interrupt after doing cmd. */
-
-#define CMD_FLEX	0x0008	/* Enable flexible memory model */
-
-enum commands {
-	CmdNOp = 0, CmdSASetup = 1, CmdConfigure = 2, CmdMulticastList = 3,
-	CmdTx = 4, CmdTDR = 5, CmdDump = 6, CmdDiagnose = 7};
-
-#define STAT_C		0x8000	/* Set to 0 after execution */
-#define STAT_B		0x4000	/* Command being executed */
-#define STAT_OK		0x2000	/* Command executed ok */
-#define STAT_A		0x1000	/* Command aborted */
-
-#define	 CUC_START	0x0100
-#define	 CUC_RESUME	0x0200
-#define	 CUC_SUSPEND    0x0300
-#define	 CUC_ABORT	0x0400
-#define	 RX_START	0x0010
-#define	 RX_RESUME	0x0020
-#define	 RX_SUSPEND	0x0030
-#define	 RX_ABORT	0x0040
-
-struct i596_cmd {
-    unsigned short status;
-    unsigned short command;
-    struct i596_cmd *next;
-};
-
-#define EOF		0x8000
-#define SIZE_MASK	0x3fff
-
-struct i596_tbd {
-    unsigned short size;
-    unsigned short pad;
-    struct i596_tbd *next;
-    char *data;
-};
-
-struct tx_cmd {
-    struct i596_cmd cmd;
-    struct i596_tbd *tbd;
-    unsigned short size;
-    unsigned short pad;
-};
-
-struct i596_rfd {
-    unsigned short stat;
-    unsigned short cmd;
-    struct i596_rfd *next;
-    long rbd;
-    unsigned short count;
-    unsigned short size;
-    char data[1532];
-};
-
-#define RX_RING_SIZE 8
-
-struct i596_scb {
-    unsigned short status;
-    unsigned short command;
-    struct i596_cmd *cmd;
-    struct i596_rfd *rfd;
-    unsigned long crc_err;
-    unsigned long align_err;
-    unsigned long resource_err;
-    unsigned long over_err;
-    unsigned long rcvdt_err;
-    unsigned long short_err;
-    unsigned short t_on;
-    unsigned short t_off;
-};
-
-struct i596_iscp {
-    unsigned long stat;
-    struct i596_scb *scb;
-};
-
-struct i596_scp {
-    unsigned long sysbus;
-    unsigned long pad;
-    struct i596_iscp *iscp;
-};
-
-struct i596_private {
-    struct i596_scp scp;
-    struct i596_iscp iscp;
-    struct i596_scb scb;
-    struct i596_cmd set_add;
-    char eth_addr[8];
-    struct i596_cmd set_conf;
-    char i596_config[16];
-    struct i596_cmd tdr;
-    unsigned long stat;
-    int last_restart;
-    struct i596_rfd *rx_tail;
-    struct i596_cmd *cmd_tail;
-    struct i596_cmd *cmd_head;
-    int cmd_backlog;
-    unsigned long last_cmd;
-    struct net_device_stats stats;
-};
-
-char init_setup[] = {
-	0x8E,	/* length, prefetch on */
-	0xC8,	/* fifo to 8, monitor off */
-	0x80,	/* don't save bad frames */
-	0x2E,	/* No source address insertion, 8 byte preamble */
-	0x00,	/* priority and backoff defaults */
-	0x60,	/* interframe spacing */
-	0x00,	/* slot time LSB */
-	0xf2,	/* slot time and retries */
-	0x00,	/* promiscuous mode */
-	0x00,	/* collision detect */
-	0x40,	/* minimum frame length */
-	0xff,
-	0x00,
-	0x7f	/*  *multi IA */ };
-
-static int i596_open(struct device *dev);
-static int i596_start_xmit(struct sk_buff *skb, struct device *dev);
-static void i596_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-static int i596_close(struct device *dev);
-static struct net_device_stats *i596_get_stats(struct device *dev);
-static void i596_add_cmd(struct device *dev, struct i596_cmd *cmd);
-static void print_eth(char *);
-static void set_multicast_list(struct device *dev);
-
-
-static inline int
-init_rx_bufs(struct device *dev, int num)
-{
-    struct i596_private *lp = (struct i596_private *)dev->priv;
-    int i;
-    struct i596_rfd *rfd;
-
-    lp->scb.rfd = (struct i596_rfd *)I596_NULL;
-
-    if (i596_debug > 1) printk ("%s: init_rx_bufs %d.\n", dev->name, num);
-
-    for (i = 0; i < num; i++)
-    {
-	if (!(rfd = (struct i596_rfd *)kmalloc(sizeof(struct i596_rfd), GFP_KERNEL)))
-            break;
-
-	rfd->stat = 0x0000;
-	rfd->rbd = I596_NULL;
-	rfd->count = 0;
-	rfd->size = 1532;
-        if (i == 0)
-        {
-	    rfd->cmd = CMD_EOL;
-            lp->rx_tail = rfd;
-        }
-        else
-	    rfd->cmd = 0x0000;
-
-        rfd->next = lp->scb.rfd;
-        lp->scb.rfd = rfd;
-    }
-
-    if (i != 0)
-      lp->rx_tail->next = lp->scb.rfd;
-
-    return (i);
-}
-
-static inline void
-remove_rx_bufs(struct device *dev)
-{
-    struct i596_private *lp = (struct i596_private *)dev->priv;
-    struct i596_rfd *rfd = lp->scb.rfd;
-
-    lp->rx_tail->next = (struct i596_rfd *)I596_NULL;
-
-    do
-    {
-        lp->scb.rfd = rfd->next;
-        kfree(rfd);
-        rfd = lp->scb.rfd;
-    }
-    while (rfd != lp->rx_tail);
-}
-
-static inline void
-init_i596_mem(struct device *dev)
-{
-    struct i596_private *lp = (struct i596_private *)dev->priv;
-    short ioaddr = dev->base_addr;
-    int boguscnt = 100;
-
-    /* change the scp address */
-    outw(0, ioaddr);
-    outw(0, ioaddr);
-    outb(4, ioaddr+0xf);
-    outw(((((int)&lp->scp) & 0xffff) | 2), ioaddr);
-    outw((((int)&lp->scp)>>16) & 0xffff, ioaddr);
-
-    lp->last_cmd = jiffies;
-
-    lp->scp.sysbus = 0x00440000;
-    lp->scp.iscp = &(lp->iscp);
-    lp->iscp.scb = &(lp->scb);
-    lp->iscp.stat = 0x0001;
-    lp->cmd_backlog = 0;
-
-    lp->cmd_head = lp->scb.cmd = (struct i596_cmd *) I596_NULL;
-
-    if (i596_debug > 2) printk("%s: starting i82596.\n", dev->name);
-
-    (void) inb (ioaddr+0x10);
-    outb(4, ioaddr+0xf);
-    outw(0, ioaddr+4);
-
-    while (lp->iscp.stat)
-	if (--boguscnt == 0)
-	{
-	    printk("%s: i82596 initialization timed out with status %4.4x, cmd %4.4x.\n",
-		   dev->name, lp->scb.status, lp->scb.command);
-	    break;
-    	}
-
-    lp->scb.command = 0;
-
-    memcpy (lp->i596_config, init_setup, 14);
-    lp->set_conf.command = CmdConfigure;
-    i596_add_cmd(dev, &lp->set_conf);
-
-    memcpy (lp->eth_addr, dev->dev_addr, 6);
-    lp->set_add.command = CmdSASetup;
-    i596_add_cmd(dev, &lp->set_add);
-
-    lp->tdr.command = CmdTDR;
-    i596_add_cmd(dev, &lp->tdr);
-
-    boguscnt = 200;
-    while (lp->scb.command)
-	if (--boguscnt == 0)
-	{
-	    printk("%s: receive unit start timed out with status %4.4x, cmd %4.4x.\n",
-		   dev->name, lp->scb.status, lp->scb.command);
-	    break;
-    	}
-
-    lp->scb.command = RX_START;
-    outw(0, ioaddr+4);
-
-    boguscnt = 200;
-    while (lp->scb.command)
-        if (--boguscnt == 0)
-	{
-	    printk("i82596 init timed out with status %4.4x, cmd %4.4x.\n",
-		lp->scb.status, lp->scb.command);
-	    break;
-	}
-
-    return;
-}
-
-static inline int
-i596_rx(struct device *dev)
-{
-    struct i596_private *lp = (struct i596_private *)dev->priv;
-    int frames = 0;
-
-    if (i596_debug > 3) printk ("i596_rx()\n");
-
-    while ((lp->scb.rfd->stat) & STAT_C)
-    {
-        if (i596_debug >2) print_eth(lp->scb.rfd->data);
-
-	if ((lp->scb.rfd->stat) & STAT_OK)
-	{
-	    /* a good frame */
-	    int pkt_len = lp->scb.rfd->count & 0x3fff;
-	    struct sk_buff *skb = dev_alloc_skb(pkt_len);
-
-	    frames++;
-
-	    if (skb == NULL)
-	    {
-		printk ("%s: i596_rx Memory squeeze, dropping packet.\n", dev->name);
-		lp->stats.rx_dropped++;
-		break;
-	    }
-
-  	    skb->dev = dev;
-	    memcpy(skb_put(skb,pkt_len), lp->scb.rfd->data, pkt_len);
-
-	    skb->protocol=eth_type_trans(skb,dev);
-	    netif_rx(skb);
-	    lp->stats.rx_packets++;
-	    lp->stats.rx_bytes+=pkt_len;
-
-	    if (i596_debug > 4) print_eth(skb->data);
-	}
-	else
-	{
-	    lp->stats.rx_errors++;
-	    if ((lp->scb.rfd->stat) & 0x0001) lp->stats.collisions++;
-	    if ((lp->scb.rfd->stat) & 0x0080) lp->stats.rx_length_errors++;
-	    if ((lp->scb.rfd->stat) & 0x0100) lp->stats.rx_over_errors++;
-	    if ((lp->scb.rfd->stat) & 0x0200) lp->stats.rx_fifo_errors++;
-	    if ((lp->scb.rfd->stat) & 0x0400) lp->stats.rx_frame_errors++;
-	    if ((lp->scb.rfd->stat) & 0x0800) lp->stats.rx_crc_errors++;
-	    if ((lp->scb.rfd->stat) & 0x1000) lp->stats.rx_length_errors++;
-	}
-
-	lp->scb.rfd->stat = 0;
-	lp->rx_tail->cmd = 0;
-	lp->rx_tail = lp->scb.rfd;
-	lp->scb.rfd = lp->scb.rfd->next;
-	lp->rx_tail->count = 0;
-	lp->rx_tail->cmd = CMD_EOL;
-
-    }
-
-    if (i596_debug > 3) printk ("frames %d\n", frames);
-
-    return 0;
-}
-
-static inline void
-i596_cleanup_cmd(struct i596_private *lp)
-{
-    struct i596_cmd *ptr;
-    int boguscnt = 100;
-
-    if (i596_debug > 4) printk ("i596_cleanup_cmd\n");
-
-    while (lp->cmd_head != (struct i596_cmd *) I596_NULL)
-    {
-	ptr = lp->cmd_head;
-
-	lp->cmd_head = lp->cmd_head->next;
-	lp->cmd_backlog--;
-
-	switch ((ptr->command) & 0x7)
-	{
-	    case CmdTx:
-	    {
-		struct tx_cmd *tx_cmd = (struct tx_cmd *) ptr;
-		struct sk_buff *skb = ((struct sk_buff *)(tx_cmd->tbd->data)) -1;
-
-		dev_kfree_skb(skb);
-
-		lp->stats.tx_errors++;
-		lp->stats.tx_aborted_errors++;
-
-		ptr->next = (struct i596_cmd * ) I596_NULL;
-		kfree(tx_cmd);
-		break;
-	    }
-	    case CmdMulticastList:
-	    {
-		ptr->next = (struct i596_cmd * ) I596_NULL;
-		kfree(ptr);
-		break;
-	    }
-	    default:
-		ptr->next = (struct i596_cmd * ) I596_NULL;
-	}
-    }
-
-    while (lp->scb.command)
-	if (--boguscnt == 0)
-	{
-	    printk("i596_cleanup_cmd timed out with status %4.4x, cmd %4.4x.\n",
-		lp->scb.status, lp->scb.command);
-	    break;
-    	}
-
-    lp->scb.cmd = lp->cmd_head;
-}
-
-static inline void
-i596_reset(struct device *dev, struct i596_private *lp, int ioaddr)
-{
-    int boguscnt = 100;
-
-    if (i596_debug > 4) printk ("i596_reset\n");
-
-    while (lp->scb.command)
-        if (--boguscnt == 0)
-	{
-	    printk("i596_reset timed out with status %4.4x, cmd %4.4x.\n",
-		lp->scb.status, lp->scb.command);
-	    break;
-	}
-
-    dev->start = 0;
-    dev->tbusy = 1;
-
-    lp->scb.command = CUC_ABORT|RX_ABORT;
-    outw(0, ioaddr+4);
-
-    /* wait for shutdown */
-    boguscnt = 400;
-
-    while (lp->scb.command)
-        if (--boguscnt == 0)
-	{
-	    printk("i596_reset 2 timed out with status %4.4x, cmd %4.4x.\n",
-		lp->scb.status, lp->scb.command);
-	    break;
-	}
-
-    i596_cleanup_cmd(lp);
-    i596_rx(dev);
-
-    dev->start = 1;
-    dev->tbusy = 0;
-    dev->interrupt = 0;
-    init_i596_mem(dev);
-}
-
-static void i596_add_cmd(struct device *dev, struct i596_cmd *cmd)
-{
-    struct i596_private *lp = (struct i596_private *)dev->priv;
-    int ioaddr = dev->base_addr;
-    unsigned long flags;
-    int boguscnt = 100;
-
-    if (i596_debug > 4) printk ("i596_add_cmd\n");
-
-    cmd->status = 0;
-    cmd->command |= (CMD_EOL|CMD_INTR);
-    cmd->next = (struct i596_cmd *) I596_NULL;
-
-    save_flags(flags);
-    cli();
-    if (lp->cmd_head != (struct i596_cmd *) I596_NULL)
-	lp->cmd_tail->next = cmd;
-    else
-    {
-	lp->cmd_head = cmd;
-	while (lp->scb.command)
-	    if (--boguscnt == 0)
-	    {
-		printk("i596_add_cmd timed out with status %4.4x, cmd %4.4x.\n",
-		   lp->scb.status, lp->scb.command);
-		break;
-    	    }
-
-	lp->scb.cmd = cmd;
-	lp->scb.command = CUC_START;
-        outw (0, ioaddr+4);
-    }
-    lp->cmd_tail = cmd;
-    lp->cmd_backlog++;
-
-    lp->cmd_head = lp->scb.cmd;
-    restore_flags(flags);
-
-    if (lp->cmd_backlog > 16)
-    {
-	int tickssofar = jiffies - lp->last_cmd;
-
-	if (tickssofar < 25) return;
-
-	printk("%s: command unit timed out, status resetting.\n", dev->name);
-
-	i596_reset(dev, lp, ioaddr);
-    }
-}
-
-static int
-i596_open(struct device *dev)
-{
-    int i;
-
-    if (i596_debug > 1)
-	printk("%s: i596_open() irq %d.\n", dev->name, dev->irq);
-
-    if (request_irq(dev->irq, &i596_interrupt, 0, "apricot", dev))
-	return -EAGAIN;
-
-    i = init_rx_bufs(dev, RX_RING_SIZE);
-
-    if ((i = init_rx_bufs(dev, RX_RING_SIZE)) < RX_RING_SIZE)
-        printk("%s: only able to allocate %d receive buffers\n", dev->name, i);
-
-    if (i < 4)
-    {
-        free_irq(dev->irq, dev);
-        return -EAGAIN;
-    }
-
-    dev->tbusy = 0;
-    dev->interrupt = 0;
-    dev->start = 1;
-    MOD_INC_USE_COUNT;
-
-    /* Initialize the 82596 memory */
-    init_i596_mem(dev);
-
-    return 0;			/* Always succeed */
-}
-
-static int
-i596_start_xmit(struct sk_buff *skb, struct device *dev)
-{
-    struct i596_private *lp = (struct i596_private *)dev->priv;
-    int ioaddr = dev->base_addr;
-    struct tx_cmd *tx_cmd;
-
-    if (i596_debug > 2) printk ("%s: Apricot start xmit\n", dev->name);
-
-    /* Transmitter timeout, serious problems. */
-    if (dev->tbusy) {
-	int tickssofar = jiffies - dev->trans_start;
-	if (tickssofar < 5)
-	    return 1;
-	printk("%s: transmit timed out, status resetting.\n",
-	       dev->name);
-	lp->stats.tx_errors++;
-	/* Try to restart the adaptor */
-	if (lp->last_restart == lp->stats.tx_packets) {
-	    if (i596_debug > 1) printk ("Resetting board.\n");
-
-	    /* Shutdown and restart */
-            i596_reset(dev,lp, ioaddr);
-	} else {
-	    /* Issue a channel attention signal */
-	    if (i596_debug > 1) printk ("Kicking board.\n");
-
-	    lp->scb.command = CUC_START|RX_START;
-	    outw(0, ioaddr+4);
-
-	    lp->last_restart = lp->stats.tx_packets;
-	}
-	dev->tbusy = 0;
-	dev->trans_start = jiffies;
-    }
-
-    if (i596_debug > 3) printk("%s: i596_start_xmit() called\n", dev->name);
-
-    /* Block a timer-based transmit from overlapping.  This could better be
-       done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
-    if (test_and_set_bit(0, (void*)&dev->tbusy) != 0)
-	printk("%s: Transmitter access conflict.\n", dev->name);
-    else
-    {
-	short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
-	dev->trans_start = jiffies;
-
-	tx_cmd = (struct tx_cmd *) kmalloc ((sizeof (struct tx_cmd) + sizeof (struct i596_tbd)), GFP_ATOMIC);
-	if (tx_cmd == NULL)
-	{
-	    printk ("%s: i596_xmit Memory squeeze, dropping packet.\n", dev->name);
-	    lp->stats.tx_dropped++;
-
-	    dev_kfree_skb(skb);
-	}
-	else
-	{
-	    tx_cmd->tbd = (struct i596_tbd *) (tx_cmd + 1);
-	    tx_cmd->tbd->next = (struct i596_tbd *) I596_NULL;
-
-	    tx_cmd->cmd.command = CMD_FLEX|CmdTx;
-
-	    tx_cmd->pad = 0;
-	    tx_cmd->size = 0;
-	    tx_cmd->tbd->pad = 0;
-	    tx_cmd->tbd->size = EOF | length;
-
-	    tx_cmd->tbd->data = skb->data;
-
-	    if (i596_debug > 3) print_eth(skb->data);
-
-	    i596_add_cmd(dev, (struct i596_cmd *)tx_cmd);
-
-	    lp->stats.tx_packets++;
-	    lp->stats.tx_bytes+=length;
-	}
-    }
-
-    dev->tbusy = 0;
-
-    return 0;
-}
-
-
-static void print_eth(char *add)
-{
-    int i;
-
-    printk ("Dest  ");
-    for (i = 0; i < 6; i++)
-	printk(" %2.2X", (unsigned char)add[i]);
-    printk ("\n");
-
-    printk ("Source");
-    for (i = 0; i < 6; i++)
-	printk(" %2.2X", (unsigned char)add[i+6]);
-    printk ("\n");
-    printk ("type %2.2X%2.2X\n", (unsigned char)add[12], (unsigned char)add[13]);
-}
-
-__initfunc(int apricot_probe(struct device *dev))
-{
-    int i;
-    struct i596_private *lp;
-    int checksum = 0;
-    int ioaddr = 0x300;
-    char eth_addr[6];
-
-    /* this is easy the ethernet interface can only be at 0x300 */
-    /* first check nothing is already registered here */
-
-    if (check_region(ioaddr, APRICOT_TOTAL_SIZE))
-	return ENODEV;
-
-    for (i = 0; i < 8; i++)
-    {
-    	eth_addr[i] = inb(ioaddr+8+i);
-	checksum += eth_addr[i];
-     }
-
-    /* checksum is a multiple of 0x100, got this wrong first time
-       some machines have 0x100, some 0x200. The DOS driver doesn't
-       even bother with the checksum */
-
-    if (checksum % 0x100) return ENODEV;
-
-    /* Some other boards trip the checksum.. but then appear as ether
-       address 0. Trap these - AC */
-
-    if(memcmp(eth_addr,"\x00\x00\x49",3)!= 0)
-    	return ENODEV;
-
-    request_region(ioaddr, APRICOT_TOTAL_SIZE, "apricot");
-
-    dev->base_addr = ioaddr;
-    ether_setup(dev);
-    printk("%s: Apricot 82596 at %#3x,", dev->name, ioaddr);
-
-    for (i = 0; i < 6; i++)
-	printk(" %2.2X", dev->dev_addr[i] = eth_addr[i]);
-
-    dev->base_addr = ioaddr;
-    dev->irq = 10;
-    printk(" IRQ %d.\n", dev->irq);
-
-    if (i596_debug > 0) printk(version);
-
-    /* The APRICOT-specific entries in the device structure. */
-    dev->open = &i596_open;
-    dev->stop = &i596_close;
-    dev->hard_start_xmit = &i596_start_xmit;
-    dev->get_stats = &i596_get_stats;
-    dev->set_multicast_list = &set_multicast_list;
-
-    dev->mem_start = (int)kmalloc(sizeof(struct i596_private)+ 0x0f, GFP_KERNEL);
-    /* align for scp */
-    dev->priv = (void *)((dev->mem_start + 0xf) & 0xfffffff0);
-
-    lp = (struct i596_private *)dev->priv;
-    memset((void *)lp, 0, sizeof(struct i596_private));
-    lp->scb.command = 0;
-    lp->scb.cmd = (struct i596_cmd *) I596_NULL;
-    lp->scb.rfd = (struct i596_rfd *)I596_NULL;
-
-    return 0;
-}
-
-static void
-i596_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-    struct device *dev = dev_id;
-    struct i596_private *lp;
-    short ioaddr;
-    int boguscnt = 200;
-    unsigned short status, ack_cmd = 0;
-
-    if (dev == NULL) {
-	printk ("i596_interrupt(): irq %d for unknown device.\n", irq);
-	return;
-    }
-
-    if (i596_debug > 3) printk ("%s: i596_interrupt(): irq %d\n",dev->name, irq);
-
-    if (dev->interrupt)
-	printk("%s: Re-entering the interrupt handler.\n", dev->name);
-
-    dev->interrupt = 1;
-
-    ioaddr = dev->base_addr;
-
-    lp = (struct i596_private *)dev->priv;
-
-    while (lp->scb.command)
-	if (--boguscnt == 0)
-	    {
-		printk("%s: i596 interrupt, timeout status %4.4x command %4.4x.\n", dev->name, lp->scb.status, lp->scb.command);
-		break;
-	    }
-    status = lp->scb.status;
-
-    if (i596_debug > 4)
-	printk("%s: i596 interrupt, status %4.4x.\n", dev->name, status);
-
-    ack_cmd = status & 0xf000;
-
-    if ((status & 0x8000) || (status & 0x2000))
-    {
-	struct i596_cmd *ptr;
-
-	if ((i596_debug > 4) && (status & 0x8000))
-	    printk("%s: i596 interrupt completed command.\n", dev->name);
-	if ((i596_debug > 4) && (status & 0x2000))
-	    printk("%s: i596 interrupt command unit inactive %x.\n", dev->name, status & 0x0700);
-
-	while ((lp->cmd_head != (struct i596_cmd *) I596_NULL) && (lp->cmd_head->status & STAT_C))
-	{
-	    ptr = lp->cmd_head;
-
-	    lp->cmd_head = lp->cmd_head->next;
-	    lp->cmd_backlog--;
-
-	    switch ((ptr->command) & 0x7)
-	    {
-		case CmdTx:
-		{
-		    struct tx_cmd *tx_cmd = (struct tx_cmd *) ptr;
-		    struct sk_buff *skb = ((struct sk_buff *)(tx_cmd->tbd->data)) -1;
-
-		    dev_kfree_skb(skb);
-
-		    if ((ptr->status) & STAT_OK)
-		    {
-	    		if (i596_debug >2) print_eth(skb->data);
-		    }
-		    else
-		    {
-			lp->stats.tx_errors++;
-			if ((ptr->status) & 0x0020) lp->stats.collisions++;
-			if (!((ptr->status) & 0x0040)) lp->stats.tx_heartbeat_errors++;
-			if ((ptr->status) & 0x0400) lp->stats.tx_carrier_errors++;
-			if ((ptr->status) & 0x0800) lp->stats.collisions++;
-			if ((ptr->status) & 0x1000) lp->stats.tx_aborted_errors++;
-		    }
-
-
-		    ptr->next = (struct i596_cmd * ) I596_NULL;
-		    kfree(tx_cmd);
-		    break;
-		}
-		case CmdMulticastList:
-		{
-		    ptr->next = (struct i596_cmd * ) I596_NULL;
-		    kfree(ptr);
-		    break;
-		}
-		case CmdTDR:
-		{
-		    unsigned long status = *((unsigned long *) (ptr + 1));
-
-		    if (status & 0x8000)
-		    {
-			if (i596_debug > 3)
-	    		    printk("%s: link ok.\n", dev->name);
-		    }
-		    else
-		    {
-			if (status & 0x4000)
-	    		    printk("%s: Transceiver problem.\n", dev->name);
-			if (status & 0x2000)
-	    		    printk("%s: Termination problem.\n", dev->name);
-			if (status & 0x1000)
-	    		    printk("%s: Short circuit.\n", dev->name);
-
-	    		printk("%s: Time %ld.\n", dev->name, status & 0x07ff);
-		    }
-		}
-		default:
-		    ptr->next = (struct i596_cmd * ) I596_NULL;
-
-		lp->last_cmd = jiffies;
- 	    }
-	}
-
-	ptr = lp->cmd_head;
-	while ((ptr != (struct i596_cmd *) I596_NULL) && (ptr != lp->cmd_tail))
-	{
-	    ptr->command &= 0x1fff;
-	    ptr = ptr->next;
-	}
-
-	if ((lp->cmd_head != (struct i596_cmd *) I596_NULL) && (dev->start)) ack_cmd |= CUC_START;
-	lp->scb.cmd = lp->cmd_head;
-    }
-
-    if ((status & 0x1000) || (status & 0x4000))
-    {
-	if ((i596_debug > 4) && (status & 0x4000))
-	    printk("%s: i596 interrupt received a frame.\n", dev->name);
-	if ((i596_debug > 4) && (status & 0x1000))
-	    printk("%s: i596 interrupt receive unit inactive %x.\n", dev->name, status & 0x0070);
-
-	i596_rx(dev);
-
-	if (dev->start) ack_cmd |= RX_START;
-    }
-
-    /* acknowledge the interrupt */
-
-/*
-    if ((lp->scb.cmd != (struct i596_cmd *) I596_NULL) && (dev->start)) ack_cmd | = CUC_START;
-*/
-    boguscnt = 100;
-    while (lp->scb.command)
-	if (--boguscnt == 0)
-	    {
-		printk("%s: i596 interrupt, timeout status %4.4x command %4.4x.\n", dev->name, lp->scb.status, lp->scb.command);
-		break;
-	    }
-    lp->scb.command = ack_cmd;
-
-    (void) inb (ioaddr+0x10);
-    outb (4, ioaddr+0xf);
-    outw (0, ioaddr+4);
-
-    if (i596_debug > 4)
-	printk("%s: exiting interrupt.\n", dev->name);
-
-    dev->interrupt = 0;
-    return;
-}
-
-static int
-i596_close(struct device *dev)
-{
-    int ioaddr = dev->base_addr;
-    struct i596_private *lp = (struct i596_private *)dev->priv;
-    int boguscnt = 200;
-
-    dev->start = 0;
-    dev->tbusy = 1;
-
-    if (i596_debug > 1)
-	printk("%s: Shutting down ethercard, status was %4.4x.\n",
-	       dev->name, lp->scb.status);
-
-    lp->scb.command = CUC_ABORT|RX_ABORT;
-    outw(0, ioaddr+4);
-
-    i596_cleanup_cmd(lp);
-
-    while (lp->scb.command)
-	if (--boguscnt == 0)
-	{
-	    printk("%s: close timed timed out with status %4.4x, cmd %4.4x.\n",
-		   dev->name, lp->scb.status, lp->scb.command);
-	    break;
-    	}
-    free_irq(dev->irq, dev);
-    remove_rx_bufs(dev);
-    MOD_DEC_USE_COUNT;
-
-    return 0;
-}
-
-static struct net_device_stats *
-i596_get_stats(struct device *dev)
-{
-    struct i596_private *lp = (struct i596_private *)dev->priv;
-
-    return &lp->stats;
-}
-
-/*
- *	Set or clear the multicast filter for this adaptor.
- */
-
-static void set_multicast_list(struct device *dev)
-{
-	struct i596_private *lp = (struct i596_private *)dev->priv;
-	struct i596_cmd *cmd;
-
-	if (i596_debug > 1)
-		printk ("%s: set multicast list %d\n", dev->name, dev->mc_count);
-
-	if (dev->mc_count > 0)
-	{
-		struct dev_mc_list *dmi;
-		char *cp;
-		cmd = (struct i596_cmd *) kmalloc(sizeof(struct i596_cmd)+2+dev->mc_count*6, GFP_ATOMIC);
-		if (cmd == NULL)
-		{
-			printk ("%s: set_multicast Memory squeeze.\n", dev->name);
-			return;
-		}
-		cmd->command = CmdMulticastList;
-		*((unsigned short *) (cmd + 1)) = dev->mc_count * 6;
-		cp=((char *)(cmd + 1))+2;
-		for(dmi=dev->mc_list;dmi!=NULL;dmi=dmi->next)
-		{
-			memcpy(cp, dmi,6);
-			cp+=6;
-		}
-		print_eth (((char *)(cmd + 1)) + 2);
-		i596_add_cmd(dev, cmd);
-	}
-	else
-	{
-		if (lp->set_conf.next != (struct i596_cmd * ) I596_NULL)
-			return;
-		if (dev->mc_count == 0 && !(dev->flags&(IFF_PROMISC|IFF_ALLMULTI)))
-		{
-			if(dev->flags&IFF_ALLMULTI)
-				dev->flags|=IFF_PROMISC;
-			lp->i596_config[8] &= ~0x01;
-		}
-		else
-			lp->i596_config[8] |= 0x01;
-
-		i596_add_cmd(dev, &lp->set_conf);
-	}
-}
-
-#ifdef HAVE_DEVLIST
-static unsigned int apricot_portlist[] __initdata = {0x300, 0};
-struct netdev_entry apricot_drv =
-{"apricot", apricot_probe, APRICOT_TOTAL_SIZE, apricot_portlist};
-#endif
-
-#ifdef MODULE
-static char devicename[9] = { 0, };
-static struct device dev_apricot = {
-  devicename, /* device name inserted by /linux/drivers/net/net_init.c */
-  0, 0, 0, 0,
-  0x300, 10,
-  0, 0, 0, NULL, apricot_probe };
-
-static int io = 0x300;
-static int irq = 10;
-MODULE_PARM(irq, "i");
-
-int
-init_module(void)
-{
-  dev_apricot.base_addr = io;
-  dev_apricot.irq       = irq;
-  if (register_netdev(&dev_apricot) != 0)
-    return -EIO;
-  return 0;
-}
-
-void
-cleanup_module(void)
-{
-    unregister_netdev(&dev_apricot);
-    kfree((void*)dev_apricot.mem_start);
-    dev_apricot.priv = NULL;
-
-    /* If we don't do this, we can't re-insmod it later. */
-    release_region(dev_apricot.base_addr, APRICOT_TOTAL_SIZE);
-}
-#endif /* MODULE */
-
-/*
- * Local variables:
- *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c apricot.c"
- * End:
- */
diff -u --recursive --new-file v2.1.110/linux/drivers/net/hamradio/mkiss.c linux/drivers/net/hamradio/mkiss.c
--- v2.1.110/linux/drivers/net/hamradio/mkiss.c	Sun Jun  7 11:16:32 1998
+++ linux/drivers/net/hamradio/mkiss.c	Wed Jul 22 13:45:52 1998
@@ -19,6 +19,9 @@
  *
  *	History
  *	Jonathan (G4KLX)	Fixed to match Linux networking changes - 2.1.15.
+ *	Matthias (DG2FEF)       Added support for FlexNet CRC (on special request)
+ *                              Fixed bug in ax25_close(): dev_lock_wait() was
+ *                              called twice, causing a deadlock.
  */
 
 #include <linux/config.h>
@@ -91,8 +94,80 @@
 static int mkiss_init(void);
 static int mkiss_write(struct tty_struct *, int, const unsigned char *, int);
 static int kiss_esc(unsigned char *, unsigned char *, int);
+static int kiss_esc_crc(unsigned char *, unsigned char *, unsigned short, int);
 static void kiss_unesc(struct ax_disp *, unsigned char);
 
+/*---------------------------------------------------------------------------*/
+
+static const unsigned short Crc_flex_table[] = {
+  0x0f87, 0x1e0e, 0x2c95, 0x3d1c, 0x49a3, 0x582a, 0x6ab1, 0x7b38,
+  0x83cf, 0x9246, 0xa0dd, 0xb154, 0xc5eb, 0xd462, 0xe6f9, 0xf770,
+  0x1f06, 0x0e8f, 0x3c14, 0x2d9d, 0x5922, 0x48ab, 0x7a30, 0x6bb9,
+  0x934e, 0x82c7, 0xb05c, 0xa1d5, 0xd56a, 0xc4e3, 0xf678, 0xe7f1,
+  0x2e85, 0x3f0c, 0x0d97, 0x1c1e, 0x68a1, 0x7928, 0x4bb3, 0x5a3a,
+  0xa2cd, 0xb344, 0x81df, 0x9056, 0xe4e9, 0xf560, 0xc7fb, 0xd672,
+  0x3e04, 0x2f8d, 0x1d16, 0x0c9f, 0x7820, 0x69a9, 0x5b32, 0x4abb,
+  0xb24c, 0xa3c5, 0x915e, 0x80d7, 0xf468, 0xe5e1, 0xd77a, 0xc6f3,
+  0x4d83, 0x5c0a, 0x6e91, 0x7f18, 0x0ba7, 0x1a2e, 0x28b5, 0x393c,
+  0xc1cb, 0xd042, 0xe2d9, 0xf350, 0x87ef, 0x9666, 0xa4fd, 0xb574,
+  0x5d02, 0x4c8b, 0x7e10, 0x6f99, 0x1b26, 0x0aaf, 0x3834, 0x29bd,
+  0xd14a, 0xc0c3, 0xf258, 0xe3d1, 0x976e, 0x86e7, 0xb47c, 0xa5f5,
+  0x6c81, 0x7d08, 0x4f93, 0x5e1a, 0x2aa5, 0x3b2c, 0x09b7, 0x183e,
+  0xe0c9, 0xf140, 0xc3db, 0xd252, 0xa6ed, 0xb764, 0x85ff, 0x9476,
+  0x7c00, 0x6d89, 0x5f12, 0x4e9b, 0x3a24, 0x2bad, 0x1936, 0x08bf,
+  0xf048, 0xe1c1, 0xd35a, 0xc2d3, 0xb66c, 0xa7e5, 0x957e, 0x84f7,
+  0x8b8f, 0x9a06, 0xa89d, 0xb914, 0xcdab, 0xdc22, 0xeeb9, 0xff30,
+  0x07c7, 0x164e, 0x24d5, 0x355c, 0x41e3, 0x506a, 0x62f1, 0x7378,
+  0x9b0e, 0x8a87, 0xb81c, 0xa995, 0xdd2a, 0xcca3, 0xfe38, 0xefb1,
+  0x1746, 0x06cf, 0x3454, 0x25dd, 0x5162, 0x40eb, 0x7270, 0x63f9,
+  0xaa8d, 0xbb04, 0x899f, 0x9816, 0xeca9, 0xfd20, 0xcfbb, 0xde32,
+  0x26c5, 0x374c, 0x05d7, 0x145e, 0x60e1, 0x7168, 0x43f3, 0x527a,
+  0xba0c, 0xab85, 0x991e, 0x8897, 0xfc28, 0xeda1, 0xdf3a, 0xceb3,
+  0x3644, 0x27cd, 0x1556, 0x04df, 0x7060, 0x61e9, 0x5372, 0x42fb,
+  0xc98b, 0xd802, 0xea99, 0xfb10, 0x8faf, 0x9e26, 0xacbd, 0xbd34,
+  0x45c3, 0x544a, 0x66d1, 0x7758, 0x03e7, 0x126e, 0x20f5, 0x317c,
+  0xd90a, 0xc883, 0xfa18, 0xeb91, 0x9f2e, 0x8ea7, 0xbc3c, 0xadb5,
+  0x5542, 0x44cb, 0x7650, 0x67d9, 0x1366, 0x02ef, 0x3074, 0x21fd,
+  0xe889, 0xf900, 0xcb9b, 0xda12, 0xaead, 0xbf24, 0x8dbf, 0x9c36,
+  0x64c1, 0x7548, 0x47d3, 0x565a, 0x22e5, 0x336c, 0x01f7, 0x107e,
+  0xf808, 0xe981, 0xdb1a, 0xca93, 0xbe2c, 0xafa5, 0x9d3e, 0x8cb7,
+  0x7440, 0x65c9, 0x5752, 0x46db, 0x3264, 0x23ed, 0x1176, 0x00ff
+};
+
+/*---------------------------------------------------------------------------*/
+
+static unsigned short 
+calc_crc_flex(unsigned char *cp, int size)
+{
+    unsigned short crc = 0xffff;
+    
+    while (size--)
+	crc = (crc << 8) ^ Crc_flex_table[((crc >> 8) ^ *cp++) & 0xff];
+
+    return crc;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static int 
+check_crc_flex(unsigned char *cp, int size)
+{
+  unsigned short crc = 0xffff;
+
+  if (size < 3)
+      return -1;
+
+  while (size--)
+      crc = (crc << 8) ^ Crc_flex_table[((crc >> 8) ^ *cp++) & 0xff];
+
+  if ((crc & 0xffff) != 0x7070) 
+      return -1;
+
+  return 0;
+}
+
+/*---------------------------------------------------------------------------*/
+
 /* Find a free channel, and link in this `tty' line. */
 static inline struct ax_disp *ax_alloc(void)
 {
@@ -272,6 +347,13 @@
 			mkiss= ax->mkiss->tty->driver_data;
 			if (mkiss->magic == MKISS_DRIVER_MAGIC)
 				tmp_ax = ax->mkiss;
+		} else if (ax->rbuff[0] & 0x20) {
+		        ax->crcmode = CRC_MODE_FLEX;
+			if (check_crc_flex(ax->rbuff, ax->rcount) < 0) {
+			        ax->rx_errors++;
+				return;
+			}
+			ax->rcount -= 2;
 		}
  	}
 
@@ -312,7 +394,19 @@
 	p = icp;
 
 	if (mkiss->magic  != MKISS_DRIVER_MAGIC) {
-		count = kiss_esc(p, (unsigned char *)ax->xbuff, len);
+	        switch (ax->crcmode) {
+		         unsigned short crc;
+			 
+		case CRC_MODE_FLEX:
+		         *p |= 0x20;
+		         crc = calc_crc_flex(p, len);
+			 count = kiss_esc_crc(p, (unsigned char *)ax->xbuff, crc, len+2);
+			 break;
+
+		default:
+		         count = kiss_esc(p, (unsigned char *)ax->xbuff, len);
+			 break;
+		}
 		ax->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
 		actual = ax->tty->driver.write(ax->tty, 0, ax->xbuff, count);
 		ax->tx_packets++;
@@ -629,12 +723,8 @@
 		return;
 
 	mkiss = ax->mode;
-	if (ax->dev->flags & IFF_UP)
-	{
-		dev_lock_wait();
-		dev_close(ax->dev);
-		dev_unlock_list();
-	}
+
+	dev_close(ax->dev);
 
 	tty->disc_data = 0;
 	ax->tty        = NULL;
@@ -704,6 +794,45 @@
 	return ptr - d;
 }
 
+/*
+ * MW:
+ * OK its ugly, but tell me a better solution without copying the
+ * packet to a temporary buffer :-)
+ */
+static int kiss_esc_crc(unsigned char *s, unsigned char *d, unsigned short crc, int len)
+{
+	unsigned char *ptr = d;
+	unsigned char c;
+
+	*ptr++ = END;
+	while (len > 0) {
+		if (len > 2) 
+			c = *s++;
+		else if (len > 1)
+			c = crc >> 8;
+		else if (len > 0)
+			c = crc & 0xff;
+
+		len--;
+
+		switch (c) {
+                        case END:
+                                *ptr++ = ESC;
+                                *ptr++ = ESC_END;
+                                break;
+                        case ESC:
+                                *ptr++ = ESC;
+                                *ptr++ = ESC_ESC;
+                                break;
+                        default:
+                                *ptr++ = c;
+                                break;
+		}
+	}
+	*ptr++ = END;
+	return ptr - d;		
+}
+
 static void kiss_unesc(struct ax_disp *ax, unsigned char s)
 {
 	switch (s) {
@@ -746,14 +875,8 @@
 
 int ax_set_mac_address(struct device *dev, void *addr)
 {
-	int err;
-
-	if ((err = verify_area(VERIFY_READ, addr, AX25_ADDR_LEN)) != 0)
-		return err;
-
-	/* addr is an AX.25 shifted ASCII mac address */
-	copy_from_user(dev->dev_addr, addr, AX25_ADDR_LEN);
-
+	if (copy_from_user(dev->dev_addr, addr, AX25_ADDR_LEN))
+		return -EFAULT;
 	return 0;
 }
 
@@ -780,20 +903,15 @@
 
 	switch (cmd) {
 	 	case SIOCGIFNAME:
-			if ((err = verify_area(VERIFY_WRITE, arg, strlen(ax->dev->name) + 1)) != 0)
-				return err;
-			copy_to_user(arg, ax->dev->name, strlen(ax->dev->name) + 1);
+			if (copy_to_user(arg, ax->dev->name, strlen(ax->dev->name) + 1))
+				return -EFAULT;
 			return 0;
 
 		case SIOCGIFENCAP:
-			if ((err = verify_area(VERIFY_WRITE, arg, sizeof(int))) != 0)
-				return err;
 			put_user(4, (int *)arg);
 			return 0;
 
 		case SIOCSIFENCAP:
-			if ((err = verify_area(VERIFY_READ, arg, sizeof(int))) != 0)
-				return err;
 			get_user(tmp, (int *)arg);
 	 		ax->mode = tmp;
 			ax->dev->addr_len        = AX25_ADDR_LEN;	  /* sizeof an AX.25 addr */
diff -u --recursive --new-file v2.1.110/linux/drivers/net/hamradio/mkiss.h linux/drivers/net/hamradio/mkiss.h
--- v2.1.110/linux/drivers/net/hamradio/mkiss.h	Sun Nov 10 09:12:56 1996
+++ linux/drivers/net/hamradio/mkiss.h	Wed Jul 22 13:45:52 1998
@@ -50,6 +50,10 @@
 #define AXF_OUTWAIT	4		/* is outpacket was flag	*/
 
 	int                 mode;
+        int                 crcmode;    /* MW: for FlexNet, SMACK etc.  */ 
+#define CRC_MODE_NONE   0
+#define CRC_MODE_FLEX   1
+#define CRC_MODE_SMACK  2
 };
 
 #define AX25_MAGIC		0x5316
diff -u --recursive --new-file v2.1.110/linux/drivers/net/tlan.c linux/drivers/net/tlan.c
--- v2.1.110/linux/drivers/net/tlan.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/net/tlan.c	Tue Jul 21 11:39:16 1998
@@ -779,7 +779,7 @@
 
 	if ( ! priv->phyOnline ) {
 		TLAN_DBG( TLAN_DEBUG_TX, "TLAN TRANSMIT:  %s PHY is not ready\n", dev->name );
-		dev_kfree_skb( skb, FREE_WRITE );
+		dev_kfree_skb( skb );
 		return 0;
 	}
 
@@ -837,7 +837,7 @@
 	CIRC_INC( priv->txTail, TLAN_NUM_TX_LISTS );
 
 	if ( bbuf ) {
-		dev_kfree_skb( skb, FREE_WRITE );
+		dev_kfree_skb( skb );
 	}
 		
 	dev->trans_start = jiffies;
@@ -1126,7 +1126,7 @@
 	head_list = priv->txList + priv->txHead;
 
 	if ( ! bbuf ) {
-		dev_kfree_skb( (struct sk_buff *) head_list->buffer[9].address, FREE_WRITE );
+		dev_kfree_skb( (struct sk_buff *) head_list->buffer[9].address );
 		head_list->buffer[9].address = 0;
 	}
 
@@ -1692,7 +1692,7 @@
 			list = priv->txList + i;
 			skb = (struct sk_buff *) list->buffer[9].address;
 			if ( skb ) {
-				dev_kfree_skb( skb, FREE_WRITE );
+				dev_kfree_skb( skb );
 				list->buffer[9].address = 0;
 			}
 		}
@@ -1701,7 +1701,7 @@
 			list = priv->rxList + i;
 			skb = (struct sk_buff *) list->buffer[9].address;
 			if ( skb ) {
-				dev_kfree_skb( skb, FREE_READ );
+				dev_kfree_skb( skb );
 				list->buffer[9].address = 0;
 			}
 		}
diff -u --recursive --new-file v2.1.110/linux/drivers/scsi/fdomain.c linux/drivers/scsi/fdomain.c
--- v2.1.110/linux/drivers/scsi/fdomain.c	Sun Jun  7 11:16:34 1998
+++ linux/drivers/scsi/fdomain.c	Fri Jul 24 11:21:26 1998
@@ -950,7 +950,7 @@
       /* Register the IRQ with the kernel */
 
       retcode = request_irq( interrupt_level,
-			     do_fdomain_16x0_intr, SA_INTERRUPT, "fdomain", NULL);
+			     do_fdomain_16x0_intr, 0, "fdomain", NULL);
 
       if (retcode < 0) {
 	 if (retcode == -EINVAL) {
@@ -1181,8 +1181,9 @@
 #endif
 }
 
-void fdomain_16x0_intr( int irq, void *dev_id, struct pt_regs * regs )
+void do_fdomain_16x0_intr( int irq, void *dev_id, struct pt_regs * regs )
 {
+   unsigned long flags;
    int      status;
    int      done = 0;
    unsigned data_count;
@@ -1225,7 +1226,9 @@
 #if EVERY_ACCESS
 	 printk( " AFAIL " );
 #endif
+         spin_lock_irqsave(&io_request_lock, flags);
 	 my_done( DID_BUS_BUSY << 16 );
+         spin_unlock_irqrestore(&io_request_lock, flags);
 	 return;
       }
       current_SC->SCp.phase = in_selection;
@@ -1249,7 +1252,9 @@
 #if EVERY_ACCESS
 	    printk( " SFAIL " );
 #endif
+            spin_lock_irqsave(&io_request_lock, flags);
 	    my_done( DID_NO_CONNECT << 16 );
+            spin_unlock_irqrestore(&io_request_lock, flags);
 	    return;
 	 } else {
 #if EVERY_ACCESS
@@ -1593,8 +1598,10 @@
 #if EVERY_ACCESS
       printk( "BEFORE MY_DONE. . ." );
 #endif
+      spin_lock_irqsave(&io_request_lock, flags);
       my_done( (current_SC->SCp.Status & 0xff)
 	       | ((current_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16) );
+      spin_unlock_irqrestore(&io_request_lock, flags);
 #if EVERY_ACCESS
       printk( "RETURNING.\n" );
 #endif
@@ -1611,15 +1618,6 @@
    in_interrupt_flag = 0;
 #endif
    return;
-}
-
-void do_fdomain_16x0_intr( int irq, void *dev_id, struct pt_regs * regs )
-{
-   unsigned long flags;
-
-   spin_lock_irqsave(&io_request_lock, flags);
-   fdomain_16x0_intr(irq, dev_id, regs);
-   spin_unlock_irqrestore(&io_request_lock, flags);
 }
 
 int fdomain_16x0_queue( Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
diff -u --recursive --new-file v2.1.110/linux/drivers/scsi/ibmmca.c linux/drivers/scsi/ibmmca.c
--- v2.1.110/linux/drivers/scsi/ibmmca.c	Sun Jun  7 11:16:34 1998
+++ linux/drivers/scsi/ibmmca.c	Tue Jul 21 14:18:16 1998
@@ -2137,6 +2137,7 @@
 {
    if (IBM_DS.total_accesses == 0) return (0);
    if (IBM_DS.ldn_access[ldn] == 0) return (0);
+#error Floating point in kernel - shoot programmer
    return((int)(((float)IBM_DS.ldn_access[ldn]/(float)IBM_DS.total_accesses)*(float)100.000));
 }
 
diff -u --recursive --new-file v2.1.110/linux/drivers/scsi/scsi.c linux/drivers/scsi/scsi.c
--- v2.1.110/linux/drivers/scsi/scsi.c	Wed Jul  1 19:38:55 1998
+++ linux/drivers/scsi/scsi.c	Tue Jul 21 11:39:16 1998
@@ -397,7 +397,7 @@
 	up(SCpnt->request.sem);
 }
 
-void scsi_logging_setup(char *str, int *ints) 
+__initfunc(void scsi_logging_setup(char *str, int *ints))
 {
     if (ints[0] != 1) {
 	printk("scsi_logging_setup : usage scsi_logging_level=n "
@@ -413,7 +413,7 @@
 static int max_scsi_luns = 1;
 #endif
 
-void scsi_luns_setup(char *str, int *ints) 
+__initfunc(void scsi_luns_setup(char *str, int *ints))
 {
     if (ints[0] != 1)
 	printk("scsi_luns_setup : usage max_scsi_luns=n (n should be between 1 and 8)\n");
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/README.wavefront linux/drivers/sound/README.wavefront
--- v2.1.110/linux/drivers/sound/README.wavefront	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/README.wavefront	Wed Jul 22 13:45:52 1998
@@ -1,4 +1,4 @@
-	     An OSS/Free Driver for WaveFront soundcards
+	     An OSS/Free Driver for WaveFront Sound Cards
 	       (Turtle Beach Maui, Tropez, Tropez Plus)
 
 		     Paul Barton-Davis, July 1998
@@ -129,7 +129,7 @@
 	 - choose MODULE(M) for CS4232 support
 
 	 - choose "N" for everything else (unless you have other
-	      soundcards you want support for)
+	      sound cards you want support for)
 
 
    make dep
@@ -142,7 +142,7 @@
    .
    .
    .
-   make modules_isntall
+   make modules_install
 
 Here's my autoconf.h SOUND section:
 
@@ -203,7 +203,7 @@
        and "synthirq" cs4232 options.
 
        you can do without the adlib_card module if you don't
-       want to use the OPL/[34] synth on the soundcard
+       want to use the OPL/[34] synth on the sound card
 
        the adlib_card io parameter is conventionally not adjustable.
        In theory, any not-in-use IO port address would work, but
@@ -321,7 +321,7 @@
 to play a General MIDI file. Try the "-D 0" to hear the
 difference between sending MIDI to the WaveFront and using the OPL/3,
 which is the default (I think ...). If you have an external synth(s)
-hooked to the soundcard, you can use "-e" to route to the
+hooked to the sound card, you can use "-e" to route to the
 external synth(s) (in theory, -D 1 should work as well, but I think
 there is a bug in playmidi which prevents this from doing what it
 should). 
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/Readme.modules linux/drivers/sound/Readme.modules
--- v2.1.110/linux/drivers/sound/Readme.modules	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/Readme.modules	Wed Jul 22 13:45:52 1998
@@ -31,7 +31,7 @@
 alias char-major-14 sb
 post-install sb /sbin/modprobe "-k" "adlib_card"
 options sb io=0x220 irq=7 dma=1 dma16=5 mpu_io=0x330
-options adlib_card io=0x388     # FM synthetiser
+options adlib_card io=0x388     # FM synthesizer
 
   The effect of this is that the sound driver and all necessary bits and
 pieces autoload on demand, assuming you use kerneld (a sound choice) and
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/ad1848.c linux/drivers/sound/ad1848.c
--- v2.1.110/linux/drivers/sound/ad1848.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/ad1848.c	Wed Jul 22 13:45:52 1998
@@ -1721,7 +1721,7 @@
 	 */
 
 
-	long my_dev;
+	int my_dev;
 	char dev_name[100];
 	int e;
 
@@ -1914,7 +1914,7 @@
 
 void ad1848_unload(int io_base, int irq, int dma_playback, int dma_capture, int share_dma)
 {
-	int i, dev = 0;
+	int i, mixer, dev = 0;
 	ad1848_info *devc = NULL;
 
 	for (i = 0; devc == NULL && i < nr_ad1848_devs; i++)
@@ -1942,6 +1942,9 @@
 			if (audio_devs[dev]->dmap_in->dma != audio_devs[dev]->dmap_out->dma)
 				sound_free_dma(audio_devs[dev]->dmap_in->dma);
 		}
+		mixer = audio_devs[devc->dev_no]->mixer_dev;
+		if(mixer>=0)
+			sound_unload_mixerdev(mixer);
 	}
 	else
 		printk(KERN_ERR "ad1848: Can't find device to be unloaded. Base=%x\n", io_base);
@@ -1951,12 +1954,12 @@
 {
 	unsigned char status;
 	ad1848_info *devc;
-	long dev;
+	int dev;
 	int alt_stat = 0xff;
 	unsigned char c930_stat = 0;
 	int cnt = 0;
 
-	dev = (long)dev_id;
+	dev = (int)dev_id;
 	devc = (ad1848_info *) audio_devs[dev]->devc;
 
 interrupt_again:		/* Jump back here if int status doesn't reset */
@@ -2403,8 +2406,6 @@
 		      hw_config->irq,
 		      hw_config->dma,
 		      hw_config->dma, 0);
-	if(mixer>=0)
-		sound_unload_mixerdev(mixer);
 	sound_unload_audiodev(hw_config->slots[0]);
 	release_region(hw_config->io_base, 4);
 }
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/cs4232.c linux/drivers/sound/cs4232.c
--- v2.1.110/linux/drivers/sound/cs4232.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/cs4232.c	Wed Jul 22 13:45:52 1998
@@ -277,7 +277,6 @@
 {
 	int base = hw_config->io_base, irq = hw_config->irq;
 	int dma1 = hw_config->dma, dma2 = hw_config->dma2;
-	int mixer = audio_devs[hw_config->slots[0]]->mixer_dev;
 
 	if (dma2 == -1)
 		dma2 = dma1;
@@ -288,9 +287,6 @@
 		      dma2,	/* Capture DMA */
 		      0);
 
-	if (mixer >= 0) {
-	    sound_unload_mixerdev (mixer);
-	}
 	sound_unload_audiodev(hw_config->slots[0]);
 #if defined(CONFIG_UART401) && defined(CONFIG_MIDI)
 	if (mpu_base != 0 && mpu_irq != 0 && mpu_detected)
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/es1370.c linux/drivers/sound/es1370.c
--- v2.1.110/linux/drivers/sound/es1370.c	Thu Jul 16 18:09:26 1998
+++ linux/drivers/sound/es1370.c	Wed Jul 22 13:45:53 1998
@@ -2301,6 +2301,7 @@
 		wrcodec(s, 0x16, 3); /* no RST, PD */
 		wrcodec(s, 0x17, 0); /* CODEC ADC and CODEC DAC use {LR,B}CLK2 and run off the LRCLK2 PLL; program DAC_SYNC=0!!  */
 		wrcodec(s, 0x18, 0); /* recording source is mixer */
+		wrcodec(s, 0x19, s->mix.micpreamp = 1); /* turn on MIC preamp */
 		fs = get_fs();
 		set_fs(KERNEL_DS);
 		val = SOUND_MASK_LINE|SOUND_MASK_SYNTH|SOUND_MASK_CD;
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/mad16.c linux/drivers/sound/mad16.c
--- v2.1.110/linux/drivers/sound/mad16.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/mad16.c	Wed Jul 22 13:45:53 1998
@@ -249,7 +249,7 @@
 	}
 
 	tmp = mad_read(MC0_PORT+18);
-	if (tmp == 0xff)
+	if (tmp == 0xff || tmp == 0x00)
 		return 1;
 	/* We probably have a C931 */
 	DDB(printk("Detected C931 config=0x%02x\n", tmp));
@@ -840,10 +840,7 @@
 			hw_config->dma,
 			hw_config->dma2, 0);
 	release_region(hw_config->io_base, 4);
-	if(mixer>=0)
-		sound_unload_mixerdev(mixer);
 	sound_unload_audiodev(hw_config->slots[0]);
-
 }
 
 void
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/msnd.c linux/drivers/sound/msnd.c
--- v2.1.110/linux/drivers/sound/msnd.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/msnd.c	Wed Jul 22 13:45:53 1998
@@ -20,20 +20,33 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: msnd.c,v 1.2 1998/06/09 20:37:39 andrewtv Exp $
+ * $Id: msnd.c,v 1.5 1998/07/18 00:12:15 andrewtv Exp $
  *
  ********************************************************************/
 
+#include <linux/config.h>
+#include <linux/version.h>
+#if LINUX_VERSION_CODE < 0x020101
+#  define LINUX20
+#endif
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/malloc.h>
 #include <linux/types.h>
 #include <linux/delay.h>
-#include <linux/init.h>
 #include <linux/mm.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <asm/spinlock.h>
+#ifdef LINUX20
+#  include <linux/major.h>
+#  include <linux/fs.h>
+#  include <linux/sound.h>
+#  include <asm/segment.h>
+#  include "sound_config.h"
+#else
+#  include <linux/init.h>
+#  include <asm/io.h>
+#  include <asm/uaccess.h>
+#  include <asm/spinlock.h>
+#endif
 #include "msnd.h"
 
 #define LOGNAME			"msnd"
@@ -156,8 +169,16 @@
 		}
 
 		if (user) {
+#ifdef LINUX20
+			if (verify_area(VERIFY_READ, buf , nwritten))
+				return nwritten;
+			
+			memcpy_fromfs(f->data + f->tail, buf, nwritten);
+#else
 			if (copy_from_user(f->data + f->tail, buf, nwritten))
 				return -EFAULT;
+#endif
+
 		} else
 			memcpy(f->data + f->tail, buf, nwritten);
 
@@ -194,8 +215,15 @@
 		}
 		
 		if (user) {
+#ifdef LINUX20
+			if (verify_area(VERIFY_WRITE, buf, nread))
+				return nread;
+			
+			memcpy_tofs(buf, f->data + f->head, nread);
+#else
 			if (copy_to_user(buf, f->data + f->head, nread))
 				return -EFAULT;
+#endif
 		} else
 			memcpy(buf, f->data + f->head, nread);
 		
@@ -347,6 +375,7 @@
 	return 0;
 }
 
+#ifndef LINUX20
 EXPORT_SYMBOL(msnd_register);
 EXPORT_SYMBOL(msnd_unregister);
 EXPORT_SYMBOL(msnd_get_num_devs);
@@ -367,6 +396,7 @@
 
 EXPORT_SYMBOL(msnd_enable_irq);
 EXPORT_SYMBOL(msnd_disable_irq);
+#endif
 
 #ifdef MODULE
 MODULE_AUTHOR				("Andrew Veliath <andrewtv@usa.net>");
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/msnd.h linux/drivers/sound/msnd.h
--- v2.1.110/linux/drivers/sound/msnd.h	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/msnd.h	Wed Jul 22 13:45:53 1998
@@ -24,13 +24,13 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: msnd.h,v 1.4 1998/07/14 22:59:25 andrewtv Exp $
+ * $Id: msnd.h,v 1.6 1998/07/18 00:12:15 andrewtv Exp $
  *
  ********************************************************************/
 #ifndef __MSND_H
 #define __MSND_H
 
-#define VERSION			"0.6.2"
+#define VERSION			"0.7.0"
 
 #define DEFSAMPLERATE		DSP_DEFAULT_SPEED
 #define DEFSAMPLESIZE		8
@@ -159,6 +159,13 @@
 #  define inb			inb_p
 #endif
 
+#ifdef LINUX20
+#  define __initfunc(f)				f
+#  define __initdata				/* nothing */
+#  define spin_lock_irqsave(junk,flags)		do { save_flags(flags); cli(); } while (0)
+#  define spin_unlock_irqrestore(junk,flags)	do { restore_flags(flags); } while (0)
+#endif
+
 typedef unsigned char		BYTE;
 typedef unsigned short		USHORT;
 typedef unsigned short		WORD;
@@ -203,7 +210,9 @@
 	int irq, irq_ref;
 	unsigned char info;
 	char *base;
+#ifndef LINUX20
 	spinlock_t lock;
+#endif
 
 	/* MultiSound DDK variables */
 	enum { msndClassic, msndPinnacle } type;
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/msnd_classic.c linux/drivers/sound/msnd_classic.c
--- v2.1.110/linux/drivers/sound/msnd_classic.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/msnd_classic.c	Wed Jul 22 13:45:53 1998
@@ -1,1331 +1,3 @@
-/*********************************************************************
- *
- * msnd_classic.c - Support for Turtle Beach Classic/Monterey/Tahiti
- *
- * Turtle Beach MultiSound Sound Card Driver for Linux
- *
- * Copyright (C) 1998 Andrew Veliath
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id: msnd_classic.c,v 1.2 1998/06/09 20:37:39 andrewtv Exp $
- *
- ********************************************************************/
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/malloc.h>
-#include <linux/types.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include "sound_config.h"
-#include "sound_firmware.h"
-#define SLOWIO
-#include "msnd.h"
-#include "msnd_classic.h"
-
-#define LOGNAME				"msnd_classic"
-#define DEVNAME				dev.name
-#define MIXERMINOR			dev.mixer_minor
-#define DSPMINOR			dev.dsp_minor
-
-multisound_dev_t			dev;
-
-#ifndef HAVE_DSPCODEH
-static char				*dspini, *permini;
-static int				sizeof_dspini, sizeof_permini;
-#endif
-
-static void reset_play_queue(void)
-{
-	int n;
-	LPDAQD lpDAQ;
-
-	msnd_fifo_make_empty(&dev.DAPF);
-	dev.DAPQ->wHead = 0;
-	dev.DAPQ->wTail = PCTODSP_OFFSET(2 * DAPQ_STRUCT_SIZE);
-	dev.CurDAQD = (LPDAQD)(dev.base + 1 * DAPQ_DATA_BUFF);
-	outb(HPBLKSEL_0, dev.io + HP_BLKS);
-	memset_io(dev.base, 0, DAP_BUFF_SIZE * 3);
-
-	for (n = 0, lpDAQ = dev.CurDAQD; n < 3; ++n, ++lpDAQ) {
-               
-		writew(PCTODSP_BASED((DWORD)(DAP_BUFF_SIZE * n)), &lpDAQ->wStart);
-		writew(DAP_BUFF_SIZE, &lpDAQ->wSize);
-		writew(1, &lpDAQ->wFormat);
-		writew(dev.sample_size, &lpDAQ->wSampleSize);
-		writew(dev.channels, &lpDAQ->wChannels);
-		writew(dev.sample_rate, &lpDAQ->wSampleRate);
-		writew(HIMT_PLAY_DONE * 0x100 + n, &lpDAQ->wIntMsg);
-		writew(n + 1, &lpDAQ->wFlags);
-
-	}
-
-	dev.lastbank = -1;
-}
-
-static void reset_record_queue(void)
-{
-	int n;
-	LPDAQD lpDAQ;
-
-	msnd_fifo_make_empty(&dev.DARF);
-	dev.DARQ->wHead = 0;
-	dev.DARQ->wTail = PCTODSP_OFFSET(2 * DARQ_STRUCT_SIZE);
-	dev.CurDARQD = (LPDAQD)(dev.base + 1 * DARQ_DATA_BUFF);
-	outb(HPBLKSEL_1, dev.io + HP_BLKS);
-	memset_io(dev.base, 0, DAR_BUFF_SIZE * 3);
-	outb(HPBLKSEL_0, dev.io + HP_BLKS);
-
-	for (n = 0, lpDAQ = dev.CurDARQD; n < 3; ++n, ++lpDAQ) {
-
-		writew(PCTODSP_BASED((DWORD)(DAR_BUFF_SIZE * n)) + 0x4000, &lpDAQ->wStart);
-		writew(DAR_BUFF_SIZE, &lpDAQ->wSize);
-		writew(1, &lpDAQ->wFormat);
-		writew(dev.sample_size, &lpDAQ->wSampleSize);
-		writew(dev.channels, &lpDAQ->wChannels);
-		writew(dev.sample_rate, &lpDAQ->wSampleRate);
-		writew(HIMT_RECORD_DONE * 0x100 + n, &lpDAQ->wIntMsg);
-		writew(n + 1, &lpDAQ->wFlags);
-
-	}
-}
-
-static void reset_queues(void)
-{
-	dev.DSPQ->wHead = dev.DSPQ->wTail = 0;
-	reset_play_queue();
-	reset_record_queue();
-}
-
-static int dsp_ioctl(unsigned int cmd, unsigned long arg)
-{
-	int val, i, data;
-	LPDAQD lpDAQ, lpDARQ;
-
-	lpDAQ = (LPDAQD)(dev.base + DAPQ_DATA_BUFF);
-	lpDARQ = (LPDAQD)(dev.base + DARQ_DATA_BUFF);
-
-	switch (cmd) {
-	case SNDCTL_DSP_SUBDIVIDE:
-	case SNDCTL_DSP_SETFRAGMENT:
-	case SNDCTL_DSP_SETDUPLEX:
-		return 0;
-
-	case SNDCTL_DSP_GETIPTR:
-	case SNDCTL_DSP_GETOPTR:
-	case SNDCTL_DSP_MAPINBUF:
-	case SNDCTL_DSP_MAPOUTBUF:
-		return -EINVAL;
-
-	case SNDCTL_DSP_SYNC:
-	case SNDCTL_DSP_RESET:
-
-		reset_play_queue();
-		reset_record_queue();
-
-		return 0;
-		
-	case SNDCTL_DSP_GETBLKSIZE:
-
-		if (put_user(dev.fifosize / 4, (int *)arg))
-			return -EFAULT;
-
-		return 0;
-
-	case SNDCTL_DSP_NONBLOCK:
-
-		dev.mode |= O_NONBLOCK;
-
-		return 0;
-
-	case SNDCTL_DSP_GETCAPS:
-
-		val = DSP_CAP_DUPLEX | DSP_CAP_BATCH;
-		if (put_user(val, (int *)arg))
-			return -EFAULT;
-
-		return 0;
-
-	case SNDCTL_DSP_SAMPLESIZE:
-			
-		if (get_user(val, (int *)arg))
-			return -EFAULT;
-
-		switch (val) {
-		case 16:
-		case 8:
-			data = val;
-			break;
-		default:
-			data = DEFSAMPLESIZE;
-			break;
-		}
-
-		for (i = 0; i < 3; ++i, ++lpDAQ, ++lpDARQ) {
-
-			lpDAQ->wSampleSize = data;
-			lpDARQ->wSampleSize = data;
-		}
-		
-		dev.sample_size = data;
-		
-		if (put_user(data, (int *)arg))
-			return -EFAULT;
-
-		return 0;
-
-	case SNDCTL_DSP_SPEED:
-			
-		if (get_user(val, (int *)arg))
-			return -EFAULT;
-
-		if (val < 8000)
-			val = 8000;
-
-		if (val > 48000)
-			val = 48000;
-
-		data = val;
-
-		for (i = 0; i < 3; ++i, ++lpDAQ, ++lpDARQ) {
-
-			lpDAQ->wSampleRate = data;
-			lpDARQ->wSampleRate = data;
-		}
-		
-		dev.sample_rate = data;
-
-		if (put_user(data, (int *)arg))
-			return -EFAULT;
-
-		return 0;
-
-	case SNDCTL_DSP_CHANNELS:
-			
-		if (get_user(val, (int *)arg))
-			return -EFAULT;
-			
-		switch (val) {
-		case 1:
-		case 2:
-			data = val;
-			break;
-		default:
-			val = data = 2;
-			break;
-		}
-									
-		for (i = 0; i < 3; ++i, ++lpDAQ, ++lpDARQ) {
-
-			lpDAQ->wChannels = data;
-			lpDARQ->wChannels = data;
-		}
-
-		dev.channels = data;
-
-		if (put_user(val, (int *)arg))
-			return -EFAULT;
-
-		return 0;
-
-	case SNDCTL_DSP_STEREO:
-			
-		if (get_user(val, (int *)arg))
-			return -EFAULT;
-			
-		switch (val) {
-		case 0:
-			data = 1;
-			break;
-		default:
-			val = 1;
-		case 1:
-			data = 2;
-			break;
-		}
-									
-		for (i = 0; i < 3; ++i, ++lpDAQ, ++lpDARQ) {
-
-			lpDAQ->wChannels = data;
-			lpDARQ->wChannels = data;
-		}
-
-		dev.channels = data;
-
-		if (put_user(val, (int *)arg))
-			return -EFAULT;
-
-		return 0;
-	}
-
-	return -EINVAL;
-}
-
-static int mixer_get(int d)
-{
-	if (d > 31)
-		return -EINVAL;
-
-	switch (d) {
-	case SOUND_MIXER_VOLUME:
-	case SOUND_MIXER_SYNTH:
-	case SOUND_MIXER_PCM:
-	case SOUND_MIXER_LINE:
-	case SOUND_MIXER_MIC:
-	case SOUND_MIXER_IMIX:
-	case SOUND_MIXER_LINE1:
-		return (dev.left_levels[d] >> 8) * 100 / 0xff | 
-			(((dev.right_levels[d] >> 8) * 100 / 0xff) << 8);
-	default:
-		return 0;
-	}
-}
-
-#define update_vol(a,b,s)								\
-	writew(dev.left_levels[a] * readw(&dev.SMA->wCurrMastVolLeft) / 0xffff / s,	\
-	       &dev.SMA->b##Left);							\
-	writew(dev.right_levels[a] * readw(&dev.SMA->wCurrMastVolRight) / 0xffff / s,	\
-	       &dev.SMA->b##Right);
-
-static int mixer_set(int d, int value)
-{
-	int left = value & 0x000000ff;
-	int right = (value & 0x0000ff00) >> 8;
-	int bLeft, bRight;
-	int wLeft, wRight;
-
-	if (d > 31)
-		return -EINVAL;
-
-	bLeft = left * 0xff / 100;
-	wLeft = left * 0xffff / 100;
-
-	bRight = right * 0xff / 100;
-	wRight = right * 0xffff / 100;
-
-	dev.left_levels[d] = wLeft;
-	dev.right_levels[d] = wRight;
-
-	switch (d) {
-	case SOUND_MIXER_VOLUME:		/* master volume */
-		writew(wLeft / 2, &dev.SMA->wCurrMastVolLeft);
-		writew(wRight / 2, &dev.SMA->wCurrMastVolRight);
-		break;
-
-		/* pot controls */
-	case SOUND_MIXER_LINE:			/* aux pot control */
-		writeb(bLeft, &dev.SMA->bInPotPosLeft);
-		writeb(bRight, &dev.SMA->bInPotPosRight);
-		if (msnd_send_word(&dev, 0, 0, HDEXAR_IN_SET_POTS) == 0)
-			msnd_send_dsp_cmd(&dev, HDEX_AUX_REQ);
-		break;
-
-	case SOUND_MIXER_LINE1:			/* line pot control */
-		writeb(bLeft, &dev.SMA->bAuxPotPosLeft);
-		writeb(bRight, &dev.SMA->bAuxPotPosRight);
-		if (msnd_send_word(&dev, 0, 0, HDEXAR_AUX_SET_POTS) == 0)
-			msnd_send_dsp_cmd(&dev, HDEX_AUX_REQ);
-		break;
-
-		/* digital controls */
-	case SOUND_MIXER_SYNTH:			/* synth vol (dsp mix) */
-	case SOUND_MIXER_PCM:			/* pcm vol (dsp mix) */
-	case SOUND_MIXER_IMIX:			/* input monitor (dsp mix) */
-		break;
-
-	default:
-		return 0;
-	}
-
-	/* update digital controls for master volume */
-	update_vol(SOUND_MIXER_PCM, wCurrPlayVol, 1);
-	update_vol(SOUND_MIXER_IMIX, wCurrInVol, 1);
-	
-	return mixer_get(d);
-}
-
-static unsigned long set_recsrc(unsigned long recsrc)
-{
-#ifdef HAVE_NORECSRC
-	if (recsrc == 0)
-		dev.recsrc = 0;
-	else
-#endif
-		dev.recsrc ^= recsrc;
-
-	return dev.recsrc;
-}
-
-static int mixer_ioctl(unsigned int cmd, unsigned long arg)
-{
-	int val = 0;
-
-	if (((cmd >> 8) & 0xff) == 'M') {
-		
-		if (_SIOC_DIR(cmd) & _SIOC_WRITE) {
-
-			switch (cmd & 0xff) {
-			case SOUND_MIXER_RECSRC:
-				if (get_user(val, (int *)arg))
-					return -EFAULT;
-				val = set_recsrc(val);
-				break;
-				
-			default:
-				if (get_user(val, (int *)arg))
-					return -EFAULT;
-				val = mixer_set(cmd & 0xff, val);
-				break;
-			}
-
-			return put_user(val, (int *)arg);
-		}
-		else {
-			switch (cmd & 0xff) {
-			case SOUND_MIXER_RECSRC:
-				val = dev.recsrc;
-				break;
-				
-			case SOUND_MIXER_DEVMASK:
-			case SOUND_MIXER_STEREODEVS:
-				val =   SOUND_MASK_VOLUME |
-					SOUND_MASK_PCM |
-					SOUND_MASK_LINE |
-					SOUND_MASK_IMIX |
-					SOUND_MASK_LINE1;
-				break;
-				  
-			case SOUND_MIXER_RECMASK:
-				val = 0;
-				break;
-				  
-			case SOUND_MIXER_CAPS:
-				val =   SOUND_CAP_EXCL_INPUT;
-				break;
-				
-			default:
-				if ((val = mixer_get(cmd & 0xff)) < 0)
-					return -EINVAL;
-				break;
-			}
-		}
-
-		return put_user(val, (int *)arg); 
-	}
-
-	return -EINVAL;
-}
-
-static int dev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-{
-	int minor = MINOR(inode->i_rdev);
-
-	if (minor == DSPMINOR)
-		return dsp_ioctl(cmd, arg);
-	else if (minor == MIXERMINOR)
-		return mixer_ioctl(cmd, arg);
-
-	return -EINVAL;
-}
-
-static void dsp_halt(void)
-{
-	mdelay(1);
-	if (test_and_clear_bit(F_READING, &dev.flags)) {
-
-		msnd_send_dsp_cmd(&dev, HDEX_RECORD_STOP);
-		msnd_disable_irq(&dev);
-
-	}
-	mdelay(1);
-	if (test_and_clear_bit(F_WRITING, &dev.flags)) {
-
-		set_bit(F_WRITEFLUSH, &dev.flags);
-		interruptible_sleep_on(&dev.writeflush);
-		current->state = TASK_INTERRUPTIBLE;
-		current->timeout = 
-			jiffies + DAP_BUFF_SIZE / 2 * HZ /
-			dev.sample_rate / dev.channels;
-		schedule();
-		current->timeout = 0;
-		msnd_send_dsp_cmd(&dev, HDEX_PLAY_STOP);
-		msnd_disable_irq(&dev);
-		memset_io(dev.base, 0, DAP_BUFF_SIZE * 3);
-
-	}
-	mdelay(1);
-	reset_queues();
-}
-
-static int dsp_open(struct file *file)
-{
-	dev.mode = file->f_mode;
-	set_bit(F_AUDIO_INUSE, &dev.flags);
-	reset_queues();
-	return 0;
-}
-
-static int dsp_close(void)
-{
-	dsp_halt();
-	clear_bit(F_AUDIO_INUSE, &dev.flags);
-	return 0;
-}
-
-static int dev_open(struct inode *inode, struct file *file)
-{
-	int minor = MINOR(inode->i_rdev);
-	int err = 0;
-
-	if (minor == DSPMINOR) {
-
-		if (test_bit(F_AUDIO_INUSE, &dev.flags))
-			return -EBUSY;
-
-		err = dsp_open(file);
-	}
-	else if (minor == MIXERMINOR) {
-		/* nothing */
-	} else
-		err = -EINVAL;
-	
-	if (err >= 0)
-		MOD_INC_USE_COUNT;
-
-	return err;
-}
-
-static int dev_close(struct inode *inode, struct file *file)
-{
-	int minor = MINOR(inode->i_rdev);
-	int err = 0;
-
-	if (minor == DSPMINOR) {
-		err = dsp_close();
-	}
-	else if (minor == MIXERMINOR) {
-		/* nothing */
-	} else
-		err = -EINVAL;
-
-	if (err >= 0)
-		MOD_DEC_USE_COUNT;
-	
-	return err;
-}
-
-static int DAPF_to_bank(int bank)
-{
-	return msnd_fifo_read(&dev.DAPF, dev.base + bank * DAP_BUFF_SIZE, DAP_BUFF_SIZE, 0);
-}
-
-static int bank_to_DARF(int bank)
-{
-	return msnd_fifo_write(&dev.DARF, dev.base + bank * DAR_BUFF_SIZE, DAR_BUFF_SIZE, 0);
-}
-
-static int dsp_read(char *buf, size_t len)
-{
-	int err = 0;
-	int count = len;
-
-	while (count > 0) {
-		
-		int n;
-
-		if ((n = msnd_fifo_read(&dev.DARF, buf, count, 1)) < 0) {
-
-			printk(KERN_WARNING LOGNAME ": FIFO read error\n");
-			return n;
-		}
-
-		buf += n;
-		count -= n;
-		
-		if (!test_and_set_bit(F_READING, &dev.flags) && (dev.mode & FMODE_READ)) {
-
-			reset_record_queue();
-			msnd_enable_irq(&dev);
-			msnd_send_dsp_cmd(&dev, HDEX_RECORD_START);
-
-		}
-
-		if (dev.mode & O_NONBLOCK)
-			return count == len ? -EAGAIN : len - count;
-
-		if (count > 0) {
-
-			set_bit(F_READBLOCK, &dev.flags);
-			interruptible_sleep_on(&dev.readblock);
-			clear_bit(F_READBLOCK, &dev.flags);
-
-			if (signal_pending(current))
-				err = -EINTR;
-
-		}
-
-		if (err != 0)
-			return err;
-	}
-
-	return len - count;
-}
-
-static int dsp_write(const char *buf, size_t len)
-{
-	int err = 0;
-	int count = len;
-
-	while (count > 0) {
-
-		int n;
-
-		if ((n = msnd_fifo_write(&dev.DAPF, buf, count, 1)) < 0) {
-
-			printk(KERN_WARNING LOGNAME ": FIFO write error\n");
-			return n;
-		}
-
-		buf += n;
-		count -= n;
-
-		if (!test_and_set_bit(F_WRITING, &dev.flags) && (dev.mode & FMODE_WRITE)) {
-			
-			reset_play_queue();
-			msnd_enable_irq(&dev);
-			msnd_send_dsp_cmd(&dev, HDEX_PLAY_START);
-
-		}
-
-		if (dev.mode & O_NONBLOCK)
-			return count == len ? -EAGAIN : len - count;
-
-		if (count > 0) {
-			
-			set_bit(F_WRITEBLOCK, &dev.flags);
-			interruptible_sleep_on(&dev.writeblock);
-			clear_bit(F_WRITEBLOCK, &dev.flags);
-
-			if (signal_pending(current))
-				err = -EINTR;
-
-		}
-
-		if (err != 0)
-			return err;
-	}
-	
-	return len - count;
-}
-
-static ssize_t dev_read(struct file *file, char *buf, size_t count, loff_t *off)
-{
-	int minor = MINOR(file->f_dentry->d_inode->i_rdev);
-
-	if (minor == DSPMINOR) {
-
-		return dsp_read(buf, count);
-
-	} else
-		return -EINVAL;
-}
-
-static ssize_t dev_write(struct file *file, const char *buf, size_t count, loff_t *off)
-{
-	int minor = MINOR(file->f_dentry->d_inode->i_rdev);
-
-	if (minor == DSPMINOR) {
-
-		return dsp_write(buf, count);
-
-	} else
-		return -EINVAL;
-}
-
-static void eval_dsp_msg(WORD wMessage)
-{
-	switch (HIBYTE(wMessage)) {
-	case HIMT_PLAY_DONE:
-		
-		if (dev.lastbank == LOBYTE(wMessage))
-			break;
-		
-		dev.lastbank = LOBYTE(wMessage);
-
-		dev.CurDAQD->wSize = DAP_BUFF_SIZE;
-
-		if ((dev.DAPQ->wTail += PCTODSP_OFFSET(DAPQ_STRUCT_SIZE)) > dev.DAPQ->wSize)
-			dev.DAPQ->wTail = 0;
-
-		if (++dev.CurDAQD > (LPDAQD)(dev.base + DAPQ_DATA_BUFF + 2 * DAPQ_STRUCT_SIZE))
-			dev.CurDAQD = (LPDAQD)(dev.base + DAPQ_DATA_BUFF);
-
-		if (dev.lastbank < 3) {
-
-			if (DAPF_to_bank(dev.lastbank) > 0) {
-
-				mdelay(1);
-				msnd_send_dsp_cmd(&dev, HDEX_PLAY_START);
-
-			} 
-			else if (!test_bit(F_WRITEBLOCK, &dev.flags)) {
-
-				clear_bit(F_WRITING, &dev.flags);
-				if (test_and_clear_bit(F_WRITEFLUSH, &dev.flags))
-					wake_up_interruptible(&dev.writeflush);
-				msnd_disable_irq(&dev);
-
-			}
-		}
-
-		if (test_bit(F_WRITEBLOCK, &dev.flags))
-			wake_up_interruptible(&dev.writeblock);
-		
-		break;
-
-	case HIMT_RECORD_DONE: {
-
-		WORD wTemp;
-		
-		wTemp = dev.DARQ->wTail + (DARQ_STRUCT_SIZE / 2);
-
-		if (wTemp > dev.DARQ->wSize)
-			wTemp = 0;
-
-		while (wTemp == dev.DARQ->wHead);
-
-		dev.DARQ->wTail = wTemp;
-
-		outb(HPBLKSEL_1, dev.io + HP_BLKS);
-		if (bank_to_DARF(LOBYTE(wMessage)) == 0 &&
-		    !test_bit(F_READBLOCK, &dev.flags)) {
-
-			memset_io(dev.base, 0, DAR_BUFF_SIZE * 3);
-			clear_bit(F_READING, &dev.flags);
-			msnd_disable_irq(&dev);
-
-		}
-		outb(HPBLKSEL_0, dev.io + HP_BLKS);
-
-		if (test_bit(F_READBLOCK, &dev.flags))
-			wake_up_interruptible(&dev.readblock);
-
-		} break;
-
-	case HIMT_DSP:
-		switch (LOBYTE(wMessage)) {
-		case HIDSP_INT_PLAY_UNDER:
-			printk(KERN_INFO LOGNAME ": Write underflow\n");
-			reset_play_queue();
-			break;
-
-		case HIDSP_INT_RECORD_OVER:
-			printk(KERN_INFO LOGNAME ": Read overflow\n");
-			reset_record_queue();
-			break;
-
-		default:
-			printk(KERN_DEBUG LOGNAME ": DSP message %u\n", LOBYTE(wMessage));
-			break;
-		}
-		break;
-
-        case HIMT_MIDI_IN_UCHAR:
-		if (dev.midi_in_interrupt)
-			(*dev.midi_in_interrupt)(&dev);
-		break;
-
-	case HIMT_MIDI_OUT:
-		printk(KERN_DEBUG LOGNAME ": MIDI out event\n");
-		break;
-
-	default:
-		printk(KERN_DEBUG LOGNAME ": HIMT message %u\n", HIBYTE(wMessage));
-		break;
-	}
-}
-
-static void intr(int irq, void *dev_id, struct pt_regs *regs)
-{
-	if (test_bit(F_INTERRUPT, &dev.flags))
-		return;
-
-	set_bit(F_INTERRUPT, &dev.flags);
-	
-	if (test_bit(F_BANKONE, &dev.flags))
-		outb(HPBLKSEL_0, dev.io + HP_BLKS);
-
-	inb(dev.io + HP_RXL);
- 
-	while (dev.DSPQ->wTail != dev.DSPQ->wHead) {
-
-		eval_dsp_msg(*(dev.pwDSPQData + dev.DSPQ->wHead));
-
-		if (++dev.DSPQ->wHead > dev.DSPQ->wSize)
-			dev.DSPQ->wHead = 0;
-	}
-
-	if (test_bit(F_BANKONE, &dev.flags))
-		outb(HPBLKSEL_1, dev.io + HP_BLKS);
-
-	clear_bit(F_INTERRUPT, &dev.flags);
-}
-
-static struct file_operations dev_fileops = {
-	NULL,
-	dev_read,
-	dev_write,
-	NULL,
-	NULL,
-	dev_ioctl,
-	NULL,
-	dev_open,
-	dev_close,
-};
-
-__initfunc(static int reset_dsp(void))
-{
-	int timeout = 20000;
-		
-	outb(HPDSPRESET_ON, dev.io + HP_DSPR);
-	
-	mdelay(1);
-
-	dev.info = inb(dev.io + HP_INFO);
-
-	outb(HPDSPRESET_OFF, dev.io + HP_DSPR);
-
-	mdelay(1);
-
-	while (timeout-- > 0) {
-
-		if (inb(dev.io + HP_CVR) == HP_CVR_DEF)
-			return 0;
-		
-		mdelay(1);
-	}
-
-	printk(KERN_ERR LOGNAME ": Cannot reset DSP\n");
-
-	return -EIO;
-}
-
-__initfunc(static int probe_multisound(void))
-{
-	if (check_region(dev.io, dev.numio)) {
-		
-		printk(KERN_ERR LOGNAME ": I/O port conflict\n");
-		return -ENODEV;
-	}
-
-	request_region(dev.io, dev.numio, "probing");
-
-	if (reset_dsp() < 0) {
-		
-		release_region(dev.io, dev.numio);
-		return -ENODEV;
-	}
-
-	printk(KERN_INFO LOGNAME ": DSP reset successful\n");
-
-	dev.name = "Classic/Tahiti/Monterey";
-
-	printk(KERN_INFO LOGNAME ": Turtle Beach %s, "
-	       "I/O 0x%x-0x%x, IRQ %d, memory mapped to 0x%p-0x%p\n",
-	       dev.name,
-	       dev.io, dev.io + dev.numio - 1,
-	       dev.irq,
-	       dev.base, dev.base + 0x7fff);
-
-	release_region(dev.io, dev.numio);
-	
-	return 0;
-}
-
-__initfunc(static int init_sma(void))
-{
-	int n;
-	LPDAQD lpDAQ;
-
-	outb(dev.memid, dev.io + HP_MEMM);
-
-	outb(HPBLKSEL_0, dev.io + HP_BLKS);
-	memset_io(dev.base, 0, 0x8000);
-	
-	outb(HPBLKSEL_1, dev.io + HP_BLKS);
-	memset_io(dev.base, 0, 0x8000);
-	
-	outb(HPBLKSEL_0, dev.io + HP_BLKS);
-
-	dev.DAPQ = (struct JobQueueStruct *)(dev.base + DAPQ_OFFSET);
-	dev.DARQ = (struct JobQueueStruct *)(dev.base + DARQ_OFFSET);
-	dev.MODQ = (struct JobQueueStruct *)(dev.base + MODQ_OFFSET);
-	dev.MIDQ = (struct JobQueueStruct *)(dev.base + MIDQ_OFFSET);
-	dev.DSPQ = (struct JobQueueStruct *)(dev.base + DSPQ_OFFSET);
-
-	dev.SMA = (struct SMA0_CommonData *)(dev.base + SMA_STRUCT_START);
-
-	dev.CurDAQD = (LPDAQD)(dev.base + DAPQ_DATA_BUFF);
-	dev.CurDARQD = (LPDAQD)(dev.base + DARQ_DATA_BUFF);
-
-	dev.sample_size = DEFSAMPLESIZE;
-	dev.sample_rate = DEFSAMPLERATE;
-	dev.channels = DEFCHANNELS;
-
-	for (n = 0, lpDAQ = dev.CurDAQD; n < 3; ++n, ++lpDAQ) {
-		
-		writew(PCTODSP_BASED((DWORD)(DAP_BUFF_SIZE * n)), &lpDAQ->wStart);
-		writew(DAP_BUFF_SIZE, &lpDAQ->wSize);
-		writew(1, &lpDAQ->wFormat);
-		writew(dev.sample_size, &lpDAQ->wSampleSize);
-		writew(dev.channels, &lpDAQ->wChannels);
-		writew(dev.sample_rate, &lpDAQ->wSampleRate);
-		writew(HIMT_PLAY_DONE * 0x100 + n, &lpDAQ->wIntMsg);
-		writew(n + 1, &lpDAQ->wFlags);
-	}
-
-	for (n = 0, lpDAQ = dev.CurDARQD; n < 3; ++n, ++lpDAQ) {
-
-		writew(PCTODSP_BASED((DWORD)(DAR_BUFF_SIZE * n)) + 0x4000, &lpDAQ->wStart);
-		writew(DAR_BUFF_SIZE, &lpDAQ->wSize);
-		writew(1, &lpDAQ->wFormat);
-		writew(dev.sample_size, &lpDAQ->wSampleSize);
-		writew(dev.channels, &lpDAQ->wChannels);
-		writew(dev.sample_rate, &lpDAQ->wSampleRate);
-		writew(HIMT_RECORD_DONE * 0x100 + n, &lpDAQ->wIntMsg);
-		writew(n + 1, &lpDAQ->wFlags);
-
-	}	
-
-	dev.pwDSPQData = (WORD *)(dev.base + DSPQ_DATA_BUFF);
-	dev.pwMODQData = (WORD *)(dev.base + MODQ_DATA_BUFF);
-	dev.pwMIDQData = (WORD *)(dev.base + MIDQ_DATA_BUFF);
-
-	writew(PCTODSP_BASED(MIDQ_DATA_BUFF), &dev.MIDQ->wStart);
-	writew(PCTODSP_OFFSET(MIDQ_BUFF_SIZE) - 1, &dev.MIDQ->wSize);
-	writew(0, &dev.MIDQ->wHead);
-	writew(0, &dev.MIDQ->wTail);
-
-	writew(PCTODSP_BASED(MODQ_DATA_BUFF), &dev.MODQ->wStart);
-	writew(PCTODSP_OFFSET(MODQ_BUFF_SIZE) - 1, &dev.MODQ->wSize);
-	writew(0, &dev.MODQ->wHead);
-	writew(0, &dev.MODQ->wTail);
-
-	writew(PCTODSP_BASED(DAPQ_DATA_BUFF), &dev.DAPQ->wStart);
-	writew(PCTODSP_OFFSET(DAPQ_BUFF_SIZE) - 1, &dev.DAPQ->wSize);
-	writew(0, &dev.DAPQ->wHead);
-	writew(0, &dev.DAPQ->wTail);
-
-	writew(PCTODSP_BASED(DARQ_DATA_BUFF), &dev.DARQ->wStart);
-	writew(PCTODSP_OFFSET(DARQ_BUFF_SIZE) - 1, &dev.DARQ->wSize);
-	writew(0, &dev.DARQ->wHead);
-	writew(0, &dev.DARQ->wTail);
-
-	writew(PCTODSP_BASED(DSPQ_DATA_BUFF), &dev.DSPQ->wStart);
-	writew(PCTODSP_OFFSET(DSPQ_BUFF_SIZE) - 1, &dev.DSPQ->wSize);
-	writew(0, &dev.DSPQ->wHead);
-	writew(0, &dev.DSPQ->wTail);
-
-	writew(0, &dev.SMA->wCurrPlayBytes);
-	writew(0, &dev.SMA->wCurrRecordBytes);
-
-	writew(0, &dev.SMA->wCurrPlayVolLeft);
-	writew(0, &dev.SMA->wCurrPlayVolRight);
-
-	writew(0, &dev.SMA->wCurrInVolLeft);
-	writew(0, &dev.SMA->wCurrInVolRight);
-
-	writew(0, &dev.SMA->wCurrMastVolLeft);
-	writew(0, &dev.SMA->wCurrMastVolRight);
-
-	writew(0x0000, &dev.SMA->wCurrDSPStatusFlags);
-	writew(0x0000, &dev.SMA->wCurrHostStatusFlags);
-
-	writew(0x303, &dev.SMA->wCurrInputTagBits);
-	writew(0, &dev.SMA->wCurrLeftPeak);
-	writew(0, &dev.SMA->wCurrRightPeak);
-
-	writeb(0, &dev.SMA->bInPotPosRight);
-	writeb(0, &dev.SMA->bInPotPosLeft);
-
-	writeb(0, &dev.SMA->bAuxPotPosRight);
-	writeb(0, &dev.SMA->bAuxPotPosLeft);
-
-	writew(dev.sample_rate, &dev.SMA->wCalFreqAtoD);
-
-	return 0;
-}
-
-__initfunc(static int calibrate_adc(WORD srate))
-{
-	if (!dev.calibrate_signal) {
-
-		printk(KERN_INFO LOGNAME ": ADC calibration to board ground ");
-		writew(readw(&dev.SMA->wCurrHostStatusFlags)
-		       | 0x0001, &dev.SMA->wCurrHostStatusFlags);
-	}
-	else {
-
-		printk(KERN_INFO LOGNAME ": ADC calibration to signal ground ");
-		writew(readw(&dev.SMA->wCurrHostStatusFlags)
-		       & ~0x0001, &dev.SMA->wCurrHostStatusFlags);
-	}
-	
-	writew(srate, &dev.SMA->wCalFreqAtoD);
-
-	if (msnd_send_word(&dev, 0, 0, HDEXAR_CAL_A_TO_D) == 0 &&
-	    msnd_send_dsp_cmd(&dev, HDEX_AUX_REQ) == 0) {
-
-		current->state = TASK_INTERRUPTIBLE;
-		current->timeout = jiffies + HZ;
-		schedule();
-		current->timeout = 0;
-		printk("successful\n");
-		return 0;
-	}
-
-	printk("failed\n");
-
-	return -EIO;
-}
-
-__initfunc(static int upload_dsp_code(void))
-{
-	outb(HPBLKSEL_0, dev.io + HP_BLKS);
-
-#ifdef HAVE_DSPCODEH
-	printk(KERN_INFO LOGNAME ": Using resident Turtle Beach DSP code\n");
-#else	
-	printk(KERN_INFO LOGNAME ": Loading Turtle Beach DSP code\n");
-	INITCODESIZE = mod_firmware_load(INITCODEFILE, &INITCODE);
-	if (!INITCODE) {
-		printk(KERN_ERR LOGNAME ": Error loading " INITCODEFILE);
-		return -EBUSY;
-	}
-
-	PERMCODESIZE = mod_firmware_load(PERMCODEFILE, &PERMCODE);
-	if (!PERMCODE) {
-		printk(KERN_ERR LOGNAME ": Error loading " PERMCODEFILE);
-		vfree(INITCODE);
-		return -EBUSY;
-	}
-#endif
-	memcpy_toio(dev.base, PERMCODE, PERMCODESIZE);
-
-	if (msnd_upload_host(&dev, INITCODE, INITCODESIZE) < 0) {
-
-		printk(KERN_WARNING LOGNAME ": Error uploading to DSP\n");
-		return -ENODEV;
-	}
-
-#ifndef HAVE_DSPCODEH
-	vfree(INITCODE);
-	vfree(PERMCODE);
-#endif
-
-	return 0;
-}
-
-__initfunc(static void reset_proteus(void))
-{
-	outb(HPPRORESET_ON, dev.io + HP_PROR);
-	mdelay(TIME_PRO_RESET);
-	outb(HPPRORESET_OFF, dev.io + HP_PROR);
-	mdelay(TIME_PRO_RESET_DONE);
-}
-
-__initfunc(static int initialize(void))
-{
-	int err, timeout;
-
-	outb(HPWAITSTATE_0, dev.io + HP_WAIT);
-	outb(HPBITMODE_16, dev.io + HP_BITM);
-
-	reset_proteus();
-
-	if ((err = init_sma()) < 0) {
-
-		printk(KERN_WARNING LOGNAME ": Cannot initialize SMA\n");
-		return err;
-	}
-
-	if ((err = reset_dsp()) < 0)
-		return err;
-	
-	if ((err = upload_dsp_code()) < 0) {
-
-		printk(KERN_WARNING LOGNAME ": Cannot upload DSP code\n");
-		return err;
-
-	} else
-		printk(KERN_INFO LOGNAME ": DSP upload successful\n");
-
-	timeout = 2000;
-
-	while (readw(dev.base)) {
-		
-		mdelay(1);
-		if (--timeout < 0)
-			return -EIO;
-	}
-
-	return 0;
-}
-
-__initfunc(static int attach_multisound(void))
-{
-	int err;
-
-	printk(KERN_DEBUG LOGNAME ": Intializing DSP\n");
-
-	if ((err = request_irq(dev.irq, intr, SA_SHIRQ, DEVNAME, &dev)) < 0) {
-		
-		printk(KERN_ERR LOGNAME ": Couldn't grab IRQ %d\n", dev.irq);
-		return err;
-	
-	}
-
-	request_region(dev.io, dev.numio, DEVNAME);
-
-        if ((err = initialize()) < 0) {
-
-		printk(KERN_WARNING LOGNAME ": Initialization failure\n");
-		release_region(dev.io, dev.numio);
-		free_irq(dev.irq, &dev);
-		return err;
-
-	}
-
-	if ((err = msnd_register(&dev)) < 0) {
-
-		printk(KERN_ERR LOGNAME ": Unable to register MultiSound\n");
-		release_region(dev.io, dev.numio);
-		free_irq(dev.irq, &dev);
-		return err;
-	}
-
-	if ((DSPMINOR = register_sound_dsp(&dev_fileops)) < 0) {
-
-		printk(KERN_ERR LOGNAME ": Unable to register DSP operations\n");
-		msnd_unregister(&dev);
-		release_region(dev.io, dev.numio);
-		free_irq(dev.irq, &dev);
-		return DSPMINOR;
-	}
-
-	if ((MIXERMINOR = register_sound_mixer(&dev_fileops)) < 0) {
-
-		printk(KERN_ERR LOGNAME ": Unable to register mixer operations\n");
-		unregister_sound_mixer(MIXERMINOR);
-		msnd_unregister(&dev);
-		release_region(dev.io, dev.numio);
-		free_irq(dev.irq, &dev);
-		return MIXERMINOR;
-	}
-	printk(KERN_INFO LOGNAME ": Using DSP minor %d, mixer minor %d\n", MIXERMINOR, DSPMINOR);
-
-	calibrate_adc(dev.sample_rate);
-	set_recsrc(0);
-	
-	return 0;
-}
-
-static void unload_multisound(void)
-{
-	release_region(dev.io, dev.numio);
-	free_irq(dev.irq, &dev);
-	unregister_sound_mixer(MIXERMINOR);
-	unregister_sound_dsp(DSPMINOR);
-	msnd_unregister(&dev);
-}
-
-static void mod_inc_ref(void)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void mod_dec_ref(void)
-{
-	MOD_DEC_USE_COUNT;
-}
-
-#ifdef MODULE
-MODULE_AUTHOR				("Andrew Veliath <andrewtv@usa.net>");
-MODULE_DESCRIPTION			("Turtle Beach " LONGNAME " Linux Driver");
-MODULE_PARM				(io, "i");
-MODULE_PARM				(irq, "i");
-MODULE_PARM				(mem, "i");
-MODULE_PARM				(major, "i");
-MODULE_PARM				(fifosize, "i");
-MODULE_PARM				(calibrate_signal, "i");
-
-static int io __initdata =		-1;
-static int irq __initdata =		-1;
-static int mem __initdata =		-1;
-static int fifosize __initdata =	DEFFIFOSIZE;
-static int calibrate_signal __initdata;
-
-int init_module(void)
-#else
-static int io __initdata =		CONFIG_MSNDCLAS_IO;
-static int irq __initdata =		CONFIG_MSNDCLAS_IRQ;
-static int mem __initdata =		CONFIG_MSNDCLAS_MEM;
-static int fifosize __initdata =	DEFFIFOSIZE;
-static int calibrate_signal __initdata;
-
-__initfunc(msnd_classic_init(void))
-#endif
-{
-	int err;
-
-	printk(KERN_INFO LOGNAME ": Turtle Beach " LONGNAME " Linux Driver Version "
-	       VERSION ", Copyright (C) 1998 Andrew Veliath\n");
-	
-	if (io == -1 || irq == -1 || mem == -1) {
-
-		printk(KERN_WARNING LOGNAME ": io, irq and mem must be set\n");
-	}
-		
-	if (io == -1 ||
-	    !(io == 0x290 ||
-	      io == 0x260 ||
-	      io == 0x250 ||
-	      io == 0x240 ||
-	      io == 0x230 ||
-	      io == 0x220 ||
-	      io == 0x210 ||
-	      io == 0x3e0)) {
-
-		printk(KERN_ERR LOGNAME ": \"io\" - DSP I/O base must be set\n");
-		return -EINVAL;
-	}
-	
-	if (irq == -1 ||
-	    !(irq == 5 ||
-	      irq == 7 ||
-	      irq == 9 ||
-	      irq == 10 ||
-	      irq == 11 ||
-	      irq == 12)) {
-		
-		printk(KERN_ERR LOGNAME ": \"irq\" - must be set to 5, 7, 9, 10, 11 or 12\n");
-		return -EINVAL;
-	}
-
-	if (mem == -1 ||
-	    !(mem == 0xb0000 ||
-	      mem == 0xc8000 ||
-	      mem == 0xd0000 ||
-	      mem == 0xd8000 ||
-	      mem == 0xe0000 ||
-	      mem == 0xe8000)) {
-		
-		printk(KERN_ERR LOGNAME ": \"mem\" - must be set to "
-		       "0xb0000, 0xc8000, 0xd0000, 0xd8000, 0xe0000 or 0xe8000\n");
-		return -EINVAL;
-	}
-
-	switch (irq) {
-	case 5: dev.irqid = HPIRQ_5; break;
-	case 7: dev.irqid = HPIRQ_7; break;
-	case 9: dev.irqid = HPIRQ_9; break;
-	case 10: dev.irqid = HPIRQ_10; break;
-	case 11: dev.irqid = HPIRQ_11; break;
-	case 12: dev.irqid = HPIRQ_12; break;
-	}
-
-	switch (mem) {
-	case 0xb0000: dev.memid = HPMEM_B000; break;
-	case 0xc8000: dev.memid = HPMEM_C800; break;
-	case 0xd0000: dev.memid = HPMEM_D000; break;
-	case 0xd8000: dev.memid = HPMEM_D800; break;
-	case 0xe0000: dev.memid = HPMEM_E000; break;
-	case 0xe8000: dev.memid = HPMEM_E800; break;
-	}
-
-	if (fifosize < 16)
-		fifosize = 16;
-
-	if (fifosize > 768)
-		fifosize = 768;
-
-	dev.type = msndClassic;
-	dev.io = io;
-	dev.numio = DSP_NUMIO;
-	dev.irq = irq;
-	dev.base = phys_to_virt(mem);
-	dev.fifosize = fifosize * 1024;
-	dev.calibrate_signal = calibrate_signal ? 1 : 0;
-	dev.recsrc = 0;
-	dev.inc_ref = mod_inc_ref;
-	dev.dec_ref = mod_dec_ref;
-
-	init_waitqueue(&dev.writeblock);
-	init_waitqueue(&dev.readblock);
-	init_waitqueue(&dev.writeflush);
-	msnd_fifo_init(&dev.DAPF);
-	msnd_fifo_init(&dev.DARF);
-	spin_lock_init(&dev.lock);
-
-	printk(KERN_INFO LOGNAME ": Using %u byte digital audio FIFOs (x2)\n", dev.fifosize);
-
-	if ((err = msnd_fifo_alloc(&dev.DAPF, dev.fifosize)) < 0) {
-		
-		printk(KERN_ERR LOGNAME ": Couldn't allocate write FIFO\n");
-		return err;
-	}
-
-	if ((err = msnd_fifo_alloc(&dev.DARF, dev.fifosize)) < 0) {
-		
-		printk(KERN_ERR LOGNAME ": Couldn't allocate read FIFO\n");
-		msnd_fifo_free(&dev.DAPF);
-		return err;
-	}
-
-	if ((err = probe_multisound()) < 0) {
-
-		printk(KERN_ERR LOGNAME ": Probe failed\n");
-		msnd_fifo_free(&dev.DAPF);
-		msnd_fifo_free(&dev.DARF);
-		return err;
-
-	}
-	
-	if ((err = attach_multisound()) < 0) {
-
-		printk(KERN_ERR LOGNAME ": Attach failed\n");
-		msnd_fifo_free(&dev.DAPF);
-		msnd_fifo_free(&dev.DARF);
-		return err;
-
-	}
-
-	return 0;
-}
-
-#ifdef MODULE
-
-void cleanup_module(void)
-{
-	printk(KERN_INFO LOGNAME ": Unloading\n");
-
-	unload_multisound();
-
-	msnd_fifo_free(&dev.DAPF);
-	msnd_fifo_free(&dev.DARF);
-
-}
-#endif
+/* The work is in msnd_pinnacle.c, just define MSND_CLASSIC before it. */
+#define MSND_CLASSIC
+#include "msnd_pinnacle.c"
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/msnd_classic.h linux/drivers/sound/msnd_classic.h
--- v2.1.110/linux/drivers/sound/msnd_classic.h	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/msnd_classic.h	Wed Jul 22 13:45:53 1998
@@ -24,13 +24,11 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  * 
- * $Id: msnd_classic.h,v 1.4 1998/07/14 22:59:25 andrewtv Exp $
+ * $Id: msnd_classic.h,v 1.5 1998/07/18 00:12:15 andrewtv Exp $
  *
  ********************************************************************/
 #ifndef __MSND_CLASSIC_H
 #define __MSND_CLASSIC_H
-
-#include <linux/config.h>
 
 #define DSP_NUMIO		0x10
 
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/msnd_pinnacle.c linux/drivers/sound/msnd_pinnacle.c
--- v2.1.110/linux/drivers/sound/msnd_pinnacle.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/msnd_pinnacle.c	Wed Jul 22 13:45:53 1998
@@ -1,8 +1,17 @@
 /*********************************************************************
  *
- * msnd_pinnacle.c - Support for Turtle Beach Pinnacle and Fiji
- *
  * Turtle Beach MultiSound Sound Card Driver for Linux
+ * Linux 2.0/2.2 Version
+ *
+ * msnd_pinnacle.c / msnd_classic.c
+ *
+ * -- If MSND_CLASSIC is defined:
+ *
+ *     -> driver for Turtle Beach Classic/Monterey/Tahiti
+ *
+ * -- Else
+ *
+ *     -> driver for Turtle Beach Pinnacle/Fiji
  *
  * Copyright (C) 1998 Andrew Veliath
  *
@@ -20,22 +29,36 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: msnd_pinnacle.c,v 1.2 1998/06/09 20:37:39 andrewtv Exp $
+ * $Id: msnd_pinnacle.c,v 1.5 1998/07/18 00:12:16 andrewtv Exp $
  *
  ********************************************************************/
 
 #include <linux/config.h>
+#include <linux/version.h>
+#if LINUX_VERSION_CODE < 0x020101
+#  define LINUX20
+#endif
 #include <linux/module.h>
 #include <linux/malloc.h>
 #include <linux/types.h>
 #include <linux/delay.h>
-#include <linux/init.h>
+#ifndef LINUX20
+#  include <linux/init.h>
+#endif
 #include "sound_config.h"
 #include "sound_firmware.h"
+#ifdef MSND_CLASSIC
+#  define SLOWIO
+#endif
 #include "msnd.h"
-#include "msnd_pinnacle.h"
+#ifdef MSND_CLASSIC
+#  include "msnd_classic.h"
+#  define LOGNAME			"msnd_classic"
+#else
+#  include "msnd_pinnacle.h"
+#  define LOGNAME			"msnd_pinnacle"
+#endif
 
-#define LOGNAME				"msnd_pinnacle"
 #define DEVNAME				dev.name
 #define MIXERMINOR			dev.mixer_minor
 #define DSPMINOR			dev.dsp_minor
@@ -111,7 +134,7 @@
 
 static int dsp_ioctl(unsigned int cmd, unsigned long arg)
 {
-	int val, i, data;
+	int val, i, data, tmp;
 	LPDAQD lpDAQ, lpDARQ;
 
 	lpDAQ = (LPDAQD)(dev.base + DAPQ_DATA_BUFF);
@@ -139,8 +162,9 @@
 		
 	case SNDCTL_DSP_GETBLKSIZE:
 
-		if (put_user(dev.fifosize / 4, (int *)arg))
-			return -EFAULT;
+		tmp = dev.fifosize / 4;
+		if (put_user(tmp, (int *)arg))
+                        return -EFAULT;
 
 		return 0;
 
@@ -283,7 +307,9 @@
 	case SOUND_MIXER_SYNTH:
 	case SOUND_MIXER_PCM:
 	case SOUND_MIXER_LINE:
+#ifndef MSND_CLASSIC
 	case SOUND_MIXER_MIC:
+#endif
 	case SOUND_MIXER_IMIX:
 	case SOUND_MIXER_LINE1:
 		return (dev.left_levels[d] >> 8) * 100 / 0xff | 
@@ -332,12 +358,14 @@
 			msnd_send_dsp_cmd(&dev, HDEX_AUX_REQ);
 		break;
 
+#ifndef MSND_CLASSIC
 	case SOUND_MIXER_MIC:			/* mic pot control */
 		writeb(bLeft, &dev.SMA->bMicPotPosLeft);
 		writeb(bRight, &dev.SMA->bMicPotPosRight);
 		if (msnd_send_word(&dev, 0, 0, HDEXAR_MIC_SET_POTS) == 0)
 			msnd_send_dsp_cmd(&dev, HDEX_AUX_REQ);
 		break;
+#endif
 
 	case SOUND_MIXER_LINE1:			/* line pot control */
 		writeb(bLeft, &dev.SMA->bAuxPotPosLeft);
@@ -359,7 +387,9 @@
 	/* update digital controls for master volume */
 	update_vol(SOUND_MIXER_PCM, wCurrPlayVol, 1);
 	update_vol(SOUND_MIXER_IMIX, wCurrInVol, 1);
+#ifndef MSND_CLASSIC
 	update_vol(SOUND_MIXER_SYNTH, wCurrMHdrVol, 1);
+#endif
 	
 	return mixer_get(d);
 }
@@ -373,6 +403,7 @@
 #endif
 		dev.recsrc ^= recsrc;
 
+#ifndef MSND_CLASSIC
 	if (dev.recsrc & SOUND_MASK_LINE) {
 
 		if (msnd_send_word(&dev, 0, 0, HDEXAR_SET_ANA_IN) == 0)
@@ -395,6 +426,7 @@
 			msnd_send_dsp_cmd(&dev, HDEX_AUX_REQ);
 #endif
 	}
+#endif /* MSND_CLASSIC */
 
 	return dev.recsrc;
 }
@@ -432,16 +464,22 @@
 			case SOUND_MIXER_DEVMASK:
 			case SOUND_MIXER_STEREODEVS:
 				val =   SOUND_MASK_VOLUME |
+#ifndef MSND_CLASSIC
 					SOUND_MASK_SYNTH |
+					SOUND_MASK_MIC |
+#endif
 					SOUND_MASK_PCM |
 					SOUND_MASK_LINE |
-					SOUND_MASK_IMIX |
-					SOUND_MASK_MIC;
+					SOUND_MASK_IMIX;
 				break;
 				  
 			case SOUND_MIXER_RECMASK:
+#ifdef MSND_CLASSIC
+				val =   0;
+#else
 				val =   SOUND_MASK_LINE |
 					SOUND_MASK_SYNTH;
+#endif
 				break;
 				  
 			case SOUND_MIXER_CAPS:
@@ -476,15 +514,23 @@
 static void dsp_halt(void)
 {
 	mdelay(1);
+#ifdef LINUX20
+	if (test_bit(F_READING, &dev.flags)) {
+		clear_bit(F_READING, &dev.flags);
+#else
 	if (test_and_clear_bit(F_READING, &dev.flags)) {
-
+#endif
 		msnd_send_dsp_cmd(&dev, HDEX_RECORD_STOP);
 		msnd_disable_irq(&dev);
 
 	}
 	mdelay(1);
+#ifdef LINUX20
+	if (test_bit(F_WRITING, &dev.flags)) {
+		clear_bit(F_WRITING, &dev.flags);
+#else
 	if (test_and_clear_bit(F_WRITING, &dev.flags)) {
-
+#endif
 		set_bit(F_WRITEFLUSH, &dev.flags);
 		interruptible_sleep_on(&dev.writeflush);
 		current->state = TASK_INTERRUPTIBLE;
@@ -540,23 +586,37 @@
 	return err;
 }
 
+#ifdef LINUX20
+static void dev_close(struct inode *inode, struct file *file)
+#else
 static int dev_close(struct inode *inode, struct file *file)
+#endif
 {
 	int minor = MINOR(inode->i_rdev);
+#ifndef LINUX20
 	int err = 0;
+#endif
 
 	if (minor == DSPMINOR) {
-		err = dsp_close();
+#ifndef LINUX20
+		err = 
+#endif
+			dsp_close();
 	}
 	else if (minor == MIXERMINOR) {
 		/* nothing */
-	} else
+	}
+#ifndef LINUX20
+	else
 		err = -EINVAL;
 
 	if (err >= 0)
+#endif
 		MOD_DEC_USE_COUNT;
-	
+
+#ifndef LINUX20	
 	return err;
+#endif
 }
 
 static int DAPF_to_bank(int bank)
@@ -586,9 +646,13 @@
 
 		buf += n;
 		count -= n;
-		
-		if (!test_and_set_bit(F_READING, &dev.flags) && (dev.mode & FMODE_READ)) {
 
+#ifdef LINUX20		
+		if (!test_bit(F_READING, &dev.flags) && (dev.mode & FMODE_READ)) {
+			set_bit(F_READING, &dev.flags);
+#else
+		if (!test_and_set_bit(F_READING, &dev.flags) && (dev.mode & FMODE_READ)) {
+#endif
 			reset_record_queue();
 			msnd_enable_irq(&dev);
 			msnd_send_dsp_cmd(&dev, HDEX_RECORD_START);
@@ -634,8 +698,12 @@
 		buf += n;
 		count -= n;
 
+#ifdef LINUX20
+		if (!test_bit(F_WRITING, &dev.flags) && (dev.mode & FMODE_WRITE)) {
+			set_bit(F_WRITING, &dev.flags);
+#else
 		if (!test_and_set_bit(F_WRITING, &dev.flags) && (dev.mode & FMODE_WRITE)) {
-			
+#endif
 			reset_play_queue();
 			msnd_enable_irq(&dev);
 			msnd_send_dsp_cmd(&dev, HDEX_PLAY_START);
@@ -663,9 +731,15 @@
 	return len - count;
 }
 
+#ifdef LINUX20
+static int dev_read(struct inode *inode, struct file *file, char *buf, int count)
+{
+       int minor = MINOR(inode->i_rdev);
+#else
 static ssize_t dev_read(struct file *file, char *buf, size_t count, loff_t *off)
 {
 	int minor = MINOR(file->f_dentry->d_inode->i_rdev);
+#endif
 
 	if (minor == DSPMINOR) {
 
@@ -675,9 +749,15 @@
 		return -EINVAL;
 }
 
+#ifdef LINUX20
+static int dev_write(struct inode *inode, struct file *file, const char *buf, int count)
+{
+	int minor = MINOR(inode->i_rdev);
+#else
 static ssize_t dev_write(struct file *file, const char *buf, size_t count, loff_t *off)
 {
 	int minor = MINOR(file->f_dentry->d_inode->i_rdev);
+#endif
 
 	if (minor == DSPMINOR) {
 
@@ -716,8 +796,15 @@
 			else if (!test_bit(F_WRITEBLOCK, &dev.flags)) {
 
 				clear_bit(F_WRITING, &dev.flags);
+#ifdef LINUX20
+				if (test_bit(F_WRITEFLUSH, &dev.flags)) {
+					clear_bit(F_WRITEFLUSH, &dev.flags);
+					wake_up_interruptible(&dev.writeflush);
+				}
+#else
 				if (test_and_clear_bit(F_WRITEFLUSH, &dev.flags))
 					wake_up_interruptible(&dev.writeflush);
+#endif
 				msnd_disable_irq(&dev);
 
 			}
@@ -759,7 +846,9 @@
 
 	case HIMT_DSP:
 		switch (LOBYTE(wMessage)) {
+#ifndef MSND_CLASSIC
 		case HIDSP_PLAY_UNDER:
+#endif
 		case HIDSP_INT_PLAY_UNDER:
 			printk(KERN_INFO LOGNAME ": Write underflow\n");
 			reset_play_queue();
@@ -858,9 +947,11 @@
 
 __initfunc(static int probe_multisound(void))
 {
+#ifndef MSND_CLASSIC
 	char *xv, *rev = NULL;
 	char *pin = "Pinnacle", *fiji = "Fiji";
 	char *pinfiji = "Pinnacle/Fiji";
+#endif
 
 	if (check_region(dev.io, dev.numio)) {
 		
@@ -878,6 +969,10 @@
 
 	printk(KERN_INFO LOGNAME ": DSP reset successful\n");
 
+#ifdef MSND_CLASSIC
+	dev.name = "Classic/Tahiti/Monterey";
+	printk(KERN_INFO LOGNAME ": Turtle Beach %s, "
+#else
 	switch (dev.info >> 4) {
 	case 0xf: xv = "<= 1.15"; break;
 	case 0x1: xv = "1.18/1.2"; break;
@@ -899,11 +994,13 @@
 		dev.name = pinfiji;
 		break;
 	}
-
 	printk(KERN_INFO LOGNAME ": Turtle Beach %s revision %s, Xilinx version %s, "
+#endif /* MSND_CLASSIC */
 	       "I/O 0x%x-0x%x, IRQ %d, memory mapped to 0x%p-0x%p\n",
 	       dev.name,
+#ifndef MSND_CLASSIC
 	       rev, xv,
+#endif
 	       dev.io, dev.io + dev.numio - 1,
 	       dev.irq,
 	       dev.base, dev.base + 0x7fff);
@@ -918,6 +1015,9 @@
 	int n;
 	LPDAQD lpDAQ;
 
+#ifdef MSND_CLASSIC
+	outb(dev.memid, dev.io + HP_MEMM);
+#endif
 	outb(HPBLKSEL_0, dev.io + HP_BLKS);
 	memset_io(dev.base, 0, 0x8000);
 	
@@ -1007,8 +1107,10 @@
 	writew(0, &dev.SMA->wCurrMastVolLeft);
 	writew(0, &dev.SMA->wCurrMastVolRight);
 
+#ifndef MSND_CLASSIC
 	writel(0x00010000, &dev.SMA->dwCurrPlayPitch);
 	writel(0x00000001, &dev.SMA->dwCurrPlayRate);
+#endif
 
 	writew(0x0000, &dev.SMA->wCurrDSPStatusFlags);
 	writew(0x0000, &dev.SMA->wCurrHostStatusFlags);
@@ -1023,10 +1125,12 @@
 	writeb(0, &dev.SMA->bAuxPotPosRight);
 	writeb(0, &dev.SMA->bAuxPotPosLeft);
 
+#ifndef MSND_CLASSIC
 	writew(1, &dev.SMA->wCurrPlayFormat);
 	writew(dev.sample_size, &dev.SMA->wCurrPlaySampleSize);
 	writew(dev.channels, &dev.SMA->wCurrPlayChannels);
 	writew(dev.sample_rate, &dev.SMA->wCurrPlaySampleRate);
+#endif
 	writew(dev.sample_rate, &dev.SMA->wCalFreqAtoD);
 
 	return 0;
@@ -1102,10 +1206,27 @@
 	return 0;
 }
 
+#ifdef MSND_CLASSIC
+__initfunc(static void reset_proteus(void))
+{
+	outb(HPPRORESET_ON, dev.io + HP_PROR);
+	mdelay(TIME_PRO_RESET);
+	outb(HPPRORESET_OFF, dev.io + HP_PROR);
+	mdelay(TIME_PRO_RESET_DONE);
+}
+#endif
+
 __initfunc(static int initialize(void))
 {
 	int err, timeout;
 
+#ifdef MSND_CLASSIC
+	outb(HPWAITSTATE_0, dev.io + HP_WAIT);
+	outb(HPBITMODE_16, dev.io + HP_BITM);
+
+	reset_proteus();
+#endif
+
 	if ((err = init_sma()) < 0) {
 
 		printk(KERN_WARNING LOGNAME ": Cannot initialize SMA\n");
@@ -1229,14 +1350,24 @@
 static int calibrate_signal __initdata;
 
 int init_module(void)
+#else /* not a module */
+#ifdef MSND_CLASSIC
+static int io __initdata =		CONFIG_MSNDCLAS_IO;
+static int irq __initdata =		CONFIG_MSNDCLAS_IRQ;
+static int mem __initdata =		CONFIG_MSNDCLAS_MEM;
 #else
 static int io __initdata =		CONFIG_MSNDPIN_IO;
 static int irq __initdata =		CONFIG_MSNDPIN_IRQ;
 static int mem __initdata =		CONFIG_MSNDPIN_MEM;
+#endif
 static int fifosize __initdata =	DEFFIFOSIZE;
 static int calibrate_signal __initdata;
 
+#ifdef MSND_CLASSIC
+__initfunc(int msnd_classic_init(void))
+#else
 __initfunc(int msnd_pinnacle_init(void))
+#endif /* MSND_CLASSIC */
 #endif
 {
 	int err;
@@ -1288,13 +1419,37 @@
 		return -EINVAL;
 	}
 
+#ifdef MSND_CLASSIC
+	switch (irq) {
+	case 5: dev.irqid = HPIRQ_5; break;
+	case 7: dev.irqid = HPIRQ_7; break;
+	case 9: dev.irqid = HPIRQ_9; break;
+	case 10: dev.irqid = HPIRQ_10; break;
+	case 11: dev.irqid = HPIRQ_11; break;
+	case 12: dev.irqid = HPIRQ_12; break;
+	}
+
+	switch (mem) {
+	case 0xb0000: dev.memid = HPMEM_B000; break;
+	case 0xc8000: dev.memid = HPMEM_C800; break;
+	case 0xd0000: dev.memid = HPMEM_D000; break;
+	case 0xd8000: dev.memid = HPMEM_D800; break;
+	case 0xe0000: dev.memid = HPMEM_E000; break;
+	case 0xe8000: dev.memid = HPMEM_E800; break;
+	}
+#endif /* MSND_CLASSIC */
+
 	if (fifosize < 16)
 		fifosize = 16;
 
 	if (fifosize > 768)
 		fifosize = 768;
 
+#ifdef MSND_CLASSIC
+	dev.type = msndClassic;
+#else
 	dev.type = msndPinnacle;
+#endif
 	dev.io = io;
 	dev.numio = DSP_NUMIO;
 	dev.irq = irq;
@@ -1310,7 +1465,9 @@
 	init_waitqueue(&dev.writeflush);
 	msnd_fifo_init(&dev.DAPF);
 	msnd_fifo_init(&dev.DARF);
+#ifndef LINUX20
 	spin_lock_init(&dev.lock);
+#endif
 
 	printk(KERN_INFO LOGNAME ": Using %u byte digital audio FIFOs (x2)\n", dev.fifosize);
 
@@ -1349,7 +1506,6 @@
 }
 
 #ifdef MODULE
-
 void cleanup_module(void)
 {
 	printk(KERN_INFO LOGNAME ": Unloading\n");
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/msnd_pinnacle.h linux/drivers/sound/msnd_pinnacle.h
--- v2.1.110/linux/drivers/sound/msnd_pinnacle.h	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/msnd_pinnacle.h	Wed Jul 22 13:45:53 1998
@@ -24,13 +24,11 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: msnd_pinnacle.h,v 1.4 1998/07/14 22:59:25 andrewtv Exp $
+ * $Id: msnd_pinnacle.h,v 1.5 1998/07/18 00:12:16 andrewtv Exp $
  *
  ********************************************************************/
 #ifndef __MSND_PINNACLE_H
 #define __MSND_PINNACLE_H
-
-#include <linux/config.h>
 
 #define DSP_NUMIO		0x08
 
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/opl3sa.c linux/drivers/sound/opl3sa.c
--- v2.1.110/linux/drivers/sound/opl3sa.c	Thu May 14 19:47:42 1998
+++ linux/drivers/sound/opl3sa.c	Wed Jul 22 13:45:53 1998
@@ -164,6 +164,7 @@
 {
 	int nm = num_mixers;
 
+	/* FIXME */
 	attach_ms_sound(hw_config);
 	if (num_mixers > nm)	/* A mixer was installed */
 	{
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/sound_config.h linux/drivers/sound/sound_config.h
--- v2.1.110/linux/drivers/sound/sound_config.h	Tue Jun  9 11:57:30 1998
+++ linux/drivers/sound/sound_config.h	Wed Jul 22 13:45:53 1998
@@ -1,6 +1,6 @@
 /* sound_config.h
  *
- * A driver for Soundcards, misc configuration parameters.
+ * A driver for sound cards, misc. configuration parameters.
  */
 /*
  * Copyright (C) by Hannu Savolainen 1993-1997
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/soundcard.c linux/drivers/sound/soundcard.c
--- v2.1.110/linux/drivers/sound/soundcard.c	Thu Jul 16 18:09:27 1998
+++ linux/drivers/sound/soundcard.c	Wed Jul 22 13:45:53 1998
@@ -836,8 +836,8 @@
 		audio_init_devices();
 	}
 #endif
-
-
+	if (proc_register(&proc_root, &proc_root_sound))
+		printk(KERN_ERR "sound: registering /proc/sound failed\n");
 }
 
 static int      sound[20] = {
@@ -875,8 +875,6 @@
 	if (sound_nblocks >= 1024)
 		printk(KERN_ERR "Sound warning: Deallocation table was too small.\n");
 	
-	if (proc_register(&proc_root, &proc_root_sound))
-		printk(KERN_ERR "sound: registering /proc/sound failed\n");
 	return 0;
 }
 
diff -u --recursive --new-file v2.1.110/linux/drivers/sound/wavfront.c linux/drivers/sound/wavfront.c
--- v2.1.110/linux/drivers/sound/wavfront.c	Tue Jul 21 00:15:31 1998
+++ linux/drivers/sound/wavfront.c	Wed Jul 22 13:45:53 1998
@@ -628,16 +628,16 @@
 /***********************************************************************
 WaveFront: data munging   
 
-Things here are wierd. All data written to the board cannot 
-have its most significant bit set. Any data item with values 
+Things here are weird.  All data written to the board cannot 
+have its most significant bit set.  Any data item with values 
 potentially > 0x7F (127) must be split across multiple bytes.
 
 Sometimes, we need to munge numeric values that are represented on
-the x86 side as 8-32 bit values. Sometimes, we need to munge data
-that is represented on the x86 side as an array of bytes. The most
+the x86 side as 8- to 32-bit values.  Sometimes, we need to munge data
+that is represented on the x86 side as an array of bytes.  The most
 efficient approach to handling both cases seems to be to use 2
-different functions for munging and 2 for de-munging. This avoids
-wierd casting and worrying about bit-level offsets.
+different functions for munging and 2 for de-munging.  This avoids
+weird casting and worrying about bit-level offsets.
 
 **********************************************************************/
 
@@ -1151,14 +1151,14 @@
 	shptr = munge_int32 (*((UINT32 *) &header->hdr.s.sampleEndOffset),
 			     shptr, 4);
 	
-	/* This one is truly wierd. What kind of wierdo decided that in
-	   a system dominated by 16 and 32 bit integers, they would use
-	   a 12 bit transfer size ?
+	/* This one is truly weird.  What kind of weirdo decided that in
+	   a system dominated by 16- and 32-bit integers, they would use
+	   a 12-bit transfer size ?
 	*/
 	
 	shptr = munge_int32 (header->hdr.s.FrequencyBias, shptr, 3);
 	
-	/* Why is this nybblified, when the MSB is *always* zero ? 
+	/* Why is this nybblified, when the MSB is *always* zero? 
 	   Anyway, we can't take address of bitfield, so make a
 	   good-faith guess at where it starts.
 	*/
@@ -2897,14 +2897,14 @@
 
 /* YSS225 initialization.
 
-   This code was developed using DOSEMU. The Turtle Beach SETUPSND
-   utility was run with I/O tracing in DOSEMU enabled, and a reconstruction
+   This code was developed using DOSEmu.  The Turtle Beach SETUPSND
+   utility was run with I/O tracing in DOSEmu enabled, and a reconstruction
    of the port I/O done, using the Yamaha faxback document as a guide
-   to add more logic to the code. Its really pretty wierd.
+   to add more logic to the code.  It's really pretty weird.
 
    There was an alternative approach of just dumping the whole I/O
    sequence as a series of port/value pairs and a simple loop
-   that output it. However, I hope that eventually I'll get more
+   that output it.  However, I hope that eventually I'll get more
    control over what this code does, and so I tried to stick with
    a somewhat "algorithmic" approach.
 */
@@ -3380,7 +3380,7 @@
 
 {
 	printk ("Turtle Beach WaveFront Driver\n"
-		"Copyright (C) by Hannu Solvainen, "
+		"Copyright (C) by Hannu Savolainen, "
 		"Paul Barton-Davis 1993-1998.\n");
 
 	if (io == -1 || irq == -1) {
diff -u --recursive --new-file v2.1.110/linux/drivers/video/Config.in linux/drivers/video/Config.in
--- v2.1.110/linux/drivers/video/Config.in	Tue Jul 21 00:15:31 1998
+++ linux/drivers/video/Config.in	Tue Jul 21 10:28:24 1998
@@ -5,7 +5,7 @@
 if [ "$CONFIG_FB" = "y" ]; then
   define_bool CONFIG_DUMMY_CONSOLE y
   if [ "$CONFIG_ARCH_ACORN" = "y" ]; then
-    define_bool CONFIG_FB_ACORN y
+    bool 'Acorn VIDC support' CONFIG_FB_ACORN
   fi
   if [ "$CONFIG_APOLLO" = "y" ]; then
     define_bool CONFIG_FB_APOLLO y
@@ -51,7 +51,9 @@
   # with xconfig.  --pb
   if [ "$ARCH" = "i386" -o "$ARCH" = "alpha" -o "$ARCH" = "ppc" -o \
        "$CONFIG_ARM" = "y" ]; then
-    tristate 'VGA chipset support (text only)' CONFIG_FB_VGA
+    if [ "$CONFIG_ARM" != "y" -o "$CONFIG_ARCH_ACORN" != "y" ] ; then
+      tristate 'VGA chipset support (text only)' CONFIG_FB_VGA
+    fi
   fi
   if [ "$ARCH" = "alpha" ]; then
     tristate 'TGA framebuffer support' CONFIG_FB_TGA
@@ -69,6 +71,8 @@
       fi
       bool '  CGsix (GX,GXplus) support' CONFIG_FB_CGSIX
     fi
+  fi
+  if [ "$ARCH" = "sparc64" ]; then
     if [ "$CONFIG_PCI" != "n" ]; then
       bool 'PCI framebuffers' CONFIG_FB_PCI
       if [ "$CONFIG_FB_PCI" != "n" ]; then
@@ -122,15 +126,15 @@
       fi
     fi
     if [ "$CONFIG_FB_ACORN" = "y" -o "$CONFIG_FB_ATARI" = "y" -o \
-	 "$CONFIG_FB_MAC" = "y" -o  "$CONFIG_FB_OF" = "y" -o \
-	 "$CONFIG_FB_TGA" = "y" -o "$CONFIG_FB_VESA" = "y" -o \
-	 "$CONFIG_FB_VIRTUAL" = "y" ]; then
+	 "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_MAC" = "y" -o \
+	 "$CONFIG_FB_OF" = "y" -o "$CONFIG_FB_TGA" = "y" -o \
+	 "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" ]; then
       define_bool CONFIG_FBCON_CFB8 y
     else
       if [ "$CONFIG_FB_ACORN" = "m" -o "$CONFIG_FB_ATARI" = "m" -o \
-	   "$CONFIG_FB_MAC" = "m" -o  "$CONFIG_FB_OF" = "m" -o \
-	   "$CONFIG_FB_TGA" = "m" -o "$CONFIG_FB_VESA" = "m" -o \
-	   "$CONFIG_FB_VIRTUAL" = "m" ]; then
+	   "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_MAC" = "y" -o \
+	   "$CONFIG_FB_OF" = "m" -o "$CONFIG_FB_TGA" = "m" -o \
+	   "$CONFIG_FB_VESA" = "m" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then
 	define_bool CONFIG_FBCON_CFB8 m
       fi
     fi
@@ -195,6 +199,41 @@
     else
       if [ "$CONFIG_FB_MDA" = "m" -o "$CONFIG_FB_VGA" = "m" ]; then
 	define_bool CONFIG_FBCON_VGA m
+      fi
+    fi
+  fi
+  if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then
+    bool 'Sparc console 8x16 font' CONFIG_FONT_SUN8x16
+    bool 'Sparc console 12x22 font (not supported by all drivers)' CONFIG_FONT_SUN12x22
+    bool 'Select other fonts' CONFIG_FBCON_FONTS
+    if [ "$CONFIG_FBCON_FONTS" = "y" ]; then
+      bool '  VGA 8x8 font' CONFIG_FONT_8x8
+      bool '  VGA 8x16 font' CONFIG_FONT_8x16
+      bool '  Mac console 6x11 font (not supported by all drivers)' CONFIG_FONT_6x11
+      bool '  Pearl (old m68k) console 8x8 font' CONFIG_FONT_PEARL_8x8
+      bool '  Acorn console 8x8 font' CONFIG_FONT_ACORN_8x8
+    fi
+  else
+    bool 'Select compiled-in fonts' CONFIG_FBCON_FONTS
+    if [ "$CONFIG_FBCON_FONTS" = "y" ]; then
+      bool '  VGA 8x8 font' CONFIG_FONT_8x8
+      bool '  VGA 8x16 font' CONFIG_FONT_8x16
+      bool '  Sparc console 8x16 font' CONFIG_FONT_SUN8x16
+      bool '  Sparc console 12x22 font (not supported by all drivers)' CONFIG_FONT_SUN12x22
+      bool '  Mac console 6x11 font (not supported by all drivers)' CONFIG_FONT_6x11
+      bool '  Pearl (old m68k) console 8x8 font' CONFIG_FONT_PEARL_8x8
+      bool '  Acorn console 8x8 font' CONFIG_FONT_ACORN_8x8
+    else
+      define_bool CONFIG_FONT_8x8 y
+      define_bool CONFIG_FONT_8x16 y
+      if [ "$CONFIG_MAC" = "y" ]; then
+        define_bool CONFIG_FONT_6x11 y
+      fi
+      if [ "$CONFIG_AMIGA" = "y" ]; then
+        define_bool CONFIG_FONT_PEARL_8x8 y
+      fi
+      if [ "$CONFIG_ARM" = "y" ]; then
+        define_bool CONFIG_FONT_ACORN_8x8 y
       fi
     fi
   fi
diff -u --recursive --new-file v2.1.110/linux/drivers/video/Makefile linux/drivers/video/Makefile
--- v2.1.110/linux/drivers/video/Makefile	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/Makefile	Tue Jul 21 10:28:24 1998
@@ -34,12 +34,41 @@
 endif
 
 ifeq ($(CONFIG_FB),y)
-  L_OBJS += fonts.o font_8x8.o font_8x16.o pearl_8x8.o font_6x11.o font_sun8x16.o font_sun12x22.o
+  L_OBJS += fonts.o
   OX_OBJS += fbcon.o fbcmap.o
 # fbgen is not compiled by default since nobody uses it yet
+  ifeq ($(CONFIG_FONT_8x8),y)
+    L_OBJS += font_8x8.o
+  endif
+  ifeq ($(CONFIG_FONT_8x16),y)
+    L_OBJS += font_8x16.o
+  endif
+  ifeq ($(CONFIG_FONT_SUN8x16),y)
+    L_OBJS += font_sun8x16.o
+  endif
+  ifeq ($(CONFIG_FONT_SUN12x22),y)
+    L_OBJS += font_sun12x22.o
+  endif
+  ifeq ($(CONFIG_FONT_6x11),y)
+    L_OBJS += font_6x11.o
+  endif
+  ifeq ($(CONFIG_FONT_ACORN_8x8),y)
+    L_OBJS += font_acorn_8x8.o
+  endif
+  ifeq ($(CONFIG_FONT_PEARL_8x8),y)
+    L_OBJS += font_pearl_8x8.o
+  endif
 endif
 
 # Frame Buffer Devices
+
+ifeq ($(CONFIG_FB_ACORN),y)
+L_OBJS += acornfb.o
+else
+  ifeq ($(CONFIG_FB_ACORN),m)
+  M_OBJS += acornfb.o
+  endif
+endif
 
 ifeq ($(CONFIG_FB_AMIGA),y)
 L_OBJS += amifb.o
diff -u --recursive --new-file v2.1.110/linux/drivers/video/S3triofb.c linux/drivers/video/S3triofb.c
--- v2.1.110/linux/drivers/video/S3triofb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/S3triofb.c	Tue Jul 21 10:28:24 1998
@@ -111,7 +111,7 @@
      *  Text console acceleration
      */
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static struct display_switch fbcon_trio8;
 #endif
 
@@ -568,7 +568,7 @@
     disp.line_length = fb_fix.line_length;
     disp.can_soft_blank = 1;
     disp.inverse = 0;
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
     if (fb_var.accel_flags & FB_ACCELF_TEXT)
 	disp.dispsw = &fbcon_trio8;
     else
@@ -576,6 +576,7 @@
 #else
     disp.dispsw = NULL;
 #endif
+    disp.scrollmode = fb_var.accel_flags & FB_ACCELF_TEXT ? 0 : SCROLL_YREDRAW;
 
     strcpy(fb_info.modename, "Trio64 ");
     strncat(fb_info.modename, dp->full_name, sizeof(fb_info.modename));
@@ -831,7 +832,7 @@
      *  Text console acceleration
      */
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static void fbcon_trio8_bmove(struct display *p, int sy, int sx, int dy,
 			      int dx, int height, int width)
 {
@@ -878,6 +879,7 @@
 
 static struct display_switch fbcon_trio8 = {
    fbcon_cfb8_setup, fbcon_trio8_bmove, fbcon_trio8_clear, fbcon_trio8_putc,
-   fbcon_trio8_putcs, fbcon_trio8_revc, NULL, NULL, FONTWIDTH(8)
+   fbcon_trio8_putcs, fbcon_trio8_revc, NULL, NULL, fbcon_cfb8_clear_margins,
+   FONTWIDTH(8)
 };
 #endif
diff -u --recursive --new-file v2.1.110/linux/drivers/video/acornfb.c linux/drivers/video/acornfb.c
--- v2.1.110/linux/drivers/video/acornfb.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/acornfb.c	Tue Jul 21 10:28:24 1998
@@ -0,0 +1,382 @@
+/*
+ * linux/drivers/video/acorn.c
+ *
+ * Copyright (C) 1998 Russell King
+ *
+ * Frame buffer code for Acorn platforms
+ */
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/malloc.h>
+#include <linux/init.h>
+#include <linux/fb.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/uaccess.h>
+
+#include "fbcon-mfb.h"
+#include "fbcon-cfb2.h"
+#include "fbcon-cfb4.h"
+#include "fbcon-cfb8.h"
+
+#define MAX_VIDC20_PALETTE	256
+#define MAX_VIDC_PALETTE	16
+
+struct acornfb_par {
+	unsigned long screen_base;
+	unsigned int xres;
+	unsigned int yres;
+	unsigned char bits_per_pixel;
+	unsigned int palette_size;
+
+	union {
+		union {
+			struct {
+				unsigned long red:8;
+				unsigned long green:8;
+				unsigned long blue:8;
+				unsigned long ext:4;
+				unsigned long unused:4;
+			} d;
+			unsigned long p;
+		} vidc20[MAX_VIDC20_PALETTE];
+		union {
+			struct {
+				unsigned long red:4;
+				unsigned long green:4;
+				unsigned long blue:4;
+				unsigned long trans:1;
+				unsigned long unused:19;
+			} d;
+			unsigned long p;
+		} vidc[MAX_VIDC_PALETTE];
+	} palette;
+};
+
+static int currcon = 0;
+static struct display disp;
+static struct fb_info fb_info;
+static struct acornfb_par current_par;
+
+static int
+acornfb_open(struct fb_info *info, int user)
+{
+	MOD_INC_USE_COUNT;
+	return 0;
+}
+
+static int
+acornfb_release(struct fb_info *info, int user)
+{
+	MOD_DEC_USE_COUNT;
+	return 0;
+}
+
+static void
+acornfb_encode_var(struct fb_var_screeninfo *var, struct acornfb_par *par)
+{
+	var->xres		= par->xres;
+	var->yres		= par->yres;
+	var->xres_virtual	= par->xres;
+	var->yres_virtual	= par->yres;
+	var->xoffset		= 0;
+	var->yoffset		= 0;
+	var->bits_per_pixel	= par->bits_per_pixel;
+	var->grayscale		= 0;
+	var->red.offset		= 0;
+	var->red.length		= 8;
+	var->red.msb_right	= 0;
+	var->green.offset	= 0;
+	var->green.length	= 8;
+	var->green.msb_right	= 0;
+	var->blue.offset	= 0;
+	var->blue.length	= 8;
+	var->blue.msb_right	= 0;
+	var->transp.offset	= 0;
+	var->transp.length	= 4;
+	var->transp.msb_right	= 0;
+	var->nonstd		= 0;
+	var->activate		= FB_ACTIVATE_NOW;
+	var->height		= -1;
+	var->width		= -1;
+	var->vmode		= FB_VMODE_NONINTERLACED;
+	var->pixclock		= 1;
+	var->sync		= 0;
+	var->left_margin	= 0;
+	var->right_margin	= 0;
+	var->upper_margin	= 0;
+	var->lower_margin	= 0;
+	var->hsync_len		= 0;
+	var->vsync_len		= 0;
+}
+
+static int
+acornfb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *info)
+{
+	struct acornfb_par *par = &current_par;
+	unsigned int line_length;
+
+	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+	strcpy(fix->id, "Acorn");
+
+	line_length = par->xres * par->bits_per_pixel / 8;
+
+	fix->smem_start	 = (char *)SCREEN2_BASE;
+	fix->smem_len	 = (((line_length * par->yres) - 1) | (PAGE_SIZE - 1)) + 1;
+	fix->type	 = FB_TYPE_PACKED_PIXELS;
+	fix->type_aux	 = 0;
+	fix->visual	 = FB_VISUAL_PSEUDOCOLOR;
+	fix->xpanstep	 = 0;
+	fix->ypanstep	 = 0;
+	fix->ywrapstep	 = 1;
+	fix->line_length = line_length;
+	fix->accel	 = FB_ACCEL_NONE;
+
+	return 0;
+}
+
+static int
+acornfb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
+{
+	if (con == -1) {
+		acornfb_encode_var(var, &current_par);
+	} else
+		*var = fb_display[con].var;
+	return 0;
+}
+
+static int
+acornfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
+{
+	return 0;
+}
+
+static void
+acornfb_set_disp(int con)
+{
+	struct fb_fix_screeninfo fix;
+	struct display *display;
+
+	if (con >= 0)
+		display = &fb_display[con];
+	else
+		display = &disp;
+
+	current_par.xres = 8 * ORIG_VIDEO_COLS;
+	current_par.yres = 8 * ORIG_VIDEO_LINES;
+	current_par.bits_per_pixel = 8;
+	current_par.palette_size = MAX_VIDC20_PALETTE;
+
+	acornfb_get_fix(&fix, con, 0);
+
+	acornfb_get_var(&display->var, con, 0);
+
+	display->cmap.start	= 0;
+	display->cmap.len	= 0;
+	display->cmap.red	= NULL;
+	display->cmap.green	= NULL;
+	display->cmap.blue	= NULL;
+	display->cmap.transp	= NULL;
+	display->screen_base	= fix.smem_start;
+	display->visual		= fix.visual;
+	display->type		= fix.type;
+	display->type_aux	= fix.type_aux;
+	display->ypanstep	= fix.ypanstep;
+	display->ywrapstep	= fix.ywrapstep;
+	display->line_length	= fix.line_length;
+	display->can_soft_blank	= 0;
+	display->inverse	= 0;
+
+	outl(SCREEN_START, VDMA_START);
+	outl(SCREEN_START + fix.smem_len - VDMA_XFERSIZE, VDMA_END);
+	outl(SCREEN_START, VDMA_INIT);
+
+	switch (display->var.bits_per_pixel) {
+#ifdef FBCON_HAS_MFB
+	case 1:
+		display->dispsw = &fbcon_mfb;
+		break;
+#endif
+#ifdef FBCON_HAS_CFB2
+	case 2:
+		display->dispsw = &fbcon_cfb2;
+		break;
+#endif
+#ifdef FBCON_HAS_CFB4
+	case 4:
+		display->dispsw = &fbcon_cfb4;
+		break;
+#endif
+#ifdef FBCON_HAS_CFB8
+	case 8:
+		display->dispsw = &fbcon_cfb8;
+		break;
+#endif
+	default:
+		display->dispsw = NULL;
+		break;
+	}
+}
+
+static int
+acornfb_vidc20_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, u_int *trans, struct fb_info *info)
+{
+	if (regno >= current_par.palette_size)
+		return 1;
+	*red   = current_par.palette.vidc20[regno].d.red;
+	*green = current_par.palette.vidc20[regno].d.green;
+	*blue  = current_par.palette.vidc20[regno].d.blue;
+	*trans = current_par.palette.vidc20[regno].d.ext;
+	return 0;
+}
+
+static int
+acornfb_vidc20_setcolreg(u_int regno, u_int red, u_int green, u_int blue, u_int trans, struct fb_info *info)
+{
+	if (regno >= current_par.palette_size)
+		return 1;
+
+	current_par.palette.vidc20[regno].p = 0;
+	current_par.palette.vidc20[regno].d.red   = red;
+	current_par.palette.vidc20[regno].d.green = green;
+	current_par.palette.vidc20[regno].d.blue  = blue;
+
+	outl(0x10000000 | regno, VIDC_BASE);
+	outl(current_par.palette.vidc20[regno].p, VIDC_BASE);
+
+	return 0;
+}
+
+static int
+acornfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+		 struct fb_info *info)
+{
+	int err = 0;
+
+	if (con == currcon)
+		err = fb_get_cmap(cmap, &fb_display[con].var,
+			          kspc, acornfb_vidc20_getcolreg, info);
+	else if (fb_display[con].cmap.len)
+		fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
+	else
+		fb_copy_cmap(fb_default_cmap(current_par.palette_size),
+			     cmap, kspc ? 0 : 2);
+	return err;
+}
+
+static int
+acornfb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+		 struct fb_info *info)
+{
+	int err = 0;
+
+	if (!fb_display[con].cmap.len)
+		err = fb_alloc_cmap(&fb_display[con].cmap,
+				    current_par.palette_size, 0);
+	if (!err) {
+		if (con == currcon)
+			err = fb_set_cmap(cmap, &fb_display[con].var,
+					  kspc, acornfb_vidc20_setcolreg, info);
+		else
+			fb_copy_cmap(cmap, &fb_display[con].cmap,
+				     kspc ? 0 : 1);
+	}
+	return err;
+}
+
+static int
+acornfb_pan_display(struct fb_var_screeninfo *var, int con,
+		    struct fb_info *info)
+{
+	if (var->xoffset || var->yoffset)
+		return -EINVAL;
+	else
+		return 0;
+}
+
+static int
+acornfb_ioctl(struct inode *ino, struct file *file, unsigned int cmd,
+	      unsigned long arg, int con, struct fb_info *info)
+{
+	return -ENOIOCTLCMD;
+}
+
+static struct fb_ops acornfb_ops = {
+	acornfb_open,
+	acornfb_release,
+	acornfb_get_fix,
+	acornfb_get_var,
+	acornfb_set_var,
+	acornfb_get_cmap,
+	acornfb_set_cmap,
+	acornfb_pan_display,
+	acornfb_ioctl
+};
+
+void
+acornfb_setup(char *options, int *ints)
+{
+}
+
+static int
+acornfb_update_var(int con, struct fb_info *info)
+{
+	if (con == currcon) {
+		int off = fb_display[con].var.yoffset *
+			  fb_display[con].var.xres_virtual *
+			  fb_display[con].var.bits_per_pixel >> 3;
+		unsigned long base;
+
+		base = current_par.screen_base = SCREEN_START + off;
+
+		outl (SCREEN_START + base, VDMA_INIT);
+	}
+
+	return 0;
+}
+
+static int
+acornfb_switch(int con, struct fb_info *info)
+{
+	currcon = con;
+	acornfb_update_var(con, info);
+	return 0;
+}
+
+static void
+acornfb_blank(int blank, struct fb_info *info)
+{
+}
+
+__initfunc(unsigned long
+acornfb_init(unsigned long mem_start))
+{
+	strcpy(fb_info.modename, "Acorn");
+	fb_info.node		= -1;
+	fb_info.fbops		= &acornfb_ops;
+	fb_info.disp		= &disp;
+	fb_info.monspecs.hfmin	= 0;
+	fb_info.monspecs.hfmax	= 0;
+	fb_info.monspecs.vfmin	= 0;
+	fb_info.monspecs.vfmax	= 0;
+	fb_info.monspecs.dpms	= 0;
+	strcpy(fb_info.fontname, "Acorn8x8");
+	fb_info.changevar	= NULL;
+	fb_info.switch_con	= acornfb_switch;
+	fb_info.updatevar	= acornfb_update_var;
+	fb_info.blank		= acornfb_blank;
+
+	acornfb_set_disp(-1);
+	fb_set_cmap(fb_default_cmap(current_par.palette_size), &fb_display[0].var,
+		    1, acornfb_vidc20_setcolreg, &fb_info);
+	register_framebuffer(&fb_info);
+
+	return mem_start;
+}
diff -u --recursive --new-file v2.1.110/linux/drivers/video/amifb.c linux/drivers/video/amifb.c
--- v2.1.110/linux/drivers/video/amifb.c	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/amifb.c	Tue Jul 21 10:28:24 1998
@@ -1486,17 +1486,17 @@
 			display->can_soft_blank = 1;
 			display->inverse = amifb_inverse;
 			switch (fix.type) {
-#ifdef CONFIG_FBCON_ILBM
+#ifdef FBCON_HAS_ILBM
 			    case FB_TYPE_INTERLEAVED_PLANES:
 				display->dispsw = &fbcon_ilbm;
 				break;
 #endif
-#ifdef CONFIG_FBCON_AFB
+#ifdef FBCON_HAS_AFB
 			    case FB_TYPE_PLANES:
 				display->dispsw = &fbcon_afb;
 				break;
 #endif
-#ifdef CONFIG_FBCON_MFB
+#ifdef FBCON_HAS_MFB
 			    case FB_TYPE_PACKED_PIXELS:	/* depth == 1 */
 				display->dispsw = &fbcon_mfb;
 				break;
@@ -2129,7 +2129,7 @@
 	fix->smem_start = (char *)videomemory;
 	fix->smem_len = videomemorysize;
 
-#ifdef CONFIG_FBCON_MFB
+#ifdef FBCON_HAS_MFB
 	if (par->bpp == 1) {
 		fix->type = FB_TYPE_PACKED_PIXELS;
 		fix->type_aux = 0;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/atafb.c linux/drivers/video/atafb.c
--- v2.1.110/linux/drivers/video/atafb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/atafb.c	Wed Jul 22 13:40:04 1998
@@ -47,7 +47,6 @@
 #define ATAFB_EXT
 #define ATAFB_FALCON
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
@@ -71,24 +70,12 @@
 #include <linux/fb.h>
 #include <asm/atarikb.h>
 
-#ifdef CONFIG_FBCON_CFB8
 #include "fbcon-cfb8.h"
-#endif
-#ifdef CONFIG_FBCON_CFB16
 #include "fbcon-cfb16.h"
-#endif
-#ifdef CONFIG_FBCON_IPLAN2P2
 #include "fbcon-iplan2p2.h"
-#endif
-#ifdef CONFIG_FBCON_IPLAN2P4
 #include "fbcon-iplan2p4.h"
-#endif
-#ifdef CONFIG_FBCON_IPLAN2P8
 #include "fbcon-iplan2p8.h"
-#endif
-#ifdef CONFIG_FBCON_MFB
 #include "fbcon-mfb.h"
-#endif
 
 
 #define SWITCH_ACIA 0x01		/* modes for switch on OverScan */
@@ -1654,7 +1641,7 @@
 			(((red & 0xe) >> 1) | ((red & 1) << 3) << 8) |
 			(((green & 0xe) >> 1) | ((green & 1) << 3) << 4) |
 			((blue & 0xe) >> 1) | ((blue & 1) << 3);
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 		fbcon_cfb16_cmap[regno] = (red << 11) | (green << 5) | blue;
 #endif
 	}
@@ -2484,17 +2471,17 @@
 	switch (fix.type) {
 	    case FB_TYPE_INTERLEAVED_PLANES:
 		switch (var.bits_per_pixel) {
-#ifdef CONFIG_FBCON_IPLAN2P2
+#ifdef FBCON_HAS_IPLAN2P2
 		    case 2:
 			display->dispsw = &fbcon_iplan2p2;
 			break;
 #endif
-#ifdef CONFIG_FBCON_IPLAN2P4
+#ifdef FBCON_HAS_IPLAN2P4
 		    case 4:
 			display->dispsw = &fbcon_iplan2p4;
 			break;
 #endif
-#ifdef CONFIG_FBCON_IPLAN2P8
+#ifdef FBCON_HAS_IPLAN2P8
 		    case 8:
 			display->dispsw = &fbcon_iplan2p8;
 			break;
@@ -2503,17 +2490,17 @@
 		break;
 	    case FB_TYPE_PACKED_PIXELS:
 		switch (var.bits_per_pixel) {
-#ifdef CONFIG_FBCON_MFB
+#ifdef FBCON_HAS_MFB
 		    case 1:
 			display->dispsw = &fbcon_mfb;
 			break;
 #endif
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 		    case 8:
 			display->dispsw = &fbcon_cfb8;
 			break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 		    case 16:
 			display->dispsw = &fbcon_cfb16;
 			break;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/aty.h linux/drivers/video/aty.h
--- v2.1.110/linux/drivers/video/aty.h	Wed Jun 24 22:54:07 1998
+++ linux/drivers/video/aty.h	Tue Jul 21 10:28:24 1998
@@ -692,30 +692,6 @@
 /* ATI PCI constants */
 #define PCI_ATI_VENDOR_ID	0x1002
 
-/* mach64GX family */
-#define PCI_MACH64_GX		0x4758	/* mach64GX (ATI888GX00) */
-#define PCI_MACH64_CX		0x4358	/* mach64CX (ATI888CX00) */
-
-/* mach64CT family */
-#define PCI_MACH64_CT		0x4354	/* mach64CT (ATI264CT) */
-#define PCI_MACH64_ET		0x4554	/* mach64ET (ATI264ET) */
-
-/* mach64CT family / mach64VT class */
-#define PCI_MACH64_VT		0x5654	/* mach64VT (ATI264VT) */
-#define PCI_MACH64_VTB		0x5655	/* mach64VTB (ATI264VTB) */
-#define PCI_MACH64_VT4		0x5656	/* mach64VT4 (ATI264VT4) */
-
-/* mach64CT family / mach64GT (3D RAGE) class */
-#define PCI_MACH64_GB		0x4742	/* RAGE PRO, BGA, AGP 1x and 2x */
-#define PCI_MACH64_GD		0x4744	/* RAGE PRO, BGA, AGP 1x only */
-#define PCI_MACH64_GI		0x4749	/* RAGE PRO, BGA, PCI33 only */
-#define PCI_MACH64_GP		0x4750	/* RAGE PRO, PQFP, PCI33, full 3D */
-#define PCI_MACH64_GQ		0x4751	/* RAGE PRO, PQFP, PCI33, limited 3D */
-#define PCI_MACH64_GT		0x4754	/* 3D RAGE II/II+ */
-#define PCI_MACH64_GTB		0x4755	/* 3D II+ */
-#define PCI_MACH64_GTC		0x4756	/* 3D RAGE IIC */
-#define PCI_MACH64_LT		0x4c47	/* 3D RAGE LT */
-
 
 /* CONFIG_CHIP_ID register constants */
 #define CFG_CHIP_TYPE		0x0000FFFF
@@ -729,28 +705,30 @@
 /* Chip IDs read from CONFIG_CHIP_ID */
 
 /* mach64GX family */
-#define MACH64_GX_ID		0xD7	/* mach64GX (ATI888GX00) */
-#define MACH64_CX_ID		0x57	/* mach64CX (ATI888CX00) */
+#define GX_CHIP_ID	0xD7	/* mach64GX (ATI888GX00) */
+#define CX_CHIP_ID	0x57	/* mach64CX (ATI888CX00) */
+
+#define GX_PCI_ID	0x4758	/* mach64GX (ATI888GX00) */
+#define CX_PCI_ID	0x4358	/* mach64CX (ATI888CX00) */
 
 /* mach64CT family */
-#define MACH64_CT_ID		PCI_MACH64_CT
-#define MACH64_ET_ID		PCI_MACH64_ET
+#define CT_CHIP_ID	0x4354	/* mach64CT (ATI264CT) */
+#define ET_CHIP_ID	0x4554	/* mach64ET (ATI264ET) */
 
 /* mach64CT family / mach64VT class */
-#define MACH64_VT_ID		PCI_MACH64_VT
-#define MACH64_VTB_ID		PCI_MACH64_VTB
-#define MACH64_VT4_ID		PCI_MACH64_VT4
+#define VT_CHIP_ID	0x5654	/* mach64VT (ATI264VT) */
+#define VU_CHIP_ID	0x5655	/* mach64VTB (ATI264VTB) */
 
 /* mach64CT family / mach64GT (3D RAGE) class */
-#define MACH64_GB_ID		PCI_MACH64_GB
-#define MACH64_GD_ID		PCI_MACH64_GD
-#define MACH64_GI_ID		PCI_MACH64_GI
-#define MACH64_GP_ID		PCI_MACH64_GP
-#define MACH64_GQ_ID		PCI_MACH64_GQ
-#define MACH64_GT_ID		PCI_MACH64_GT
-#define MACH64_GTB_ID		PCI_MACH64_GTB
-#define MACH64_GTC_ID		PCI_MACH64_GTC
-#define MACH64_LT_ID		PCI_MACH64_LT
+#define LT_CHIP_ID	0x4c54	/* 3D RAGE LT */
+#define LG_CHIP_ID	0x4c47	/* 3D RAGE LG */
+#define GT_CHIP_ID	0x4754	/* 3D RAGE (GT) */
+#define GU_CHIP_ID	0x4755	/* 3D RAGE II/II+ (GTB) */
+#define GB_CHIP_ID	0x4742	/* RAGE PRO, BGA, AGP 1x and 2x */
+#define GD_CHIP_ID	0x4744	/* RAGE PRO, BGA, AGP 1x only */
+#define GI_CHIP_ID	0x4749	/* RAGE PRO, BGA, PCI33 only */
+#define GP_CHIP_ID	0x4750	/* RAGE PRO, PQFP, PCI33, full 3D */
+#define GQ_CHIP_ID	0x4751	/* RAGE PRO, PQFP, PCI33, limited 3D */
 
 
 /* Mach64 major ASIC revisions */
diff -u --recursive --new-file v2.1.110/linux/drivers/video/atyfb.c linux/drivers/video/atyfb.c
--- v2.1.110/linux/drivers/video/atyfb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/atyfb.c	Tue Jul 21 10:28:24 1998
@@ -3,6 +3,7 @@
  *
  *	Copyright (C) 1997 Geert Uytterhoeven
  *	Copyright (C) 1998 Bernd Harries
+ *	Copyright (C) 1998 Eddie C. Dost
  *
  *  This driver is partly based on the PowerMac console driver:
  *
@@ -27,6 +28,22 @@
 
     - support arbitrary video modes
 
+  (ecd):
+
+    - fix initialization and allocation of resources for cursor (and disp?).
+
+    - fix initialization of cursor timer.
+
+    - add code to detect ramdac type on initialization.
+
+    - add code to support cursor on all cards and all ramdacs.
+
+    - make cursor parameters controllable via ioctl()s.
+
+    - handle arbitrary fonts.
+
+						(Anyone to help with all this?)
+
 ******************************************************************************/
 
 #include <linux/config.h>
@@ -42,6 +59,7 @@
 #include <linux/interrupt.h>
 #include <linux/fb.h>
 #include <linux/selection.h>
+#include <linux/console.h>
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/nvram.h>
@@ -52,6 +70,7 @@
 #if defined(CONFIG_PMAC) || defined(CONFIG_CHRP)
 #include <asm/prom.h>
 #include <asm/pci-bridge.h>
+#include "macmodes.h"
 #endif
 #ifdef __sparc__
 #include <asm/pbm.h>
@@ -250,6 +269,23 @@
     unsigned long prot_mask;
 };
 
+#define DEFAULT_CURSOR_BLINK_RATE	(20)
+
+struct aty_cursor {
+	int		   enable;
+    	int		   on;
+	int		   vbl_cnt;
+	int		   blink_rate;
+	u32		   offset;
+	struct {
+	    u16 x, y;
+	}		   pos, hot, size;
+	u32		   color[2];
+	u8		   bits[8][64];
+	u8		   mask[8][64];
+	struct timer_list *timer;
+};
+
 struct fb_info_aty {
     struct fb_info fb_info;
     unsigned long ati_regbase_phys;
@@ -257,6 +293,7 @@
     unsigned long frame_buffer_phys;
     unsigned long frame_buffer;
     struct pci_mmap_map *mmap_map;
+    struct aty_cursor *cursor;
     u8 chip_class;
     u8 pixclock_lim_8;	/* ps, <= 8 bpp */
     u8 pixclock_lim_hi;	/* ps, > 8 bpp */
@@ -418,27 +455,17 @@
      *  Text console acceleration
      */
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static struct display_switch fbcon_aty8;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 static struct display_switch fbcon_aty16;
 #endif
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
 static struct display_switch fbcon_aty32;
 #endif
 
 
-#ifdef CONFIG_FB_COMPAT_XPMAC
-extern struct vc_mode display_info;
-extern struct fb_info *console_fb_info;
-extern int (*console_setmode_ptr)(struct vc_mode *, int);
-extern int (*console_set_cmap_ptr)(struct fb_cmap *, int, int,
-				   struct fb_info *);
-static int atyfb_console_setmode(struct vc_mode *, int);
-#endif /* CONFIG_FB_COMPAT_XPMAC */
-
-
     /*
      *  Internal routines
      */
@@ -482,9 +509,14 @@
     temp = info->ati_regbase;
     asm("lwbrx %0,%1,%2": "=r"(val):"r"(regindex), "r"(temp));
 #else
+#ifdef __sparc__v9__
+    temp = info->ati_regbase + regindex;
+    asm("lduwa [%1] %2, %0" : "=r" (val) : "r" (temp), "i" (ASI_PL));
+#else
     temp = info->ati_regbase+regindex;
     val = le32_to_cpu(*((volatile u32 *)(temp)));
 #endif
+#endif
     return val;
 }
 
@@ -497,9 +529,14 @@
     temp = info->ati_regbase;
     asm("stwbrx %0,%1,%2": : "r"(val), "r"(regindex), "r"(temp):"memory");
 #else
+#ifdef __sparc__v9__
+    temp = info->ati_regbase + regindex;
+    asm("stwa %0, [%1] %2" : "r" (val), "r" (temp), "i" (ASI_PL) : "memory");
+#else
     temp = info->ati_regbase+regindex;
     *((volatile u32 *)(temp)) = cpu_to_le32(val);
 #endif
+#endif
 }
 
 static inline u8 aty_ld_8(volatile unsigned int regindex,
@@ -648,7 +685,7 @@
     /* set pixel depth */
     wait_for_fifo(2, info);
     switch(par->hw.gx.cmode) {
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 	case CMODE_8:
 	    aty_st_le32(DP_PIX_WIDTH, HOST_8BPP | SRC_8BPP | DST_8BPP |
 				      BYTE_ORDER_LSB_TO_MSB,
@@ -656,7 +693,7 @@
 	    aty_st_le32(DP_CHAIN_MASK, 0x8080, info);
 	    break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 	case CMODE_16:
 	    aty_st_le32(DP_PIX_WIDTH, HOST_15BPP | SRC_15BPP | DST_15BPP |
 				      BYTE_ORDER_LSB_TO_MSB,
@@ -672,7 +709,7 @@
 	    aty_st_le32(DP_CHAIN_MASK, 0x8080, info);
 	    break;
 #endif
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
 	case CMODE_32:
 	    aty_st_le32(DP_PIX_WIDTH, HOST_32BPP | SRC_32BPP | DST_32BPP |
 				      BYTE_ORDER_LSB_TO_MSB, info);
@@ -804,6 +841,226 @@
     aty_st_le32(CRTC_OFF_PITCH, pitch<<22 | offset, info);
 }
 
+/*
+ * Hardware Cursor support.
+ */
+
+static u8 cursor_pixel_map[2] = { 0, 15 };
+static u8 cursor_color_map[2] = { 0, 0xff };
+
+static u8 cursor_bits_lookup[16] =
+{
+	0x00, 0x40, 0x10, 0x50, 0x04, 0x44, 0x14, 0x54,
+	0x01, 0x41, 0x11, 0x51, 0x05, 0x45, 0x15, 0x55
+};
+
+static u8 cursor_mask_lookup[16] =
+{
+	0xaa, 0x2a, 0x8a, 0x0a, 0xa2, 0x22, 0x82, 0x02,
+	0xa8, 0x28, 0x88, 0x08, 0xa0, 0x20, 0x80, 0x00
+};
+
+static void
+aty_set_cursor_color(struct fb_info_aty *fb, u8 *pixel,
+		     u8 *red, u8 *green, u8 *blue)
+{
+	struct aty_cursor *c = fb->cursor;
+	int i;
+
+	if (!c)
+		return;
+
+	for (i = 0; i < 2; i++) {
+		c->color[i] =  (u32)red[i] << 24;
+		c->color[i] |= (u32)green[i] << 16;
+ 		c->color[i] |= (u32)blue[i] <<  8;
+ 		c->color[i] |= (u32)pixel[i];
+	}
+
+	wait_for_fifo(2, fb);
+	aty_st_le32(CUR_CLR0, c->color[0], fb);
+	aty_st_le32(CUR_CLR1, c->color[1], fb);
+	wait_for_idle(fb);
+}
+
+static void
+aty_set_cursor_shape(struct fb_info_aty *fb)
+{
+	struct aty_cursor *c = fb->cursor;
+	u8 *ram, m, b;
+	int x, y;
+
+	if (!c)
+		return;
+
+	ram = (u8 *)(fb->frame_buffer + c->offset);
+
+	for (y = 0; y < c->size.y; y++) {
+		for (x = 0; x < c->size.x >> 2; x++) {
+			m = c->mask[x][y];
+			b = c->bits[x][y];
+			*ram++ = cursor_mask_lookup[m >> 4] |
+				 cursor_bits_lookup[(b & m) >> 4];
+			*ram++ = cursor_mask_lookup[m & 0x0f] |
+				 cursor_bits_lookup[(b & m) & 0x0f];
+		}
+		for ( ; x < 8; x++) {
+			*ram++ = 0xaa;
+			*ram++ = 0xaa;
+		}
+	}
+	memset(ram, 0xaa, (64 - c->size.y) * 16);
+}
+
+static void
+aty_set_cursor(struct fb_info_aty *fb)
+{
+	struct aty_cursor *c = fb->cursor;
+	u16 xoff, yoff;
+	int x, y;
+
+	if (!c)
+		return;
+
+	if (c->on) {
+		x = c->pos.x - c->hot.x;
+		if (x < 0) {
+			xoff = -x;
+			x = 0;
+		} else {
+			xoff = 0;
+		}
+
+		y = c->pos.y - c->hot.y;
+		if (y < 0) {
+			yoff = -y;
+			y = 0;
+		} else {
+			yoff = 0;
+		}
+
+		wait_for_fifo(4, fb);
+		aty_st_le32(CUR_OFFSET, (c->offset >> 3) + (yoff << 1), fb);
+		aty_st_le32(CUR_HORZ_VERT_OFF,
+			    ((u32)(64 - c->size.y + yoff) << 16) | xoff, fb);
+		aty_st_le32(CUR_HORZ_VERT_POSN, ((u32)y << 16) | x, fb);
+		aty_st_le32(GEN_TEST_CNTL, aty_ld_le32(GEN_TEST_CNTL, fb)
+						       | HWCURSOR_ENABLE, fb);
+	} else {
+		wait_for_fifo(4, fb);
+		aty_st_le32(GEN_TEST_CNTL,
+			    aty_ld_le32(GEN_TEST_CNTL, fb) & ~HWCURSOR_ENABLE,
+			    fb);
+	}
+	wait_for_idle(fb);
+}
+
+static void
+aty_cursor_timer_handler(unsigned long dev_addr)
+{
+	struct fb_info_aty *fb = (struct fb_info_aty *)dev_addr;
+
+	if (!fb->cursor)
+		return;
+
+	if (!fb->cursor->enable)
+		goto out;
+
+	if (fb->cursor->vbl_cnt && --fb->cursor->vbl_cnt == 0) {
+		fb->cursor->on ^= 1;
+		aty_set_cursor(fb);
+		fb->cursor->vbl_cnt = fb->cursor->blink_rate;
+	}
+
+out:
+	fb->cursor->timer->expires = jiffies + (HZ / 50);
+	add_timer(fb->cursor->timer);
+}
+
+static void
+atyfb_cursor(struct display *d, int mode, int x, int y)
+{
+	struct fb_info_aty *fb = (struct fb_info_aty *)d->fb_info;
+	struct aty_cursor *c = fb->cursor;
+
+	if (!c)
+		return;
+
+	x *= d->fontwidth;
+	y *= d->fontheight;
+	if (c->pos.x == x && c->pos.y == y && (mode == CM_ERASE) == !c->on)
+		return;
+
+	c->enable = 0;
+	c->pos.x = x;
+	c->pos.y = y;
+
+	switch (mode) {
+	case CM_ERASE:
+		c->on = 0;
+		aty_set_cursor(fb);
+		break;
+
+	case CM_DRAW:
+	case CM_MOVE:
+		c->on = 1;
+		aty_set_cursor(fb);
+
+		if (!c->timer) {
+			c->timer = kmalloc(sizeof(*c->timer), GFP_KERNEL);
+			if (!c->timer)
+				return;
+
+			c->blink_rate = DEFAULT_CURSOR_BLINK_RATE;
+
+			init_timer(c->timer);
+			c->timer->expires = jiffies + (HZ / 50);
+			c->timer->data = (unsigned long)fb;
+			c->timer->function = aty_cursor_timer_handler;
+			add_timer(c->timer);
+		}
+
+		c->vbl_cnt = c->blink_rate;
+		c->enable = 1;
+		break;
+	}
+}
+
+static int
+atyfb_set_font(struct display *d, int width, int height)
+{
+    struct fb_info_aty *fb = (struct fb_info_aty *)d->fb_info;
+    struct aty_cursor *c = fb->cursor;
+    int i, j;
+
+    if (c) {
+	if (!width || !height) {
+	    width = 8;
+	    height = 16;
+	}
+
+	c->offset = fb->total_vram - 0x1000;
+	c->hot.x = 0;
+	c->hot.y = 0;
+	c->size.x = width;
+	c->size.y = height;
+
+	memset(c->bits, 0xff, sizeof(c->bits));
+	memset(c->mask, 0, sizeof(c->mask));
+
+	for (i = 0, j = width; j >= 0; j -= 8, i++) {
+	    c->mask[i][height-2] = (j >= 8) ? 0xff : (0xff << (8 - j));
+	    c->mask[i][height-1] = (j >= 8) ? 0xff : (0xff << (8 - j));
+	}
+
+	aty_set_cursor_color(fb, cursor_pixel_map, cursor_color_map,
+			     cursor_color_map, cursor_color_map);
+	aty_set_cursor_shape(fb);
+    }
+    return 1;
+}
+
+
 static void atyfb_set_par(struct atyfb_par *par, struct fb_info_aty *info)
 {
     int i, j = 0, hres;
@@ -1492,17 +1749,17 @@
 	    display->inverse = 0;
 	    accel = var->accel_flags & FB_ACCELF_TEXT;
 	    switch (par.hw.gx.cmode) {
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 		case CMODE_8:
 		    display->dispsw = accel ? &fbcon_aty8 : &fbcon_cfb8;
 		    break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 		case CMODE_16:
 		    display->dispsw = accel ? &fbcon_aty16 : &fbcon_cfb16;
 		    break;
 #endif
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
 		case CMODE_32:
 		    display->dispsw = accel ? &fbcon_aty32 : &fbcon_cfb32;
 		    break;
@@ -1514,6 +1771,10 @@
 	    display->scrollmode = accel ? 0 : SCROLL_YREDRAW;
 	    if (info->changevar)
 		(*info->changevar)(con);
+	    if (info2->cursor) {
+	    	display->dispsw->cursor = atyfb_cursor;
+	    	display->dispsw->set_font = atyfb_set_font;
+	    }
 	}
 	if (con == currcon)
 	    atyfb_set_par(&par, info2);
@@ -1565,9 +1826,10 @@
 			   info);
     else if (fb_display[con].cmap.len) /* non default colormap? */
 	fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
-    else
-	fb_copy_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel),
-		     cmap, kspc ? 0 : 2);
+    else {
+	int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256;
+	fb_copy_cmap(fb_default_cmap(size), cmap, kspc ? 0 : 2);
+    }
     return 0;
 }
 
@@ -1581,8 +1843,8 @@
     int err;
 
     if (!fb_display[con].cmap.len) {	/* no colormap allocated? */
-	if ((err = fb_alloc_cmap(&fb_display[con].cmap,
-				 1<<fb_display[con].var.bits_per_pixel, 0)))
+	int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256;
+	if ((err = fb_alloc_cmap(&fb_display[con].cmap, size, 0)))
 	    return err;
     }
     if (con == currcon)			/* current console? */
@@ -1900,6 +2162,11 @@
 	info->palette[j].blue = default_blu[k];
     }
 
+    if (info->chip_class == CLASS_VT || info->chip_class == CLASS_GT) {
+	info->cursor = kmalloc(sizeof(struct aty_cursor), GFP_ATOMIC);
+	memset(info->cursor, 0, sizeof(*info->cursor));
+    }
+
     atyfb_set_par(&info->default_par, info);
     encode_var(&var, &info->default_par, info);
     atyfb_set_var(&var, -1, &info->fb_info);
@@ -1923,6 +2190,13 @@
     unsigned long addr;
     int i, j;
     u16 tmp;
+#ifdef __sparc__
+    extern int con_is_present(void);
+
+    /* Do not attach when we have a serial console. */
+    if (!con_is_present())
+	    return;
+#endif
 
     for (pdev = pci_devices; pdev; pdev = pdev->next) {
 	if (((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) &&
@@ -1933,6 +2207,7 @@
 		printk("atyfb_init: can't alloc fb_info_aty\n");
 		return;
 	    }
+	    memset(info, 0, sizeof(struct fb_info_aty));
 
 	    addr = pdev->base_address[0];
 	    if ((addr & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO)
@@ -2010,7 +2285,7 @@
 	     * Fix PROMs idea of MEM_CNTL settings...
 	     */
 	    tmp = aty_ld_le32(CONFIG_CHIP_ID, info) & CFG_CHIP_TYPE;
-	    if (tmp == MACH64_VT_ID) {
+	    if (tmp == VT_CHIP_ID) {
 		u32 mem = aty_ld_le32(MEM_CNTL, info);
 		switch (mem & 0x0f) {
 		    case 3:
@@ -2028,7 +2303,8 @@
 		    default:
 			break;
 		}
-		mem &= ~(0x00f00000);
+		if ((aty_ld_le32(CONFIG_STAT0, info) & 7) >= SDRAM)
+			mem &= ~(0x00f00000);
 		aty_st_le32(MEM_CNTL, mem, info);
 	    }
 
@@ -2213,11 +2489,8 @@
 	}
 
 #ifdef CONFIG_FB_COMPAT_XPMAC
-	if (!console_fb_info) {
+	if (!console_fb_info)
 	    console_fb_info = &info->fb_info;
-	    console_setmode_ptr = atyfb_console_setmode;
-	    console_set_cmap_ptr = atyfb_set_cmap;
-	}
 #endif /* CONFIG_FB_COMPAT_XPMAC */
     }
 }
@@ -2336,6 +2609,12 @@
     atyfb_set_par(&par, info2);
     /* Install new colormap */
     do_install_cmap(con, info);
+    /* Install hw cursor */
+    if (info2->cursor) {
+	aty_set_cursor_color(info2, cursor_pixel_map, cursor_color_map,
+			     cursor_color_map, cursor_color_map);
+	aty_set_cursor_shape(info2);
+    }
     return 0;
 }
 
@@ -2362,20 +2641,23 @@
     u8 gen_cntl;
 
     gen_cntl = aty_ld_8(CRTC_GEN_CNTL, info2);
-#ifndef __sparc__
-    if (blank & VESA_VSYNC_SUSPEND)
-	    gen_cntl |= 0x8;
-    if (blank & VESA_HSYNC_SUSPEND)
-	    gen_cntl |= 0x4;
-    if ((blank & VESA_POWERDOWN) == VESA_POWERDOWN)
-	    gen_cntl |= 0x40;
-#endif
-    if (blank == VESA_NO_BLANKING)
-	    gen_cntl &= ~(0x4c);
-#ifdef __sparc__
+    if (blank > 0)
+	switch (blank-1) {
+	    case VESA_NO_BLANKING:
+		gen_cntl |= 0x40;
+		break;
+	    case VESA_VSYNC_SUSPEND:
+		gen_cntl |= 0x8;
+		break;
+	    case VESA_HSYNC_SUSPEND:
+		gen_cntl |= 0x4;
+		break;
+	    case VESA_POWERDOWN:
+		gen_cntl |= 0x4c;
+		break;
+	}
     else
-	    gen_cntl |= 0x40;
-#endif
+	gen_cntl &= ~(0x4c);
     aty_st_8(CRTC_GEN_CNTL, gen_cntl, info2);
 }
 
@@ -2433,10 +2715,10 @@
     info2->aty_cmap_regs->lut = blue << scale;
     eieio();
     if (regno < 16) {
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 	fbcon_cfb16_cmap[regno] = (regno << 10) | (regno << 5) | regno;
 #endif
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
 	fbcon_cfb32_cmap[regno] = (regno << 24) | (regno << 16) |
 				  (regno << 8) | regno;
 #endif
@@ -2452,10 +2734,11 @@
     if (fb_display[con].cmap.len)
 	fb_set_cmap(&fb_display[con].cmap, &fb_display[con].var, 1,
 		    atyfb_setcolreg, info);
-    else
-	fb_set_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel),
-				    &fb_display[con].var, 1, atyfb_setcolreg,
-		    info);
+    else {
+	int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256;
+	fb_set_cmap(fb_default_cmap(size), &fb_display[con].var, 1,
+		    atyfb_setcolreg, info);
+    }
 }
 
 
@@ -2567,7 +2850,7 @@
 		 (struct fb_info_aty *)p->fb_info);
 }
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static void fbcon_aty8_putc(struct vc_data *conp, struct display *p, int c,
 			    int yy, int xx)
 {
@@ -2584,11 +2867,12 @@
 
 static struct display_switch fbcon_aty8 = {
     fbcon_cfb8_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty8_putc,
-    fbcon_aty8_putcs, fbcon_cfb8_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_aty8_putcs, fbcon_cfb8_revc, NULL, NULL, fbcon_cfb8_clear_margins,
+    FONTWIDTH(8)
 };
 #endif
 
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 static void fbcon_aty16_putc(struct vc_data *conp, struct display *p, int c,
 			     int yy, int xx)
 {
@@ -2605,11 +2889,11 @@
 
 static struct display_switch fbcon_aty16 = {
     fbcon_cfb16_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty16_putc,
-    fbcon_aty16_putcs, fbcon_cfb16_revc, NULL, FONTWIDTH(8)
+    fbcon_aty16_putcs, fbcon_cfb16_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 #endif
 
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
 static void fbcon_aty32_putc(struct vc_data *conp, struct display *p, int c,
 			     int yy, int xx)
 {
@@ -2626,49 +2910,6 @@
 
 static struct display_switch fbcon_aty32 = {
     fbcon_cfb32_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty32_putc,
-    fbcon_aty32_putcs, fbcon_cfb32_revc, NULL, FONTWIDTH(8)
+    fbcon_aty32_putcs, fbcon_cfb32_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 #endif
-
-
-#ifdef CONFIG_FB_COMPAT_XPMAC
-
-    /*
-     *  Backward compatibility mode for Xpmac
-     *
-     *  This should move to offb.c once this driver supports arbitrary video
-     *  modes
-     */
-
-static int atyfb_console_setmode(struct vc_mode *mode, int doit)
-{
-    struct fb_var_screeninfo var;
-    struct atyfb_par par;
-    int vmode, cmode;
-
-    if (mode->mode <= 0 || mode->mode > VMODE_MAX )
-	return -EINVAL;
-    vmode = mode->mode;
-
-    switch (mode->depth) {
-	case 24:
-	case 32:
-	    cmode = CMODE_32;
-	    break;
-	case 16:
-	    cmode = CMODE_16;
-	    break;
-	case 8:
-	case 0:			/* (default) */
-	    cmode = CMODE_8;
-	    break;
-	default:
-	    return -EINVAL;
-    }
-    init_par(&par, vmode, cmode);
-    encode_var(&var, &par, (struct fb_info_aty *)console_fb_info);
-    var.activate = doit ? FB_ACTIVATE_NOW : FB_ACTIVATE_TEST;
-    return atyfb_set_var(&var, currcon, console_fb_info);
-}
-
-#endif /* CONFIG_FB_COMPAT_XPMAC */
diff -u --recursive --new-file v2.1.110/linux/drivers/video/cgsixfb.c linux/drivers/video/cgsixfb.c
--- v2.1.110/linux/drivers/video/cgsixfb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/cgsixfb.c	Tue Jul 21 10:28:24 1998
@@ -1,4 +1,4 @@
-/* $Id: cgsixfb.c,v 1.2 1998/07/13 12:47:14 jj Exp $
+/* $Id: cgsixfb.c,v 1.4 1998/07/21 10:36:53 jj Exp $
  * cgsixfb.c: CGsix (GX,GXplus) frame buffer driver
  *
  * Copyright (C) 1996,1998 Jakub Jelinek (jj@ultra.linux.cz)
@@ -209,15 +209,15 @@
 };
 
 static struct sbus_mmap_map cg6_mmap_map[] = {
-	{ CG6_FBC,		CG6_FBC_OFFSET,		PAGE_SIZE },
-	{ CG6_TEC,		CG6_TEC_OFFSET,		PAGE_SIZE },
-	{ CG6_BTREGS,		CG6_BROOKTREE_OFFSET,	PAGE_SIZE },
-	{ CG6_FHC,		CG6_FHC_OFFSET,		PAGE_SIZE },
-	{ CG6_THC,		CG6_THC_OFFSET,		PAGE_SIZE },
-	{ CG6_ROM,		CG6_ROM_OFFSET,		0x10000   },
-	{ CG6_RAM,		CG6_RAM_OFFSET,		0x100000  }, /* FIXME: This should really be fbsize */
-	{ CG6_DHC,		CG6_DHC_OFFSET,		0x40000   },
-	{ 0,			0,			0	  }
+	{ CG6_FBC,		CG6_FBC_OFFSET,		PAGE_SIZE 		},
+	{ CG6_TEC,		CG6_TEC_OFFSET,		PAGE_SIZE 		},
+	{ CG6_BTREGS,		CG6_BROOKTREE_OFFSET,	PAGE_SIZE 		},
+	{ CG6_FHC,		CG6_FHC_OFFSET,		PAGE_SIZE 		},
+	{ CG6_THC,		CG6_THC_OFFSET,		PAGE_SIZE 		},
+	{ CG6_ROM,		CG6_ROM_OFFSET,		0x10000   		},
+	{ CG6_RAM,		CG6_RAM_OFFSET,		SBUS_MMAP_FBSIZE(1)  	},
+	{ CG6_DHC,		CG6_DHC_OFFSET,		0x40000   		},
+	{ 0,			0,			0	  		}
 };
 
 static void cg6_setup(struct display *p)
@@ -229,52 +229,67 @@
 static void cg6_clear(struct vc_data *conp, struct display *p, int sy, int sx,
 		      int height, int width)
 {
-#if 0
 	struct fb_info_sbusfb *fb = (struct fb_info_sbusfb *)p->fb_info;
 	register struct cg6_fbc *fbc = fb->s.cg6.fbc;
 	int x, y, w, h;
+	int i;
 	
-	fbc->ppc = 0x1803;
-	fbc->fg = cg6_cmap[attr_bg_col_ec(conp)];
-	fbc->fbc = 0x2000707f;
-	fbc->rop = 0x83;
-	fbc->pmask = 0xffffffff;
-	fbc->unk2 = 8;
-
-	/* FIXME: Optimize this by allowing 8/16 fontheigh only and introduce p->fontheightlog */
-	if (p->fontheight == 16) {
-		y = sy << 4; h = height << 4;
+	do {
+		i = fbc->s;
+	} while (i & 0x10000000);
+	fbc->fg = attr_bg_col_ec(conp);
+	fbc->bg = attr_bg_col_ec(conp);
+	fbc->pixelm = ~(0);
+	fbc->alu = 0xea80ff00;
+	fbc->s = 0;
+	fbc->clip = 0;
+	fbc->pm = ~(0);
+
+        if (p->fontheightlog) {
+		y = sy << p->fontheightlog; h = height << p->fontheightlog;
 	} else {
 		y = sy * p->fontheight; h = height * p->fontheight;
 	}
-	x = sx << 3; w = width << 3;
-	fbc->by = y + fb->y_margin;
-	fbc->bx = x + fb->x_margin;
-	fbc->bh = h;
-	fbc->bw = w;
-#endif
+	if (p->fontwidthlog) {
+		x = sx << p->fontwidthlog; w = width << p->fontwidthlog;
+	} else {
+		x = sx * p->fontwidth; w = width * p->fontwidth;
+	}
+	fbc->arecty = y + fb->y_margin;
+	fbc->arectx = x + fb->x_margin;
+	fbc->arecty = y + fb->y_margin + h;
+	fbc->arectx = x + fb->x_margin + w;
+	do {
+		i = fbc->draw;
+	} while (i < 0 && (i & 0x20000000));
 }
 
 static void cg6_fill(struct fb_info_sbusfb *fb, int s,
 		     int count, unsigned short *boxes)
 {
-#if 0
+	int i;
 	register struct cg6_fbc *fbc = fb->s.cg6.fbc;
-
-	fbc->ppc = 0x1803;
-	fbc->fg = cg6_cmap[attr_bg_col(s)];
-	fbc->fbc = 0x2000707f;
-	fbc->rop = 0x83;
-	fbc->pmask = 0xffffffff;
-	fbc->unk2 = 8;
+	
+	do {
+		i = fbc->s;
+	} while (i & 0x10000000);
+	fbc->fg = attr_bg_col(s);
+	fbc->bg = attr_bg_col(s);
+	fbc->pixelm = ~(0);
+	fbc->alu = 0xea80ff00;
+	fbc->s = 0;
+	fbc->clip = 0;
+	fbc->pm = ~(0);
 	while (count-- > 0) {
-		fbc->by = boxes[1];
-		fbc->bx = boxes[0];
-		fbc->bh = boxes[3] - boxes[1];
-		fbc->bw = boxes[2] - boxes[0];
+		fbc->arecty = boxes[1];
+		fbc->arectx = boxes[0];
+		fbc->arecty = boxes[3];
+		fbc->arectx = boxes[2];
 		boxes += 4;
+		do {
+			i = fbc->draw;
+		} while (i < 0 && (i & 0x20000000));
 	}
-#endif
 }
 
 static void cg6_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx)
@@ -448,9 +463,20 @@
 	}
 }
 
+static void cg6_restore_palette (struct fb_info_sbusfb *fb)
+{
+	struct bt_regs *bt = fb->s.cg6.bt;
+	int i;
+                
+	bt->addr = 0;
+	bt->color_map = 0xffffffff;
+	bt->color_map = 0xffffffff;
+	bt->color_map = 0xffffffff;
+}
+
 static struct display_switch cg6_dispsw __initdata = {
 	cg6_setup, fbcon_redraw_bmove, cg6_clear, cg6_putc, cg6_putcs, cg6_revc, 
-	NULL, NULL, FONTWIDTHRANGE(1,16) /* Allow fontwidths up to 16 */
+	NULL, NULL, NULL, FONTWIDTHRANGE(1,16) /* Allow fontwidths up to 16 */
 };
 
 static void cg6_setcursormap (struct fb_info_sbusfb *fb, u8 *red, u8 *green, u8 *blue)
@@ -473,7 +499,7 @@
 	struct cg6_thc *thc = fb->s.cg6.thc;
 	int i;
 
-	for (i = 0; i < 32; i++){
+	for (i = 0; i < 32; i++) {
 		thc->thc_cursmask [i] = fb->cursor.bits[0][i];
 		thc->thc_cursbits [i] = fb->cursor.bits[1][i];
 	}
@@ -570,6 +596,7 @@
 	fix->line_length = fb->var.xres_virtual;
 	fix->mmio_start = (char *)phys + CG6_FBC_OFFSET;
 	fix->mmio_len = PAGE_SIZE;
+	fix->accel = FB_ACCEL_SUN_CGSIX;
 	
 	var->accel_flags = FB_ACCELF_TEXT;
 	
@@ -595,6 +622,7 @@
 	fb->setcursor = cg6_setcursor;
 	fb->setcursormap = cg6_setcursormap;
 	fb->setcurshape = cg6_setcurshape;
+	fb->restore_palette = cg6_restore_palette;
 	fb->fill = cg6_fill;
 	fb->blank = cg6_blank;
 	fb->unblank = cg6_unblank;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/chipsfb.c linux/drivers/video/chipsfb.c
--- v2.1.110/linux/drivers/video/chipsfb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/chipsfb.c	Tue Jul 21 10:28:24 1998
@@ -41,6 +41,7 @@
 #include "fbcon.h"
 #include "fbcon-cfb8.h"
 #include "fbcon-cfb16.h"
+#include "macmodes.h"
 
 static int currcon = 0;
 
@@ -300,7 +301,7 @@
 	out_8(p->io_base + 0x3c9, green);
 	out_8(p->io_base + 0x3c9, blue);
 
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
     if (regno < 16)
 		fbcon_cfb16_cmap[regno] = (red << 10) | (green << 5) | blue;		
 #endif
@@ -347,7 +348,11 @@
 		var->blue.offset = 0;
 		var->red.length = var->green.length = var->blue.length = 5;
 		
+#ifdef FBCON_HAS_CFB16
 		disp->dispsw = &fbcon_cfb16;
+#else
+		disp->dispsw = NULL;
+#endif
     } else if (bpp == 8) {
 		if (con == currcon) {
 			write_cr(0x13, 100);		// 8 bit display width (decimal)
@@ -362,7 +367,11 @@
  		var->red.offset = var->green.offset = var->blue.offset = 0;
 		var->red.length = var->green.length = var->blue.length = 8;
 		
+#ifdef FBCON_HAS_CFB8
 		disp->dispsw = &fbcon_cfb8;
+#else
+		disp->dispsw = NULL;
+#endif
 	}
 
 	var->bits_per_pixel = bpp;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/creatorfb.c linux/drivers/video/creatorfb.c
--- v2.1.110/linux/drivers/video/creatorfb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/creatorfb.c	Tue Jul 21 10:28:24 1998
@@ -1,4 +1,4 @@
-/* $Id: creatorfb.c,v 1.5 1998/07/13 12:47:12 jj Exp $
+/* $Id: creatorfb.c,v 1.7 1998/07/21 10:36:48 jj Exp $
  * creatorfb.c: Creator/Creator3D frame buffer driver
  *
  * Copyright (C) 1997,1998 Jakub Jelinek (jj@ultra.linux.cz)
@@ -191,7 +191,6 @@
 	fbc->pmask = 0xffffffff;
 	fbc->unk2 = 8;
 
-	/* FIXME: Optimize this by allowing 8/16 fontheigh only and introduce p->fontheightlog */
 	if (p->fontheightlog) {
 		y = sy << p->fontheightlog; h = height << p->fontheightlog;
 	} else {
@@ -390,7 +389,7 @@
 
 static struct display_switch ffb_dispsw __initdata = {
 	ffb_setup, fbcon_redraw_bmove, ffb_clear, ffb_putc, ffb_putcs, ffb_revc, 
-	NULL, NULL, FONTWIDTHRANGE(1,16) /* Allow fontwidths up to 16 */
+	NULL, NULL, NULL, FONTWIDTHRANGE(1,16) /* Allow fontwidths up to 16 */
 };
 
 static void ffb_margins (struct fb_info_sbusfb *fb, struct display *p, int x_margin, int y_margin)
@@ -477,6 +476,7 @@
 	fix->line_length = 8192;
 	fix->mmio_start = (char *)(regs[0].phys_addr) + FFB_FBC_REGS_POFF;
 	fix->mmio_len = PAGE_SIZE;
+	fix->accel = FB_ACCEL_SUN_CREATOR;
 	
 	var->bits_per_pixel = 32;
 	var->green.offset = 8;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/cyberfb.c linux/drivers/video/cyberfb.c
--- v2.1.110/linux/drivers/video/cyberfb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/cyberfb.c	Wed Jul 22 13:40:04 1998
@@ -21,7 +21,6 @@
  */
 
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -241,7 +240,7 @@
  *    Text console acceleration
  */
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static struct display_switch fbcon_cyber8;
 #endif
 
@@ -853,7 +852,7 @@
 	display->can_soft_blank = 1;
 	display->inverse = Cyberfb_inverse;
 	switch (display->var.bits_per_pixel) {
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 	    case 8:
 		if (display->var.accel_flags & FB_ACCELF_TEXT) {
 		    display->dispsw = &fbcon_cyber8;
@@ -862,7 +861,7 @@
 		    display->dispsw = &fbcon_cfb8;
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 	    case 16:
 		display->dispsw = &fbcon_cfb16;
 		break;
@@ -1127,7 +1126,7 @@
  *    Text console acceleration
  */
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static void fbcon_cyber8_bmove(struct display *p, int sy, int sx, int dy,
 			       int dx, int height, int width)
 {
@@ -1174,7 +1173,8 @@
 
 static struct display_switch fbcon_cyber8 = {
    fbcon_cfb8_setup, fbcon_cyber8_bmove, fbcon_cyber8_clear, fbcon_cyber8_putc,
-   fbcon_cyber8_putcs, fbcon_cyber8_revc, NULL, NULL, FONTWIDTH(8)
+   fbcon_cyber8_putcs, fbcon_cyber8_revc, NULL, NULL, fbcon_cfb8_clear_margins,
+   FONTWIDTH(8)
 };
 #endif
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/dnfb.c linux/drivers/video/dnfb.c
--- v2.1.110/linux/drivers/video/dnfb.c	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/dnfb.c	Wed Jul 22 13:40:04 1998
@@ -5,7 +5,6 @@
 #include <linux/tty.h>
 #include <linux/malloc.h>
 #include <linux/delay.h>
-#include <linux/config.h>
 #include <linux/interrupt.h>
 #include <asm/setup.h>
 #include <asm/segment.h>
@@ -304,7 +303,7 @@
    disp[con].can_soft_blank = 1;
    disp[con].inverse = 0;
    disp[con].line_length = fix.line_length;
-#ifdef CONFIG_FBCON_MFB
+#ifdef FBCON_HAS_MFB
    disp[con].dispsw = &fbcon_mfb;
 #else
    disp[con].dispsw = NULL;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/dummycon.c linux/drivers/video/dummycon.c
--- v2.1.110/linux/drivers/video/dummycon.c	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/dummycon.c	Wed Jul 22 13:40:04 1998
@@ -5,6 +5,7 @@
  *  available, usually until fbcon takes console over.
  */
 
+#include <linux/config.h>
 #include <linux/types.h>
 #include <linux/kdev_t.h>
 #include <linux/tty.h>
@@ -15,13 +16,15 @@
 
 /*
  *  Dummy console driver
- *
  */
 
 #ifdef __sparc__
 /* Some reasonable defaults, so that we don't loose any text */
 #define DUMMY_COLUMNS	128
 #define DUMMY_ROWS	54
+#elif defined(CONFIG_ARM)
+#define DUMMY_COLUMNS	ORIG_VIDEO_COLS
+#define DUMMY_ROWS	ORIG_VIDEO_LINES
 #else
 #define DUMMY_COLUMNS	80
 #define DUMMY_ROWS	25
@@ -64,8 +67,7 @@
     (void *)dummycon_dummy,	/* con_bmove */
     (void *)dummycon_dummy,	/* con_switch */
     (void *)dummycon_dummy,	/* con_blank */
-    (void *)dummycon_dummy,	/* con_get_font */
-    (void *)dummycon_dummy,	/* con_set_font */
+    (void *)dummycon_dummy,	/* con_font_op */
     (void *)dummycon_dummy,	/* con_set_palette */
     (void *)dummycon_dummy,	/* con_scrolldelta */
     NULL,			/* con_set_origin */
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcmap.c linux/drivers/video/fbcmap.c
--- v2.1.110/linux/drivers/video/fbcmap.c	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcmap.c	Tue Jul 21 10:28:24 1998
@@ -59,7 +59,7 @@
     0x0000, 0x0000, 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa
 };
 static u16 green8[] = {
-    0x0000, 0x0000, 0xaaaa, 0x5555, 0x0000, 0x0000, 0xaaaa, 0xaaaa
+    0x0000, 0x0000, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x5555, 0xaaaa
 };
 static u16 blue8[] = {
     0x0000, 0xaaaa, 0x0000, 0xaaaa, 0x0000, 0xaaaa, 0x0000, 0xaaaa
@@ -70,7 +70,7 @@
     0x5555, 0x5555, 0x5555, 0x5555, 0xffff, 0xffff, 0xffff, 0xffff
 };
 static u16 green16[] = {
-    0x0000, 0x0000, 0xaaaa, 0x5555, 0x0000, 0x0000, 0xaaaa, 0xaaaa,
+    0x0000, 0x0000, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x5555, 0xaaaa,
     0x5555, 0x5555, 0xffff, 0xffff, 0x5555, 0x5555, 0xffff, 0xffff
 };
 static u16 blue16[] = {
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-afb.c linux/drivers/video/fbcon-afb.c
--- v2.1.110/linux/drivers/video/fbcon-afb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-afb.c	Tue Jul 21 10:28:24 1998
@@ -412,7 +412,7 @@
 
 struct display_switch fbcon_afb = {
     fbcon_afb_setup, fbcon_afb_bmove, fbcon_afb_clear, fbcon_afb_putc,
-    fbcon_afb_putcs, fbcon_afb_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_afb_putcs, fbcon_afb_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-afb.h linux/drivers/video/fbcon-afb.h
--- v2.1.110/linux/drivers/video/fbcon-afb.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-afb.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  Amiga bitplanes (afb)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_AFB) || defined(CONFIG_FBCON_AFB_MODULE)
+#define FBCON_HAS_AFB
+#endif
+#else
+#if defined(CONFIG_FBCON_AFB)
+#define FBCON_HAS_AFB
+#endif
+#endif
+
 extern struct display_switch fbcon_afb;
 extern void fbcon_afb_setup(struct display *p);
 extern void fbcon_afb_bmove(struct display *p, int sy, int sx, int dy, int dx,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb16.c linux/drivers/video/fbcon-cfb16.c
--- v2.1.110/linux/drivers/video/fbcon-cfb16.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-cfb16.c	Tue Jul 21 10:28:24 1998
@@ -179,7 +179,7 @@
 
 struct display_switch fbcon_cfb16 = {
     fbcon_cfb16_setup, fbcon_cfb16_bmove, fbcon_cfb16_clear, fbcon_cfb16_putc,
-    fbcon_cfb16_putcs, fbcon_cfb16_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_cfb16_putcs, fbcon_cfb16_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb16.h linux/drivers/video/fbcon-cfb16.h
--- v2.1.110/linux/drivers/video/fbcon-cfb16.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-cfb16.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  16 bpp packed pixel (cfb16)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_CFB16) || defined(CONFIG_FBCON_CFB16_MODULE)
+#define FBCON_HAS_CFB16
+#endif
+#else
+#if defined(CONFIG_FBCON_CFB16)
+#define FBCON_HAS_CFB16
+#endif
+#endif
+
 extern struct display_switch fbcon_cfb16;
 extern u16 fbcon_cfb16_cmap[16];
 extern void fbcon_cfb16_setup(struct display *p);
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb2.c linux/drivers/video/fbcon-cfb2.c
--- v2.1.110/linux/drivers/video/fbcon-cfb2.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-cfb2.c	Tue Jul 21 10:28:24 1998
@@ -32,10 +32,19 @@
      */
 
 static u_char nibbletab_cfb2[]={
+#if defined(__BIG_ENDIAN)
 	0x00,0x03,0x0c,0x0f,
 	0x30,0x33,0x3c,0x3f,
 	0xc0,0xc3,0xcc,0xcf,
 	0xf0,0xf3,0xfc,0xff
+#elif defined(__LITTLE_ENDIAN)
+	0x00,0xc0,0x30,0xf0,
+	0x0c,0xcc,0x3c,0xfc,
+	0x03,0xc3,0x33,0xf3,
+	0x0f,0xcf,0x3f,0xff
+#else
+#error FIXME: No endianness??
+#endif
 };
  
 
@@ -185,7 +194,7 @@
 
 struct display_switch fbcon_cfb2 = {
     fbcon_cfb2_setup, fbcon_cfb2_bmove, fbcon_cfb2_clear, fbcon_cfb2_putc,
-    fbcon_cfb2_putcs, fbcon_cfb2_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_cfb2_putcs, fbcon_cfb2_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb2.h linux/drivers/video/fbcon-cfb2.h
--- v2.1.110/linux/drivers/video/fbcon-cfb2.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-cfb2.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  2 bpp packed pixel (cfb2)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_CFB2) || defined(CONFIG_FBCON_CFB2_MODULE)
+#define FBCON_HAS_CFB2
+#endif
+#else
+#if defined(CONFIG_FBCON_CFB2)
+#define FBCON_HAS_CFB2
+#endif
+#endif
+
 extern struct display_switch fbcon_cfb2;
 extern void fbcon_cfb2_setup(struct display *p);
 extern void fbcon_cfb2_bmove(struct display *p, int sy, int sx, int dy, int dx,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb24.c linux/drivers/video/fbcon-cfb24.c
--- v2.1.110/linux/drivers/video/fbcon-cfb24.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-cfb24.c	Tue Jul 21 10:28:24 1998
@@ -199,7 +199,7 @@
 
 struct display_switch fbcon_cfb24 = {
     fbcon_cfb24_setup, fbcon_cfb24_bmove, fbcon_cfb24_clear, fbcon_cfb24_putc,
-    fbcon_cfb24_putcs, fbcon_cfb24_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_cfb24_putcs, fbcon_cfb24_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb24.h linux/drivers/video/fbcon-cfb24.h
--- v2.1.110/linux/drivers/video/fbcon-cfb24.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-cfb24.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  24 bpp packed pixel (cfb24)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_CFB24) || defined(CONFIG_FBCON_CFB24_MODULE)
+#define FBCON_HAS_CFB24
+#endif
+#else
+#if defined(CONFIG_FBCON_CFB24)
+#define FBCON_HAS_CFB24
+#endif
+#endif
+
 extern struct display_switch fbcon_cfb24;
 extern u32 fbcon_cfb24_cmap[16];
 extern void fbcon_cfb24_setup(struct display *p);
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb32.c linux/drivers/video/fbcon-cfb32.c
--- v2.1.110/linux/drivers/video/fbcon-cfb32.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-cfb32.c	Tue Jul 21 10:28:24 1998
@@ -184,7 +184,7 @@
 
 struct display_switch fbcon_cfb32 = {
     fbcon_cfb32_setup, fbcon_cfb32_bmove, fbcon_cfb32_clear, fbcon_cfb32_putc,
-    fbcon_cfb32_putcs, fbcon_cfb32_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_cfb32_putcs, fbcon_cfb32_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb32.h linux/drivers/video/fbcon-cfb32.h
--- v2.1.110/linux/drivers/video/fbcon-cfb32.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-cfb32.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  32 bpp packed pixel (cfb32)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_CFB32) || defined(CONFIG_FBCON_CFB32_MODULE)
+#define FBCON_HAS_CFB32
+#endif
+#else
+#if defined(CONFIG_FBCON_CFB32)
+#define FBCON_HAS_CFB32
+#endif
+#endif
+
 extern struct display_switch fbcon_cfb32;
 extern u32 fbcon_cfb32_cmap[16];
 extern void fbcon_cfb32_setup(struct display *p);
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb4.c linux/drivers/video/fbcon-cfb4.c
--- v2.1.110/linux/drivers/video/fbcon-cfb4.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-cfb4.c	Tue Jul 21 11:39:16 1998
@@ -32,10 +32,20 @@
      */
 
 static u16 nibbletab_cfb4[] = {
+#if defined(__BIG_ENDIAN)
     0x0000,0x000f,0x00f0,0x00ff,
     0x0f00,0x0f0f,0x0ff0,0x0fff,
     0xf000,0xf00f,0xf0f0,0xf0ff,
     0xff00,0xff0f,0xfff0,0xffff
+#elif defined(__LITTLE_ENDIAN)
+    0x0000,0xf000,0x0f00,0xff00,
+    0x00f0,0xf0f0,0x0ff0,0xfff0,
+    0x000f,0xf00f,0x0f0f,0xff0f,
+    0x00ff,0xf0ff,0x0fff,0xffff
+#else
+#error FIXME: No endianness??
+#endif
+
 };
 
 void fbcon_cfb4_setup(struct display *p)
@@ -188,7 +198,7 @@
 
 struct display_switch fbcon_cfb4 = {
     fbcon_cfb4_setup, fbcon_cfb4_bmove, fbcon_cfb4_clear, fbcon_cfb4_putc,
-    fbcon_cfb4_putcs, fbcon_cfb4_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_cfb4_putcs, fbcon_cfb4_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb4.h linux/drivers/video/fbcon-cfb4.h
--- v2.1.110/linux/drivers/video/fbcon-cfb4.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-cfb4.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  4 bpp packed pixel (cfb4)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_CFB4) || defined(CONFIG_FBCON_CFB4_MODULE)
+#define FBCON_HAS_CFB4
+#endif
+#else
+#if defined(CONFIG_FBCON_CFB4)
+#define FBCON_HAS_CFB4
+#endif
+#endif
+
 extern struct display_switch fbcon_cfb4;
 extern void fbcon_cfb4_setup(struct display *p);
 extern void fbcon_cfb4_bmove(struct display *p, int sy, int sx, int dy, int dx,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb8.c linux/drivers/video/fbcon-cfb8.c
--- v2.1.110/linux/drivers/video/fbcon-cfb8.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-cfb8.c	Tue Jul 21 10:28:24 1998
@@ -108,7 +108,7 @@
     int bytes=p->next_line,rows;
     u32 eorx,fgx,bgx;
 
-    dest = p->screen_base + yy * p->fontheight * bytes + xx * 8;
+    dest = p->screen_base + yy * p->fontheight * bytes + xx * p->fontwidth;
     if (p->fontwidth <= 8)
 	cdat = p->fontdata + (c & 0xff) * p->fontheight;
     else
@@ -154,7 +154,7 @@
     int rows,bytes=p->next_line;
     u32 eorx, fgx, bgx;
 
-    dest0 = p->screen_base + yy * p->fontheight * bytes + xx * 8;
+    dest0 = p->screen_base + yy * p->fontheight * bytes + xx * p->fontwidth;
     fgx=attr_fgcol(p,*s);
     bgx=attr_bgcol(p,*s);
     fgx |= (fgx << 8);
@@ -222,6 +222,29 @@
     }
 }
 
+void fbcon_cfb8_clear_margins(struct vc_data *conp, struct display *p)
+{
+    u8 *dest;
+    int bytes=p->next_line;
+    u8 bgx;
+    int i;
+
+    unsigned int right_start = conp->vc_cols*p->fontwidth;
+    unsigned int right_width = p->var.xres_virtual-right_start;
+    unsigned int bottom_start = conp->vc_rows*p->fontheight;
+    unsigned int bottom_width = p->var.yres_virtual-bottom_start;
+
+    bgx=attr_bgcol_ec(p,conp);
+
+    if (right_width) {
+	dest = p->screen_base+right_start;
+	for (i = 0; i < bottom_start; i++, dest += bytes)
+	    memset(dest, bgx, right_width);
+    }
+    if (bottom_width)
+	memset(p->screen_base+bottom_start*bytes, bgx, bytes*bottom_width);
+}
+
 
     /*
      *  `switch' for the low level operations
@@ -229,7 +252,7 @@
 
 struct display_switch fbcon_cfb8 = {
     fbcon_cfb8_setup, fbcon_cfb8_bmove, fbcon_cfb8_clear, fbcon_cfb8_putc,
-    fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL, NULL, 
+    fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL, NULL, fbcon_cfb8_clear_margins,
     FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
 };
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-cfb8.h linux/drivers/video/fbcon-cfb8.h
--- v2.1.110/linux/drivers/video/fbcon-cfb8.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-cfb8.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  8 bpp packed pixel (cfb8)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_CFB8) || defined(CONFIG_FBCON_CFB8_MODULE)
+#define FBCON_HAS_CFB8
+#endif
+#else
+#if defined(CONFIG_FBCON_CFB8)
+#define FBCON_HAS_CFB8
+#endif
+#endif
+
 extern struct display_switch fbcon_cfb8;
 extern void fbcon_cfb8_setup(struct display *p);
 extern void fbcon_cfb8_bmove(struct display *p, int sy, int sx, int dy, int dx,
@@ -13,3 +25,4 @@
 extern void fbcon_cfb8_putcs(struct vc_data *conp, struct display *p,
 			     const unsigned short *s, int count, int yy, int xx);
 extern void fbcon_cfb8_revc(struct display *p, int xx, int yy);
+extern void fbcon_cfb8_clear_margins(struct vc_data *conp, struct display *p);
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-ilbm.c linux/drivers/video/fbcon-ilbm.c
--- v2.1.110/linux/drivers/video/fbcon-ilbm.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-ilbm.c	Tue Jul 21 10:28:24 1998
@@ -260,7 +260,7 @@
 
 struct display_switch fbcon_ilbm = {
     fbcon_ilbm_setup, fbcon_ilbm_bmove, fbcon_ilbm_clear, fbcon_ilbm_putc,
-    fbcon_ilbm_putcs, fbcon_ilbm_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_ilbm_putcs, fbcon_ilbm_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-ilbm.h linux/drivers/video/fbcon-ilbm.h
--- v2.1.110/linux/drivers/video/fbcon-ilbm.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-ilbm.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  Amiga interleaved bitplanes (ilbm)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_ILBM) || defined(CONFIG_FBCON_ILBM_MODULE)  
+#define FBCON_HAS_ILBM 
+#endif
+#else
+#if defined(CONFIG_FBCON_ILBM) 
+#define FBCON_HAS_ILBM 
+#endif
+#endif
+
 extern struct display_switch fbcon_ilbm;
 extern void fbcon_ilbm_setup(struct display *p);
 extern void fbcon_ilbm_bmove(struct display *p, int sy, int sx, int dy, int dx,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-iplan2p2.c linux/drivers/video/fbcon-iplan2p2.c
--- v2.1.110/linux/drivers/video/fbcon-iplan2p2.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-iplan2p2.c	Tue Jul 21 10:28:24 1998
@@ -375,7 +375,7 @@
 struct display_switch fbcon_iplan2p2 = {
     fbcon_iplan2p2_setup, fbcon_iplan2p2_bmove, fbcon_iplan2p2_clear,
     fbcon_iplan2p2_putc, fbcon_iplan2p2_putcs, fbcon_iplan2p2_revc, NULL,
-    NULL, FONTWIDTH(8)
+    NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-iplan2p2.h linux/drivers/video/fbcon-iplan2p2.h
--- v2.1.110/linux/drivers/video/fbcon-iplan2p2.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-iplan2p2.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  Atari interleaved bitplanes (2 planes) (iplan2p2)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_IPLAN2P2) || defined(CONFIG_FBCON_IPLAN2P2_MODULE)
+#define FBCON_HAS_IPLAN2P2
+#endif
+#else
+#if defined(CONFIG_FBCON_IPLAN2P2)
+#define FBCON_HAS_IPLAN2P2
+#endif
+#endif
+
 extern struct display_switch fbcon_iplan2p2;
 extern void fbcon_iplan2p2_setup(struct display *p);
 extern void fbcon_iplan2p2_bmove(struct display *p, int sy, int sx, int dy,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-iplan2p4.c linux/drivers/video/fbcon-iplan2p4.c
--- v2.1.110/linux/drivers/video/fbcon-iplan2p4.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-iplan2p4.c	Tue Jul 21 10:28:24 1998
@@ -395,7 +395,7 @@
 struct display_switch fbcon_iplan2p4 = {
     fbcon_iplan2p4_setup, fbcon_iplan2p4_bmove, fbcon_iplan2p4_clear,
     fbcon_iplan2p4_putc, fbcon_iplan2p4_putcs, fbcon_iplan2p4_revc, NULL,
-    NULL, FONTWIDTH(8)
+    NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-iplan2p4.h linux/drivers/video/fbcon-iplan2p4.h
--- v2.1.110/linux/drivers/video/fbcon-iplan2p4.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-iplan2p4.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  Atari interleaved bitplanes (4 planes) (iplan2p4)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_IPLAN2P4) || defined(CONFIG_FBCON_IPLAN2P4_MODULE)
+#define FBCON_HAS_IPLAN2P4
+#endif
+#else
+#if defined(CONFIG_FBCON_IPLAN2P4)
+#define FBCON_HAS_IPLAN2P4
+#endif
+#endif
+
 extern struct display_switch fbcon_iplan2p4;
 extern void fbcon_iplan2p4_setup(struct display *p);
 extern void fbcon_iplan2p4_bmove(struct display *p, int sy, int sx, int dy,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-iplan2p8.c linux/drivers/video/fbcon-iplan2p8.c
--- v2.1.110/linux/drivers/video/fbcon-iplan2p8.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-iplan2p8.c	Tue Jul 21 10:28:24 1998
@@ -432,7 +432,7 @@
 struct display_switch fbcon_iplan2p8 = {
     fbcon_iplan2p8_setup, fbcon_iplan2p8_bmove, fbcon_iplan2p8_clear,
     fbcon_iplan2p8_putc, fbcon_iplan2p8_putcs, fbcon_iplan2p8_revc, NULL,
-    NULL, FONTWIDTH(8)
+    NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-iplan2p8.h linux/drivers/video/fbcon-iplan2p8.h
--- v2.1.110/linux/drivers/video/fbcon-iplan2p8.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-iplan2p8.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  Atari interleaved bitplanes (8 planes) (iplan2p8)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_IPLAN2P8) || defined(CONFIG_FBCON_IPLAN2P8_MODULE)
+#define FBCON_HAS_IPLAN2P8
+#endif
+#else
+#if defined(CONFIG_FBCON_IPLAN2P8)
+#define FBCON_HAS_IPLAN2P8
+#endif
+#endif
+
 extern struct display_switch fbcon_iplan2p8;
 extern void fbcon_iplan2p8_setup(struct display *p);
 extern void fbcon_iplan2p8_bmove(struct display *p, int sy, int sx, int dy,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-mac.c linux/drivers/video/fbcon-mac.c
--- v2.1.110/linux/drivers/video/fbcon-mac.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-mac.c	Tue Jul 21 10:28:24 1998
@@ -497,7 +497,7 @@
 
 struct display_switch fbcon_mac = {
     fbcon_mac_setup, fbcon_mac_bmove, fbcon_mac_clear, fbcon_mac_putc,
-    fbcon_mac_putcs, fbcon_mac_revc, NULL, NULL, FONTWIDTHRANGE(1,8)
+    fbcon_mac_putcs, fbcon_mac_revc, NULL, NULL, NULL, FONTWIDTHRANGE(1,8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-mac.h linux/drivers/video/fbcon-mac.h
--- v2.1.110/linux/drivers/video/fbcon-mac.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-mac.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  Mac variable bpp packed pixels (mac)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_MAC) || defined(CONFIG_FBCON_MAC_MODULE)
+#define FBCON_HAS_MAC
+#endif
+#else
+#if defined(CONFIG_FBCON_MAC)
+#define FBCON_HAS_MAC
+#endif
+#endif
+
 extern struct display_switch fbcon_mac;
 extern void fbcon_mac_setup(struct display *p);
 extern void fbcon_mac_bmove(struct display *p, int sy, int sx, int dy, int dx,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-mfb.c linux/drivers/video/fbcon-mfb.c
--- v2.1.110/linux/drivers/video/fbcon-mfb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-mfb.c	Tue Jul 21 10:28:24 1998
@@ -153,7 +153,7 @@
 
 struct display_switch fbcon_mfb = {
     fbcon_mfb_setup, fbcon_mfb_bmove, fbcon_mfb_clear, fbcon_mfb_putc,
-    fbcon_mfb_putcs, fbcon_mfb_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_mfb_putcs, fbcon_mfb_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-mfb.h linux/drivers/video/fbcon-mfb.h
--- v2.1.110/linux/drivers/video/fbcon-mfb.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-mfb.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  Monochrome (mfb)
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_MFB) || defined(CONFIG_FBCON_MFB_MODULE)
+#define FBCON_HAS_MFB
+#endif
+#else
+#if defined(CONFIG_FBCON_MFB)
+#define FBCON_HAS_MFB
+#endif
+#endif
+
 extern struct display_switch fbcon_mfb;
 extern void fbcon_mfb_setup(struct display *p);
 extern void fbcon_mfb_bmove(struct display *p, int sy, int sx, int dy, int dx,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-vga.c linux/drivers/video/fbcon-vga.c
--- v2.1.110/linux/drivers/video/fbcon-vga.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon-vga.c	Tue Jul 21 10:28:24 1998
@@ -178,7 +178,7 @@
 
 struct display_switch fbcon_vga = {
     fbcon_vga_setup, fbcon_vga_bmove, fbcon_vga_clear, fbcon_vga_putc,
-    fbcon_vga_putcs, fbcon_vga_revc, NULL, NULL, FONTWIDTH(8)
+    fbcon_vga_putcs, fbcon_vga_revc, NULL, NULL, NULL, FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon-vga.h linux/drivers/video/fbcon-vga.h
--- v2.1.110/linux/drivers/video/fbcon-vga.h	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/fbcon-vga.h	Wed Jul 22 13:40:04 1998
@@ -2,6 +2,18 @@
      *  VGA characters/attributes
      */
 
+#include <linux/config.h>
+
+#ifdef MODULE
+#if defined(CONFIG_FBCON_VGA) || defined(CONFIG_FBCON_VGA_MODULE)
+#define FBCON_HAS_VGA
+#endif
+#else
+#if defined(CONFIG_FBCON_VGA)
+#define FBCON_HAS_VGA
+#endif
+#endif
+
 extern struct display_switch fbcon_vga;
 extern void fbcon_vga_setup(struct display *p);
 extern void fbcon_vga_bmove(struct display *p, int sy, int sx, int dy, int dx,
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon.c linux/drivers/video/fbcon.c
--- v2.1.110/linux/drivers/video/fbcon.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon.c	Tue Jul 21 10:28:24 1998
@@ -167,8 +167,7 @@
 			int height, int width);
 static int fbcon_switch(struct vc_data *conp);
 static int fbcon_blank(struct vc_data *conp, int blank);
-static int fbcon_get_font(struct vc_data *conp, int *w, int *h, char *data);
-static int fbcon_set_font(struct vc_data *conp, int w, int h, char *data);
+static int fbcon_font_op(struct vc_data *conp, struct console_font_op *op);
 static int fbcon_set_palette(struct vc_data *conp, unsigned char *table);
 static int fbcon_scrolldelta(struct vc_data *conp, int lines);
 
@@ -303,7 +302,7 @@
 #endif /* CONFIG_MAC */
 
 #if defined(__arm__) && defined(IRQ_VSYNCPULSE)
-    irqres = request_irq(IRQ_VSYNCPULSE, fbcon_vbl_handler, 0,
+    irqres = request_irq(IRQ_VSYNCPULSE, fbcon_vbl_handler, SA_SHIRQ,
 			 "console/cursor", fbcon_vbl_handler);
 #endif
 
@@ -400,6 +399,7 @@
     int logo_lines = 0;
     /* Only if not module */
     extern int initmem_freed;
+    struct fbcon_font_desc *font;
     
     if (con != fg_console || initmem_freed || p->type == FB_TYPE_TEXT)
     	logo = 0;
@@ -407,11 +407,11 @@
     p->var.xoffset = p->var.yoffset = p->yscroll = 0;  /* reset wrap/pan */
 
     if (!p->fb_info->fontname[0] ||
-	!findsoftfont(p->fb_info->fontname, &p->fontwidth, &p->fontheight,
-		      &p->fontdata) || !fontwidthvalid(p,p->fontwidth))
-	getdefaultfont(p->var.xres, p->var.yres, NULL, &p->fontwidth,
-		       &p->fontheight, &p->fontdata);
-
+	!(font = fbcon_find_font(p->fb_info->fontname)))
+	    font = fbcon_get_default_font(p->var.xres, p->var.yres);
+    p->fontwidth = font->width;
+    p->fontheight = font->height;
+    p->fontdata = font->data;
     fbcon_font_widths(p);
     if (!fontwidthvalid(p,p->fontwidth)) {
 #ifdef CONFIG_MAC
@@ -497,6 +497,9 @@
     p->bgcol = 0;
 
     if (!init) {
+        if (con == fg_console)
+            set_palette(); /* Unlike vgacon, we have to set palette before resize on directcolor, 
+                              so that it is drawn with correct colors */
 	vc_resize_con(nr_rows, nr_cols, con);
 	if (save) {
     	    q = (unsigned short *)(conp->vc_origin + conp->vc_size_row * old_rows);
@@ -1103,6 +1106,8 @@
 
     if (info && info->switch_con)
 	(*info->switch_con)(conp->vc_num, info);
+    if (p->dispsw && p->dispsw->clear_margins)
+	p->dispsw->clear_margins(conp, p);
     return 1;
 }
 
@@ -1145,21 +1150,17 @@
 }
 
 
-static int fbcon_get_font(struct vc_data *conp, int *w, int *h, char *data)
+static inline int fbcon_get_font(int unit, struct console_font_op *op)
 {
-    int unit = conp->vc_num;
     struct display *p = &fb_display[unit];
-    int i, j, size, alloc;
-
-    size = (p->fontwidth+7)/8 * p->fontheight * 256;
-    alloc = (*w+7)/8 * *h * 256;
-    *w = p->fontwidth;
-    *h = p->fontheight;
-
-    if (alloc < size)
-	/* allocation length not sufficient */
-	return -ENAMETOOLONG;
+    char *data = op->data;
+    int i, j;
 
+    if (p->fontwidth != 8)		/* FIXME: Implement for wide fonts */
+        return -EINVAL;
+    op->width = p->fontwidth;
+    op->height = p->fontheight;
+    op->charcount = 256;
     for (i = 0; i < 256; i++)
 	for (j = 0; j < p->fontheight; j++)
 	    data[i*32+j] = p->fontdata[i*p->fontheight+j];
@@ -1170,85 +1171,30 @@
 #define REFCOUNT(fd)	(((int *)(fd))[-1])
 #define FNTSIZE(fd)	(((int *)(fd))[-2])
 
-static int fbcon_set_font(struct vc_data *conp, int w, int h, char *data)
+static int fbcon_do_set_font(int unit, struct console_font_op *op, u8 *data, int userfont)
 {
-    int unit = conp->vc_num;
     struct display *p = &fb_display[unit];
-    int i, j, size, userspace = 1, resize;
-    char *old_data = NULL, *new_data;
-
-    if (w < 0)
-	w = p->fontwidth;
-    if (h < 0)
-	h = p->fontheight;
-
-    if (w == 0) {
-	/* engage predefined font, name in 'data' */
-	unsigned short width, height;
-	data[MAX_FONT_NAME] = 0;
-
-	if (!findsoftfont( data, &width, &height, (u8 **)&data ))
-	    return -ENOENT;
-	w = width; h = height;
-	userspace = 0;
-    } else if (w == 1) {
-	/* copy font from some other console in 'h'*/
-	struct display *op;
-
-	if (h < 0 || !vc_cons_allocated( h ))
-	    return -ENOTTY;
-	if (h == unit)
-	    return 0; /* nothing to do */
-	op = &fb_display[h];
-	if (op->fontdata == p->fontdata)
-	    return 0; /* already the same font... */
-
-	resize = (op->fontwidth != p->fontwidth) ||
-		 (op->fontheight != p->fontheight);
-	if (p->userfont)
-	    old_data = p->fontdata;
-	p->fontdata = op->fontdata;
-	w = p->fontwidth = op->fontwidth;
-	h = p->fontheight = op->fontheight;
-	p->fontwidthlog = op->fontwidthlog;
-	p->fontheightlog = op->fontheightlog;
-	if ((p->userfont = op->userfont))
-	    REFCOUNT(p->fontdata)++;	/* increment usage counter */
-	goto activate;
-    }
-
-    if (!fontwidthvalid(p,w))
-	/* Currently only fontwidth == 8 supported */
+    int resize;
+    int w = op->width;
+    int h = op->height;
+    char *old_data = NULL;
+
+    if (!fontwidthvalid(p,w)) {
+        if (userfont)
+	    kfree(data);
 	return -ENXIO;
+    }
 
     resize = (w != p->fontwidth) || (h != p->fontheight);
-    size = (w+7)/8 * h * 256;
-
     if (p->userfont)
-	old_data = p->fontdata;
-
-    if (userspace) {
-	if (!(new_data = kmalloc( 2*sizeof(int)+size, GFP_USER )))
-	    return -ENOMEM;
-	new_data += 2*sizeof(int);
-	FNTSIZE(new_data) = size;
-	REFCOUNT(new_data) = 1; /* usage counter */
-
-	for (i = 0; i < 256; i++)
-	    for (j = 0; j < h; j++)
-		new_data[i*h+j] = data[i*32+j];
-
-	p->fontdata = new_data;
-	p->userfont = 1;
-    } else {
-	p->fontdata = data;
-	p->userfont = 0;
-    }
+        old_data = p->fontdata;
+    p->fontdata = data;
+    if ((p->userfont = userfont))
+        REFCOUNT(data)++;
     p->fontwidth = w;
     p->fontheight = h;
     fbcon_font_widths(p);
 
-activate:
     if (resize) {
 	/* reset wrap/pan */
 	p->var.xoffset = p->var.yoffset = p->yscroll = 0;
@@ -1269,6 +1215,82 @@
     return 0;
 }
 
+static inline int fbcon_copy_font(int unit, struct console_font_op *op)
+{
+    struct display *od, *p = &fb_display[unit];
+    int h = op->height;
+
+    if (h < 0 || !vc_cons_allocated( h ))
+        return -ENOTTY;
+    if (h == unit)
+        return 0; /* nothing to do */
+    od = &fb_display[h];
+    if (od->fontdata == p->fontdata)
+        return 0; /* already the same font... */
+    return fbcon_do_set_font(unit, op, od->fontdata, od->userfont);
+}
+
+static inline int fbcon_set_font(int unit, struct console_font_op *op)
+{
+    int w = op->width;
+    int h = op->height;
+    int size = (w+7)/8 * h * 256;
+    int i, j;
+    u8 *new_data, *data = op->data;
+
+    if (w != 8 || op->charcount != 256)
+        return -EINVAL;
+       
+    if (!(new_data = kmalloc( 2*sizeof(int)+size, GFP_USER )))
+        return -ENOMEM;
+    new_data += 2*sizeof(int);
+    FNTSIZE(new_data) = size;
+    REFCOUNT(new_data) = 0; /* usage counter */
+    for (i = 0; i < 256; i++)
+	for (j = 0; j < h; j++)
+	    new_data[i*h+j] = data[i*32+j];
+    return fbcon_do_set_font(unit, op, new_data, 1);
+}
+
+static inline int fbcon_set_def_font(int unit, struct console_font_op *op)
+{
+    char name[MAX_FONT_NAME];
+    struct fbcon_font_desc *f;
+    struct display *p = &fb_display[unit];
+
+    if (!op->data)
+	f = fbcon_get_default_font(p->var.xres, p->var.yres);
+    else if (strncpy_from_user(name, op->data, MAX_FONT_NAME-1) < 0)
+	return -EFAULT;
+    else {
+	name[MAX_FONT_NAME-1] = 0;
+	if (!(f = fbcon_find_font(name)))
+	    return -ENOENT;
+    }
+    op->width = f->width;
+    op->height = f->height;
+    op->charcount = 256;
+    return fbcon_do_set_font(unit, op, f->data, 0);
+}
+
+static int fbcon_font_op(struct vc_data *conp, struct console_font_op *op)
+{
+    int unit = conp->vc_num;
+
+    switch (op->op) {
+	case KD_FONT_OP_SET:
+	    return fbcon_set_font(unit, op);
+	case KD_FONT_OP_GET:
+	    return fbcon_get_font(unit, op);
+	case KD_FONT_OP_SET_DEFAULT:
+	    return fbcon_set_def_font(unit, op);
+	case KD_FONT_OP_COPY:
+	    return fbcon_copy_font(unit, op);
+	default:
+	    return -ENOSYS;
+    }
+}
+
 static u16 palette_red[16];
 static u16 palette_green[16];
 static u16 palette_blue[16];
@@ -1299,6 +1321,7 @@
 	palette_cmap.len = 1<<p->var.bits_per_pixel;
     else
 	palette_cmap.len = 16;
+    palette_cmap.start = 0;
     return p->fb_info->fbops->fb_set_cmap(&palette_cmap, 1, unit, p->fb_info);
 }
 
@@ -1307,8 +1330,6 @@
     int unit, offset, limit, scrollback_old;
     struct display *p;
 
-    /* FIXME: Sync to new code, remember to set visible_origin */
-
     if (!scrollback_phys_max)
 	return -ENOSYS;
 
@@ -1346,6 +1367,8 @@
     p->var.xoffset = 0;
     p->var.yoffset = offset*p->fontheight;
     p->fb_info->updatevar(unit, p->fb_info);
+    if (!offset)
+	fbcon_cursor(conp, CM_DRAW);
     return 0;
 }
 
@@ -1375,7 +1398,6 @@
 	int first_col = use_256 ? 32 : depth > 4 ? 16 : 0;
 	int num_cols = use_256 ? LINUX_LOGO_COLORS : 16;
 	unsigned char *red, *green, *blue;
-	int old_cmap_len;
 	
 	if (use_256) {
 	    red   = linux_logo_red;
@@ -1388,11 +1410,6 @@
 	    blue  = linux_logo16_blue;
 	}
 
-	/* dirty trick to avoid setcmap calling kmalloc which isn't
-	 * initialized yet... */
-	old_cmap_len = fb_display[fg_console].cmap.len;
-	fb_display[fg_console].cmap.len = 1 << (depth/(is_truecolor ? 3 : 1));
-	
 	for( i = 0; i < num_cols; i += n ) {
 	    n = num_cols - i;
 	    if (n > 16)
@@ -1408,7 +1425,6 @@
 	    p->fb_info->fbops->fb_set_cmap(&palette_cmap, 1, fg_console,
 					   p->fb_info);
 	}
-	fb_display[fg_console].cmap.len = old_cmap_len;
     }
 	
     if (depth >= 8) {
@@ -1626,12 +1642,13 @@
     con_bmove: 		fbcon_bmove,
     con_switch: 	fbcon_switch,
     con_blank: 		fbcon_blank,
-    con_get_font: 	fbcon_get_font,
-    con_set_font: 	fbcon_set_font,
+    con_font_op:	fbcon_font_op,
     con_set_palette: 	fbcon_set_palette,
     con_scrolldelta: 	fbcon_scrolldelta,
     con_set_origin: 	NULL,
     con_save_screen: 	NULL,
+    con_build_attr:	NULL,
+    con_invert_region:	NULL,
 };
 
 
@@ -1657,3 +1674,4 @@
  */
 
 EXPORT_SYMBOL(fb_display);
+EXPORT_SYMBOL(fbcon_redraw_bmove);
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fbcon.h linux/drivers/video/fbcon.h
--- v2.1.110/linux/drivers/video/fbcon.h	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fbcon.h	Tue Jul 21 10:28:24 1998
@@ -31,6 +31,7 @@
     void (*revc)(struct display *p, int xx, int yy);
     void (*cursor)(struct display *p, int mode, int xx, int yy);
     int  (*set_font)(struct display *p, int width, int height);
+    void (*clear_margins)(struct vc_data *conp, struct display *p);
     unsigned int fontwidthmask;      /* 1 at (1 << (width - 1)) if width is supported */
 }; 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/font.h linux/drivers/video/font.h
--- v2.1.110/linux/drivers/video/font.h	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/font.h	Tue Jul 21 10:28:24 1998
@@ -13,21 +13,37 @@
 
 #include <linux/types.h>
 
+struct fbcon_font_desc {
+    int idx;
+    char *name;
+    int width, height;
+    void *data;
+    int pref;
+};
+
+#define VGA8x8_IDX	0
+#define VGA8x16_IDX	1
+#define PEARL8x8_IDX	2
+#define VGA6x11_IDX	3
+#define SUN8x16_IDX	4
+#define SUN12x22_IDX	5
+#define ACORN8x8_IDX	6
+
+extern struct fbcon_font_desc	font_vga_8x8,
+				font_vga_8x16,
+				font_pearl_8x8,
+				font_vga_6x11,
+				font_sun_8x16,
+				font_sun_12x22,
+				font_acorn_8x8;
 
-   /*
-    *    Find a font with a specific name
-    */
+/* Find a font with a specific name */
 
-extern int findsoftfont(char *name, unsigned short *width, unsigned short *height, u_char *data[]);
+extern struct fbcon_font_desc *fbcon_find_font(char *name);
 
+/* Get the default font for a specific screen size */
 
-   /*
-    *    Get the default font for a specific screen size
-    */
-
-extern void getdefaultfont(int xres, int yres, char *name[], unsigned short *width,
-                           unsigned short *height, u_char *data[]);
-
+extern struct fbcon_font_desc *fbcon_get_default_font(int xres, int yres);
 
 /* Max. length for the name of a predefined font */
 #define MAX_FONT_NAME	32
diff -u --recursive --new-file v2.1.110/linux/drivers/video/font_6x11.c linux/drivers/video/font_6x11.c
--- v2.1.110/linux/drivers/video/font_6x11.c	Thu Mar 26 15:57:04 1998
+++ linux/drivers/video/font_6x11.c	Tue Jul 21 10:28:24 1998
@@ -4,14 +4,11 @@
 /*                                            */
 /**********************************************/
 
-#define FONTDATAMAX (11*256)
-
-char fontname_6x11[] = "ProFont6x11";
+#include "font.h"
 
-int  fontheight_6x11 = 11;
-int  fontwidth_6x11  = 6;
+#define FONTDATAMAX (11*256)
 
-unsigned char fontdata_6x11[FONTDATAMAX] = {
+static unsigned char fontdata_6x11[FONTDATAMAX] = {
 
 	/* 0 0x00 '^A' */
 	0x00, /* 00000000 */
@@ -3343,3 +3340,12 @@
 
 };
 
+
+struct fbcon_font_desc font_vga_6x11 = {
+	VGA6x11_IDX,
+	"ProFont6x11",
+	6,
+	11,
+	fontdata_6x11,
+	-2000	/* Try avoiding this font if possible unless on MAC */
+};
diff -u --recursive --new-file v2.1.110/linux/drivers/video/font_8x16.c linux/drivers/video/font_8x16.c
--- v2.1.110/linux/drivers/video/font_8x16.c	Tue Sep 16 02:29:59 1997
+++ linux/drivers/video/font_8x16.c	Tue Jul 21 10:28:24 1998
@@ -4,14 +4,11 @@
 /*                                            */
 /**********************************************/
 
-#define FONTDATAMAX 4096
-
-char fontname_8x16[] = "VGA8x16";
+#include "font.h"
 
-int  fontheight_8x16 = 16;
-int  fontwidth_8x16  = 8;
+#define FONTDATAMAX 4096
 
-unsigned char fontdata_8x16[FONTDATAMAX] = {
+static unsigned char fontdata_8x16[FONTDATAMAX] = {
 
 	/* 0 0x00 '^@' */
 	0x00, /* 00000000 */
@@ -4623,3 +4620,12 @@
 
 };
 
+
+struct fbcon_font_desc font_vga_8x16 = {
+	VGA8x16_IDX,
+	"VGA8x16",
+	8,
+	16,
+	fontdata_8x16,
+	0
+};
diff -u --recursive --new-file v2.1.110/linux/drivers/video/font_8x8.c linux/drivers/video/font_8x8.c
--- v2.1.110/linux/drivers/video/font_8x8.c	Tue Sep 16 02:30:02 1997
+++ linux/drivers/video/font_8x8.c	Tue Jul 21 10:28:24 1998
@@ -4,14 +4,11 @@
 /*                                            */
 /**********************************************/
 
-#define FONTDATAMAX 2048
-
-char fontname_8x8[] = "VGA8x8";
+#include "font.h"
 
-int  fontheight_8x8 = 8;
-int  fontwidth_8x8  = 8;
+#define FONTDATAMAX 2048
 
-unsigned char fontdata_8x8[FONTDATAMAX] = {
+static unsigned char fontdata_8x8[FONTDATAMAX] = {
 
 	/* 0 0x00 '^@' */
 	0x00, /* 00000000 */
@@ -2575,3 +2572,12 @@
 
 };
 
+
+struct fbcon_font_desc font_vga_8x8 = {
+	VGA8x8_IDX,
+	"VGA8x8",
+	8,
+	8,
+	fontdata_8x8,
+	0
+};
diff -u --recursive --new-file v2.1.110/linux/drivers/video/font_acorn_8x8.c linux/drivers/video/font_acorn_8x8.c
--- v2.1.110/linux/drivers/video/font_acorn_8x8.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/font_acorn_8x8.c	Wed Jul 22 13:40:04 1998
@@ -0,0 +1,276 @@
+/* Acorn-like font definition, with PC graphics characters */
+
+#include <linux/config.h>
+#include "font.h"
+
+static unsigned char acorndata_8x8[] = {
+/* 00 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ^@ */
+/* 01 */  0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e, /* ^A */
+/* 02 */  0x7e, 0xff, 0xbd, 0xff, 0xc3, 0xe7, 0xff, 0x7e, /* ^B */
+/* 03 */  0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, /* ^C */
+/* 04 */  0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, /* ^D */
+/* 05 */  0x00, 0x18, 0x3c, 0xe7, 0xe7, 0x3c, 0x18, 0x00, /* ^E */
+/* 06 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 07 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 08 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 09 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 0A */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 0B */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 0C */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 0D */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 0E */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 0F */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 10 */  0x00, 0x60, 0x78, 0x7e, 0x7e, 0x78, 0x60, 0x00, /* |> */
+/* 11 */  0x00, 0x06, 0x1e, 0x7e, 0x7e, 0x1e, 0x06, 0x00, /* <| */
+/* 12 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 13 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 14 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 15 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 16 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 17 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 18 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 19 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 1A */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 1B */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 1C */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 1D */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 1E */  0x00, 0x18, 0x18, 0x3c, 0x3c, 0x7e, 0x7e, 0x00, /* /\ */
+/* 1F */  0x00, 0x7e, 0x7e, 0x3c, 0x3c, 0x18, 0x18, 0x00, /* \/ */
+/* 20 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*	 */
+/* 21 */  0x18, 0x3c, 0x3c, 0x18, 0x18, 0x00, 0x18, 0x00, /* ! */
+/* 22 */  0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, /* " */
+/* 23 */  0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00, /* # */
+/* 24 */  0x0C, 0x3F, 0x68, 0x3E, 0x0B, 0x7E, 0x18, 0x00, /* $ */
+/* 25 */  0x60, 0x66, 0x0C, 0x18, 0x30, 0x66, 0x06, 0x00, /* % */
+/* 26 */  0x38, 0x6C, 0x6C, 0x38, 0x6D, 0x66, 0x3B, 0x00, /* & */
+/* 27 */  0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, /* ' */
+/* 28 */  0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, /* ( */
+/* 29 */  0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, /* ) */
+/* 2A */  0x00, 0x18, 0x7E, 0x3C, 0x7E, 0x18, 0x00, 0x00, /* * */
+/* 2B */  0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, /* + */
+/* 2C */  0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, /* , */
+/* 2D */  0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, /* - */
+/* 2E */  0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, /* . */
+/* 2F */  0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, /* / */
+/* 30 */  0x3C, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x3C, 0x00, /* 0 */
+/* 31 */  0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, /* 1 */
+/* 32 */  0x3C, 0x66, 0x06, 0x0C, 0x18, 0x30, 0x7E, 0x00, /* 2 */
+/* 33 */  0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C, 0x00, /* 3 */
+/* 34 */  0x0C, 0x1C, 0x3C, 0x6C, 0x7E, 0x0C, 0x0C, 0x00, /* 4 */
+/* 35 */  0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C, 0x00, /* 5 */
+/* 36 */  0x1C, 0x30, 0x60, 0x7C, 0x66, 0x66, 0x3C, 0x00, /* 6 */
+/* 37 */  0x7E, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, /* 7 */
+/* 38 */  0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, /* 8 */
+/* 39 */  0x3C, 0x66, 0x66, 0x3E, 0x06, 0x0C, 0x38, 0x00, /* 9 */
+/* 3A */  0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, /* : */
+/* 3B */  0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30, /* ; */
+/* 3C */  0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, /* < */
+/* 3D */  0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, /* = */ 
+/* 3E */  0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, /* > */
+/* 3F */  0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00, /* ? */
+/* 40 */  0x3C, 0x66, 0x6E, 0x6A, 0x6E, 0x60, 0x3C, 0x00, /* @ */
+/* 41 */  0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, /* A */
+/* 42 */  0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00, /* B */
+/* 43 */  0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00, /* C */
+/* 44 */  0x78, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0x78, 0x00, /* D */
+/* 45 */  0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x7E, 0x00, /* E */
+/* 46 */  0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x00, /* F */
+/* 47 */  0x3C, 0x66, 0x60, 0x6E, 0x66, 0x66, 0x3C, 0x00, /* G */
+/* 48 */  0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, /* H */
+/* 49 */  0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, /* I */
+/* 4A */  0x3E, 0x0C, 0x0C, 0x0C, 0x0C, 0x6C, 0x38, 0x00, /* J */
+/* 4B */  0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66, 0x00, /* K */
+/* 4C */  0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00, /* L */
+/* 4D */  0x63, 0x77, 0x7F, 0x6B, 0x6B, 0x63, 0x63, 0x00, /* M */
+/* 4E */  0x66, 0x66, 0x76, 0x7E, 0x6E, 0x66, 0x66, 0x00, /* N */
+/* 4F */  0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, /* O */
+/* 50 */  0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x00, /* P */
+/* 51 */  0x3C, 0x66, 0x66, 0x66, 0x6A, 0x6C, 0x36, 0x00, /* Q */
+/* 52 */  0x7C, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x00, /* R */
+/* 53 */  0x3C, 0x66, 0x60, 0x3C, 0x06, 0x66, 0x3C, 0x00, /* S */
+/* 54 */  0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, /* T */
+/* 55 */  0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, /* U */
+/* 56 */  0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, /* V */
+/* 57 */  0x63, 0x63, 0x6B, 0x6B, 0x7F, 0x77, 0x63, 0x00, /* W */
+/* 58 */  0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, /* X */
+/* 59 */  0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, /* Y */
+/* 5A */  0x7E, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x7E, 0x00, /* Z */
+/* 5B */  0x7C, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7C, 0x00, /* [ */
+/* 5C */  0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, /* \ */
+/* 5D */  0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3E, 0x00, /* ] */
+/* 5E */  0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ^ */
+/* 5F */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, /* _ */
+/* 60 */  0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ` */
+/* 61 */  0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, /* a */
+/* 62 */  0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x7C, 0x00, /* b */
+/* 63 */  0x00, 0x00, 0x3C, 0x66, 0x60, 0x66, 0x3C, 0x00, /* c */
+/* 64 */  0x06, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x3E, 0x00, /* d */
+/* 65 */  0x00, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, /* e */
+/* 66 */  0x1C, 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x00, /* f */
+/* 67 */  0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x3C, /* g */
+/* 68 */  0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00, /* h */
+/* 69 */  0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, /* i */
+/* 6A */  0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x70, /* j */
+/* 6B */  0x60, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0x00, /* k */
+/* 6C */  0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, /* l */
+/* 6D */  0x00, 0x00, 0x36, 0x7F, 0x6B, 0x6B, 0x63, 0x00, /* m */
+/* 6E */  0x00, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00, /* n */
+/* 6F */  0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, /* o */
+/* 70 */  0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, /* p */
+/* 71 */  0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x07, /* q */
+/* 72 */  0x00, 0x00, 0x6C, 0x76, 0x60, 0x60, 0x60, 0x00, /* r */
+/* 73 */  0x00, 0x00, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x00, /* s */
+/* 74 */  0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x1C, 0x00, /* t */
+/* 75 */  0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, /* u */
+/* 76 */  0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, /* v */
+/* 77 */  0x00, 0x00, 0x63, 0x6B, 0x6B, 0x7F, 0x36, 0x00, /* w */
+/* 78 */  0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00, /* x */
+/* 79 */  0x00, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x06, 0x3C, /* y */
+/* 7A */  0x00, 0x00, 0x7E, 0x0C, 0x18, 0x30, 0x7E, 0x00, /* z */
+/* 7B */  0x0C, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0C, 0x00, /* { */
+/* 7C */  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, /* | */
+/* 7D */  0x30, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x30, 0x00, /* } */
+/* 7E */  0x31, 0x6B, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, /* ~ */
+/* 7F */  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,  /*  */
+/* 80 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 81 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 82 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 83 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 84 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 85 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 86 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 87 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 88 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 89 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 8A */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 8B */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 8C */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 8D */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 8E */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 8F */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 90 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 91 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 92 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 93 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 94 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 95 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 96 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 97 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 98 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 99 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 9A */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 9B */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 9C */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 9D */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 9E */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* 9F */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A0 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A1 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A2 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A3 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A4 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A5 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A6 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A7 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A8 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* A9 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* AA */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* AB */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* AC */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* AD */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* AE */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* AF */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* B0 */  0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
+/* B1 */  0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
+/* B2 */  0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
+/* B3 */  0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+/* B4 */  0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
+/* B5 */  0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18,
+/* B6 */  0x66, 0x66, 0x66, 0xe6, 0x66, 0x66, 0x66, 0x66,
+/* B7 */  0x00, 0x00, 0x00, 0xfe, 0x66, 0x66, 0x66, 0x66,
+/* B8 */  0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18,
+/* B9 */  0x66, 0x66, 0xe6, 0x06, 0xe6, 0x66, 0x66, 0x66,
+/* BA */  0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+/* BB */  0x00, 0x00, 0xfe, 0x06, 0xe6, 0x66, 0x66, 0x66,
+/* BC */  0x66, 0x66, 0xe6, 0x06, 0xfe, 0x00, 0x00, 0x00,
+/* BD */  0x66, 0x66, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
+/* BE */  0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00,
+/* BF */  0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18,
+/* C0 */  0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
+/* C1 */  0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00,
+/* C2 */  0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18,
+/* C3 */  0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
+/* C4 */  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+/* C5 */  0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
+/* C6 */  0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18,
+/* C7 */  0x66, 0x66, 0x66, 0x67, 0x66, 0x66, 0x66, 0x66,
+/* C8 */  0x66, 0x66, 0x67, 0x60, 0x7f, 0x00, 0x00, 0x00,
+/* C9 */  0x00, 0x00, 0x7f, 0x60, 0x67, 0x66, 0x66, 0x66,
+/* CA */  0x66, 0x66, 0xe7, 0x00, 0xff, 0x00, 0x00, 0x00,
+/* CB */  0x00, 0x00, 0xff, 0x00, 0xe7, 0x66, 0x66, 0x66,
+/* CC */  0x66, 0x66, 0x67, 0x60, 0x67, 0x66, 0x66, 0x66,
+/* CD */  0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
+/* CE */  0x66, 0x66, 0xe7, 0x00, 0xe7, 0x66, 0x66, 0x66,
+/* CF */  0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
+/* D0 */  0x66, 0x66, 0x66, 0xff, 0x00, 0x00, 0x00, 0x00,
+/* D1 */  0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18,
+/* D2 */  0x00, 0x00, 0x00, 0xff, 0x66, 0x66, 0x66, 0x66,
+/* D3 */  0x66, 0x66, 0x66, 0x7f, 0x00, 0x00, 0x00, 0x00,
+/* D4 */  0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00,
+/* D5 */  0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18,
+/* D6 */  0x00, 0x00, 0x00, 0x7f, 0x66, 0x66, 0x66, 0x66,
+/* D7 */  0x66, 0x66, 0x66, 0xff, 0x66, 0x66, 0x66, 0x66,
+/* D8 */  0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18,
+/* D9 */  0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00,
+/* DA */  0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18,
+/* DB */  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+/* DC */  0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+/* DD */  0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
+/* DE */  0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
+/* DF */  0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+/* E0 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* E1 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* E2 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* E3 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* E4 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* E5 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* E6 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* E7 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* E8 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* E9 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* EA */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* EB */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* EC */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* ED */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* EE */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* EF */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F0 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F1 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F2 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F3 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F4 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F5 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F6 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F7 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F8 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* F9 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* FA */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* FB */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* FC */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* FD */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* FE */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+/* FF */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+struct fbcon_font_desc font_acorn_8x8 = {
+	ACORN8x8_IDX,
+	"Acorn8x8",
+	8,
+	8,
+	acorndata_8x8,
+#ifdef CONFIG_ARCH_ACORN
+	20
+#else
+	0
+#endif
+};
diff -u --recursive --new-file v2.1.110/linux/drivers/video/font_pearl_8x8.c linux/drivers/video/font_pearl_8x8.c
--- v2.1.110/linux/drivers/video/font_pearl_8x8.c	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/font_pearl_8x8.c	Tue Jul 21 10:28:24 1998
@@ -0,0 +1,2587 @@
+/**********************************************/
+/*                                            */
+/*       Font file generated by cpi2fnt       */
+/*       ------------------------------       */
+/*       Combined with the alpha-numeric      */
+/*       portion of Greg Harp's old PEARL     */
+/*       font (from earlier versions of       */
+/*       linux-m86k) by John Shifflett        */
+/*                                            */
+/**********************************************/
+
+#include "font.h"
+
+#define FONTDATAMAX 2048
+
+static unsigned char fontdata_pearl8x8[FONTDATAMAX] = {
+
+   /* 0 0x00 '^@' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 1 0x01 '^A' */
+   0x7e, /* 01111110 */
+   0x81, /* 10000001 */
+   0xa5, /* 10100101 */
+   0x81, /* 10000001 */
+   0xbd, /* 10111101 */
+   0x99, /* 10011001 */
+   0x81, /* 10000001 */
+   0x7e, /* 01111110 */
+
+   /* 2 0x02 '^B' */
+   0x7e, /* 01111110 */
+   0xff, /* 11111111 */
+   0xdb, /* 11011011 */
+   0xff, /* 11111111 */
+   0xc3, /* 11000011 */
+   0xe7, /* 11100111 */
+   0xff, /* 11111111 */
+   0x7e, /* 01111110 */
+
+   /* 3 0x03 '^C' */
+   0x6c, /* 01101100 */
+   0xfe, /* 11111110 */
+   0xfe, /* 11111110 */
+   0xfe, /* 11111110 */
+   0x7c, /* 01111100 */
+   0x38, /* 00111000 */
+   0x10, /* 00010000 */
+   0x00, /* 00000000 */
+
+   /* 4 0x04 '^D' */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x7c, /* 01111100 */
+   0xfe, /* 11111110 */
+   0x7c, /* 01111100 */
+   0x38, /* 00111000 */
+   0x10, /* 00010000 */
+   0x00, /* 00000000 */
+
+   /* 5 0x05 '^E' */
+   0x38, /* 00111000 */
+   0x7c, /* 01111100 */
+   0x38, /* 00111000 */
+   0xfe, /* 11111110 */
+   0xfe, /* 11111110 */
+   0xd6, /* 11010110 */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+
+   /* 6 0x06 '^F' */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x7c, /* 01111100 */
+   0xfe, /* 11111110 */
+   0xfe, /* 11111110 */
+   0x7c, /* 01111100 */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+
+   /* 7 0x07 '^G' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 8 0x08 '^H' */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xe7, /* 11100111 */
+   0xc3, /* 11000011 */
+   0xc3, /* 11000011 */
+   0xe7, /* 11100111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+
+   /* 9 0x09 '^I' */
+   0x00, /* 00000000 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x42, /* 01000010 */
+   0x42, /* 01000010 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 10 0x0a '^J' */
+   0xff, /* 11111111 */
+   0xc3, /* 11000011 */
+   0x99, /* 10011001 */
+   0xbd, /* 10111101 */
+   0xbd, /* 10111101 */
+   0x99, /* 10011001 */
+   0xc3, /* 11000011 */
+   0xff, /* 11111111 */
+
+   /* 11 0x0b '^K' */
+   0x0f, /* 00001111 */
+   0x07, /* 00000111 */
+   0x0f, /* 00001111 */
+   0x7d, /* 01111101 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x78, /* 01111000 */
+
+   /* 12 0x0c '^L' */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+
+   /* 13 0x0d '^M' */
+   0x3f, /* 00111111 */
+   0x33, /* 00110011 */
+   0x3f, /* 00111111 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x70, /* 01110000 */
+   0xf0, /* 11110000 */
+   0xe0, /* 11100000 */
+
+   /* 14 0x0e '^N' */
+   0x7f, /* 01111111 */
+   0x63, /* 01100011 */
+   0x7f, /* 01111111 */
+   0x63, /* 01100011 */
+   0x63, /* 01100011 */
+   0x67, /* 01100111 */
+   0xe6, /* 11100110 */
+   0xc0, /* 11000000 */
+
+   /* 15 0x0f '^O' */
+   0x18, /* 00011000 */
+   0xdb, /* 11011011 */
+   0x3c, /* 00111100 */
+   0xe7, /* 11100111 */
+   0xe7, /* 11100111 */
+   0x3c, /* 00111100 */
+   0xdb, /* 11011011 */
+   0x18, /* 00011000 */
+
+   /* 16 0x10 '^P' */
+   0x80, /* 10000000 */
+   0xe0, /* 11100000 */
+   0xf8, /* 11111000 */
+   0xfe, /* 11111110 */
+   0xf8, /* 11111000 */
+   0xe0, /* 11100000 */
+   0x80, /* 10000000 */
+   0x00, /* 00000000 */
+
+   /* 17 0x11 '^Q' */
+   0x02, /* 00000010 */
+   0x0e, /* 00001110 */
+   0x3e, /* 00111110 */
+   0xfe, /* 11111110 */
+   0x3e, /* 00111110 */
+   0x0e, /* 00001110 */
+   0x02, /* 00000010 */
+   0x00, /* 00000000 */
+
+   /* 18 0x12 '^R' */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+
+   /* 19 0x13 '^S' */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+
+   /* 20 0x14 '^T' */
+   0x7f, /* 01111111 */
+   0xdb, /* 11011011 */
+   0xdb, /* 11011011 */
+   0x7b, /* 01111011 */
+   0x1b, /* 00011011 */
+   0x1b, /* 00011011 */
+   0x1b, /* 00011011 */
+   0x00, /* 00000000 */
+
+   /* 21 0x15 '^U' */
+   0x3e, /* 00111110 */
+   0x61, /* 01100001 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x86, /* 10000110 */
+   0x7c, /* 01111100 */
+
+   /* 22 0x16 '^V' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x7e, /* 01111110 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 23 0x17 '^W' */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+
+   /* 24 0x18 '^X' */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 25 0x19 '^Y' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 26 0x1a '^Z' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0xfe, /* 11111110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 27 0x1b '^[' */
+   0x00, /* 00000000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xfe, /* 11111110 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 28 0x1c '^\' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 29 0x1d '^]' */
+   0x00, /* 00000000 */
+   0x24, /* 00100100 */
+   0x66, /* 01100110 */
+   0xff, /* 11111111 */
+   0x66, /* 01100110 */
+   0x24, /* 00100100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 30 0x1e '^^' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 31 0x1f '^_' */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0x7e, /* 01111110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 32 0x20 ' ' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 33 0x21 '!' */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 34 0x22 '"' */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 35 0x23 '#' */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0xfe, /* 11111110 */
+   0x6c, /* 01101100 */
+   0xfe, /* 11111110 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x00, /* 00000000 */
+
+   /* 36 0x24 '$' */
+   0x18, /* 00011000 */
+   0x3e, /* 00111110 */
+   0x60, /* 01100000 */
+   0x3c, /* 00111100 */
+   0x06, /* 00000110 */
+   0x7c, /* 01111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 37 0x25 '%' */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xcc, /* 11001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x66, /* 01100110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 38 0x26 '&' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x68, /* 01101000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 39 0x27 ''' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 40 0x28 '(' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+
+   /* 41 0x29 ')' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+
+   /* 42 0x2a '*' */
+   0x00, /* 00000000 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0xff, /* 11111111 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 43 0x2b '+' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 44 0x2c ',' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+
+   /* 45 0x2d '-' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 46 0x2e '.' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 47 0x2f '/' */
+   0x03, /* 00000011 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 48 0x30 '0' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xde, /* 11011110 */
+   0xfe, /* 11111110 */
+   0xf6, /* 11110110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 49 0x31 '1' */
+   0x18, /* 00011000 */
+   0x78, /* 01111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 50 0x32 '2' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 51 0x33 '3' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0x06, /* 00000110 */
+   0x1c, /* 00011100 */
+   0x06, /* 00000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 52 0x34 '4' */
+   0x1c, /* 00011100 */
+   0x3c, /* 00111100 */
+   0x6c, /* 01101100 */
+   0xcc, /* 11001100 */
+   0xfe, /* 11111110 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+
+   /* 53 0x35 '5' */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xfc, /* 11111100 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 54 0x36 '6' */
+   0x38, /* 00111000 */
+   0x60, /* 01100000 */
+   0xc0, /* 11000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 55 0x37 '7' */
+   0xfe, /* 11111110 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0x60, /* 01100000 */
+   0x00, /* 00000000 */
+
+   /* 56 0x38 '8' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 57 0x39 '9' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+
+   /* 58 0x3a ':' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 59 0x3b ';' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+
+   /* 60 0x3c '<' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+
+   /* 61 0x3d '=' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 62 0x3e '>' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+
+   /* 63 0x3f '?' */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 64 0x40 '@' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xde, /* 11011110 */
+   0xde, /* 11011110 */
+   0xde, /* 11011110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 65 0x41 'A' */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 66 0x42 'B' */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 67 0x43 'C' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 68 0x44 'D' */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 69 0x45 'E' */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xf8, /* 11111000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 70 0x46 'F' */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xf8, /* 11111000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 71 0x47 'G' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xce, /* 11001110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 72 0x48 'H' */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 73 0x49 'I' */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 74 0x4a 'J' */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 75 0x4b 'K' */
+   0xc6, /* 11000110 */
+   0xcc, /* 11001100 */
+   0xd8, /* 11011000 */
+   0xf0, /* 11110000 */
+   0xd8, /* 11011000 */
+   0xcc, /* 11001100 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 76 0x4c 'L' */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 77 0x4d 'M' */
+   0x82, /* 10000010 */
+   0xc6, /* 11000110 */
+   0xee, /* 11101110 */
+   0xfe, /* 11111110 */
+   0xd6, /* 11010110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 78 0x4e 'N' */
+   0xc6, /* 11000110 */
+   0xe6, /* 11100110 */
+   0xf6, /* 11110110 */
+   0xde, /* 11011110 */
+   0xce, /* 11001110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 79 0x4f 'O' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 80 0x50 'P' */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 81 0x51 'Q' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xf6, /* 11110110 */
+   0xde, /* 11011110 */
+   0x7c, /* 01111100 */
+   0x06, /* 00000110 */
+
+   /* 82 0x52 'R' */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0xd8, /* 11011000 */
+   0xcc, /* 11001100 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 83 0x53 'S' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0x60, /* 01100000 */
+   0x38, /* 00111000 */
+   0x0c, /* 00001100 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 84 0x54 'T' */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 85 0x55 'U' */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 86 0x56 'V' */
+   0xc3, /* 11000011 */
+   0xc3, /* 11000011 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 87 0x57 'W' */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xd6, /* 11010110 */
+   0xfe, /* 11111110 */
+   0xee, /* 11101110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 88 0x58 'X' */
+   0xc3, /* 11000011 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0xc3, /* 11000011 */
+   0x00, /* 00000000 */
+
+   /* 89 0x59 'Y' */
+   0xc3, /* 11000011 */
+   0xc3, /* 11000011 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 90 0x5a 'Z' */
+   0xfe, /* 11111110 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 91 0x5b '[' */
+   0x3c, /* 00111100 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 92 0x5c '\' */
+   0xc0, /* 11000000 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x06, /* 00000110 */
+   0x03, /* 00000011 */
+   0x00, /* 00000000 */
+
+   /* 93 0x5d ']' */
+   0x3c, /* 00111100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 94 0x5e '^' */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 95 0x5f '_' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+
+   /* 96 0x60 '`' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 97 0x61 'a' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0x06, /* 00000110 */
+   0x7e, /* 01111110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 98 0x62 'b' */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 99 0x63 'c' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 100 0x64 'd' */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x7e, /* 01111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 101 0x65 'e' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 102 0x66 'f' */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x60, /* 01100000 */
+   0xf0, /* 11110000 */
+   0x60, /* 01100000 */
+   0x60, /* 01100000 */
+   0x60, /* 01100000 */
+   0x00, /* 00000000 */
+
+   /* 103 0x67 'g' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x06, /* 00000110 */
+   0x7c, /* 01111100 */
+
+   /* 104 0x68 'h' */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 105 0x69 'i' */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 106 0x6a 'j' */
+   0x06, /* 00000110 */
+   0x00, /* 00000000 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+
+   /* 107 0x6b 'k' */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xcc, /* 11001100 */
+   0xd8, /* 11011000 */
+   0xf0, /* 11110000 */
+   0xd8, /* 11011000 */
+   0xcc, /* 11001100 */
+   0x00, /* 00000000 */
+
+   /* 108 0x6c 'l' */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 109 0x6d 'm' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xec, /* 11101100 */
+   0xfe, /* 11111110 */
+   0xd6, /* 11010110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 110 0x6e 'n' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 111 0x6f 'o' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 112 0x70 'p' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+
+   /* 113 0x71 'q' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+
+   /* 114 0x72 'r' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xdc, /* 11011100 */
+   0xe6, /* 11100110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 115 0x73 's' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x06, /* 00000110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 116 0x74 't' */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x7c, /* 01111100 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x36, /* 00110110 */
+   0x1c, /* 00011100 */
+   0x00, /* 00000000 */
+
+   /* 117 0x75 'u' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 118 0x76 'v' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+
+   /* 119 0x77 'w' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xd6, /* 11010110 */
+   0xfe, /* 11111110 */
+   0x6c, /* 01101100 */
+   0x00, /* 00000000 */
+
+   /* 120 0x78 'x' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 121 0x79 'y' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc3, /* 11000011 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+
+   /* 122 0x7a 'z' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x0c, /* 00001100 */
+   0x38, /* 00111000 */
+   0x60, /* 01100000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 123 0x7b '{' */
+   0x0e, /* 00001110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x70, /* 01110000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x0e, /* 00001110 */
+   0x00, /* 00000000 */
+
+   /* 124 0x7c '|' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 125 0x7d '}' */
+   0x70, /* 01110000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x0e, /* 00001110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x70, /* 01110000 */
+   0x00, /* 00000000 */
+
+   /* 126 0x7e '~' */
+   0x72, /* 01110010 */
+   0x9c, /* 10011100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 127 0x7f '' */
+   0x00, /* 00000000 */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 128 0x80 '€' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x0c, /* 00001100 */
+   0x78, /* 01111000 */
+
+   /* 129 0x81 '�' */
+   0xcc, /* 11001100 */
+   0x00, /* 00000000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 130 0x82 '‚' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 131 0x83 '�' */
+   0x7c, /* 01111100 */
+   0x82, /* 10000010 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 132 0x84 '„' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 133 0x85 '…' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 134 0x86 '†' */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 135 0x87 '‡' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x7e, /* 01111110 */
+   0x0c, /* 00001100 */
+   0x38, /* 00111000 */
+
+   /* 136 0x88 '�' */
+   0x7c, /* 01111100 */
+   0x82, /* 10000010 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 137 0x89 '‰' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 138 0x8a 'Š' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 139 0x8b '‹' */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 140 0x8c 'Ś' */
+   0x7c, /* 01111100 */
+   0x82, /* 10000010 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 141 0x8d 'Ť' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 142 0x8e 'Ž' */
+   0xc6, /* 11000110 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 143 0x8f 'Ź' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 144 0x90 '�' */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xf8, /* 11111000 */
+   0xc0, /* 11000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 145 0x91 '‘' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0xd8, /* 11011000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 146 0x92 '’' */
+   0x3e, /* 00111110 */
+   0x6c, /* 01101100 */
+   0xcc, /* 11001100 */
+   0xfe, /* 11111110 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xce, /* 11001110 */
+   0x00, /* 00000000 */
+
+   /* 147 0x93 '“' */
+   0x7c, /* 01111100 */
+   0x82, /* 10000010 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 148 0x94 '”' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 149 0x95 '•' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 150 0x96 '–' */
+   0x78, /* 01111000 */
+   0x84, /* 10000100 */
+   0x00, /* 00000000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 151 0x97 '—' */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 152 0x98 '�' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x06, /* 00000110 */
+   0xfc, /* 11111100 */
+
+   /* 153 0x99 '™' */
+   0xc6, /* 11000110 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+
+   /* 154 0x9a 'š' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 155 0x9b '›' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 156 0x9c 'ś' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x64, /* 01100100 */
+   0xf0, /* 11110000 */
+   0x60, /* 01100000 */
+   0x66, /* 01100110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 157 0x9d 'ť' */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 158 0x9e 'ž' */
+   0xf8, /* 11111000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xfa, /* 11111010 */
+   0xc6, /* 11000110 */
+   0xcf, /* 11001111 */
+   0xc6, /* 11000110 */
+   0xc7, /* 11000111 */
+
+   /* 159 0x9f 'ź' */
+   0x0e, /* 00001110 */
+   0x1b, /* 00011011 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0xd8, /* 11011000 */
+   0x70, /* 01110000 */
+   0x00, /* 00000000 */
+
+   /* 160 0xa0 ' ' */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 161 0xa1 'ˇ' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 162 0xa2 '˘' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 163 0xa3 'Ł' */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 164 0xa4 '¤' */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x00, /* 00000000 */
+   0xdc, /* 11011100 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+
+   /* 165 0xa5 'Ą' */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x00, /* 00000000 */
+   0xe6, /* 11100110 */
+   0xf6, /* 11110110 */
+   0xde, /* 11011110 */
+   0xce, /* 11001110 */
+   0x00, /* 00000000 */
+
+   /* 166 0xa6 '¦' */
+   0x3c, /* 00111100 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x3e, /* 00111110 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 167 0xa7 '§' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 168 0xa8 '¨' */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x63, /* 01100011 */
+   0x3e, /* 00111110 */
+   0x00, /* 00000000 */
+
+   /* 169 0xa9 '©' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 170 0xaa 'Ş' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 171 0xab '«' */
+   0x63, /* 01100011 */
+   0xe6, /* 11100110 */
+   0x6c, /* 01101100 */
+   0x7e, /* 01111110 */
+   0x33, /* 00110011 */
+   0x66, /* 01100110 */
+   0xcc, /* 11001100 */
+   0x0f, /* 00001111 */
+
+   /* 172 0xac '¬' */
+   0x63, /* 01100011 */
+   0xe6, /* 11100110 */
+   0x6c, /* 01101100 */
+   0x7a, /* 01111010 */
+   0x36, /* 00110110 */
+   0x6a, /* 01101010 */
+   0xdf, /* 11011111 */
+   0x06, /* 00000110 */
+
+   /* 173 0xad '­' */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 174 0xae '®' */
+   0x00, /* 00000000 */
+   0x33, /* 00110011 */
+   0x66, /* 01100110 */
+   0xcc, /* 11001100 */
+   0x66, /* 01100110 */
+   0x33, /* 00110011 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 175 0xaf 'Ż' */
+   0x00, /* 00000000 */
+   0xcc, /* 11001100 */
+   0x66, /* 01100110 */
+   0x33, /* 00110011 */
+   0x66, /* 01100110 */
+   0xcc, /* 11001100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 176 0xb0 '°' */
+   0x22, /* 00100010 */
+   0x88, /* 10001000 */
+   0x22, /* 00100010 */
+   0x88, /* 10001000 */
+   0x22, /* 00100010 */
+   0x88, /* 10001000 */
+   0x22, /* 00100010 */
+   0x88, /* 10001000 */
+
+   /* 177 0xb1 '±' */
+   0x55, /* 01010101 */
+   0xaa, /* 10101010 */
+   0x55, /* 01010101 */
+   0xaa, /* 10101010 */
+   0x55, /* 01010101 */
+   0xaa, /* 10101010 */
+   0x55, /* 01010101 */
+   0xaa, /* 10101010 */
+
+   /* 178 0xb2 '˛' */
+   0x77, /* 01110111 */
+   0xdd, /* 11011101 */
+   0x77, /* 01110111 */
+   0xdd, /* 11011101 */
+   0x77, /* 01110111 */
+   0xdd, /* 11011101 */
+   0x77, /* 01110111 */
+   0xdd, /* 11011101 */
+
+   /* 179 0xb3 'ł' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 180 0xb4 '´' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 181 0xb5 'µ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 182 0xb6 '¶' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf6, /* 11110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 183 0xb7 '·' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 184 0xb8 '¸' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 185 0xb9 'ą' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf6, /* 11110110 */
+   0x06, /* 00000110 */
+   0xf6, /* 11110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 186 0xba 'ş' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 187 0xbb '»' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x06, /* 00000110 */
+   0xf6, /* 11110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 188 0xbc 'Ľ' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf6, /* 11110110 */
+   0x06, /* 00000110 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 189 0xbd '˝' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 190 0xbe 'ľ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 191 0xbf 'ż' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 192 0xc0 'Ŕ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 193 0xc1 'Á' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 194 0xc2 'Â' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 195 0xc3 'Ă' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 196 0xc4 'Ä' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 197 0xc5 'Ĺ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 198 0xc6 'Ć' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 199 0xc7 'Ç' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x37, /* 00110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 200 0xc8 'Č' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x37, /* 00110111 */
+   0x30, /* 00110000 */
+   0x3f, /* 00111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 201 0xc9 'É' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x3f, /* 00111111 */
+   0x30, /* 00110000 */
+   0x37, /* 00110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 202 0xca 'Ę' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf7, /* 11110111 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 203 0xcb 'Ë' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0xf7, /* 11110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 204 0xcc 'Ě' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x37, /* 00110111 */
+   0x30, /* 00110000 */
+   0x37, /* 00110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 205 0xcd 'Í' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 206 0xce 'Î' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf7, /* 11110111 */
+   0x00, /* 00000000 */
+   0xf7, /* 11110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 207 0xcf 'Ď' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 208 0xd0 'Đ' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 209 0xd1 'Ń' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 210 0xd2 'Ň' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 211 0xd3 'Ó' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x3f, /* 00111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 212 0xd4 'Ô' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 213 0xd5 'Ő' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 214 0xd6 'Ö' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x3f, /* 00111111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 215 0xd7 '×' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xff, /* 11111111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 216 0xd8 'Ř' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 217 0xd9 'Ů' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 218 0xda 'Ú' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 219 0xdb 'Ű' */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+
+   /* 220 0xdc 'Ü' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+
+   /* 221 0xdd 'Ý' */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+
+   /* 222 0xde 'Ţ' */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+
+   /* 223 0xdf 'ß' */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 224 0xe0 'ŕ' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0xc8, /* 11001000 */
+   0xdc, /* 11011100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 225 0xe1 'á' */
+   0x78, /* 01111000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xd8, /* 11011000 */
+   0xcc, /* 11001100 */
+   0xc6, /* 11000110 */
+   0xcc, /* 11001100 */
+   0x00, /* 00000000 */
+
+   /* 226 0xe2 'â' */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 227 0xe3 'ă' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x00, /* 00000000 */
+
+   /* 228 0xe4 'ä' */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 229 0xe5 'ĺ' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xd8, /* 11011000 */
+   0xd8, /* 11011000 */
+   0xd8, /* 11011000 */
+   0x70, /* 01110000 */
+   0x00, /* 00000000 */
+
+   /* 230 0xe6 'ć' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x7c, /* 01111100 */
+   0xc0, /* 11000000 */
+
+   /* 231 0xe7 'ç' */
+   0x00, /* 00000000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 232 0xe8 'č' */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+
+   /* 233 0xe9 'é' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+
+   /* 234 0xea 'ę' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0xee, /* 11101110 */
+   0x00, /* 00000000 */
+
+   /* 235 0xeb 'ë' */
+   0x0e, /* 00001110 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x3e, /* 00111110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 236 0xec 'ě' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xdb, /* 11011011 */
+   0xdb, /* 11011011 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 237 0xed 'í' */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x7e, /* 01111110 */
+   0xdb, /* 11011011 */
+   0xdb, /* 11011011 */
+   0x7e, /* 01111110 */
+   0x60, /* 01100000 */
+   0xc0, /* 11000000 */
+
+   /* 238 0xee 'î' */
+   0x1e, /* 00011110 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0x7e, /* 01111110 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x1e, /* 00011110 */
+   0x00, /* 00000000 */
+
+   /* 239 0xef 'ď' */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 240 0xf0 'đ' */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 241 0xf1 'ń' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 242 0xf2 'ň' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 243 0xf3 'ó' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 244 0xf4 'ô' */
+   0x0e, /* 00001110 */
+   0x1b, /* 00011011 */
+   0x1b, /* 00011011 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 245 0xf5 'ő' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xd8, /* 11011000 */
+   0xd8, /* 11011000 */
+   0x70, /* 01110000 */
+
+   /* 246 0xf6 'ö' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 247 0xf7 '÷' */
+   0x00, /* 00000000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x00, /* 00000000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 248 0xf8 'ř' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 249 0xf9 'ů' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 250 0xfa 'ú' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 251 0xfb 'ű' */
+   0x0f, /* 00001111 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0xec, /* 11101100 */
+   0x6c, /* 01101100 */
+   0x3c, /* 00111100 */
+   0x1c, /* 00011100 */
+
+   /* 252 0xfc 'ü' */
+   0x6c, /* 01101100 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 253 0xfd 'ý' */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 254 0xfe 'ţ' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 255 0xff '˙' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+};
+
+struct fbcon_font_desc font_pearl_8x8 = {
+	PEARL8x8_IDX,
+	"PEARL8x8",
+	8,
+	8,
+	fontdata_pearl8x8,
+	2
+};
diff -u --recursive --new-file v2.1.110/linux/drivers/video/font_sun12x22.c linux/drivers/video/font_sun12x22.c
--- v2.1.110/linux/drivers/video/font_sun12x22.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/font_sun12x22.c	Tue Jul 21 10:28:24 1998
@@ -1,11 +1,8 @@
-#define FONTDATAMAX 5632
-
-char fontname_sun12x22[] = "SUN12x22";
+#include "font.h"
 
-int  fontheight_sun12x22 = 22;
-int  fontwidth_sun12x22  = 12;
+#define FONTDATAMAX 5632
 
-unsigned short fontdata_sun12x22[FONTDATAMAX] = {
+static unsigned short fontdata_sun12x22[FONTDATAMAX] = {
 
 	/* 0 0x00 '^@' */
 	0x0000, /* 000000000000 */
@@ -6208,3 +6205,16 @@
 
 };
 
+
+struct fbcon_font_desc font_sun_12x22 = {
+	SUN12x22_IDX,
+	"SUN12x22",
+	12,
+	22,
+	fontdata_sun12x22,
+#ifdef __sparc__
+	5
+#else
+	-1
+#endif
+};
diff -u --recursive --new-file v2.1.110/linux/drivers/video/font_sun8x16.c linux/drivers/video/font_sun8x16.c
--- v2.1.110/linux/drivers/video/font_sun8x16.c	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/font_sun8x16.c	Tue Jul 21 10:28:24 1998
@@ -1,11 +1,8 @@
-#define FONTDATAMAX 4096
-
-char fontname_sun8x16[] = "SUN8x16";
+#include "font.h"
 
-int  fontheight_sun8x16 = 16;
-int  fontwidth_sun8x16  = 8;
+#define FONTDATAMAX 4096
 
-unsigned char fontdata_sun8x16[FONTDATAMAX] = {
+static unsigned char fontdata_sun8x16[FONTDATAMAX] = {
 /* */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 /* */ 0x00,0x00,0x7e,0x81,0xa5,0x81,0x81,0xbd,0x99,0x81,0x81,0x7e,0x00,0x00,0x00,0x00,
 /* */ 0x00,0x00,0x7e,0xff,0xdb,0xff,0xff,0xc3,0xe7,0xff,0xff,0x7e,0x00,0x00,0x00,0x00,
@@ -262,4 +259,17 @@
 /* */ 0x00,0x70,0xd8,0x30,0x60,0xc8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 /* */ 0x00,0x00,0x00,0x00,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x00,0x00,0x00,0x00,0x00,
 /* */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+struct fbcon_font_desc font_sun_8x16 = {
+	SUN8x16_IDX,
+	"SUN8x16",
+	8,
+	16,
+	fontdata_sun8x16,
+#ifdef __sparc__
+	10
+#else
+	-1
+#endif
 };
diff -u --recursive --new-file v2.1.110/linux/drivers/video/fonts.c linux/drivers/video/fonts.c
--- v2.1.110/linux/drivers/video/fonts.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/fonts.c	Tue Jul 21 10:28:24 1998
@@ -2,6 +2,7 @@
  * linux/drivers/video/fonts.c -- `Soft' font definitions
  *
  *    Created 1995 by Geert Uytterhoeven
+ *    Rewritten 1998 by Martin Mares <mj@ucw.cz>
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file COPYING in the main directory of this archive
@@ -17,99 +18,61 @@
 #endif
 #include "font.h"
 
+#define NO_FONTS
 
-   /*
-    *    External Font Definitions
-    */
-
-/* VGA8x8 */
-extern char fontname_8x8[];
-extern int fontwidth_8x8, fontheight_8x8;
-extern u8 fontdata_8x8[];
-
-/* VGA8x16 */
-extern char fontname_8x16[];
-extern int fontwidth_8x16, fontheight_8x16;
-extern u8 fontdata_8x16[];
-
-/* PEARL8x8 */
-extern char fontname_pearl8x8[];
-extern int fontwidth_pearl8x8, fontheight_pearl8x8;
-extern u8 fontdata_pearl8x8[];
-
-/* VGA6x11 */
-extern char fontname_6x11[];
-extern int fontwidth_6x11, fontheight_6x11;
-extern u8 fontdata_6x11[];
-
-/* SUN8x16 */
-extern char fontname_sun8x16[];
-extern int fontwidth_sun8x16, fontheight_sun8x16;
-extern u8 fontdata_sun8x16[];
-
-/* SUN12x22 */
-extern char fontname_sun12x22[];
-extern int fontwidth_sun12x22, fontheight_sun12x22;
-extern u8 fontdata_sun12x22[];
-
-
-
-   /*
-    *    Font Descriptor Array
-    */
-
-struct softfontdesc {
-   int idx;
-   char *name;
-   int *width;
-   int *height;
-   u8 *data;
-};
-
-#define VGA8x8_IDX	0
-#define VGA8x16_IDX	1
-#define PEARL8x8_IDX	2
-#define VGA6x11_IDX	3
-#define SUN8x16_IDX	4
-#define SUN12x22_IDX	5
-
-static struct softfontdesc softfonts[] = {
-   { VGA8x8_IDX, fontname_8x8, &fontwidth_8x8, &fontheight_8x8, fontdata_8x8 },
-#ifndef __sparc__
-   { VGA8x16_IDX, fontname_8x16, &fontwidth_8x16, &fontheight_8x16, fontdata_8x16 },
-   { PEARL8x8_IDX, fontname_pearl8x8, &fontwidth_pearl8x8, &fontheight_pearl8x8,
-     fontdata_pearl8x8 },
-   { VGA6x11_IDX, fontname_6x11, &fontwidth_6x11, &fontheight_6x11, fontdata_6x11 },
-#else
-   { SUN8x16_IDX, fontname_sun8x16, &fontwidth_sun8x16, &fontheight_sun8x16, 
-     fontdata_sun8x16 },
-   { SUN12x22_IDX, fontname_sun12x22, &fontwidth_sun12x22, &fontheight_sun12x22, 
-     fontdata_sun12x22 },
+static struct fbcon_font_desc *fbcon_fonts[] = {
+#ifdef CONFIG_FONT_8x8
+#undef NO_FONTS
+    &font_vga_8x8,
+#endif
+#ifdef CONFIG_FONT_8x16
+#undef NO_FONTS
+    &font_vga_8x16,
+#endif
+#ifdef CONFIG_FONT_6x11
+#if !defined(CONFIG_MAC) && !defined(CONFIG_FB_SBUS)
+#undef NO_FONTS
+#endif
+    &font_vga_6x11,
+#endif
+#ifdef CONFIG_FONT_SUN8x16
+#undef NO_FONTS
+    &font_sun_8x16,
+#endif
+#ifdef CONFIG_FONT_SUN12x22
+#if !defined(CONFIG_FB_SBUS) && !defined(CONFIG_FBCON_CFB8)
+#undef NO_FONTS
+#endif
+    &font_sun_12x22,
+#endif
+#ifdef CONFIG_FONT_ACORN_8x8
+#undef NO_FONTS
+    &font_acorn_8x8,
+#endif
+#ifdef CONFIG_FONT_PEARL_8x8
+#undef NO_FONTS
+    &font_pearl_8x8,
 #endif
 };
 
-static unsigned int numsoftfonts = sizeof(softfonts)/sizeof(*softfonts);
+#define num_fonts (sizeof(fbcon_fonts)/sizeof(*fbcon_fonts))
 
+#ifdef NO_FONTS
+#error No fonts configured.
+#endif
 
    /*
     *    Find a font with a specific name
     */
 
-int findsoftfont(char *name, unsigned short *width, unsigned short *height, u8 *data[])
+struct fbcon_font_desc *fbcon_find_font(char *name)
 {
    unsigned int i;
 
-   for (i = 0; i < numsoftfonts; i++)
-      if (!strcmp(softfonts[i].name, name)) {
-         if (width)
-            *width = *softfonts[i].width;
-         if (height)
-            *height = *softfonts[i].height;
-         if (data)
-            *data = softfonts[i].data;
-			return(1);
-      }
-	return(0);
+   for (i = 0; i < num_fonts; i++)
+      if (!strcmp(fbcon_fonts[i]->name, name))
+	  return fbcon_fonts[i];
+   return NULL;
 }
 
 
@@ -117,44 +80,32 @@
     *    Get the default font for a specific screen size
     */
 
-void getdefaultfont(int xres, int yres, char *name[], unsigned short *width, unsigned short *height,
-                    u8 *data[])
+struct fbcon_font_desc *fbcon_get_default_font(int xres, int yres)
 {
-    int i, j;
-    
-    if (yres < 400) {
-	i = VGA8x8_IDX;
-#ifdef CONFIG_AMIGA
-	if (MACH_IS_AMIGA)
-	    i = PEARL8x8_IDX;
-#endif
-    } else
-	i = VGA8x16_IDX;
-
-#if defined(CONFIG_MAC)
-    if (MACH_IS_MAC) {
-#if 0  /* MSch: removed until 6x11 is debugged */
-        i = VGA6x11_IDX;   /* I added this for fun ... I like 6x11 */
-#endif
-       if (xres < 640)
-           i = VGA6x11_IDX;
-    }
-#endif
+    int i, c, cc;
+    struct fbcon_font_desc *f, *g;
 
-#ifdef __sparc__
-    i = SUN8x16_IDX;
-#endif
-
-    for (j = 0; j < numsoftfonts; j++)
-        if (softfonts[j].idx == i)
-            break;
-
-    if (name)
-	*name = softfonts[j].name;
-    if (width)
-	*width = *softfonts[j].width;
-    if (height)
-	*height = *softfonts[j].height;
-    if (data)
-	*data = softfonts[j].data;
+    g = NULL;
+    cc = -10000;
+    for(i=0; i<num_fonts; i++) {
+	f = fbcon_fonts[i];
+	c = f->pref;
+#ifdef __mc68000__
+#ifdef CONFIG_FONT_PEARL_8x8
+	if (MACH_IS_AMIGA && f->idx == PEARL8x8_IDX)
+	    c = 100;
+#endif
+#ifdef CONFIG_FONT_6x11
+	if (MACH_IS_MAC && xres < 640 && f->idx == VGA6x11_IDX)
+	    c = 100;
+#endif
+#endif
+	if ((yres < 400) == (f->height <= 8))
+	    c += 1000;
+	if (c > cc) {
+	    cc = c;
+	    g = f;
+	}
+    }
+    return g;
 }
diff -u --recursive --new-file v2.1.110/linux/drivers/video/macfb.c linux/drivers/video/macfb.c
--- v2.1.110/linux/drivers/video/macfb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/macfb.c	Wed Jul 22 13:45:52 1998
@@ -2,7 +2,6 @@
  *	We've been given MAC frame buffer info by the booter. Now go set it up
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
@@ -217,22 +216,22 @@
 	display->inverse = inverse;
 
 	switch (mac_depth) {
-#ifdef CONFIG_FBCON_MFB
+#ifdef FBCON_HAS_MFB
 	    case 1:
 		display->dispsw = &fbcon_mfb;
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB2
+#ifdef FBCON_HAS_CFB2
 	    case 2:
 		display->dispsw = &fbcon_cfb2;
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB4
+#ifdef FBCON_HAS_CFB4
 	    case 4:
 		display->dispsw = &fbcon_cfb4;
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 	    case 8:
 		display->dispsw = &fbcon_cfb8;
 		break;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/macmodes.c linux/drivers/video/macmodes.c
--- v2.1.110/linux/drivers/video/macmodes.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/macmodes.c	Wed Jul 22 13:40:04 1998
@@ -12,40 +12,8 @@
 #include <linux/tty.h>
 #include <linux/fb.h>
 #include <linux/string.h>
-#include <asm/vc_ioctl.h>
-
-
-    /*
-     *  Video mode values.
-     *  These are supposed to be the same as the values that Apple uses in
-     *  MacOS.
-     */
-
-#define VMODE_512_384_60I	1	/* 512x384, 60Hz interlaced (NTSC) */
-#define VMODE_512_384_60	2	/* 512x384, 60Hz */
-#define VMODE_640_480_50I	3	/* 640x480, 50Hz interlaced (PAL) */
-#define VMODE_640_480_60I	4	/* 640x480, 60Hz interlaced (NTSC) */
-#define VMODE_640_480_60	5	/* 640x480, 60Hz (VGA) */
-#define VMODE_640_480_67	6	/* 640x480, 67Hz */
-#define VMODE_640_870_75P	7	/* 640x870, 75Hz (portrait) */
-#define VMODE_768_576_50I	8	/* 768x576, 50Hz (PAL full frame) */
-#define VMODE_800_600_56	9	/* 800x600, 56Hz */
-#define VMODE_800_600_60	10	/* 800x600, 60Hz */
-#define VMODE_800_600_72	11	/* 800x600, 72Hz */
-#define VMODE_800_600_75	12	/* 800x600, 75Hz */
-#define VMODE_832_624_75	13	/* 832x624, 75Hz */
-#define VMODE_1024_768_60	14	/* 1024x768, 60Hz */
-#define VMODE_1024_768_70	15	/* 1024x768, 70Hz (or 72Hz?) */
-#define VMODE_1024_768_75V	16	/* 1024x768, 75Hz (VESA) */
-#define VMODE_1024_768_75	17	/* 1024x768, 75Hz */
-#define VMODE_1152_870_75	18	/* 1152x870, 75Hz */
-#define VMODE_1280_960_75	19	/* 1280x960, 75Hz */
-#define VMODE_1280_1024_75	20	/* 1280x1024, 75Hz */
-
-#define CMODE_8			0	/* 8 bits/pixel */
-#define CMODE_16		1	/* 16 (actually 15) bits/pixel */
-#define CMODE_32		2	/* 32 (actually 24) bits/pixel */
 
+#include "macmodes.h"
 
 struct mac_mode {
     int number;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/macmodes.h linux/drivers/video/macmodes.h
--- v2.1.110/linux/drivers/video/macmodes.h	Wed Dec 31 16:00:00 1969
+++ linux/drivers/video/macmodes.h	Tue Jul 21 10:28:24 1998
@@ -0,0 +1,52 @@
+/*
+ *  linux/drivers/video/macmodes.h -- Standard MacOS video modes
+ *
+ *	Copyright (C) 1998 Geert Uytterhoeven
+ *
+ *  This file is subject to the terms and conditions of the GNU General Public
+ *  License. See the file COPYING in the main directory of this archive for
+ *  more details.
+ */
+
+
+    /*
+     *  Video mode values.
+     *  These are supposed to be the same as the values that Apple uses in
+     *  MacOS.
+     */
+
+#define VMODE_NVRAM		0
+#define VMODE_512_384_60I	1	/* 512x384, 60Hz interlaced (NTSC) */
+#define VMODE_512_384_60	2	/* 512x384, 60Hz */
+#define VMODE_640_480_50I	3	/* 640x480, 50Hz interlaced (PAL) */
+#define VMODE_640_480_60I	4	/* 640x480, 60Hz interlaced (NTSC) */
+#define VMODE_640_480_60	5	/* 640x480, 60Hz (VGA) */
+#define VMODE_640_480_67	6	/* 640x480, 67Hz */
+#define VMODE_640_870_75P	7	/* 640x870, 75Hz (portrait) */
+#define VMODE_768_576_50I	8	/* 768x576, 50Hz (PAL full frame) */
+#define VMODE_800_600_56	9	/* 800x600, 56Hz */
+#define VMODE_800_600_60	10	/* 800x600, 60Hz */
+#define VMODE_800_600_72	11	/* 800x600, 72Hz */
+#define VMODE_800_600_75	12	/* 800x600, 75Hz */
+#define VMODE_832_624_75	13	/* 832x624, 75Hz */
+#define VMODE_1024_768_60	14	/* 1024x768, 60Hz */
+#define VMODE_1024_768_70	15	/* 1024x768, 70Hz (or 72Hz?) */
+#define VMODE_1024_768_75V	16	/* 1024x768, 75Hz (VESA) */
+#define VMODE_1024_768_75	17	/* 1024x768, 75Hz */
+#define VMODE_1152_870_75	18	/* 1152x870, 75Hz */
+#define VMODE_1280_960_75	19	/* 1280x960, 75Hz */
+#define VMODE_1280_1024_75	20	/* 1280x1024, 75Hz */
+#define VMODE_MAX		20
+#define VMODE_CHOOSE		99
+
+#define CMODE_NVRAM		-1
+#define CMODE_8			0	/* 8 bits/pixel */
+#define CMODE_16		1	/* 16 (actually 15) bits/pixel */
+#define CMODE_32		2	/* 32 (actually 24) bits/pixel */
+
+
+extern int mac_vmode_to_var(int vmode, int cmode,
+			    struct fb_var_screeninfo *var);
+extern int mac_var_to_vmode(const struct fb_var_screeninfo *var, int *vmode,
+			    int *cmode);
+extern int mac_map_monitor_sense(int sense);
diff -u --recursive --new-file v2.1.110/linux/drivers/video/mdafb.c linux/drivers/video/mdafb.c
--- v2.1.110/linux/drivers/video/mdafb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/mdafb.c	Tue Jul 21 10:28:24 1998
@@ -286,7 +286,8 @@
 
 static struct display_switch fbcon_mdafb = {
     fbcon_vga_setup, fbcon_vga_bmove, fbcon_vga_clear, fbcon_vga_putc,
-    fbcon_vga_putcs, fbcon_vga_revc, fbcon_mdafb_cursor, NULL, FONTWIDTH(8)
+    fbcon_vga_putcs, fbcon_vga_revc, fbcon_mdafb_cursor, NULL, NULL,
+    FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/offb.c linux/drivers/video/offb.c
--- v2.1.110/linux/drivers/video/offb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/offb.c	Tue Jul 21 10:28:24 1998
@@ -34,6 +34,7 @@
 
 #include "fbcon.h"
 #include "fbcon-cfb8.h"
+#include "macmodes.h"
 
 
 static int currcon = 0;
@@ -406,7 +407,7 @@
 	disp->line_length = fix->line_length;
 	disp->can_soft_blank = info->cmap_adr ? 1 : 0;
 	disp->inverse = 0;
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 	disp->dispsw = &fbcon_cfb8;
 #else
 	disp->dispsw = NULL;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/pearl_8x8.c linux/drivers/video/pearl_8x8.c
--- v2.1.110/linux/drivers/video/pearl_8x8.c	Tue Sep 16 02:30:10 1997
+++ linux/drivers/video/pearl_8x8.c	Wed Dec 31 16:00:00 1969
@@ -1,2582 +0,0 @@
-/**********************************************/
-/*                                            */
-/*       Font file generated by cpi2fnt       */
-/*       ------------------------------       */
-/*       Combined with the alpha-numeric      */
-/*       portion of Greg Harp's old PEARL     */
-/*       font (from earlier versions of       */
-/*       linux-m86k) by John Shifflett        */
-/*                                            */
-/**********************************************/
-
-#define FONTDATAMAX 2048
-
-char fontname_pearl8x8[] = "PEARL8x8";
-
-int  fontheight_pearl8x8 = 8;
-int  fontwidth_pearl8x8  = 8;
-
-unsigned char fontdata_pearl8x8[FONTDATAMAX] = {
-
-   /* 0 0x00 '^@' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 1 0x01 '^A' */
-   0x7e, /* 01111110 */
-   0x81, /* 10000001 */
-   0xa5, /* 10100101 */
-   0x81, /* 10000001 */
-   0xbd, /* 10111101 */
-   0x99, /* 10011001 */
-   0x81, /* 10000001 */
-   0x7e, /* 01111110 */
-
-   /* 2 0x02 '^B' */
-   0x7e, /* 01111110 */
-   0xff, /* 11111111 */
-   0xdb, /* 11011011 */
-   0xff, /* 11111111 */
-   0xc3, /* 11000011 */
-   0xe7, /* 11100111 */
-   0xff, /* 11111111 */
-   0x7e, /* 01111110 */
-
-   /* 3 0x03 '^C' */
-   0x6c, /* 01101100 */
-   0xfe, /* 11111110 */
-   0xfe, /* 11111110 */
-   0xfe, /* 11111110 */
-   0x7c, /* 01111100 */
-   0x38, /* 00111000 */
-   0x10, /* 00010000 */
-   0x00, /* 00000000 */
-
-   /* 4 0x04 '^D' */
-   0x10, /* 00010000 */
-   0x38, /* 00111000 */
-   0x7c, /* 01111100 */
-   0xfe, /* 11111110 */
-   0x7c, /* 01111100 */
-   0x38, /* 00111000 */
-   0x10, /* 00010000 */
-   0x00, /* 00000000 */
-
-   /* 5 0x05 '^E' */
-   0x38, /* 00111000 */
-   0x7c, /* 01111100 */
-   0x38, /* 00111000 */
-   0xfe, /* 11111110 */
-   0xfe, /* 11111110 */
-   0xd6, /* 11010110 */
-   0x10, /* 00010000 */
-   0x38, /* 00111000 */
-
-   /* 6 0x06 '^F' */
-   0x10, /* 00010000 */
-   0x38, /* 00111000 */
-   0x7c, /* 01111100 */
-   0xfe, /* 11111110 */
-   0xfe, /* 11111110 */
-   0x7c, /* 01111100 */
-   0x10, /* 00010000 */
-   0x38, /* 00111000 */
-
-   /* 7 0x07 '^G' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 8 0x08 '^H' */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xe7, /* 11100111 */
-   0xc3, /* 11000011 */
-   0xc3, /* 11000011 */
-   0xe7, /* 11100111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-
-   /* 9 0x09 '^I' */
-   0x00, /* 00000000 */
-   0x3c, /* 00111100 */
-   0x66, /* 01100110 */
-   0x42, /* 01000010 */
-   0x42, /* 01000010 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x00, /* 00000000 */
-
-   /* 10 0x0a '^J' */
-   0xff, /* 11111111 */
-   0xc3, /* 11000011 */
-   0x99, /* 10011001 */
-   0xbd, /* 10111101 */
-   0xbd, /* 10111101 */
-   0x99, /* 10011001 */
-   0xc3, /* 11000011 */
-   0xff, /* 11111111 */
-
-   /* 11 0x0b '^K' */
-   0x0f, /* 00001111 */
-   0x07, /* 00000111 */
-   0x0f, /* 00001111 */
-   0x7d, /* 01111101 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0x78, /* 01111000 */
-
-   /* 12 0x0c '^L' */
-   0x3c, /* 00111100 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-
-   /* 13 0x0d '^M' */
-   0x3f, /* 00111111 */
-   0x33, /* 00110011 */
-   0x3f, /* 00111111 */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x70, /* 01110000 */
-   0xf0, /* 11110000 */
-   0xe0, /* 11100000 */
-
-   /* 14 0x0e '^N' */
-   0x7f, /* 01111111 */
-   0x63, /* 01100011 */
-   0x7f, /* 01111111 */
-   0x63, /* 01100011 */
-   0x63, /* 01100011 */
-   0x67, /* 01100111 */
-   0xe6, /* 11100110 */
-   0xc0, /* 11000000 */
-
-   /* 15 0x0f '^O' */
-   0x18, /* 00011000 */
-   0xdb, /* 11011011 */
-   0x3c, /* 00111100 */
-   0xe7, /* 11100111 */
-   0xe7, /* 11100111 */
-   0x3c, /* 00111100 */
-   0xdb, /* 11011011 */
-   0x18, /* 00011000 */
-
-   /* 16 0x10 '^P' */
-   0x80, /* 10000000 */
-   0xe0, /* 11100000 */
-   0xf8, /* 11111000 */
-   0xfe, /* 11111110 */
-   0xf8, /* 11111000 */
-   0xe0, /* 11100000 */
-   0x80, /* 10000000 */
-   0x00, /* 00000000 */
-
-   /* 17 0x11 '^Q' */
-   0x02, /* 00000010 */
-   0x0e, /* 00001110 */
-   0x3e, /* 00111110 */
-   0xfe, /* 11111110 */
-   0x3e, /* 00111110 */
-   0x0e, /* 00001110 */
-   0x02, /* 00000010 */
-   0x00, /* 00000000 */
-
-   /* 18 0x12 '^R' */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-
-   /* 19 0x13 '^S' */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x00, /* 00000000 */
-   0x66, /* 01100110 */
-   0x00, /* 00000000 */
-
-   /* 20 0x14 '^T' */
-   0x7f, /* 01111111 */
-   0xdb, /* 11011011 */
-   0xdb, /* 11011011 */
-   0x7b, /* 01111011 */
-   0x1b, /* 00011011 */
-   0x1b, /* 00011011 */
-   0x1b, /* 00011011 */
-   0x00, /* 00000000 */
-
-   /* 21 0x15 '^U' */
-   0x3e, /* 00111110 */
-   0x61, /* 01100001 */
-   0x3c, /* 00111100 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x86, /* 10000110 */
-   0x7c, /* 01111100 */
-
-   /* 22 0x16 '^V' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x7e, /* 01111110 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-
-   /* 23 0x17 '^W' */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0xff, /* 11111111 */
-
-   /* 24 0x18 '^X' */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 25 0x19 '^Y' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 26 0x1a '^Z' */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0xfe, /* 11111110 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 27 0x1b '^[' */
-   0x00, /* 00000000 */
-   0x30, /* 00110000 */
-   0x60, /* 01100000 */
-   0xfe, /* 11111110 */
-   0x60, /* 01100000 */
-   0x30, /* 00110000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 28 0x1c '^\' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 29 0x1d '^]' */
-   0x00, /* 00000000 */
-   0x24, /* 00100100 */
-   0x66, /* 01100110 */
-   0xff, /* 11111111 */
-   0x66, /* 01100110 */
-   0x24, /* 00100100 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 30 0x1e '^^' */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x7e, /* 01111110 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 31 0x1f '^_' */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0x7e, /* 01111110 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 32 0x20 ' ' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 33 0x21 '!' */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x3c, /* 00111100 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 34 0x22 '"' */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 35 0x23 '#' */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0xfe, /* 11111110 */
-   0x6c, /* 01101100 */
-   0xfe, /* 11111110 */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0x00, /* 00000000 */
-
-   /* 36 0x24 '$' */
-   0x18, /* 00011000 */
-   0x3e, /* 00111110 */
-   0x60, /* 01100000 */
-   0x3c, /* 00111100 */
-   0x06, /* 00000110 */
-   0x7c, /* 01111100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 37 0x25 '%' */
-   0x00, /* 00000000 */
-   0xc6, /* 11000110 */
-   0xcc, /* 11001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x66, /* 01100110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 38 0x26 '&' */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0x68, /* 01101000 */
-   0x76, /* 01110110 */
-   0xdc, /* 11011100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 39 0x27 ''' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 40 0x28 '(' */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0x00, /* 00000000 */
-
-   /* 41 0x29 ')' */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0x0c, /* 00001100 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x00, /* 00000000 */
-
-   /* 42 0x2a '*' */
-   0x00, /* 00000000 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0xff, /* 11111111 */
-   0x3c, /* 00111100 */
-   0x66, /* 01100110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 43 0x2b '+' */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 44 0x2c ',' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-
-   /* 45 0x2d '-' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 46 0x2e '.' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 47 0x2f '/' */
-   0x03, /* 00000011 */
-   0x06, /* 00000110 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x60, /* 01100000 */
-   0xc0, /* 11000000 */
-   0x00, /* 00000000 */
-
-   /* 48 0x30 '0' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xde, /* 11011110 */
-   0xfe, /* 11111110 */
-   0xf6, /* 11110110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 49 0x31 '1' */
-   0x18, /* 00011000 */
-   0x78, /* 01111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 50 0x32 '2' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x60, /* 01100000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-
-   /* 51 0x33 '3' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0x06, /* 00000110 */
-   0x1c, /* 00011100 */
-   0x06, /* 00000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 52 0x34 '4' */
-   0x1c, /* 00011100 */
-   0x3c, /* 00111100 */
-   0x6c, /* 01101100 */
-   0xcc, /* 11001100 */
-   0xfe, /* 11111110 */
-   0x0c, /* 00001100 */
-   0x0c, /* 00001100 */
-   0x00, /* 00000000 */
-
-   /* 53 0x35 '5' */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0xfc, /* 11111100 */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 54 0x36 '6' */
-   0x38, /* 00111000 */
-   0x60, /* 01100000 */
-   0xc0, /* 11000000 */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 55 0x37 '7' */
-   0xfe, /* 11111110 */
-   0x06, /* 00000110 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x60, /* 01100000 */
-   0x60, /* 01100000 */
-   0x00, /* 00000000 */
-
-   /* 56 0x38 '8' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 57 0x39 '9' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7e, /* 01111110 */
-   0x06, /* 00000110 */
-   0x0c, /* 00001100 */
-   0x38, /* 00111000 */
-   0x00, /* 00000000 */
-
-   /* 58 0x3a ':' */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 59 0x3b ';' */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-
-   /* 60 0x3c '<' */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x60, /* 01100000 */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0x00, /* 00000000 */
-
-   /* 61 0x3d '=' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 62 0x3e '>' */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0x06, /* 00000110 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x00, /* 00000000 */
-
-   /* 63 0x3f '?' */
-   0x3c, /* 00111100 */
-   0x66, /* 01100110 */
-   0x06, /* 00000110 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 64 0x40 '@' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xde, /* 11011110 */
-   0xde, /* 11011110 */
-   0xde, /* 11011110 */
-   0xc0, /* 11000000 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 65 0x41 'A' */
-   0x10, /* 00010000 */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 66 0x42 'B' */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xfc, /* 11111100 */
-   0x00, /* 00000000 */
-
-   /* 67 0x43 'C' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 68 0x44 'D' */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xfc, /* 11111100 */
-   0x00, /* 00000000 */
-
-   /* 69 0x45 'E' */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xf8, /* 11111000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-
-   /* 70 0x46 'F' */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xf8, /* 11111000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0x00, /* 00000000 */
-
-   /* 71 0x47 'G' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc0, /* 11000000 */
-   0xce, /* 11001110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 72 0x48 'H' */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 73 0x49 'I' */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-
-   /* 74 0x4a 'J' */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 75 0x4b 'K' */
-   0xc6, /* 11000110 */
-   0xcc, /* 11001100 */
-   0xd8, /* 11011000 */
-   0xf0, /* 11110000 */
-   0xd8, /* 11011000 */
-   0xcc, /* 11001100 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 76 0x4c 'L' */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-
-   /* 77 0x4d 'M' */
-   0x82, /* 10000010 */
-   0xc6, /* 11000110 */
-   0xee, /* 11101110 */
-   0xfe, /* 11111110 */
-   0xd6, /* 11010110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 78 0x4e 'N' */
-   0xc6, /* 11000110 */
-   0xe6, /* 11100110 */
-   0xf6, /* 11110110 */
-   0xde, /* 11011110 */
-   0xce, /* 11001110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 79 0x4f 'O' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 80 0x50 'P' */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xfc, /* 11111100 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0x00, /* 00000000 */
-
-   /* 81 0x51 'Q' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xf6, /* 11110110 */
-   0xde, /* 11011110 */
-   0x7c, /* 01111100 */
-   0x06, /* 00000110 */
-
-   /* 82 0x52 'R' */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xfc, /* 11111100 */
-   0xd8, /* 11011000 */
-   0xcc, /* 11001100 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 83 0x53 'S' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0x60, /* 01100000 */
-   0x38, /* 00111000 */
-   0x0c, /* 00001100 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 84 0x54 'T' */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 85 0x55 'U' */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 86 0x56 'V' */
-   0xc3, /* 11000011 */
-   0xc3, /* 11000011 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 87 0x57 'W' */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xd6, /* 11010110 */
-   0xfe, /* 11111110 */
-   0xee, /* 11101110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 88 0x58 'X' */
-   0xc3, /* 11000011 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x66, /* 01100110 */
-   0xc3, /* 11000011 */
-   0x00, /* 00000000 */
-
-   /* 89 0x59 'Y' */
-   0xc3, /* 11000011 */
-   0xc3, /* 11000011 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 90 0x5a 'Z' */
-   0xfe, /* 11111110 */
-   0x06, /* 00000110 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x60, /* 01100000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-
-   /* 91 0x5b '[' */
-   0x3c, /* 00111100 */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x3c, /* 00111100 */
-   0x00, /* 00000000 */
-
-   /* 92 0x5c '\' */
-   0xc0, /* 11000000 */
-   0x60, /* 01100000 */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0x06, /* 00000110 */
-   0x03, /* 00000011 */
-   0x00, /* 00000000 */
-
-   /* 93 0x5d ']' */
-   0x3c, /* 00111100 */
-   0x0c, /* 00001100 */
-   0x0c, /* 00001100 */
-   0x0c, /* 00001100 */
-   0x0c, /* 00001100 */
-   0x0c, /* 00001100 */
-   0x3c, /* 00111100 */
-   0x00, /* 00000000 */
-
-   /* 94 0x5e '^' */
-   0x10, /* 00010000 */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 95 0x5f '_' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-
-   /* 96 0x60 '`' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 97 0x61 'a' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7c, /* 01111100 */
-   0x06, /* 00000110 */
-   0x7e, /* 01111110 */
-   0xc6, /* 11000110 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-
-   /* 98 0x62 'b' */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xfc, /* 11111100 */
-   0x00, /* 00000000 */
-
-   /* 99 0x63 'c' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc0, /* 11000000 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 100 0x64 'd' */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-   0x7e, /* 01111110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-
-   /* 101 0x65 'e' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 102 0x66 'f' */
-   0x3c, /* 00111100 */
-   0x66, /* 01100110 */
-   0x60, /* 01100000 */
-   0xf0, /* 11110000 */
-   0x60, /* 01100000 */
-   0x60, /* 01100000 */
-   0x60, /* 01100000 */
-   0x00, /* 00000000 */
-
-   /* 103 0x67 'g' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7e, /* 01111110 */
-   0x06, /* 00000110 */
-   0x7c, /* 01111100 */
-
-   /* 104 0x68 'h' */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 105 0x69 'i' */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x38, /* 00111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 106 0x6a 'j' */
-   0x06, /* 00000110 */
-   0x00, /* 00000000 */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-
-   /* 107 0x6b 'k' */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xcc, /* 11001100 */
-   0xd8, /* 11011000 */
-   0xf0, /* 11110000 */
-   0xd8, /* 11011000 */
-   0xcc, /* 11001100 */
-   0x00, /* 00000000 */
-
-   /* 108 0x6c 'l' */
-   0x38, /* 00111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 109 0x6d 'm' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xec, /* 11101100 */
-   0xfe, /* 11111110 */
-   0xd6, /* 11010110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 110 0x6e 'n' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 111 0x6f 'o' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 112 0x70 'p' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xfc, /* 11111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xfc, /* 11111100 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-
-   /* 113 0x71 'q' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7e, /* 01111110 */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-
-   /* 114 0x72 'r' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xdc, /* 11011100 */
-   0xe6, /* 11100110 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0x00, /* 00000000 */
-
-   /* 115 0x73 's' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0xc0, /* 11000000 */
-   0x7c, /* 01111100 */
-   0x06, /* 00000110 */
-   0xfc, /* 11111100 */
-   0x00, /* 00000000 */
-
-   /* 116 0x74 't' */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x7c, /* 01111100 */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x36, /* 00110110 */
-   0x1c, /* 00011100 */
-   0x00, /* 00000000 */
-
-   /* 117 0x75 'u' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 118 0x76 'v' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x6c, /* 01101100 */
-   0x38, /* 00111000 */
-   0x00, /* 00000000 */
-
-   /* 119 0x77 'w' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xd6, /* 11010110 */
-   0xfe, /* 11111110 */
-   0x6c, /* 01101100 */
-   0x00, /* 00000000 */
-
-   /* 120 0x78 'x' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xc6, /* 11000110 */
-   0x6c, /* 01101100 */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 121 0x79 'y' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xc3, /* 11000011 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x60, /* 01100000 */
-
-   /* 122 0x7a 'z' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-   0x0c, /* 00001100 */
-   0x38, /* 00111000 */
-   0x60, /* 01100000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-
-   /* 123 0x7b '{' */
-   0x0e, /* 00001110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x70, /* 01110000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x0e, /* 00001110 */
-   0x00, /* 00000000 */
-
-   /* 124 0x7c '|' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 125 0x7d '}' */
-   0x70, /* 01110000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x0e, /* 00001110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x70, /* 01110000 */
-   0x00, /* 00000000 */
-
-   /* 126 0x7e '~' */
-   0x72, /* 01110010 */
-   0x9c, /* 10011100 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 127 0x7f '' */
-   0x00, /* 00000000 */
-   0x10, /* 00010000 */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-
-   /* 128 0x80 '€' */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x0c, /* 00001100 */
-   0x78, /* 01111000 */
-
-   /* 129 0x81 '�' */
-   0xcc, /* 11001100 */
-   0x00, /* 00000000 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 130 0x82 '‚' */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 131 0x83 '�' */
-   0x7c, /* 01111100 */
-   0x82, /* 10000010 */
-   0x78, /* 01111000 */
-   0x0c, /* 00001100 */
-   0x7c, /* 01111100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 132 0x84 '„' */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-   0x78, /* 01111000 */
-   0x0c, /* 00001100 */
-   0x7c, /* 01111100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 133 0x85 '…' */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x78, /* 01111000 */
-   0x0c, /* 00001100 */
-   0x7c, /* 01111100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 134 0x86 '†' */
-   0x30, /* 00110000 */
-   0x30, /* 00110000 */
-   0x78, /* 01111000 */
-   0x0c, /* 00001100 */
-   0x7c, /* 01111100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 135 0x87 '‡' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0x7e, /* 01111110 */
-   0x0c, /* 00001100 */
-   0x38, /* 00111000 */
-
-   /* 136 0x88 '�' */
-   0x7c, /* 01111100 */
-   0x82, /* 10000010 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 137 0x89 '‰' */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 138 0x8a 'Š' */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 139 0x8b '‹' */
-   0x66, /* 01100110 */
-   0x00, /* 00000000 */
-   0x38, /* 00111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x00, /* 00000000 */
-
-   /* 140 0x8c 'Ś' */
-   0x7c, /* 01111100 */
-   0x82, /* 10000010 */
-   0x38, /* 00111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x00, /* 00000000 */
-
-   /* 141 0x8d 'Ť' */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x38, /* 00111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x00, /* 00000000 */
-
-   /* 142 0x8e 'Ž' */
-   0xc6, /* 11000110 */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 143 0x8f 'Ź' */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 144 0x90 '�' */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0xf8, /* 11111000 */
-   0xc0, /* 11000000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-
-   /* 145 0x91 '‘' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0xd8, /* 11011000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-
-   /* 146 0x92 '’' */
-   0x3e, /* 00111110 */
-   0x6c, /* 01101100 */
-   0xcc, /* 11001100 */
-   0xfe, /* 11111110 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xce, /* 11001110 */
-   0x00, /* 00000000 */
-
-   /* 147 0x93 '“' */
-   0x7c, /* 01111100 */
-   0x82, /* 10000010 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 148 0x94 '”' */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 149 0x95 '•' */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 150 0x96 '–' */
-   0x78, /* 01111000 */
-   0x84, /* 10000100 */
-   0x00, /* 00000000 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 151 0x97 '—' */
-   0x60, /* 01100000 */
-   0x30, /* 00110000 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 152 0x98 '�' */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7e, /* 01111110 */
-   0x06, /* 00000110 */
-   0xfc, /* 11111100 */
-
-   /* 153 0x99 '™' */
-   0xc6, /* 11000110 */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x6c, /* 01101100 */
-   0x38, /* 00111000 */
-   0x00, /* 00000000 */
-
-   /* 154 0x9a 'š' */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 155 0x9b '›' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 156 0x9c 'ś' */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0x64, /* 01100100 */
-   0xf0, /* 11110000 */
-   0x60, /* 01100000 */
-   0x66, /* 01100110 */
-   0xfc, /* 11111100 */
-   0x00, /* 00000000 */
-
-   /* 157 0x9d 'ť' */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 158 0x9e 'ž' */
-   0xf8, /* 11111000 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xfa, /* 11111010 */
-   0xc6, /* 11000110 */
-   0xcf, /* 11001111 */
-   0xc6, /* 11000110 */
-   0xc7, /* 11000111 */
-
-   /* 159 0x9f 'ź' */
-   0x0e, /* 00001110 */
-   0x1b, /* 00011011 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0xd8, /* 11011000 */
-   0x70, /* 01110000 */
-   0x00, /* 00000000 */
-
-   /* 160 0xa0 ' ' */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x78, /* 01111000 */
-   0x0c, /* 00001100 */
-   0x7c, /* 01111100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 161 0xa1 'ˇ' */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x38, /* 00111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x00, /* 00000000 */
-
-   /* 162 0xa2 '˘' */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-
-   /* 163 0xa3 'Ł' */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 164 0xa4 '¤' */
-   0x76, /* 01110110 */
-   0xdc, /* 11011100 */
-   0x00, /* 00000000 */
-   0xdc, /* 11011100 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x00, /* 00000000 */
-
-   /* 165 0xa5 'Ą' */
-   0x76, /* 01110110 */
-   0xdc, /* 11011100 */
-   0x00, /* 00000000 */
-   0xe6, /* 11100110 */
-   0xf6, /* 11110110 */
-   0xde, /* 11011110 */
-   0xce, /* 11001110 */
-   0x00, /* 00000000 */
-
-   /* 166 0xa6 '¦' */
-   0x3c, /* 00111100 */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0x3e, /* 00111110 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 167 0xa7 '§' */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0x38, /* 00111000 */
-   0x00, /* 00000000 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 168 0xa8 '¨' */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x63, /* 01100011 */
-   0x3e, /* 00111110 */
-   0x00, /* 00000000 */
-
-   /* 169 0xa9 '©' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 170 0xaa 'Ş' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-   0x06, /* 00000110 */
-   0x06, /* 00000110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 171 0xab '«' */
-   0x63, /* 01100011 */
-   0xe6, /* 11100110 */
-   0x6c, /* 01101100 */
-   0x7e, /* 01111110 */
-   0x33, /* 00110011 */
-   0x66, /* 01100110 */
-   0xcc, /* 11001100 */
-   0x0f, /* 00001111 */
-
-   /* 172 0xac '¬' */
-   0x63, /* 01100011 */
-   0xe6, /* 11100110 */
-   0x6c, /* 01101100 */
-   0x7a, /* 01111010 */
-   0x36, /* 00110110 */
-   0x6a, /* 01101010 */
-   0xdf, /* 11011111 */
-   0x06, /* 00000110 */
-
-   /* 173 0xad '­' */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 174 0xae '®' */
-   0x00, /* 00000000 */
-   0x33, /* 00110011 */
-   0x66, /* 01100110 */
-   0xcc, /* 11001100 */
-   0x66, /* 01100110 */
-   0x33, /* 00110011 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 175 0xaf 'Ż' */
-   0x00, /* 00000000 */
-   0xcc, /* 11001100 */
-   0x66, /* 01100110 */
-   0x33, /* 00110011 */
-   0x66, /* 01100110 */
-   0xcc, /* 11001100 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 176 0xb0 '°' */
-   0x22, /* 00100010 */
-   0x88, /* 10001000 */
-   0x22, /* 00100010 */
-   0x88, /* 10001000 */
-   0x22, /* 00100010 */
-   0x88, /* 10001000 */
-   0x22, /* 00100010 */
-   0x88, /* 10001000 */
-
-   /* 177 0xb1 '±' */
-   0x55, /* 01010101 */
-   0xaa, /* 10101010 */
-   0x55, /* 01010101 */
-   0xaa, /* 10101010 */
-   0x55, /* 01010101 */
-   0xaa, /* 10101010 */
-   0x55, /* 01010101 */
-   0xaa, /* 10101010 */
-
-   /* 178 0xb2 '˛' */
-   0x77, /* 01110111 */
-   0xdd, /* 11011101 */
-   0x77, /* 01110111 */
-   0xdd, /* 11011101 */
-   0x77, /* 01110111 */
-   0xdd, /* 11011101 */
-   0x77, /* 01110111 */
-   0xdd, /* 11011101 */
-
-   /* 179 0xb3 'ł' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 180 0xb4 '´' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0xf8, /* 11111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 181 0xb5 'µ' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0xf8, /* 11111000 */
-   0x18, /* 00011000 */
-   0xf8, /* 11111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 182 0xb6 '¶' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0xf6, /* 11110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 183 0xb7 '·' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 184 0xb8 '¸' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xf8, /* 11111000 */
-   0x18, /* 00011000 */
-   0xf8, /* 11111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 185 0xb9 'ą' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0xf6, /* 11110110 */
-   0x06, /* 00000110 */
-   0xf6, /* 11110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 186 0xba 'ş' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 187 0xbb '»' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-   0x06, /* 00000110 */
-   0xf6, /* 11110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 188 0xbc 'Ľ' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0xf6, /* 11110110 */
-   0x06, /* 00000110 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 189 0xbd '˝' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 190 0xbe 'ľ' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0xf8, /* 11111000 */
-   0x18, /* 00011000 */
-   0xf8, /* 11111000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 191 0xbf 'ż' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xf8, /* 11111000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 192 0xc0 'Ŕ' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x1f, /* 00011111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 193 0xc1 'Á' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 194 0xc2 'Â' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 195 0xc3 'Ă' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x1f, /* 00011111 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 196 0xc4 'Ä' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 197 0xc5 'Ĺ' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0xff, /* 11111111 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 198 0xc6 'Ć' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x1f, /* 00011111 */
-   0x18, /* 00011000 */
-   0x1f, /* 00011111 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 199 0xc7 'Ç' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x37, /* 00110111 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 200 0xc8 'Č' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x37, /* 00110111 */
-   0x30, /* 00110000 */
-   0x3f, /* 00111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 201 0xc9 'É' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x3f, /* 00111111 */
-   0x30, /* 00110000 */
-   0x37, /* 00110111 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 202 0xca 'Ę' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0xf7, /* 11110111 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 203 0xcb 'Ë' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0xf7, /* 11110111 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 204 0xcc 'Ě' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x37, /* 00110111 */
-   0x30, /* 00110000 */
-   0x37, /* 00110111 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 205 0xcd 'Í' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 206 0xce 'Î' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0xf7, /* 11110111 */
-   0x00, /* 00000000 */
-   0xf7, /* 11110111 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 207 0xcf 'Ď' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 208 0xd0 'Đ' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 209 0xd1 'Ń' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 210 0xd2 'Ň' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 211 0xd3 'Ó' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x3f, /* 00111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 212 0xd4 'Ô' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x1f, /* 00011111 */
-   0x18, /* 00011000 */
-   0x1f, /* 00011111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 213 0xd5 'Ő' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x1f, /* 00011111 */
-   0x18, /* 00011000 */
-   0x1f, /* 00011111 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 214 0xd6 'Ö' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x3f, /* 00111111 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 215 0xd7 '×' */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0xff, /* 11111111 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-
-   /* 216 0xd8 'Ř' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0xff, /* 11111111 */
-   0x18, /* 00011000 */
-   0xff, /* 11111111 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 217 0xd9 'Ů' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0xf8, /* 11111000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 218 0xda 'Ú' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x1f, /* 00011111 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 219 0xdb 'Ű' */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-
-   /* 220 0xdc 'Ü' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-
-   /* 221 0xdd 'Ý' */
-   0xf0, /* 11110000 */
-   0xf0, /* 11110000 */
-   0xf0, /* 11110000 */
-   0xf0, /* 11110000 */
-   0xf0, /* 11110000 */
-   0xf0, /* 11110000 */
-   0xf0, /* 11110000 */
-   0xf0, /* 11110000 */
-
-   /* 222 0xde 'Ţ' */
-   0x0f, /* 00001111 */
-   0x0f, /* 00001111 */
-   0x0f, /* 00001111 */
-   0x0f, /* 00001111 */
-   0x0f, /* 00001111 */
-   0x0f, /* 00001111 */
-   0x0f, /* 00001111 */
-   0x0f, /* 00001111 */
-
-   /* 223 0xdf 'ß' */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0xff, /* 11111111 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 224 0xe0 'ŕ' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x76, /* 01110110 */
-   0xdc, /* 11011100 */
-   0xc8, /* 11001000 */
-   0xdc, /* 11011100 */
-   0x76, /* 01110110 */
-   0x00, /* 00000000 */
-
-   /* 225 0xe1 'á' */
-   0x78, /* 01111000 */
-   0xcc, /* 11001100 */
-   0xcc, /* 11001100 */
-   0xd8, /* 11011000 */
-   0xcc, /* 11001100 */
-   0xc6, /* 11000110 */
-   0xcc, /* 11001100 */
-   0x00, /* 00000000 */
-
-   /* 226 0xe2 'â' */
-   0xfe, /* 11111110 */
-   0xc6, /* 11000110 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0xc0, /* 11000000 */
-   0x00, /* 00000000 */
-
-   /* 227 0xe3 'ă' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0x00, /* 00000000 */
-
-   /* 228 0xe4 'ä' */
-   0xfe, /* 11111110 */
-   0xc6, /* 11000110 */
-   0x60, /* 01100000 */
-   0x30, /* 00110000 */
-   0x60, /* 01100000 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-
-   /* 229 0xe5 'ĺ' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0xd8, /* 11011000 */
-   0xd8, /* 11011000 */
-   0xd8, /* 11011000 */
-   0x70, /* 01110000 */
-   0x00, /* 00000000 */
-
-   /* 230 0xe6 'ć' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x7c, /* 01111100 */
-   0xc0, /* 11000000 */
-
-   /* 231 0xe7 'ç' */
-   0x00, /* 00000000 */
-   0x76, /* 01110110 */
-   0xdc, /* 11011100 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-
-   /* 232 0xe8 'č' */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x3c, /* 00111100 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-
-   /* 233 0xe9 'é' */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0xc6, /* 11000110 */
-   0xfe, /* 11111110 */
-   0xc6, /* 11000110 */
-   0x6c, /* 01101100 */
-   0x38, /* 00111000 */
-   0x00, /* 00000000 */
-
-   /* 234 0xea 'ę' */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0xee, /* 11101110 */
-   0x00, /* 00000000 */
-
-   /* 235 0xeb 'ë' */
-   0x0e, /* 00001110 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0x3e, /* 00111110 */
-   0x66, /* 01100110 */
-   0x66, /* 01100110 */
-   0x3c, /* 00111100 */
-   0x00, /* 00000000 */
-
-   /* 236 0xec 'ě' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0xdb, /* 11011011 */
-   0xdb, /* 11011011 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 237 0xed 'í' */
-   0x06, /* 00000110 */
-   0x0c, /* 00001100 */
-   0x7e, /* 01111110 */
-   0xdb, /* 11011011 */
-   0xdb, /* 11011011 */
-   0x7e, /* 01111110 */
-   0x60, /* 01100000 */
-   0xc0, /* 11000000 */
-
-   /* 238 0xee 'î' */
-   0x1e, /* 00011110 */
-   0x30, /* 00110000 */
-   0x60, /* 01100000 */
-   0x7e, /* 01111110 */
-   0x60, /* 01100000 */
-   0x30, /* 00110000 */
-   0x1e, /* 00011110 */
-   0x00, /* 00000000 */
-
-   /* 239 0xef 'ď' */
-   0x00, /* 00000000 */
-   0x7c, /* 01111100 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0xc6, /* 11000110 */
-   0x00, /* 00000000 */
-
-   /* 240 0xf0 'đ' */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-   0xfe, /* 11111110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 241 0xf1 'ń' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x7e, /* 01111110 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-
-   /* 242 0xf2 'ň' */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-
-   /* 243 0xf3 'ó' */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x18, /* 00011000 */
-   0x0c, /* 00001100 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-
-   /* 244 0xf4 'ô' */
-   0x0e, /* 00001110 */
-   0x1b, /* 00011011 */
-   0x1b, /* 00011011 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-
-   /* 245 0xf5 'ő' */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0xd8, /* 11011000 */
-   0xd8, /* 11011000 */
-   0x70, /* 01110000 */
-
-   /* 246 0xf6 'ö' */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x7e, /* 01111110 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 247 0xf7 '÷' */
-   0x00, /* 00000000 */
-   0x76, /* 01110110 */
-   0xdc, /* 11011100 */
-   0x00, /* 00000000 */
-   0x76, /* 01110110 */
-   0xdc, /* 11011100 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 248 0xf8 'ř' */
-   0x38, /* 00111000 */
-   0x6c, /* 01101100 */
-   0x6c, /* 01101100 */
-   0x38, /* 00111000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 249 0xf9 'ů' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 250 0xfa 'ú' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x18, /* 00011000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 251 0xfb 'ű' */
-   0x0f, /* 00001111 */
-   0x0c, /* 00001100 */
-   0x0c, /* 00001100 */
-   0x0c, /* 00001100 */
-   0xec, /* 11101100 */
-   0x6c, /* 01101100 */
-   0x3c, /* 00111100 */
-   0x1c, /* 00011100 */
-
-   /* 252 0xfc 'ü' */
-   0x6c, /* 01101100 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x36, /* 00110110 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 253 0xfd 'ý' */
-   0x78, /* 01111000 */
-   0x0c, /* 00001100 */
-   0x18, /* 00011000 */
-   0x30, /* 00110000 */
-   0x7c, /* 01111100 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 254 0xfe 'ţ' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x3c, /* 00111100 */
-   0x3c, /* 00111100 */
-   0x3c, /* 00111100 */
-   0x3c, /* 00111100 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-   /* 255 0xff '˙' */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-   0x00, /* 00000000 */
-
-};
-
diff -u --recursive --new-file v2.1.110/linux/drivers/video/promcon.c linux/drivers/video/promcon.c
--- v2.1.110/linux/drivers/video/promcon.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/promcon.c	Wed Jul 22 13:40:04 1998
@@ -1,4 +1,4 @@
-/* $Id: promcon.c,v 1.3 1998/07/13 01:06:19 ecd Exp $
+/* $Id: promcon.c,v 1.6 1998/07/19 12:49:26 mj Exp $
  * Console driver utilizing PROM sun terminal emulation
  *
  * Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
@@ -23,6 +23,14 @@
 static short pw = 80 - 1, ph = 34 - 1;
 static short px, py;
 
+#define PROMCON_COLOR 1
+
+#if PROMCON_COLOR
+#define inverted(s)	((((s) & 0x7700) == 0x0700) ? 0 : 1)
+#else
+#define inverted(s)	(((s) & 0x0800) ? 1 : 0)
+#endif
+
 static __inline__ void
 promcon_puts(char *buf, int cnt)
 {
@@ -38,20 +46,20 @@
 	if (px == pw) {
 		unsigned short *t = s - 1;
 
-		if ((*s & 0x0800) && (*t & 0x0800))
+		if (inverted(*s) && inverted(*t))
 			return sprintf(b, "\b\033[7m%c\b\033[@%c\033[m",
 				       *s, *t);
-		else if (*s & 0x0800)
+		else if (inverted(*s))
 			return sprintf(b, "\b\033[7m%c\033[m\b\033[@%c",
 				       *s, *t);
-		else if (*t & 0x0800)
+		else if (inverted(*t))
 			return sprintf(b, "\b%c\b\033[@\033[7m%c\033[m",
 				       *s, *t);
 		else
 			return sprintf(b, "\b%c\b\033[@%c", *s, *t);
 	}
 
-	if (*s & 0x0800)
+	if (inverted(*s))
 		return sprintf(b, "\033[7m%c\033[m\b", *s);
 	else
 		return sprintf(b, "%c\b", *s);
@@ -69,18 +77,18 @@
 	if (px == pw) {
 		unsigned short *t = s - 1;
 
-		if ((*s & 0x0800) && (*t & 0x0800))
+		if (inverted(*s) && inverted(*t))
 			b += sprintf(b, "\b%c\b\033[@\033[7m%c\033[m", *s, *t);
-		else if (*s & 0x0800)
+		else if (inverted(*s))
 			b += sprintf(b, "\b%c\b\033[@%c", *s, *t);
-		else if (*t & 0x0800)
+		else if (inverted(*t))
 			b += sprintf(b, "\b\033[7m%c\b\033[@%c\033[m", *s, *t);
 		else
 			b += sprintf(b, "\b\033[7m%c\033[m\b\033[@%c", *s, *t);
 		return b - p;
 	}
 
-	if (*s & 0x0800)
+	if (inverted(*s))
 		b += sprintf(b, "%c\b", *s);
 	else
 		b += sprintf(b, "\033[7m%c\033[m\b", *s);
@@ -114,7 +122,7 @@
 static void
 promcon_init(struct vc_data *conp, int init)
 {
-	conp->vc_can_do_color = 0;
+	conp->vc_can_do_color = PROMCON_COLOR;
 	conp->vc_cols = pw + 1;
 	conp->vc_rows = ph + 1;
 }
@@ -129,12 +137,12 @@
 promcon_repaint_line(unsigned short *s, unsigned char *buf, unsigned char **bp)
 {
 	int cnt = pw + 1;
-	unsigned short attr = 0;
+	int attr = -1;
 	unsigned char *b = *bp;
 
 	while (cnt--) {
-		if (attr != (*s & 0x0800)) {
-			attr = (*s & 0x0800);
+		if (attr != inverted(*s)) {
+			attr = inverted(*s);
 			if (attr) {
 				strcpy (b, "\033[7m");
 				b += 4;
@@ -183,7 +191,7 @@
 				py = y;
 			}
 
-			if (attr & 0x0800)
+			if (inverted(attr))
 				b += sprintf(b, "\033[7m%c\033[m", *s++);
 			else
 				b += sprintf(b, "%c", *s++);
@@ -191,7 +199,7 @@
 			strcpy(b, "\b\033[@");
 			b += 4;
 
-			if (save & 0x0800)
+			if (inverted(save))
 				b += sprintf(b, "\033[7m%c\033[m", save);
 			else
 				b += sprintf(b, "%c", save);
@@ -207,7 +215,7 @@
 		}
 	}
 
-	if (attr & 0x0800) {
+	if (inverted(attr)) {
 		strcpy(b, "\033[7m");
 		b += 4;
 	}
@@ -234,7 +242,7 @@
 		px++;
 	}
 
-	if (attr & 0x0800) {
+	if (inverted(attr)) {
 		strcpy(b, "\033[m");
 		b += 3;
 	}
@@ -376,19 +384,13 @@
 }
 
 static int
-promcon_get_font(struct vc_data *conp, int *w, int *h, char *data)
+promcon_font_op(struct vc_data *conp, struct console_font_op *op)
 {
 	return -ENOSYS;
 }
         
 static int
-promcon_set_font(struct vc_data *conp, int w, int h, char *data)
-{
-	return -ENOSYS;
-}
-
-static int
-promcon_blank(int blank)
+promcon_blank(struct vc_data *conp, int blank)
 {
 	if (blank) {
 		promcon_puts("\033[H\033[J\033[7m \033[m\b", 15);
@@ -503,10 +505,11 @@
 	con_bmove:		promcon_bmove,
 	con_switch:		promcon_switch,
 	con_blank:		promcon_blank,
-	con_get_font:		promcon_get_font,
-	con_set_font:		promcon_set_font,
+	con_font_op:		promcon_font_op,
 	con_set_palette:	DUMMY,
 	con_scrolldelta:	DUMMY,
 	con_set_origin:		NULL,
 	con_save_screen:	NULL,
+	con_build_attr:		NULL,
+	con_invert_region:	NULL,
 };
diff -u --recursive --new-file v2.1.110/linux/drivers/video/retz3fb.c linux/drivers/video/retz3fb.c
--- v2.1.110/linux/drivers/video/retz3fb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/retz3fb.c	Wed Jul 22 13:40:04 1998
@@ -21,7 +21,6 @@
  */
 
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -290,7 +289,7 @@
  *    Text console acceleration
  */
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static struct display_switch fbcon_retz3_8;
 #endif
 
@@ -1280,7 +1279,7 @@
 	display->can_soft_blank = 1;
 	display->inverse = z3fb_inverse;
 	switch (display->var.bits_per_pixel) {
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 	case 8:
 		if (display->var.accel_flags & FB_ACCELF_TEXT) {
 		    display->dispsw = &fbcon_retz3_8;
@@ -1289,7 +1288,7 @@
 		    display->dispsw = &fbcon_cfb8;
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 	case 16:
 		display->dispsw = &fbcon_cfb16;
 		break;
@@ -1351,7 +1350,7 @@
 			display->can_soft_blank = 1;
 			display->inverse = z3fb_inverse;
 			switch (display->var.bits_per_pixel) {
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 			case 8:
 				if (var->accel_flags & FB_ACCELF_TEXT) {
 					display->dispsw = &fbcon_retz3_8;
@@ -1360,7 +1359,7 @@
 					display->dispsw = &fbcon_cfb8;
 				break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 			case 16:
 				display->dispsw = &fbcon_cfb16;
 				break;
@@ -1629,7 +1628,7 @@
  *  Text console acceleration
  */
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static void fbcon_retz3_8_bmove(struct display *p, int sy, int sx, int dy, int dx,
 	                int height, int width)
 {
@@ -1676,7 +1675,7 @@
 
 static struct display_switch fbcon_retz3_8 = {
     fbcon_cfb8_setup, fbcon_retz3_8_bmove, fbcon_retz3_8_clear,
-    fbcon_cfb8_putc, fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL,
-    NULL, FONTWIDTH(8)
+    fbcon_cfb8_putc, fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL, NULL,
+    fbcon_cfb8_clear_margins, FONTWIDTH(8)
 };
 #endif
diff -u --recursive --new-file v2.1.110/linux/drivers/video/sbusfb.c linux/drivers/video/sbusfb.c
--- v2.1.110/linux/drivers/video/sbusfb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/sbusfb.c	Tue Jul 21 10:28:24 1998
@@ -52,7 +52,6 @@
 
 static int currcon;
 static int defx_margin = -1, defy_margin = -1;
-static int disable __initdata = 0;
 static char fontname[40] __initdata = { 0 };
 static struct {
 	int depth;
@@ -156,6 +155,13 @@
 	return 0;
 }
 
+static unsigned long sbusfb_mmapsize(struct fb_info_sbusfb *fb, long size)
+{
+	if (size == SBUS_MMAP_EMPTY) return 0;
+	if (size >= 0) return size;
+	return fb->type.fb_size * (-size);
+}
+
 static int sbusfb_mmap(struct fb_info *info, struct file *file, 
 			struct vm_area_struct *vma)
 {
@@ -174,7 +180,7 @@
 #ifdef __sparc_v9__
 	/* Align it as much as desirable */
 	{
-		int j, max = -1, alignment;
+		int j, max = -1, alignment, s = 0;
 		
 		map_offset = vma->vm_offset+size;
 		for (i = 0; fb->mmap_map[i].size; i++) {
@@ -182,11 +188,13 @@
 				continue;
 			if (fb->mmap_map[i].voff >= map_offset)
 				break;
-			if (max < 0 || fb->mmap_map[i].size > fb->mmap_map[max].size)
+			if (max < 0 || sbusfb_mmapsize(fb,fb->mmap_map[i].size) > s) {
 				max = i;
+				s = sbusfb_mmapsize(fb,fb->mmap_map[max].size);
+			}
 		}
 		if (max >= 0) {
-			j = fb->mmap_map[max].size;
+			j = s;
 			if (fb->mmap_map[max].voff + j > map_offset)
 				j = map_offset - fb->mmap_map[max].voff;
 			for (alignment = 0x400000; alignment > PAGE_SIZE; alignment >>= 3)
@@ -212,8 +220,8 @@
 		map_size = 0;
 		for (i = 0; fb->mmap_map[i].size; i++)
 			if (fb->mmap_map[i].voff == vma->vm_offset+page) {
-				map_size = fb->mmap_map[i].size;
-				map_offset = (fb->physbase + fb->mmap_map[i].poff) & _PAGE_PADDR;
+				map_size = sbusfb_mmapsize(fb,fb->mmap_map[i].size);
+				map_offset = (fb->physbase + fb->mmap_map[i].poff) & PAGE_MASK;
 				break;
 			}
 		if (!map_size){
@@ -232,10 +240,14 @@
 	file->f_count++;
 	vma->vm_flags |= VM_IO;
 	if (!fb->mmaped) {
+		int lastconsole = 0;
+		
+		if (info->display_fg)
+			lastconsole = info->display_fg->vc_num;
 		fb->mmaped = 1;
-		if (fb->consolecnt && fb_display[fb->lastconsole].fb_info == info) {
-			fb->vtconsole = fb->lastconsole;
-			vt_cons [fb->lastconsole]->vc_mode = KD_GRAPHICS;
+		if (fb->consolecnt && fb_display[lastconsole].fb_info == info) {
+			fb->vtconsole = lastconsole;
+			vt_cons [lastconsole]->vc_mode = KD_GRAPHICS;
 		} else if (fb->unblank && !fb->blanked)
 			(*fb->unblank)(fb);
 	}
@@ -520,6 +532,7 @@
 {
 	struct fb_info_sbusfb *fb = sbusfbinfo(info);
 	int i;
+	int lastconsole;
 	
 	switch (cmd){
 	case FBIOGTYPE:		/* return frame buffer type */
@@ -546,9 +559,11 @@
 		if (i) return i;
 		return -EINVAL;
 	case FBIOSVIDEO:
-		if (fb->consolecnt &&
-		    vt_cons[fb->lastconsole]->vc_mode == KD_TEXT)
- 			break;
+		if (fb->consolecnt) {
+			lastconsole = info->display_fg->vc_num;
+			if (vt_cons[lastconsole]->vc_mode == KD_TEXT)
+ 				break;
+ 		}
 		get_user_ret(i, (int *)arg, -EFAULT);
 		if (i){
 			if (!fb->blanked || !fb->unblank)
@@ -643,7 +658,8 @@
 	case FBIOSCURSOR:
 		if (!fb->setcursor) return -EINVAL;
  		if (fb->consolecnt) {
- 			if (vt_cons[fb->lastconsole]->vc_mode == KD_TEXT)
+ 			lastconsole = info->display_fg->vc_num; 
+ 			if (vt_cons[lastconsole]->vc_mode == KD_TEXT)
  				return -EINVAL; /* Don't let graphics programs hide our nice text cursor */
 			fb->hw_cursor_shown = 0; /* Forget state of our text cursor */
 		}
@@ -653,7 +669,8 @@
 		if (!fb->setcursor) return -EINVAL;
 		/* Don't let graphics programs move our nice text cursor */
  		if (fb->consolecnt) {
- 			if (vt_cons[fb->lastconsole]->vc_mode == KD_TEXT)
+ 			lastconsole = info->display_fg->vc_num; 
+ 			if (vt_cons[lastconsole]->vc_mode == KD_TEXT)
  				return -EINVAL; /* Don't let graphics programs move our nice text cursor */
  		}
 		if (copy_from_user(&fb->cursor.cpos, (void *)arg, sizeof(struct fbcurpos)))
@@ -689,9 +706,7 @@
 			    	defx_margin = i; defy_margin = j;
 			    }
 			}
-		} else if (!strncmp(p, "disable", 7))
-			disable = 1;
-		else if (!strncmp(p, "font=", 5)) {
+		} else if (!strncmp(p, "font=", 5)) {
 			int i;
 			
 			for (i = 0; i < sizeof(fontname) - 1; i++)
@@ -710,16 +725,17 @@
 {
 	int x_margin, y_margin;
 	struct fb_info_sbusfb *fb = sbusfbinfo(info);
+	int lastconsole;
     
 	/* Do we have to save the colormap? */
 	if (fb_display[currcon].cmap.len)
 		fb_get_cmap(&fb_display[currcon].cmap, &fb_display[currcon].var, 1, sbusfb_getcolreg, info);
 
-	if (fb->lastconsole != con && 
-	    (fb_display[fb->lastconsole].fontwidth != fb_display[con].fontwidth ||
-	     fb_display[fb->lastconsole].fontheight != fb_display[con].fontheight))
+	lastconsole = info->display_fg->vc_num;
+	if (lastconsole != con && 
+	    (fb_display[lastconsole].fontwidth != fb_display[con].fontwidth ||
+	     fb_display[lastconsole].fontheight != fb_display[con].fontheight))
 		fb->hw_cursor_shown = 0;
-	fb->lastconsole = con;
 	x_margin = (fb_display[con].var.xres_virtual - fb_display[con].var.xres) / 2;
 	y_margin = (fb_display[con].var.yres_virtual - fb_display[con].var.yres) / 2;
 	if (fb->margins)
@@ -855,9 +871,33 @@
 	return 1;
 }
 
+void sbusfb_palette(int enter)
+{
+	int i;
+	struct display *p;
+	
+	for (i = 0; i < MAX_NR_CONSOLES; i++) {
+		p = &fb_display[i];
+		if (p->dispsw && p->dispsw->setup == sbusfb_disp_setup &&
+		    p->fb_info->display_fg &&
+		    p->fb_info->display_fg->vc_num == i) {
+			struct fb_info_sbusfb *fb = sbusfbinfod(p);
+
+			if (fb->restore_palette) {
+				if (enter)
+					fb->restore_palette(fb);
+				else if (vt_cons[i]->vc_mode != KD_GRAPHICS)
+				         vc_cons[i].d->vc_sw->con_set_palette(vc_cons[i].d, color_table);
+			}
+		}
+	}
+}
+
     /*
      *  Initialisation
      */
+     
+extern void (*prom_palette)(int);
 
 __initfunc(static void sbusfb_init_fb(int node, int parent, int fbtype,
 				      struct linux_sbus_device *sbdp))
@@ -876,6 +916,10 @@
 		prom_printf("Could not allocate sbusfb structure\n");
 		return;
 	}
+	
+	if (!prom_palette)
+		prom_palette = sbusfb_palette;
+	
 	memset(fb, 0, sizeof(struct fb_info_sbusfb));
 	fix = &fb->fix;
 	var = &fb->var;
@@ -893,7 +937,7 @@
 	fb->emulations[0] = fbtype;
 	
 #ifndef __sparc_v9__
-	disp->screen_base = prom_getintdefault(node, "address", 0);
+	disp->screen_base = (unsigned char *)prom_getintdefault(node, "address", 0);
 #endif
 	
 	type->fb_height = h = prom_getintdefault(node, "height", 900);
@@ -991,6 +1035,7 @@
 	fb->dispsw.set_font = sbusfb_set_font;
 	fb->setup = fb->dispsw.setup;
 	fb->dispsw.setup = sbusfb_disp_setup;
+	fb->dispsw.clear_margins = NULL;
 
 	disp->var = *var;
 	disp->visual = fix->visual;
@@ -1015,47 +1060,53 @@
 	char *p;
 	for (p = name; *p && *p != ','; p++);
 	if (*p == ',') name = p + 1;
-	if (!strcmp(p, "cgsix") || !strcmp(p, "cgthree+"))
+	if (!strcmp(name, "cgsix") || !strcmp(name, "cgthree+"))
 		return FBTYPE_SUNFAST_COLOR;
-	if (!strcmp(p, "cgthree") || !strcmp(p, "cgRDI"))
+	if (!strcmp(name, "cgthree") || !strcmp(name, "cgRDI"))
 		return FBTYPE_SUN3COLOR;
-	if (!strcmp(p, "cgfourteen"))
+	if (!strcmp(name, "cgfourteen"))
 		return FBTYPE_MDICOLOR;
-	if (!strcmp(p, "leo"))
+	if (!strcmp(name, "leo"))
 		return FBTYPE_SUNLEO;
-	if (!strcmp(p, "bwtwo"))
+	if (!strcmp(name, "bwtwo"))
 		return FBTYPE_SUN2BW;
-	if (!strcmp(p, "tcx"))
+	if (!strcmp(name, "tcx"))
 		return FBTYPE_TCXCOLOR;
 	return FBTYPE_NOTYPE;
 }
 
 __initfunc(void sbusfb_init(void))
 {
-	int node, root, type;
+	int type;
 	struct linux_sbus_device *sbdp;
 	struct linux_sbus *sbus;
 	char prom_name[40];
 	extern int con_is_present(void);
 	
-	if (!con_is_present() || disable) return;
+	if (!con_is_present()) return;
 	
 #ifdef CONFIG_FB_CREATOR
-	root = prom_getchild(prom_root_node);
-	for (node = prom_searchsiblings(root, "SUNW,ffb"); node;
-	     node = prom_searchsiblings(prom_getsibling(node), "SUNW,ffb")) {
-		sbusfb_init_fb(node, prom_root_node, FBTYPE_CREATOR, NULL);
+	{
+		int root, node;
+		root = prom_getchild(prom_root_node);
+		for (node = prom_searchsiblings(root, "SUNW,ffb"); node;
+		     node = prom_searchsiblings(prom_getsibling(node), "SUNW,ffb")) {
+			sbusfb_init_fb(node, prom_root_node, FBTYPE_CREATOR, NULL);
+		}
 	}
 #endif
 #ifdef CONFIG_SUN4
 	sbusfb_init_fb(0, 0, FBTYPE_SUN2BW, NULL);
 #endif
 #if defined(CONFIG_FB_CGFOURTEEN) && !defined(__sparc_v9__)
-	root = prom_getchild(prom_root_node);
-	root = prom_searchsiblings(root, "obio");
-	if (root && 
-	    (node = prom_searchsiblings(prom_getchild(root), "cgfourteen"))) {
-		sbusfb_init_fb(node, root, FBTYPE_MDICOLOR, NULL);
+	{
+		int root, node;
+		root = prom_getchild(prom_root_node);
+		root = prom_searchsiblings(root, "obio");
+		if (root && 
+		    (node = prom_searchsiblings(prom_getchild(root), "cgfourteen"))) {
+			sbusfb_init_fb(node, root, FBTYPE_MDICOLOR, NULL);
+		}
 	}
 #endif
 	if (!SBus_chain) return;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/sbusfb.h linux/drivers/video/sbusfb.h
--- v2.1.110/linux/drivers/video/sbusfb.h	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/sbusfb.h	Tue Jul 21 10:28:24 1998
@@ -41,6 +41,9 @@
 	unsigned long size;
 };
 
+#define SBUS_MMAP_FBSIZE(n) (-n)
+#define SBUS_MMAP_EMPTY	0x80000000
+
 struct fb_info_sbusfb {
 	struct fb_info info;
 	struct fb_fix_screeninfo fix;
@@ -63,7 +66,6 @@
 	int x_margin;
 	int y_margin;
 	int vtconsole;
-	int lastconsole;
 	int consolecnt;
 	int emulations[4];
 	struct sbus_mmap_map *mmap_map;
@@ -81,6 +83,7 @@
 	void (*reset)(struct fb_info_sbusfb *);
 	void (*fill)(struct fb_info_sbusfb *, int, int, unsigned short *);
 	void (*switch_from_graph)(struct fb_info_sbusfb *);
+	void (*restore_palette)(struct fb_info_sbusfb *);
 };
 
 extern char *creatorfb_init(struct fb_info_sbusfb *);
diff -u --recursive --new-file v2.1.110/linux/drivers/video/skeletonfb.c linux/drivers/video/skeletonfb.c
--- v2.1.110/linux/drivers/video/skeletonfb.c	Thu Jul 16 18:09:27 1998
+++ linux/drivers/video/skeletonfb.c	Wed Jul 22 13:40:04 1998
@@ -8,7 +8,6 @@
  * for more details.
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -244,15 +243,15 @@
      *  If you don't have any appropriate operations, simple fill in the NULL
      *  pointer, and there will be no text output.
      */
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
     if (is_cfb8)
 	return &fbcon_cfb8;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
     if (is_cfb16)
 	return &fbcon_cfb16;
 #endif
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
     if (is_cfb32)
 	return &fbcon_cfb32;
 #endif
diff -u --recursive --new-file v2.1.110/linux/drivers/video/tgafb.c linux/drivers/video/tgafb.c
--- v2.1.110/linux/drivers/video/tgafb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/tgafb.c	Wed Jul 22 13:40:04 1998
@@ -22,7 +22,6 @@
  * KNOWN PROBLEMS/TO DO ==================================================== */
 
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/kernel.h>
@@ -741,22 +740,21 @@
     disp.can_soft_blank = 1;
     disp.inverse = 0;
     switch (tga_type) {
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 	case 0: /* 8-plane */
 	    disp.dispsw = &fbcon_cfb8;
-	    disp.scrollmode = SCROLL_YREDRAW;
 	    break;
 #endif
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
 	case 1: /* 24-plane */
 	case 3: /* 24plusZ */
 	    disp.dispsw = &fbcon_cfb32;
-	    disp.scrollmode = SCROLL_YREDRAW;
 	    break;
 #endif
 	default:
 	    disp.dispsw = NULL;
     }
+    disp.scrollmode = SCROLL_YREDRAW;
 
     strcpy(fb_info.modename, fb_fix.id);
     fb_info.node = -1;
@@ -842,10 +840,10 @@
     palette[regno].green = green;
     palette[regno].blue = blue;
 
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
     if (regno < 16 && tga_type != 0)
 	fbcon_cfb32_cmap[regno] = (red << 16) | (green << 8) | blue;
-#endif /* CONFIG_FBCON_CFB32 */
+#endif
 
     /* How to set a single color register?? */
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/vesafb.c linux/drivers/video/vesafb.c
--- v2.1.110/linux/drivers/video/vesafb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/vesafb.c	Wed Jul 22 13:40:04 1998
@@ -8,7 +8,6 @@
  *
  */ 
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -171,18 +170,18 @@
 	vesafb_get_var(&display->var, -1, &fb_info);
 
 	switch (video_bpp) {
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 	case 8:
 		sw = &fbcon_cfb8;
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 	case 15:
 	case 16:
 		sw = &fbcon_cfb16;
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
 	case 32:
 		sw = &fbcon_cfb32;
 		break;
@@ -242,7 +241,7 @@
 	palette[regno].blue  = blue;
 	
 	switch (video_bpp) {
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 	case 8:
 		/* Hmm, can we do it _always_ this way ??? */
 		outb_p(regno, dac_reg);
@@ -251,19 +250,19 @@
 		outb_p(blue, dac_val);
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 	case 15:
 	case 16:
 		fbcon_cfb16_cmap[regno] =
 			(red << vesafb_defined.red.offset) | (green << 5) | blue;
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB24
+#ifdef FBCON_HAS_CFB24
 	case 24:
 		/* FIXME: todo */
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
 	case 32:
 		fbcon_cfb32_cmap[regno] =
 			(red   << vesafb_defined.red.offset)   |
diff -u --recursive --new-file v2.1.110/linux/drivers/video/vfb.c linux/drivers/video/vfb.c
--- v2.1.110/linux/drivers/video/vfb.c	Thu Jul 16 18:09:28 1998
+++ linux/drivers/video/vfb.c	Wed Jul 22 13:40:04 1998
@@ -8,7 +8,6 @@
  *  more details.
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -260,37 +259,37 @@
 	    display->can_soft_blank = 1;
 	    display->inverse = 0;
 	    switch (var->bits_per_pixel) {
-#ifdef CONFIG_FBCON_MFB
+#ifdef FBCON_HAS_MFB
 		case 1:
 		    display->dispsw = &fbcon_mfb;
 		    break;
 #endif
-#ifdef CONFIG_FBCON_CFB2
+#ifdef FBCON_HAS_CFB2
 		case 2:
 		    display->dispsw = &fbcon_cfb2;
 		    break;
 #endif
-#ifdef CONFIG_FBCON_CFB4
+#ifdef FBCON_HAS_CFB4
 		case 4:
 		    display->dispsw = &fbcon_cfb4;
 		    break;
 #endif
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 		case 8:
 		    display->dispsw = &fbcon_cfb8;
 		    break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 		case 16:
 		    display->dispsw = &fbcon_cfb16;
 		    break;
 #endif
-#ifdef CONFIG_FBCON_CFB24
+#ifdef FBCON_HAS_CFB24
 		case 24:
 		    display->dispsw = &fbcon_cfb24;
 		    break;
 #endif
-#ifdef CONFIG_FBCON_CFB32
+#ifdef FBCON_HAS_CFB32
 		case 32:
 		    display->dispsw = &fbcon_cfb32;
 		    break;
diff -u --recursive --new-file v2.1.110/linux/drivers/video/vgacon.c linux/drivers/video/vgacon.c
--- v2.1.110/linux/drivers/video/vgacon.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/vgacon.c	Wed Jul 22 13:40:04 1998
@@ -33,15 +33,6 @@
  *  more details.
  */
 
-/* KNOWN PROBLEMS/TO DO ========================================FIXME======== *
- *
- *	- monochrome attribute encoding (convert abscon <-> VGA style)
- *
- *	- Cursor shape fixes
- *
- * KNOWN PROBLEMS/TO DO ==================================================== */
-
-
 #include <linux/config.h>
 #include <linux/types.h>
 #include <linux/sched.h>
@@ -66,6 +57,13 @@
 #define CAN_LOAD_EGA_FONTS	/* undefine if the user must not do this */
 #define CAN_LOAD_PALETTE	/* undefine if the user must not do this */
 
+/* You really do _NOT_ want to define this, unless you have buggy
+ * Trident VGA which will resize cursor when moving it between column
+ * 15 & 16. If you define this and your VGA is OK, inverse bug will
+ * appear.
+ */
+#undef TRIDENT_GLITCH
+
 #undef VGA_CAN_DO_64KB
 
 #define dac_reg		0x3c8
@@ -88,13 +86,14 @@
 static void vgacon_cursor(struct vc_data *c, int mode);
 static int vgacon_switch(struct vc_data *c);
 static int vgacon_blank(struct vc_data *c, int blank);
-static int vgacon_get_font(struct vc_data *c, int *w, int *h, char *data);
-static int vgacon_set_font(struct vc_data *c, int w, int h, char *data);
+static int vgacon_font_op(struct vc_data *c, struct console_font_op *op);
 static int vgacon_set_palette(struct vc_data *c, unsigned char *table);
 static int vgacon_scrolldelta(struct vc_data *c, int lines);
 static int vgacon_set_origin(struct vc_data *c);
 static void vgacon_save_screen(struct vc_data *c);
 static int vgacon_scroll(struct vc_data *c, int t, int b, int dir, int lines);
+static u8 vgacon_build_attr(struct vc_data *c, u8 color, u8 intensity, u8 blink, u8 underline, u8 reverse);
+static void vgacon_invert_region(struct vc_data *c, u16 *p, int count);
 
 
 /* Description of the hardware situation */
@@ -113,6 +112,8 @@
 static int	       vga_vesa_blanked;
 static int	       vga_palette_blanked;
 static int	       vga_is_gfx;
+static int	       vga_512_chars;
+static int	       vga_video_font_height;
 
 
 void no_scroll(char *str, int *ints)
@@ -282,7 +283,7 @@
 	    || vga_video_type == VIDEO_TYPE_EGAM) {
 		vga_hardscroll_enabled = vga_hardscroll_user_enable;
 		vga_default_font_height = ORIG_VIDEO_POINTS;
-		video_font_height = ORIG_VIDEO_POINTS;
+		vga_video_font_height = video_font_height = ORIG_VIDEO_POINTS;
 		/* This may be suboptimal but is a safe bet - go with it */
 		video_scan_lines =
 			video_font_height * vga_video_num_lines;
@@ -291,22 +292,98 @@
 	return display_desc;
 }
 
+static int vga_use_count;
+
 static void vgacon_init(struct vc_data *c, int init)
 {
 	/* We cannot be loaded as a module, therefore init is always 1 */
 	c->vc_can_do_color = vga_can_do_color;
 	c->vc_cols = vga_video_num_columns;
 	c->vc_rows = vga_video_num_lines;
+	c->vc_complement_mask = 0x7700;
+	vga_use_count++;
+}
+
+static inline void vga_set_mem_top(struct vc_data *c)
+{
+	write_vga(12, (c->vc_visible_origin-vga_vram_base)/2);
 }
 
 static void vgacon_deinit(struct vc_data *c)
 {
-	vgacon_set_origin(c);
+	/* When closing the last console, reset video origin */
+	if (!--vga_use_count) {
+		c->vc_visible_origin = vga_vram_base;
+		vga_set_mem_top(c);
+	}
 }
 
-static inline void vga_set_mem_top(struct vc_data *c)
+static u8 vgacon_build_attr(struct vc_data *c, u8 color, u8 intensity, u8 blink, u8 underline, u8 reverse)
 {
-	write_vga(12, (c->vc_visible_origin-vga_vram_base)/2);
+	u8 attr = color;
+
+	if (vga_can_do_color) {
+		if (underline)
+			attr = (attr & 0xf0) | c->vc_ulcolor;
+		else if (intensity == 0)
+			attr = (attr & 0xf0) | c->vc_halfcolor;
+	}
+	if (reverse)
+		attr = ((attr) & 0x88) | ((((attr) >> 4) | ((attr) << 4)) & 0x77);
+	if (blink)
+		attr ^= 0x80;
+	if (intensity == 2)
+		attr ^= 0x08;
+	if (!vga_can_do_color) {
+		if (underline)
+			attr = (attr & 0xf8) | 0x01;
+		else if (intensity == 0)
+			attr = (attr & 0xf0) | 0x08;
+	}
+	return attr;
+}
+
+static void vgacon_invert_region(struct vc_data *c, u16 *p, int count)
+{
+	int col = vga_can_do_color;
+
+	while (count--) {
+		u16 a = *p;
+		if (col)
+			a = ((a) & 0x88ff) | (((a) & 0x7000) >> 4) | (((a) & 0x0700) << 4);
+		else
+			a ^= ((a & 0x0700) == 0x0100) ? 0x7000 : 0x7700;
+		*p++ = a;
+	}
+}
+
+static void vgacon_set_cursor_size(int xpos, int from, int to)
+{
+	unsigned long flags;
+	int curs, cure;
+	static int lastfrom, lastto;
+
+#ifdef TRIDENT_GLITCH
+	if (xpos<16) from--, to--;
+#endif
+
+	if ((from == lastfrom) && (to == lastto)) return;
+	lastfrom = from; lastto = to;
+
+	save_flags(flags); cli();
+	outb_p(0x0a, vga_video_port_reg);		/* Cursor start */
+	curs = inb_p(vga_video_port_val);
+	outb_p(0x0b, vga_video_port_reg);		/* Cursor end */
+	cure = inb_p(vga_video_port_val);
+
+	curs = (curs & 0xc0) | from;
+	cure = (cure & 0xe0) | to;
+
+	outb_p(0x0a, vga_video_port_reg);		/* Cursor start */
+	outb_p(curs, vga_video_port_val);
+	outb_p(0x0b, vga_video_port_reg);		/* Cursor end */
+	outb_p(cure, vga_video_port_val);
+	restore_flags(flags);
 }
 
 static void vgacon_cursor(struct vc_data *c, int mode)
@@ -321,6 +398,34 @@
 	case CM_MOVE:
 	case CM_DRAW:
 	    write_vga(14, (c->vc_pos-vga_vram_base)/2);
+	    switch (c->vc_cursor_type & 0x0f) {
+		case CUR_UNDERLINE:
+			vgacon_set_cursor_size(c->vc_x, 
+					video_font_height - (video_font_height < 10 ? 2 : 3),
+					video_font_height - (video_font_height < 10 ? 1 : 2));
+			break;
+		case CUR_TWO_THIRDS:
+			vgacon_set_cursor_size(c->vc_x, 
+					 video_font_height / 3,
+					 video_font_height - (video_font_height < 10 ? 1 : 2));
+			break;
+		case CUR_LOWER_THIRD:
+			vgacon_set_cursor_size(c->vc_x, 
+					 (video_font_height*2) / 3,
+					 video_font_height - (video_font_height < 10 ? 1 : 2));
+			break;
+		case CUR_LOWER_HALF:
+			vgacon_set_cursor_size(c->vc_x, 
+					 video_font_height / 2,
+					 video_font_height - (video_font_height < 10 ? 1 : 2));
+			break;
+		case CUR_NONE:
+			vgacon_set_cursor_size(c->vc_x, 31, 30);
+			break;
+          	default:
+			vgacon_set_cursor_size(c->vc_x, 1, video_font_height);
+			break;
+		}
 	    break;
     }
 }
@@ -517,11 +622,11 @@
 			return 0;
 		}
 		scr_memsetw((void *)vga_vram_base, BLANK, vc_cons[0].d->vc_screenbuf_size);
-		return 0;
+		return 1;
 	case -1:			/* Entering graphic mode */
 		scr_memsetw((void *)vga_vram_base, BLANK, vc_cons[0].d->vc_screenbuf_size);
 		vga_is_gfx = 1;
-		return 0;
+		return 1;
 	default:			/* VESA blanking */
 		if (vga_video_type == VIDEO_TYPE_VGAC) {
 			vga_vesa_blank(blank-1);
@@ -543,6 +648,8 @@
  * (sizif@botik.yaroslavl.su).
  */
 
+#ifdef CAN_LOAD_EGA_FONTS
+
 #define colourmap 0xa0000
 /* Pauline Middelink <middelin@polyware.iaf.nl> reports that we
    should use 0xA0000 for the bwmap as well.. */
@@ -550,29 +657,25 @@
 #define cmapsz 8192
 
 static int
-vgacon_font_op(char *arg, int set)
+vgacon_do_font_op(char *arg, int set, int ch512)
 {
-#ifdef CAN_LOAD_EGA_FONTS
-	int ch512 = video_mode_512ch;
-	static int ch512enabled = 0;
 	int i;
 	char *charmap;
 	int beg;
 	unsigned short video_port_status = vga_video_port_reg + 6;
 	int font_select = 0x00;
 
-	if (vga_video_type == VIDEO_TYPE_EGAC || vga_video_type == VIDEO_TYPE_VGAC) {
+	if (vga_video_type != VIDEO_TYPE_EGAM) {
 		charmap = (char *)VGA_MAP_MEM(colourmap);
 		beg = 0x0e;
 #ifdef VGA_CAN_DO_64KB
 		if (video_type == VIDEO_TYPE_VGAC)
 			beg = 0x06;
 #endif
-	} else if (vga_video_type == VIDEO_TYPE_EGAM) {
+	} else {
 		charmap = (char *)VGA_MAP_MEM(blackwmap);
 		beg = 0x0a;
-	} else
-		return -EINVAL;
+	}
 	
 #ifdef BROKEN_GRAPHICS_PROGRAMS
 	/*
@@ -666,8 +769,14 @@
 	outb_p( beg, gr_port_val );     /* map starts at b800:0 or b000:0 */
 
 	/* if 512 char mode is already enabled don't re-enable it. */
-	if ((set)&&(ch512!=ch512enabled)) {	/* attribute controller */
-		ch512enabled=ch512;
+	if ((set)&&(ch512!=vga_512_chars)) {	/* attribute controller */
+		int i;
+		for(i=0; i<MAX_NR_CONSOLES; i++) {
+			struct vc_data *c = vc_cons[i].d;
+			if (c && c->vc_sw == &vga_con)
+				c->vc_hi_font_mask = ch512 ? 0x0800 : 0;
+		}
+		vga_512_chars=ch512;
 		/* 256-char: enable intensity bit
 		   512-char: disable intensity bit */
 		inb_p( video_port_status );	/* clear address flip-flop */
@@ -681,9 +790,6 @@
 	sti();
 
 	return 0;
-#else
-	return -EINVAL;
-#endif
 }
 
 /*
@@ -693,16 +799,12 @@
 vgacon_adjust_height(unsigned fontheight)
 {
 	int rows, maxscan;
-	unsigned char ovr, vde, fsr, curs, cure;
+	unsigned char ovr, vde, fsr;
 
-	if (fontheight > 32 || (vga_video_type != VIDEO_TYPE_VGAC &&
-	    vga_video_type != VIDEO_TYPE_EGAC && vga_video_type != VIDEO_TYPE_EGAM))
-		return -EINVAL;
-
-	if (fontheight == video_font_height)
+	if (fontheight == vga_video_font_height)
 		return 0;
 
-	video_font_height = fontheight;
+	vga_video_font_height = video_font_height = fontheight;
 
 	rows = video_scan_lines/fontheight;	/* Number of video rows we end up with */
 	maxscan = rows*fontheight - 1;		/* Scan lines to actually display-1 */
@@ -722,10 +824,6 @@
 	ovr = inb_p(vga_video_port_val);
 	outb_p( 0x09, vga_video_port_reg );		/* Font size register */
 	fsr = inb_p(vga_video_port_val);
-	outb_p( 0x0a, vga_video_port_reg );		/* Cursor start */
-	curs = inb_p(vga_video_port_val);
-	outb_p( 0x0b, vga_video_port_reg );		/* Cursor end */
-	cure = inb_p(vga_video_port_val);
 	sti();
 
 	vde = maxscan & 0xff;			/* Vertical display end reg */
@@ -733,18 +831,12 @@
 	      ((maxscan & 0x100) >> 7) +
 	      ((maxscan & 0x200) >> 3);
 	fsr = (fsr & 0xe0) + (fontheight-1);    /*  Font size register */
-	curs = (curs & 0xc0) + fontheight - (fontheight < 10 ? 2 : 3);
-	cure = (cure & 0xe0) + fontheight - (fontheight < 10 ? 1 : 2);
 
 	cli();
 	outb_p( 0x07, vga_video_port_reg );		/* CRTC overflow register */
 	outb_p( ovr, vga_video_port_val );
 	outb_p( 0x09, vga_video_port_reg );		/* Font size */
 	outb_p( fsr, vga_video_port_val );
-	outb_p( 0x0a, vga_video_port_reg );		/* Cursor start */
-	outb_p( curs, vga_video_port_val );
-	outb_p( 0x0b, vga_video_port_reg );		/* Cursor end */
-	outb_p( cure, vga_video_port_val );
 	outb_p( 0x12, vga_video_port_reg );		/* Vertical display limit */
 	outb_p( vde, vga_video_port_val );
 	sti();
@@ -753,38 +845,50 @@
 	return 0;
 }
 
-static int vgacon_get_font(struct vc_data *c, int *w, int *h, char *data)
-{
-	*w = 8;
-	*h = video_font_height;
-	return vgacon_font_op(data, 0);
-}
-
-static int vgacon_set_font(struct vc_data *c, int w, int h, char *data)
+static int vgacon_font_op(struct vc_data *c, struct console_font_op *op)
 {
 	int rc;
-	if (w != 8 || h > 32)
+
+	if (vga_video_type < VIDEO_TYPE_EGAM)
 		return -EINVAL;
-	rc = vgacon_font_op(data, 1);
-	if (!rc)
-		rc = vgacon_adjust_height(h);
+
+	if (op->op == KD_FONT_OP_SET) {
+		if (op->width != 8 || (op->charcount != 256 && op->charcount != 512))
+			return -EINVAL;
+		rc = vgacon_do_font_op(op->data, 1, op->charcount == 512);
+		if (!rc && !(op->flags & KD_FONT_FLAG_DONT_RECALC))
+			rc = vgacon_adjust_height(op->height);
+	} else if (op->op == KD_FONT_OP_GET) {
+		op->width = 8;
+		op->height = vga_video_font_height;
+		op->charcount = vga_512_chars ? 512 : 256;
+		rc = vgacon_do_font_op(op->data, 0, 0);
+	} else
+		rc = -ENOSYS;
 	return rc;
 }
 
+#else
+
+static int vgacon_font_op(struct vc_data *c, struct console_font_op *op)
+{
+	return -ENOSYS;
+}
+
+#endif
+
 static int vgacon_scrolldelta(struct vc_data *c, int lines)
 {
-	/* FIXME: Better scrollback strategy, maybe move it to generic code
-	 *	  and leave only vga_set_mem_top here.
-	 */
 	if (!lines)			/* Turn scrollback off */
 		c->vc_visible_origin = c->vc_origin;
 	else {
 		int p = c->vc_visible_origin - vga_vram_base;
+		int margin = c->vc_rows/4 * c->vc_size_row;
 		p += lines * c->vc_size_row;
-		if (p < 0)
+		if (lines < 0 && p < margin)
 			p = 0;
 		c->vc_visible_origin = p + vga_vram_base;
-		if (c->vc_visible_origin > c->vc_origin)
+		if (lines > 0 && c->vc_visible_origin > c->vc_origin - margin)
 			c->vc_visible_origin = c->vc_origin;
 	}
 	vga_set_mem_top(c);
@@ -793,7 +897,8 @@
 
 static int vgacon_set_origin(struct vc_data *c)
 {
-	if (vga_is_gfx)		/* We don't play origin tricks in graphic modes */
+	if (vga_is_gfx ||	/* We don't play origin tricks in graphic modes */
+	    (console_blanked && !vga_palette_blanked))	/* Nor we write to blanked screens */
 		return 0;
 	c->vc_origin = c->vc_visible_origin = vga_vram_base;
 	vga_set_mem_top(c);
@@ -819,6 +924,7 @@
 static int vgacon_scroll(struct vc_data *c, int t, int b, int dir, int lines)
 {
 	unsigned long oldo;
+	unsigned int delta;
 	
 	if (t || b != c->vc_rows || vga_is_gfx)
 		return 0;
@@ -826,21 +932,33 @@
 	if (c->vc_origin != c->vc_visible_origin)
 		vgacon_scrolldelta(c, 0);
 
-	/* FIXME: Handle scrolling down or by more lines? */
-	if (!vga_hardscroll_enabled || dir != SM_UP || lines != 1)
+	if (!vga_hardscroll_enabled || lines >= c->vc_rows/2)
 		return 0;
 
 	oldo = c->vc_origin;
-	if (c->vc_scr_end + c->vc_size_row >= vga_vram_end) {
-		scr_memcpyw((u16 *)vga_vram_base,
-			    (u16 *)(oldo + c->vc_size_row),
-			    c->vc_screenbuf_size - c->vc_size_row);
-		c->vc_origin = vga_vram_base;
-	} else
-		c->vc_origin += c->vc_size_row;
-	c->vc_visible_origin = c->vc_origin;
+	delta = lines * c->vc_size_row;
+	if (dir == SM_UP) {
+		if (c->vc_scr_end + delta >= vga_vram_end) {
+			scr_memcpyw((u16 *)vga_vram_base,
+				    (u16 *)(oldo + delta),
+				    c->vc_screenbuf_size - delta);
+			c->vc_origin = vga_vram_base;
+		} else
+			c->vc_origin += delta;
+		scr_memsetw((u16 *)(c->vc_origin + c->vc_screenbuf_size - delta), c->vc_video_erase_char, delta);
+	} else {
+		if (oldo - delta < vga_vram_base) {
+			scr_memmovew((u16 *)(vga_vram_end - c->vc_screenbuf_size + delta),
+				     (u16 *)oldo,
+				     c->vc_screenbuf_size - delta);
+			c->vc_origin = vga_vram_end - c->vc_screenbuf_size;
+		} else
+			c->vc_origin -= delta;
+		c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
+		scr_memsetw((u16 *)(c->vc_origin), c->vc_video_erase_char, delta);
+	}
 	c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
-	scr_memsetw((u16 *)(c->vc_scr_end - c->vc_size_row), c->vc_video_erase_char, c->vc_size_row);
+	c->vc_visible_origin = c->vc_origin;
 	vga_set_mem_top(c);
 	c->vc_pos = (c->vc_pos - oldo) + c->vc_origin;
 	return 1;
@@ -870,10 +988,11 @@
 	DUMMY,				/* con_bmove */
 	vgacon_switch,
 	vgacon_blank,
-	vgacon_get_font,
-	vgacon_set_font,
+	vgacon_font_op,
 	vgacon_set_palette,
 	vgacon_scrolldelta,
 	vgacon_set_origin,
-	vgacon_save_screen
+	vgacon_save_screen,
+	vgacon_build_attr,
+	vgacon_invert_region
 };
diff -u --recursive --new-file v2.1.110/linux/drivers/video/vgafb.c linux/drivers/video/vgafb.c
--- v2.1.110/linux/drivers/video/vgafb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/vgafb.c	Tue Jul 21 10:28:24 1998
@@ -745,7 +745,8 @@
 
 static struct display_switch fbcon_vgafb = {
     fbcon_vga_setup, fbcon_vga_bmove, fbcon_vga_clear, fbcon_vga_putc,
-    fbcon_vga_putcs, fbcon_vga_revc, fbcon_vgafb_cursor, NULL, FONTWIDTH(8)
+    fbcon_vga_putcs, fbcon_vga_revc, fbcon_vgafb_cursor, NULL, NULL,
+    FONTWIDTH(8)
 };
 
 
diff -u --recursive --new-file v2.1.110/linux/drivers/video/virgefb.c linux/drivers/video/virgefb.c
--- v2.1.110/linux/drivers/video/virgefb.c	Tue Jul 21 00:15:32 1998
+++ linux/drivers/video/virgefb.c	Wed Jul 22 13:40:04 1998
@@ -16,7 +16,6 @@
 
 #undef VIRGEFBDEBUG
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -270,7 +269,7 @@
  *    Text console acceleration
  */
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static struct display_switch fbcon_virge8;
 #endif
 
@@ -847,7 +846,7 @@
 	display->can_soft_blank = 1;
 	display->inverse = Cyberfb_inverse;
 	switch (display->var.bits_per_pixel) {
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 	    case 8:
 		if (display->var.accel_flags & FB_ACCELF_TEXT) {
 		    display->dispsw = &fbcon_virge8;
@@ -856,7 +855,7 @@
 		    display->dispsw = &fbcon_virge8;
 		break;
 #endif
-#ifdef CONFIG_FBCON_CFB16
+#ifdef FBCON_HAS_CFB16
 	    case 16:
 		display->dispsw = &fbcon_cfb16;
 		break;
@@ -1139,7 +1138,7 @@
  *    Text console acceleration
  */
 
-#ifdef CONFIG_FBCON_CFB8
+#ifdef FBCON_HAS_CFB8
 static void fbcon_virge8_bmove(struct display *p, int sy, int sx, int dy,
 			       int dx, int height, int width)
 {
@@ -1163,7 +1162,8 @@
 
 static struct display_switch fbcon_virge8 = {
    fbcon_cfb8_setup, fbcon_virge8_bmove, fbcon_virge8_clear, fbcon_cfb8_putc,
-   fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL, NULL, FONTWIDTH(8)
+   fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL, NULL, fbcon_cfb8_clear_margins,
+   FONTWIDTH(8)
 };
 #endif
 
diff -u --recursive --new-file v2.1.110/linux/fs/dcache.c linux/fs/dcache.c
--- v2.1.110/linux/fs/dcache.c	Tue Jul 21 00:15:32 1998
+++ linux/fs/dcache.c	Fri Jul 24 11:19:10 1998
@@ -363,6 +363,45 @@
 }
 
 /*
+ * Check whether a root dentry would be in use if all of its
+ * child dentries were freed. This allows a non-destructive
+ * test for unmounting a device.
+ */
+int is_root_busy(struct dentry *root)
+{
+	struct dentry *this_parent = root;
+	struct list_head *next;
+	int count = root->d_count;
+
+repeat:
+	next = this_parent->d_subdirs.next;
+resume:
+	while (next != &this_parent->d_subdirs) {
+		struct list_head *tmp = next;
+		struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
+		next = tmp->next;
+		/* Decrement count for unused children */
+		count += (dentry->d_count - 1);
+		if (!list_empty(&dentry->d_subdirs)) {
+			this_parent = dentry;
+			goto repeat;
+		}
+		/* root is busy if any leaf is busy */
+		if (dentry->d_count)
+			return 1;
+	}
+	/*
+	 * All done at this level ... ascend and resume the search.
+	 */
+	if (this_parent != root) {
+		next = this_parent->d_child.next; 
+		this_parent = this_parent->d_parent;
+		goto resume;
+	}
+	return (count == 1); /* one remaining use count? */
+}
+
+/*
  * Search the dentry child list for the specified parent,
  * and move any unused dentries to the end of the unused
  * list for prune_dcache(). We descend to the next level
@@ -438,13 +477,7 @@
  */
 void shrink_dcache_memory(int priority, unsigned int gfp_mask)
 {
-#if 0
-	int count = select_dcache(32, 8);
-	if (count)
-		prune_dcache((count << 6) >> priority);
-#else
 	prune_dcache(0);
-#endif
 }
 
 #define NAME_ALLOC_LEN(len)	((len+16) & ~15)
diff -u --recursive --new-file v2.1.110/linux/fs/inode.c linux/fs/inode.c
--- v2.1.110/linux/fs/inode.c	Wed Jun 24 22:54:09 1998
+++ linux/fs/inode.c	Wed Jul 22 15:42:50 1998
@@ -65,7 +65,7 @@
 	int dummy[4];
 } inodes_stat = {0, 0, 0,};
 
-int max_inodes = NR_INODE;
+int max_inodes;
 
 /*
  * Put the inode on the super block's dirty list.
@@ -537,6 +537,7 @@
 		inode->i_sb = NULL;
 		inode->i_dev = 0;
 		inode->i_ino = ++last_ino;
+		inode->i_flags = 0;
 		inode->i_count = 1;
 		inode->i_state = 0;
 		spin_unlock(&inode_lock);
@@ -733,11 +734,14 @@
 }
 
 /*
- * Initialize the hash tables
+ * Initialize the hash tables and default
+ * value for max inodes..
  */
+#define MAX_INODE (8192)
+
 void inode_init(void)
 {
-	int i;
+	int i, max;
 	struct list_head *head = inode_hashtable;
 
 	i = HASH_SIZE;
@@ -746,6 +750,12 @@
 		head++;
 		i--;
 	} while (i);
+
+	/* Initial guess at reasonable inode number */
+	max = num_physpages >> 1;
+	if (max > MAX_INODE)
+		max = MAX_INODE;
+	max_inodes = max;
 }
 
 /* This belongs in file_table.c, not here... */
diff -u --recursive --new-file v2.1.110/linux/fs/lockd/svcsubs.c linux/fs/lockd/svcsubs.c
--- v2.1.110/linux/fs/lockd/svcsubs.c	Tue Dec  9 12:16:25 1997
+++ linux/fs/lockd/svcsubs.c	Tue Jul 21 13:05:03 1998
@@ -48,13 +48,15 @@
 nlm_lookup_file(struct svc_rqst *rqstp, struct nlm_file **result,
 					struct nfs_fh *f)
 {
-	struct nlm_file	*file;
 	struct knfs_fh	*fh = (struct knfs_fh *) f;
-	unsigned int	hash = file_hash(fh->fh_dev, fh->fh_ino);
+	struct nlm_file	*file;
+	unsigned int	hash;
 	u32		nfserr;
 
-	dprintk("lockd: nlm_file_lookup(%s/%ld)\n",
-		kdevname(fh->fh_dev), fh->fh_ino);
+	dprintk("lockd: nlm_file_lookup(%s/%u)\n",
+		kdevname(u32_to_kdev_t(fh->fh_dev)), fh->fh_ino);
+
+	hash = file_hash(u32_to_kdev_t(fh->fh_dev), u32_to_ino_t(fh->fh_ino));
 
 	/* Lock file table */
 	down(&nlm_file_sema);
@@ -65,8 +67,8 @@
 			goto found;
 	}
 
-	dprintk("lockd: creating file for %s/%ld\n",
-		kdevname(fh->fh_dev), fh->fh_ino);
+	dprintk("lockd: creating file for %s/%u\n",
+		kdevname(u32_to_kdev_t(fh->fh_dev)), fh->fh_ino);
 	nfserr = nlm_lck_denied_nolocks;
 	file = (struct nlm_file *) kmalloc(sizeof(*file), GFP_KERNEL);
 	if (!file)
diff -u --recursive --new-file v2.1.110/linux/fs/ncpfs/Config.in linux/fs/ncpfs/Config.in
--- v2.1.110/linux/fs/ncpfs/Config.in	Tue Mar 17 22:18:15 1998
+++ linux/fs/ncpfs/Config.in	Wed Jul 22 13:45:52 1998
@@ -1,7 +1,7 @@
 #
 # NCP Filesystem configuration
 #
-bool     '   Packet singatures' CONFIG_NCPFS_PACKET_SIGNING
+bool     '   Packet signatures' CONFIG_NCPFS_PACKET_SIGNING
 bool     '   Proprietary file locking' CONFIG_NCPFS_IOCTL_LOCKING
 bool     '   Clear remove/delete inhibit when needed' CONFIG_NCPFS_STRONG
 bool     '   Use NFS namespace if available' CONFIG_NCPFS_NFS_NS
diff -u --recursive --new-file v2.1.110/linux/fs/nfs/inode.c linux/fs/nfs/inode.c
--- v2.1.110/linux/fs/nfs/inode.c	Tue Jul 21 00:15:32 1998
+++ linux/fs/nfs/inode.c	Thu Jul 23 16:26:10 1998
@@ -478,6 +478,7 @@
 			goto out;	
 		inode->i_sb = sb;
 		inode->i_dev = sb->s_dev;
+		inode->i_flags = sb->s_flags;
 		inode->i_ino = fattr->fileid;
 		nfs_read_inode(inode);
 		nfs_fill_inode(inode, fattr);
diff -u --recursive --new-file v2.1.110/linux/fs/nfsd/nfsfh.c linux/fs/nfsd/nfsfh.c
--- v2.1.110/linux/fs/nfsd/nfsfh.c	Wed Jun 24 22:54:09 1998
+++ linux/fs/nfsd/nfsfh.c	Tue Jul 21 13:05:03 1998
@@ -98,7 +98,9 @@
 {
 	struct nfsd_fixup *fp;
 
-	fp = find_cached_lookup(fh->fh_dev, fh->fh_dirino, fh->fh_ino);
+	fp = find_cached_lookup(u32_to_kdev_t(fh->fh_dev), 
+				u32_to_ino_t(fh->fh_dirino),
+				u32_to_ino_t(fh->fh_ino));
 	if (fp) {
 		fp->dentry = dentry;
 		return;
@@ -111,9 +113,9 @@
 	 */
 	fp = kmalloc(sizeof(struct nfsd_fixup), GFP_KERNEL);
 	if (fp) {
-		fp->dir = fh->fh_dirino;
-		fp->ino = fh->fh_ino;
-		fp->dev = fh->fh_dev;
+		fp->dir = u32_to_kdev_t(fh->fh_dirino);
+		fp->ino = u32_to_ino_t(fh->fh_ino);
+		fp->dev = u32_to_ino_t(fh->fh_dev);
 		fp->dentry = dentry;
 		fp->reftime = jiffies;
 		list_add(&fp->lru, &fixup_head);
@@ -763,7 +765,9 @@
 #endif
 			goto out;
 		}
-		if (inode->i_ino != fh->fh_ino || inode->i_dev != fh->fh_dev)
+		if (inode->i_ino != u32_to_ino_t(fh->fh_ino))
+			goto out;
+ 		if (inode->i_dev != u32_to_kdev_t(fh->fh_dev))
 			goto out;
 
 		fhe->dentry = NULL;
@@ -839,7 +843,9 @@
 {
 	struct nfsd_fixup *fp;
 
-	fp = find_cached_lookup(fh->fh_dev, fh->fh_dirino, fh->fh_ino);
+	fp = find_cached_lookup(u32_to_kdev_t(fh->fh_dev),
+				u32_to_ino_t(fh->fh_dirino),
+				u32_to_ino_t(fh->fh_ino));
 	if (fp)
 		return fp->dentry;
 	return NULL;
@@ -893,13 +899,14 @@
 	if (nfsd_d_validate(dentry)) {
 		struct inode * dir = dentry->d_parent->d_inode;
 
-		if (dir->i_ino == fh->fh_dirino && dir->i_dev == fh->fh_dev) {
+		if (dir->i_ino == u32_to_ino_t(fh->fh_dirino) && 
+		    dir->i_dev == u32_to_kdev_t(fh->fh_dev)) {
 			struct inode * inode = dentry->d_inode;
 			/*
 			 * NFS file handles must always have an inode,
 			 * so we won't accept a negative dentry.
 			 */
-			if (inode && inode->i_ino == fh->fh_ino) {
+			if (inode && inode->i_ino == u32_to_ino_t(fh->fh_ino)) {
 				dget(dentry);
 #ifdef NFSD_DEBUG_VERBOSE
 printk("find_fh_dentry: validated %s/%s, ino=%ld\n",
@@ -932,14 +939,16 @@
 	 * numbers. This should work for all Unix-like filesystems.
 	 */
 	looked_up = 1;
-	dentry = lookup_inode(fh->fh_dev, fh->fh_dirino, fh->fh_ino);
+	dentry = lookup_inode(u32_to_kdev_t(fh->fh_dev),
+			      u32_to_ino_t(fh->fh_dirino),
+			      u32_to_ino_t(fh->fh_ino));
 	if (!IS_ERR(dentry)) {
 		struct inode * inode = dentry->d_inode;
 #ifdef NFSD_DEBUG_VERBOSE
 printk("find_fh_dentry: looked up %s/%s\n",
 dentry->d_parent->d_name.name, dentry->d_name.name);
 #endif
-		if (inode && inode->i_ino == fh->fh_ino) {
+		if (inode && inode->i_ino == u32_to_ino_t(fh->fh_ino)) {
 			nfsdstats.fh_lookup++;
 			goto out;
 		}
@@ -953,12 +962,13 @@
 	/*
 	 * Stage 4: Look for the parent dentry in the fhcache ...
 	 */
-	parent = find_dentry_by_ino(fh->fh_dev, fh->fh_dirino);
+	parent = find_dentry_by_ino(u32_to_kdev_t(fh->fh_dev),
+				    u32_to_ino_t(fh->fh_dirino));
 	if (parent) {
 		/*
 		 * ... then search for the inode in the parent directory.
 		 */
-		dentry = lookup_by_inode(parent, fh->fh_ino);
+		dentry = lookup_by_inode(parent, u32_to_ino_t(fh->fh_ino));
 		dput(parent);
 		if (dentry)
 			goto out;
@@ -968,8 +978,8 @@
 	 * Stage 5: Search the whole volume.
 	 */
 #ifdef NFSD_PARANOIA
-printk("find_fh_dentry: %s, %ld/%ld not found -- need full search!\n",
-kdevname(fh->fh_dev), fh->fh_dirino, fh->fh_ino);
+printk("find_fh_dentry: %s, %u/%u not found -- need full search!\n",
+kdevname(u32_to_kdev_t(fh->fh_dev)), fh->fh_dirino, fh->fh_ino);
 #endif
 	dentry = NULL;
 	nfsdstats.fh_stale++;
@@ -1006,7 +1016,7 @@
 	struct inode	*inode;
 	u32		error = 0;
 
-	dprintk("nfsd: fh_verify(exp %x/%ld cookie %p)\n",
+	dprintk("nfsd: fh_verify(exp %x/%u cookie %p)\n",
 		fh->fh_xdev, fh->fh_xino, fh->fh_dcookie);
 
 	if(fhp->fh_dverified)
@@ -1015,7 +1025,9 @@
 	 * Look up the export entry.
 	 */
 	error = nfserr_stale;
-	exp = exp_get(rqstp->rq_client, fh->fh_xdev, fh->fh_xino);
+	exp = exp_get(rqstp->rq_client,
+			u32_to_kdev_t(fh->fh_xdev),
+			u32_to_ino_t(fh->fh_xino));
 	if (!exp) /* export entry revoked */
 		goto out;
 
@@ -1091,6 +1103,7 @@
 fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry)
 {
 	struct inode * inode = dentry->d_inode;
+	struct dentry *parent = dentry->d_parent;
 
 	dprintk("nfsd: fh_compose(exp %x/%ld %s/%s, ino=%ld)\n",
 		exp->ex_dev, exp->ex_ino,
@@ -1105,12 +1118,12 @@
 	fh_init(fhp);
 	fhp->fh_handle.fh_dcookie = dentry;
 	if (inode) {
-		fhp->fh_handle.fh_ino = inode->i_ino;
+		fhp->fh_handle.fh_ino = ino_t_to_u32(inode->i_ino);
 	}
-	fhp->fh_handle.fh_dirino = dentry->d_parent->d_inode->i_ino;
-	fhp->fh_handle.fh_dev = dentry->d_parent->d_inode->i_dev;
-	fhp->fh_handle.fh_xdev = exp->ex_dev;
-	fhp->fh_handle.fh_xino = exp->ex_ino;
+	fhp->fh_handle.fh_dirino = ino_t_to_u32(parent->d_inode->i_ino);
+	fhp->fh_handle.fh_dev	 = kdev_t_to_u32(parent->d_inode->i_dev);
+	fhp->fh_handle.fh_xdev	 = kdev_t_to_u32(exp->ex_dev);
+	fhp->fh_handle.fh_xino	 = ino_t_to_u32(exp->ex_ino);
 
 	fhp->fh_dentry = dentry; /* our internal copy */
 	fhp->fh_export = exp;
@@ -1129,21 +1142,24 @@
 	struct dentry *dentry;
 	struct inode *inode;
 
-	if (!fhp->fh_dverified) {
-		printk(KERN_DEBUG "fh_update: fh not verified!\n");
-		goto out;
-	}
+	if (!fhp->fh_dverified)
+		goto out_bad;
 
 	dentry = fhp->fh_dentry;
 	inode = dentry->d_inode;
-	if (!inode) {
-		printk(KERN_DEBUG "fh_update: %s/%s still negative!\n",
-			dentry->d_parent->d_name.name, dentry->d_name.name);
-		goto out;
-	}
-	fhp->fh_handle.fh_ino = inode->i_ino;
+	if (!inode)
+		goto out_negative;
+	fhp->fh_handle.fh_ino = ino_t_to_u32(inode->i_ino);
 out:
 	return;
+
+out_bad:
+	printk(KERN_ERR "fh_update: fh not verified!\n");
+	goto out;
+out_negative:
+	printk(KERN_ERR "fh_update: %s/%s still negative!\n",
+		dentry->d_parent->d_name.name, dentry->d_name.name);
+	goto out;
 }
 
 /*
@@ -1153,20 +1169,23 @@
 void
 fh_put(struct svc_fh *fhp)
 {
+	struct dentry * dentry = fhp->fh_dentry;
 	if (fhp->fh_dverified) {
-		struct dentry * dentry = fhp->fh_dentry;
 		fh_unlock(fhp);
 		fhp->fh_dverified = 0;
-		if (!dentry->d_count) {
-			printk(KERN_DEBUG "fh_put: %s/%s has d_count 0!\n",
-			dentry->d_parent->d_name.name, dentry->d_name.name);
-			return;
-		}
+		if (!dentry->d_count)
+			goto out_bad;
 		if (!dentry->d_inode || !add_to_fhcache(dentry, 0)) {
 			dput(dentry);
 			nfsd_nr_put++;
 		}
 	}
+	return;
+
+out_bad:
+	printk(KERN_ERR "fh_put: %s/%s has d_count 0!\n",
+		dentry->d_parent->d_name.name, dentry->d_name.name);
+	return;
 }
 
 /*
@@ -1288,5 +1307,13 @@
 	INIT_LIST_HEAD(&path_inuse);
 	INIT_LIST_HEAD(&fixup_head);
 
-	printk(KERN_DEBUG "nfsd_init: initialized fhcache, entries=%lu\n", NFSD_MAXFH);
+	printk(KERN_DEBUG 
+		"nfsd_init: initialized fhcache, entries=%lu\n", NFSD_MAXFH);
+	/*
+	 * Display a warning if the ino_t is larger than 32 bits.
+	 */
+	if (sizeof(ino_t) > sizeof(__u32))
+		printk(KERN_INFO 
+			"NFSD: ino_t is %d bytes, using lower 4 bytes\n",
+			sizeof(ino_t));
 }
diff -u --recursive --new-file v2.1.110/linux/fs/nfsd/nfsproc.c linux/fs/nfsd/nfsproc.c
--- v2.1.110/linux/fs/nfsd/nfsproc.c	Wed Jun 24 22:54:09 1998
+++ linux/fs/nfsd/nfsproc.c	Wed Jul 22 14:37:36 1998
@@ -50,7 +50,7 @@
 nfsd_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle  *argp,
 					  struct nfsd_attrstat *resp)
 {
-	dprintk("nfsd: GETATTR  %d/%ld\n",
+	dprintk("nfsd: GETATTR  %d/%d\n",
 		SVCFH_DEV(&argp->fh), SVCFH_INO(&argp->fh));
 
 	fh_copy(&resp->fh, &argp->fh);
@@ -65,7 +65,7 @@
 nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp,
 					  struct nfsd_attrstat  *resp)
 {
-	dprintk("nfsd: SETATTR  %d/%ld, valid=%x, size=%ld\n",
+	dprintk("nfsd: SETATTR  %d/%d, valid=%x, size=%ld\n",
 		SVCFH_DEV(&argp->fh), SVCFH_INO(&argp->fh),
 		argp->attrs.ia_valid, (long) argp->attrs.ia_size);
 
@@ -85,7 +85,7 @@
 {
 	int	nfserr;
 
-	dprintk("nfsd: LOOKUP   %d/%ld %s\n",
+	dprintk("nfsd: LOOKUP   %d/%d %s\n",
 		SVCFH_DEV(&argp->fh), SVCFH_INO(&argp->fh), argp->name);
 
 	nfserr = nfsd_lookup(rqstp, &argp->fh, argp->name, argp->len,
@@ -129,7 +129,7 @@
 	u32 *	buffer;
 	int	nfserr, avail;
 
-	dprintk("nfsd: READ    %d/%ld %d bytes at %d\n",
+	dprintk("nfsd: READ    %d/%d %d bytes at %d\n",
 		SVCFH_DEV(&argp->fh), SVCFH_INO(&argp->fh),
 		argp->count, argp->offset);
 
@@ -166,7 +166,7 @@
 {
 	int	nfserr;
 
-	dprintk("nfsd: WRITE    %d/%ld %d bytes at %d\n",
+	dprintk("nfsd: WRITE    %d/%d %d bytes at %d\n",
 		SVCFH_DEV(&argp->fh), SVCFH_INO(&argp->fh),
 		argp->len, argp->offset);
 
@@ -195,7 +195,7 @@
 	int		nfserr, type, mode, rdonly = 0;
 	dev_t		rdev = NODEV;
 
-	dprintk("nfsd: CREATE   %d/%ld %s\n",
+	dprintk("nfsd: CREATE   %d/%d %s\n",
 		SVCFH_DEV(dirfhp), SVCFH_INO(dirfhp), argp->name);
 
 	/* First verify the parent file handle */
@@ -439,7 +439,7 @@
 	u32 *	buffer;
 	int	nfserr, count;
 
-	dprintk("nfsd: READDIR  %d/%ld %d bytes at %d\n",
+	dprintk("nfsd: READDIR  %d/%d %d bytes at %d\n",
 		SVCFH_DEV(&argp->fh), SVCFH_INO(&argp->fh),
 		argp->count, argp->cookie);
 
diff -u --recursive --new-file v2.1.110/linux/fs/proc/array.c linux/fs/proc/array.c
--- v2.1.110/linux/fs/proc/array.c	Wed Jul  1 19:38:56 1998
+++ linux/fs/proc/array.c	Fri Jul 24 11:14:29 1998
@@ -762,7 +762,7 @@
 	buffer += sprintf(buffer, "SigIgn:\t");
 	buffer = render_sigset_t(&ign, buffer);
 	*buffer++ = '\n';
-	buffer += sprintf(buffer, "SigCat:\t");
+	buffer += sprintf(buffer, "SigCgt:\t"); /* Linux 2.0 uses "SigCgt" */
 	buffer = render_sigset_t(&catch, buffer);
 	*buffer++ = '\n';
 
@@ -805,10 +805,6 @@
 	long priority, nice;
 	int tty_pgrp;
 	sigset_t sigign, sigcatch;
-	char signal_str[sizeof(sigset_t)*2+1];
-	char blocked_str[sizeof(sigset_t)*2+1];
-	char sigign_str[sizeof(sigset_t)*2+1];
-	char sigcatch_str[sizeof(sigset_t)*2+1];
 	char state;
 
 	read_lock(&tasklist_lock);
@@ -831,10 +827,6 @@
 	wchan = get_wchan(tsk);
 
 	collect_sigign_sigcatch(tsk, &sigign, &sigcatch);
-	render_sigset_t(&tsk->signal, signal_str);
-	render_sigset_t(&tsk->blocked, blocked_str);
-	render_sigset_t(&sigign, sigign_str);
-	render_sigset_t(&sigcatch, sigcatch_str);
 
 	if (tsk->tty)
 		tty_pgrp = tsk->tty->pgrp;
@@ -850,7 +842,7 @@
 
 	return sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \
 %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %lu %lu %lu %lu \
-%lu %s %s %s %s %lu %lu %lu\n",
+%lu %lu %lu %lu %lu %lu %lu %lu\n",
 		pid,
 		tsk->comm,
 		state,
@@ -881,10 +873,14 @@
 		tsk->mm ? tsk->mm->start_stack : 0,
 		esp,
 		eip,
-		signal_str,
-		blocked_str,
-		sigign_str,
-		sigcatch_str,
+		/* The signal information here is obsolete.
+		 * It must be decimal for Linux 2.0 compatibility.
+		 * Use /proc/#/status for real-time signals.
+		 */
+		tsk->signal .sig[0] & 0x7fffffffUL,
+		tsk->blocked.sig[0] & 0x7fffffffUL,
+		sigign      .sig[0] & 0x7fffffffUL,
+		sigcatch    .sig[0] & 0x7fffffffUL,
 		wchan,
 		tsk->nswap,
 		tsk->cnswap);
diff -u --recursive --new-file v2.1.110/linux/fs/proc/base.c linux/fs/proc/base.c
--- v2.1.110/linux/fs/proc/base.c	Wed Jun 24 22:54:10 1998
+++ linux/fs/proc/base.c	Tue Jul 21 11:39:16 1998
@@ -13,6 +13,7 @@
 #include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
+#include <linux/init.h>
 
 static struct file_operations proc_base_operations = {
 	NULL,			/* lseek - default */
@@ -120,7 +121,7 @@
 };
 static struct proc_dir_entry proc_pid_fd = {
 	PROC_PID_FD, 2, "fd",
-	S_IFDIR | S_IRUSR | S_IXUSR, 1, 0, 0,
+	S_IFDIR | S_IRUSR | S_IXUSR, 2, 0, 0,
 	0, &proc_fd_inode_operations,
 	NULL, proc_pid_fill_inode,
 };
@@ -173,7 +174,7 @@
 };
 #endif
 
-void proc_base_init(void)
+__initfunc(void proc_base_init(void))
 {
 #if CONFIG_AP1000
 	proc_register(&proc_pid, &proc_pid_ringbuf);
diff -u --recursive --new-file v2.1.110/linux/fs/proc/generic.c linux/fs/proc/generic.c
--- v2.1.110/linux/fs/proc/generic.c	Thu May 14 19:47:43 1998
+++ linux/fs/proc/generic.c	Tue Jul 21 11:39:16 1998
@@ -260,13 +260,16 @@
 	ent->name = ((char *) ent) + sizeof(*ent);
 	ent->namelen = len;
 
-	if (mode == S_IFDIR) {
+	if (S_ISDIR(mode)) {
+		if ((mode & S_IALLUGO) == 0)
 		mode |= S_IRUGO | S_IXUGO;
 		ent->ops = &proc_dyna_dir_inode_operations;
 		ent->nlink = 2;
-	}
-	else if (mode == 0) {
-		mode = S_IFREG | S_IRUGO;
+	} else {
+		if ((mode & S_IFMT) == 0)
+			mode |= S_IFREG;
+		if ((mode & S_IALLUGO) == 0)
+			mode |= S_IRUGO;
 		ent->nlink = 1;
 	}
 	ent->mode = mode;
diff -u --recursive --new-file v2.1.110/linux/fs/proc/proc_tty.c linux/fs/proc/proc_tty.c
--- v2.1.110/linux/fs/proc/proc_tty.c	Wed Dec  3 15:21:57 1997
+++ linux/fs/proc/proc_tty.c	Tue Jul 21 11:39:16 1998
@@ -6,6 +6,7 @@
 
 #include <asm/uaccess.h>
 
+#include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/proc_fs.h>
@@ -169,7 +170,7 @@
 /*
  * Called by proc_root_init() to initialize the /proc/tty subtree
  */
-void proc_tty_init(void)
+__initfunc(void proc_tty_init(void))
 {
 	struct proc_dir_entry *ent;
 	
diff -u --recursive --new-file v2.1.110/linux/fs/proc/root.c linux/fs/proc/root.c
--- v2.1.110/linux/fs/proc/root.c	Thu Jul 16 18:09:28 1998
+++ linux/fs/proc/root.c	Tue Jul 21 11:39:16 1998
@@ -13,6 +13,7 @@
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
 #include <linux/config.h>
+#include <linux/init.h>
 #include <asm/bitops.h>
 #ifdef CONFIG_KMOD
 #include <linux/kmod.h>
@@ -632,7 +633,7 @@
 };
 #endif
 
-void proc_root_init(void)
+__initfunc(void proc_root_init(void))
 {
 	proc_base_init();
 	proc_register(&proc_root, &proc_root_loadavg);
diff -u --recursive --new-file v2.1.110/linux/include/asm-alpha/page.h linux/include/asm-alpha/page.h
--- v2.1.110/linux/include/asm-alpha/page.h	Mon Oct 14 01:51:59 1996
+++ linux/include/asm-alpha/page.h	Wed Jul 22 12:44:48 1998
@@ -19,54 +19,51 @@
  */
 static inline void clear_page(unsigned long page)
 {
-	unsigned long count;
-	__asm__ __volatile__(
-		".align 4\n"
-		"1:\n\t"
-		"stq $31,0(%1)\n\t"
-		"stq $31,8(%1)\n\t"
-		"stq $31,16(%1)\n\t"
-		"stq $31,24(%1)\n\t"
-		"subq %0,1,%0\n\t"
-		"stq $31,32(%1)\n\t"
-		"stq $31,40(%1)\n\t"
-		"stq $31,48(%1)\n\t"
-		"stq $31,56(%1)\n\t"
-		"addq $1,64,$1\n\t"
-		"bne %0,1b"
-		:"=r" (count),"=r" (page)
-		:"0" (PAGE_SIZE/64), "1" (page));
+	unsigned long count = PAGE_SIZE/64;
+	unsigned long *ptr = (unsigned long *)page;
+
+	do {
+		ptr[0] = 0;
+		ptr[1] = 0;
+		ptr[2] = 0;
+		ptr[3] = 0;
+		count--;
+		ptr[4] = 0;
+		ptr[5] = 0;
+		ptr[6] = 0;
+		ptr[7] = 0;
+		ptr += 8;
+	} while (count);
 }
 
-static inline void copy_page(unsigned long to, unsigned long from)
+static inline void copy_page(unsigned long _to, unsigned long _from)
 {
-	unsigned long count;
-	__asm__ __volatile__(
-		".align 4\n"
-		"1:\n\t"
-		"ldq $0,0(%1)\n\t"
-		"ldq $1,8(%1)\n\t"
-		"ldq $2,16(%1)\n\t"
-		"ldq $3,24(%1)\n\t"
-		"ldq $4,32(%1)\n\t"
-		"ldq $5,40(%1)\n\t"
-		"ldq $6,48(%1)\n\t"
-		"ldq $7,56(%1)\n\t"
-		"subq %0,1,%0\n\t"
-		"addq %1,64,%1\n\t"
-		"stq $0,0(%2)\n\t"
-		"stq $1,8(%2)\n\t"
-		"stq $2,16(%2)\n\t"
-		"stq $3,24(%2)\n\t"
-		"stq $4,32(%2)\n\t"
-		"stq $5,40(%2)\n\t"
-		"stq $6,48(%2)\n\t"
-		"stq $7,56(%2)\n\t"
-		"addq %2,64,%2\n\t"
-		"bne %0,1b"
-		:"=r" (count), "=r" (from), "=r" (to)
-		:"0" (PAGE_SIZE/64), "1" (from), "2" (to)
-		:"$0","$1","$2","$3","$4","$5","$6","$7");
+	unsigned long count = PAGE_SIZE/64;
+	unsigned long *to = (unsigned long *)_to;
+	unsigned long *from = (unsigned long *)_from;
+
+	do {
+		unsigned long a,b,c,d,e,f,g,h;
+		a = from[0];
+		b = from[1];
+		c = from[2];
+		d = from[3];
+		e = from[4];
+		f = from[5];
+		g = from[6];
+		h = from[7];
+		count--;
+		from += 8;
+		to[0] = a;
+		to[1] = b;
+		to[2] = c;
+		to[3] = d;
+		to[4] = e;
+		to[5] = f;
+		to[6] = g;
+		to[7] = h;
+		to += 8;
+	} while (count);
 }
 
 #ifdef STRICT_MM_TYPECHECKS
diff -u --recursive --new-file v2.1.110/linux/include/asm-alpha/pgtable.h linux/include/asm-alpha/pgtable.h
--- v2.1.110/linux/include/asm-alpha/pgtable.h	Tue Jul 21 00:15:32 1998
+++ linux/include/asm-alpha/pgtable.h	Wed Jul 22 12:44:49 1998
@@ -190,6 +190,7 @@
 
 #define VMALLOC_START		0xFFFFFE0000000000
 #define VMALLOC_VMADDR(x)	((unsigned long)(x))
+#define VMALLOC_END		(~0UL)
 
 /*
  * OSF/1 PAL-code-imposed page table bits
diff -u --recursive --new-file v2.1.110/linux/include/asm-alpha/processor.h linux/include/asm-alpha/processor.h
--- v2.1.110/linux/include/asm-alpha/processor.h	Tue Apr 14 14:29:24 1998
+++ linux/include/asm-alpha/processor.h	Wed Jul 22 12:44:49 1998
@@ -45,14 +45,21 @@
 	unsigned long pal_flags;
 	unsigned long res1, res2;
 
-	/* the fields below are Linux-specific: */
-	/* bit 1..5: IEEE_TRAP_ENABLE bits (see fpu.h) */
-	/* bit 6..8: UAC bits (see sysinfo.h) */
-	/* bit 17..21: IEEE_STATUS_MASK bits (see fpu.h) */
-	/* bit 63: die_if_kernel recursion lock */
+	/*
+	 * The fields below are Linux-specific:
+	 *
+	 * bit 1..5: IEEE_TRAP_ENABLE bits (see fpu.h)
+	 * bit 6..8: UAC bits (see sysinfo.h)
+	 * bit 17..21: IEEE_STATUS_MASK bits (see fpu.h)
+	 * bit 63: die_if_kernel recursion lock
+	 */
 	unsigned long flags;
-	/* perform syscall argument validation (get/set_fs) */
+
+	/* Perform syscall argument validation (get/set_fs). */
 	mm_segment_t fs;
+
+	/* Breakpoint handling for ptrace.  */
+	long debugreg[8];
 };
 
 #define INIT_MMAP { &init_mm, 0xfffffc0000000000,  0xfffffc0010000000, \
diff -u --recursive --new-file v2.1.110/linux/include/asm-i386/fixmap.h linux/include/asm-i386/fixmap.h
--- v2.1.110/linux/include/asm-i386/fixmap.h	Tue Jul 21 00:15:32 1998
+++ linux/include/asm-i386/fixmap.h	Tue Jul 21 10:46:42 1998
@@ -33,16 +33,16 @@
  * task switches.
  */
 
-enum fixed_addresses {
 /*
  * on UP currently we will have no trace of the fixmap mechanizm,
  * no page table allocations, etc. This might change in the
  * future, say framebuffers for the console driver(s) could be
  * fix-mapped?
  */
+enum fixed_addresses {
 #if __SMP__
-	FIX_APIC_BASE 			= 1,	/* 0xfffff000 */
-	FIX_IO_APIC_BASE 		= 2,	/* 0xffffe000 */
+	FIX_APIC_BASE,
+	FIX_IO_APIC_BASE,
 #endif
 	__end_of_fixed_addresses
 };
@@ -50,9 +50,15 @@
 extern void set_fixmap (enum fixed_addresses idx, unsigned long phys);
 
 /*
- * used by vmalloc.c:
+ * used by vmalloc.c.
+ *
+ * Leave one empty page between vmalloc'ed areas and
+ * the start of the fixmap, and leave one page empty
+ * at the top of mem..
  */
-#define FIXADDR_START (0UL-((__end_of_fixed_addresses-1)<<PAGE_SHIFT))
+#define FIXADDR_TOP	(0xffffe000UL)
+#define FIXADDR_SIZE	(__end_of_fixed_addresses << PAGE_SHIFT)
+#define FIXADDR_START	(FIXADDR_TOP - FIXADDR_SIZE)
 
 /*
  * 'index to address' translation. If anyone tries to use the idx
@@ -67,10 +73,10 @@
 	 * illegal way. (such as mixing up address types or using
 	 * out-of-range indices)
 	 */
-	if ((!idx) || (idx >= __end_of_fixed_addresses))
+	if (idx >= __end_of_fixed_addresses)
 		panic("illegal fixaddr index!");
 
-        return (0UL-(unsigned long)(idx<<PAGE_SHIFT));
+        return FIXADDR_TOP - (idx << PAGE_SHIFT);
 }
 
 #endif
diff -u --recursive --new-file v2.1.110/linux/include/asm-i386/ioctls.h linux/include/asm-i386/ioctls.h
--- v2.1.110/linux/include/asm-i386/ioctls.h	Tue Feb 17 13:12:48 1998
+++ linux/include/asm-i386/ioctls.h	Fri Jul 24 11:10:16 1998
@@ -65,6 +65,8 @@
 
 #define TIOCMIWAIT	0x545C	/* wait for a change on serial input line(s) */
 #define TIOCGICOUNT	0x545D	/* read serial port inline interrupt counts */
+#define TIOCGHAYESESP   0x545E  /* Get Hayes ESP configuration */
+#define TIOCSHAYESESP   0x545F  /* Set Hayes ESP configuration */
 
 /* Used for packet mode */
 #define TIOCPKT_DATA		 0
diff -u --recursive --new-file v2.1.110/linux/include/asm-i386/smp.h linux/include/asm-i386/smp.h
--- v2.1.110/linux/include/asm-i386/smp.h	Tue Jul 21 00:15:33 1998
+++ linux/include/asm-i386/smp.h	Wed Jul 22 14:45:23 1998
@@ -165,7 +165,7 @@
 extern volatile unsigned long cpu_callin_map[NR_CPUS];
 extern volatile unsigned char active_kernel_processor;
 extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs);
-extern void smp_reschedule_irq(int cpl, struct pt_regs *regs);
+extern void smp_send_reschedule(int cpu);
 extern unsigned long ipi_count;
 extern void smp_invalidate_rcv(void);		/* Process an NMI */
 extern void smp_local_timer_interrupt(struct pt_regs * regs);
diff -u --recursive --new-file v2.1.110/linux/include/asm-sparc/linux_logo.h linux/include/asm-sparc/linux_logo.h
--- v2.1.110/linux/include/asm-sparc/linux_logo.h	Thu Jul 16 18:09:29 1998
+++ linux/include/asm-sparc/linux_logo.h	Tue Jul 21 10:28:23 1998
@@ -1,4 +1,4 @@
-/* $Id: linux_logo.h,v 1.3 1998/07/08 10:21:23 jj Exp $
+/* $Id: linux_logo.h,v 1.4 1998/07/21 10:36:56 jj Exp $
  * include/asm-sparc/linux_logo.h: This is a linux logo
  *                                 to be displayed on boot.
  *
@@ -25,5 +25,26 @@
 
 #define LINUX_LOGO_COLORS 221
 
+#ifdef INCLUDE_LINUX_LOGO_DATA
+
 #include <linux/linux_logo.h>
 
+unsigned char linux_logo16_red[0];
+unsigned char linux_logo16_green[0];
+unsigned char linux_logo16_blue[0];
+unsigned char linux_logo16[0];
+
+#else
+
+/* prototypes only */
+extern unsigned char linux_logo_red[];
+extern unsigned char linux_logo_green[];
+extern unsigned char linux_logo_blue[];
+extern unsigned char linux_logo[];
+extern unsigned char linux_logo_bw[];
+extern unsigned char linux_logo16_red[];
+extern unsigned char linux_logo16_green[];
+extern unsigned char linux_logo16_blue[];
+extern unsigned char linux_logo16[];
+
+#endif
diff -u --recursive --new-file v2.1.110/linux/include/linux/ax25.h linux/include/linux/ax25.h
--- v2.1.110/linux/include/linux/ax25.h	Thu May 29 21:53:10 1997
+++ linux/include/linux/ax25.h	Wed Jul 22 13:45:58 1998
@@ -7,7 +7,7 @@
 #define	AX25_KERNEL_H
 
 #define AX25_MTU	256
-#define AX25_MAX_DIGIS	6	/* This is wrong, should be 8 */
+#define AX25_MAX_DIGIS  8
 
 #define AX25_WINDOW	1
 #define AX25_T1		2
@@ -71,11 +71,13 @@
 };
 
 struct ax25_ctl_struct {
-	ax25_address	port_addr;
-	ax25_address	source_addr;
-	ax25_address	dest_addr;
-	unsigned int	cmd;
-	unsigned long	arg;
+        ax25_address            port_addr;
+        ax25_address            source_addr;
+        ax25_address            dest_addr;
+        unsigned int            cmd;
+        unsigned long           arg;
+        unsigned char           digi_count;
+        ax25_address            digi_addr[AX25_MAX_DIGIS];
 };
 
 struct ax25_info_struct {
diff -u --recursive --new-file v2.1.110/linux/include/linux/console.h linux/include/linux/console.h
--- v2.1.110/linux/include/linux/console.h	Tue Jul 21 00:15:33 1998
+++ linux/include/linux/console.h	Tue Jul 21 10:28:23 1998
@@ -15,6 +15,7 @@
 #define _LINUX_CONSOLE_H_ 1
 
 struct vc_data;
+struct console_font_op;
 
 /*
  * this is what the terminal answers to a ESC-Z or csi0c query.
@@ -22,8 +23,6 @@
 #define VT100ID "\033[?1;2c"
 #define VT102ID "\033[?6c"
 
-/* DPC: 1994-04-13 !!! con_putcs is new entry !!! */
-
 struct consw {
 	const char *(*con_startup)(void);
 	void	(*con_init)(struct vc_data *, int);
@@ -36,12 +35,13 @@
 	void	(*con_bmove)(struct vc_data *, int, int, int, int, int, int);
 	int	(*con_switch)(struct vc_data *);
 	int	(*con_blank)(struct vc_data *, int);
-	int	(*con_get_font)(struct vc_data *, int *, int *, char *);
-	int	(*con_set_font)(struct vc_data *, int, int, char *);
+	int	(*con_font_op)(struct vc_data *, struct console_font_op *);
 	int	(*con_set_palette)(struct vc_data *, unsigned char *);
 	int	(*con_scrolldelta)(struct vc_data *, int);
 	int	(*con_set_origin)(struct vc_data *);
 	void	(*con_save_screen)(struct vc_data *);
+	u8	(*con_build_attr)(struct vc_data *, u8, u8, u8, u8, u8);
+	void	(*con_invert_region)(struct vc_data *, u16 *, int);
 };
 
 extern struct consw *conswitchp;
@@ -108,10 +108,10 @@
 extern int unregister_console(struct console *);
 extern struct console *console_drivers;
 
-/* VEA Blanking Levels */
+/* VESA Blanking Levels */
 #define VESA_NO_BLANKING        0
 #define VESA_VSYNC_SUSPEND      1
 #define VESA_HSYNC_SUSPEND      2
 #define VESA_POWERDOWN          3
 
-#endif /* linux/console.h */
+#endif /* _LINUX_CONSOLE_H */
diff -u --recursive --new-file v2.1.110/linux/include/linux/console_struct.h linux/include/linux/console_struct.h
--- v2.1.110/linux/include/linux/console_struct.h	Tue Jul 21 00:15:33 1998
+++ linux/include/linux/console_struct.h	Wed Jul 22 13:40:04 1998
@@ -1,7 +1,12 @@
 /*
  * console_struct.h
  *
- * Data structure and defines shared between console.c, vga.c and tga.c
+ * Data structure describing single virtual console except for data
+ * used by vt.c.
+ *
+ * Fields marked with [#] must be set by the low-level driver.
+ * Fields marked with [!] can be changed by the low-level driver
+ * to achieve effects such as fast scrolling by changing the origin.
  */
 
 /*
@@ -14,7 +19,7 @@
 
 struct vc_data {
 	unsigned short	vc_num;			/* Console number */
-	unsigned int	vc_cols;		/* Console size */
+	unsigned int	vc_cols;		/* [#] Console size */
 	unsigned int	vc_rows;
 	unsigned int	vc_size_row;		/* Bytes per row */
 	struct consw	*vc_sw;
@@ -27,14 +32,15 @@
 	unsigned char	vc_s_color;		/* Saved foreground & background */
 	unsigned char	vc_ulcolor;		/* Color for underline mode */
 	unsigned char	vc_halfcolor;		/* Color for half intensity mode */
+	unsigned short	vc_complement_mask;	/* [#] Xor mask for mouse pointer */
+	unsigned short	vc_hi_font_mask;	/* [#] Attribute set for upper 256 chars or font or 0 if not supported */
 	unsigned int	vc_x, vc_y;		/* Cursor position */
 	unsigned int	vc_top, vc_bottom;	/* Scrolling region */
 	unsigned int	vc_state;		/* Escape sequence parser state */
 	unsigned int	vc_npar,vc_par[NPAR];	/* Parameters of current escape sequence */
-	unsigned long	vc_scr_top;		/* Top of video memory */
-	unsigned long	vc_origin;		/* Start of real screen */
-	unsigned long	vc_scr_end;		/* End of real screen */
-	unsigned long	vc_visible_origin;	/* Top of visible window */
+	unsigned long	vc_origin;		/* [!] Start of real screen */
+	unsigned long	vc_scr_end;		/* [!] End of real screen */
+	unsigned long	vc_visible_origin;	/* [!] Top of visible window */
 	unsigned long	vc_pos;			/* Cursor address */
 	unsigned int	vc_saved_x;
 	unsigned int	vc_saved_y;
@@ -77,7 +83,7 @@
 	unsigned int	vc_bell_pitch;		/* Console bell pitch */
 	unsigned int	vc_bell_duration;	/* Console bell duration */
 	unsigned int	vc_cursor_type;
-	struct vc_data **vc_display_fg;		/* Ptr to var holding fg console for this display */
+	struct vc_data **vc_display_fg;		/* [!] Ptr to var holding fg console for this display */
 	/* additional information is in vt_kern.h */
 };
 
diff -u --recursive --new-file v2.1.110/linux/include/linux/dcache.h linux/include/linux/dcache.h
--- v2.1.110/linux/include/linux/dcache.h	Thu May  7 22:51:55 1998
+++ linux/include/linux/dcache.h	Fri Jul 24 11:19:10 1998
@@ -138,6 +138,9 @@
 /* only used at mount-time */
 extern struct dentry * d_alloc_root(struct inode * root_inode, struct dentry * old_root);
 
+/* test whether root is busy without destroying dcache */
+extern int is_root_busy(struct dentry *);
+
 /*
  * This adds the entry to the hash queues and initializes "d_inode".
  * The entry was actually filled in earlier during "d_alloc()"
diff -u --recursive --new-file v2.1.110/linux/include/linux/fs.h linux/include/linux/fs.h
--- v2.1.110/linux/include/linux/fs.h	Tue Jul 21 00:15:33 1998
+++ linux/include/linux/fs.h	Wed Jul 22 14:53:18 1998
@@ -46,7 +46,7 @@
 /* And dynamically-tunable limits and defaults: */
 extern int max_inodes;
 extern int max_files, nr_files, nr_free_files;
-#define NR_INODE 4096	/* This should no longer be bigger than NR_FILE */
+
 #define NR_FILE  4096	/* this can well be larger on a larger system */
 #define NR_RESERVED_FILES 10 /* reserved for root */
 
diff -u --recursive --new-file v2.1.110/linux/include/linux/hayesesp.h linux/include/linux/hayesesp.h
--- v2.1.110/linux/include/linux/hayesesp.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/hayesesp.h	Fri Jul 24 11:10:16 1998
@@ -0,0 +1,127 @@
+#ifndef HAYESESP_H
+#define HAYESESP_H
+
+struct hayes_esp_config {
+	short flow_on;
+	short flow_off;
+	short rx_trigger;
+	short tx_trigger;
+	short pio_threshold;
+	unsigned char rx_timeout;
+	char dma_channel;
+};
+
+#ifdef __KERNEL__
+
+#define ESP_DMA_CHANNEL   0
+#define ESP_RX_TRIGGER    768
+#define ESP_TX_TRIGGER    768
+#define ESP_FLOW_OFF      1016
+#define ESP_FLOW_ON       944
+#define ESP_RX_TMOUT      128
+#define ESP_PIO_THRESHOLD 32
+
+#define ESP_IN_MAJOR	57	/* major dev # for dial in */
+#define ESP_OUT_MAJOR	58	/* major dev # for dial out */
+#define ESPC_SCALE 	3
+#define UART_ESI_BASE	0x00
+#define UART_ESI_SID	0x01
+#define UART_ESI_RX	0x02
+#define UART_ESI_TX	0x02
+#define UART_ESI_CMD1	0x04
+#define UART_ESI_CMD2	0x05
+#define UART_ESI_STAT1	0x04
+#define UART_ESI_STAT2	0x05
+#define UART_ESI_RWS	0x07
+
+#define UART_IER_DMA_TMOUT	0x80
+#define UART_IER_DMA_TC		0x08
+
+#define ESI_SET_IRQ		0x04
+#define ESI_SET_DMA_TMOUT	0x05
+#define ESI_SET_SRV_MASK	0x06
+#define ESI_SET_ERR_MASK	0x07
+#define ESI_SET_FLOW_CNTL	0x08
+#define ESI_SET_FLOW_CHARS	0x09
+#define ESI_SET_FLOW_LVL	0x0a
+#define ESI_SET_TRIGGER		0x0b
+#define ESI_SET_RX_TIMEOUT	0x0c
+#define ESI_SET_FLOW_TMOUT	0x0d
+#define ESI_WRITE_UART		0x0e
+#define ESI_READ_UART		0x0f
+#define ESI_SET_MODE		0x10
+#define ESI_GET_ERR_STAT	0x12
+#define ESI_GET_UART_STAT	0x13
+#define ESI_GET_RX_AVAIL	0x14
+#define ESI_GET_TX_AVAIL	0x15
+#define ESI_START_DMA_RX	0x16
+#define ESI_START_DMA_TX	0x17
+#define ESI_ISSUE_BREAK		0x1a
+#define ESI_FLUSH_RX		0x1b
+#define ESI_FLUSH_TX		0x1c
+#define ESI_SET_BAUD		0x1d
+#define ESI_SET_ENH_IRQ		0x1f
+#define ESI_SET_REINTR		0x20
+#define ESI_SET_PRESCALAR	0x23
+#define ESI_NO_COMMAND		0xff
+
+#define ESP_STAT_RX_TIMEOUT	0x01
+#define ESP_STAT_DMA_RX		0x02
+#define ESP_STAT_DMA_TX		0x04
+#define ESP_STAT_NEVER_DMA      0x08
+#define ESP_STAT_USE_PIO        0x10
+
+#define ESP_EVENT_WRITE_WAKEUP	0
+#define ESP_MAGIC		0x53ee
+#define ESP_XMIT_SIZE		4096
+
+struct esp_struct {
+	int			magic;
+	int			port;
+	int			irq;
+	int			flags; 		/* defined in tty.h */
+	struct tty_struct 	*tty;
+	int			read_status_mask;
+	int			ignore_status_mask;
+	int			timeout;
+	int			stat_flags;
+	int			custom_divisor;
+	int			close_delay;
+	unsigned short		closing_wait;
+	unsigned short		closing_wait2;
+	int			IER; 	/* Interrupt Enable Register */
+	int			MCR; 	/* Modem control register */
+	unsigned long		event;
+	unsigned long		last_active;
+	int			line;
+	int			count;	    /* # of fd on device */
+	int			blocked_open; /* # of blocked opens */
+	long			session; /* Session of opening process */
+	long			pgrp; /* pgrp of opening process */
+	unsigned char 		*xmit_buf;
+	int			xmit_head;
+	int			xmit_tail;
+	int			xmit_cnt;
+	struct tq_struct	tqueue;
+	struct tq_struct	tqueue_hangup;
+	struct termios		normal_termios;
+	struct termios		callout_termios;
+	struct wait_queue	*open_wait;
+	struct wait_queue	*close_wait;
+	struct wait_queue	*delta_msr_wait;
+	struct wait_queue	*break_wait;
+	struct async_icount	icount;	/* kernel counters for the 4 input interrupts */
+	struct hayes_esp_config config; /* port configuration */
+	struct esp_struct	*next_port; /* For the linked list */
+};
+
+struct esp_pio_buffer {
+	unsigned char data[1024];
+	struct esp_pio_buffer *next;
+};
+
+#endif /* __KERNEL__ */
+
+
+#endif /* ESP_H */
+
diff -u --recursive --new-file v2.1.110/linux/include/linux/i2c.h linux/include/linux/i2c.h
--- v2.1.110/linux/include/linux/i2c.h	Wed Dec 31 16:00:00 1969
+++ linux/include/linux/i2c.h	Tue Jul 21 12:55:39 1998
@@ -0,0 +1,166 @@
+#ifndef I2C_H
+#define I2C_H
+
+/*
+ * linux i2c interface.  Works a little bit like the scsi subsystem.
+ * There are:
+ *
+ *     i2c          the basic control module        (like scsi_mod)
+ *     bus driver   a driver with a i2c bus         (host adapter driver)
+ *     chip driver  a driver for a chip connected
+ *                  to a i2c bus                    (cdrom/hd driver)
+ *
+ * A device will be attached to one bus and one chip driver.  Every chip
+ * driver gets a unique ID.
+ *
+ * A chip driver can provide a ioctl-like callback for the
+ * communication with other parts of the kernel (not every i2c chip is
+ * useful without other devices, a TV card tuner for example). 
+ *
+ * "i2c internal" parts of the structs: only the i2c module is allowed to
+ * write to them, for others they are read-only.
+ *
+ */
+
+#define I2C_BUS_MAX       4    /* max # of bus drivers  */
+#define I2C_DRIVER_MAX    8    /* max # of chip drivers */
+#define I2C_DEVICE_MAX    8    /* max # if devices per bus/driver */
+
+struct i2c_bus;
+struct i2c_driver;
+struct i2c_device;
+
+#define I2C_DRIVERID_MSP3400     1
+#define I2C_DRIVERID_TUNER       2
+#define I2C_DRIVERID_VIDEOTEXT	 3
+
+#define I2C_BUSID_BT848		1	/* I2C bus on a BT848 */
+
+/*
+ * struct for a driver for a i2c chip (tuner, soundprocessor,
+ * videotext, ... ).
+ *
+ * a driver will register within the i2c module.  The i2c module will
+ * callback the driver (i2c_attach) for every device it finds on a i2c
+ * bus at the specified address.  If the driver decides to "accept"
+ * the, device, it must return a struct i2c_device, and NULL
+ * otherwise.
+ *
+ * i2c_detach = i2c_attach ** -1
+ * 
+ * i2c_command will be used to pass commands to the driver in a
+ * ioctl-line manner.
+ *
+ */
+
+struct i2c_driver 
+{
+    char           name[32];         /* some useful label         */
+    int            id;               /* device type ID            */
+    unsigned char  addr_l, addr_h;   /* address range of the chip */
+
+    int (*attach)(struct i2c_device *device);
+    int (*detach)(struct i2c_device *device);
+    int (*command)(struct i2c_device *device,unsigned int cmd, void *arg);
+
+    /* i2c internal */
+    struct i2c_device   *devices[I2C_DEVICE_MAX];
+    int                 devcount;
+};
+
+
+/*
+ * this holds the informations about a i2c bus available in the system.
+ * 
+ * a chip with a i2c bus interface (like bt848) registers the bus within
+ * the i2c module. This struct provides functions to access the i2c bus.
+ * 
+ * One must hold the spinlock to access the i2c bus (XXX: is the irqsave
+ * required? Maybe better use a semaphore?). 
+ * [-AC-] having a spinlock_irqsave is only needed if we have drivers wishing
+ *	  to bang their i2c bus from an interrupt.
+ * 
+ * attach/detach_inform is a callback to inform the bus driver about
+ * attached chip drivers.
+ *
+ */
+
+/* needed: unsigned long flags */
+
+#define LOCK_I2C_BUS(bus)    spin_lock_irqsave(&(bus->bus_lock),flags);
+#define UNLOCK_I2C_BUS(bus)  spin_unlock_irqrestore(&(bus->bus_lock),flags);
+
+struct i2c_bus 
+{
+	char  name[32];         /* some useful label */
+	int   id;
+	void  *data;            /* free for use by the bus driver */
+
+	spinlock_t bus_lock;
+
+	/* attach/detach inform callbacks */
+	void    (*attach_inform)(struct i2c_bus *bus, int id);
+	void    (*detach_inform)(struct i2c_bus *bus, int id);
+
+	/* Software I2C */
+	void    (*i2c_setlines)(struct i2c_bus *bus, int ctrl, int data);
+	int     (*i2c_getdataline)(struct i2c_bus *bus);
+
+	/* Hardware I2C */
+	int     (*i2c_read)(struct i2c_bus *bus, unsigned char addr);
+	int     (*i2c_write)(struct i2c_bus *bus, unsigned char addr,
+			 unsigned char b1, unsigned char b2, int both);
+
+	/* internal data for i2c module */
+	struct i2c_device   *devices[I2C_DEVICE_MAX];
+	int                 devcount;
+};
+
+
+/*
+ *	This holds per-device data for a i2c device
+ */
+
+struct i2c_device 
+{
+	char           name[32];         /* some useful label */
+	void           *data;            /* free for use by the chip driver */
+	unsigned char  addr;             /* chip addr */
+
+	/* i2c internal */
+	struct i2c_bus     *bus;
+	struct i2c_driver  *driver;
+};
+
+
+/* ------------------------------------------------------------------- */
+/* i2c module functions                                                */
+
+/* register/unregister a i2c bus */
+int i2c_register_bus(struct i2c_bus *bus);
+int i2c_unregister_bus(struct i2c_bus *bus);
+
+/* register/unregister a chip driver */
+int i2c_register_driver(struct i2c_driver *driver);
+int i2c_unregister_driver(struct i2c_driver *driver);
+
+/* send a command to a chip using the ioctl-like callback interface */
+int i2c_control_device(struct i2c_bus *bus, int id,
+		       unsigned int cmd, void *arg);
+
+/* i2c bus access functions */
+void    i2c_start(struct i2c_bus *bus);
+void    i2c_stop(struct i2c_bus *bus);
+void    i2c_one(struct i2c_bus *bus);
+void    i2c_zero(struct i2c_bus *bus);
+int     i2c_ack(struct i2c_bus *bus);
+
+int     i2c_sendbyte(struct i2c_bus *bus,unsigned char data,int wait_for_ack);
+unsigned char i2c_readbyte(struct i2c_bus *bus,int last);
+
+/* i2c (maybe) hardware functions */
+int     i2c_read(struct i2c_bus *bus, unsigned char addr);
+int     i2c_write(struct i2c_bus *bus, unsigned char addr,
+		  unsigned char b1, unsigned char b2, int both);
+
+#endif /* I2C_H */
diff -u --recursive --new-file v2.1.110/linux/include/linux/kd.h linux/include/linux/kd.h
--- v2.1.110/linux/include/linux/kd.h	Fri Feb  6 15:33:19 1998
+++ linux/include/linux/kd.h	Tue Jul 21 10:28:23 1998
@@ -132,8 +132,26 @@
 
 #define KDSIGACCEPT	0x4B4E	/* accept kbd generated signals */
 
+#define KDFONTOP	0x4B72	/* font operations */
+
+struct console_font_op {
+	unsigned int op;	/* operation code KD_FONT_OP_* */
+	unsigned int flags;	/* KD_FONT_FLAG_* */
+	unsigned int width, height;	/* font size */
+	unsigned int charcount;
+	unsigned char *data;	/* font data with height fixed to 32 */
+};
+
+#define KD_FONT_OP_SET		0	/* Set font */
+#define KD_FONT_OP_GET		1	/* Get font */
+#define KD_FONT_OP_SET_DEFAULT	2	/* Set font to default, data points to name / NULL */
+#define KD_FONT_OP_COPY		3	/* Copy from another console */
+
+#define KD_FONT_FLAG_GLOBAL		1	/* Change on _all_ consoles */
+#define KD_FONT_FLAG_DONT_RECALC 	2	/* Don't recalculate hw charcell size [compat] */
+
 /* note: 0x4B00-0x4B4E all have had a value at some time;
    don't reuse for the time being */
-/* note: 0x4B60-0x4B6D, 0x4B70, 0x4B71 used above */
+/* note: 0x4B60-0x4B6D, 0x4B70-0x4B72 used above */
 
 #endif /* _LINUX_KD_H */
diff -u --recursive --new-file v2.1.110/linux/include/linux/nfsd/nfsfh.h linux/include/linux/nfsd/nfsfh.h
--- v2.1.110/linux/include/linux/nfsd/nfsfh.h	Sun Jun  7 11:16:39 1998
+++ linux/include/linux/nfsd/nfsfh.h	Wed Jul 22 14:55:13 1998
@@ -27,12 +27,12 @@
  * ino/dev of the exported inode.
  */
 struct nfs_fhbase {
-	struct dentry *		fb_dentry;	/* dentry cookie */
-	ino_t			fb_ino;		/* our inode number */
-	ino_t			fb_dirino;	/* dir inode number */
-	kdev_t			fb_dev;		/* our device */
-	kdev_t			fb_xdev;
-	ino_t			fb_xino;
+	struct dentry *	fb_dentry;	/* dentry cookie */
+	__u32		fb_ino;		/* our inode number */
+	__u32		fb_dirino;	/* dir inode number */
+	__u32		fb_dev;		/* our device */
+	__u32		fb_xdev;
+	__u32		fb_xino;
 };
 
 #define NFS_FH_PADDING		(NFS_FHSIZE - sizeof(struct nfs_fhbase))
@@ -49,6 +49,29 @@
 #define fh_xino			fh_base.fb_xino
 
 #ifdef __KERNEL__
+
+/*
+ * Conversion macros for the filehandle fields.
+ */
+extern inline __u32 kdev_t_to_u32(kdev_t dev)
+{
+	return (__u32) dev;
+}
+
+extern inline kdev_t u32_to_kdev_t(__u32 udev)
+{
+	return (kdev_t) udev;
+}
+
+extern inline __u32 ino_t_to_u32(ino_t ino)
+{
+	return (__u32) ino;
+}
+
+extern inline ino_t u32_to_ino_t(__u32 uino)
+{
+	return (ino_t) uino;
+}
 
 /*
  * This is the internal representation of an NFS handle used in knfsd.
diff -u --recursive --new-file v2.1.110/linux/include/linux/pci.h linux/include/linux/pci.h
--- v2.1.110/linux/include/linux/pci.h	Tue Jul 21 00:15:33 1998
+++ linux/include/linux/pci.h	Wed Jul 22 14:53:18 1998
@@ -1,5 +1,5 @@
 /*
- *	$Id: pci.h,v 1.76 1998/07/15 20:34:50 mj Exp $
+ *	$Id: pci.h,v 1.80 1998/07/21 10:06:40 mj Exp $
  *
  *	PCI defines and function prototypes
  *	Copyright 1994, Drew Eckhardt
@@ -572,6 +572,7 @@
 #define PCI_DEVICE_ID_CMD_640		0x0640
 #define PCI_DEVICE_ID_CMD_643		0x0643
 #define PCI_DEVICE_ID_CMD_646		0x0646
+#define PCI_DEVICE_ID_CMD_647		0x0647
 #define PCI_DEVICE_ID_CMD_670		0x0670
 
 #define PCI_VENDOR_ID_VISION		0x1098
@@ -602,6 +603,7 @@
 
 #define PCI_VENDOR_ID_MADGE		0x10b6
 #define PCI_DEVICE_ID_MADGE_MK2		0x0002
+#define PCI_DEVICE_ID_MADGE_C155S	0x1001
 
 #define PCI_VENDOR_ID_3COM		0x10b7
 #define PCI_DEVICE_ID_3COM_3C339	0x3390
@@ -901,6 +903,9 @@
 #define PCI_VENDOR_ID_ENSONIQ		0x1274
 #define PCI_DEVICE_ID_ENSONIQ_AUDIOPCI	0x5000
 
+#define PCI_VENDOR_ID_ALTEON		0x12ae
+#define PCI_DEVICE_ID_ALTEON_ACENIC	0x0001
+
 #define PCI_VENDOR_ID_PICTUREL		0x12c5
 #define PCI_DEVICE_ID_PICTUREL_PCIVST	0x0081
 
@@ -1168,73 +1173,26 @@
 #ifndef CONFIG_PCI
 /* If the system does not have PCI, clearly these return errors.  Define
    these as simple inline functions to avoid hair in drivers.  */
-extern inline
-int pcibios_present(void) { return 0; }
-
-extern inline
-int pcibios_read_config_byte (unsigned char bus, unsigned char dev_fn,
-                              unsigned char where, unsigned char *val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pcibios_read_config_word (unsigned char bus, unsigned char dev_fn,
-                              unsigned char where, unsigned short *val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pcibios_read_config_dword (unsigned char bus, unsigned char dev_fn,
-                               unsigned char where, unsigned int *val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pcibios_write_config_byte (unsigned char bus, unsigned char dev_fn,
-                               unsigned char where, unsigned char val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pcibios_write_config_word (unsigned char bus, unsigned char dev_fn,
-                               unsigned char where, unsigned short val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pcibios_write_config_dword (unsigned char bus, unsigned char dev_fn,
-                                unsigned char where, unsigned int val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
+extern inline int pcibios_present(void) { return 0; }
 
-extern inline
-int pci_read_config_byte(struct pci_dev *dev, u8 where, u8 *val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pci_read_config_word(struct pci_dev *dev, u8 where, u16 *val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pci_read_config_dword(struct pci_dev *dev, u8 where, u32 *val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pci_write_config_byte(struct pci_dev *dev, u8 where, u8 val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pci_write_config_word(struct pci_dev *dev, u8 where, u16 val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
-
-extern inline
-int pci_write_config_dword(struct pci_dev *dev, u8 where, u32 val)
-{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
+#define _PCI_NOP(o,s,t) \
+	extern inline int pcibios_##o##_config_##s## (u8 bus, u8 dfn, u8 where, t val) \
+		{ return PCIBIOS_FUNC_NOT_SUPPORTED; } \
+	extern inline int pci_##o##_config_##s## (struct pci_dev *dev, u8 where, t val) \
+		{ return PCIBIOS_FUNC_NOT_SUPPORTED; }
+#define _PCI_NOP_ALL(o,x)	_PCI_NOP(o,byte,u8 x) \
+				_PCI_NOP(o,word,u16 x) \
+				_PCI_NOP(o,dword,u32 x)
+_PCI_NOP_ALL(read, *)
+_PCI_NOP_ALL(write,)
 
-extern inline struct pci_dev *
-pci_find_device (unsigned int vendor, unsigned int device, struct pci_dev *from)
+extern inline struct pci_dev *pci_find_device(unsigned int vendor, unsigned int device, struct pci_dev *from)
 { return NULL; }
 
-extern inline
-struct pci_dev *pci_find_class (unsigned int class, struct pci_dev *from)
+extern inline struct pci_dev *pci_find_class(unsigned int class, struct pci_dev *from)
 { return NULL; }
 
-extern inline
-struct pci_dev *pci_find_slot (unsigned int bus, unsigned int devfn)
+extern inline struct pci_dev *pci_find_slot(unsigned int bus, unsigned int devfn)
 { return NULL; }
 
 #endif /* !CONFIG_PCI */
diff -u --recursive --new-file v2.1.110/linux/include/linux/radio.h linux/include/linux/radio.h
--- v2.1.110/linux/include/linux/radio.h	Tue Nov  4 10:23:25 1997
+++ linux/include/linux/radio.h	Wed Dec 31 16:00:00 1969
@@ -1,134 +0,0 @@
-/*
- * linux/radio.h
- *
- * Include for radio card support under linux
- * Another pointless suid-binary removal utility... :-)
- */
-
-#ifndef _LINUX_RADIO_H
-#define _LINUX_RADIO_H
-
-#include <linux/ioctl.h>
-
-/*
- * Constants
- */
-/* Various types of Radio card... */
-/* (NB.  I've made this a bit-field.  It might make the difference one day.) */
-#define	RADIO_TYPE_UNSUP	0x0000
-#define	RADIO_TYPE_RTRACK	0x0001	/* AIMSlab RadioTrack (RadioReveal) card -- basic, to say the least */
-#define	RADIO_TYPE_WINRADIO	0x0002	/* Dunno, but made by someone */
-#define	RADIO_TYPE_TYPHOON	0x0004	/* It exists... */
-
-/* waveband types */
-#define	RADIO_PROTOCOL_AM	0x0010	/* AM "protocol" */
-#define	RADIO_PROTOCOL_FM	0x0020	/* FM "protocol" */
-#define	RADIO_PROTOCOL_SSB	0x0040	/* SSB */
-/* and no doubt some other stuff, too (Brian?) */
-
-
-/* the following are _very_ inaccurate; essentially, all that
- * they do is provide a "name" for client programs
- */
-#define	RADIO_BAND_UNKNOWN	0x0000	/* other */
-#define	RADIO_BAND_AM_SW	0x0100	/* short wave (?) */
-#define	RADIO_BAND_AM_MW	0x0200	/* medium wave (540 - 1600) */
-#define	RADIO_BAND_AM_LW	0x0400	/* long wave (150 - 270) */
-#define	RADIO_BAND_FM_STD	0x1000	/* "standard" FM band (i.e.  88 - 108 or so) */
-
-
-/* Since floating-point stuff is illegal in the kernel, we use these
- * pairs of macros to convert to, and from userland floats
- * (I hope these are general enough!)
- */
-/* Remember to make sure that all of these are integral... */
-/* Also remember to pass sensible things in here (MHz for FM, kHz for AM) */
-#define	RADIO_FM_RES		100	/* 0.01 MHZ */
-#define	RADIO_FM_FRTOINT(fl)	((int)(((float)(fl))*RADIO_FM_RES))
-#define	RADIO_FM_INTTOFR(fr)	((float)(((int)(fr))/RADIO_FM_RES))
-
-/* Old RadioTrack definitions
-#define RADIO_FM_FRTOINT(fl)	((int)(((float)(fl)-88.0)*40)+0xf6c)
-#define RADIO_FM_INTTOFR(fr)	((float)(((fr)-0xf6c)/40)+88.0)
-*/
-
-#define	RADIO_AM_RES		1	/* 1 kHz */
-#define	RADIO_AM_FRTOINT(fl)	((int)(((float)(fl))*RADIO_AM_RES))
-#define	RADIO_AM_INTTOFR(fr)	((float)(((int)(fr))/RADIO_AM_RES))
-
-
-/*
- * Structures 
- */
-/* query structures */
-struct radio_cap {
-	int dev_num;			/* device index */
-	int type;			/* device type (see above) */
-	int num_bwidths;		/* number of "bandwidths" supported */
-	int volmin, volmax;		/* min/max in steps of one */
-};
-
-struct radio_band {
-	int dev_num;			/* device index (IN) */
-	int index;			/* "bandwidth" index (IN) */
-	int proto;			/* protocol (AM, FM, SSB, etc) (OUT) */
-	int types;			/* see RADIO_BAND_* above */
-	int freqmin,freqmax;		/* encoded according to the macros above */
-	int strmin,strmax;		/* min/max signal strength (steps of 1) */
-};
-
-/* Previously, this was in four separate structures:
- * radio_vol, radio_freq, radio_band and radio_sigstr,
- * That was foolish, but now it's not so obvious what's going on.
- * Be careful.
- */
-
-struct radio_ctl {
-	int dev_num;			/* device index (IN) */
-	int value;			/* volume, frequency, band, sigstr */
-};
-
-
-/*
- * ioctl numbers
- */
-/* You have _how_ many radio devices? =) */
-#define	RADIO_NUMDEVS	_IOR(0x8c, 0x00, int)
-#define	RADIO_GETCAPS	_IOR(0x8c, 0x01, struct radio_cap)
-#define	RADIO_GETBNDCAP	_IOR(0x8c, 0x02, struct radio_band)
-
-#define	RADIO_SETVOL	_IOW(0x8c, 0x10, struct radio_ctl)
-#define	RADIO_GETVOL	_IOR(0x8c, 0x11, struct radio_ctl)
-#define	RADIO_SETBAND	_IOW(0x8c, 0x12, struct radio_ctl)
-#define	RADIO_GETBAND	_IOR(0x8c, 0x13, struct radio_ctl)
-#define	RADIO_SETFREQ	_IOW(0x8c, 0x14, struct radio_ctl)
-#define	RADIO_GETFREQ	_IOR(0x8c, 0x15, struct radio_ctl)
-
-#define	RADIO_GETSIGSTR	_IOR(0x8c, 0x30, struct radio_ctl)
-
-/* kernel specific stuff... */
-#ifdef __KERNEL__
-/* Try to keep the number of function pointers to a minimum.
- * Devices are responsible for updating, or otherwise, the
- * variables here, not the outside wrapper.
- */
-struct radio_device;
-
-int radio_add_device(struct radio_device *newdev);
-
-struct radio_device {
-	struct radio_cap *cap;
-	struct radio_band *bands;	/* pointer to array of radio_bands */
-	int (*setvol)(struct radio_device*,int);
-	int curvol;
-	int (*setband)(struct radio_device*,int);
-	int curband;
-	int (*setfreq)(struct radio_device*,int);
-	int curfreq;
-	int (*getsigstr)(struct radio_device*);
-	struct radio_device *next;
-	void *misc;		/* device internal storage... (eg i/o addresses, etc */
-};
-#endif /* __KERNEL__ */
-
-#endif /* _LINUX_RADIO_H */
diff -u --recursive --new-file v2.1.110/linux/include/linux/selection.h linux/include/linux/selection.h
--- v2.1.110/linux/include/linux/selection.h	Thu Jul 16 18:09:29 1998
+++ linux/include/linux/selection.h	Wed Jul 22 14:53:48 1998
@@ -33,8 +33,7 @@
 
 extern void do_unblank_screen(void);
 extern unsigned short *screen_pos(int currcons, int w_offset, int viewed);
-extern unsigned short screen_word(int currcons, int offset, int viewed);
-extern int scrw2glyph(unsigned short scr_word);
+extern u16 screen_glyph(int currcons, int offset);
 extern void complement_pos(int currcons, int offset);
 extern void invert_screen(int currcons, int offset, int count, int shift);
 
diff -u --recursive --new-file v2.1.110/linux/include/linux/soundcard.h linux/include/linux/soundcard.h
--- v2.1.110/linux/include/linux/soundcard.h	Thu Jul 16 18:09:29 1998
+++ linux/include/linux/soundcard.h	Wed Jul 22 13:45:58 1998
@@ -193,12 +193,16 @@
  *	The following patch_info structure has been designed to support
  *	Gravis UltraSound. It tries to be universal format for uploading
  *	sample based patches but is probably too limited.
+ *
+ *      (PBD) As Hannu guessed, the GUS structure is too limited for 
+ *      the WaveFront, but this is the right place for a constant definition.
  */
 
 struct patch_info {
 		unsigned short key;		/* Use WAVE_PATCH here */
-#define WAVE_PATCH	_PATCHKEY(0x04)
-#define GUS_PATCH	WAVE_PATCH
+#define WAVE_PATCH	   _PATCHKEY(0x04)
+#define GUS_PATCH	   WAVE_PATCH
+#define WAVEFRONT_PATCH    _PATCHKEY(0x06)
 
 		short device_no;	/* Synthesizer number */
 		short instr_no;		/* Midi pgm# */
@@ -476,6 +480,7 @@
 
 #define SAMPLE_TYPE_BASIC		0x10
 #define SAMPLE_TYPE_GUS			SAMPLE_TYPE_BASIC
+#define SAMPLE_TYPE_WAVEFRONT           0x11
 
 		int	perc_mode;	/* No longer supported */
 		int	nr_voices;
diff -u --recursive --new-file v2.1.110/linux/include/linux/videodev.h linux/include/linux/videodev.h
--- v2.1.110/linux/include/linux/videodev.h	Tue Jul 21 00:15:33 1998
+++ linux/include/linux/videodev.h	Tue Jul 21 11:39:16 1998
@@ -106,6 +106,9 @@
 #define VIDEO_PALETTE_RGB32	5	/* 32bit RGB */	
 #define VIDEO_PALETTE_RGB555	6	/* 555 15bit RGB */
 #define VIDEO_PALETTE_YUV422	7	/* YUV422 capture */
+#define VIDEO_PALETTE_YUYV	8
+#define VIDEO_PALETTE_UYVY	9	/* The great thing about standards is ... */
+#define VIDEO_PALETTE_YUV420	10
 };
 
 struct video_audio
@@ -201,6 +204,7 @@
 #define VID_HARDWARE_RTRACK	9
 #define VID_HARDWARE_ZOLTRIX	10
 #define VID_HARDWARE_SAA7146    11
+#define VID_HARDWARE_VIDEUM	12	/* Reserved for Winnov videum */
 
 /*
  *	Initialiser list
diff -u --recursive --new-file v2.1.110/linux/include/linux/vt_buffer.h linux/include/linux/vt_buffer.h
--- v2.1.110/linux/include/linux/vt_buffer.h	Thu Jul 16 18:09:30 1998
+++ linux/include/linux/vt_buffer.h	Wed Jul 22 14:53:48 1998
@@ -26,7 +26,9 @@
 #define scr_writew(val, addr) (*(addr) = (val))
 #define scr_readw(addr) (*(addr))
 #define scr_memcpyw(d, s, c) memcpy(d, s, c)
+#define scr_memmovew(d, s, c) memmove(d, s, c)
 #define VT_BUF_HAVE_MEMCPYW
+#define VT_BUF_HAVE_MEMMOVEW
 #define scr_memcpyw_from(d, s, c) memcpy(d, s, c)
 #define scr_memcpyw_to(d, s, c) memcpy(d, s, c)
 #define VT_BUF_HAVE_MEMCPYF
@@ -50,6 +52,21 @@
 }
 #endif
 
+#ifndef VT_BUF_HAVE_MEMMOVEW
+extern inline void scr_memmovew(u16 *d, u16 *s, unsigned int count)
+{
+	if (d < s)
+		scr_memcpyw(d, s, count);
+	else {
+		count /= 2;
+		d += count;
+		s += count;
+		while (count--)
+			scr_writew(scr_readw(--s), --d);
+	}
+}
+#endif
+
 #ifndef VT_BUF_HAVE_MEMCPYF
 extern inline void scr_memcpyw_from(u16 *d, u16 *s, unsigned int count)
 {
@@ -65,13 +82,5 @@
 		scr_writew(*s++, d++);
 }
 #endif
-
-#define reverse_video_char(a)	(((a) & 0x88) | ((((a) >> 4) | ((a) << 4)) & 0x77))
-#define reverse_video_short(a)	(((a) & 0x88ff) | \
-	(((a) & 0x7000) >> 4) | (((a) & 0x0700) << 4))
-/* this latter line used to have masks 0xf000 and 0x0f00, but selection
-   requires a self-inverse operation; moreover, the old version looks wrong */
-#define reverse_video_short_mono(a)	((a) ^ 0x800)
-#define complement_video_short(a)	((a) ^ (can_do_color ? 0x7700 : 0x800))
 
 #endif
diff -u --recursive --new-file v2.1.110/linux/include/linux/vt_kern.h linux/include/linux/vt_kern.h
--- v2.1.110/linux/include/linux/vt_kern.h	Tue Jul 21 00:15:33 1998
+++ linux/include/linux/vt_kern.h	Tue Jul 21 10:28:23 1998
@@ -21,11 +21,6 @@
 extern struct vt_struct {
 	int vc_num;				/* The console number */
 	unsigned char	vc_mode;		/* KD_TEXT, ... */
-#if 0	/* FIXME: Does anyone use these? */
-	unsigned char	vc_kbdraw;
-	unsigned char	vc_kbde0;
-	unsigned char   vc_kbdleds;
-#endif
 	struct vt_mode	vt_mode;
 	int		vt_pid;
 	int		vt_newvt;
@@ -36,6 +31,8 @@
 
 /* console.c */
 
+struct console_font_op;
+
 int vc_allocate(unsigned int console, int init);
 int vc_cons_allocated(unsigned int console);
 int vc_resize(unsigned int lines, unsigned int cols,
@@ -50,12 +47,12 @@
 void reset_palette(int currcons);
 void set_palette(void);
 void do_blank_screen(int nopowersave);
-int con_set_font(char * fontmap, int w, int h, int chars);
-int con_get_font(char * fontmap, int *w, int *h, int *chars);
+int con_font_op(int currcons, struct console_font_op *op);
 int con_set_cmap(unsigned char *cmap);
 int con_get_cmap(unsigned char *cmap);
 void scrollback(int);
 void scrollfront(int);
+void update_region(int currcons, unsigned long start, int count);
 
 struct tty_struct;
 int tioclinux(struct tty_struct *tty, unsigned long arg);
@@ -76,7 +73,6 @@
 
 /* vt.c */
 
-extern unsigned int video_mode_512ch;
 extern unsigned int video_font_height;
 extern unsigned int default_font_height;
 extern unsigned int video_scan_lines;
diff -u --recursive --new-file v2.1.110/linux/include/linux/wavefront.h linux/include/linux/wavefront.h
--- v2.1.110/linux/include/linux/wavefront.h	Tue Jul 21 00:15:33 1998
+++ linux/include/linux/wavefront.h	Wed Jul 22 13:45:53 1998
@@ -502,11 +502,11 @@
     wavefront_drum d;
 } wavefront_any;
 
-/* Hannu Solvainen hoped that his "patch_info" struct in soundcard.h
-   might work for other wave-table based patch loading situations.
-   Alas, his fears were correct. The WaveFront doesn't even come with
-   just "patches", but several different kind of structures that
-   control the sound generation process.
+/* Hannu Savolainen hoped that his "patch_info" struct in soundcard.h
+   might work for other wavetable-based patch-loading situations.
+   Alas, his fears were correct.  The WaveFront doesn't even come with
+   just "patches", but several different kinds of structures that
+   control the process of generating sound.
  */
 
 typedef struct wf_patch_info {
@@ -662,7 +662,7 @@
 
 /* Allow direct user-space control over FX memory/coefficient data.
    In theory this could be used to download the FX microprogram,
-   but it would be a little slower, and involve some wierd code.
+   but it would be a little slower, and involve some weird code.
  */
 
 #define WFFX_MEMSET              69
diff -u --recursive --new-file v2.1.110/linux/include/net/netbeui.h linux/include/net/netbeui.h
--- v2.1.110/linux/include/net/netbeui.h	Thu Mar 27 14:40:11 1997
+++ linux/include/net/netbeui.h	Wed Dec 31 16:00:00 1969
@@ -1,150 +0,0 @@
-/*
- *	NetBEUI data structures
- */
- 
-#ifndef __NET_NETBEUI_H
-#define __NET_NETBEUI_H
-
-
-#define NB_NAME_LEN	16
-
-/*
- *	Used to keep lists of netbeui sessions
- */
- 
-struct nb_ses
-{
-	struct nb_ses *next;
-	struct nb_nam *name;
-	struct nb_link *parent;	/* Owner link */
-	struct sock *sk;
-};
-
-/*
- *	A netbeui link
- */
- 
-struct nb_link
-{
-	struct  llc llc;	/* Must be first */
-	u8	mac[6];		/* Mac address of remote */
-	struct device *dev;	/* Device we heard him on */
-	struct nb_ses *sessions;/* Netbeui sessions on this LLC link */
-	struct wait_queue *wait;/* Wait queue for this netbios LLC */
-	int	busy;		/* Track the LLC busy state */
-	int	state;		/* Link state */
-#define NETBEUI_OPEN		1	/* Up and going */
-#define NETBEUI_CONNWAIT	2	/* Waiting to come up */
-#define NETBEUI_DISCWAIT	3	/* Waiting to drop and recover */
-#define NETBEUI_DEADWAIT	4	/* Trying to die */
-};
-
-
-/*
- *	Netbios name defence list
- */
-
-struct nb_name
-{
-	struct nb_name *next;	/*	Chain 		*/
-	struct device *dev;	/*	Device 		*/
-	char name[NB_NAME_LEN];	/* 	Object Name	*/
-	int state;		/* 	Name State	*/
-#define NB_NAME_ACQUIRE		1	/* We are trying to get a name */
-#define NB_NAME_COLLIDE		2	/* Name collided - we failed */
-#define NB_OURS			3	/* We own the name	*/
-#define NB_NAME_OTHER		4	/* Name found - owned by other */
-#define NB_NAME_GET		5	/* Trying to allocate a name */
-#define NB_STATE		7	/* State bits */
-#define NB_NAME_GROUP		8	/* Group name bit */
-	int ours;			/* We own this name */
-	int users;			/* Number of nb_ses's to this name */
-	struct timer_list	timer;	/* Our timer */
-	int timer_mode;			/* Timer mode */
-#define NB_TIMER_ACQUIRE	1	/* Expiry means we got our name */
-#define NB_TIMER_COLLIDE	2	/* Expire a collided record */
-#define NB_TIMER_DROP		3	/* Drop a learned record */	
-};
-
-
-/*
- *	LLC link manager
- */
- 
-extern struct nb_link *netbeui_find_link(u8 macaddr);
-extern struct nb_link *netbeui_create_link(u8 macaddr);
-extern int netbeui_destroy_link(u8 macaddr);
-
-/*
- *	Namespace manager
- */
- 
-extern struct nb_name *netbeui_find_name(char *name);
-extern struct nb_name *netbeui_add_name(char *name, int ours);
-extern struct nb_name *netbeui_lookup_name(char *name);
-extern int nb_delete_name(struct nb_name *name);
-
-/*
- *	NetBEUI Protocol items
- */
-
-#define ADD_GROUP_NAME_QUERY	0x00
-#define ADD_NAME_QUERY		0x01
-#define NAME_IN_CONFLICT	0x02
-#define STATUS_QUERY		0x03
-#define TERMINATE_TRACE		0x07
-#define DATAGRAM		0x08
-#define DATAGRAM_BROADCAST	0x09
-#define NAME_QUERY		0x0A
-#define ADD_NAME_RESPONSE	0x0D
-#define NAME_RECOGNIZED		0x0E
-#define STATUS_RESPONSE		0x0F
-#define TERMINATE_TRACE2	0x13
-#define DATA_ACK		0x14
-#define DATA_FIRST_MIDDLE	0x15
-#define DATA_ONLY_LAST		0x16
-#define SESSION_CONFIRM		0x17
-#define SESSION_END		0x18
-#define SESSION_INITIALIZE	0x19
-#define NO_RECEIVE		0x1A
-#define RECEIVE_OUTSTANDING	0x1B
-#define RECEIVE_CONTINUE	0x1C
-#define SESSION_ALIVE		0x1F
-
-#define NB_TRANSMIT_COUNT	6
-#define NB_TRANSMIT_TIMEOUT	(HZ/2)
-
-#define NB_DESCRIM_1		0xEF
-#define NB_DESCRIM_2		0xFF
-
-struct nb_dgram_pkt
-{
-	__u16	length;
-	__u8	descrim1;
-	__u8	descrim2;
-	__u8	command;
-	__u8	option1;
-	__u16	option2;
-	__u16	tx_seq;
-	__u16	rx_seq;
-	__u8	dest[NB_NAME_LEN];
-	__u8	src[NB_NAME_LEN];
-};
-
-struct nb_sess_pkt
-{
-	__u16	length;
-	__u8	descrim1;
-	__u8	descrim2;
-	__u8	command;
-	__u8	option1;
-	__u16	option2;
-	__u16	tx_seq;
-	__u16	rx_seq;
-	__u8	dnum;
-	__u8	snum;
-};
-
-#define NO_SEQ	0
-
-#endif
diff -u --recursive --new-file v2.1.110/linux/init/main.c linux/init/main.c
--- v2.1.110/linux/init/main.c	Tue Jul 21 00:15:33 1998
+++ linux/init/main.c	Tue Jul 21 10:28:23 1998
@@ -88,9 +88,7 @@
 #ifdef __i386__
 extern void ioapic_pirq_setup(char *str, int *ints);
 #endif
-#ifdef CONFIG_VGA_CONSOLE
 extern void no_scroll(char *str, int *ints);
-#endif
 extern void kbd_reset_setup(char *str, int *ints);
 extern void panic_setup(char *str, int *ints);
 extern void bmouse_setup(char *str, int *ints);
@@ -767,15 +765,14 @@
 #ifdef CONFIG_HFMODEM
 	{ "hfmodem=", hfmodem_setup },
 #endif
-#ifdef CONFIG_PMAC_CONSOLE
-	{ "console=", pmac_cons_setup },
-	{ "vmode=", pmac_vmode_setup },
-#endif
 #ifdef CONFIG_FTAPE
 	{ "ftape=", ftape_setup},
 #endif
 #ifdef CONFIG_MD_BOOT
 	{ "md=", md_setup},
+#endif
+#ifdef CONFIG_MACMOUSE
+	{ "adb_buttons=", adb_mouse_setup },
 #endif
 	{ 0, 0 }
 };
diff -u --recursive --new-file v2.1.110/linux/kernel/kmod.c linux/kernel/kmod.c
--- v2.1.110/linux/kernel/kmod.c	Thu Jul 16 18:09:30 1998
+++ linux/kernel/kmod.c	Fri Jul 24 11:18:24 1998
@@ -67,6 +67,9 @@
 		if (current->files->fd[i]) close(i);
 	}
 
+	/* kernel_thread() -> ... -> charge_uid(current, 1) workaround */
+	charge_uid(current, -1);
+
 	/* Give kmod all privileges.. */
 	current->uid = current->euid = current->fsuid = 0;
 	cap_set_full(current->cap_inheritable);
diff -u --recursive --new-file v2.1.110/linux/kernel/ksyms.c linux/kernel/ksyms.c
--- v2.1.110/linux/kernel/ksyms.c	Tue Jul 21 00:15:33 1998
+++ linux/kernel/ksyms.c	Fri Jul 24 11:19:10 1998
@@ -147,6 +147,7 @@
 EXPORT_SYMBOL(d_alloc);
 EXPORT_SYMBOL(d_lookup);
 EXPORT_SYMBOL(__mark_inode_dirty);
+EXPORT_SYMBOL(get_empty_filp);
 EXPORT_SYMBOL(init_private_file);
 EXPORT_SYMBOL(insert_file_free);
 EXPORT_SYMBOL(check_disk_change);
@@ -184,6 +185,7 @@
 EXPORT_SYMBOL(dput);
 EXPORT_SYMBOL(get_cached_page);
 EXPORT_SYMBOL(put_cached_page);
+EXPORT_SYMBOL(is_root_busy);
 EXPORT_SYMBOL(prune_dcache);
 EXPORT_SYMBOL(shrink_dcache_sb);
 EXPORT_SYMBOL(shrink_dcache_parent);
diff -u --recursive --new-file v2.1.110/linux/kernel/sched.c linux/kernel/sched.c
--- v2.1.110/linux/kernel/sched.c	Tue Jul 21 00:15:33 1998
+++ linux/kernel/sched.c	Wed Jul 22 18:26:55 1998
@@ -106,28 +106,31 @@
 static inline void reschedule_idle(struct task_struct * p)
 {
 	/*
-	 * For SMP, we try to find another CPU to put the
-	 * new task on, and fall back on the local CPU only
-	 * if no other CPU is idle.
-	 *
-	 * FIXME: try to select the idle CPU to be the old
-	 * CPU of the task 'p' if possible.
+	 * For SMP, we try to see if the CPU the task used
+	 * to run on is idle..
 	 */
 #ifdef __SMP__
-	struct task_struct **idle = task;
-	int current_cpu = smp_processor_id();
-	int i = smp_num_cpus;
+	int want_cpu = p->processor;
 
-	do {
-		struct task_struct *tsk = *idle;
-		idle++;
-		/* Something like this.. */
-		if (tsk->has_cpu && !tsk->need_resched && tsk->processor != current_cpu) {
-			tsk->need_resched = 1;
-			smp_send_reschedule(tsk->processor);
-			return;
-		}
-	} while (--i > 0);
+	/*
+	 * Don't even try to find another CPU for us if the task
+	 * ran on this one before..
+	 */
+	if (want_cpu != smp_processor_id()) {
+		struct task_struct **idle = task;
+		int i = smp_num_cpus;
+
+		do {
+			struct task_struct *tsk = *idle;
+			idle++;
+			/* Something like this.. */
+			if (tsk->has_cpu && tsk->processor == want_cpu) {
+				tsk->need_resched = 1;
+				smp_send_reschedule(want_cpu);
+				return;
+			}
+		} while (--i > 0);
+	}
 #endif
 	if (p->policy != SCHED_OTHER || p->counter > current->counter + 3)
 		current->need_resched = 1;	
diff -u --recursive --new-file v2.1.110/linux/kernel/signal.c linux/kernel/signal.c
--- v2.1.110/linux/kernel/signal.c	Wed Jun 24 22:54:12 1998
+++ linux/kernel/signal.c	Thu Jul 23 17:34:28 1998
@@ -811,7 +811,7 @@
 		    || (k->sa.sa_handler == SIG_DFL
 			&& (sig == SIGCONT ||
 			    sig == SIGCHLD ||
-			    sig != SIGWINCH))) {
+			    sig == SIGWINCH))) {
 			/* So dequeue any that might be pending.
 			   XXX: process-wide signals? */
 			if (sig >= SIGRTMIN &&
diff -u --recursive --new-file v2.1.110/linux/mm/mmap.c linux/mm/mmap.c
--- v2.1.110/linux/mm/mmap.c	Thu Jul 16 18:09:30 1998
+++ linux/mm/mmap.c	Thu Jul 23 10:52:27 1998
@@ -421,16 +421,6 @@
 		insert_vm_struct(current->mm, mpnt);
 	}
 
-	/* Close the current area ... */
-	if (area->vm_ops && area->vm_ops->close) {
-		end = area->vm_end; /* save new end */
-		area->vm_end = area->vm_start;
-		area->vm_ops->close(area);
-		area->vm_end = end;
-	}
-	/* ... then reopen and reinsert. */
-	if (area->vm_ops && area->vm_ops->open)
-		area->vm_ops->open(area);
 	insert_vm_struct(current->mm, area);
 	return 1;
 }
diff -u --recursive --new-file v2.1.110/linux/mm/slab.c linux/mm/slab.c
--- v2.1.110/linux/mm/slab.c	Wed Jun 24 22:54:14 1998
+++ linux/mm/slab.c	Thu Jul 23 16:24:17 1998
@@ -313,7 +313,9 @@
 /* If the num of objs per slab is <= SLAB_MIN_OBJS_PER_SLAB,
  * then the page order must be less than this before trying the next order.
  */
-#define	SLAB_BREAK_GFP_ORDER	2
+#define	SLAB_BREAK_GFP_ORDER_HI	2
+#define	SLAB_BREAK_GFP_ORDER_LO	1
+static int slab_break_gfp_order = SLAB_BREAK_GFP_ORDER_LO;
 
 /* Macros for storing/retrieving the cachep and or slab from the
  * global 'mem_map'.  With off-slab bufctls, these are used to find the
@@ -447,6 +449,12 @@
 	cache_cache.c_colour = (i-(cache_cache.c_num*size))/L1_CACHE_BYTES;
 	cache_cache.c_colour_next = cache_cache.c_colour;
 
+	/*
+	 * Fragmentation resistance on low memory - only use bigger
+	 * page orders on machines with more than 32MB of memory.
+	 */
+	if (num_physpages > (32 << 20) >> PAGE_SHIFT)
+		slab_break_gfp_order = SLAB_BREAK_GFP_ORDER_HI;
 	return start;
 }
 
@@ -604,7 +612,7 @@
 {
 	if (cachep->c_dtor
 #if	SLAB_DEBUG_SUPPORT
-		|| cachep->c_flags & (SLAB_POISON || SLAB_RED_ZONE)
+		|| cachep->c_flags & (SLAB_POISON | SLAB_RED_ZONE)
 #endif	/*SLAB_DEBUG_SUPPORT*/
 	) {
 		/* Doesn't use the bufctl ptrs to find objs. */
@@ -869,7 +877,7 @@
 		 * bad for the gfp()s.
 		 */
 		if (cachep->c_num <= SLAB_MIN_OBJS_PER_SLAB) {
-			if (cachep->c_gfporder < SLAB_BREAK_GFP_ORDER)
+			if (cachep->c_gfporder < slab_break_gfp_order)
 				goto next;
 		}
 
diff -u --recursive --new-file v2.1.110/linux/net/ax25/af_ax25.c linux/net/ax25/af_ax25.c
--- v2.1.110/linux/net/ax25/af_ax25.c	Sun Jun  7 11:16:40 1998
+++ linux/net/ax25/af_ax25.c	Wed Jul 22 13:45:58 1998
@@ -1,5 +1,5 @@
 /*
- *	AX.25 release 037
+ *	AX.25 release 038
  *
  *	This code REQUIRES 2.1.15 or higher/ NET3.038
  *
@@ -93,6 +93,8 @@
  *			Joerg(DL1BKE)		Fixed DAMA Slave.
  *			Jonathan(G4KLX)		Fix widlcard listen parameter setting.
  *	AX.25 037	Jonathan(G4KLX)		New timer architecture.
+ *      AX.25 038       Matthias(DG2FEF)        Small fixes to the syscall interface to make kernel
+ *                                              independent of AX25_MAX_DIGIS used by applications.
  */
 
 #include <linux/config.h>
@@ -449,8 +451,10 @@
 static int ax25_ctl_ioctl(const unsigned int cmd, void *arg)
 {
 	struct ax25_ctl_struct ax25_ctl;
+	ax25_digi digi;
 	ax25_dev *ax25_dev;
 	ax25_cb *ax25;
+	unsigned int k;
 
 	if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
 		return -EFAULT;
@@ -458,7 +462,11 @@
 	if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
 		return -ENODEV;
 
-	if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, NULL, ax25_dev->dev)) == NULL)
+	digi.ndigi = ax25_ctl.digi_count;
+	for (k = 0; k < digi.ndigi; k++)
+		digi.calls[k] = ax25_ctl.digi_addr[k];
+
+	if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
 		return -ENOTCONN;
 
 	switch (ax25_ctl.cmd) {
@@ -1018,7 +1026,7 @@
 
 	SOCK_DEBUG(sk, "AX25: source address set to %s\n", ax2asc(&sk->protinfo.ax25->source_addr));
 
-	if (addr_len == sizeof(struct full_sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
+	if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
 		if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) == 0) {
 			ax25_dev = NULL;
 			SOCK_DEBUG(sk, "AX25: bound to any device\n");
@@ -1057,14 +1065,20 @@
 	ax25_digi *digi = NULL;
 	int ct = 0, err;
 
-	if (sk->state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) {
-		sock->state = SS_CONNECTED;
-		return 0;	/* Connect completed during a ERESTARTSYS event */
-	}
+	/* deal with restarts */
+	if (sock->state == SS_CONNECTING) {
+		switch (sk->state) {
+		case TCP_SYN_SENT: /* still trying */
+			return -EINPROGRESS;
 
-	if (sk->state == TCP_CLOSE && sock->state == SS_CONNECTING) {
-		sock->state = SS_UNCONNECTED;
-		return -ECONNREFUSED;
+		case TCP_ESTABLISHED: /* connection established */
+			sock->state = SS_CONNECTED;
+			return 0;
+
+		case TCP_CLOSE: /* connection refused */
+			sock->state = SS_UNCONNECTED;
+			return -ECONNREFUSED;
+		}
 	}
 
 	if (sk->state == TCP_ESTABLISHED && sk->type == SOCK_SEQPACKET)
@@ -1073,7 +1087,10 @@
 	sk->state   = TCP_CLOSE;
 	sock->state = SS_UNCONNECTED;
 
-	if (addr_len != sizeof(struct sockaddr_ax25) && addr_len != sizeof(struct full_sockaddr_ax25))
+	/*
+	 * some sanity checks. code further down depends on this
+	 */
+	if (addr_len < sizeof(struct sockaddr_ax25) || addr_len > sizeof(struct full_sockaddr_ax25))
 		return -EINVAL;
 
 	if (fsa->fsa_ax25.sax25_family != AF_AX25)
@@ -1087,7 +1104,7 @@
 	/*
 	 *	Handle digi-peaters to be used.
 	 */
-	if (addr_len == sizeof(struct full_sockaddr_ax25) && fsa->fsa_ax25.sax25_ndigis != 0) {
+	if (addr_len > sizeof(struct sockaddr_ax25) && fsa->fsa_ax25.sax25_ndigis != 0) {
 		/* Valid number of digipeaters ? */
 		if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS)
 			return -EINVAL;
@@ -1202,10 +1219,17 @@
 	struct sock *newsk;
 	struct sk_buff *skb;
 
-	if (newsock->sk != NULL)
-		ax25_destroy_socket(newsock->sk->protinfo.ax25);
+	if (sock->state != SS_UNCONNECTED)
+		return -EINVAL;
 
-	newsock->sk = NULL;
+	/*
+	 * sys_accept has already allocated a struct sock. we need to free it, 
+	 * since we want to use the one provided by ax25_make_new.
+	 */
+	if (newsock->sk != NULL) {
+		sk_free(newsock->sk);
+		newsock->sk = NULL;
+	}
 
 	if ((sk = sock->sk) == NULL)
 		return -EINVAL;
@@ -1245,43 +1269,43 @@
 	skb->sk = NULL;
 	kfree_skb(skb);
 	sk->ack_backlog--;
-	newsock->sk = newsk;
+	newsock->sk    = newsk;
+	newsock->state = SS_CONNECTED;
 
 	return 0;
 }
 
 static int ax25_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer)
 {
-	struct full_sockaddr_ax25 *sax = (struct full_sockaddr_ax25 *)uaddr;
 	struct sock *sk = sock->sk;
 	unsigned char ndigi, i;
+	struct full_sockaddr_ax25 fsa;
 
 	if (peer != 0) {
 		if (sk->state != TCP_ESTABLISHED)
 			return -ENOTCONN;
 
-		sax->fsa_ax25.sax25_family = AF_AX25;
-		sax->fsa_ax25.sax25_call   = sk->protinfo.ax25->dest_addr;
-		sax->fsa_ax25.sax25_ndigis = 0;
-		*uaddr_len = sizeof(struct full_sockaddr_ax25);
-
-		if (sk->protinfo.ax25->digipeat != NULL) {
-			ndigi = sk->protinfo.ax25->digipeat->ndigi;
-			sax->fsa_ax25.sax25_ndigis = ndigi;
-			for (i = 0; i < ndigi; i++)
-				sax->fsa_digipeater[i] = sk->protinfo.ax25->digipeat->calls[i];
-		}
+		fsa.fsa_ax25.sax25_family = AF_AX25;
+		fsa.fsa_ax25.sax25_call   = sk->protinfo.ax25->dest_addr;
+		fsa.fsa_ax25.sax25_ndigis = 0;
+
+		ndigi = sk->protinfo.ax25->digipeat->ndigi;
+		fsa.fsa_ax25.sax25_ndigis = ndigi;
+		for (i = 0; i < ndigi; i++)
+			fsa.fsa_digipeater[i] = sk->protinfo.ax25->digipeat->calls[i];
 	} else {
-		sax->fsa_ax25.sax25_family = AF_AX25;
-		sax->fsa_ax25.sax25_call   = sk->protinfo.ax25->source_addr;
-		sax->fsa_ax25.sax25_ndigis = 1;
-		*uaddr_len = sizeof(struct full_sockaddr_ax25);
-
-		if (sk->protinfo.ax25->ax25_dev != NULL)
-			memcpy(&sax->fsa_digipeater[0], sk->protinfo.ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
-		else
-			sax->fsa_digipeater[0] = null_ax25_address;
+		fsa.fsa_ax25.sax25_family = AF_AX25;
+		fsa.fsa_ax25.sax25_call   = sk->protinfo.ax25->source_addr;
+		fsa.fsa_ax25.sax25_ndigis = 1;
+		if (sk->protinfo.ax25->ax25_dev != NULL) {
+			memcpy(&fsa.fsa_digipeater[0], sk->protinfo.ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
+		} else {
+			fsa.fsa_digipeater[0] = null_ax25_address;
+		}
 	}
+	if (*uaddr_len > sizeof (struct full_sockaddr_ax25))
+		*uaddr_len = sizeof (struct full_sockaddr_ax25);
+	memcpy(uaddr, &fsa, *uaddr_len);
 
 	return 0;
 }
@@ -1315,11 +1339,14 @@
 		return -ENETUNREACH;
 
 	if (usax != NULL) {
-		if (addr_len != sizeof(struct sockaddr_ax25) && addr_len != sizeof(struct full_sockaddr_ax25))
-			return -EINVAL;
 		if (usax->sax25_family != AF_AX25)
 			return -EINVAL;
-		if (addr_len == sizeof(struct full_sockaddr_ax25) && usax->sax25_ndigis != 0) {
+		if (addr_len < sizeof(struct sockaddr_ax25) || addr_len > sizeof(struct full_sockaddr_ax25))
+			return -EINVAL;
+		if (addr_len < (usax->sax25_ndigis * AX25_ADDR_LEN + sizeof(struct sockaddr_ax25)))
+			return -EINVAL;
+
+		if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
 			int ct           = 0;
 			struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
 
@@ -1375,6 +1402,7 @@
 
 	/* User data follows immediately after the AX.25 data */
 	memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
+	skb->nh.raw = skb->data;
 
 	/* Add the PID if one is not supplied by the user in the skb */
 	if (!sk->protinfo.ax25->pidincl) {
@@ -1425,7 +1453,6 @@
 static int ax25_recvmsg(struct socket *sock, struct msghdr *msg, int size, int flags, struct scm_cookie *scm)
 {
 	struct sock *sk = sock->sk;
-	struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
 	int copied;
 	struct sk_buff *skb;
 	int er;
@@ -1453,13 +1480,13 @@
 	}		
 
 	skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
-	
-	if (sax != NULL) {
+
+	if (msg->msg_namelen != 0) {
+		struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
 		ax25_digi digi;
 		ax25_address dest;
-		int dama;
 
-		ax25_addr_parse(skb->data, skb->len, NULL, &dest, &digi, NULL, &dama);
+		ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, NULL, &dest, &digi, NULL, NULL);
 
 		sax->sax25_family = AF_AX25;
 		/* We set this correctly, even though we may not let the
@@ -1469,18 +1496,15 @@
 		sax->sax25_call   = dest;
 
 		if (sax->sax25_ndigis != 0) {
-			int ct           = 0;
+			int ct;
 			struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
 
-			while (ct < digi.ndigi) {
+			for (ct = 0; ct < digi.ndigi; ct++)
 				fsa->fsa_digipeater[ct] = digi.calls[ct];
-				ct++;
-			}
 		}
+		msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
 	}
 
-	msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
-
 	skb_free_datagram(sk, skb);
 
 	return copied;
@@ -1614,56 +1638,53 @@
 static int ax25_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
 {
 	ax25_cb *ax25;
-	const char *devname;
-	char callbuf[15];
+	int k;
 	int len = 0;
 	off_t pos = 0;
 	off_t begin = 0;
 
 	cli();
 
-	len += sprintf(buffer, "dest_addr src_addr   dev  st  vs  vr  va    t1     t2     t3      idle   n2  rtt wnd paclen   Snd-Q Rcv-Q inode\n");
-
+	/*
+	 * New format:
+	 * magic dev src_addr dest_addr,digi1,digi2,.. st vs vr va t1 t1 t2 t2 t3 t3 idle idle n2 n2 rtt window paclen Snd-Q Rcv-Q inode 
+	 */
+	
 	for (ax25 = ax25_list; ax25 != NULL; ax25 = ax25->next) {
-		if (ax25->ax25_dev == NULL)
-			devname = "???";
-		else
-			devname = ax25->ax25_dev->dev->name;
-
-		len += sprintf(buffer + len, "%-9s ",
-			ax2asc(&ax25->dest_addr));
-
-		sprintf(callbuf, "%s%c", ax2asc(&ax25->source_addr),
-					 (ax25->iamdigi) ? '*' : ' ');
-
-		len += sprintf(buffer + len, "%-10s %-4s %2d %3d %3d %3d %3lu/%03lu %2lu/%02lu %3lu/%03lu %3lu/%03lu %2d/%02d %3lu %3d  %5d",
-			callbuf,
-			devname,
+		len += sprintf(buffer+len, "%8.8lx %s %s%s ", 
+				(long) ax25, 
+				ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
+				ax2asc(&ax25->source_addr),
+				ax25->iamdigi? "*":"");
+
+		len += sprintf(buffer+len, "%s", ax2asc(&ax25->dest_addr));
+				
+		for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
+			len += sprintf(buffer+len, ",%s%s",
+					ax2asc(&ax25->digipeat->calls[k]),
+					ax25->digipeat->repeated[k]? "*":"");
+		}
+		
+		len += sprintf(buffer+len, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
 			ax25->state,
-			ax25->vs,
-			ax25->vr,
-			ax25->va,
-			ax25_display_timer(&ax25->t1timer) / HZ,
-			ax25->t1 / HZ,
-			ax25_display_timer(&ax25->t2timer) / HZ,
-			ax25->t2 / HZ,
-			ax25_display_timer(&ax25->t3timer) / HZ,
-			ax25->t3 / HZ,
-			ax25_display_timer(&ax25->idletimer) / (60 * HZ), 
+			ax25->vs, ax25->vr, ax25->va,
+			ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
+			ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
+			ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
+			ax25_display_timer(&ax25->idletimer) / (60 * HZ),
 			ax25->idle / (60 * HZ),
-			ax25->n2count,
-			ax25->n2,
+			ax25->n2count, ax25->n2,
 			ax25->rtt / HZ,
 			ax25->window,
 			ax25->paclen);
 
 		if (ax25->sk != NULL) {
-			len += sprintf(buffer + len, " %5d %5d %ld\n",
+			len += sprintf(buffer + len, " %d %d %ld\n",
 				atomic_read(&ax25->sk->wmem_alloc),
 				atomic_read(&ax25->sk->rmem_alloc),
 				ax25->sk->socket != NULL ? ax25->sk->socket->inode->i_ino : 0L);
 		} else {
-			len += sprintf(buffer + len, "\n");
+			len += sprintf(buffer + len, " * * *\n");
 		}
 
 		pos = begin + len;
diff -u --recursive --new-file v2.1.110/linux/net/ax25/ax25_addr.c linux/net/ax25/ax25_addr.c
--- v2.1.110/linux/net/ax25/ax25_addr.c	Mon Jul  7 08:19:59 1997
+++ linux/net/ax25/ax25_addr.c	Wed Jul 22 13:45:58 1998
@@ -165,19 +165,23 @@
 
 	if (len < 14) return NULL;
 
-	*flags = 0;
-
-	if (buf[6] & AX25_CBIT)
-		*flags = AX25_COMMAND;
-	if (buf[13] & AX25_CBIT)
-		*flags = AX25_RESPONSE;
+	if (flags != NULL) {
+		*flags = 0;
+		
+		if (buf[6] & AX25_CBIT)
+			*flags = AX25_COMMAND;
+		if (buf[13] & AX25_CBIT)
+			*flags = AX25_RESPONSE;
+	}
 
 	if (dama != NULL) 
 		*dama = ~buf[13] & AX25_DAMA_FLAG;
 
 	/* Copy to, from */
-	memcpy(dest, buf + 0, AX25_ADDR_LEN);
-	memcpy(src,  buf + 7, AX25_ADDR_LEN);
+	if (dest != NULL)
+		memcpy(dest, buf + 0, AX25_ADDR_LEN);
+	if (src != NULL)
+		memcpy(src,  buf + 7, AX25_ADDR_LEN);
 
 	buf += 2 * AX25_ADDR_LEN;
 	len -= 2 * AX25_ADDR_LEN;
diff -u --recursive --new-file v2.1.110/linux/net/ax25/ax25_out.c linux/net/ax25/ax25_out.c
--- v2.1.110/linux/net/ax25/ax25_out.c	Tue Apr 14 14:29:26 1998
+++ linux/net/ax25/ax25_out.c	Wed Jul 22 13:45:58 1998
@@ -228,6 +228,8 @@
 	if (skb == NULL)
 		return;
 
+	skb->nh.raw = skb->data;
+
 	if (ax25->modulus == AX25_MODULUS) {
 		frame = skb_push(skb, 1);
 
diff -u --recursive --new-file v2.1.110/linux/net/ax25/ax25_std_in.c linux/net/ax25/ax25_std_in.c
--- v2.1.110/linux/net/ax25/ax25_std_in.c	Mon Jul  7 08:19:59 1997
+++ linux/net/ax25/ax25_std_in.c	Wed Jul 22 13:45:58 1998
@@ -335,11 +335,11 @@
 				ax25->condition |= AX25_COND_PEER_RX_BUSY;
 			if (type == AX25_RESPONSE && pf) {
 				ax25_stop_t1timer(ax25);
+				ax25->n2count = 0;
 				if (ax25_validate_nr(ax25, nr)) {
 					ax25_frames_acked(ax25, nr);
 					if (ax25->vs == ax25->va) {
 						ax25_start_t3timer(ax25);
-						ax25->n2count = 0;
 						ax25->state   = AX25_STATE_3;
 					} else {
 						ax25_requeue_frames(ax25);
@@ -364,11 +364,11 @@
 			ax25->condition &= ~AX25_COND_PEER_RX_BUSY;
 			if (pf && type == AX25_RESPONSE) {
 				ax25_stop_t1timer(ax25);
+				ax25->n2count = 0;
 				if (ax25_validate_nr(ax25, nr)) {
 					ax25_frames_acked(ax25, nr);
 					if (ax25->vs == ax25->va) {
 						ax25_start_t3timer(ax25);
-						ax25->n2count = 0;
 						ax25->state   = AX25_STATE_3;
 					} else {
 						ax25_requeue_frames(ax25);
diff -u --recursive --new-file v2.1.110/linux/net/ax25/ax25_subr.c linux/net/ax25/ax25_subr.c
--- v2.1.110/linux/net/ax25/ax25_subr.c	Thu Feb 12 20:56:14 1998
+++ linux/net/ax25/ax25_subr.c	Wed Jul 22 13:45:58 1998
@@ -197,6 +197,8 @@
 
 	skb_reserve(skb, AX25_BPQ_HEADER_LEN + ax25_addr_size(ax25->digipeat));
 
+	skb->nh.raw = skb->data;
+
 	/* Assume a response - address structure for DTE */
 	if (ax25->modulus == AX25_MODULUS) {
 		dptr = skb_put(skb, 1);
diff -u --recursive --new-file v2.1.110/linux/net/ipv4/ip_fw.c linux/net/ipv4/ip_fw.c
--- v2.1.110/linux/net/ipv4/ip_fw.c	Tue Jun 23 10:01:30 1998
+++ linux/net/ipv4/ip_fw.c	Wed Jul 22 18:28:35 1998
@@ -510,7 +510,7 @@
 
 static inline void
 ip_fw_domatch(struct ip_fwkernel *f,
-	      const struct iphdr *ip, 
+	      struct iphdr *ip, 
 	      const char *rif,
 	      const ip_chainlabel label,
 	      struct sk_buff *skb,
@@ -522,6 +522,8 @@
 	if (f->ipfw.fw_flg & IP_FW_F_PRN) {
 		dump_packet(ip,rif,f,label,src_port,dst_port);
 	}
+	ip->tos = (ip->tos & f->ipfw.fw_tosand) ^ f->ipfw.fw_tosxor;
+
 /* This functionality is useless in stock 2.0.x series, but we don't
  * discard the mark thing altogether, to avoid breaking ipchains (and,
  * more importantly, the ipfwadm wrapper) --PR */
