diff -u --recursive --new-file v2.1.106/linux/Documentation/00-INDEX linux/Documentation/00-INDEX --- v2.1.106/linux/Documentation/00-INDEX Sun Jun 7 11:16:25 1998 +++ linux/Documentation/00-INDEX Wed Jun 24 14:30:07 1998 @@ -66,7 +66,7 @@ logo.txt - Info on creator of above logo & site to get additional images from. m68k/ - - directory with info about Linux on Motorola 68k archtecture. + - directory with info about Linux on Motorola 68k architecture. magic-number.txt - list of magic numbers used to mark/protect kernel data structures. mandatory.txt @@ -84,7 +84,7 @@ nbd.txt - info on a TCP implementation of a network block device. networking/ - - directory with info on various linux networking aspects. + - directory with info on various aspects of networking with Linux. nfsroot.txt - short guide on setting up a diskless box with NFS root filesystem oops-tracing.txt diff -u --recursive --new-file v2.1.106/linux/Documentation/Changes linux/Documentation/Changes --- v2.1.106/linux/Documentation/Changes Tue Jun 23 10:01:18 1998 +++ linux/Documentation/Changes Wed Jun 24 14:30:07 1998 @@ -71,7 +71,7 @@ now performs a cold reboot instead of a warm reboot for increased hardware compatibility. If you want a warm reboot and know it works on your hardware, add a "reboot=warm" command line option -in Lilo. A small number of machines need "reboot=bios" to reboot via +in LILO. A small number of machines need "reboot=bios" to reboot via the BIOS. Also, please remember that cua* devices are now obsolete. Switch to diff -u --recursive --new-file v2.1.106/linux/Documentation/CodingStyle linux/Documentation/CodingStyle --- v2.1.106/linux/Documentation/CodingStyle Sun Jun 7 11:16:25 1998 +++ linux/Documentation/CodingStyle Wed Jun 24 14:30:07 1998 @@ -169,7 +169,7 @@ Chapter 6: You've made a mess of it -That's ok, we all do. You've probably been told by your long-time unix +That's OK, we all do. You've probably been told by your long-time Unix user helper that "GNU emacs" automatically formats the C sources for you, and you've noticed that yes, it does do that, but the defaults it uses are less than desirable (in fact, they are worse than random diff -u --recursive --new-file v2.1.106/linux/Documentation/Configure.help linux/Documentation/Configure.help --- v2.1.106/linux/Documentation/Configure.help Tue Jun 23 10:01:18 1998 +++ linux/Documentation/Configure.help Wed Jun 24 14:44:00 1998 @@ -5282,20 +5282,6 @@ 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 @@ -5421,6 +5407,20 @@ The module will be called ibmtr.o. If you want to compile it as a module, say M here and read Documentation/modules.txt. +SysKonnect adapter support +CONFIG_SKTR + This is support for all SysKonnect Token Ring cards. Specificly + 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) + from ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO. + + Also read the sktr.txt in linux/Documentation/networking or check + the Linux-SNA WWW site for the latest information at + http://samba.anu.edu.au/linux-sna/documents/drivers/SysKonnect/ + Traffic Shaper (EXPERIMENTAL) CONFIG_SHAPER The traffic shaper is a virtual network device that allows you to @@ -9182,6 +9182,34 @@ module called pms.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. + +# 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 CONFIG_CPU_ARM2 diff -u --recursive --new-file v2.1.106/linux/Documentation/IO-APIC.txt linux/Documentation/IO-APIC.txt --- v2.1.106/linux/Documentation/IO-APIC.txt Sun Jun 7 11:16:25 1998 +++ linux/Documentation/IO-APIC.txt Wed Jun 24 14:30:07 1998 @@ -1,5 +1,4 @@ - -most (all) Intel SMP boards have the so-called 'IO-APIC', which is +Most (all) Intel SMP boards have the so-called 'IO-APIC', which is an enhanced interrupt controller, able to route hardware interrupts to multiple CPUs, or to CPU groups. diff -u --recursive --new-file v2.1.106/linux/Documentation/IO-mapping.txt linux/Documentation/IO-mapping.txt --- v2.1.106/linux/Documentation/IO-mapping.txt Sun Jun 7 11:16:25 1998 +++ linux/Documentation/IO-mapping.txt Wed Jun 24 14:30:07 1998 @@ -1,8 +1,7 @@ - -[ This is a mail-message in response to a query on IO mapping, thus the +[ This is a mail message in response to a query on IO mapping, thus the strange format for a "document" ] -The aha1542 is a bus-master device, and your patch makes the driver give the +The AHA-1542 is a bus-master device, and your patch makes the driver give the controller the physical address of the buffers, which is correct on x86 (because all bus master devices see the physical memory mappings directly). @@ -11,9 +10,9 @@ so-called "bus address". Essentially, the three ways of addressing memory are (this is "real memory", -ie normal RAM, see later about other details): +that is, normal RAM--see later about other details): - - CPU untranslated. This is the "physical" address, ie physical address + - CPU untranslated. This is the "physical" address. Physical address 0 is what the CPU sees when it drives zeroes on the memory bus. - CPU translated address. This is the "virtual" address, and is @@ -27,7 +26,7 @@ things any more complex than necessary, so you can assume that all external hardware sees the memory the same way. -Now, on normal PC's the bus address is exactly the same as the physical +Now, on normal PCs the bus address is exactly the same as the physical address, and things are very simple indeed. However, they are that simple because the memory and the devices share the same address space, and that is not generally necessarily true on other PCI/ISA setups. @@ -35,13 +34,13 @@ Now, just as an example, on the PReP (PowerPC Reference Platform), the CPU sees a memory map something like this (this is from memory): - 0-2GB "real memory" - 2GB-3GB "system IO" (ie inb/out type accesses on x86) - 3GB-4GB "IO memory" (ie shared memory over the IO bus) + 0-2 GB "real memory" + 2 GB-3 GB "system IO" (inb/out and similar accesses on x86) + 3 GB-4 GB "IO memory" (shared memory over the IO bus) Now, that looks simple enough. However, when you look at the same thing from the viewpoint of the devices, you have the reverse, and the physical memory -address 0 actually shows up as address 2GB for any IO master. +address 0 actually shows up as address 2 GB for any IO master. So when the CPU wants any bus master to write to physical memory 0, it has to give the master address 0x80000000 as the memory address. @@ -53,7 +52,7 @@ virtual address: 0xC0000000 bus address: 0x80000000 -where all the addresses actually point to the same thing, it's just seen +where all the addresses actually point to the same thing. It's just seen through different translations.. Similarly, on the Alpha, the normal translation is @@ -119,7 +118,7 @@ the CPU, so it shouldn't need to know about "bus addresses" etc). NOTE NOTE NOTE! The above is only one part of the whole equation. The above -only talks about "real memory", ie CPU memory, ie RAM. +only talks about "real memory", that is, CPU memory (RAM). There is a completely different type of memory too, and that's the "shared memory" on the PCI or ISA bus. That's generally not RAM (although in the case @@ -160,14 +159,14 @@ iounmap(baseptr); - copying and clearing: - /* get the 6-byte ethernet address at ISA address E000:0040 */ + /* get the 6-byte Ethernet address at ISA address E000:0040 */ memcpy_fromio(kernel_buffer, 0xE0040, 6); /* write a packet to the driver */ memcpy_toio(0xE1000, skb->data, skb->len); /* clear the frame buffer */ memset_io(0xA0000, 0, 0x10000); -Ok, that just about covers the basics of accessing IO portably. Questions? +OK, that just about covers the basics of accessing IO portably. Questions? Comments? You may think that all the above is overly complex, but one day you might find yourself with a 500 MHz Alpha in front of you, and then you'll be happy that your driver works ;) diff -u --recursive --new-file v2.1.106/linux/Documentation/SMP.txt linux/Documentation/SMP.txt --- v2.1.106/linux/Documentation/SMP.txt Tue Jun 9 11:57:28 1998 +++ linux/Documentation/SMP.txt Wed Jun 24 14:30:07 1998 @@ -1,4 +1,4 @@ -SMP on x86/Linux is now an official feature and is not exprtimental. +SMP on x86/Linux is now an official feature and is not experimental. Experimental SMP support for other architectures is underway. Please view linux/Documentation/smp for more information about enabling SMP. @@ -10,11 +10,11 @@ o Clean up processor specific/independent split. o Document it all. [PARTLY DONE] -o Halt other CPU's on reset/panic doesn't always work. -o Don't waste page at 4K - don't need it now.(watch the GDT code). +o Halting other CPUs on reset or panic doesn't always work. +o Don't waste page at 4 K--don't need it now (watch the GDT code). o Dump bootup pages once booted somehow. o Clean up warnings/volatiles. o 486 startup code. o How to handle mixed FPU/non FPU processors. o Test IO-APIC on various hardware. -o Seperate IO-APIC from SMP. +o Separate IO-APIC from SMP. diff -u --recursive --new-file v2.1.106/linux/Documentation/VGA-softcursor.txt linux/Documentation/VGA-softcursor.txt --- v2.1.106/linux/Documentation/VGA-softcursor.txt Sat Nov 29 10:33:18 1997 +++ linux/Documentation/VGA-softcursor.txt Wed Jun 24 14:30:07 1998 @@ -1,34 +1,33 @@ Software cursor for VGA by Pavel Machek -======================= & Martin Mares +======================= and Martin Mares Linux now has some ability to manipulate cursor appearance. Normally, you -can set the size of hardware cursor (and also work-around some ugly bugs in -those miserable Trident cards -- see #define TRIDENT_GLITCH in drivers/char/ +can set the size of hardware cursor (and also work around some ugly bugs in +those miserable Trident cards--see #define TRIDENT_GLITCH in drivers/char/ vga.c). In case you enable "Software generated cursor" in the system -configuration, you can play few new tricks: you can make your cursor look +configuration, you can play a few new tricks: you can make your cursor look like a non-blinking red block, make it inverse background of the character it's over or to highlight that character and still choose whether the -original hardware cursor should remain visible or not. And maybe other +original hardware cursor should remain visible or not. There may be other things I have never thought of. The cursor appearance is controlled by a "[?1;2;3c" escape sequence where 1, 2 and 3 are parameters described below. If you omit any of them, they will default to zeroes. - Parameter #1 specifies cursor size (0=default, 1=invisible, 2=underline, ..., + Parameter 1 specifies cursor size (0=default, 1=invisible, 2=underline, ..., 8=full block) + 16 if you want the software cursor to be applied + 32 if you -want to always change the background color + 64 if you dislike background same -as foreground. (Highlights are ignored for the last two flags.) +want to always change the background color + 64 if you dislike having the +background the same as the foreground. Highlights are ignored for the last two +flags. The second parameter selects character attribute bits you want to change -(by simple XOR'ing them with the value of this parameter). On standard VGA, -the high 4 bits specify background and the low 4 the foreground. In both -groups, low 3 bits set color (as in normal color codes used by the console) -and the most significant one turns on highlight (or sometimes blinking -- it +(by simply XORing them with the value of this parameter). On standard VGA, +the high four bits specify background and the low four the foreground. In both +groups, low three bits set color (as in normal color codes used by the console) +and the most significant one turns on highlight (or sometimes blinking--it depends on the configuration of your VGA). - And 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. - - + 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. diff -u --recursive --new-file v2.1.106/linux/Documentation/exception.txt linux/Documentation/exception.txt --- v2.1.106/linux/Documentation/exception.txt Sun Jun 7 11:16:25 1998 +++ linux/Documentation/exception.txt Wed Jun 24 14:30:07 1998 @@ -14,12 +14,12 @@ in type (read or write). To do this, verify_read had to look up the virtual memory area (vma) that contained the address addr. In the normal case (correctly working program), this test was successful. -It only failed for the (hopefully) rare, buggy program. In some kernel -profiling tests, this normally unneeded verification used up a -considerable amount of time. +It only failed for a few buggy programs. In some kernel profiling +tests, this normally unneeded verification used up a considerable +amount of time. To overcome this situation, Linus decided to let the virtual memory -hardware present in every Linux capable CPU handle this test. +hardware present in every Linux-capable CPU handle this test. How does this work? @@ -52,7 +52,7 @@ Since we jump to the contents of fixup, fixup obviously points to executable code. This code is hidden inside the user access macros. -I have picked the get_user macro defined in include/asm/uacess.h as an +I have picked the get_user macro defined in include/asm/uaccess.h as an example. The definition is somewhat hard to follow, so let's peek at the code generated by the preprocessor and the compiler. I selected the get_user call in drivers/char/console.c for a detailed examination. diff -u --recursive --new-file v2.1.106/linux/Documentation/fb/00-INDEX linux/Documentation/fb/00-INDEX --- v2.1.106/linux/Documentation/fb/00-INDEX Wed Dec 31 16:00:00 1969 +++ linux/Documentation/fb/00-INDEX Wed Jun 24 14:44:00 1998 @@ -0,0 +1,15 @@ +Index of files in Documentation/fb. If you think something about frame +buffer devices needs an entry here, needs correction or you've written one +please mail me. + Geert Uytterhoeven + + +00-INDEX + - this file +framebuffer.txt + - introduction to frame buffer devices +internals.txt + - quick overview of frame buffer device internals +vesafb.txt + - info on the VESA frame buffer device + diff -u --recursive --new-file v2.1.106/linux/Documentation/fb/framebuffer.txt linux/Documentation/fb/framebuffer.txt --- v2.1.106/linux/Documentation/fb/framebuffer.txt Wed Dec 31 16:00:00 1969 +++ linux/Documentation/fb/framebuffer.txt Wed Jun 24 14:44:00 1998 @@ -0,0 +1,327 @@ + + The Frame Buffer Device + ----------------------- + +Maintained by Geert Uytterhoeven (Geert.Uytterhoeven@cs.kuleuven.ac.be) +Last revised: June 10, 1998 + + +0. Introduction +--------------- + +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. + +The device is accessed through special device nodes, usually located in the +/dev directory, i.e. /dev/fb*. + + +1. User's View of /dev/fb* +-------------------------- + +From the user's point of view, the frame buffer device looks just like any +other device in /dev. It's a character device using major 29; the minor +specifies the frame buffer number. + +By convention, the following device nodes are used (numbers indicate the device +minor numbers): + + 0 = /dev/fb0 First frame buffer + 32 = /dev/fb1 Second frame buffer + ... + 224 = /dev/fb7 8th frame buffer + +For backwards compatibility, you may want to create the following symbolic +links: + + /dev/fb0current -> fb0 + /dev/fb1current -> fb1 + +and so on... + +The frame buffer devices are also `normal' memory devices, this means, you can +read and write their contents. You can, for example, make a screen snapshot by + + cp /dev/fb0 myfile + +There also can be more than one frame buffer at a time, e.g. if you have a +graphics card in addition to the built-in hardware. The corresponding frame +buffer devices (/dev/fb0 and /dev/fb1 etc.) work independently. + +Application software that uses the frame buffer device (e.g. the X server) will +use /dev/fb0 by default (older software uses /dev/fb0current). You can specify +an alternative frame buffer device by setting the environment variable +$FRAMEBUFFER to the path name of a frame buffer device, e.g. (for sh/bash +users): + + export FRAMEBUFFER=/dev/fb1 + +or (for csh users): + + setenv FRAMEBUFFER /dev/fb1 + +After this the X server will use the second frame buffer. + + +2. Programmer's View of /dev/fb* +-------------------------------- + +As you already know, a frame buffer device is a memory device like /dev/mem and +it has the same features. You can read it, write it, seek to some location in +it and mmap() it (the main usage). The difference is just that the memory that +appears in the special file is not the whole memory, but the frame buffer of +some video hardware. + +/dev/fb* also allows several ioctls on it, by which lots of information about +the hardware can be queried and set. The color map handling works via ioctls, +too. Look into for more information on what ioctls exist and on +which data structures they work. Here's just a brief overview: + + - You can request unchangeable information about the hardware, like name, + organization of the screen memory (planes, packed pixels, ...) and address + and length of the screen memory. + + - You can request and change variable information about the hardware, like + visible and virtual geometry, depth, color map format, timing, and so on. + If you try to change that information, the driver maybe will round up some + values to meet the hardware's capabilities (or return EINVAL if that isn't + possible). + + - You can get and set parts of the color map. Communication is done with 16 + bits per color part (red, green, blue, transparency) to support all + existing hardware. The driver does all the computations needed to apply + it to the hardware (round it down to less bits, maybe throw away + transparency). + +All this hardware abstraction makes the implementation of application programs +easier and more portable. E.g. the X server works completely on /dev/fb* and +thus doesn't need to know, for example, how the color registers of the concrete +hardware are organized. XF68_FBDev is a general X server for bitmapped, +unaccelerated video hardware. The only thing that has to be built into +application programs is the screen organization (bitplanes or chunky pixels +etc.), because it works on the frame buffer image data directly. + +For the future it is planned that frame buffer drivers for graphics cards and +the like can be implemented as kernel modules that are loaded at runtime. Such +a driver just has to call register_framebuffer() and supply some functions. +Writing and distributing such drivers independently from the kernel will save +much trouble... + + +3. Frame Buffer Resolution Maintenance +-------------------------------------- + +Frame buffer resolutions are maintained using the utility `fbset'. It can +change the video mode properties of the current resolution. Its main usage is +to change the current video mode, e.g. during boot up in one of your /etc/rc.* +or /etc/init.d/* files. + +Fbset uses a video mode database stored in a configuration file, so you can +easily add your own modes and refer to them with a simple identifier. + + +4. The X Server +--------------- + +The X server (XF68_FBDev) is the most notable application program for the frame +buffer device. The current X server is part of the XFree86/XFree68 release +3.3.1 package and has 2 modes: + + - If the `Display' subsection for the `fbdev' driver in the /etc/XF86Config + file contains a + + Modes "default" + + line, the X server will use the scheme discussed above, i.e. it will start + up in the resolution determined by /dev/fb0current (or $FRAMEBUFFER, if + set). This is the default for the configuration file supplied with XFree68 + 3.2. It's the most simple configuration (and the only possible one if you + want to have a broadcast compatible display, e.g. PAL or NTSC), but it has + some limitations. + + - Therefore it's also possible to specify resolutions in the /etc/XF86Config + file. This allows for on-the-fly resolution switching while retaining the + same virtual desktop size. The frame buffer device that's used is still + /dev/fb0current (or $FRAMEBUFFER), but the available resolutions are + defined by /etc/XF86Config now. The disadvantage is that you have to + specify the timings in a different format (but `fbset -x' may help) and + that you can't have a broadcast compatible display (e.g. no PAL or NTSC). + +To tune a video mode, you can use fbset or xvidtune. Note that xvidtune doesn't +work 100% with XF68_FBDev: the reported clock values are always incorrect. + + +5. Video Mode Timings +--------------------- + +A monitor draws an image on the screen by using an electron beam (3 electron +beams for most color models, 1 electron beam for Trinitron color monitors and +monochrone monitors). The front of the screen is covered by a pattern of +colored phospors (pixels). If a phospor is hit by an electron, it emits a +photon and thus becomes visible. + +The electron beam draws horizontal lines (scanlines) from left to right, and +from the top to the bottom of the screen. By modifying the intensity of the +electron beam, pixels with various colors and intensities can be shown. + +After each scanline the electron beam has to move back to the left side of the +screen and to the next line: this is called the horizontal retrace. After the +whole screen (frame) was painted, the beam moves back to the upper left corner: +this is called the vertical retrace. During both the horizontal and vertical +retrace, the electron beam is turned off (blanked). + +The speed at which the electron beam paints the pixels is determined by the +dotclock in the graphics board. For a dotclock of e.g. 28.37516 MHz (millions +of cycles per second), each pixel is 35242 ps (picoseconds) long: + + 1/(28.37516E6 Hz) = 35.242E-9 s + +If the screen resolution is 640x480, it will take + + 640*35.242E-9 s = 22.555E-6 s + +to paint the 640 (xres) pixels on one scanline. But the horizontal retrace +also takes time (e.g. 272 `pixels'), so a full scanline takes + + (640+272)*35.242E-9 s = 32.141E-6 s + +We'll say that the horizontal scanrate is about 31 kHz: + + 1/(32.141E-6 s) = 31.113E3 Hz + +A full screen counts 480 (yres) lines, but we have to consider the vertical +retrace too (e.g. 49 `pixels'). So a full screen will take + + (480+49)*32.141E-6 s = 17.002E-3 s + +The vertical scanrate is about 59 Hz: + + 1/(17.002E-3 s) = 58.815 Hz + +This means the screen data is refreshed about 59 times per second. To have a +stable picture without visible flicker, VESA recommends a vertical scanrate of +at least 72 Hz. But the perceived flicker is very human dependent: some people +can use 50 Hz without any trouble, while I'll notice if it's less than 80 Hz. + +Since the monitor doesn't know when a new scanline starts, the graphics board +will supply a synchronization pulse (horizontal sync or hsync) for each +scanline. Similarly it supplies a synchronization pulse (vertical sync or +vsync) for each new frame. The position of the image on the screen is +influenced by the moments at which the synchronization pulses occur. + +The following picture summarizes all timings. The horizontal retrace time is +the sum of the left margin, the right margin and the hsync length, while the +vertical retrace time is the sum of the upper margin, the lower margin and the +vsync length. + + +----------+---------------------------------------------+----------+-------+ + | | ^ | | | + | | |upper_margin | | | + | | ¥ | | | + +----------###############################################----------+-------+ + | # ^ # | | + | # | # | | + | # | # | | + | # | # | | + | left # | # right | hsync | + | margin # | xres # margin | len | + |<-------->#<---------------+--------------------------->#<-------->|<----->| + | # | # | | + | # | # | | + | # | # | | + | # |yres # | | + | # | # | | + | # | # | | + | # | # | | + | # | # | | + | # | # | | + | # | # | | + | # | # | | + | # | # | | + | # ¥ # | | + +----------###############################################----------+-------+ + | | ^ | | | + | | |lower_margin | | | + | | ¥ | | | + +----------+---------------------------------------------+----------+-------+ + | | ^ | | | + | | |vsync_len | | | + | | ¥ | | | + +----------+---------------------------------------------+----------+-------+ + +The frame buffer device expects all horizontal timings in number of dotclocks +(in picoseconds, 1E-12 s), and vertical timings in number of scanlines. + + +6. Converting XFree86 timing values info frame buffer device timings +-------------------------------------------------------------------- + +An XFree86 mode line consists of the following fields: + "800x600" 50 800 856 976 1040 600 637 643 666 + < name > DCF HR SH1 SH2 HFL VR SV1 SV2 VFL + +The frame buffer device uses the following fields: + + - pixclock: pixel clock in ps (pico seconds) + - left_margin: time from sync to picture + - right_margin: time from picture to sync + - upper_margin: time from sync to picture + - lower_margin: time from picture to sync + - hsync_len: length of horizontal sync + - vsync_len: length of vertical sync + +1) Pixelclock: + xfree: in MHz + fb: In Picoseconds (ps) + + pixclock = 1000000 / DCF + +2) horizontal timings: + left_margin = HFL - SH2 + right_margin = SH1 - HR + hsync_len = SH2 - SH1 + +3) vertical timings: + upper_margin = VFL - SV2 + lower_margin = SV1 - VR + vsync_len = SV2 - SV1 + +Good examples for VESA timings can be found in the XFree86 source tree, +under "xc/programs/Xserver/hw/xfree86/doc/modeDB.txt". + + +7. References +------------- + +For more specific information about the frame buffer device and its +applications, please refer to the following documentation: + + - The manual pages for fbset: fbset(8), fb.modes(5) + - The manual pages for XFree68: XF68_FBDev(1), XF86Config(4/5) + - The mighty kernel sources: + o linux/include/linux/fb.h + o linux/drivers/char/fbmem.c + o linux/drivers/video/*fb.c + + +8. Downloading +-------------- + +All necessary files can be found at + + ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/680x0/ + +and on its mirrors. + + +9. Credits +---------- + +This readme was written by Geert Uytterhoeven, partly based on the original +`X-framebuffer.README' by Roman Hodek and Martin Schaller. Section 6 was +provided by Frank Neumann. + +The frame buffer device abstraction was designed by Martin Schaller. diff -u --recursive --new-file v2.1.106/linux/Documentation/fb/internals.txt linux/Documentation/fb/internals.txt --- v2.1.106/linux/Documentation/fb/internals.txt Wed Dec 31 16:00:00 1969 +++ linux/Documentation/fb/internals.txt Wed Jun 24 14:44:00 1998 @@ -0,0 +1,86 @@ + +This is a first start for some documentation about frame buffer device +internals. + +Geert Uytterhoeven , 10 June 1998 + +-------------------------------------------------------------------------------- + + *** STRUCTURES USED BY THE FRAME BUFFER DEVICE API *** + +The following structures play a role in the game of frame buffer devices. They +are defined in . + +1. Outside the kernel (user space) + + - struct fb_fix_screeninfo + + Device independent unchangeable information about a frame buffer device and + a specific video mode. This can be obtained using the FBIOGET_FSCREENINFO + ioctl. + + - struct fb_var_screeninfo + + Device independent changeable information about a frame buffer device and a + specific video mode. This can be obtained using the FBIOGET_VSCREENINFO + ioctl, and updated with the FBIOPUT_VSCREENINFO ioctl. If you want to pan + the screen only, you can use the FBIOPAN_DISPLAY ioctl. + + - struct fb_cmap + + Device independent colormap information. You can get and set the colormap + using the FBIOGETCMAP and FBIOPUTCMAP ioctls. + + +2. Inside the kernel + + - struct fb_info + + Generic information, API and low level information about a specific frame + buffer device instance (slot number, board address, ...). + + - struct `par' + + Device dependent information that uniquely defines the video mode for this + particular piece of hardware. + + - struct display + + Interface between the frame buffer device and the console driver. + + +-------------------------------------------------------------------------------- + + *** VISUALS USED BY THE FRAME BUFFER DEVICE API *** + + +Monochrome (FB_VISUAL_MONO01 and FB_VISUAL_MONO10) +------------------------------------------------- +Each pixel is either black or white. + + +Pseudo color (FB_VISUAL_PSEUDOCOLOR and FB_VISUAL_STATIC_PSEUDOCOLOR) +--------------------------------------------------------------------- +The whole pixel value is fed through a programmable lookup table that has one +color (including red, green, and blue intensities) for each possible pixel +value, and that color is displayed. + + +True color (FB_VISUAL_TRUECOLOR) +-------------------------------- +The pixel value is broken up into red, green, and blue fields, each of which +are looked up in separate red, green, and blue lookup tables. + + +Direct color (FB_VISUAL_DIRECTCOLOR) +------------------------------------ +The pixel value is broken up into red, green, and blue fields. This is what +most people mean when then say `true color'. + + +Grayscale displays +------------------ +Grayscale and static grayscale are special variants of pseudo color and static +pseudo color, where the red, green and blue components are always equal to +each other. + diff -u --recursive --new-file v2.1.106/linux/Documentation/fb/vesafb.txt linux/Documentation/fb/vesafb.txt --- v2.1.106/linux/Documentation/fb/vesafb.txt Wed Dec 31 16:00:00 1969 +++ linux/Documentation/fb/vesafb.txt Wed Jun 24 14:44:00 1998 @@ -0,0 +1,71 @@ + +what is vesafb? +=============== + +This is a generic driver for a graphic framebuffer on intel boxes. + +Idea is simple: Turn on graphics mode at boot time with the help of +the BIOS, and use this as framebuffer device /dev/fb0, like the m68k +(and other) ports do. + +This means we decide at boot time whenever we want to run in text or +graphics mode. Switching mode later on (in protected mode) is +impossible, BIOS calls work in real mode only. VESA BIOS Extentions +Version 2.0 are required, becauce we need a linear frame buffer. + +Advantages: + + * It provides a nice large console (128 cols + 48 lines with 1024x768) + without using tiny, unreadable fonts. + * You can run XF68_FBDev on top of /dev/fb0 (=> non-accelerated X11 + support for every VBE 2.0 compilant graphics board). + * Most important: boot logo :-) + +Disadvantages: + + * graphic mode is slower than text mode... + + +How to use it? +============== + +Switching modes is done using the vga=... boot parameter. Read +Documentation/svga.txt for details. With vesafb both text and +graphics modes work. Text modes are handled by vgafb, graphic modes +by the new vesafb.c. + +The graphic modes are not in the list which you get if you boot with +vga=ask and hit return. Here are some mode numbers: + + | 640x480 800x600 1024x768 +----+--------------------------- +256 | 0x101 0x103 0x105 +32k | 0x110 0x113 0x116 +64k | 0x111 0x114 0x117 +16M | 0x112 0x115 0x118 + +Note 1: this are the VESA mode numbers. The video mode select code + expects 0x200 + VESA mode number. +Note 2: lilo can't handle hex, for booting with "vga=??" you have to + transform the numbers to decimal. + + +Speed it up! +============ + +Check /usr/src/linux/Documentation/mtrr.txt, enabling write-combining +for the framebuffer memory gives a performance boost. + +There are two ways to do console scrolling: redraw the screen +completely, or by copying around the video memory. You can select one +of them using the kernel command line: video=vesa:redraw or +video=vesa:memmove. redraw is the default, becauce this one works +faster on my box. + + +Have fun! + + Gerd + +-- +Gerd Knorr diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/00-INDEX linux/Documentation/filesystems/00-INDEX --- v2.1.106/linux/Documentation/filesystems/00-INDEX Sun Jun 7 11:16:25 1998 +++ linux/Documentation/filesystems/00-INDEX Wed Jun 24 14:30:07 1998 @@ -9,20 +9,20 @@ hpfs.txt - info and mount options for the OS/2 HPFS. isofs.txt - - info and mount options for the ISO9660 (CDROM) filesystem. + - info and mount options for the ISO 9660 (CDROM) filesystem. ncpfs.txt - info on Novell Netware(tm) filesystem using NCP protocol. ntfs.txt - - info and mount options for the NTFS filesystem (Win NT). + - info and mount options for the NTFS filesystem (Windows NT). romfs.txt - Description of the ROMFS filesystem. smbfs.txt - - info on using filesystems with the SMB protocol (Win 3.11, Win NT) + - info on using filesystems with the SMB protocol (Windows 3.11 and NT) sysv-fs.txt - info on the SystemV/Coherent filesystem. umsdos.txt - info on the umsdos extensions to the msdos filesystem. vfat.txt - - info on using the VFAT filesystem used in Win NT and Win 95 + - info on using the VFAT filesystem used in Windows NT and Windows 95 vfs.txt - Overview of the Virtual File System diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/affs.txt linux/Documentation/filesystems/affs.txt --- v2.1.106/linux/Documentation/filesystems/affs.txt Fri May 8 23:14:41 1998 +++ linux/Documentation/filesystems/affs.txt Wed Jun 24 14:30:07 1998 @@ -1,8 +1,8 @@ -Amiga filesystems Overview -========================== +Overview of Amiga Filesystems +============================= Not all varieties of the Amiga filesystems are supported for reading and -writing. The Amiga currently knows 6 different filesystems: +writing. The Amiga currently knows six different filesystems: DOS\0 The old or original filesystem, not really suited for hard disks and normally not used on them, either. @@ -67,7 +67,7 @@ be written to the syslog when the filesystem is mounted. mufs The filesystem is really a muFS, also it doesn't - identify itself as one. This option is neccessary if + identify itself as one. This option is necessary if the filesystem wasn't formatted as muFS, but is used as one. @@ -99,9 +99,9 @@ User id and group id will be used unless set[gu]id are given as mount options. Since most of the Amiga file systems are single user systems -they will be owned by root. The root directory of the Amiga filesystem -(i. e. the mount point) will be owned by the user who actually mounts -the filesystem (the root directory doesn't have uid/gid fields). +they will be owned by root. The root directory (the mount point) of the +Amiga filesystem will be owned by the user who actually mounts the +filesystem (the root directory doesn't have uid/gid fields). Linux -> Amiga: @@ -116,7 +116,7 @@ - All other flags (suid, sgid, ...) are ignored and will not be retained. -Newly created files and directories will get the user and group id +Newly created files and directories will get the user and group ID of the current user and a mode according to the umask. Symbolic links @@ -126,7 +126,7 @@ are some, not always subtle, differences. One of them becomes apparent with symbolic links. While Linux has a file system with exactly one root directory, the Amiga has a separate root directory for each -file system (e.g. partition, floppy disk, ...). With the Amiga, +file system (for example, partition, floppy disk, ...). With the Amiga, these entities are called "volumes". They have symbolic names which can be used to access them. Thus, symbolic links can point to a different volume. AFFS turns the volume name into a directory name diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/coda.txt linux/Documentation/filesystems/coda.txt --- v2.1.106/linux/Documentation/filesystems/coda.txt Sat May 2 14:19:51 1998 +++ linux/Documentation/filesystems/coda.txt Wed Jun 24 14:30:07 1998 @@ -1,4 +1,3 @@ - NOTE: This is one of the technical documents describing a component of Coda -- this document describes the client kernel-Venus interface. @@ -9,7 +8,7 @@ ftp://ftp.coda.cs.cmu.edu To run Coda you need to get a user level cache manager for the client, -named Venus, as well as tools to manipulate ACL's, to log in etc. The +named Venus, as well as tools to manipulate ACLs, to log in, etc. The client needs to have the Coda filesystem selected in the kernel configuration. @@ -27,7 +26,7 @@ v1.0, Nov 9, 1997 This document describes the communication between Venus and kernel - level file system code needed for the operation of the Coda filesys- + level filesystem code needed for the operation of the Coda file sys- tem. This document version is meant to describe the current interface (version 1.0) as well as improvements we envisage. ______________________________________________________________________ @@ -177,7 +176,7 @@ The interface between the kernel and Venus is very similar to the BSD VFS interface. Similar functionality is provided, and the format of the parameters and returned data is very similar to the BSD VFS. This - leads to an almost natural environment for implementing a kernel level + leads to an almost natural environment for implementing a kernel-level filesystem driver for Coda in a BSD system. However, other operating systems such as Linux and Windows 95 and NT have virtual filesystem with different interfaces. @@ -359,7 +358,7 @@ 33..11.. IImmpplleemmeennttaattiioonn ddeettaaiillss The Unix implementation of this mechanism has been through the - implemenation of a character device associated with Coda. Venus + implementation of a character device associated with Coda. Venus retrieves messages by doing a read on the device, replies are sent with a write and notification is through the select system call on the file descriptor for the device. The process P is kept waiting on an @@ -369,7 +368,7 @@ call is used. The DeviceIoControl call is designed to copy buffers from user memory to kernel memory with OPCODES. The sendmsg_to_kernel is issued as a synchronous call, while the getmsg_from_kernel call is - asynchrounous. Windows EventObjects are used for notification of + asynchronous. Windows EventObjects are used for notification of message arrival. The process P is kept waiting on a KernelEvent object in NT and a semaphore in Windows 95. @@ -429,7 +428,7 @@ for the Windows environment when these mature. struct CodaCred { - vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, efftve, set, fs uid*/ + vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, effective, set, fs uid*/ vgid_t cr_gid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */ vgid_t cr_groups[NGROUPS]; /* Group membership for caller */ }; @@ -514,7 +513,7 @@ Coda specific requests can be made by application through the pioctl interface. The pioctl is implemented as an ordinary ioctl on a - ficticious file /coda/.CONTROL. The pioctl call opens this file, gets + fictitious file /coda/.CONTROL. The pioctl call opens this file, gets a file handle and makes the ioctl call. Finally it closes the file. The kernel involvement in this is limited to providing the facility to @@ -721,7 +720,7 @@ access will be granted. It is important to remember that Coda uses ACLs to enforce protection and that ultimately the servers, not the clients enforce the security of the system. The result of this call - will depend on wether a _t_o_k_e_n is held by the user. + will depend on whether a _t_o_k_e_n is held by the user. EErrrroorrss The object may not exist, or the ACL describing the protection may not be accessible. @@ -765,7 +764,7 @@ are set by converting the CodaCred to a uid using a macro CRTOUID (this macro is platform dependent). Upon success the VFid and attributes of the file are returned. The Coda FS Driver will normally - instantiate a vnode, inode or filehandle at kernel level for the new + instantiate a vnode, inode or file handle at kernel level for the new object. @@ -780,7 +779,7 @@ to return a file descriptor. The trunctate and exclusive options, together with the mode, could simply be part of the mode as it is under Unix. There should be no flags argument; this is used in open - (2) to return a filedescriptor for READ or WRITE mode. + (2) to return a file descriptor for READ or WRITE mode. The attributes of the directory should be returned too, since the size and mtime changed. @@ -1221,7 +1220,7 @@ DDeessccrriippttiioonn Ask Venus to update RVM attributes of object VFid. This should be called as part of kernel level fsync type calls. The - result indicates if the synching was successful. + result indicates if the syncing was successful. EErrrroorrss diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/fat_cvf.txt linux/Documentation/filesystems/fat_cvf.txt --- v2.1.106/linux/Documentation/filesystems/fat_cvf.txt Sat May 2 14:19:51 1998 +++ linux/Documentation/filesystems/fat_cvf.txt Wed Jun 24 14:30:07 1998 @@ -20,7 +20,7 @@ example, are Microsoft's Doublespace/Drivespace and Stac's Stacker. Using the CVF-FAT interface, it is possible to load a module that handles all the low-level disk access that has to do with on-the-fly compression -and decompression. All other part of FAT filesystem access is still handled +and decompression. Any other part of FAT filesystem access is still handled by the FAT, MSDOS or VFAT or even UMSDOS driver. CVF access works by redirecting certain low-level routines from the FAT @@ -46,16 +46,16 @@ might be persuaded to implement it :). CVF-FAT is already prepared for using readpage. -- DOSEMU users attention +- attention, DOSEmu users - You may have to unmount all CVF partitions before running DOSEMU depending - on your configuration. If DOSEMU is configured to use wholedisk or - partition access (this is often the case to let DOSEMU access + You may have to unmount all CVF partitions before running DOSEmu depending + on your configuration. If DOSEmu is configured to use wholedisk or + partition access (this is often the case to let DOSEmu access compressed partitions) there's a risk of destroying your compressed partitions or crashing your system because of confused drivers. Note that it is always safe to redirect the compressed partitions with - lredir or emufs.sys. Refer to the DOSEMU documentation for details. + lredir or emufs.sys. Refer to the DOSEmu documentation for details. 3. Mount options @@ -88,7 +88,7 @@ ------------------------------------------------------------------------------ Assuming you want to write your own CVF module, you need to write a lot of -interface funtions. Most of them are covered in the kernel documentation +interface functions. Most of them are covered in the kernel documentation you can find on the net, and thus won't be described here. They have been marked with "[...]" :-) Take a look at include/linux/fat_cvf.h. @@ -169,7 +169,7 @@ call this function to introduce your CVF format to the FAT/CVF-FAT driver. This is usually done in init_module. Be sure to check the return value. Zero means success, everything else causes a kernel - message printed in the syslog describing the error that occured. + message printed in the syslog describing the error that occurred. Typical errors are: - a module with the same version id is already registered or - too many CVF formats. Hack fs/fat/cvf.c if you need more. diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/hpfs.txt linux/Documentation/filesystems/hpfs.txt --- v2.1.106/linux/Documentation/filesystems/hpfs.txt Sun Dec 17 01:17:20 1995 +++ linux/Documentation/filesystems/hpfs.txt Wed Jun 24 14:30:07 1998 @@ -5,7 +5,7 @@ uid=nnn All files in the partition will be owned by user id nnn. gid=nnn All files in the partition will be in group nnn. umask=nnn The permission mask (see umask(1)) for the partition. - conv=binary Data is returned exactly as is, with CRLF's. [default] + conv=binary Data is returned exactly as is, with CRLFs. [default] conv=text (Carriage return, line feed) is replaced with newline. conv=auto Chooses, file by file, conv=binary or conv=text (by guessing) diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/isofs.txt linux/Documentation/filesystems/isofs.txt --- v2.1.106/linux/Documentation/filesystems/isofs.txt Tue Jun 23 10:01:18 1998 +++ linux/Documentation/filesystems/isofs.txt Wed Jun 24 14:30:07 1998 @@ -13,17 +13,17 @@ utf8 option. utf8 Encode Unicode names in UTF8 format. Default is no. -Mount options that are unique to the isofs filesystem. +Mount options unique to the isofs filesystem. block=512 Set the block size for the disk to 512 bytes block=1024 Set the block size for the disk to 1024 bytes block=2048 Set the block size for the disk to 2048 bytes check=relaxed Matches filenames with different cases check=strict Matches only filenames with the exact same case cruft Try to handle badly formatted CDs. - map=off Do not map non-rockridge filenames to lowercase - map=normal Map non-rockridge filenames to lowecase + map=off Do not map non-Rock Ridge filenames to lower case + map=normal Map non-Rock Ridge filenames to lower case map=acorn As map=normal but also apply Acorn extensions if present mode=xxx Sets the permissions on files to xxx nojoliet Ignore Joliet extensions if they are present. - norock Ignore rockridge extensions if they are present. + norock Ignore Rock Ridge extensions if they are present. unhide Show hidden files. diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/romfs.txt linux/Documentation/filesystems/romfs.txt --- v2.1.106/linux/Documentation/filesystems/romfs.txt Sat May 2 14:19:51 1998 +++ linux/Documentation/filesystems/romfs.txt Wed Jun 24 14:30:07 1998 @@ -1,7 +1,6 @@ - ROMFS - ROM FILE SYSTEM -This is a quite dumb, read only filesystem, mainly for initial ram +This is a quite dumb, read only filesystem, mainly for initial RAM disks of installation disks. It has grown up by the need of having modules linked at boot time. Using this filesystem, you get a very similar feature, and even the possibility of a small kernel, with a @@ -29,13 +28,13 @@ which has only this filesystem linked in, and then can load any module later, with the current module utilities. It can also be used to run some program to decide if you need SCSI devices, and even IDE or -floppy drives can be loaded later if you use the "initrd" -- initial -ram disk -- feature of the kernel. This would not be really news +floppy drives can be loaded later if you use the "initrd"--initial +RAM disk--feature of the kernel. This would not be really news flash, but with romfs, you can even spare off your ext2 or minix or maybe even affs filesystem until you really know that you need it. For example, a distribution boot disk can contain only the cd disk -drivers (and possibly the SCSI drivers), and the ISO filesystem +drivers (and possibly the SCSI drivers), and the ISO 9660 filesystem module. The kernel can be small enough, since it doesn't have other filesystems, like the quite large ext2fs module, which can then be loaded off the CD at a later stage of the installation. Another use @@ -148,7 +147,7 @@ features and code, because the primary and most important advantage of this file system is the small code. On the other hand, don't be alarmed, I'm not getting that much romfs related mail. Now I can -understand why Avery wrote poems in the arcnet docs to get some more +understand why Avery wrote poems in the ARCnet docs to get some more feedback. :) romfs has also a mailing list, and to date, it hasn't received any @@ -167,7 +166,7 @@ one would want to write _anything_ to a file system, he still needs a writable file system, thus negating the size advantages. Possible solutions: implement write access as a compile-time option, or a new, -similarly small writable filesystem for ram disks. +similarly small writable filesystem for RAM disks. - Since the files are only required to have alignment on a 16 byte boundary, it is currently possibly suboptimal to read or execute files diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/vfat.txt linux/Documentation/filesystems/vfat.txt --- v2.1.106/linux/Documentation/filesystems/vfat.txt Sat May 2 14:19:51 1998 +++ linux/Documentation/filesystems/vfat.txt Wed Jun 24 14:30:07 1998 @@ -34,7 +34,7 @@ posix= -- Allow names of same letters, different case such as 'LongFileName' and 'longfilename' to coexist. This has some problems currently because 8.3 conflicts are not handled - correctly for Posix filesystem compliance. + correctly for POSIX filesystem compliance. nonumtail= -- When creating 8.3 aliases, normally the alias will end in '~1' or tilde followed by some number. If this option is set, then if the filename is @@ -61,7 +61,7 @@ a get next directory entry approach. The only thing left that uses raw scanning is the directory renaming code. -* Fix the Posix filesystem support to work in 8.3 space. This involves +* Fix the POSIX filesystem support to work in 8.3 space. This involves renaming aliases if a conflict occurs between a new filename and an old alias. This is quite a mess. diff -u --recursive --new-file v2.1.106/linux/Documentation/filesystems/vfs.txt linux/Documentation/filesystems/vfs.txt --- v2.1.106/linux/Documentation/filesystems/vfs.txt Thu May 7 22:51:46 1998 +++ linux/Documentation/filesystems/vfs.txt Wed Jun 24 14:30:07 1998 @@ -2,22 +2,22 @@ =========================================== by Benjamin LaHaise (blah@dot.superaje.com) -Noone else seems to be writing this, so here's a quick description of what -I've learned while writing lofs... +No one else seems to be writing this, so here's a quick description of what +I've learned while writing lofs. The VFS is relatively simple, but it is nice not to have to browse through pages of code to determine what is expected when writing a filesystem. -Hopefully this helps anyone attempting such a feat, as well as clearing up -a few important points/dependencies. +This document is meant to help anyone attempting such a feat, and to clarify +a few important points and dependencies. register_filesystem (struct file_system_type *fstype) ===================================================== -All filesystems are created equal... or at least they start out that way. -A filesystem, be it in module form, or linked into the kernel, needs to add +All filesystems are created equal, or at least they start out that way. +A filesystem, whether in module form or linked into the kernel, needs to add itself to the table of filesystems by calling register_filesystem with an initialized file_system_type structure. Any further functions of the -filesystem are accessed through the following function tables... +filesystem are accessed through the following function tables: struct file_system_type @@ -101,8 +101,8 @@ int (*lookup) (struct inode *dir, const char *name, int len, struct inode **result); [optional] lookup is called when the VFS wishes to have the filesystem resolve a name - into an inode. Dir is a directory on the filesystem that [hopefully] contains - the zero terminated string name (length len). A return value of zero indicates + into an inode. Dir is a directory on the filesystem that--we hope--contains + the zero-terminated string name (length len). A return value of zero indicates that there is a valid inode stored in *result. *** Note: lofs assumes that any filesystem returns an inode within the filesystem diff -u --recursive --new-file v2.1.106/linux/Documentation/hayes-esp.txt linux/Documentation/hayes-esp.txt --- v2.1.106/linux/Documentation/hayes-esp.txt Sun Jun 7 11:16:25 1998 +++ linux/Documentation/hayes-esp.txt Wed Jun 24 14:34:44 1998 @@ -28,7 +28,7 @@ Features: - Uses the enhanced mode of the ESP card, allowing a wider range of - interrupts and features than compatibilty mode + interrupts and features than compatibility mode - Uses DMA and 16 bit PIO mode to transfer data to and from the ESP's FIFOs, reducing CPU load - Supports primary and secondary ports @@ -71,12 +71,12 @@ The dma= option can be used to set the DMA channel. The channel can be either 1 or 3. Specifying any other value will force the driver to use PIO mode. -For example, to set the dma channel to 3, the insmod command would be: +For example, to set the DMA channel to 3, the insmod command would be: insmod esp dma=3 The rx_trigger= and tx_trigger= options can be used to set the FIFO trigger -levels. They specifie when the ESP card should send an interrupt. Larger +levels. They specify when the ESP card should send an interrupt. Larger values will decrease the number of interrupts; however, a value too high may result in data loss. Valid values are 1 through 1023, with 768 being the default. For example, to set the receive trigger level to 512 bytes and the diff -u --recursive --new-file v2.1.106/linux/Documentation/initrd.txt linux/Documentation/initrd.txt --- v2.1.106/linux/Documentation/initrd.txt Sun Jun 7 11:16:25 1998 +++ linux/Documentation/initrd.txt Wed Jun 24 14:30:07 1998 @@ -84,7 +84,7 @@ the intermediate step of going via initrd adds a little speed advantage and it allows the use of a compressed file system. Also, together with LOADLIN you may load the RAM disk directly from - CDrom or disk, hence having a floppyless boot from CD, + CDROM or disk, hence having a floppyless boot from CD, e.g.: E:\loadlin E:\bzImage root=/dev/ram initrd=E:\rdimage @@ -256,9 +256,9 @@ dialog and it can also perform some sanity checks (or even some form of auto-detection). -Last not least, CDrom distributors may use it for better installation from CD, -either using a LILO boot floppy and bootstrapping a bigger ramdisk via -initrd from CD, or using LOADLIN to directly load the ramdisk from CD +Last not least, CDROM distributors may use it for better installation from CD, +either using a LILO boot floppy and bootstrapping a bigger RAM disk via +initrd from CD, or using LOADLIN to directly load the RAM disk from CD without need of floppies. Since initrd is a fairly generic mechanism, it is likely that additional diff -u --recursive --new-file v2.1.106/linux/Documentation/kmod.txt linux/Documentation/kmod.txt --- v2.1.106/linux/Documentation/kmod.txt Sat May 2 14:19:51 1998 +++ linux/Documentation/kmod.txt Wed Jun 24 14:30:07 1998 @@ -34,8 +34,8 @@ If kerneld worked, why replace it? -- kerneld used sysv ipc, which can now be made into a module. Besides, - sysv ipc is ugly and should therefore be avoided (well, certainly for +- kerneld used SysV IPC, which can now be made into a module. Besides, + SysV IPC is ugly and should therefore be avoided (well, certainly for kernel level stuff) - both kmod and kerneld end up doing the same thing (calling modprobe), @@ -44,4 +44,4 @@ - removing kerneld related stuff from ipc/msg.c made it 40% smaller - kmod reports errors through the normal kernel mechanisms, which avoids - the chicken and egg problem of kerneld and modular unix domain sockets + the chicken and egg problem of kerneld and modular Unix domain sockets diff -u --recursive --new-file v2.1.106/linux/Documentation/m68k/framebuffer.txt linux/Documentation/m68k/framebuffer.txt --- v2.1.106/linux/Documentation/m68k/framebuffer.txt Sun Jun 7 11:16:25 1998 +++ linux/Documentation/m68k/framebuffer.txt Wed Dec 31 16:00:00 1969 @@ -1,330 +0,0 @@ - - The Linux/m68k Frame Buffer Device - ---------------------------------- - -Maintained by Geert Uytterhoeven (Geert.Uytterhoeven@cs.kuleuven.ac.be) -Last revised: January 24, 1998 - - -0. Introduction ---------------- - -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. - -The device is accessed through special device nodes, usually located in the -/dev directory, i.e. /dev/fb*. - - -1. User's View of /dev/fb* --------------------------- - -From the user's point of view, the frame buffer device looks just like any -other device in /dev. It's a character device using major 29; the minor -specifies the frame buffer number. - -By convention, the following device nodes are used (numbers indicate the device -minor numbers): - - 0 = /dev/fb0 First frame buffer - 32 = /dev/fb1 Second frame buffer - ... - 224 = /dev/fb7 8th frame buffer - -For backwards compatibility, you may want to create the following symbolic -links: - - /dev/fb0current -> fb0 - /dev/fb1current -> fb1 - -and so on... - -The frame buffer devices are also `normal' memory devices, this means, you can -read and write their contents. You can, for example, make a screen snapshot by - - cp /dev/fb0 myfile - -There also can be more than one frame buffer at a time, e.g. if you have a -graphics card in addition to the built-in hardware. The corresponding frame -buffer devices (/dev/fb0 and /dev/fb1 etc.) work independently. - -Application software that uses the frame buffer device (e.g. the X server) will -use /dev/fb0 by default (older software uses /dev/fb0current). You can specify -an alternative frame buffer device by setting the environment variable -$FRAMEBUFFER to the path name of a frame buffer device, e.g. (for sh/bash -users): - - export FRAMEBUFFER=/dev/fb1 - -or (for csh users): - - setenv FRAMEBUFFER /dev/fb1 - -After this the X server will use the second frame buffer. - - -2. Programmer's View of /dev/fb* --------------------------------- - -As you already know, a frame buffer device is a memory device like /dev/mem and -it has the same features. You can read it, write it, seek to some location in -it and mmap() it (the main usage). The difference is just that the memory that -appears in the special file is not the whole memory, but the frame buffer of -some video hardware. - -/dev/fb* also allows several ioctls on it, by which lots of information about -the hardware can be queried and set. The color map handling works via ioctls, -too. Look into for more information on what ioctls exist and on -which data structures they work. Here's just a brief overview: - - - You can request unchangeable information about the hardware, like name, - organization of the screen memory (planes, packed pixels, ...) and address - and length of the screen memory. - - - You can request and change variable information about the hardware, like - visible and virtual geometry, depth, color map format, timing, and so on. - If you try to change that information, the driver maybe will round up some - values to meet the hardware's capabilities (or return EINVAL if that isn't - possible). - - - You can get and set parts of the color map. Communication is done with 16 - bits per color part (red, green, blue, transparency) to support all - existing hardware. The driver does all the computations needed to apply - it to the hardware (round it down to less bits, maybe throw away - transparency). - -All this hardware abstraction makes the implementation of application programs -easier and more portable. E.g. the X server works completely on /dev/fb* and -thus doesn't need to know, for example, how the color registers of the concrete -hardware are organized. XF68_FBDev is a general X server for bitmapped, -unaccelerated video hardware. The only thing that has to be built into -application programs is the screen organization (bitplanes or chunky pixels -etc.), because it works on the frame buffer image data directly. - -For the future it is planned that frame buffer drivers for graphics cards and -the like can be implemented as kernel modules that are loaded at runtime. Such -a driver just has to call register_framebuffer() and supply some functions. -Writing and distributing such drivers independently from the kernel will save -much trouble... - - -3. Frame Buffer Resolution Maintenance --------------------------------------- - -Frame buffer resolutions are maintained using the utility `fbset'. It can -change the video mode properties of the current resolution. Its main usage is -to change the current video mode, e.g. during boot up in one of your /etc/rc.* -or /etc/init.d/* files. - -Fbset uses a video mode database stored in a configuration file, so you can -easily add your own modes and refer to them with a simple identifier. - - -4. The X Server ---------------- - -The X server (XF68_FBDev) is the most notable application program for the frame -buffer device. The current X server is part of the XFree86/XFree68 release -3.3.1 package and has 2 modes: - - - If the `Display' subsection for the `fbdev' driver in the /etc/XF86Config - file contains a - - Modes "default" - - line, the X server will use the scheme discussed above, i.e. it will start - up in the resolution determined by /dev/fb0current (or $FRAMEBUFFER, if - set). This is the default for the configuration file supplied with XFree68 - 3.2. It's the most simple configuration (and the only possible one if you - want to have a broadcast compatible display, e.g. PAL or NTSC), but it has - some limitations. - - - Therefore it's also possible to specify resolutions in the /etc/XF86Config - file. This allows for on-the-fly resolution switching while retaining the - same virtual desktop size. The frame buffer device that's used is still - /dev/fb0current (or $FRAMEBUFFER), but the available resolutions are - defined by /etc/XF86Config now. The disadvantage is that you have to - specify the timings in a different format (but `fbset -x' may help) and - that you can't have a broadcast compatible display (e.g. no PAL or NTSC). - -To tune a video mode, you can use fbset or xvidtune. Note that xvidtune doesn't -work 100% with XF68_FBDev: the reported clock values are always incorrect. - -There exists also an accelerated X server for the Cybervision 64 graphics -board, but that's not discussed here. - - -5. Video Mode Timings ---------------------- - -A monitor draws an image on the screen by using an electron beam (3 electron -beams for most color models, 1 electron beam for Trinitron color monitors and -monochrone monitors). The front of the screen is covered by a pattern of -colored phospors (pixels). If a phospor is hit by an electron, it emits a -photon and thus becomes visible. - -The electron beam draws horizontal lines (scanlines) from left to right, and -from the top to the bottom of the screen. By modifying the intensity of the -electron beam, pixels with various colors and intensities can be shown. - -After each scanline the electron beam has to move back to the left side of the -screen and to the next line: this is called the horizontal retrace. After the -whole screen (frame) was painted, the beam moves back to the upper left corner: -this is called the vertical retrace. During both the horizontal and vertical -retrace, the electron beam is turned off (blanked). - -The speed at which the electron beam paints the pixels is determined by the -dotclock in the graphics board. For a dotclock of e.g. 28.37516 MHz (millions -of cycles per second), each pixel is 35242 ps (picoseconds) long: - - 1/(28.37516E6 Hz) = 35.242E-9 s - -If the screen resolution is 640x480, it will take - - 640*35.242E-9 s = 22.555E-6 s - -to paint the 640 (xres) pixels on one scanline. But the horizontal retrace -also takes time (e.g. 272 `pixels'), so a full scanline takes - - (640+272)*35.242E-9 s = 32.141E-6 s - -We'll say that the horizontal scanrate is about 31 kHz: - - 1/(32.141E-6 s) = 31.113E3 Hz - -A full screen counts 480 (yres) lines, but we have to consider the vertical -retrace too (e.g. 49 `pixels'). So a full screen will take - - (480+49)*32.141E-6 s = 17.002E-3 s - -The vertical scanrate is about 59 Hz: - - 1/(17.002E-3 s) = 58.815 Hz - -This means the screen data is refreshed about 59 times per second. To have a -stable picture without visible flicker, VESA recommends a vertical scanrate of -at least 72 Hz. But the perceived flicker is very human dependent: some people -can use 50 Hz without any trouble, while I'll notice if it's less than 80 Hz. - -Since the monitor doesn't know when a new scanline starts, the graphics board -will supply a synchronization pulse (horizontal sync or hsync) for each -scanline. Similarly it supplies a synchronization pulse (vertical sync or -vsync) for each new frame. The position of the image on the screen is -influenced by the moments at which the synchronization pulses occur. - -The following picture summarizes all timings. The horizontal retrace time is -the sum of the left margin, the right margin and the hsync length, while the -vertical retrace time is the sum of the upper margin, the lower margin and the -vsync length. - - +----------+---------------------------------------------+----------+-------+ - | | ^ | | | - | | |upper_margin | | | - | | ¥ | | | - +----------###############################################----------+-------+ - | # ^ # | | - | # | # | | - | # | # | | - | # | # | | - | left # | # right | hsync | - | margin # | xres # margin | len | - |<-------->#<---------------+--------------------------->#<-------->|<----->| - | # | # | | - | # | # | | - | # | # | | - | # |yres # | | - | # | # | | - | # | # | | - | # | # | | - | # | # | | - | # | # | | - | # | # | | - | # | # | | - | # | # | | - | # ¥ # | | - +----------###############################################----------+-------+ - | | ^ | | | - | | |lower_margin | | | - | | ¥ | | | - +----------+---------------------------------------------+----------+-------+ - | | ^ | | | - | | |vsync_len | | | - | | ¥ | | | - +----------+---------------------------------------------+----------+-------+ - -The frame buffer device expects all horizontal timings in number of dotclocks -(in picoseconds, 1E-12 s), and vertical timings in number of scanlines. - - -6. Converting XFree86 timing values info frame buffer device timings --------------------------------------------------------------------- - -An XFree86 mode line consists of the following fields: - "800x600" 50 800 856 976 1040 600 637 643 666 - < name > DCF HR SH1 SH2 HFL VR SV1 SV2 VFL - -The frame buffer device uses the following fields: - - - pixclock: pixel clock in ps (pico seconds) - - left_margin: time from sync to picture - - right_margin: time from picture to sync - - upper_margin: time from sync to picture - - lower_margin: time from picture to sync - - hsync_len: length of horizontal sync - - vsync_len: length of vertical sync - -1) Pixelclock: - xfree: in MHz - fb: In Picoseconds (ps) - - pixclock = 1000000 / DCF - -2) horizontal timings: - left_margin = HFL - SH2 - right_margin = SH1 - HR - hsync_len = SH2 - SH1 - -3) vertical timings: - upper_margin = VFL - SV2 - lower_margin = SV1 - VR - vsync_len = SV2 - SV1 - -Good examples for VESA timings can be found in the XFree86 source tree, -under "xc/programs/Xserver/hw/xfree86/doc/modeDB.txt". - - -7. References -------------- - -For more specific information about the frame buffer device and its -applications, please refer to the following documentation: - - - The manual pages for fbset: fbset(8), fb.modes(5) - - The manual pages for XFree68: XF68_FBDev(1), XF86Config(4/5) - - The mighty kernel sources: - o linux/include/linux/fb.h - o linux/drivers/char/fbmem.c - o linux/drivers/video/*fb.c - - -8. Downloading --------------- - -All necessary files can be found at - - ftp://ftp.uni-erlangen.de/pub/Linux/680x0/ - -and on its mirrors. - - -9. Credits ----------- - -This readme was written by Geert Uytterhoeven, partly based on the original -`X-framebuffer.README' by Roman Hodek and Martin Schaller. Section 6 was -provided by Frank Neumann. - -The frame buffer device abstraction was designed by Martin Schaller. diff -u --recursive --new-file v2.1.106/linux/Documentation/mca.txt linux/Documentation/mca.txt --- v2.1.106/linux/Documentation/mca.txt Sat May 2 14:19:51 1998 +++ linux/Documentation/mca.txt Wed Jun 24 14:30:07 1998 @@ -159,12 +159,12 @@ 3) 3c523 drivers/net/3c523.c drivers/net/3c523.h - 3Com 3c523 Etherlink/MC ethernet driver. + 3Com 3c523 Etherlink/MC Ethernet driver. 4) SMC Ultra/MCA drivers/net/smc-mca.c drivers/net/smc-mca.h - Elite/A (8013EP/A) and Elite10T/A (8013WP/A) ethernet driver + Elite/A (8013EP/A) and Elite10T/A (8013WP/A) Ethernet driver As well, drivers/char/psaux.c was modified to support IRQ sharing (it's #ifdef CONFIG_MCA'ed, for your convenience, although PCI users might be diff -u --recursive --new-file v2.1.106/linux/Documentation/networking/framerelay.txt linux/Documentation/networking/framerelay.txt --- v2.1.106/linux/Documentation/networking/framerelay.txt Fri May 31 03:35:27 1996 +++ linux/Documentation/networking/framerelay.txt Wed Jun 24 14:34:44 1998 @@ -8,8 +8,8 @@ As such, a separate device is needed to accommodate the routing. Within the net-tools archives is 'dlcicfg'. This program will communicate with the base "DLCI" device, and create new net devices named 'dlci00', 'dlci01'... -The configuration script will ask you how many DLCI's you need, as well as -how many DLCI's you want to assign to each Frame Relay Access Device (FRAD). +The configuration script will ask you how many DLCIs you need, as well as +how many DLCIs you want to assign to each Frame Relay Access Device (FRAD). The DLCI uses a number of function calls to communicate with the FRAD, all of which are stored in the FRAD's private data area. assoc/deassoc, diff -u --recursive --new-file v2.1.106/linux/Documentation/networking/sktr.txt linux/Documentation/networking/sktr.txt --- v2.1.106/linux/Documentation/networking/sktr.txt Wed Dec 31 16:00:00 1969 +++ linux/Documentation/networking/sktr.txt Wed Jun 24 14:26:12 1998 @@ -0,0 +1,147 @@ +Text file for the Linux SysKonnect Token Ring ISA/PCI Adapter Driver. + Text file by: Jay Schulist + +The Linux SysKonnect Token Ring driver works with the SysKonnect TR4/16(+) ISA, +SysKonnect TR4/16(+) PCI, SysKonnect TR4/16 PCI, and older revisions of the +SK NET TR4/16 ISA card. + +Latest information on this driver can be obtained on the Linux-SNA WWW site. +Please point your browser to: +http://samba.anu.edu.au/linux-sna/documents/drivers/SysKonnect/ + +Many thanks to Christoph Goos for his excellent work on this driver and +SysKonnect for donating the adapters to Linux-SNA for the testing and maintaince +of this device driver. + +Important information to be noted: +1. Adapters can be slow to open (~20 secs) and close (~5 secs), please be + patient. +2. This driver works very well when autoprobing for adapters. Why even + think about those nasty io/int/dma settings of modprobe when the driver + will do it all for you! + +This driver is rather simple to use. Select Y to Token Ring adapter support +in the kernel configuration. A choice for SysKonnect Token Ring adapters will +appear. This drives supports all SysKonnect ISA and PCI adapters. Choose this +option. I personally recommend compiling the driver as a module (M), but if you +you would like to compile it staticly answer Y instead. + +This driver supports multiple adapters without the need to load multiple copies +of the driver. You should be able to load up to 7 adapters without any kernel +modifications, if you are in need of more please contact the maintainer of this +driver. + +Load the driver either by lilo/loadlin or as a module. When a module using the +following command will suffice for most: + +# modprobe sktr + +This will produce output similar to the following: (Output is user specific) + +sktr.c: v1.01 08/29/97 by Christoph Goos +tr0: SK NET TR 4/16 PCI found at 0x6100, using IRQ 17. +tr1: SK NET TR 4/16 PCI found at 0x6200, using IRQ 16. +tr2: SK NET TR 4/16 ISA found at 0xa20, using IRQ 10 and DMA 5. + +Now just setup the device via ifconfig and set and routes you may have. After +this you are ready to start sending some tokens. + +Errata: +For anyone wondering where to pick up the SysKonnect adapters please browse +to http://www.syskonnect.com + +This driver is under the GNU General Public License. Its Firmware image is +included as an initialized C-array and is licensed by SysKonnect to the Linux +users of this driver. However no waranty about its fitness is expressed or +implied by SysKonnect. + +Below find attached the setting for the SK NET TR 4/16 ISA adapters +------------------------------------------------------------------- + + *************************** + *** C O N T E N T S *** + *************************** + + 1) Location of DIP-Switch W1 + 2) Default settings + 3) DIP-Switch W1 description + + + ============================================================== + CHAPTER 1 LOCATION OF DIP-SWITCH + ============================================================== + +UÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +þUÄÄÄÄÄÄ¿ UÄÄÄÄÄ¿ UÄÄÄ¿ þ +þAÄÄÄÄÄÄU W1 AÄÄÄÄÄU UÄÄÄÄ¿ þ þ þ +þUÄÄÄÄÄÄ¿ þ þ þ þ UÄÄÅ¿ +þAÄÄÄÄÄÄU UÄÄÄÄÄÄÄÄÄÄÄ¿ AÄÄÄÄU þ þ þ þþ +þUÄÄÄÄÄÄ¿ þ þ UÄÄÄ¿ AÄÄÄU AÄÄÅU +þAÄÄÄÄÄÄU þ TMS380C26 þ þ þ þ +þUÄÄÄÄÄÄ¿ þ þ AÄÄÄU AÄ¿ +þAÄÄÄÄÄÄU þ þ þ þ +þ AÄÄÄÄÄÄÄÄÄÄÄU þ þ +þ þ þ +þ AÄU +þ þ +þ þ +þ þ +þ þ +AÄÄÄÄÄÄÄÄÄÄÄÄAÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄAÄÄAÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄAÄÄÄÄÄÄÄÄÄU + AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU + + ============================================================== + CHAPTER 2 DEFAULT SETTINGS + ============================================================== + + W1 1 2 3 4 5 6 7 8 + +------------------------------+ + | ON X | + | OFF X X X X X X X | + +------------------------------+ + + W1.1 = ON Adapter drives address lines SA17..19 + W1.2 - 1.5 = OFF BootROM disabled + W1.6 - 1.8 = OFF I/O address 0A20h + + ============================================================== + CHAPTER 3 DIP SWITCH W1 DESCRIPTION + ============================================================== + + UÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄ¿ ON + þ 1 þ 2 þ 3 þ 4 þ 5 þ 6 þ 7 þ 8 þ + AÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄAÄÄÄU OFF + |AD | BootROM Addr. | I/O | + +-+-+-------+-------+-----+-----+ + | | | + | | +------ 6 7 8 + | | ON ON ON 1900h + | | ON ON OFF 0900h + | | ON OFF ON 1980h + | | ON OFF OFF 0980h + | | OFF ON ON 1b20h + | | OFF ON OFF 0b20h + | | OFF OFF ON 1a20h + | | OFF OFF OFF 0a20h (+) + | | + | | + | +-------- 2 3 4 5 + | OFF x x x disabled (+) + | ON ON ON ON C0000 + | ON ON ON OFF C4000 + | ON ON OFF ON C8000 + | ON ON OFF OFF CC000 + | ON OFF ON ON D0000 + | ON OFF ON OFF D4000 + | ON OFF OFF ON D8000 + | ON OFF OFF OFF DC000 + | + | + +----- 1 + OFF adapter does NOT drive SA<17..19> + ON adapter drives SA<17..19> (+) + + + (+) means default setting + + ******************************** diff -u --recursive --new-file v2.1.106/linux/Documentation/nfsroot.txt linux/Documentation/nfsroot.txt --- v2.1.106/linux/Documentation/nfsroot.txt Sun Jun 7 11:16:26 1998 +++ linux/Documentation/nfsroot.txt Wed Jun 24 14:30:07 1998 @@ -1,5 +1,5 @@ Mounting the root filesystem via NFS (nfsroot) -============================================== +=============================================== Written 1996 by Gero Kuhlmann Updated 1997 by Martin Mares @@ -185,12 +185,12 @@ lar to how LILO is doing it. Please refer to the loadlin docu- mentation for further information. -3.4) Using a bootrom +3.4) Using a boot ROM This is probably the most elegant way of booting a diskless - client. With a bootrom the kernel gets loaded using the TFTP - protocol. As far as I know no commercial bootroms already + client. With a boot ROM the kernel gets loaded using the TFTP + protocol. As far as I know, no commercial boot ROMs yet support booting Linux over the network, but there are two - free implementations of a bootrom available on sunsite.unc.edu + free implementations of a boot ROM available on sunsite.unc.edu and its mirrors. They are called 'netboot-nfs' and 'etherboot'. Both contain everything you need to boot a diskless Linux client. diff -u --recursive --new-file v2.1.106/linux/Documentation/ramdisk.txt linux/Documentation/ramdisk.txt --- v2.1.106/linux/Documentation/ramdisk.txt Sat May 2 14:19:52 1998 +++ linux/Documentation/ramdisk.txt Wed Jun 24 14:30:07 1998 @@ -1,4 +1,3 @@ - Using the RAM disk block device with Linux ------------------------------------------ @@ -7,20 +6,20 @@ 1) Overview 2) Kernel Command Line Parameters 3) Using "rdev -r" With New Kernels - 4) An Example of Creating a Compressed ramdisk + 4) An Example of Creating a Compressed RAM Disk 1) Overview ----------- -As of kernel v1.3.48, the ramdisk driver was substantially changed. +As of kernel v1.3.48, the RAM disk driver was substantially changed. The older versions would grab a chunk of memory off the top before handing the remainder to the kernel at boot time. Thus a size parameter had to be specified via "ramdisk=1440" or "rdev -r /dev/fd0 1440" so that the driver knew how much memory to grab. -Now the ramdisk dynamically grows as more space is required. It does +Now the RAM disk dynamically grows as more space is required. It does this by using RAM from the buffer cache. The driver marks the buffers it is using with a new "BH_Protected" flag so that the kernel does not try to reuse them later. This means that the old size parameter @@ -28,9 +27,9 @@ of the "rdev -r" or "ramsize" (usually a symbolic link to "rdev") command has changed. -Also, the new ramdisk supports up to 16 ramdisks out of the box, and can -be reconfigured in rd.c to support up to 255 ramdisks. To use multiple -ramdisk support with your system, run 'mknod /dev/ramX b 1 X' and chmod +Also, the new RAM disk supports up to 16 RAM disks out of the box, and can +be reconfigured in rd.c to support up to 255 RAM disks. To use multiple +RAM disk support with your system, run 'mknod /dev/ramX b 1 X' and chmod (to change its permissions) it to your liking. The default /dev/ram(disk) uses minor #1, so start with ram2 and go from there. @@ -38,14 +37,14 @@ to make it clearer. The original "ramdisk=" has been kept around for compatibility reasons, but it will probably be removed in 2.1.x. -The new ramdisk also has the ability to load compressed ramdisk images, +The new RAM disk also has the ability to load compressed RAM disk images, allowing one to squeeze more programs onto an average installation or rescue floppy disk. Notes: You may have "/dev/ram" or "/dev/ramdisk" or both. They are -equivalent from the standpoint of this document. Also, the new ramdisk +equivalent from the standpoint of this document. Also, the new RAM disk is a config option. When running "make config", make sure you enable -ramdisk support for the kernel you intend to use the ramdisk with. +RAM disk support for the kernel with which you intend to use the RAM disk. 2) Kernel Command Line Parameters @@ -55,42 +54,42 @@ ================= To allow a kernel image to reside on a floppy disk along with a compressed -ramdisk image, the "ramdisk_start=" command was added. The kernel -can't be included into the compressed ramdisk filesystem image, because +RAM disk image, the "ramdisk_start=" command was added. The kernel +can't be included into the compressed RAM disk filesystem image, because it needs to be stored starting at block zero so that the BIOS can load the -bootsector and then the kernel can bootstrap itself to get going. +boot sector and then the kernel can bootstrap itself to get going. -Note: If you are using an uncompressed ramdisk image, then the kernel can -be a part of the filesystem image that is being loaded into the ramdisk, +Note: If you are using an uncompressed RAM disk image, then the kernel can +be a part of the filesystem image that is being loaded into the RAM disk, and the floppy can be booted with LILO, or the two can be separate as is done for the compressed images. -If you are using a two-disk boot/root setup (kernel on #1, ramdisk image -on #2) then the ramdisk would start at block zero, and an offset of +If you are using a two-disk boot/root setup (kernel on #1, RAM disk image +on #2) then the RAM disk would start at block zero, and an offset of zero would be used. Since this is the default value, you would not need to actually use the command at all. -If instead, you have a "zImage" of about 350k, and a "fs_image.gz" of -say about 1MB, and you want them both on the same disk, then you +If instead, you have a "zImage" of about 350 kB, and a "fs_image.gz" of +say about 1 MB, and you want them both on the same disk, then you would use an offset. If you stored the "fs_image.gz" onto the floppy -starting at an offset of 400kB, you would use "ramdisk_start=400". +starting at an offset of 400 kB, you would use "ramdisk_start=400". load_ramdisk=N ============== This parameter tells the kernel whether it is to try to load a -ramdisk image or not. Specifying "load_ramdisk=1" will tell the -kernel to load a floppy into the ramdisk. The default value is -zero, meaning that the kernel should not try to load a ramdisk. +RAM disk image or not. Specifying "load_ramdisk=1" will tell the +kernel to load a floppy into the RAM disk. The default value is +zero, meaning that the kernel should not try to load a RAM disk. prompt_ramdisk=N ================ This parameter tells the kernel whether or not to give you a prompt -asking you to insert the floppy containing the ramdisk image. In -a single floppy configuration the ramdisk image is on the same floppy +asking you to insert the floppy containing the RAM disk image. In +a single floppy configuration the RAM disk image is on the same floppy as the kernel that just finished loading/booting and so a prompt is not needed. In this case one can use "prompt_ramdisk=0". In a two floppy configuration, you will need the chance to switch disks, @@ -100,18 +99,18 @@ ramdisk_size=N ============== -This parameter tells the ramdisk driver to set up ramdisks of Nk size. The -default is 4096 (4MB). +This parameter tells the RAM disk driver to set up RAM disks of N k size. The +default is 4096 (4 MB). 3) Using "rdev -r" With New Kernels ----------------------------------- The usage of the word (two bytes) that "rdev -r" sets in the kernel image -has changed. The low 11 bits (0 -> 10) specify an offset (in 1k blocks) -of up to 2MB (2^11) of where to find the ramdisk (this used to be the -size). Bit 14 indicates that a ramdisk is to be loaded, and bit 15 +has changed. The low 11 bits (0 -> 10) specify an offset (in 1 k blocks) +of up to 2 MB (2^11) of where to find the RAM disk (this used to be the +size). Bit 14 indicates that a RAM disk is to be loaded, and bit 15 indicates whether a prompt/wait sequence is to be given before trying -to read the ramdisk. Since the ramdisk dynamically grows as data is +to read the RAM disk. Since the RAM disk dynamically grows as data is being written into it, a size field is no longer required. Bits 11 to 13 are not currently used and may as well be zero. These numbers are no magical secrets, as seen below: @@ -121,13 +120,13 @@ ./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000 Consider a typical two floppy disk setup, where you will have the -kernel on disk one, and have already put a ramdisk image onto disk #2. +kernel on disk one, and have already put a RAM disk image onto disk #2. -Hence you want to set bits 0 to 13 as zero, meaning that your ramdisk -starts at an offset of zero kB from the beginning of the floppy. +Hence you want to set bits 0 to 13 as 0, meaning that your RAM disk +starts at an offset of 0 kB from the beginning of the floppy. The command line equivalent is: "ramdisk_start=0" -You want bit 14 as one, indicating that a ramdisk is to be loaded. +You want bit 14 as one, indicating that a RAM disk is to be loaded. The command line equivalent is: "load_ramdisk=1" You want bit 15 as one, indicating that you want a prompt/keypress @@ -147,20 +146,20 @@ append = "load_ramdisk=1" -4) An Example of Creating a Compressed ramdisk +4) An Example of Creating a Compressed RAM Disk ---------------------------------------------- -To create a ramdisk image, you will need a spare block device to -construct it on. This can be the ramdisk device itself, or an +To create a RAM disk image, you will need a spare block device to +construct it on. This can be the RAM disk device itself, or an unused disk partition (such as an unmounted swap partition). For this -example, we will use the ramdisk device, "/dev/ram". +example, we will use the RAM disk device, "/dev/ram". -Note: This technique should not be done on a machine with less than 8MB +Note: This technique should not be done on a machine with less than 8 MB of RAM. If using a spare disk partition instead of /dev/ram, then this restriction does not apply. -a) Decide on the ramdisk size that you want. Say 2MB for this example. - Create it by writing to the ramdisk device. (This step is not currently +a) Decide on the RAM disk size that you want. Say 2 MB for this example. + Create it by writing to the RAM disk device. (This step is not currently required, but may be in the future.) It is wise to zero out the area (esp. for disks) so that maximal compression is achieved for the unused blocks of the image that you are about to create. @@ -174,9 +173,9 @@ c) Mount it, copy the files you want to it (eg: /etc/* /dev/* ...) and unmount it again. -d) Compress the contents of the ramdisk. The level of compression +d) Compress the contents of the RAM disk. The level of compression will be approximately 50% of the space used by the files. Unused - space on the ramdisk will compress to almost nothing. + space on the RAM disk will compress to almost nothing. dd if=/dev/ram bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz @@ -184,23 +183,23 @@ dd if=zImage of=/dev/fd0 bs=1k -f) Put the ramdisk image onto the floppy, after the kernel. Use an offset +f) Put the RAM disk image onto the floppy, after the kernel. Use an offset that is slightly larger than the kernel, so that you can put another (possibly larger) kernel onto the same floppy later without overlapping - the ramdisk image. An offset of 400kB for kernels about 350kB in + the RAM disk image. An offset of 400 kB for kernels about 350 kB in size would be reasonable. Make sure offset+size of ram_image.gz is - not larger than the total space on your floppy (usually 1440kB). + not larger than the total space on your floppy (usually 1440 kB). dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400 -g) Use "rdev" to set the boot device, ramdisk offset, prompt flag, etc. +g) Use "rdev" to set the boot device, RAM disk offset, prompt flag, etc. For prompt_ramdisk=1, load_ramdisk=1, ramdisk_start=400, one would have 2^15 + 2^14 + 400 = 49552. rdev /dev/fd0 /dev/fd0 rdev -r /dev/fd0 49552 -That is it. You now have your boot/root compressed ramdisk floppy. Some +That is it. You now have your boot/root compressed RAM disk floppy. Some users may wish to combine steps (d) and (f) by using a pipe. -------------------------------------------------------------------------- diff -u --recursive --new-file v2.1.106/linux/Documentation/smp.tex linux/Documentation/smp.tex --- v2.1.106/linux/Documentation/smp.tex Sun Jun 7 11:16:26 1998 +++ linux/Documentation/smp.tex Wed Jun 24 14:30:07 1998 @@ -52,7 +52,7 @@ locking and protection of its own tables to prevent two processes updating them at once and for example allocating the same memory block. There are two strategies for this within current Unix and Unixlike kernels. -Traditional unix systems from the earliest of days use a scheme of 'Coarse +Traditional Unix systems from the earliest of days use a scheme of 'Coarse Grained Locking' where the entire kernel is protected by a small number of locks only. Some modern systems use fine grained locking. Because fine grained locking has more overhead it is normally used only on diff -u --recursive --new-file v2.1.106/linux/Documentation/spinlocks.txt linux/Documentation/spinlocks.txt --- v2.1.106/linux/Documentation/spinlocks.txt Sat May 2 14:19:52 1998 +++ linux/Documentation/spinlocks.txt Wed Jun 24 14:30:07 1998 @@ -11,7 +11,7 @@ > these routines and go about making use of them? Do they only lock on a > per-processor basis or can they also lock say an interrupt routine from > mucking with a queue if the queue routine was manipulating it when the -> interrupt occured, or should I still use a cli(); based construct on that +> interrupt occurred, or should I still use a cli(); based construct on that > one? See . The basic version is: diff -u --recursive --new-file v2.1.106/linux/Documentation/stallion.txt linux/Documentation/stallion.txt --- v2.1.106/linux/Documentation/stallion.txt Sat May 2 14:19:52 1998 +++ linux/Documentation/stallion.txt Mon Jun 22 23:00:51 1998 @@ -4,8 +4,8 @@ Copyright (C) 1994-1998, Stallion Technologies (support@stallion.com). -Version: 5.4.5 -Date: 23MAR98 +Version: 5.4.6 +Date: 23JUN98 diff -u --recursive --new-file v2.1.106/linux/Documentation/svga.txt linux/Documentation/svga.txt --- v2.1.106/linux/Documentation/svga.txt Sun Jun 7 11:16:26 1998 +++ linux/Documentation/svga.txt Wed Jun 24 14:44:00 1998 @@ -60,7 +60,7 @@ "0 0F00 80x25" means that the first menu item (the menu items are numbered from "0" to "9" and from "a" to "z") is a 80x25 mode with ID=0x0f00 (see the -next section for a description of mode ID's). +next section for a description of mode IDs). encourages you to enter the item number or mode ID you wish to set and press . If the computer complains something about @@ -91,9 +91,9 @@ modes are not listed at all and the modes revealed by `scan' are shown before all VESA modes. -3. Mode ID's -~~~~~~~~~~~~ - Because of the complexity of all the video stuff, the video mode ID's +3. Mode IDs +~~~~~~~~~~~ + Because of the complexity of all the video stuff, the video mode IDs used here are also a bit complex. A video mode ID is a 16-bit number usually expressed in a hexadecimal notation (starting with "0x"). You can set a mode by entering its mode directly if you know it even if it isn't shown on the menu. @@ -233,7 +233,7 @@ 2.2 (01-Feb-96) EGA 80x43 fixed. VESA extended to 0x200-0x4ff (non-standard 02XX VESA modes work now). Display end bug workaround supported. Special modes renumbered to allow adding of the "recalculate" - flag, 0xffff and 0xfffe became aliases instead of real ID's. + flag, 0xffff and 0xfffe became aliases instead of real IDs. Screen contents retained during mode changes. 2.3 (15-Mar-96) Changed to work with 1.3.74 kernel. 2.4 (18-Mar-96) Added patches by Hans Lermen fixing a memory overwrite problem @@ -267,3 +267,4 @@ offered explicitly on the prompt line. - Removed the doc section describing adding of new probing functions as I try to get rid of _all_ hardware probing here. +2.12 (25-May-98)- Added support for VESA frame buffer graphics. diff -u --recursive --new-file v2.1.106/linux/Documentation/sysctl/README linux/Documentation/sysctl/README --- v2.1.106/linux/Documentation/sysctl/README Thu Apr 23 20:21:27 1998 +++ linux/Documentation/sysctl/README Wed Jun 24 14:30:07 1998 @@ -1,4 +1,3 @@ - Documentation for /proc/sys/*/* version 0.1 (c) 1998, Rik van Riel diff -u --recursive --new-file v2.1.106/linux/Documentation/sysctl/kernel.txt linux/Documentation/sysctl/kernel.txt --- v2.1.106/linux/Documentation/sysctl/kernel.txt Sat May 2 14:19:52 1998 +++ linux/Documentation/sysctl/kernel.txt Wed Jun 24 14:30:07 1998 @@ -1,4 +1,3 @@ - Documentation for /proc/sys/kernel/* version 0.1 (c) 1998, Rik van Riel @@ -89,8 +88,8 @@ file-max & file-nr: -The kernel allocates filehandles dynamically, but as yet it -doesn't free them again... +The kernel allocates file handles dynamically, but as yet it +doesn't free them again. The value in file-max denotes the maximum number of file- handles that the Linux kernel will allocate. When you get lots @@ -99,17 +98,17 @@ The three values in file-nr denote the number of allocated file handles, the number of used file handles and the maximum -number of file handles. When the allocated filehandles come +number of file handles. When the allocated file handles come close to the maximum, but the number of actually used ones is -far behind, you've encountered a peak in your filehandle usage -and you don't need to increase the maximum. +far behind, you've encountered a peak in your usage of file +handles and you don't need to increase the maximum. ============================================================== inode-max, inode-nr & inode-state: -As with filehandles, the kernel allocates the inode structures -dynamically, but can't free them yet... +As with file handles, the kernel allocates the inode structures +dynamically, but can't free them yet. The value in inode-max denotes the maximum number of inode handlers. This value should be 3-4 times larger than the value diff -u --recursive --new-file v2.1.106/linux/Documentation/sysctl/vm.txt linux/Documentation/sysctl/vm.txt --- v2.1.106/linux/Documentation/sysctl/vm.txt Thu May 7 22:51:46 1998 +++ linux/Documentation/sysctl/vm.txt Wed Jun 24 14:30:07 1998 @@ -1,4 +1,3 @@ - Documentation for /proc/sys/vm/* version 0.1 (c) 1998, Rik van Riel @@ -99,7 +98,7 @@ as a percentage of total system memory. The values are: -min_percent -- this is the minumum percentage of memory +min_percent -- this is the minimum percentage of memory that should be spent on buffer memory borrow_percent -- when Linux is short on memory, and the buffer cache uses more memory, free pages @@ -138,7 +137,7 @@ kswapd: Kswapd is the kernel swapout daemon. That is, kswapd is that -piece of the kernel that frees memory when it get's fragmented +piece of the kernel that frees memory when it gets fragmented or full. Since every system is different, you'll probably want some control over this piece of the system. @@ -152,7 +151,7 @@ number. Usually this number will be divided by 4 or 8 (see mm/vmscan.c), so it isn't as big as it looks. - When you need to increase the bandwith to/from + When you need to increase the bandwidth to/from swap, you'll want to increase this number. tries_min This is the minimum number of times kswapd tries to free a page each time it is called. @@ -186,9 +185,9 @@ -------------------------------------------------------------- static inline int vm_enough_memory(long pages) { - /* Stupid algorithm to decide if we have enough memory: while - * simple, it hopefully works in most obvious cases.. Easy to - * fool it, but this should catch most mistakes. + /* This stupid algorithm decides whether we have enough memory: + * while simple, it should work in most obvious cases. It's + * easily fooled, but this should catch most mistakes. */ long freepages; @@ -269,7 +268,7 @@ The values of sc_pageout_weight and sc_bufferout_weight are used to control how many tries kswapd will make in order to swapout one page / buffer. These values can be used to -finetune the ratio between user pages and buffer/cache memory. +fine-tune the ratio between user pages and buffer/cache memory. When you find that your Linux system is swapping out too many process pages in order to satisfy buffer memory demands, you might want to either increase sc_bufferout_weight, or decrease diff -u --recursive --new-file v2.1.106/linux/Documentation/sysrq.txt linux/Documentation/sysrq.txt --- v2.1.106/linux/Documentation/sysrq.txt Sun Jun 7 11:16:26 1998 +++ linux/Documentation/sysrq.txt Wed Jun 24 14:30:07 1998 @@ -37,7 +37,7 @@ 's' - Will attempt to sync all mounted filesystems. -'u' - Will attempt to remount all mounted file systems readonly. +'u' - Will attempt to remount all mounted filesystems read-only. 'p' - Will dump the current registers and flags to your console. diff -u --recursive --new-file v2.1.106/linux/Documentation/watchdog.txt linux/Documentation/watchdog.txt --- v2.1.106/linux/Documentation/watchdog.txt Sun Feb 2 05:18:30 1997 +++ linux/Documentation/watchdog.txt Wed Jun 24 14:30:07 1998 @@ -23,7 +23,7 @@ A second temperature monitoring interface is available on the WDT501P cards and some Berkshire cards. This provides /dev/temperature. This is the machine -internal temperature in degrees farenheit. Each read returns a single byte +internal temperature in degrees Fahrenheit. Each read returns a single byte giving the temperature. The third interface logs kernel messages on additional alert events. diff -u --recursive --new-file v2.1.106/linux/Makefile linux/Makefile --- v2.1.106/linux/Makefile Tue Jun 23 10:01:19 1998 +++ linux/Makefile Wed Jun 24 14:44:02 1998 @@ -1,8 +1,8 @@ VERSION = 2 PATCHLEVEL = 1 -SUBLEVEL = 106 +SUBLEVEL = 107 -ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm*/arm/ -e s/sa110/arm/) +ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) # # For SMP kernels, set this. We don't want to have this in the config file @@ -93,7 +93,7 @@ endif # -# if you want the ram-disk device, define this to be the +# if you want the RAM disk device, define this to be the # size in blocks. # @@ -145,6 +145,10 @@ DRIVERS := $(DRIVERS) drivers/pnp/pnp.a endif +ifdef CONFIG_VT +DRIVERS := $(DRIVERS) drivers/video/video.a +endif + ifeq ($(CONFIG_PARIDE),y) DRIVERS := $(DRIVERS) drivers/block/paride/paride.a endif @@ -319,6 +323,8 @@ if [ -f CDROM_MODULES ]; then inst_mod CDROM_MODULES cdrom; fi; \ if [ -f HAM_MODULES ]; then inst_mod HAM_MODULES net; fi; \ if [ -f SOUND_MODULES ]; then inst_mod SOUND_MODULES sound; fi; \ + if [ -f VIDEO_MODULES ]; then inst_mod VIDEO_MODULES video; fi; \ + if [ -f FC4_MODULES ]; then inst_mod FC4_MODULES fc4; fi; \ \ ls *.o > .allmods; \ echo $$MODULES | tr ' ' '\n' | sort | comm -23 .allmods - > .misc; \ diff -u --recursive --new-file v2.1.106/linux/README linux/README --- v2.1.106/linux/README Tue Jun 23 10:01:19 1998 +++ linux/README Wed Jun 24 14:30:07 1998 @@ -1,4 +1,3 @@ - Linux kernel release 2.1.xx These are the release notes for Linux version 2.1. Read them carefully, @@ -126,16 +125,16 @@ CONFIGURING the kernel: - - Do a "make config" to configure the basic kernel. "make config" - needs bash to work: it will search for bash in $BASH, /bin/bash and - /bin/sh (in that order), so hopefully one of those is correct. + - Do a "make config" to configure the basic kernel. "make config" needs + bash to work: it will search for bash in $BASH, /bin/bash and /bin/sh + (in that order), so one of those must be correct for it to work. - (Do not skip this step even if you are only upgrading one minor + Do not skip this step even if you are only upgrading one minor version. New configuration options are added in each release, and odd problems will turn up if the configuration files are not set up as expected. If you want to carry your existing configuration to a new version with minimal work, use "make oldconfig", which will - only ask you for the answers to new questions.) + only ask you for the answers to new questions. - Alternate configuration commands are: "make menuconfig" Text based color menus, radiolists & dialogs. @@ -180,7 +179,7 @@ kernel. - Do a "make zImage" to create a compressed kernel image. If you want - to make a bootdisk (without root filesystem or lilo), insert a floppy + to make a boot disk (without root filesystem or LILO), insert a floppy in your A: drive, and do a "make zdisk". It is also possible to do "make zlilo" if you have lilo installed to suit the kernel makefiles, but you may want to check your particular lilo setup first. diff -u --recursive --new-file v2.1.106/linux/Rules.make linux/Rules.make --- v2.1.106/linux/Rules.make Tue Jun 23 10:01:19 1998 +++ linux/Rules.make Wed Jun 24 14:30:07 1998 @@ -176,10 +176,10 @@ MODINCL = $(TOPDIR)/include/linux/modules # The -w option (enable warnings) for genksyms will return here in 2.1 -# So where has it gone ??? +# So where has it gone? # -# Added the SMP separator to stop module accidents between uniproc/smp -# intel boxes - AC - from bits by Michael Chastain +# Added the SMP separator to stop module accidents between uniprocessor +# and SMP Intel boxes - AC - from bits by Michael Chastain # ifdef SMP diff -u --recursive --new-file v2.1.106/linux/arch/alpha/config.in linux/arch/alpha/config.in --- v2.1.106/linux/arch/alpha/config.in Fri May 8 23:14:41 1998 +++ linux/arch/alpha/config.in Wed Jun 24 14:44:00 1998 @@ -202,6 +202,12 @@ fi endmenu +bool 'Support for frame buffer devices' CONFIG_FB +if [ "$CONFIG_FB" = "y" ]; then + define_bool CONFIG_PCI_CONSOLE y +fi +source drivers/video/Config.in + source drivers/pnp/Config.in source drivers/block/Config.in diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/apecs.c linux/arch/alpha/kernel/apecs.c --- v2.1.106/linux/arch/alpha/kernel/apecs.c Fri Apr 10 13:03:48 1998 +++ linux/arch/alpha/kernel/apecs.c Wed Jun 24 14:30:07 1998 @@ -82,7 +82,7 @@ * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/bios32.c linux/arch/alpha/kernel/bios32.c --- v2.1.106/linux/arch/alpha/kernel/bios32.c Sun Jun 7 11:16:26 1998 +++ linux/arch/alpha/kernel/bios32.c Wed Jun 24 14:44:00 1998 @@ -1090,7 +1090,7 @@ * 6 PCI on board slot 0 * 7 PCI on board slot 1 * 8 Intel SIO PCI-ISA bridge chip - * 9 Tulip - DECchip 21040 ethernet controller + * 9 Tulip - DECchip 21040 Ethernet controller * * * This two layered interrupt approach means that we allocate IRQ 16 and @@ -1946,10 +1946,6 @@ } -#ifdef CONFIG_TGA_CONSOLE -extern void tga_console_init(void); -#endif /* CONFIG_TGA_CONSOLE */ - void __init pcibios_fixup(void) { @@ -2022,12 +2018,6 @@ /* no fixup needed */ #else # error "You must tell me what kind of platform you want." -#endif - -#ifndef CONFIG_ABSTRACT_CONSOLE -#ifdef CONFIG_TGA_CONSOLE - tga_console_init(); -#endif #endif } diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/cia.c linux/arch/alpha/kernel/cia.c --- v2.1.106/linux/arch/alpha/kernel/cia.c Sun Jun 7 11:16:26 1998 +++ linux/arch/alpha/kernel/cia.c Wed Jun 24 14:30:08 1998 @@ -104,7 +104,7 @@ * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c --- v2.1.106/linux/arch/alpha/kernel/irq.c Wed Apr 1 20:11:47 1998 +++ linux/arch/alpha/kernel/irq.c Wed Jun 24 14:30:08 1998 @@ -827,7 +827,7 @@ cpu, previous_irqholder, globl_locked, globl_icount, local_count); #ifdef VERBOSE_IRQLOCK_DEBUGGING - printk("Performing backtrace on all cpus," + printk("Performing backtrace on all CPUs," " write this down!\n"); smp_show_backtrace_all_cpus(); #endif diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/lca.c linux/arch/alpha/kernel/lca.c --- v2.1.106/linux/arch/alpha/kernel/lca.c Sun Jun 7 11:16:26 1998 +++ linux/arch/alpha/kernel/lca.c Wed Jun 24 14:30:08 1998 @@ -84,7 +84,7 @@ * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/mcpcia.c linux/arch/alpha/kernel/mcpcia.c --- v2.1.106/linux/arch/alpha/kernel/mcpcia.c Wed Apr 8 19:36:24 1998 +++ linux/arch/alpha/kernel/mcpcia.c Wed Jun 24 14:30:08 1998 @@ -120,7 +120,7 @@ * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/osf_sys.c linux/arch/alpha/kernel/osf_sys.c --- v2.1.106/linux/arch/alpha/kernel/osf_sys.c Tue Jun 23 10:01:19 1998 +++ linux/arch/alpha/kernel/osf_sys.c Wed Jun 24 14:30:08 1998 @@ -366,8 +366,8 @@ int flags; uid_t exroot; /* - * this has lots more here, which linux handles with the option block - * but I'm too lazy to do the translation into ascii.. + * This has lots more here, which Linux handles with the option block + * but I'm too lazy to do the translation into ASCII. */ }; @@ -435,8 +435,8 @@ /* * We can't actually handle ufs yet, so we translate UFS mounts to - * ext2fs mounts... I wouldn't mind a UFS filesystem, but the UFS - * layout is so braindead it's a major headache doing it.. + * ext2fs mounts. I wouldn't mind a UFS filesystem, but the UFS + * layout is so braindead it's a major headache doing it. */ static int osf_ufs_mount(char *dirname, struct ufs_args *args, int flags) { @@ -845,7 +845,7 @@ lock_kernel(); offset = command-1; if (offset >= sizeof(sysinfo_table)/sizeof(char *)) { - /* Digital unix has a few unpublished interfaces here */ + /* Digital UNIX has a few unpublished interfaces here */ printk("sysinfo(%d)", command); goto out; } diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/process.c linux/arch/alpha/kernel/process.c --- v2.1.106/linux/arch/alpha/kernel/process.c Tue Jun 23 10:01:19 1998 +++ linux/arch/alpha/kernel/process.c Wed Jun 24 14:30:08 1998 @@ -5,7 +5,7 @@ */ /* - * This file handles the architecture-dependent parts of process handling.. + * This file handles the architecture-dependent parts of process handling. */ #include @@ -255,7 +255,7 @@ void flush_thread(void) { /* Arrange for each exec'ed process to start off with a - clean slate wrt the fpu. */ + clean slate with respect to the FPU. */ current->tss.flags &= ~IEEE_SW_MASK; wrfpcr(FPCR_DYN_NORMAL); } diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/pyxis.c linux/arch/alpha/kernel/pyxis.c --- v2.1.106/linux/arch/alpha/kernel/pyxis.c Mon Apr 6 17:40:59 1998 +++ linux/arch/alpha/kernel/pyxis.c Wed Jun 24 14:30:08 1998 @@ -89,7 +89,7 @@ * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/setup.c linux/arch/alpha/kernel/setup.c --- v2.1.106/linux/arch/alpha/kernel/setup.c Wed Apr 8 19:36:24 1998 +++ linux/arch/alpha/kernel/setup.c Wed Jun 24 14:44:00 1998 @@ -23,6 +23,7 @@ #include /* CONFIG_ALPHA_LCA etc */ #include #include +#include #ifdef CONFIG_RTC #include @@ -221,20 +222,29 @@ #ifdef __SMP__ setup_smp(); #endif + +#ifdef CONFIG_VGA_CONSOLE + conswitchp = &vga_con; +#endif +#ifdef CONFIG_FB + /* Frame buffer device based console */ + conswitchp = &fb_con; +#endif } #define N(a) (sizeof(a)/sizeof(a[0])) /* A change was made to the HWRPB via an ECO and the following code tracks - * a part of the ECO. The HWRPB version must be 5 or higher or the ECO - * was not implemented in the console firmware. If its at rev 5 or greater - * we can get the platform ascii string name from the HWRPB. Thats what this - * function does. It checks the rev level and if the string is in the HWRPB - * it returns the addtess of the string ... a pointer to the platform name. + * a part of the ECO. In HWRPB versions less than 5, the ECO was not + * implemented in the console firmware. If it's revision 5 or greater we can + * get the name of the platform as an ASCII string from the HWRPB. That's what + * this function does. It checks the revision level and if the string is in + * the HWRPB it returns the address of the string--a pointer to the name of the + * platform. * * Returns: - * - Pointer to a ascii string if its in the HWRPB + * - Pointer to a ASCII string if it's in the HWRPB * - Pointer to a blank string if the data is not in the HWRPB. */ static char * @@ -378,11 +388,11 @@ &systype_name, &sysvariation_name); return sprintf(buffer, - "cpu\t\t\t: Alpha\n" - "cpu model\t\t: %s\n" - "cpu variation\t\t: %ld\n" - "cpu revision\t\t: %ld\n" - "cpu serial number\t: %s\n" + "CPU\t\t\t: Alpha\n" + "CPU model\t\t: %s\n" + "CPU variation\t\t: %ld\n" + "CPU revision\t\t: %ld\n" + "CPU serial number\t: %s\n" "system type\t\t: %s\n" "system variation\t: %s\n" "system revision\t\t: %ld\n" diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/smc37c669.c linux/arch/alpha/kernel/smc37c669.c --- v2.1.106/linux/arch/alpha/kernel/smc37c669.c Wed Apr 8 19:36:24 1998 +++ linux/arch/alpha/kernel/smc37c669.c Wed Jun 24 14:30:08 1998 @@ -1131,7 +1131,7 @@ 0, /* is a flash update driver */ 0, /* is a block device */ 0, /* not seekable */ - 0, /* is an ethernet device */ + 0, /* is an Ethernet device */ 0, /* is a filesystem driver */ }; #endif diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c --- v2.1.106/linux/arch/alpha/kernel/smp.c Sun Jun 7 11:16:26 1998 +++ linux/arch/alpha/kernel/smp.c Wed Jun 24 14:30:08 1998 @@ -397,9 +397,8 @@ return -EINVAL; } -/* Only broken Intel needs this, thus it should not even be referenced - * globally... - */ +/* Only broken Intel needs this, thus it should not even be referenced globally. +*/ __initfunc(void initialize_secondary(void)) { printk("initialize_secondary: entry\n"); @@ -673,7 +672,7 @@ static int unknown_ipi(unsigned int this_cpu) { - printk("unknown_ipi() on cpu %d: ", this_cpu); + printk("unknown_ipi() on CPU %d: ", this_cpu); return 1; } @@ -762,7 +761,7 @@ send_ipi_message(CPU_STOP, cpu_present_map ^ (1 << me)); return; barf: - printk("Yeeee, trying to send SMP msg(%d) on cpu %d\n", msg, me); + printk("Yeeee, trying to send SMP msg(%d) on CPU %d\n", msg, me); panic("Bogon SMP message pass."); } diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/t2.c linux/arch/alpha/kernel/t2.c --- v2.1.106/linux/arch/alpha/kernel/t2.c Sun Jun 7 11:16:26 1998 +++ linux/arch/alpha/kernel/t2.c Wed Jun 24 14:30:08 1998 @@ -103,7 +103,7 @@ * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two @@ -520,7 +520,7 @@ sable_cpu_regs[cpu]->sic &= ~SIC_SEIC; /* - * clear cpu errors + * clear CPU errors */ sable_cpu_regs[cpu]->bcce |= sable_cpu_regs[cpu]->bcce; sable_cpu_regs[cpu]->cbe |= sable_cpu_regs[cpu]->cbe; diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/time.c linux/arch/alpha/kernel/time.c --- v2.1.106/linux/arch/alpha/kernel/time.c Wed Apr 1 20:11:47 1998 +++ linux/arch/alpha/kernel/time.c Wed Jun 24 14:30:08 1998 @@ -57,7 +57,7 @@ __u32 last_time; /* ticks/cycle * 2^48 */ unsigned long scaled_ticks_per_cycle; - /* last time the cmos clock got updated */ + /* last time the CMOS clock got updated */ time_t last_rtc_update; } state; diff -u --recursive --new-file v2.1.106/linux/arch/alpha/kernel/tsunami.c linux/arch/alpha/kernel/tsunami.c --- v2.1.106/linux/arch/alpha/kernel/tsunami.c Mon Apr 6 17:40:59 1998 +++ linux/arch/alpha/kernel/tsunami.c Wed Jun 24 14:30:08 1998 @@ -1,7 +1,7 @@ /* * Code common to all TSUNAMI chips. * - * Based on code written by David A Rusling (david.rusling@reo.mts.dec.com). + * Based on code written by David A. Rusling (david.rusling@reo.mts.dec.com). * */ #include @@ -18,7 +18,7 @@ /* * NOTE: Herein lie back-to-back mb instructions. They are magic. - * One plausible explanation is that the i/o controller does not properly + * One plausible explanation is that the I/O controller does not properly * handle the system transaction. Another involves timing. Ho hum. */ @@ -84,7 +84,7 @@ * * Notes: * The function number selects which function of a multi-function device - * (e.g., scsi and ethernet). + * (e.g., SCSI and Ethernet). * * The register selects a DWORD (32 bit) register offset. Hence it * doesn't get shifted by 2 bits as we want to "drop" the bottom two diff -u --recursive --new-file v2.1.106/linux/arch/alpha/lib/strlen_user.S linux/arch/alpha/lib/strlen_user.S --- v2.1.106/linux/arch/alpha/lib/strlen_user.S Fri Jan 3 08:48:37 1997 +++ linux/arch/alpha/lib/strlen_user.S Wed Jun 24 14:30:08 1998 @@ -2,7 +2,7 @@ * arch/alpha/lib/strlen_user.S * * Return the length of the string including the NUL terminator - * (strlen+1) or zero if an error occured. + * (strlen+1) or zero if an error occurred. */ #include diff -u --recursive --new-file v2.1.106/linux/arch/alpha/mm/fault.c linux/arch/alpha/mm/fault.c --- v2.1.106/linux/arch/alpha/mm/fault.c Tue Jun 23 10:01:19 1998 +++ linux/arch/alpha/mm/fault.c Wed Jun 24 14:30:08 1998 @@ -111,7 +111,7 @@ unsigned fixup; /* As of EV6, a load into $31/$f31 is a prefetch, and never faults - (or is suppressed by the PALcode). Support that for older cpu's + (or is suppressed by the PALcode). Support that for older CPUs by ignoring such an instruction. */ if (cause == 0) { unsigned int insn; diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/bootsect.S linux/arch/i386/boot/bootsect.S --- v2.1.106/linux/arch/i386/boot/bootsect.S Mon Feb 23 18:12:02 1998 +++ linux/arch/i386/boot/bootsect.S Wed Jun 24 14:30:08 1998 @@ -413,7 +413,7 @@ rol dx, #4 ! rotate so that lowest 4 bits are used mov ax, #0xe0f ! ah = request, al = mask for nybble and al, dl - add al, #0x90 ! convert al to ascii hex (four instructions) + add al, #0x90 ! convert al to ASCII hex (four instructions) daa adc al, #0x40 daa diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/compressed/misc.c linux/arch/i386/boot/compressed/misc.c --- v2.1.106/linux/arch/i386/boot/compressed/misc.c Sun Dec 21 17:27:17 1997 +++ linux/arch/i386/boot/compressed/misc.c Wed Jun 24 14:30:08 1998 @@ -38,7 +38,7 @@ static unsigned outcnt = 0; /* bytes in output buffer */ /* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/setup.S linux/arch/i386/boot/setup.S --- v2.1.106/linux/arch/i386/boot/setup.S Tue Jun 23 10:01:19 1998 +++ linux/arch/i386/boot/setup.S Wed Jun 24 14:30:08 1998 @@ -145,7 +145,7 @@ jne bad_sig jmp good_sig1 -! Routine to print asciiz-string at DS:SI +! Routine to print ASCII string at DS:SI prtstr: lodsb and al,al @@ -159,7 +159,7 @@ prtsp2: call prtspc ! Print double space prtspc: mov al,#0x20 ! Print single space (fall-thru!) -! Part of above routine, this one just prints ascii al +! Part of above routine, this one just prints ASCII al prtchr: push ax push cx @@ -226,12 +226,12 @@ ! check if an old loader tries to load a big-kernel seg cs - test byte ptr loadflags,#LOADED_HIGH ! have we a big kernel ? + test byte ptr loadflags,#LOADED_HIGH ! Have we a big kernel? jz loader_ok ! NO, no danger even for old loaders ! YES, we have a big-kernel seg cs - cmp byte ptr type_of_loader,#0 ! have we one of the new loaders ? - jnz loader_ok ! YES, ok + cmp byte ptr type_of_loader,#0 ! Have we one of the new loaders? + jnz loader_ok ! YES, OK ! NO, we have an old loader, must give up push cs pop ds @@ -239,7 +239,7 @@ call prtstr jmp no_sig_loop loader_panic_mess: - .ascii "Wrong loader, giving up..." + .ascii "Wrong loader: giving up." db 0 loader_ok: @@ -255,8 +255,8 @@ int 0x15 jc oldstylemem -! memory size is in 1k chunksizes, to avoid confusing loadlin. -! we store the 0xe801 memory size in a completely different place, +! Memory size is in 1 k chunksizes, to avoid confusing loadlin. +! We store the 0xe801 memory size in a completely different place, ! because it will most likely be longer than 16 bits. ! (use 1e0 because that's what Larry Augustine uses in his ! alternative new memory detection scheme, and it's sensible @@ -270,7 +270,7 @@ add [0x1e0],eax ! and add lower memory into total size. ! and fall into the old memory detection code to populate the - ! compatability slot. + ! compatibility slot. oldstylemem: pop ebx @@ -290,7 +290,7 @@ ! Check for video adapter and its parameters and allow the ! user to browse video modes. - call video ! NOTE: we need DS pointing to bootsector + call video ! NOTE: we need DS pointing to boot sector ! Get hd0 data @@ -380,7 +380,7 @@ #ifdef CONFIG_APM ! check for APM BIOS - ! NOTE: DS is pointing to the bootsector + ! NOTE: DS is pointing to the boot sector ! mov [64],#0 ! version == 0 means no APM BIOS @@ -479,7 +479,7 @@ mov ds,ax ! If we have our code not at 0x90000, we need to move it there now. -! We also then need to move the params behind it (commandline) +! We also then need to move the parameters behind it (command line) ! Because we would overwrite the code on the current IP, we move ! it in two steps, jumping high after the first one. mov ax,cs @@ -532,21 +532,26 @@ call empty_8042 ! wait until a20 really *is* enabled; it can take a fair amount of -! time on any - +! time on certain systems; Toshiba Tecras are known to have this +! problem. The memory location used here is the int 0x1f vector, +! which should be safe to use; any *unused* memory location < 0xfff0 +! should work here. + +#define TEST_ADDR 0x7c + push ds - push es xor ax,ax ! segment 0x0000 mov ds,ax dec ax ! segment 0xffff (HMA) - mov es,ax + mov gs,ax + mov bx,[TEST_ADDR] ! we want to restore the value later a20_wait: inc ax - mov [0x7c00],ax ! any unused memory location < 64K - seg es - cmp ax,[0x7c10] ! corresponding HMA address + mov [TEST_ADDR],ax + seg gs + cmp ax,[TEST_ADDR+0x10] je a20_wait ! loop until no longer aliased - pop es + mov [TEST_ADDR],bx ! restore original value pop ds ! make sure any possible coprocessor is properly reset.. @@ -595,12 +600,12 @@ ! Well, that certainly wasn't fun :-(. Hopefully it works, and we don't ! need no steenking BIOS anyway (except for the initial loading :-). -! The BIOS-routine wants lots of unnecessary data, and it's less +! The BIOS routine wants lots of unnecessary data, and it's less ! "interesting" anyway. This is how REAL programmers do it. ! ! Well, now's the time to actually move into protected mode. To make ! things as simple as possible, we do no register set-up or anything, -! we let the gnu-compiled 32-bit programs do that. We just jump to +! we let the GNU-compiled 32-bit programs do that. We just jump to ! absolute address 0x1000 (or the loader supplied one), ! in 32-bit protected mode. ! @@ -720,7 +725,7 @@ bootsect_panic_loop: jmp bootsect_panic_loop bootsect_panic_mess: - .ascii "INT15 refuses to access high mem, giving up..." + .ascii "INT15 refuses to access high memory. Giving up." db 0 ! This routine checks that the keyboard command queue is empty @@ -742,7 +747,7 @@ ret ! -! Read the cmos clock. Return the seconds in al +! Read the CMOS clock. Return the seconds in al ! gettime: push cx diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/tools/build.c linux/arch/i386/boot/tools/build.c --- v2.1.106/linux/arch/i386/boot/tools/build.c Wed May 20 19:10:37 1998 +++ linux/arch/i386/boot/tools/build.c Wed Jun 24 14:30:08 1998 @@ -187,7 +187,7 @@ } close(fd); - if (lseek(1, 497, SEEK_SET) != 497) /* Write sizes to the bootsector */ + if (lseek(1, 497, SEEK_SET) != 497) /* Write sizes to the boot sector */ die("Output: seek failed"); buf[0] = setup_sectors; if (write(1, buf, 1) != 1) diff -u --recursive --new-file v2.1.106/linux/arch/i386/boot/video.S linux/arch/i386/boot/video.S --- v2.1.106/linux/arch/i386/boot/video.S Mon Feb 23 18:12:02 1998 +++ linux/arch/i386/boot/video.S Wed Jun 24 14:44:00 1998 @@ -1,7 +1,7 @@ ! -! Display adapter & video mode setup, version 2.11 (03-May-97) +! Display adapter & video mode setup, version 2.12 (25-May-98) ! -! Copyright (C) 1995 -- 1997 Martin Mares +! Copyright (C) 1995 -- 1998 Martin Mares ! Based on the original setup.S code (C) Linus Torvalds and Mats Anderson ! @@ -68,14 +68,23 @@ #define VIDEO_RECALC 0x8000 ! Positions of various video parameters passed to the kernel -#define PARAM_CURSOR_POS 0 -#define PARAM_VIDEO_PAGE 4 -#define PARAM_VIDEO_MODE 6 -#define PARAM_VIDEO_COLS 7 -#define PARAM_VIDEO_EGA_BX 10 -#define PARAM_VIDEO_LINES 14 -#define PARAM_HAVE_VGA 15 -#define PARAM_FONT_POINTS 16 +! (see also include/linux/tty.h) +#define PARAM_CURSOR_POS 0x00 +#define PARAM_VIDEO_PAGE 0x04 +#define PARAM_VIDEO_MODE 0x06 +#define PARAM_VIDEO_COLS 0x07 +#define PARAM_VIDEO_EGA_BX 0x0a +#define PARAM_VIDEO_LINES 0x0e +#define PARAM_HAVE_VGA 0x0f +#define PARAM_FONT_POINTS 0x10 + +#define PARAM_LFB_WIDTH 0x12 +#define PARAM_LFB_HEIGHT 0x14 +#define PARAM_LFB_DEPTH 0x16 +#define PARAM_LFB_BASE 0x18 +#define PARAM_LFB_SIZE 0x1c +#define PARAM_LFB_LINELENGTH 0x24 +#define PARAM_LFB_COLORS 0x26 ! Define DO_STORE according to CONFIG_VIDEO_RETAIN #ifdef CONFIG_VIDEO_RETAIN @@ -88,7 +97,7 @@ ! This is the main entry point called by setup.S ! ! Input: -! DS pointing to the bootsector +! DS pointing to the boot sector video: push ds ! We use different segments push ds ! FS contains original DS @@ -155,6 +164,11 @@ ! mode_params: +#ifdef CONFIG_VIDEO_SELECT + cmpb [graphic_mode],#0 + jnz mopar_gr +#endif + mov ah,#0x03 ! Read cursor position xor bh,bh int 0x10 @@ -197,6 +211,50 @@ #ifdef CONFIG_VIDEO_SELECT ! +! Fetching of VESA frame buffer parameters +! + +mopar_gr: + lea di,modelist+1024 + seg fs + movb [PARAM_HAVE_VGA],#0x23 + + mov ax,(di+16) + seg fs + mov [PARAM_LFB_LINELENGTH],ax + + mov ax,(di+18) + seg fs + mov [PARAM_LFB_WIDTH],ax + + mov ax,(di+20) + seg fs + mov [PARAM_LFB_HEIGHT],ax + + mov al,(di+25) + mov ah,#0 + seg fs + mov [PARAM_LFB_DEPTH],ax + + mov eax,(di+40) + seg fs + mov [PARAM_LFB_BASE],eax + + mov eax,(di+44) + seg fs + mov [PARAM_LFB_SIZE],eax + + mov eax,(di+31) + seg fs + mov [PARAM_LFB_COLORS],eax + + mov eax,(di+35) + seg fs + mov [PARAM_LFB_COLORS+4],eax + + ret + +! ! The video mode menu ! @@ -355,7 +413,8 @@ stc ret -_setrec: br setrec ! Ugly... +_setrec: br setrec ! Ugly... +_set_80x25: br set_80x25 ! ! Aliases for backward compatibility. @@ -369,7 +428,7 @@ inc bx jnz setbad - ! Fall-thru ! + ! Fall-through! ! ! Setting of user mode (AX=mode ID) => CF=success @@ -388,7 +447,7 @@ cmp ah,#VIDEO_FIRST_V7>>8 jz setv7 cmp ah,#VIDEO_FIRST_VESA>>8 - jnc setvesa + jnc check_vesa or ah,ah jz setmenu dec ah @@ -427,7 +486,7 @@ setmenu: or al,al ! 80x25 is an exception - jz set_80x25 + jz _set_80x25 push bx ! Set mode chosen from menu call mode_table ! Build the mode table pop ax @@ -452,6 +511,41 @@ mov ax,(si-4) ! Fetch mode ID jmp _m_s + +check_vesa: + lea di,modelist+1024 + sub bh,#VIDEO_FIRST_VESA>>8 + mov cx,bx ! Get mode information structure + mov ax,#0x4f01 + int 0x10 + add bh,#VIDEO_FIRST_VESA>>8 + cmp ax,#0x004f + jnz setbad + + mov al,(di) ! Check capabilities. + and al,#0x19 + cmp al,#0x09 + jz setvesa ! this is a text mode + + mov al,(di) ! Check capabilities. + and al,#0x99 + cmp al,#0x99 + jnz _setbad ! to bad, no linear frame buffer + + sub bh,#VIDEO_FIRST_VESA>>8 + or bx,#0x4000 ! want use linear frame buffer + mov ax,#0x4f02 ! VESA BIOS mode set call + int 0x10 + cmp ax,#0x004f ! AL=4f if implemented, AH=0 if OK + jnz _setbad + + movb [graphic_mode],#1 ! flag graphic mode + movb [do_restore],#0 ! no screen restore + stc + ret + +_setbad: br setbad ! Ugly... + ! ! Recalculate vertical display end registers -- this fixes various ! inconsistencies of extended modes on many adapters. Called when @@ -525,9 +619,9 @@ jz set80 seg gs ! This is EGA+ -- beware of 80x50 etc. mov al,[0x0484] - or al,al ! Some buggy BIOS'es set 0 rows + or al,al ! Some buggy BIOSs set 0 rows jz set80 - cmp al,#24 ! It's hopefully correct + cmp al,#24 ! Let's hope this is correct jz set80 #endif /* CONFIG_VIDEO_400_HACK */ force3: DO_STORE @@ -929,7 +1023,7 @@ jz vesar cmp ax,#0x0080 ! Check validity of mode ID jc vesa2 - or ah,ah ! Valid ID's are 0x0000-0x007f and 0x0100-0x07ff + or ah,ah ! Valid IDs are 0x0000-0x007f and 0x0100-0x07ff jz vesan ! [Certain BIOSes erroneously report 0x80-0xff] cmp ax,#0x0800 jnc vesae @@ -1393,7 +1487,7 @@ cmp al,#0x01 jne c2fail mov al,#0xaa - call inidx ! 4X, 5X, 7X and 8X are valid 64XX chip ID's + call inidx ! 4X, 5X, 7X and 8X are valid 64XX chip IDs shr al,#4 sub al,#4 jz c6done @@ -1577,7 +1671,7 @@ tseng_test: mov dx,#0x3cd - in al,dx ! Could things be this simple ! :-) + in al,dx ! Could things be this simple? :-) mov bl,al mov al,#0x55 out dx,al @@ -1798,6 +1892,7 @@ scanning: .byte 0 ! Performing mode scan do_restore: .byte 0 ! Screen contents altered during mode change svga_prefix: .byte VIDEO_FIRST_BIOS>>8 ! Default prefix for BIOS modes +graphic_mode: .byte 0 ! Graphic mode with a linear frame buffer ! ! Messages: diff -u --recursive --new-file v2.1.106/linux/arch/i386/config.in linux/arch/i386/config.in --- v2.1.106/linux/arch/i386/config.in Sat May 2 14:19:52 1998 +++ linux/arch/i386/config.in Wed Jun 24 14:50:44 1998 @@ -66,6 +66,10 @@ fi fi +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + bool 'Support for frame buffer devices (EXPERIMENTAL)' CONFIG_FB +fi + endmenu source drivers/pnp/Config.in @@ -121,6 +125,10 @@ source fs/nls/Config.in +define_bool CONFIG_VGA_CONSOLE y + +source drivers/video/Config.in + source drivers/char/Config.in mainmenu_option next_comment @@ -143,4 +151,3 @@ bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ endmenu -define_bool CONFIG_VGA_CONSOLE y diff -u --recursive --new-file v2.1.106/linux/arch/i386/defconfig linux/arch/i386/defconfig --- v2.1.106/linux/arch/i386/defconfig Tue Jun 9 11:57:28 1998 +++ linux/arch/i386/defconfig Wed Jun 24 14:51:06 1998 @@ -245,6 +245,7 @@ # CONFIG_UFS_FS is not set # CONFIG_MAC_PARTITION is not set # CONFIG_NLS is not set +CONFIG_VGA_CONSOLE=y # # Character devices @@ -288,4 +289,3 @@ CONFIG_PROFILE=y CONFIG_PROFILE_SHIFT=2 # CONFIG_MAGIC_SYSRQ is not set -CONFIG_VGA_CONSOLE=y diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/io_apic.c linux/arch/i386/kernel/io_apic.c --- v2.1.106/linux/arch/i386/kernel/io_apic.c Tue Jun 9 11:57:28 1998 +++ linux/arch/i386/kernel/io_apic.c Wed Jun 24 14:30:08 1998 @@ -1,5 +1,5 @@ /* - * Intel IO-APIC support for multi-pentium hosts. + * Intel IO-APIC support for multi-Pentium hosts. * * Copyright (C) 1997, 1998 Ingo Molnar, Hajnalka Szabo * @@ -129,7 +129,7 @@ } /* - * Syncronize the IO-APIC and the CPU by doing + * Synchronize the IO-APIC and the CPU by doing * a dummy read from the IO-APIC */ static inline void io_apic_sync(void) @@ -206,7 +206,7 @@ /* - * support for broken MP BIOSes, enables hand-redirection of PIRQ0-7 to + * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to * specific CPU-side IRQs. */ @@ -243,7 +243,7 @@ } /* - * Find the irq entry nr of a certain pin. + * Find the IRQ entry number of a certain pin. */ __initfunc(static int find_irq_entry(int pin, int type)) { @@ -520,7 +520,7 @@ return (irq_trigger(idx)); } /* - * nonexistant IRQs are edge default + * nonexistent IRQs are edge default */ return 0; } @@ -634,16 +634,16 @@ struct IO_APIC_reg_01 reg_01; struct IO_APIC_reg_02 reg_02; - printk("nr of MP irq sources: %d.\n", mp_irq_entries); - printk("nr of IO-APIC registers: %d.\n", nr_ioapic_registers); + printk("number of MP IRQ sources: %d.\n", mp_irq_entries); + printk("number of IO-APIC registers: %d.\n", nr_ioapic_registers); *(int *)®_00 = io_apic_read(0); *(int *)®_01 = io_apic_read(1); *(int *)®_02 = io_apic_read(2); /* - * We are a bit conservative about what we expect, we have to - * know about every HW change ASAP ... + * We are a bit conservative about what we expect. We have to + * know about every hardware change ASAP. */ printk("testing the IO APIC.......................\n"); @@ -723,7 +723,7 @@ for (i=0; ievents = 1; /* - * If the irq is disabled for whatever reason, we cannot - * use the action we have.. + * If the IRQ is disabled for whatever reason, we cannot + * use the action we have. */ action = NULL; if (!(desc->status & (IRQ_DISABLED | IRQ_INPROGRESS))) { @@ -1002,7 +1002,7 @@ /* * Edge triggered interrupts need to remember - * pending events.. + * pending events. */ for (;;) { int pending; @@ -1042,8 +1042,8 @@ desc->ipi = 0; /* - * If the irq is disabled for whatever reason, we must - * not enter the irq action. + * If the IRQ is disabled for whatever reason, we must + * not enter the IRQ action. */ action = NULL; if (!(desc->status & (IRQ_DISABLED | IRQ_INPROGRESS))) { @@ -1073,7 +1073,7 @@ /* * Level and edge triggered IO-APIC interrupts need different handling, - * so we use two separate irq descriptors. edge triggered IRQs can be + * so we use two separate IRQ descriptors. Edge triggered IRQs can be * handled with the level-triggered descriptor, but that one has slightly * more overhead. Level-triggered interrupts cannot be handled with the * edge-triggered handler, without risking IRQ storms and other ugly @@ -1103,10 +1103,10 @@ * As the interrupt level is determined by taking the * vector number and shifting that right by 4, we * want to spread these out a bit so that they don't - * all fall in the same interrupt level + * all fall in the same interrupt level. * - * also, we've got to be careful not to trash gate - * 0x80, because int 0x80 is hm, kindof importantish ;) + * Also, we've got to be careful not to trash gate + * 0x80, because int 0x80 is hm, kind of importantish. ;) */ for (i = 0; i < NR_IRQS ; i++) { if ((IO_APIC_VECTOR(i) <= 0xfe) /* HACK */ && @@ -1128,9 +1128,9 @@ /* * This code may look a bit paranoid, but it's supposed to cooperate with - * a wide range of boards and BIOS bugs ... fortunately only the timer IRQ - * is so screwy. Thanks to Brian Perkins for testing/hacking this beast - * fanatically on his truly bugged board. + * a wide range of boards and BIOS bugs. Fortunately only the timer IRQ + * is so screwy. Thanks to Brian Perkins for testing/hacking this beast + * fanatically on his truly buggy board. */ __initfunc(static void check_timer (void)) { @@ -1142,7 +1142,7 @@ if (!timer_irq_works ()) { if (pin1 != -1) printk("..MP-BIOS bug: 8254 timer not connected to IO-APIC\n"); - printk("..trying to set up timer as ExtINT ... "); + printk("...trying to set up timer as ExtINT... "); if (pin2 != -1) { printk(".. (found pin %d) ...", pin2); @@ -1152,7 +1152,7 @@ if (!timer_irq_works ()) { printk(" failed.\n"); - printk("..trying to set up timer as BP irq ..."); + printk("...trying to set up timer as BP IRQ..."); /* * Just in case ... */ @@ -1165,7 +1165,7 @@ if (!timer_irq_works ()) { printk(" failed.\n"); - panic("IO-APIC + timer doesnt work!"); + panic("IO-APIC + timer doesn't work!"); } } printk(" works.\n"); @@ -1201,7 +1201,7 @@ } /* - * If there are no explicit mp irq entries: it's either one of the + * If there are no explicit MP IRQ entries, it's either one of the * default configuration types or we are broken. In both cases it's * fine to set up most of the low 16 IO-APIC pins to ISA defaults. */ @@ -1213,7 +1213,7 @@ init_IO_APIC_traps(); /* - * Set up the IO-APIC irq routing table by parsing the MP-BIOS + * Set up the IO-APIC IRQ routing table by parsing the MP-BIOS * mptable: */ setup_IO_APIC_irqs (); diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/irq.c linux/arch/i386/kernel/irq.c --- v2.1.106/linux/arch/i386/kernel/irq.c Sun Jun 7 11:16:27 1998 +++ linux/arch/i386/kernel/irq.c Wed Jun 24 14:30:08 1998 @@ -11,7 +11,7 @@ */ /* - * IRQ's are in fact implemented a bit like signal handlers for the kernel. + * IRQs are in fact implemented a bit like signal handlers for the kernel. * Naturally it's not a 1:1 relation, but there are similarities. */ @@ -385,7 +385,7 @@ * Such 'high frequency update' races can be avoided by careful design, but * some of our major constructs like spinlocks use similar techniques, * it would be nice to clarify this issue. Set this define to 0 if you - * want to check wether your system freezes. I suspect the delay done + * want to check whether your system freezes. I suspect the delay done * by SYNC_OTHER_CORES() is in correlation with 'snooping latency', but * i thought that such things are guaranteed by design, since we use * the 'LOCK' prefix. diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/mtrr.c linux/arch/i386/kernel/mtrr.c --- v2.1.106/linux/arch/i386/kernel/mtrr.c Sun Jun 7 11:16:27 1998 +++ linux/arch/i386/kernel/mtrr.c Wed Jun 24 14:30:08 1998 @@ -486,7 +486,7 @@ }; -/* Grab all of the mtrr state for this cpu into *state. */ +/* Grab all of the MTRR state for this CPU into *state. */ __initfunc(static void get_mtrr_state(struct mtrr_state *state)) { unsigned int nvrs, i; @@ -697,7 +697,7 @@ } } /* End Function copy_mtrr_state_handler */ -/* Copies the entire MTRR state of this cpu to all the others. */ +/* Copies the entire MTRR state of this CPU to all the others. */ static void copy_mtrr_state (void) { struct mtrr_state ms; diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/process.c linux/arch/i386/kernel/process.c --- v2.1.106/linux/arch/i386/kernel/process.c Tue Jun 23 10:01:19 1998 +++ linux/arch/i386/kernel/process.c Wed Jun 24 14:30:08 1998 @@ -261,7 +261,7 @@ something else should be done for other chips. More could be done here to set up the registers as if a CPU reset had - occurred; hopefully real BIOSes don't assume much. */ + occurred; hopefully real BIOSs don't assume much. */ static unsigned char real_mode_switch [] = { @@ -546,7 +546,7 @@ } /* - * fill in the fpu structure for a core dump.. + * fill in the FPU structure for a core dump. */ int dump_fpu (struct pt_regs * regs, struct user_i387_struct* fpu) { diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/setup.c linux/arch/i386/kernel/setup.c --- v2.1.106/linux/arch/i386/kernel/setup.c Tue Jun 23 10:01:19 1998 +++ linux/arch/i386/kernel/setup.c Wed Jun 24 14:44:00 1998 @@ -32,6 +32,7 @@ #ifdef CONFIG_BLK_DEV_RAM #include #endif +#include #include #include #include @@ -210,12 +211,20 @@ } #endif - /* request io space for devices used on all i[345]86 PC'S */ + /* request I/O space for devices used on all i[345]86 PCs */ request_region(0x00,0x20,"dma1"); request_region(0x40,0x20,"timer"); request_region(0x80,0x10,"dma page reg"); request_region(0xc0,0x20,"dma2"); request_region(0xf0,0x10,"fpu"); + +#ifdef CONFIG_VT +#ifdef CONFIG_FB + conswitchp = &fb_con; +#else + conswitchp = &vga_con; +#endif +#endif } /* @@ -359,10 +368,10 @@ { NULL, NULL, NULL, "DX/2", NULL, NULL, NULL, "DX/2-WB", "DX/4", "DX/4-WB", NULL, NULL, NULL, NULL, "Am5x86-WT", "Am5x86-WB" }}, { X86_VENDOR_AMD, 5, - { "K5/SSA5 (PR-75, PR-90, PR-100)", "K5 (PR-120, PR-133)", - "K5 (PR-166)", "K5 (PR-200)", NULL, NULL, - "K6 (166 - 266)", "K6 (166 - 300)", "K6-2 (200 - 450)", - "K6-3D-Plus (200 - 450)", NULL, NULL, NULL, NULL, NULL, NULL }}, + { "K5/SSA5 (PR75, PR90, PR100)", "K5 (PR120, PR133)", + "K5 (PR166)", "K5 (PR200)", NULL, NULL, + "K6 (PR166 - PR266)", "K6 (PR166 - PR300)", "K6-2 (PR233 - PR333)", + "K6-3 (PR300 - PR450)", NULL, NULL, NULL, NULL, NULL, NULL }}, { X86_VENDOR_UMC, 4, { NULL, "U5D", "U5S", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }}, @@ -457,7 +466,7 @@ continue; #endif p += sprintf(p, "processor\t: %d\n" - "cpu family\t: %c\n" + "CPU family\t: %c\n" "model\t\t: %s\n" "vendor_id\t: %s\n", n, @@ -503,9 +512,9 @@ "hlt_bug\t\t: %s\n" "sep_bug\t\t: %s\n" "f00f_bug\t: %s\n" - "fpu\t\t: %s\n" - "fpu_exception\t: %s\n" - "cpuid level\t: %d\n" + "FPU\t\t: %s\n" + "FPU_exception\t: %s\n" + "CPUID level\t: %d\n" "wp\t\t: %s\n" "flags\t\t:", c->fdiv_bug ? "yes" : "no", diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/smp.c linux/arch/i386/kernel/smp.c --- v2.1.106/linux/arch/i386/kernel/smp.c Tue Jun 23 10:01:19 1998 +++ linux/arch/i386/kernel/smp.c Wed Jun 24 14:30:08 1998 @@ -64,19 +64,19 @@ /* * Some notes on processor bugs: * - * Pentium and Pentium Pro (and all CPU's) have bugs. The Linux issues + * Pentium and Pentium Pro (and all CPUs) have bugs. The Linux issues * for SMP are handled as follows. * * Pentium Pro * Occasional delivery of 'spurious interrupt' as trap #16. This - * is very very rare. The kernel logs the event and recovers + * is very rare. The kernel logs the event and recovers * * Pentium * There is a marginal case where REP MOVS on 100MHz SMP * machines with B stepping processors can fail. XXX should provide * an L1cache=Writethrough or L1cache=off option. * - * B stepping CPU's may hang. There are hardware work arounds + * B stepping CPUs may hang. There are hardware work arounds * for this. We warn about it in case your board doesnt have the work * arounds. Basically thats so I can tell anyone with a B stepping * CPU and SMP problems "tough". @@ -116,15 +116,15 @@ static int max_cpus = -1; /* Setup configured maximum number of CPUs to activate */ int smp_found_config=0; /* Have we found an SMP box */ -unsigned long cpu_present_map = 0; /* Bitmask of existing CPU's */ -int smp_num_cpus = 1; /* Total count of live CPU's */ +unsigned long cpu_present_map = 0; /* Bitmask of existing CPUs */ +int smp_num_cpus = 1; /* Total count of live CPUs */ int smp_threads_ready=0; /* Set when the idlers are all forked */ volatile int cpu_number_map[NR_CPUS]; /* which CPU maps to which logical number */ volatile int __cpu_logical_map[NR_CPUS]; /* which logical number maps to which CPU */ volatile unsigned long cpu_callin_map[NR_CPUS] = {0,}; /* We always use 0 the rest is ready for parallel delivery */ volatile unsigned long smp_invalidate_needed; /* Used for the invalidate map that's also checked in the spinlock */ -volatile unsigned long kstack_ptr; /* Stack vector for booting CPU's */ -struct cpuinfo_x86 cpu_data[NR_CPUS]; /* Per cpu bogomips and other parameters */ +volatile unsigned long kstack_ptr; /* Stack vector for booting CPUs */ +struct cpuinfo_x86 cpu_data[NR_CPUS]; /* Per CPU bogomips and other parameters */ static unsigned int num_processors = 1; /* Internal processor count */ static unsigned long io_apic_addr = 0xFEC00000; /* Address of the I/O apic (not yet used) */ unsigned char boot_cpu_id = 0; /* Processor that is doing the boot up */ @@ -140,7 +140,7 @@ volatile unsigned long kernel_counter=0; /* Number of times the processor holds the lock */ volatile unsigned long syscall_count=0; /* Number of times the processor holds the syscall lock */ -volatile unsigned long ipi_count; /* Number of IPI's delivered */ +volatile unsigned long ipi_count; /* Number of IPIs delivered */ volatile unsigned long smp_proc_in_lock[NR_CPUS] = {0,};/* for computing process time */ volatile int smp_process_available=0; @@ -396,7 +396,7 @@ } } if(apics>1) - printk("Warning: Multiple APIC's not supported.\n"); + printk("Warning: Multiple APICs not supported.\n"); return num_processors; } @@ -448,7 +448,7 @@ * * HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK * - * It's not just a crazy hack... ;-) + * It's not just a crazy hack. ;-) */ /* * Standard page mapping @@ -614,17 +614,17 @@ /* * Architecture specific routine called by the kernel just before init is * fired off. This allows the BP to have everything in order [we hope]. - * At the end of this all the AP's will hit the system scheduling and off + * At the end of this all the APs will hit the system scheduling and off * we go. Each AP will load the system gdt's and jump through the kernel * init into idle(). At this point the scheduler will one day take over * and give them jobs to do. smp_callin is a standard routine - * we use to track CPU's as they power up. + * we use to track CPUs as they power up. */ __initfunc(void smp_commence(void)) { /* - * Lets the callin's below out of their loop. + * Lets the callins below out of their loop. */ SMP_PRINTK(("Setting commenced=1, go go go\n")); smp_commenced=1; @@ -705,7 +705,7 @@ /* * Everything has been set up for the secondary - * CPU's - they just need to reload everything + * CPUs - they just need to reload everything * from the task structure */ __initfunc(void initialize_secondary(void)) @@ -928,7 +928,7 @@ unsigned int prof_counter[NR_CPUS]; /* - * Cycle through the processors sending APIC IPI's to boot each. + * Cycle through the processors sending APIC IPIs to boot each. */ __initfunc(void smp_boot_cpus(void)) @@ -941,7 +941,7 @@ mtrr_init_boot_cpu (); #endif /* - * Initialize the logical to physical cpu number mapping + * Initialize the logical to physical CPU number mapping * and the per-CPU profiling counter/multiplier */ @@ -1031,7 +1031,7 @@ setup_APIC_clock (); /* - * Now scan the cpu present map and fire up the other CPUs. + * Now scan the CPU present map and fire up the other CPUs. */ SMP_PRINTK(("CPU map: %lx\n", cpu_present_map)); @@ -1161,16 +1161,16 @@ } /* - * A non wait message cannot pass data or cpu source info. This current setup + * A non wait message cannot pass data or CPU source info. This current setup * is only safe because the kernel lock owner is the only person who can send * a message. * * Wrapping this whole block in a spinlock is not the safe answer either. A - * processor may get stuck with irq's off waiting to send a message and thus - * not replying to the person spinning for a reply.... + * processor may get stuck with IRQs off waiting to send a message and thus + * not replying to the person spinning for a reply. * - * In the end flush tlb ought to be the NMI and a very very short function - * (to avoid the old IDE disk problems), and other messages sent with IRQ's + * In the end flush tlb ought to be the NMI and a very short function + * (to avoid the old IDE disk problems), and other messages sent with IRQs * enabled in a civilised fashion. That will also boost performance. */ @@ -1223,15 +1223,15 @@ } /* - * Sanity check we don't re-enter this across CPU's. Only the kernel - * lock holder may send messages. For a STOP_CPU we are bringing the - * entire box to the fastest halt we can.. A reschedule carries - * no data and can occur during a flush.. guess what panic - * I got to notice this bug... + * Sanity check we don't re-enter this across CPUs. Only the kernel + * lock holder may send messages. For a STOP_CPU we are bringing the + * entire box to the fastest halt we can. A reschedule carries + * no data and can occur during a flush. Guess what panic + * I got to notice this bug. */ /* - * We are busy + * We are busy. */ smp_cpu_in_msg[p]++; @@ -1240,7 +1240,7 @@ p, msg, target);*/ /* - * Wait for the APIC to become ready - this should never occur. Its + * Wait for the APIC to become ready - this should never occur. It's * a debugging check really. */ @@ -1327,7 +1327,7 @@ /* * This is fraught with deadlocks. Linus does a flush tlb at a whim - * even with IRQ's off. We have to avoid a pair of crossing flushes + * even with IRQs off. We have to avoid a pair of crossing flushes * or we are doomed. See the notes about smp_message_pass. */ @@ -1447,7 +1447,7 @@ * we might want to decouple profiling from the 'long path', * and do the profiling totally in assembly. * - * Currently this isnt too much of an issue (performance wise), + * Currently this isn't too much of an issue (performance wise), * we can take more than 100K local irqs per second on a 100 MHz P5. */ } @@ -1617,7 +1617,7 @@ delta = curr_count-prev_count; /* - * This limit for delta seems arbitrary, but it isnt, it's + * This limit for delta seems arbitrary, but it isn't, it's * slightly above the level of error a buggy Mercury/Neptune * chipset timer can cause. */ @@ -1670,7 +1670,7 @@ #define LOOPS (HZ/10) /* - * let's wait LOOPS wraprounds: + * Let's wait LOOPS wraprounds: */ for (i=0; imm->mmap_sem); lock_kernel(); - if (copy_from_user(&a, arg, sizeof(a))) - goto out; if (!(a.flags & MAP_ANONYMOUS)) { error = -EBADF; file = fget(a.fd); diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/traps.c linux/arch/i386/kernel/traps.c --- v2.1.106/linux/arch/i386/kernel/traps.c Wed Apr 1 20:11:47 1998 +++ linux/arch/i386/kernel/traps.c Wed Jun 24 14:30:08 1998 @@ -303,7 +303,7 @@ } /* - * Note that we play around with the 'TS' bit to hopefully get + * Note that we play around with the 'TS' bit in an attempt to get * the correct behaviour even in the presence of the asynchronous * IRQ13 behaviour */ diff -u --recursive --new-file v2.1.106/linux/arch/i386/kernel/vm86.c linux/arch/i386/kernel/vm86.c --- v2.1.106/linux/arch/i386/kernel/vm86.c Thu May 7 22:51:46 1998 +++ linux/arch/i386/kernel/vm86.c Wed Jun 24 14:30:08 1998 @@ -27,9 +27,9 @@ * as the next instruction might result in a page fault or similar. * - a real x86 will have interrupts disabled for one instruction * past the 'sti' that enables them. We don't bother with all the - * details yet.. + * details yet. * - * Hopefully these problems do not actually matter for anything. + * Let's hope these problems do not actually matter for anything. */ diff -u --recursive --new-file v2.1.106/linux/arch/i386/lib/checksum.c linux/arch/i386/lib/checksum.c --- v2.1.106/linux/arch/i386/lib/checksum.c Tue Jun 23 10:01:19 1998 +++ linux/arch/i386/lib/checksum.c Wed Jun 24 14:30:08 1998 @@ -33,9 +33,9 @@ unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) { /* - * Experiments with ethernet and slip connections show that buff + * Experiments with Ethernet and SLIP connections show that buff * is aligned on either a 2-byte or 4-byte boundary. We get at - * least a 2x speedup on 486 and Pentium if it is 4-byte aligned. + * least a twofold speedup on 486 and Pentium if it is 4-byte aligned. * Fortunately, it is easy to convert 2-byte alignment to 4-byte * alignment for the unrolled loop. */ @@ -118,7 +118,7 @@ negl %%ebx lea 45f(%%ebx,%%ebx,2), %%ebx testl %%esi, %%esi - jmp %%ebx + jmp *%%ebx # Handle 2-byte-aligned regions 20: addw (%%esi), %%ax @@ -203,9 +203,9 @@ * The macros SRC and DST specify the type of access for the instruction. * thus we can call a custom exception handler for all access types. * - * FIXME: could someone double check wether i havent mixed up some SRC and - * DST definitions? It's damn hard to trigger all cases, i hope i got - * them all but theres no guarantee ... + * FIXME: could someone double-check whether I haven't mixed up some SRC and + * DST definitions? It's damn hard to trigger all cases. I hope I got + * them all but there's no guarantee. */ #define SRC(y...) \ @@ -369,7 +369,7 @@ subl %%ebx, %%edi lea 3f(%%ebx,%%ebx), %%ebx testl %%esi, %%esi - jmp %%ebx + jmp *%%ebx 1: addl $64,%%esi addl $64,%%edi\n" ROUND1(-64) ROUND(-60) ROUND(-56) ROUND(-52) diff -u --recursive --new-file v2.1.106/linux/arch/i386/lib/locks.S linux/arch/i386/lib/locks.S --- v2.1.106/linux/arch/i386/lib/locks.S Thu Mar 26 15:57:02 1998 +++ linux/arch/i386/lib/locks.S Wed Jun 24 14:30:08 1998 @@ -7,7 +7,7 @@ /* Caller does atomic increment on current->lock_depth, * if it was found to originally be zero then we get here, - * %eax contains callers PC and %edx holds this cpu ID. + * %eax contains caller's PC and %edx holds this CPU ID. */ ENTRY(__lock_kernel) 1: diff -u --recursive --new-file v2.1.106/linux/arch/i386/math-emu/README linux/arch/i386/math-emu/README --- v2.1.106/linux/arch/i386/math-emu/README Tue Dec 9 17:57:09 1997 +++ linux/arch/i386/math-emu/README Wed Jun 24 14:30:08 1998 @@ -131,7 +131,7 @@ movl %esp,[%ebx] fld1 The FPU instruction may be (usually will be) loaded into the pre-fetch -queue of the cpu before the mov instruction is executed. If the +queue of the CPU before the mov instruction is executed. If the destination of the 'movl' overlaps the FPU instruction then the bytes in the prefetch queue and memory will be inconsistent when the FPU instruction is executed. The emulator will be invoked but will not be @@ -163,7 +163,7 @@ The speed of floating point computation with the emulator will depend upon instruction mix. Relative performance is best for the instructions which require most computation. The simple instructions are adversely -affected by the fpu instruction trap overhead. +affected by the FPU instruction trap overhead. Timing: Some simple timing tests have been made on the emulator functions. diff -u --recursive --new-file v2.1.106/linux/arch/i386/math-emu/reg_mul.c linux/arch/i386/math-emu/reg_mul.c --- v2.1.106/linux/arch/i386/math-emu/reg_mul.c Tue Dec 9 17:57:09 1997 +++ linux/arch/i386/math-emu/reg_mul.c Wed Jun 24 14:30:08 1998 @@ -7,7 +7,7 @@ | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | | E-mail billm@suburbia.net | | | - | Returns the tag of the result if no exceptions or errors occured. | + | Returns the tag of the result if no exceptions or errors occurred. | | | +---------------------------------------------------------------------------*/ diff -u --recursive --new-file v2.1.106/linux/arch/m68k/config.in linux/arch/m68k/config.in --- v2.1.106/linux/arch/m68k/config.in Tue Jun 23 10:01:20 1998 +++ linux/arch/m68k/config.in Wed Jun 24 14:44:00 1998 @@ -318,9 +318,6 @@ bool ' Software Watchdog' CONFIG_SOFT_WATCHDOG fi bool 'Support for user misc device modules' CONFIG_UMISC -if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" -o "$CONFIG_MAC" = "y" ]; then - define_bool CONFIG_ABSTRACT_CONSOLE y -fi if [ "$CONFIG_ATARI" = "y" ]; then bool 'Enhanced Real Time Clock Support' CONFIG_RTC fi diff -u --recursive --new-file v2.1.106/linux/arch/ppc/config.in linux/arch/ppc/config.in --- v2.1.106/linux/arch/ppc/config.in Fri May 8 23:14:44 1998 +++ linux/arch/ppc/config.in Wed Jun 24 14:44:00 1998 @@ -77,23 +77,21 @@ fi fi -if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - bool 'New unified console driver (EXPERIMENTAL)' CONFIG_ABSTRACT_CONSOLE +bool 'Support for frame buffer devices' CONFIG_FB +if [ "$CONFIG_FB" = "y" ]; then + bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC +else + define_bool CONFIG_ABSCON_COMPAT y fi if [ "$CONFIG_PMAC" = "y" ]; then - if [ "$CONFIG_ABSTRACT_CONSOLE" = "y" ]; then - define_bool CONFIG_FB y - bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC - else + if [ "$CONFIG_FB" != "y" ]; then define_bool CONFIG_PMAC_CONSOLE y fi else # if compiling specifically for prep or chrp, or supporting all arch's - if [ "$CONFIG_ABSTRACT_CONSOLE" = "y" ]; then - bool 'Support for frame buffer devices' CONFIG_FB + if [ "$CONFIG_FB" = "y" ]; then bool 'Support for VGA devices' CONFIG_VGA_CONSOLE - bool 'Backward compatibility mode for Xpmac' CONFIG_FB_COMPAT_XPMAC else bool 'Support for PowerMac console' CONFIG_PMAC_CONSOLE fi @@ -108,7 +106,7 @@ bool 'Include kgdb kernel debugger' CONFIG_KGDB bool 'Include xmon kernel debugger' CONFIG_XMON -if [ "$CONFIG_ABSTRACT_CONSOLE" != "y" ]; then +if [ "$CONFIG_FB" != "y" ]; then if [ "$CONFIG_PMAC_CONSOLE" = "y" ]; then bool 'Support for Apple "control" display' CONFIG_CONTROL_VIDEO bool 'Support for Apple "platinum" display' CONFIG_PLATINUM_VIDEO @@ -176,9 +174,7 @@ source fs/nls/Config.in -if [ "$CONFIG_ABSTRACT_CONSOLE" = "y" ]; then - source drivers/video/Config.in -fi +source drivers/video/Config.in source drivers/char/Config.in diff -u --recursive --new-file v2.1.106/linux/arch/ppc/kernel/chrp_setup.c linux/arch/ppc/kernel/chrp_setup.c --- v2.1.106/linux/arch/ppc/kernel/chrp_setup.c Fri May 8 23:14:44 1998 +++ linux/arch/ppc/kernel/chrp_setup.c Wed Jun 24 14:44:00 1998 @@ -28,9 +28,7 @@ #include #include #include -#ifdef CONFIG_ABSTRACT_CONSOLE #include -#endif #include #include @@ -263,5 +261,9 @@ #ifdef CONFIG_FB /* Frame buffer device based console */ conswitchp = &fb_con; +#endif +#ifdef CONFIG_ABSCON_COMPAT + /* Console wrapper */ + conswitchp = &compat_con; #endif } diff -u --recursive --new-file v2.1.106/linux/arch/ppc/kernel/pmac_setup.c linux/arch/ppc/kernel/pmac_setup.c --- v2.1.106/linux/arch/ppc/kernel/pmac_setup.c Fri May 8 23:14:45 1998 +++ linux/arch/ppc/kernel/pmac_setup.c Wed Jun 24 14:44:00 1998 @@ -38,9 +38,8 @@ #include #include #include -#ifdef CONFIG_ABSTRACT_CONSOLE +#include #include -#endif #include #include #include @@ -142,6 +141,12 @@ /* Frame buffer device based console */ conswitchp = &fb_con; #endif +#ifdef CONFIG_ABSCON_COMPAT + /* Console wrapper */ + conswitchp = &compat_con; +#endif + + kd_mksound = pmac_mksound; } static volatile u32 *feature_addr; diff -u --recursive --new-file v2.1.106/linux/arch/ppc/kernel/prep_setup.c linux/arch/ppc/kernel/prep_setup.c --- v2.1.106/linux/arch/ppc/kernel/prep_setup.c Fri May 8 23:14:45 1998 +++ linux/arch/ppc/kernel/prep_setup.c Wed Jun 24 14:44:00 1998 @@ -28,9 +28,7 @@ #include #include #include -#ifdef CONFIG_ABSTRACT_CONSOLE #include -#endif #include #include @@ -256,9 +254,11 @@ request_region(0x80,0x10,"dma page reg"); request_region(0xc0,0x20,"dma2"); -#ifdef CONFIG_ABSTRACT_CONSOLE #ifdef CONFIG_VGA_CONSOLE conswitchp = &vga_con; #endif +#ifdef CONFIG_ABSCON_COMPAT + /* Console wrapper */ + conswitchp = &compat_con; #endif } diff -u --recursive --new-file v2.1.106/linux/drivers/Makefile linux/drivers/Makefile --- v2.1.106/linux/drivers/Makefile Tue Jun 9 11:57:28 1998 +++ linux/drivers/Makefile Wed Jun 24 14:44:02 1998 @@ -1,15 +1,15 @@ # -# Makefile for the linux kernel device drivers. +# Makefile for the Linux kernel device drivers. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. SUB_DIRS := block char net misc sound MOD_SUB_DIRS := $(SUB_DIRS) sbus -ALL_SUB_DIRS := $(SUB_DIRS) pci scsi sbus cdrom isdn pnp macintosh +ALL_SUB_DIRS := $(SUB_DIRS) pci scsi sbus cdrom isdn pnp macintosh video ifdef CONFIG_PCI SUB_DIRS += pci @@ -19,12 +19,17 @@ SUB_DIRS += sbus endif +ifdef CONFIG_VT +SUB_DIRS += video +MOD_SUB_DIRS += video +endif + ifdef CONFIG_PPC SUB_DIRS += macintosh MOD_SUB_DIRS += macintosh endif -# If CONFIG_SCSI is set, the core of scsi support will be added to the kernel, +# If CONFIG_SCSI is set, the core of SCSI support will be added to the kernel, # but some of the low-level things may also be modules. ifeq ($(CONFIG_SCSI),y) SUB_DIRS += scsi @@ -63,10 +68,9 @@ ALL_SUB_DIRS += ap1000 endif -# make will try to add $(MOD_SUB_DIRS).o to modules/MOD_LIST_NAME -# when MOD_LIST_NAME is set. We don't have hamradio.o and Linus -# sort-of insisted on making hamradio a subdirectory to drivers/net. -# +# When MOD_LIST_NAME is set, make will try to add $(MOD_SUB_DIRS).o to +# modules/MOD_LIST_NAME. We don't have hamradio.o and Linus +# sort of insisted on making hamradio/ a subdirectory of drivers/net/. ifeq ($(CONFIG_HAMRADIO),y) SUB_DIRS += net/hamradio diff -u --recursive --new-file v2.1.106/linux/drivers/block/Config.in linux/drivers/block/Config.in --- v2.1.106/linux/drivers/block/Config.in Thu May 14 19:47:39 1998 +++ linux/drivers/block/Config.in Wed Jun 24 14:30:08 1998 @@ -8,7 +8,7 @@ tristate 'Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support' CONFIG_BLK_DEV_IDE comment 'Please see Documentation/ide.txt for help/info on IDE drives' if [ "$CONFIG_BLK_DEV_IDE" = "n" ]; then - bool 'Old harddisk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY + bool 'Old hard disk (MFM/RLL/IDE) driver' CONFIG_BLK_DEV_HD_ONLY else bool ' Use old disk-only driver on primary interface' CONFIG_BLK_DEV_HD_IDE dep_tristate ' Include IDE/ATA-2 DISK support' CONFIG_BLK_DEV_IDEDISK $CONFIG_BLK_DEV_IDE @@ -54,7 +54,7 @@ fi fi if [ "$CONFIG_MCA" = "y" ]; then - bool 'PS/2 ESDI harddisk support' CONFIG_BLK_DEV_PS2 + bool 'PS/2 ESDI hard disk support' CONFIG_BLK_DEV_PS2 fi comment 'Additional Block Devices' @@ -75,7 +75,7 @@ if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD fi -tristate 'XT harddisk support' CONFIG_BLK_DEV_XD +tristate 'XT hard disk support' CONFIG_BLK_DEV_XD # PARIDE doesn't need PARPORT, but if PARPORT is configured as a module, # PARIDE must also be a module. The bogus CONFIG_PARIDE_PARPORT option diff -u --recursive --new-file v2.1.106/linux/drivers/block/README.fd linux/drivers/block/README.fd --- v2.1.106/linux/drivers/block/README.fd Mon Jan 12 14:57:50 1998 +++ linux/drivers/block/README.fd Wed Jun 24 14:30:08 1998 @@ -7,8 +7,8 @@ at http://poboxes.com/Alain.Knaff/floppy/FAQ.html -Lilo config options (Thinkpad users, read this) -=============================================== +LILO configuration options (Thinkpad users, read this) +====================================================== The floppy driver is configured using the 'floppy=' option in lilo. This option can be typed at the boot prompt, or entered in the @@ -104,7 +104,7 @@ floppy=nofifo Disables the FIFO entirely. This is needed if you get "Bus - master arbitration error" messages from your ethernet card (or + master arbitration error" messages from your Ethernet card (or from other devices) while accessing the floppy. floppy=fifo diff -u --recursive --new-file v2.1.106/linux/drivers/block/acsi.c linux/drivers/block/acsi.c --- v2.1.106/linux/drivers/block/acsi.c Fri May 8 23:14:47 1998 +++ linux/drivers/block/acsi.c Wed Jun 24 14:30:08 1998 @@ -39,7 +39,7 @@ * knows the PREVENT/ALLOW MEDIUM REMOVAL command, the door should * be locked and unlocked when mounting the first or unmounting the * last filesystem on the device. The code is untested, because I - * don't have a removable harddisk. + * don't have a removable hard disk. * */ @@ -147,7 +147,7 @@ #define TYPE_NO_LUN 0x7f /* The data returned by MODE SENSE differ between the old Atari - * harddisks and SCSI disks connected to ACSI. In the following, both + * hard disks and SCSI disks connected to ACSI. In the following, both * formats are defined and some macros to operate on them potably. */ diff -u --recursive --new-file v2.1.106/linux/drivers/block/floppy.c linux/drivers/block/floppy.c --- v2.1.106/linux/drivers/block/floppy.c Tue Jun 23 10:01:22 1998 +++ linux/drivers/block/floppy.c Wed Jun 24 14:30:09 1998 @@ -3962,7 +3962,7 @@ int current_drive=0; if (ints[0] != 2){ - DPRINT("wrong number of parameter for cmos\n"); + DPRINT("wrong number of parameters for CMOS\n"); return; } current_drive = ints[1]; @@ -3974,11 +3974,11 @@ FDC2 = 0x370; if (ints[2] <= 0 || (ints[2] >= NUMBER(default_drive_params) && ints[2] != 16)){ - DPRINT("bad cmos code %d\n", ints[2]); + DPRINT("bad CMOS code %d\n", ints[2]); return; } DP->cmos = ints[2]; - DPRINT("setting cmos code to %d\n", ints[2]); + DPRINT("setting CMOS code to %d\n", ints[2]); } static struct param_table { diff -u --recursive --new-file v2.1.106/linux/drivers/block/genhd.c linux/drivers/block/genhd.c --- v2.1.106/linux/drivers/block/genhd.c Thu Feb 12 20:56:05 1998 +++ linux/drivers/block/genhd.c Wed Jun 24 14:30:09 1998 @@ -1000,7 +1000,7 @@ /* * This is a kludge to allow the partition check to be - * skipped for specific drives (e.g. IDE cd-rom drives) + * skipped for specific drives (e.g. IDE CD-ROM drives) */ if ((int)first_sector == -1) { hd->part[MINOR(dev)].start_sect = 0; diff -u --recursive --new-file v2.1.106/linux/drivers/block/hd.c linux/drivers/block/hd.c --- v2.1.106/linux/drivers/block/hd.c Sun Jun 7 11:16:28 1998 +++ linux/drivers/block/hd.c Wed Jun 24 14:30:09 1998 @@ -690,10 +690,10 @@ } /* - * This is the harddisk IRQ description. The SA_INTERRUPT in sa_flags - * means we run the IRQ-handler with interrupts disabled: this is bad for + * This is the hard disk IRQ description. The SA_INTERRUPT in sa_flags + * means we run the IRQ-handler with interrupts disabled: this is bad for * interrupt latency, but anything else has led to problems on some - * machines... + * machines. * * We enable interrupts in some of the routines after making sure it's * safe. @@ -760,7 +760,7 @@ } if (NR_HD) { if (request_irq(HD_IRQ, hd_interrupt, SA_INTERRUPT, "hd", NULL)) { - printk("hd: unable to get IRQ%d for the harddisk driver\n",HD_IRQ); + printk("hd: unable to get IRQ%d for the hard disk driver\n",HD_IRQ); NR_HD = 0; } else { request_region(HD_DATA, 8, "hd"); @@ -790,7 +790,7 @@ __initfunc(int hd_init(void)) { if (register_blkdev(MAJOR_NR,"hd",&hd_fops)) { - printk("hd: unable to get major %d for harddisk\n",MAJOR_NR); + printk("hd: unable to get major %d for hard disk\n",MAJOR_NR); return -1; } blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; diff -u --recursive --new-file v2.1.106/linux/drivers/block/ht6560b.c linux/drivers/block/ht6560b.c --- v2.1.106/linux/drivers/block/ht6560b.c Thu May 7 22:51:48 1998 +++ linux/drivers/block/ht6560b.c Wed Jun 24 14:30:09 1998 @@ -30,7 +30,7 @@ * of the value is the Active Time (at). Minimum value 2 is the fastest and * the maximum value 15 is the slowest. Default values should be 15 for both. * So 0x24 means 2 for rt and 4 for at. Each of the drives should have - * both values, and IDESETUP gives automatically rt=15 st=15 for cdroms or + * both values, and IDESETUP gives automatically rt=15 st=15 for CDROMs or * similar. If value is too small there will be all sorts of failures. * * Port 0x3e6 bit 0x20 sets these timings on/off. If 0x20 bit is set @@ -103,7 +103,7 @@ * Active Time for each drive. Smaller value gives higher speed. * In case of failures you should probably fall back to a higher value. * - * Hopefully this example will make it clearer: + * Here's an example to make it clearer: * * DOS: DEVICE=C:\bin\HTIDE\HTIDE.SYS /D0=2,4 /D1=4,5 /D2=10,10 /D3=15,15 * Linux: byte ht6560b_timings [][] = {{0x24, 0x45}, {0xaa, 0xff}}; @@ -198,7 +198,7 @@ if (pio == 255) { /* auto-tune */ if (drive->media != ide_disk) - pio = 0; /* some cdroms don't like fast modes (?) */ + pio = 0; /* some CDROMs don't like fast modes (?) */ else pio = ide_get_best_pio_mode(drive, pio, 5, NULL); } diff -u --recursive --new-file v2.1.106/linux/drivers/block/loop.c linux/drivers/block/loop.c --- v2.1.106/linux/drivers/block/loop.c Thu May 7 22:51:48 1998 +++ linux/drivers/block/loop.c Wed Jun 24 11:08:59 1998 @@ -166,8 +166,8 @@ { int size; - if (S_ISREG(lo->lo_inode->i_mode)) - size = (lo->lo_inode->i_size - lo->lo_offset) / BLOCK_SIZE; + if (S_ISREG(lo->lo_dentry->d_inode->i_mode)) + size = (lo->lo_dentry->d_inode->i_size - lo->lo_offset) / BLOCK_SIZE; else { kdev_t lodev = lo->lo_device; if (blk_size[MAJOR(lodev)]) @@ -195,7 +195,7 @@ if (MINOR(current_request->rq_dev) >= MAX_LOOP) goto error_out; lo = &loop_dev[MINOR(current_request->rq_dev)]; - if (!lo->lo_inode || !lo->transfer) + if (!lo->lo_dentry || !lo->transfer) goto error_out; blksize = BLOCK_SIZE; @@ -229,13 +229,14 @@ printk("unknown loop device command (%d)?!?", current_request->cmd); goto error_out; } + spin_unlock_irq(&io_request_lock); while (len > 0) { real_block = block; if (lo->lo_flags & LO_FLAGS_DO_BMAP) { - real_block = bmap(lo->lo_inode, block); + real_block = bmap(lo->lo_dentry->d_inode, block); if (!real_block) { printk("loop: block %d not present\n", block); - goto error_out; + goto error_out_lock; } } bh = getblk(lo->lo_device, real_block, blksize); @@ -243,7 +244,7 @@ printk("loop: device %s: getblk(-, %d, %d) returned NULL", kdevname(lo->lo_device), block, blksize); - goto error_out; + goto error_out_lock; } if (!buffer_uptodate(bh) && ((current_request->cmd == READ) || (offset || (len < blksize)))) { @@ -251,7 +252,7 @@ wait_on_buffer(bh); if (!buffer_uptodate(bh)) { brelse(bh); - goto error_out; + goto error_out_lock; } } size = blksize - offset; @@ -262,7 +263,7 @@ dest_addr, size)) { printk("loop: transfer error block %d\n", block); brelse(bh); - goto error_out; + goto error_out_lock; } if (current_request->cmd == WRITE) { mark_buffer_uptodate(bh, 1); @@ -274,10 +275,13 @@ offset = 0; block++; } + spin_lock_irq(&io_request_lock); current_request->next=CURRENT; CURRENT=current_request; end_request(1); goto repeat; +error_out_lock: + spin_lock_irq(&io_request_lock); error_out: current_request->next=CURRENT; CURRENT=current_request; @@ -292,15 +296,16 @@ int error; MOD_INC_USE_COUNT; + + error = -EBUSY; + if (lo->lo_dentry) + goto out; + error = -EBADF; file = fget(arg); if (!file) goto out; - error = -EBUSY; - if (lo->lo_inode) - goto out_putf; - error = -EINVAL; inode = file->f_dentry->d_inode; if (!inode) { @@ -328,9 +333,8 @@ set_device_ro(dev, 0); } - /* N.B. Should keep the file or dentry ... */ - inode->i_count++; - lo->lo_inode = inode; + lo->lo_dentry = file->f_dentry; + lo->lo_dentry->d_count++; lo->transfer = NULL; figure_loop_size(lo); @@ -344,17 +348,17 @@ static int loop_clr_fd(struct loop_device *lo, kdev_t dev) { - struct inode *inode = lo->lo_inode; + struct dentry *dentry = lo->lo_dentry; - if (!inode) + if (!dentry) return -ENXIO; if (lo->lo_refcnt > 1) /* we needed one fd for the ioctl */ return -EBUSY; - if (S_ISBLK(inode->i_mode)) - blkdev_release (inode); - lo->lo_inode = NULL; - iput(inode); + if (S_ISBLK(dentry->d_inode->i_mode)) + blkdev_release (dentry->d_inode); + lo->lo_dentry = NULL; + dput(dentry); lo->lo_device = 0; lo->lo_encrypt_type = 0; lo->lo_offset = 0; @@ -372,7 +376,7 @@ struct loop_info info; int err; - if (!lo->lo_inode) + if (!lo->lo_dentry) return -ENXIO; if (!arg) return -EINVAL; @@ -432,7 +436,7 @@ struct loop_info info; int err; - if (!lo->lo_inode) + if (!lo->lo_dentry) return -ENXIO; if (!arg) return -EINVAL; @@ -441,8 +445,8 @@ return err; memset(&info, 0, sizeof(info)); info.lo_number = lo->lo_number; - info.lo_device = kdev_t_to_nr(lo->lo_inode->i_dev); - info.lo_inode = lo->lo_inode->i_ino; + info.lo_device = kdev_t_to_nr(lo->lo_dentry->d_inode->i_dev); + info.lo_inode = lo->lo_dentry->d_inode->i_ino; info.lo_rdevice = kdev_t_to_nr(lo->lo_device); info.lo_offset = lo->lo_offset; info.lo_flags = lo->lo_flags; @@ -483,7 +487,7 @@ case LOOP_GET_STATUS: return loop_get_status(lo, (struct loop_info *) arg); case BLKGETSIZE: /* Return device size */ - if (!lo->lo_inode) + if (!lo->lo_dentry) return -ENXIO; if (!arg) return -EINVAL; diff -u --recursive --new-file v2.1.106/linux/drivers/block/md.c linux/drivers/block/md.c --- v2.1.106/linux/drivers/block/md.c Sun Jun 7 11:16:28 1998 +++ linux/drivers/block/md.c Wed Jun 24 14:30:09 1998 @@ -594,9 +594,9 @@ if (hot_add) { /* * Check the superblock for consistency. - * the personality itself has to check wether it's getting - * added with the proper flags ... also, personality has to - * be checked too ;) + * The personality itself has to check whether it's getting + * added with the proper flags. The personality has to be + * checked too. ;) */ if (analyze_one_sb (realdev)) return -EINVAL; diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/epia.c linux/drivers/block/paride/epia.c --- v2.1.106/linux/drivers/block/paride/epia.c Wed May 20 19:10:38 1998 +++ linux/drivers/block/paride/epia.c Wed Jun 24 14:27:18 1998 @@ -13,10 +13,11 @@ /* Changes: 1.01 GRG 1998.05.06 init_proto, release_proto + 1.02 GRG 1998.06.17 support older versions of EPIA */ -#define EPIA_VERSION "1.01" +#define EPIA_VERSION "1.02" #include #include @@ -123,7 +124,7 @@ static void epia_disconnect ( PIA *pi ) -{ WR(0x84,0x10); +{ /* WR(0x84,0x10); */ w0(pi->saved_r0); w2(1); w2(4); w0(pi->saved_r0); @@ -244,6 +245,7 @@ WR(3,k^0x55); if (RR(2) != (k^0xaa)) e[j]++; } + WR(2,1); WR(3,1); } epia_disconnect(pi); diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/paride.c linux/drivers/block/paride/paride.c --- v2.1.106/linux/drivers/block/paride/paride.c Tue Jun 23 10:01:22 1998 +++ linux/drivers/block/paride/paride.c Wed Jun 24 14:36:49 1998 @@ -502,6 +502,11 @@ pt_init(); }; #endif +#ifdef CONFIG_PARIDE_PG + { extern int pg_init(void); + pg_init(); + }; +#endif } #endif diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/pcd.c linux/drivers/block/paride/pcd.c --- v2.1.106/linux/drivers/block/paride/pcd.c Sun Jun 7 11:16:29 1998 +++ linux/drivers/block/paride/pcd.c Wed Jun 24 14:24:19 1998 @@ -90,10 +90,11 @@ and loosen interpretation of ATAPI standard for clearing error status. Use spinlocks. Eliminate sti(). + 1.03 GRG 1998.06.16 Eliminated an Ugh */ -#define PCD_VERSION "1.02" +#define PCD_VERSION "1.03" #define PCD_MAJOR 46 #define PCD_NAME "pcd" #define PCD_UNITS 4 @@ -413,30 +414,20 @@ int init_module(void) { int err; - long flags; - - save_flags(flags); - cli(); err = pcd_init(); - restore_flags(flags); return err; } void cleanup_module(void) -{ long flags; - int unit; +{ int unit; - save_flags(flags); - cli(); unregister_blkdev(MAJOR_NR,name); for (unit=0;unitnext)) @@ -650,8 +636,6 @@ for (unit=0;unit 1) printk("%s: %s %d bytes\n",PG.name, p?"Read":"Write",n); - PG.dlen = (1-p)*d; + PG.dlen += (1-p)*d; + buf += d; + r = pg_wait(unit,STAT_BUSY,STAT_DRQ|STAT_READY|STAT_ERR, + tmo,"completion"); } - s = pg_wait(unit,STAT_BUSY,STAT_READY|STAT_ERR,tmo,"data done"); - pi_disconnect(PI); - return (r?r:s); + return r; } static int pg_reset( int unit ) @@ -458,7 +458,7 @@ pg_sleep(2); k = 0; - while ((k++ < PG_TMO) && (RR(1,6)&STAT_BUSY)) + while ((k++ < PG_RESET_TMO) && (RR(1,6)&STAT_BUSY)) pg_sleep(1); flg = 1; diff -u --recursive --new-file v2.1.106/linux/drivers/block/paride/pt.c linux/drivers/block/paride/pt.c --- v2.1.106/linux/drivers/block/paride/pt.c Sun Jun 7 11:16:29 1998 +++ linux/drivers/block/paride/pt.c Wed Jun 24 14:24:19 1998 @@ -96,10 +96,11 @@ loosed interpretation of ATAPI standard for clearing error status. Eliminate sti(); + 1.02 GRG 1998.06.16 Eliminate an Ugh. */ -#define PT_VERSION "1.01" +#define PT_VERSION "1.02" #define PT_MAJOR 96 #define PT_NAME "pt" #define PT_UNITS 4 @@ -322,31 +323,20 @@ int init_module(void) { int err; - long flags; - - save_flags(flags); - cli(); err = pt_init(); - restore_flags(flags); return err; } void cleanup_module(void) -{ long flags; - int unit; - - save_flags(flags); - cli(); +{ int unit; unregister_chrdev(major,name); for (unit=0;unit1 disk, Paul Gortmaker, Mar '98 @@ -70,11 +70,11 @@ #define MAJOR_NR RAMDISK_MAJOR #include -/* The ramdisk size is now a parameter */ +/* The RAM disk size is now a parameter */ #define NUM_RAMDISKS 16 /* This cannot be overridden (yet) */ #ifndef MODULE -/* We don't have to load ramdisks or gunzip them in a module... */ +/* We don't have to load RAM disks or gunzip them in a module. */ #define RD_LOADER #define BUILD_CRAMDISK @@ -86,22 +86,23 @@ #endif #endif -/* Various static variables go here... mostly used within the ramdisk code only. */ +/* Various static variables go here. Most are used only in the RAM disk code. + */ static int rd_length[NUM_RAMDISKS]; static int rd_blocksizes[NUM_RAMDISKS]; /* - * Parameters for the boot-loading of the ramdisk. These are set by + * Parameters for the boot-loading of the RAM disk. These are set by * init/main.c (from arguments to the kernel command line) or from the - * architecture-specific setup routine (from the stored bootsector + * architecture-specific setup routine (from the stored boot sector * information). */ -int rd_size = 4096; /* Size of the ramdisks */ +int rd_size = 4096; /* Size of the RAM disks */ #ifndef MODULE -int rd_doload = 0; /* 1 = load ramdisk, 0 = don't load */ -int rd_prompt = 1; /* 1 = prompt for ramdisk, 0 = don't prompt */ +int rd_doload = 0; /* 1 = load RAM disk, 0 = don't load */ +int rd_prompt = 1; /* 1 = prompt for RAM disk, 0 = don't prompt */ int rd_image_start = 0; /* starting block # of image */ #ifdef CONFIG_BLK_DEV_INITRD unsigned long initrd_start,initrd_end; @@ -273,7 +274,7 @@ block_fsync /* fsync */ }; -/* This is the registration and initialization section of the ramdisk driver */ +/* This is the registration and initialization section of the RAM disk driver */ __initfunc(int rd_init(void)) { int i; @@ -292,7 +293,7 @@ blksize_size[MAJOR_NR] = rd_blocksizes; - printk("Ramdisk driver initialized : %d ramdisks of %dK size\n", + printk("RAM disk driver initialized: %d RAM disks of %dK size\n", NUM_RAMDISKS, rd_size); return 0; @@ -324,11 +325,11 @@ #endif /* MODULE */ -/* End of non-loading portions of the ramdisk driver */ +/* End of non-loading portions of the RAM disk driver */ #ifdef RD_LOADER /* - * This routine tries to find a ramdisk image to load, and returns the + * This routine tries to find a RAM disk image to load, and returns the * number of blocks to read for a non-compressed image, 0 if the image * is a compressed image, and -1 if an image with the right magic * numbers could not be found. @@ -382,7 +383,7 @@ if (romfsb->word0 == ROMSB_WORD0 && romfsb->word1 == ROMSB_WORD1) { printk(KERN_NOTICE - "RAMDISK: Romfs filesystem found at block %d\n", + "RAMDISK: romfs filesystem found at block %d\n", start_block); nblocks = (ntohl(romfsb->size)+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS; goto done; @@ -410,14 +411,14 @@ /* Try ext2 */ if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) { printk(KERN_NOTICE - "RAMDISK: Ext2 filesystem found at block %d\n", + "RAMDISK: ext2 filesystem found at block %d\n", start_block); nblocks = le32_to_cpu(ext2sb->s_blocks_count); goto done; } printk(KERN_NOTICE - "RAMDISK: Couldn't find valid ramdisk image starting at %d.\n", + "RAMDISK: Couldn't find valid RAM disk image starting at %d.\n", start_block); done: @@ -430,7 +431,7 @@ } /* - * This routine loads in the ramdisk image. + * This routine loads in the RAM disk image. */ __initfunc(static void rd_load_image(kdev_t device,int offset)) { @@ -480,7 +481,7 @@ #else printk(KERN_NOTICE "RAMDISK: Kernel does not support compressed " - "ramdisk images\n"); + "RAM disk images\n"); #endif goto done; } @@ -564,7 +565,7 @@ floppy_eject(); #endif printk(KERN_NOTICE - "VFS: Insert root floppy disk to be loaded into ramdisk and press ENTER\n"); + "VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER\n"); wait_for_keypress(); } diff -u --recursive --new-file v2.1.106/linux/drivers/block/xd.c linux/drivers/block/xd.c --- v2.1.106/linux/drivers/block/xd.c Wed May 20 19:10:38 1998 +++ linux/drivers/block/xd.c Wed Jun 24 14:30:09 1998 @@ -240,7 +240,7 @@ } if (xd_drives) { - if (!request_irq(xd_irq,xd_interrupt_handler, 0, "XT harddisk", NULL)) { + if (!request_irq(xd_irq,xd_interrupt_handler, 0, "XT hard disk", NULL)) { if (request_dma(xd_dma,"xd")) { printk("xd: unable to get DMA%d\n",xd_dma); free_irq(xd_irq, NULL); diff -u --recursive --new-file v2.1.106/linux/drivers/char/ChangeLog linux/drivers/char/ChangeLog --- v2.1.106/linux/drivers/char/ChangeLog Sun Jun 7 11:16:29 1998 +++ linux/drivers/char/ChangeLog Wed Jun 24 14:30:09 1998 @@ -33,13 +33,13 @@ it. * serial.c (autoconfig): Change 16750 test to hopefully eliminate - false results by people with strange 16550A's being - detected as 16750's. Hopefully 16750's will still be - detected as 16750, and other wierd UART's won't get poorly + false results by people with strange 16550As being + detected as 16750s. Hopefully 16750s will still be + detected as 16750, and other weird UARTs won't get poorly autodetected. If this doesn't work, I'll have to disable - the auto identification for the 16750.... + the auto identification for the 16750. - * tty_io.c (tty_hangup): Now do actually do the tty hangup + * tty_io.c (tty_hangup): Now actually do the tty hangup processing during the timer processing, and disable interrupts while doing the hangup processing. This avoids several nasty race conditions which happened when the @@ -129,7 +129,7 @@ * serial.c: Update routines to use the new 2.1 memory access routines. -Wed Dec 4 07:51:52 1996 Theodre Ts'o +Wed Dec 4 07:51:52 1996 Theodore Ts'o * serial.c (change_speed): Use save_flags(); cli() and restore_flags() in order to ensure we don't accidentally @@ -139,7 +139,7 @@ should be off this whole time, but we eventually will want to reduce this window. -Thu Nov 21 10:05:22 1996 Theodre Ts'o +Thu Nov 21 10:05:22 1996 Theodore Ts'o * tty_ioctl.c (tty_wait_until_sent): Always check the driver wait_until_ready routine, even if there are no characters @@ -174,7 +174,7 @@ DTR and RTS. DTR and RTS are only be changed on the transition to or from the B0 state. (rs_close): Wait for the characters to drain based on - info->timeout. At low baud rates (50bps), it may take a + info->timeout. At low baud rates (50 bps), it may take a long time for the FIFO to completely drain out! (rs_wait_until_sent): Fixed timeout handling. Now releases control to the scheduler, but checks frequently diff -u --recursive --new-file v2.1.106/linux/drivers/char/Makefile linux/drivers/char/Makefile --- v2.1.106/linux/drivers/char/Makefile Tue Jun 9 11:57:28 1998 +++ linux/drivers/char/Makefile Wed Jun 24 14:44:00 1998 @@ -27,6 +27,9 @@ L_OBJS += console.o vt.o vc_screen.o consolemap.o consolemap_deftbl.o LX_OBJS += selection.o endif +ifdef CONFIG_FB + LX_OBJS += fbmem.o +endif ifeq ($(CONFIG_SERIAL),y) ifndef CONFIG_SUN_SERIAL @@ -431,14 +434,6 @@ endif endif -ifdef CONFIG_VT - ifdef CONFIG_TGA_CONSOLE - L_OBJS += tga.o - endif - ifdef CONFIG_VGA_CONSOLE - L_OBJS += vga.o vesa_blank.o - endif -endif ifeq ($(CONFIG_HFMODEM),y) ALL_SUB_DIRS += hfmodem diff -u --recursive --new-file v2.1.106/linux/drivers/char/console.c linux/drivers/char/console.c --- v2.1.106/linux/drivers/char/console.c Tue Jun 23 10:01:22 1998 +++ linux/drivers/char/console.c Wed Jun 24 15:07:54 1998 @@ -8,17 +8,18 @@ * * This module exports the console io functions: * - * 'void do_keyboard_interrupt(void)' - * * 'int vc_allocate(unsigned int console)' * 'int vc_cons_allocated(unsigned int console)' * 'int vc_resize(unsigned long lines, unsigned long cols)' + * 'int vc_resize_con(unsigned long lines, unsigned long cols, + * unsigned int currcons)' * 'void vc_disallocate(unsigned int currcons)' * * 'unsigned long con_init(unsigned long)' * 'int con_open(struct tty_struct *tty, struct file * filp)' * 'void con_write(struct tty_struct * tty)' - * 'void vt_console_print(const char * b)' + * 'void vt_console_print(struct console *co, const char * b, + * unsigned count)' * 'void update_screen(int new_console)' * * 'void do_blank_screen(int)' @@ -61,8 +62,141 @@ * redirection by Martin Mares 19-Nov-95 * * APM screenblank bug fixed Takashi Manabe + * + * Merge with the abstract console driver by Geert Uytterhoeven + * , Jan 1997. + * + * Original m68k console driver modifications by + * + * - Arno Griffioen + * - David Carter + * + * Note that the abstract console driver allows all consoles to be of + * potentially different sizes, so the following variables depend on the + * current console (currcons): + * + * - video_num_columns + * - video_num_lines + * - video_size_row + * - video_screen_size + * - can_do_color + * + * The abstract console driver provides a generic interface for a text + * console. It supports VGA text mode, frame buffer based graphical consoles + * and special graphics processors that are only accessible through some + * registers (e.g. a TMS340x0 GSP). + * + * The interface to the hardware is specified using a special structure + * (struct consw) which contains function pointers to the following + * operations: + * + * unsigned long con_startup(unsigned long kmem_start, + * const char **display_desc) + * void con_init(struct vc_data *conp) + * int con_deinit(struct vc_data *conp) + * int con_clear(struct vc_data *conp, int sy, int sx, int height, + * int width) + * int con_putc(struct vc_data *conp, int c, int y, int x) + * int con_putcs(struct vc_data *conp, const char *s, int count, int y, + * int x) + * int con_cursor(struct vc_data *conp, int mode) + * int con_scroll(struct vc_data *conp, int t, int b, int dir, int count) + * int con_bmove(struct vc_data *conp, int sy, int sx, int dy, int dx, + * int height, int width) + * int con_switch(struct vc_data *conp) + * int con_blank(int blank) + * int con_get_font(struct vc_data *conp, int *w, int *h, char *data) + * int con_set_font(struct vc_data *conp, int w, int h, char *data) + * int con_set_palette(struct vc_data *conp, unsigned char *table) + * int con_scrolldelta(struct vc_data *conp, int lines) + * + * Support for changeable cursor shape + * by Pavel Machek , August 1997 + * + * Ported to i386 and con_scrolldelta fixed + * by Emmanuel Marty , April 1998 */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_APM +#include +#endif + +#include +#include +#include +#include + +#ifndef CONFIG_ABSCON_COMPAT +#define INCLUDE_LINUX_LOGO_DATA +#endif +#include + +#include "console_macros.h" + + +struct consw *conswitchp = NULL; + +int (*console_show_logo)(void) __initdata = NULL; + +static int vesa_blank_mode = 0; /* 0:none 1:suspendV 2:suspendH 3:powerdown */ + +static inline void hide_cursor(int currcons) +{ + sw->con_cursor(vc_cons[currcons].d,CM_ERASE); +} + +void set_cursor(int currcons) +{ + if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS) + return; + if (deccm) + sw->con_cursor(vc_cons[currcons].d,CM_DRAW); + else + hide_cursor(currcons); +} + + /* + * Adjust the screen to fit a font of a certain height + * + * Returns < 0 for error, 0 if nothing changed, and the number + * of lines on the adjusted console if changed. + */ + +int con_adjust_height(unsigned long fontheight) +{ + int currcons = fg_console; + /* ++Geert: Always assume that the number of lines did change? */ + return video_num_lines; +} + +/* dummy functions */ + +void no_scroll(char *str, int *ints) +{ +} + + #define BLANK 0x0020 /* A bitmap for codes <32. A bit of 1 indicates that the code @@ -86,45 +220,10 @@ * interrupt, as we use trap-gates. Hopefully all is well. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_APM -#include -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif -#ifdef __sparc__ -int serial_console; -#endif - struct tty_driver console_driver; static int console_refcount; static struct tty_struct *console_table[MAX_NR_CONSOLES]; @@ -134,56 +233,30 @@ struct vc vc_cons [MAX_NR_CONSOLES]; static int con_open(struct tty_struct *, struct file *); -static void con_setsize(unsigned long rows, unsigned long cols); static void vc_init(unsigned int console, unsigned long rows, unsigned long cols, int do_clear); -extern void get_scrmem(int currcons); -extern void set_scrmem(int currcons, long offset); -static void set_origin(int currcons); static void blank_screen(void); static void unblank_screen(void); extern void change_console(unsigned int); extern void poke_blanked_console(void); +static void update_attr(int currcons); static void gotoxy(int currcons, int new_x, int new_y); static void save_cur(int currcons); -extern void set_cursor(int currcons); -extern void hide_cursor(void); static void reset_terminal(int currcons, int do_clear); extern void reset_vc(unsigned int new_console); extern void vt_init(void); extern void set_vesa_blanking(unsigned long arg); extern void vesa_blank(void); -extern void vesa_unblank(void); extern void vesa_powerdown(void); extern void compute_shiftstate(void); extern void reset_palette(int currcons); extern void set_palette(void); -extern int con_is_present(void); -extern unsigned long con_type_init(unsigned long, const char **); -extern void con_type_init_finish(void); -extern int set_get_cmap(unsigned char *, int); -extern int set_get_font(unsigned char *, int, int); -extern void rs_cons_hook(int chip, int out, int channel); - -/* Description of the hardware situation */ -unsigned char video_type; /* Type of display being used */ -unsigned long video_mem_base; /* Base of video memory */ -unsigned long video_mem_term; /* End of video memory */ -unsigned short video_port_reg; /* Video register select port */ -unsigned short video_port_val; /* Video register value port */ -unsigned long video_num_columns; /* Number of text columns */ -unsigned long video_num_lines; /* Number of text lines */ -unsigned long video_size_row; -unsigned long video_screen_size; -int can_do_color = 0; static int printable = 0; /* Is console ready for printing? */ int video_mode_512ch = 0; /* 512-character mode */ unsigned long video_font_height; /* Height of current screen font */ unsigned long video_scan_lines; /* Number of scan lines on screen */ -static unsigned long default_font_height; /* Height of default screen font */ -int video_font_is_default = 1; static unsigned short console_charmask = 0x0ff; /* used by kbd_bh - set by keyboard_interrupt */ @@ -191,7 +264,8 @@ int console_blanked = 0; static int blankinterval = 10*60*HZ; static int vesa_off_interval = 0; -static long blank_origin, blank__origin, unblank_origin; + +static char putcs_buf[256]; /* * fg_console is the current virtual console, @@ -204,161 +278,58 @@ int want_console = -1; int kmsg_redirect = 0; -#ifdef CONFIG_SERIAL_ECHO - -#include - -extern int serial_echo_init (int base); -extern int serial_echo_print (const char *s); - -/* - * this defines the address for the port to which printk echoing is done - * when CONFIG_SERIAL_ECHO is defined - */ -#define SERIAL_ECHO_PORT 0x3f8 /* COM1 */ - -static int serial_echo_port = 0; - -#define serial_echo_outb(v,a) outb((v),(a)+serial_echo_port) -#define serial_echo_inb(a) inb((a)+serial_echo_port) - -#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) - -/* Wait for transmitter & holding register to empty */ -#define WAIT_FOR_XMITR \ - do { \ - lsr = serial_echo_inb(UART_LSR); \ - } while ((lsr & BOTH_EMPTY) != BOTH_EMPTY) - -/* These two functions abstract the actual communications with the - * debug port. This is so we can change the underlying communications - * mechanism without modifying the rest of the code. - */ -int -serial_echo_print(const char *s) -{ - int lsr, ier; - int i; - - if (!serial_echo_port) return (0); - - /* - * First save the IER then disable the interrupts - */ - ier = serial_echo_inb(UART_IER); - serial_echo_outb(0x00, UART_IER); - - /* - * Now, do each character - */ - for (i = 0; *s; i++, s++) { - WAIT_FOR_XMITR; - - /* Send the character out. */ - serial_echo_outb(*s, UART_TX); - - /* if a LF, also do CR... */ - if (*s == 10) { - WAIT_FOR_XMITR; - serial_echo_outb(13, UART_TX); - } - } - - /* - * Finally, Wait for transmitter & holding register to empty - * and restore the IER - */ - do { - lsr = serial_echo_inb(UART_LSR); - } while ((lsr & BOTH_EMPTY) != BOTH_EMPTY); - serial_echo_outb(ier, UART_IER); - - return (0); -} - - -int -serial_echo_init(int base) +int vc_cons_allocated(unsigned int i) { - int comstat, hi, lo; - - if (base != 0x2f8 && base != 0x3f8) { - serial_echo_port = 0; - return (0); - } else - serial_echo_port = base; - - /* - * read the Divisor Latch - */ - comstat = serial_echo_inb(UART_LCR); - serial_echo_outb(comstat | UART_LCR_DLAB, UART_LCR); - hi = serial_echo_inb(UART_DLM); - lo = serial_echo_inb(UART_DLL); - serial_echo_outb(comstat, UART_LCR); - - /* - * now do hardwired init - */ - serial_echo_outb(0x03, UART_LCR); /* No parity, 8 data bits, 1 stop */ - serial_echo_outb(0x83, UART_LCR); /* Access divisor latch */ - serial_echo_outb(0x00, UART_DLM); /* 9600 baud */ - serial_echo_outb(0x0c, UART_DLL); - serial_echo_outb(0x03, UART_LCR); /* Done with divisor */ - - /* Prior to disabling interrupts, read the LSR and RBR - * registers - */ - comstat = serial_echo_inb(UART_LSR); /* COM? LSR */ - comstat = serial_echo_inb(UART_RX); /* COM? RBR */ - serial_echo_outb(0x00, UART_IER); /* Disable all interrupts */ - - return(0); + return (i < MAX_NR_CONSOLES && vc_cons[i].d); } -#endif /* CONFIG_SERIAL_ECHO */ - -int vc_cons_allocated(unsigned int i) +void visual_init(int currcons) { - return (i < MAX_NR_CONSOLES && vc_cons[i].d); + /* ++Geert: sw->con_init determines console size */ + sw = conswitchp; + cons_num = currcons; + sw->con_init(vc_cons[currcons].d); + video_size_row = video_num_columns<<1; + video_screen_size = video_num_lines*video_size_row; } -int vc_allocate(unsigned int i) /* return 0 on success */ +int vc_allocate(unsigned int currcons) /* return 0 on success */ { - if (i >= MAX_NR_CONSOLES) + if (currcons >= MAX_NR_CONSOLES) return -ENXIO; - if (!vc_cons[i].d) { + if (!vc_cons[currcons].d) { long p, q; /* prevent users from taking too much memory */ - if (i >= MAX_NR_USER_CONSOLES && !capable(CAP_SYS_RESOURCE)) + if (currcons >= MAX_NR_USER_CONSOLES && !capable(CAP_SYS_RESOURCE)) return -EPERM; /* due to the granularity of kmalloc, we waste some memory here */ /* the alloc is done in two steps, to optimize the common situation of a 25x80 console (structsize=216, video_screen_size=4000) */ - q = (long) kmalloc(video_screen_size, GFP_KERNEL); - if (!q) - return -ENOMEM; p = (long) kmalloc(structsize, GFP_KERNEL); - if (!p) { - kfree_s((char *) q, video_screen_size); + if (!p) + return -ENOMEM; + vc_cons[currcons].d = (struct vc_data *)p; + vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data)); + visual_init(currcons); + q = (long)kmalloc(video_screen_size, GFP_KERNEL); + if (!q) { + kfree_s((char *) p, structsize); + vc_cons[currcons].d = NULL; + vt_cons[currcons] = NULL; return -ENOMEM; } - - vc_cons[i].d = (struct vc_data *) p; - p += sizeof(struct vc_data); - vt_cons[i] = (struct vt_struct *) p; - vc_scrbuf[i] = (unsigned short *) q; - vc_cons[i].d->vc_kmalloced = 1; - vc_cons[i].d->vc_screenbuf_size = video_screen_size; - vc_init (i, video_num_lines, video_num_columns, 1); + vc_scrbuf[currcons] = (unsigned short *) q; + vc_cons[currcons].d->vc_kmalloced = 1; + vc_cons[currcons].d->vc_screenbuf_size = video_screen_size; + vc_init(currcons, video_num_lines, video_num_columns, 1); } return 0; } /* - * Change # of rows and columns (0 means unchanged) + * Change # of rows and columns (0 means unchanged/the size of fg_console) * [this is to be used together with some user program * like resize that changes the hardware videomode] */ @@ -367,7 +338,7 @@ unsigned long cc, ll, ss, sr; unsigned long occ, oll, oss, osr; unsigned short *p; - unsigned int currcons, i; + unsigned int currcons = fg_console, i; unsigned short *newscreens[MAX_NR_CONSOLES]; long ol, nl, rlth, rrem; @@ -376,9 +347,6 @@ sr = cc << 1; ss = sr * ll; - if (ss > video_mem_term - video_mem_base) - return -ENOMEM; - /* * Some earlier version had all consoles of potentially * different sizes, but that was really messy. @@ -400,22 +368,20 @@ } } - get_scrmem(fg_console); - - oll = video_num_lines; - occ = video_num_columns; - osr = video_size_row; - oss = video_screen_size; - - video_num_lines = ll; - video_num_columns = cc; - video_size_row = sr; - video_screen_size = ss; - for (currcons = 0; currcons < MAX_NR_CONSOLES; currcons++) { if (!vc_cons_allocated(currcons)) continue; + oll = video_num_lines; + occ = video_num_columns; + osr = video_size_row; + oss = video_screen_size; + + video_num_lines = ll; + video_num_columns = cc; + video_size_row = sr; + video_screen_size = ss; + rlth = MIN(osr, sr); rrem = sr - rlth; ol = origin; @@ -423,6 +389,7 @@ if (ll < oll) ol += (oll - ll) * osr; + update_attr(currcons); while (ol < scr_end) { memcpyw((unsigned short *) nl, (unsigned short *) ol, rlth); if (rrem) @@ -432,7 +399,7 @@ } if (kmalloced) - kfree_s(vc_scrbuf[currcons], screenbuf_size); + kfree_s(vc_scrbuf[currcons], oss); vc_scrbuf[currcons] = newscreens[currcons]; kmalloced = 1; screenbuf_size = ss; @@ -450,16 +417,110 @@ save_cur(currcons); } - set_scrmem(fg_console, 0); - set_origin(fg_console); + /* don't update in graphics mode */ + if (currcons == fg_console && vt_cons[fg_console]->vc_mode == KD_TEXT) + update_screen(fg_console); + set_cursor(fg_console); return 0; } +/* + * ++Geert: Change # of rows and columns for one specific console. + * Of course it's not messy to have all consoles of potentially different + * sizes, except on PCish hardware :-) + */ +void vc_resize_con(unsigned long lines, unsigned long cols, + unsigned int currcons) +{ + unsigned long cc, ll, ss, sr; + unsigned long occ, oll, oss, osr; + unsigned short *newscreen; + long ol, nl, rlth, rrem; + + if (!cols || !lines || currcons >= MAX_NR_CONSOLES) + return; + + cc = cols; + ll = lines; + sr = cc << 1; + ss = sr * ll; + + if (!vc_cons_allocated(currcons)) + newscreen = 0; + else if (!(newscreen = (unsigned short *)kmalloc(ss, GFP_USER))) + return; + + if (vc_cons_allocated(currcons)) { + oll = video_num_lines; + occ = video_num_columns; + osr = video_size_row; + oss = video_screen_size; + + video_num_lines = ll; + video_num_columns = cc; + video_size_row = sr; + video_screen_size = ss; + + rlth = MIN(osr, sr); + rrem = sr - rlth; + ol = origin; + nl = (long) newscreen; + if (ll < oll) + ol += (oll - ll) * osr; + + /* ++Geert: TODO: Because the attributes have different meanings + for monochrome and color, they should really be converted if + can_do_color changes... */ + update_attr(currcons); + while (ol < scr_end) { + memcpyw((unsigned short *) nl, (unsigned short *) ol, rlth); + if (rrem) + memsetw((void *)(nl + rlth), video_erase_char, rrem); + ol += osr; + nl += sr; + } + + if (kmalloced) + kfree_s(vc_scrbuf[currcons], oss); + vc_scrbuf[currcons] = newscreen; + kmalloced = 1; + screenbuf_size = ss; + + origin = video_mem_start = (long) vc_scrbuf[currcons]; + scr_end = video_mem_end = video_mem_start + ss; + + if (scr_end > nl) + memsetw((void *) nl, video_erase_char, scr_end - nl); + + /* do part of a reset_terminal() */ + top = 0; + bottom = video_num_lines; + gotoxy(currcons, x, y); + save_cur(currcons); + + if (console_table[currcons]) { + struct winsize ws, *cws = &console_table[currcons]->winsize; + ws.ws_row = video_num_lines; + ws.ws_col = video_num_columns; + if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) && + console_table[currcons]->pgrp > 0) + kill_pg(console_table[currcons]->pgrp, SIGWINCH, 1); + *cws = ws; + } + } + + /* don't update in graphics mode */ + if (currcons == fg_console && vt_cons[fg_console]->vc_mode == KD_TEXT) + update_screen(fg_console); +} + + void vc_disallocate(unsigned int currcons) { if (vc_cons_allocated(currcons)) { + sw->con_deinit(vc_cons[currcons].d); if (kmalloced) kfree_s(vc_scrbuf[currcons], screenbuf_size); if (currcons >= MIN_NR_CONSOLES) @@ -490,7 +551,7 @@ /* the default colour table, for VGA+ colour systems */ int default_red[] = {0x00,0xaa,0x00,0xaa,0x00,0xaa,0x00,0xaa, 0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff}; -int default_grn[] = {0x00,0x00,0xaa,0x55,0x00,0x00,0xaa,0xaa, +int default_grn[] = {0x00,0x00,0xaa,0xaa,0x00,0x00,0xaa,0xaa, 0x55,0x55,0xff,0xff,0x55,0x55,0xff,0xff}; int default_blu[] = {0x00,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa, 0x55,0x55,0x55,0x55,0xff,0xff,0xff,0xff}; @@ -537,58 +598,16 @@ /* * Hardware scrollback support */ -extern void __set_origin(unsigned short); -unsigned short __real_origin; /* offset of non-scrolled screen */ -unsigned short __origin; /* offset of currently displayed screen */ -unsigned char has_wrapped; /* all of videomem is data of fg_console */ -static unsigned char hardscroll_enabled; -static unsigned char hardscroll_disabled_by_init = 0; - -void no_scroll(char *str, int *ints) +static inline void scrolldelta(int lines) { - /* - * Disabling scrollback is required for the Braillex ib80-piezo - * Braille reader made by F.H. Papenmeier (Germany). - * Use the "no-scroll" bootflag. - */ - hardscroll_disabled_by_init = 1; - hardscroll_enabled = 0; -} - -static void scrolldelta(int lines) -{ - int new_origin; - int last_origin_rel = (((video_mem_term - video_mem_base) - / video_num_columns / 2) - (video_num_lines - 1)) * video_num_columns; - - new_origin = __origin + lines * video_num_columns; - if (__origin > __real_origin) - new_origin -= last_origin_rel; - if (new_origin < 0) { - int s_top = __real_origin + video_num_lines*video_num_columns; - new_origin += last_origin_rel; - if (new_origin < s_top) - new_origin = s_top; - if (new_origin > last_origin_rel - video_num_columns - || has_wrapped == 0) - new_origin = 0; - else { - unsigned short * d = (unsigned short *) video_mem_base; - unsigned short * s = d + last_origin_rel; - int count = (video_num_lines-1)*video_num_columns; - while (count) { - count--; - scr_writew(scr_readw(d++),s++); - } - } - } else if (new_origin > __real_origin) - new_origin = __real_origin; - - __set_origin(new_origin); + int currcons = fg_console; + sw->con_scrolldelta(vc_cons[currcons].d, lines); } void scrollback(int lines) { + int currcons = fg_console; + if (!lines) lines = video_num_lines/2; scrolldelta(-lines); @@ -596,80 +615,31 @@ void scrollfront(int lines) { + int currcons = fg_console; + if (!lines) lines = video_num_lines/2; scrolldelta(lines); } -static void set_origin(int currcons) +static void scrup(int currcons, unsigned int t, unsigned int b, int nr) { - if (video_type != VIDEO_TYPE_EGAC && video_type != VIDEO_TYPE_VGAC - && video_type != VIDEO_TYPE_EGAM) - return; - if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS) - return; - __real_origin = (origin-video_mem_base) >> 1; - __set_origin(__real_origin); -} - -static void scrup(int currcons, unsigned int t, unsigned int b, unsigned int nr) -{ - int hardscroll = hardscroll_enabled; + unsigned short *d, *s; if (t+nr >= b) nr = b - t - 1; if (b > video_num_lines || t >= b || nr < 1) return; - if (t || b != video_num_lines || nr > 1) - hardscroll = 0; - if (hardscroll) { - origin += video_size_row; - pos += video_size_row; - scr_end += video_size_row; - if (scr_end > video_mem_end) { - unsigned short * d = (unsigned short *) video_mem_start; - unsigned short * s = (unsigned short *) origin; - unsigned int count; - - count = (video_num_lines-1)*video_num_columns; - while (count) { - count--; - scr_writew(scr_readw(s++),d++); - } - count = video_num_columns; - while (count) { - count--; - scr_writew(video_erase_char, d++); - } - scr_end -= origin-video_mem_start; - pos -= origin-video_mem_start; - origin = video_mem_start; - has_scrolled = 1; - if (currcons == fg_console) - has_wrapped = 1; - } else { - unsigned short * d; - unsigned int count; - - d = (unsigned short *) (scr_end - video_size_row); - count = video_num_columns; - while (count) { - count--; - scr_writew(video_erase_char, d++); - } - } - set_origin(currcons); - } else { - unsigned short * d = (unsigned short *) (origin+video_size_row*t); - unsigned short * s = (unsigned short *) (origin+video_size_row*(t+nr)); - - memcpyw(d, s, (b-t-nr) * video_size_row); - memsetw(d + (b-t-nr) * video_num_columns, video_erase_char, video_size_row*nr); - } + d = (unsigned short *) (origin+video_size_row*t); + s = (unsigned short *) (origin+video_size_row*(t+nr)); + memcpyw(d, s, (b-t-nr) * video_size_row); + memsetw(d + (b-t-nr) * video_num_columns, video_erase_char, video_size_row*nr); + if (currcons == fg_console) + sw->con_scroll(vc_cons[currcons].d, t, b, SM_UP, nr); } static void -scrdown(int currcons, unsigned int t, unsigned int b, unsigned int nr) +scrdown(int currcons, unsigned int t, unsigned int b, int nr) { unsigned short *s; unsigned int count; @@ -686,42 +656,14 @@ memcpyw(s + step, s, video_size_row); s -= video_num_columns; } - while (nr--) { + count = nr; + while (count--) { s += video_num_columns; memsetw(s, video_erase_char, video_size_row); } has_scrolled = 1; -} - -/* - * Routine to reset the visible "screen" to the top of video memory. - * This is necessary when exiting from the kernel back to a console - * which expects only the top of video memory to be used for the visible - * screen (with scrolling down by moving the memory contents). - * The normal action of the LINUX console is to scroll using all of the - * video memory and diddling the hardware top-of-video register as needed. - */ -void -scrreset(void) -{ - int currcons = fg_console; - unsigned short * d = (unsigned short *) video_mem_start; - unsigned short * s = (unsigned short *) origin; - unsigned int count; - - count = (video_num_lines-1)*video_num_columns; - memcpyw(d, s, 2*count); - memsetw(d + count, video_erase_char, - 2*video_num_columns); - scr_end -= origin-video_mem_start; - pos -= origin-video_mem_start; - origin = video_mem_start; - - has_scrolled = 1; - has_wrapped = 1; - - set_origin(currcons); - set_cursor(currcons); + if (currcons == fg_console) + sw->con_scroll(vc_cons[currcons].d, t, b, SM_DOWN, nr); } static void lf(int currcons) @@ -730,7 +672,7 @@ * if below scrolling region */ if (y+1 == bottom) - scrup(currcons,top,bottom, 1); + scrup(currcons,top,bottom,1); else if (y < video_num_lines-1) { y++; pos += video_size_row; @@ -781,14 +723,33 @@ case 0: /* erase from cursor to end of display */ count = (scr_end-pos)>>1; start = (unsigned short *) pos; + if (currcons == fg_console) { + /* do in two stages */ + sw->con_clear(vc_cons[currcons].d, y, x, 1, + video_num_columns-x); + sw->con_clear(vc_cons[currcons].d, y+1, 0, + video_num_lines-y-1, + video_num_columns); + } break; case 1: /* erase from start to cursor */ count = ((pos-origin)>>1)+1; start = (unsigned short *) origin; + if (currcons == fg_console) { + /* do in two stages */ + sw->con_clear(vc_cons[currcons].d, 0, 0, y, + video_num_columns); + sw->con_clear(vc_cons[currcons].d, y, 0, 1, + x + 1); + } break; case 2: /* erase whole display */ count = video_num_columns * video_num_lines; start = (unsigned short *) origin; + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, 0, 0, + video_num_lines, + video_num_columns); break; default: return; @@ -806,14 +767,23 @@ case 0: /* erase from cursor to end of line */ count = video_num_columns-x; start = (unsigned short *) pos; + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, y, x, 1, + video_num_columns-x); break; case 1: /* erase from start of line to cursor */ start = (unsigned short *) (pos - (x<<1)); count = x+1; + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, y, 0, 1, + x + 1); break; case 2: /* erase whole line */ start = (unsigned short *) (pos - (x<<1)); count = video_num_columns; + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, y, 0, 1, + video_num_columns); break; default: return; @@ -824,16 +794,43 @@ static void csi_X(int currcons, int vpar) /* erase the following vpar positions */ { /* not vt100? */ + int count; + if (!vpar) vpar++; + count = (vpar > video_num_columns-x) ? (video_num_columns-x) : vpar; - memsetw((unsigned short *) pos, video_erase_char, - (vpar > video_num_columns-x) ? 2 * (video_num_columns-x) : 2 * vpar); + memsetw((unsigned short *) pos, video_erase_char, 2 * count); + if (currcons == fg_console) + sw->con_clear(vc_cons[currcons].d, y, x, 1, count); need_wrap = 0; } static void update_attr(int currcons) { +/* + * ++roman: I completely changed the attribute format for monochrome + * mode (!can_do_color). The formerly used MDA (monochrome display + * adapter) format didn't allow the combination of certain effects. + * Now the attribute is just a bit vector: + * Bit 0..1: intensity (0..2) + * 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... + */ + 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) @@ -847,12 +844,6 @@ attr ^= 0x80; if (intensity == 2) attr ^= 0x08; - if (!can_do_color) { - if (underline) - attr = (attr & 0xf8) | 0x01; - else if (intensity == 0) - attr = (attr & 0xf0) | 0x08; - } if (decscnm) video_erase_char = (reverse_video_char(color) << 8) | ' '; else @@ -1060,31 +1051,57 @@ static inline unsigned short *screenpos(int currcons, int offset, int viewed) { unsigned short *p = (unsigned short *)(origin + offset); - if (viewed && currcons == fg_console) - p -= (__real_origin - __origin); return p; } +static inline void visual_putc_attr(int currcons, unsigned short new, + int yy, int xx) +{ + unsigned short oldattr = attr; + attr = new >> 8; + sw->con_putc(vc_cons[currcons].d, new & 0xff, yy, xx); + attr = oldattr; +} + +static inline void visual_putc_attr_next(int currcons, unsigned short new, + int *yy, int *xx) +{ + attr = new >> 8; + sw->con_putc(vc_cons[currcons].d, new & 0xff, *yy, *xx); + if (++(*xx) == video_num_columns) + *xx = 0, ++(*yy); +} + + /* 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; + unsigned short oldattr = attr; count /= 2; p = screenpos(currcons, offset, viewed); if (can_do_color) while (count--) { unsigned short old = scr_readw(p); - scr_writew(reverse_video_short(old), p); + unsigned short new = reverse_video_short(old); + scr_writew(new, p); p++; + if (currcons == fg_console) + visual_putc_attr_next(currcons, new, &yy, &xx); } else while (count--) { unsigned short old = scr_readw(p); - scr_writew(old ^ (((old & 0x0700) == 0x0100) - ? 0x7000 : 0x7700), p); + unsigned short new = reverse_video_short_mono(old); + scr_writew(new, p); p++; + if (currcons == fg_console) + visual_putc_attr_next(currcons, new, &yy, &xx); } + attr = oldattr; } /* used by selection: complement pointer position */ @@ -1092,15 +1109,25 @@ { static unsigned short *p = NULL; static unsigned short old = 0; + static unsigned short oldx = 0, oldy = 0; - if (p) + if (p) { scr_writew(old, p); + if (currcons == fg_console) + visual_putc_attr(currcons, old, oldy, oldx); + } if (offset == -1) p = NULL; else { + unsigned short new; p = screenpos(currcons, offset, 1); old = scr_readw(p); - scr_writew(old ^ 0x7700, p); + oldx = (offset >> 1) % video_num_columns; + oldy = (offset >> 1) / video_num_columns; + new = complement_video_short(old); + scr_writew(new, p); + if (currcons == fg_console) + visual_putc_attr(currcons, new, oldy, oldx); } } @@ -1261,9 +1288,18 @@ p = q + video_num_columns - nr - x; while (--p >= q) scr_writew(scr_readw(p), p + nr); - memsetw(q, video_erase_char, nr*2); need_wrap = 0; + if (currcons == fg_console) { + unsigned short oldattr = attr; + sw->con_bmove(vc_cons[currcons].d,y,x,y,x+nr,1, + video_num_columns-x-nr); + attr = video_erase_char >> 8; + while (nr--) + sw->con_putc(vc_cons[currcons].d, + (video_erase_char & 0x00ff),y,x+nr); + attr = oldattr; + } } static void insert_line(int currcons, unsigned int nr) @@ -1275,7 +1311,7 @@ static void delete_char(int currcons, unsigned int nr) { unsigned int i = x; - unsigned short * p = (unsigned short *) pos; + unsigned short *p = (unsigned short *) pos; while (++i <= video_num_columns - nr) { scr_writew(scr_readw(p+nr), p); @@ -1283,6 +1319,17 @@ } memsetw(p, video_erase_char, nr*2); need_wrap = 0; + if (currcons == fg_console) { + unsigned short oldattr = attr; + sw->con_bmove(vc_cons[currcons].d, y, x+nr, y, x, 1, + video_num_columns-x-nr); + attr = video_erase_char >> 8; + while (nr--) + sw->con_putc(vc_cons[currcons].d, + (video_erase_char & 0x00ff), y, + video_num_columns-1-nr); + attr = oldattr; + } } static void delete_line(int currcons, unsigned int nr) @@ -1293,8 +1340,8 @@ static void csi_at(int currcons, unsigned int nr) { - if (nr > video_num_columns) - nr = video_num_columns; + if (nr > video_num_columns - x) + nr = video_num_columns - x; else if (!nr) nr = 1; insert_char(currcons, nr); @@ -1302,8 +1349,8 @@ static void csi_L(int currcons, unsigned int nr) { - if (nr > video_num_lines) - nr = video_num_lines; + if (nr > video_num_lines - y) + nr = video_num_lines - y; else if (!nr) nr = 1; insert_line(currcons, nr); @@ -1311,8 +1358,8 @@ static void csi_P(int currcons, unsigned int nr) { - if (nr > video_num_columns) - nr = video_num_columns; + if (nr > video_num_columns - x) + nr = video_num_columns - x; else if (!nr) nr = 1; delete_char(currcons, nr); @@ -1320,8 +1367,8 @@ static void csi_M(int currcons, unsigned int nr) { - if (nr > video_num_lines) - nr = video_num_lines; + if (nr > video_num_lines - y) + nr = video_num_lines - y; else if (!nr) nr=1; delete_line(currcons, nr); @@ -1395,6 +1442,8 @@ kbd_table[currcons].ledflagstate = kbd_table[currcons].default_ledflagstate; set_leds(); + cursor_type = CUR_DEFAULT; + default_attr(currcons); update_attr(currcons); @@ -1455,7 +1504,7 @@ currcons = vt->vc_num; if (vcmode != KD_GRAPHICS) set_cursor(currcons); -} +} static int do_con_write(struct tty_struct * tty, int from_user, const unsigned char *buf, int count) @@ -1480,6 +1529,11 @@ return 0; } + /* undraw cursor first */ + if (currcons == fg_console) + hide_cursor(currcons); + + /* clear the selection */ if (currcons == sel_cons) clear_selection(); @@ -1490,7 +1544,7 @@ } disable_bh(CONSOLE_BH); - while (!tty->stopped && count) { + while (count) { enable_bh(CONSOLE_BH); if (from_user) __get_user(c, buf); @@ -1577,12 +1631,93 @@ cr(currcons); lf(currcons); } + + /* DPC: 1994-04-12 + * Speed up overstrike mode, using new putcs. + * + * P.S. I hate 8 spaces per tab! Use Emacs! + */ + + /* Only use this for the foreground console, + where we really draw the chars */ + + if (count > 2 && + !decim && !utf && currcons == fg_console) { + char *p = putcs_buf; + int putcs_count = 1; + ushort nextx = x + 1; + + *p++ = tc; + scr_writew((attr << 8) + tc, + (unsigned short *)pos); + pos+=2; + + if (nextx == video_num_columns) { + sw->con_putc(vc_cons[currcons].d, + *putcs_buf, y, x); + pos-=2; + need_wrap = decawm; + continue; + } + + /* TAB TAB TAB - Arghh!!!! */ + + while (count) { + enable_bh(CONSOLE_BH); + if (from_user) + get_user(c, buf); + else + c = *buf; + disable_bh(CONSOLE_BH); + tc = translate[toggle_meta ? (c|0x80) : c]; + if (!tc || + !(c >= 32 + || !(((disp_ctrl ? CTRL_ALWAYS + : CTRL_ACTION) >> c) & 1))) + break; + tc = conv_uni_to_pc(tc); + if (tc == -4) + tc = conv_uni_to_pc(0xfffd); + else if (tc == -3) + tc = c; + + buf++; n++; count--; + if (tc & ~console_charmask) + continue; /* Conversion failed */ + + *p++ = tc; + scr_writew((attr << 8) + tc, + (unsigned short *)pos); + pos+=2; + ++putcs_count; + ++nextx; + if (nextx == video_num_columns || + putcs_count == sizeof (putcs_buf)) + break; + } + + sw->con_putcs(vc_cons[currcons].d, + putcs_buf, putcs_count, y, x); + if (nextx == video_num_columns) { + pos-=2; + x = video_num_columns-1; + need_wrap = decawm; + } else + x += putcs_count; + continue; + } + + /* DPC: End of putcs support */ + if (decim) insert_char(currcons, 1); scr_writew( video_mode_512ch ? ((attr & 0xf7) << 8) + ((tc & 0x100) << 3) + (tc & 0x0ff) : (attr << 8) + tc, (unsigned short *) pos); + if (currcons == fg_console) + sw->con_putc(vc_cons[currcons].d, tc, y, x); + if (x == video_num_columns - 1) need_wrap = decawm; else { @@ -1760,6 +1895,13 @@ case 'l': set_mode(currcons,0); continue; + case 'c': + if (par[0]) + cursor_type = par[0] | (par[1]<<8) | (par[2]<<16); + else + cursor_type = CUR_DEFAULT; + set_cursor(currcons); + continue; case 'n': if (!ques) { if (par[0] == 5) @@ -1901,6 +2043,11 @@ /* DEC screen alignment test. kludge :-) */ video_erase_char = (video_erase_char & 0xff00) | 'E'; + /* Arno: + * Doesn't work, because csi_J(c,2) + * calls con_clear and doesn't print + * the erase char.. + */ csi_J(currcons, 2); video_erase_char = (video_erase_char & 0xff00) | ' '; @@ -1989,6 +2136,9 @@ int currcons = fg_console; unsigned char c; static int printing = 0; + const char *start = b; + ushort cnt = 0; + ushort myx = x; #if CONFIG_AP1000 prom_printf(b); @@ -2007,30 +2157,52 @@ return; } -#ifdef CONFIG_SERIAL_ECHO - serial_echo_print(b); -#endif /* CONFIG_SERIAL_ECHO */ - - while (count-- > 0) { - c = *(b++); - if (c == 10 || c == 13 || need_wrap) { + /* undraw cursor first */ + hide_cursor(currcons); + + /* Contrived structure to try to emulate original need_wrap behaviour + * Problems caused when we have need_wrap set on '\n' character */ + while (count--) { + c = *b++; + if (c == 10 || c == 13 || c == 8 || need_wrap) { + if ((cnt = b - start - 1) > 0) { + sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x); + x += cnt; + if (need_wrap) + x--; + } + if (c == 8) { /* backspace */ + bs(currcons); + start = b; + myx = x; + continue; + } if (c != 13) lf(currcons); cr(currcons); - if (c == 10 || c == 13) + if (c == 10 || c == 13) { + start = b; + myx = x; continue; - } - if (c == 8) { /* backspace */ - bs(currcons); - continue; + } + start = b-1; + myx = x; } scr_writew((attr << 8) + c, (unsigned short *) pos); - if (x == video_num_columns - 1) { + if (myx == video_num_columns - 1) { need_wrap = 1; continue; } - x++; pos+=2; + myx++; + } + if ((cnt = b - start) > 0) { + sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x); + x += cnt; + if (x == video_num_columns) { + x--; + need_wrap = 1; + } } set_cursor(currcons); poke_blanked_console(); @@ -2101,14 +2273,6 @@ reset_terminal(currcons, do_clear); } -static void con_setsize(unsigned long rows, unsigned long cols) -{ - video_num_lines = rows; - video_num_columns = cols; - video_size_row = 2 * cols; - video_screen_size = video_num_lines * video_size_row; -} - /* * This is the console switching bottom half handler. * @@ -2150,23 +2314,17 @@ */ __initfunc(unsigned long con_init(unsigned long kmem_start)) { - const char *display_desc = "????"; - int currcons = 0; - int orig_x = ORIG_X; - int orig_y = ORIG_Y; - -#ifdef __sparc__ - if (serial_console) { + const char *display_desc = NULL; + unsigned int currcons = 0; + char q[2] = { 0, 1 }; + + if (conswitchp) + kmem_start = conswitchp->con_startup(kmem_start, + &display_desc); + if (!display_desc) { fg_console = 0; - -#if CONFIG_SUN_SERIAL - rs_cons_hook(0, 0, serial_console); - rs_cons_hook(0, 1, serial_console); -#endif - return kmem_start; } -#endif memset(&console_driver, 0, sizeof(struct tty_driver)); console_driver.magic = TTY_DRIVER_MAGIC; @@ -2201,7 +2359,6 @@ #if CONFIG_AP1000 return(kmem_start); #endif - con_setsize(ORIG_VIDEO_LINES, ORIG_VIDEO_COLS); timer_table[BLANK_TIMER].fn = blank_screen; timer_table[BLANK_TIMER].expires = 0; @@ -2210,14 +2367,6 @@ timer_active |= 1<con_putcs(vc_cons[fg_console].d, linux_logo_banner, + sizeof(linux_logo_banner)-1, q[1]-1, q[0]); + putconsxy(0, q); +#endif + sw->con_cursor(vc_cons[currcons].d, CM_DRAW); + printk("Console: %s %s %ldx%ld", can_do_color ? "colour" : "mono", - display_desc, video_num_columns, video_num_lines, - MIN_NR_CONSOLES, (MIN_NR_CONSOLES == 1) ? "" : "s", - MAX_NR_CONSOLES); - - con_type_init_finish(); + display_desc, video_num_columns, video_num_lines); + printable = 1; + printk("\n"); - /* - * can't register TGA yet, because PCI bus probe has *not* taken - * place before con_init() gets called. Trigger the real TGA hw - * initialization and register_console() event from - * within the bus probing code... :-( - */ #ifdef CONFIG_VT_CONSOLE - if (video_type != VIDEO_TYPE_TGAC && con_is_present()) - register_console(&vt_console_driver); + register_console(&vt_console_driver); #endif init_bh(CONSOLE_BH, console_bh); return kmem_start; } +void set_vesa_blanking(unsigned long arg) +{ + char *argp = (char *)arg + 1; + unsigned int mode; + get_user(mode, argp); + vesa_blank_mode = (mode < 4) ? mode : 0; +} + +void vesa_blank(void) +{ + vc_cons[fg_console].d->vc_sw->con_blank(vesa_blank_mode + 1); +} + +void vesa_powerdown(void) +{ + /* + * Power down if currently suspended (1 or 2), + * suspend if currently blanked (0), + * else do nothing (i.e. already powered down (3)). + * Called only if powerdown features are allowed. + */ + switch (vesa_blank_mode) { + case VESA_NO_BLANKING: + vc_cons[fg_console].d->vc_sw->con_blank(VESA_VSYNC_SUSPEND+1); + break; + case VESA_VSYNC_SUSPEND: + case VESA_HSYNC_SUSPEND: + vc_cons[fg_console].d->vc_sw->con_blank(VESA_POWERDOWN+1); + break; + } +} + void vesa_powerdown_screen(void) { timer_active &= ~(1<vc_mode != KD_TEXT) { + console_blanked = fg_console + 1; + hide_cursor(fg_console); + return; + } if(vesa_off_interval && !nopowersave) { timer_table[BLANK_TIMER].fn = vesa_powerdown_screen; timer_table[BLANK_TIMER].expires = jiffies + vesa_off_interval; @@ -2320,14 +2483,7 @@ /* try not to lose information by blanking, and not to waste memory */ currcons = fg_console; has_scrolled = 0; - blank__origin = __origin; - blank_origin = origin; - set_origin(fg_console); - get_scrmem(fg_console); - unblank_origin = origin; - memsetw((void *)blank_origin, BLANK, - 2*video_num_lines*video_num_columns); - hide_cursor(); + sw->con_blank(1); console_blanked = fg_console + 1; if(!nopowersave) @@ -2343,9 +2499,6 @@ void do_unblank_screen(void) { int currcons; - int resetorg; - long offset; - if (!console_blanked) return; if (!vc_cons_allocated(fg_console)) { @@ -2360,28 +2513,11 @@ } currcons = fg_console; - offset = 0; - resetorg = 0; - if (console_blanked == fg_console + 1 && origin == unblank_origin - && !has_scrolled) { - /* try to restore the exact situation before blanking */ - resetorg = 1; - offset = (blank_origin - video_mem_base) - - (unblank_origin - video_mem_start); - } - console_blanked = 0; - set_scrmem(fg_console, offset); - set_origin(fg_console); + if (sw->con_blank(0)) + /* Low-level driver cannot restore -> do it ourselves */ + update_screen(fg_console); set_cursor(fg_console); - if (resetorg) - __set_origin(blank__origin); - - vesa_unblank(); -#ifdef CONFIG_APM - if (apm_display_unblank()) - return; -#endif } /* @@ -2400,9 +2536,13 @@ void update_screen(int new_console) { + int currcons = fg_console; + int xx, yy, startx, attr_save; + char *bufp; + unsigned short *p; static int lock = 0; - if (new_console == fg_console || lock) + if (lock) return; if (!vc_cons_allocated(new_console)) { /* strange ... */ @@ -2413,15 +2553,37 @@ clear_selection(); - if (!console_blanked) - get_scrmem(fg_console); - else - console_blanked = -1; /* no longer of the form console+1 */ - fg_console = new_console; /* this is the only (nonzero) assignment to fg_console */ - /* consequently, fg_console will always be allocated */ - set_scrmem(fg_console, 0); - set_origin(fg_console); - set_cursor(fg_console); + currcons = fg_console = new_console; + sw->con_cursor (vc_cons[currcons].d, CM_ERASE); + sw->con_switch (vc_cons[new_console].d); + /* Update the screen contents */ + p = (unsigned short *)video_mem_start; + attr_save = attr; + for (yy = 0; yy < video_num_lines; yy++) { + bufp = putcs_buf; + for (startx = xx = 0; xx < video_num_columns; xx++) { + if (attr != ((scr_readw(p) >> 8) & 0xff)) { + if (bufp > putcs_buf) + sw->con_putcs (vc_cons[currcons].d, putcs_buf, + bufp - putcs_buf, yy, startx); + startx = xx; + bufp = putcs_buf; + attr = (scr_readw(p) >> 8) & 0xff; + } + *bufp++ = scr_readw(p++); + if (bufp == putcs_buf + sizeof (putcs_buf)) { + sw->con_putcs (vc_cons[currcons].d, putcs_buf, + bufp - putcs_buf, yy, startx); + startx = xx + 1; + bufp = putcs_buf; + } + } + if (bufp > putcs_buf) + sw->con_putcs (vc_cons[currcons].d, putcs_buf, + bufp - putcs_buf, yy, startx); + } + set_cursor (currcons); + attr = attr_save; set_leds(); compute_shiftstate(); lock = 0; @@ -2432,17 +2594,17 @@ */ static int con_open(struct tty_struct *tty, struct file * filp) { - unsigned int idx; + unsigned int currcons; int i; - idx = MINOR(tty->device) - tty->driver.minor_start; + currcons = MINOR(tty->device) - tty->driver.minor_start; - i = vc_allocate(idx); + i = vc_allocate(currcons); if (i) return i; - vt_cons[idx]->vc_num = idx; - tty->driver_data = vt_cons[idx]; + vt_cons[currcons]->vc_num = currcons; + tty->driver_data = vt_cons[currcons]; if (!tty->winsize.ws_row && !tty->winsize.ws_col) { tty->winsize.ws_row = video_num_lines; @@ -2451,9 +2613,41 @@ return 0; } +void set_palette(void) +{ + if (vt_cons[fg_console]->vc_mode != KD_GRAPHICS) + conswitchp->con_set_palette(vc_cons[fg_console].d, color_table); +} + +int set_get_cmap(unsigned char *arg, int set) +{ + int i, j, k; + + for (i = 0; i < 16; i++) + if (set) { + get_user(default_red[i], arg++); + get_user(default_grn[i], arg++); + get_user(default_blu[i], arg++); + } else { + put_user(default_red[i], arg++); + put_user(default_grn[i], arg++); + put_user(default_blu[i], arg++); + } + if (set) { + for (i = 0; i < MAX_NR_CONSOLES; i++) + if (vc_cons_allocated(i)) + for (j = k = 0; j < 16; j++) { + vc_cons[i].d->vc_palette[k++] = default_red[j]; + vc_cons[i].d->vc_palette[k++] = default_grn[j]; + vc_cons[i].d->vc_palette[k++] = default_blu[j]; + } + set_palette(); + } + return 0; +} /* - * Load palette into the EGA/VGA DAC registers. arg points to a colour + * Load palette into the DAC registers. arg points to a colour * map, 3 bytes per colour, 16 colours, range from 0 to 255. */ @@ -2476,6 +2670,58 @@ palette[k++] = default_blu[j]; } set_palette() ; +} + +/* + * PIO_FONT support. + * + * 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 + * 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 + +int set_get_font(unsigned char * arg, int set, int ch512) +{ + int i, unit, size; + char *charmap; + + if (!arg) + return -EINVAL; + + + size = ch512 ? 2*cmapsz : cmapsz; + + charmap = (char *)kmalloc(size, GFP_USER); + + if (set) { + if (copy_from_user(charmap, arg, size)) { + kfree(charmap); + return -EFAULT; + } + + for (unit = 32; unit > 0; unit--) + for (i = 0; i < (ch512 ? 512 : 256); i++) + if (charmap[32*i+unit-1]) + goto nonzero; + nonzero: + i = conswitchp->con_set_font(vc_cons[fg_console].d, 8, unit, charmap); + } else { + memset(charmap, 0, size); + i = conswitchp->con_get_font(vc_cons[fg_console].d, &unit, &unit, + charmap); + if (i == 0 && copy_to_user(arg, charmap, size)) + i = -EFAULT; + } + kfree(charmap); + + return i; } /* diff -u --recursive --new-file v2.1.106/linux/drivers/char/console_macros.h linux/drivers/char/console_macros.h --- v2.1.106/linux/drivers/char/console_macros.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/char/console_macros.h Wed Jun 24 14:44:00 1998 @@ -0,0 +1,65 @@ +#define cons_num (vc_cons[currcons].d->vc_num) +#define sw (vc_cons[currcons].d->vc_sw) +#define screenbuf_size (vc_cons[currcons].d->vc_screenbuf_size) +#define origin (vc_cons[currcons].d->vc_origin) +#define scr_end (vc_cons[currcons].d->vc_scr_end) +#define pos (vc_cons[currcons].d->vc_pos) +#define top (vc_cons[currcons].d->vc_top) +#define bottom (vc_cons[currcons].d->vc_bottom) +#define x (vc_cons[currcons].d->vc_x) +#define y (vc_cons[currcons].d->vc_y) +#define vc_state (vc_cons[currcons].d->vc_state) +#define npar (vc_cons[currcons].d->vc_npar) +#define par (vc_cons[currcons].d->vc_par) +#define ques (vc_cons[currcons].d->vc_ques) +#define attr (vc_cons[currcons].d->vc_attr) +#define saved_x (vc_cons[currcons].d->vc_saved_x) +#define saved_y (vc_cons[currcons].d->vc_saved_y) +#define translate (vc_cons[currcons].d->vc_translate) +#define G0_charset (vc_cons[currcons].d->vc_G0_charset) +#define G1_charset (vc_cons[currcons].d->vc_G1_charset) +#define saved_G0 (vc_cons[currcons].d->vc_saved_G0) +#define saved_G1 (vc_cons[currcons].d->vc_saved_G1) +#define utf (vc_cons[currcons].d->vc_utf) +#define utf_count (vc_cons[currcons].d->vc_utf_count) +#define utf_char (vc_cons[currcons].d->vc_utf_char) +#define video_mem_start (vc_cons[currcons].d->vc_video_mem_start) +#define video_mem_end (vc_cons[currcons].d->vc_video_mem_end) +#define video_erase_char (vc_cons[currcons].d->vc_video_erase_char) +#define disp_ctrl (vc_cons[currcons].d->vc_disp_ctrl) +#define toggle_meta (vc_cons[currcons].d->vc_toggle_meta) +#define decscnm (vc_cons[currcons].d->vc_decscnm) +#define decom (vc_cons[currcons].d->vc_decom) +#define decawm (vc_cons[currcons].d->vc_decawm) +#define deccm (vc_cons[currcons].d->vc_deccm) +#define decim (vc_cons[currcons].d->vc_decim) +#define deccolm (vc_cons[currcons].d->vc_deccolm) +#define need_wrap (vc_cons[currcons].d->vc_need_wrap) +#define has_scrolled (vc_cons[currcons].d->vc_has_scrolled) +#define kmalloced (vc_cons[currcons].d->vc_kmalloced) +#define report_mouse (vc_cons[currcons].d->vc_report_mouse) +#define color (vc_cons[currcons].d->vc_color) +#define s_color (vc_cons[currcons].d->vc_s_color) +#define def_color (vc_cons[currcons].d->vc_def_color) +#define foreground (color & 0x0f) +#define background (color & 0xf0) +#define charset (vc_cons[currcons].d->vc_charset) +#define s_charset (vc_cons[currcons].d->vc_s_charset) +#define intensity (vc_cons[currcons].d->vc_intensity) +#define underline (vc_cons[currcons].d->vc_underline) +#define blink (vc_cons[currcons].d->vc_blink) +#define reverse (vc_cons[currcons].d->vc_reverse) +#define s_intensity (vc_cons[currcons].d->vc_s_intensity) +#define s_underline (vc_cons[currcons].d->vc_s_underline) +#define s_blink (vc_cons[currcons].d->vc_s_blink) +#define s_reverse (vc_cons[currcons].d->vc_s_reverse) +#define ulcolor (vc_cons[currcons].d->vc_ulcolor) +#define halfcolor (vc_cons[currcons].d->vc_halfcolor) +#define tab_stop (vc_cons[currcons].d->vc_tab_stop) +#define palette (vc_cons[currcons].d->vc_palette) +#define bell_pitch (vc_cons[currcons].d->vc_bell_pitch) +#define bell_duration (vc_cons[currcons].d->vc_bell_duration) +#define cursor_type (vc_cons[currcons].d->vc_cursor_type) +#define vcmode (vt_cons[currcons]->vc_mode) + +#define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct)) diff -u --recursive --new-file v2.1.106/linux/drivers/char/fbmem.c linux/drivers/char/fbmem.c --- v2.1.106/linux/drivers/char/fbmem.c Tue Mar 10 10:03:31 1998 +++ linux/drivers/char/fbmem.c Wed Jun 24 14:44:00 1998 @@ -8,6 +8,9 @@ * for more details. */ +#include +#include + #include #include #include @@ -17,29 +20,141 @@ #include #include #include +#ifdef CONFIG_PROC_FS +#include +#endif +#ifdef CONFIG_KERNELD +#include +#endif +#ifdef __mc68000__ #include +#endif +#ifdef __powerpc__ +#include +#endif #include #include #include #include -#define FB_MAJOR 29 -#define FB_MODES_SHIFT 5 /* 32 modes per framebuffer */ -#define FB_NUM_MINORS 256 /* 256 Minors */ -#define FB_MAX (FB_NUM_MINORS / (1 << FB_MODES_SHIFT)) + /* + * Frame buffer device initialization and setup routines + */ + +extern unsigned long amifb_init(unsigned long mem_start); +extern void amifb_setup(char *options, int *ints); +extern unsigned long atafb_init(unsigned long mem_start); +extern void atafb_setup(char *options, int *ints); +extern unsigned long macfb_init(unsigned long mem_start); +extern void macfb_setup(char *options, int *ints); +extern unsigned long cyberfb_init(unsigned long mem_start); +extern void cyberfb_setup(char *options, int *ints); +extern unsigned long retz3fb_init(unsigned long mem_start); +extern void retz3fb_setup(char *options, int *ints); +extern unsigned long clgenfb_init(unsigned long mem_start); +extern void clgenfb_setup(char *options, int *ints); +extern unsigned long vfb_init(unsigned long mem_start); +extern void vfb_setup(char *options, int *ints); +extern unsigned long offb_init(unsigned long mem_start); +extern void offb_setup(char *options, int *ints); +extern unsigned long atyfb_init(unsigned long mem_start); +extern void atyfb_setup(char *options, int *ints); +extern unsigned long dnfb_init(unsigned long mem_start); +extern unsigned long tgafb_init(unsigned long mem_start); +extern unsigned long virgefb_init(unsigned long mem_start); +extern void virgefb_setup(char *options, int *ints); +extern void resolver_video_setup(char *options, int *ints); +extern unsigned long s3triofb_init(unsigned long mem_start); +extern void s3triofb_setup(char *options, int *ints); +extern unsigned long vgafb_init(unsigned long mem_start); +extern void vgafb_setup(char *options, int *ints); +extern unsigned long vesafb_init(unsigned long mem_start); +extern void vesafb_setup(char *options, int *ints); +extern unsigned long mdafb_init(unsigned long mem_start); +extern void mdafb_setup(char *options, int *ints); +extern unsigned long hpfb_init(unsigned long mem_start); +extern void hpfb_setup(char *options, int *ints); + + + +static struct { + const char *name; + unsigned long (*init)(unsigned long mem_start); + void (*setup)(char *options, int *ints); +} fb_drivers[] __initdata = { +#ifdef CONFIG_FB_RETINAZ3 + { "retz3", retz3fb_init, retz3fb_setup }, +#endif +#ifdef CONFIG_FB_AMIGA + { "amifb", amifb_init, amifb_setup }, +#endif +#ifdef CONFIG_FB_ATARI + { "atafb", atafb_init, atafb_setup }, +#endif +#ifdef CONFIG_FB_MAC + { "macfb", macfb_init, macfb_setup }, +#endif +#ifdef CONFIG_FB_CYBER + { "cyber", cyberfb_init, cyberfb_setup }, +#endif +#ifdef CONFIG_FB_CLGEN + { "clgen", clgenfb_init, clgenfb_setup }, +#endif +#ifdef CONFIG_FB_VIRTUAL + { "vfb", vfb_init, vfb_setup }, +#endif +#ifdef CONFIG_FB_OF + { "offb", offb_init, offb_setup }, +#endif +#ifdef CONFIG_FB_ATY + { "atyfb", atyfb_init, atyfb_setup }, +#endif +#ifdef CONFIG_APOLLO + { "apollo", dnfb_init, NULL }, +#endif +#ifdef CONFIG_FB_S3TRIO + { "s3trio", s3triofb_init, s3triofb_setup }, +#endif +#ifdef CONFIG_FB_TGA + { "tga", tgafb_init, NULL }, +#endif +#ifdef CONFIG_FB_VIRGE + { "virge", virgefb_init, virgefb_setup }, +#endif +#ifdef CONFIG_FB_VGA + { "vga", vgafb_init, vgafb_setup }, +#endif +#ifdef CONFIG_FB_VESA + { "vesa", vesafb_init, vesafb_setup }, +#endif +#ifdef CONFIG_FB_MDA + { "mda", mdafb_init, mdafb_setup }, +#endif +#ifdef CONFIG_FB_HP300 + { "hpfb", hpfb_init, hpfb_setup }, +#endif +#ifdef CONFIG_GSP_RESOLVER + /* Not a real frame buffer device... */ + { "resolver", NULL, resolver_video_setup }, +#endif +}; + +#define NUM_FB_DRIVERS (sizeof(fb_drivers)/sizeof(*fb_drivers)) + +static fb_init_func *pref_init_funcs[FB_MAX]; +static int num_pref_init_funcs __initdata = 0; + #define GET_INODE(i) MKDEV(FB_MAJOR, (i) << FB_MODES_SHIFT) -#define GET_FB_IDX(node) (MINOR(node) >> FB_MODES_SHIFT) #define GET_FB_VAR_IDX(node) (MINOR(node) & ((1 << FB_MODES_SHIFT)-1)) -struct fb_ops *registered_fb[FB_MAX]; -struct fb_var_screeninfo *registered_fb_var[FB_MAX]; -int registered_fb_var_num[FB_MAX]; -int fb_curr_open[FB_MAX]; -int fb_open_count[FB_MAX]; +struct fb_info *registered_fb[FB_MAX]; +int num_registered_fb = 0; + +char con2fb_map[MAX_NR_CONSOLES]; static inline int PROC_CONSOLE(void) { @@ -56,167 +171,240 @@ return MINOR(current->tty->device) - 1; } -static long -fb_read(struct inode *inode, struct file *file, char *buf, unsigned long count) +#ifdef CONFIG_PROC_FS +static int fbmem_read_proc(char *buf, char **start, off_t offset, + int len, int *eof, void *private) +{ + struct fb_info **fi; + + len = 0; + for (fi = registered_fb; fi < ®istered_fb[FB_MAX] && len < 4000; fi++) + if (*fi) + len += sprintf(buf + len, "%d %s\n", + GET_FB_IDX((*fi)->node), + (*fi)->modename); + *start = buf + offset; + return len > offset ? len - offset : 0; +} +#endif + +static ssize_t +fb_read(struct file *file, char *buf, size_t count, loff_t *ppos) { - unsigned long p = file->f_pos; - struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)]; + unsigned long p = *ppos; + struct inode *inode = file->f_dentry->d_inode; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + struct fb_ops *fb = info->fbops; struct fb_fix_screeninfo fix; char *base_addr; - int copy_size; + ssize_t copy_size; - if (! fb) + if (! fb || ! info->disp) return -ENODEV; - fb->fb_get_fix(&fix,PROC_CONSOLE()); - base_addr=(char *) fix.smem_start; + fb->fb_get_fix(&fix,PROC_CONSOLE(), info); + base_addr=info->disp->screen_base; copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p); - copy_to_user(buf, base_addr+p, copy_size); - file->f_pos += copy_size; + if (copy_to_user(buf, base_addr+p, copy_size)) + return -EFAULT; + *ppos += copy_size; return copy_size; } -static long -fb_write(struct inode *inode, struct file *file, const char *buf, - unsigned long count) +static ssize_t +fb_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { - unsigned long p = file->f_pos; - struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)]; + unsigned long p = *ppos; + struct inode *inode = file->f_dentry->d_inode; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + struct fb_ops *fb = info->fbops; struct fb_fix_screeninfo fix; char *base_addr; - int copy_size; + ssize_t copy_size; - if (! fb) + if (! fb || ! info->disp) return -ENODEV; - fb->fb_get_fix(&fix, PROC_CONSOLE()); - base_addr=(char *) fix.smem_start; + + fb->fb_get_fix(&fix, PROC_CONSOLE(), info); + base_addr=info->disp->screen_base; copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p); - copy_from_user(base_addr+p, buf, copy_size); + if (copy_from_user(base_addr+p, buf, copy_size)) + return -EFAULT; file->f_pos += copy_size; return copy_size; } +static void set_con2fb_map(int unit, int newidx) +{ + int oldidx = con2fb_map[unit]; + struct fb_info *oldfb, *newfb; + struct vc_data *conp; + + if (newidx != con2fb_map[unit]) { + oldfb = registered_fb[oldidx]; + newfb = registered_fb[newidx]; + if (newfb->fbops->fb_open(newfb)) + return; + oldfb->fbops->fb_release(oldfb); + conp = fb_display[unit].conp; + con2fb_map[unit] = newidx; + fb_display[unit] = *(newfb->disp); + fb_display[unit].conp = conp; + fb_display[unit].fb_info = newfb; + if (!newfb->changevar) + newfb->changevar = oldfb->changevar; + /* tell console var has changed */ + if (newfb->changevar) + newfb->changevar(unit); + } +} + +#ifdef CONFIG_KERNELD +static void try_to_load(int fb) +{ + char modname[16]; + + sprintf(modname, "fb%d", fb); + request_module(modname); +} +#endif + static int fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)]; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + struct fb_ops *fb = info->fbops; struct fb_cmap cmap; struct fb_var_screeninfo var; struct fb_fix_screeninfo fix; - - int i,fbidx,vidx; + struct fb_con2fbmap con2fb; + int i; if (! fb) return -ENODEV; switch (cmd) { case FBIOGET_VSCREENINFO: - i = verify_area(VERIFY_WRITE, (void *) arg, - sizeof(struct fb_var_screeninfo)); - if (i) return i; - fbidx=GET_FB_IDX(inode->i_rdev); - vidx=GET_FB_VAR_IDX(inode->i_rdev); - if (! vidx) /* ask device driver for current */ - i=fb->fb_get_var(&var, PROC_CONSOLE()); - else - var=registered_fb_var[fbidx][vidx-1]; - copy_to_user((void *) arg, &var, sizeof(var)); - return i; + if ((i = fb->fb_get_var(&var, PROC_CONSOLE(), info))) + return i; + return copy_to_user((void *) arg, &var, + sizeof(var)) ? -EFAULT : 0; case FBIOPUT_VSCREENINFO: - i = verify_area(VERIFY_WRITE, (void *) arg, - sizeof(struct fb_var_screeninfo)); - if (i) return i; - copy_from_user(&var, (void *) arg, sizeof(var)); - i=fb->fb_set_var(&var, PROC_CONSOLE()); - copy_to_user((void *) arg, &var, sizeof(var)); - fbidx=GET_FB_IDX(inode->i_rdev); - vidx=GET_FB_VAR_IDX(inode->i_rdev); - if (! i && vidx) - registered_fb_var[fbidx][vidx-1]=var; - return i; + if (copy_from_user(&var, (void *) arg, sizeof(var))) + return -EFAULT; + if ((i = fb->fb_set_var(&var, PROC_CONSOLE(), info))) + return i; + if (copy_to_user((void *) arg, &var, sizeof(var))) + return -EFAULT; + return 0; case FBIOGET_FSCREENINFO: - i = verify_area(VERIFY_WRITE, (void *) arg, - sizeof(struct fb_fix_screeninfo)); - if (i) return i; - i=fb->fb_get_fix(&fix, PROC_CONSOLE()); - copy_to_user((void *) arg, &fix, sizeof(fix)); - return i; + if ((i = fb->fb_get_fix(&fix, PROC_CONSOLE(), info))) + return i; + return copy_to_user((void *) arg, &fix, sizeof(fix)) ? + -EFAULT : 0; case FBIOPUTCMAP: - i = verify_area(VERIFY_READ, (void *) arg, - sizeof(struct fb_cmap)); - if (i) return i; - copy_from_user(&cmap, (void *) arg, sizeof(cmap)); - i = verify_area(VERIFY_READ, (void *) cmap.red, - cmap.len * sizeof(unsigned short)); - if (i) return i; - i = verify_area(VERIFY_READ, (void *) cmap.green, - cmap.len * sizeof(unsigned short)); - if (i) return i; - i = verify_area(VERIFY_READ, (void *) cmap.blue, - cmap.len * sizeof(unsigned short)); - if (i) return i; - if (cmap.transp) { - i = verify_area(VERIFY_READ, (void *) cmap.transp, - cmap.len * sizeof(unsigned short)); - if (i) return i; - } - return (fb->fb_set_cmap(&cmap, 0, PROC_CONSOLE())); + if (copy_from_user(&cmap, (void *) arg, sizeof(cmap))) + return -EFAULT; + return (fb->fb_set_cmap(&cmap, 0, PROC_CONSOLE(), info)); case FBIOGETCMAP: - i = verify_area(VERIFY_READ, (void *) arg, - sizeof(struct fb_cmap)); - if (i) return i; - copy_from_user(&cmap, (void *) arg, sizeof(cmap)); - i = verify_area(VERIFY_WRITE, (void *) cmap.red, - cmap.len * sizeof(unsigned short)); - if (i) return i; - i = verify_area(VERIFY_WRITE, (void *) cmap.green, - cmap.len * sizeof(unsigned short)); - if (i) return i; - i = verify_area(VERIFY_WRITE, (void *) cmap.blue, - cmap.len * sizeof(unsigned short)); - if (i) return i; - if (cmap.transp) { - i = verify_area(VERIFY_WRITE, (void *) cmap.transp, - cmap.len * sizeof(unsigned short)); - if (i) return i; - } - return (fb->fb_get_cmap(&cmap, 0, PROC_CONSOLE())); + if (copy_from_user(&cmap, (void *) arg, sizeof(cmap))) + return -EFAULT; + return (fb->fb_get_cmap(&cmap, 0, PROC_CONSOLE(), info)); case FBIOPAN_DISPLAY: - i = verify_area(VERIFY_WRITE, (void *) arg, - sizeof(struct fb_var_screeninfo)); - if (i) return i; - copy_from_user(&var, (void *) arg, sizeof(var)); - i=fb->fb_pan_display(&var, PROC_CONSOLE()); - copy_to_user((void *) arg, &var, sizeof(var)); - fbidx=GET_FB_IDX(inode->i_rdev); - vidx=GET_FB_VAR_IDX(inode->i_rdev); - if (! i && vidx) - registered_fb_var[fbidx][vidx-1]=var; + if (copy_from_user(&var, (void *) arg, sizeof(var))) + return -EFAULT; + if ((i=fb->fb_pan_display(&var, PROC_CONSOLE(), info))) + return i; + if (copy_to_user((void *) arg, &var, sizeof(var))) + return -EFAULT; return i; + case FBIOGET_CON2FBMAP: + if (copy_from_user(&con2fb, (void *)arg, sizeof(con2fb))) + return -EFAULT; + if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES) + return -EINVAL; + con2fb.framebuffer = con2fb_map[con2fb.console-1]; + return copy_to_user((void *)arg, &con2fb, + sizeof(con2fb)) ? -EFAULT : 0; + case FBIOPUT_CON2FBMAP: + if (copy_from_user(&con2fb, (void *)arg, sizeof(con2fb))) + return - EFAULT; + if (con2fb.console < 0 || con2fb.console > MAX_NR_CONSOLES) + return -EINVAL; + if (con2fb.framebuffer < 0 || con2fb.framebuffer >= FB_MAX) + return -EINVAL; +#ifdef CONFIG_KERNELD + if (!registered_fb[con2fb.framebuffer]) + try_to_load(con2fb.framebuffer); +#endif + if (!registered_fb[con2fb.framebuffer]) + return -EINVAL; + if (con2fb.console != 0) + set_con2fb_map(con2fb.console-1, con2fb.framebuffer); + else + /* set them all */ + for (i = 0; i < MAX_NR_CONSOLES; i++) + set_con2fb_map(i, con2fb.framebuffer); + return 0; default: - return (fb->fb_ioctl(inode, file, cmd, arg, PROC_CONSOLE())); + return fb->fb_ioctl(inode, file, cmd, arg, PROC_CONSOLE(), + info); } } -static int fb_mmap(struct file *file, struct vm_area_struct * vma) +static int +fb_mmap(struct file *file, struct vm_area_struct * vma) { - struct fb_ops *fb = registered_fb[GET_FB_IDX(file->f_dentry->d_inode->i_rdev)]; + int fbidx = GET_FB_IDX(file->f_dentry->d_inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + struct fb_ops *fb = info->fbops; struct fb_fix_screeninfo fix; + struct fb_var_screeninfo var; + unsigned long start; + u32 len; - if (! fb) + if (!fb) return -ENODEV; - fb->fb_get_fix(&fix, PROC_CONSOLE()); - if ((vma->vm_end - vma->vm_start + vma->vm_offset) > fix.smem_len) + fb->fb_get_fix(&fix, PROC_CONSOLE(), info); + + /* frame buffer memory */ + start = (unsigned long)fix.smem_start; + len = (start & ~PAGE_MASK)+fix.smem_len; + start &= PAGE_MASK; + len = (len+~PAGE_MASK) & PAGE_MASK; + if (vma->vm_offset >= len) { + /* memory mapped io */ + vma->vm_offset -= len; + fb->fb_get_var(&var, PROC_CONSOLE(), info); + if (var.accel_flags) + return -EINVAL; + start = (unsigned long)fix.mmio_start; + len = (start & ~PAGE_MASK)+fix.mmio_len; + start &= PAGE_MASK; + len = (len+~PAGE_MASK) & PAGE_MASK; + } + if ((vma->vm_end - vma->vm_start + vma->vm_offset) > len) return -EINVAL; - vma->vm_offset += __pa(fix.smem_start); + vma->vm_offset += start; if (vma->vm_offset & ~PAGE_MASK) return -ENXIO; +#if defined(__mc68000__) + if (CPU_IS_020_OR_030) + pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE030; if (CPU_IS_040_OR_060) { pgprot_val(vma->vm_page_prot) &= _CACHEMASK040; - /* Use write-through cache mode */ + /* Use no-cache mode, serialized */ pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE_S; } +#elif defined(__powerpc__) + pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE|_PAGE_GUARDED; +#else +#warning What do we have to do here?? +#endif if (remap_page_range(vma->vm_start, vma->vm_offset, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; @@ -228,34 +416,25 @@ static int fb_open(struct inode *inode, struct file *file) { - int fbidx=GET_FB_IDX(inode->i_rdev); - int vidx=GET_FB_VAR_IDX(inode->i_rdev); - struct fb_ops *fb = registered_fb[fbidx]; - int err; - - if (! vidx) /* fb?current always succeeds */ - return 0; - if (vidx > registered_fb_var_num[fbidx]) - return -EINVAL; - if (fb_curr_open[fbidx] && fb_curr_open[fbidx] != vidx) - return -EBUSY; - if (file->f_mode & 2) /* only set parameters if opened writeable */ - if ((err=fb->fb_set_var(registered_fb_var[fbidx] + vidx-1, PROC_CONSOLE()))) - return err; - fb_curr_open[fbidx] = vidx; - fb_open_count[fbidx]++; - return 0; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info; + +#ifdef CONFIG_KERNELD + if (!(info = registered_fb[fbidx])) + try_to_load(fbidx); +#endif + if (!(info = registered_fb[fbidx])) + return -ENODEV; + return info->fbops->fb_open(info); } static int fb_release(struct inode *inode, struct file *file) { - int fbidx=GET_FB_IDX(inode->i_rdev); - int vidx=GET_FB_VAR_IDX(inode->i_rdev); - if (! vidx) - return 0; - if (! (--fb_open_count[fbidx])) - fb_curr_open[fbidx]=0; + int fbidx = GET_FB_IDX(inode->i_rdev); + struct fb_info *info = registered_fb[fbidx]; + + info->fbops->fb_release(info); return 0; } @@ -273,37 +452,181 @@ }; int -register_framebuffer(char *id, int *node, struct fb_ops *fbops, int fbvar_num, - struct fb_var_screeninfo *fbvar) +register_framebuffer(struct fb_info *fb_info) { - int i; + int i, j; + static int fb_ever_opened[FB_MAX]; + + if (num_registered_fb == FB_MAX) + return -ENXIO; + num_registered_fb++; for (i = 0 ; i < FB_MAX; i++) - if (! registered_fb[i]) + if (!registered_fb[i]) break; - if (i == FB_MAX) - return -ENXIO; - registered_fb[i]=fbops; - registered_fb_var[i]=fbvar; - registered_fb_var_num[i]=fbvar_num; - *node=GET_INODE(i); + fb_info->node=GET_INODE(i); + registered_fb[i] = fb_info; + if (!fb_ever_opened[i]) { + /* + * We assume initial frame buffer devices can be opened this + * many times + */ + for (j = 0; j < MAX_NR_CONSOLES; j++) + if (con2fb_map[j] == i) + fb_info->fbops->fb_open(fb_info); + fb_ever_opened[i] = 1; + } return 0; } int -unregister_framebuffer(int node) +unregister_framebuffer(const struct fb_info *fb_info) { - int i=GET_FB_IDX(node); - if (! registered_fb[i]) + int i, j; + + i = GET_FB_IDX(fb_info->node); + for (j = 0; j < MAX_NR_CONSOLES; j++) + if (con2fb_map[j] == i) + return -EBUSY; + if (!registered_fb[i]) return -EINVAL; registered_fb[i]=NULL; - registered_fb_var[i]=NULL; + num_registered_fb--; return 0; } +#ifdef CONFIG_PROC_FS +static struct proc_dir_entry *proc_fbmem; +#endif + __initfunc(void fbmem_init(void)) { +#ifdef CONFIG_PROC_FS + proc_fbmem = create_proc_entry("fb", 0, 0); + if (proc_fbmem) + proc_fbmem->read_proc = fbmem_read_proc; +#endif + if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) printk("unable to get major %d for fb devs\n", FB_MAJOR); } + +int fbmon_valid_timings(u_int pixclock, u_int htotal, u_int vtotal, + const struct fb_info *fb_info) +{ +#if 0 + /* + * long long divisions .... $#%%#$ + */ + unsigned long long hpicos, vpicos; + const unsigned long long _1e12 = 1000000000000ULL; + const struct fb_monspecs *monspecs = &fb_info->monspecs; + + hpicos = (unsigned long long)htotal*(unsigned long long)pixclock; + vpicos = (unsigned long long)vtotal*(unsigned long long)hpicos; + if (!vpicos) + return 0; + + if (monspecs->hfmin == 0) + return 1; + + if (hpicos*monspecs->hfmin > _1e12 || hpicos*monspecs->hfmax < _1e12 || + vpicos*monspecs->vfmin > _1e12 || vpicos*monspecs->vfmax < _1e12) + return 0; +#endif + return 1; +} + +int fbmon_dpms(const struct fb_info *fb_info) +{ + return fb_info->monspecs.dpms; +} + + + /* + * Probe for all builtin frame buffer devices + */ + +__initfunc(unsigned long probe_framebuffers(unsigned long kmem_start)) +{ + int i; + + for (i = 0; i < num_pref_init_funcs; i++) + kmem_start = pref_init_funcs[i](kmem_start); + + for (i = 0; i < NUM_FB_DRIVERS; i++) + if (fb_drivers[i].init) + kmem_start = fb_drivers[i].init(kmem_start); + + return kmem_start; +} + + + /* + * Command line options + */ + +__initfunc(void video_setup(char *options, int *ints)) +{ + int i, j; + + if (!options || !*options) + return; + + if (!strncmp(options, "map:", 4)) { + options += 4; + if (*options) + for (i = 0, j = 0; i < MAX_NR_CONSOLES; i++) { + if (!options[j]) + j = 0; + con2fb_map[i] = (options[j++]-'0') % FB_MAX; + } + return; + } + + if (num_pref_init_funcs == FB_MAX) + return; + + for (i = 0; i < NUM_FB_DRIVERS; i++) { + j = strlen(fb_drivers[i].name); + if (!strncmp(options, fb_drivers[i].name, j) && + options[j] == ':') { + if (!strcmp(options+j+1, "off")) + fb_drivers[i].init = NULL; + else { + if (fb_drivers[i].init) { + pref_init_funcs[num_pref_init_funcs++] = + fb_drivers[i].init; + fb_drivers[i].init = NULL; + } + if (fb_drivers[i].setup) + fb_drivers[i].setup(options+j+1, ints); + } + return; + } + } + /* + * If we get here no fb was specified and we default to pass the + * options to the first frame buffer that has an init and a setup + * fuction. + */ + for (i = 0; i < NUM_FB_DRIVERS; i++) { + if (fb_drivers[i].init && fb_drivers[i].setup) { + pref_init_funcs[num_pref_init_funcs++] = + fb_drivers[i].init; + fb_drivers[i].init = NULL; + + fb_drivers[i].setup(options, ints); + return; + } + } +} + + + /* + * Visible symbols for modules + */ + +EXPORT_SYMBOL(register_framebuffer); +EXPORT_SYMBOL(unregister_framebuffer); diff -u --recursive --new-file v2.1.106/linux/drivers/char/h8.c linux/drivers/char/h8.c --- v2.1.106/linux/drivers/char/h8.c Sat Sep 6 10:16:07 1997 +++ linux/drivers/char/h8.c Wed Jun 24 14:30:09 1998 @@ -775,7 +775,7 @@ case H8_RD_SN: case H8_RD_ENET_ADDR: - printk("H8: Read ethernet addr - command done - address: %x - %x - %x - %x - %x - %x \n", + printk("H8: read Ethernet address: command done - address: %x - %x - %x - %x - %x - %x \n", qp->rcvbuf[0], qp->rcvbuf[1], qp->rcvbuf[2], qp->rcvbuf[3], qp->rcvbuf[4], qp->rcvbuf[5]); QUEUE_ENTER(&h8_freeq, qp, link, h8_cmd_q_t *); @@ -908,7 +908,7 @@ } /* - * Retrieve the current cpu temperature and case temperature. Provides + * Retrieve the current CPU temperature and case temperature. Provides * the feedback for the thermal control algorithm. Synchcronized via * sleep() for priority so that no other actions in the process will take * place before the data becomes available. @@ -954,7 +954,7 @@ /* * Assigns an upper limit to the value of the H8 thermal interrupt. * As an example setting a value of 115 F here will cause the - * interrupt to trigger when the cpu temperature reaches 115 F. + * interrupt to trigger when the CPU temperature reaches 115 F. */ static void h8_set_upper_therm_thold(int thold) @@ -1072,7 +1072,7 @@ /* * If an external DC supply is removed or added make - * appropriate cpu speed adjustments. + * appropriate CPU speed adjustments. */ if (h8_event_mask & H8_MANAGE_BATTERY) { h8_run_level_3_manage(H8_RUN); @@ -1106,7 +1106,7 @@ h8_set_cpu_speed(h8_udamp); h8_clear_event_mask(H8_MANAGE_UTHERM); h8_set_event_mask(H8_MANAGE_LTHERM); - /* Check again in 30 seconds for cpu temperature */ + /* Check again in 30 seconds for CPU temperature */ h8_start_monitor_timer(H8_TIMEOUT_INTERVAL); } else if (h8_event_mask & H8_MANAGE_LTHERM) { /* See how cool the system has become as a result @@ -1116,7 +1116,7 @@ if (curr_temp[0] < (h8_uthermal_threshold - h8_uthermal_window)) { /* System cooling has progressed to a point - that the cpu may be speeded up. */ + that the CPU may be sped up. */ h8_set_upper_therm_thold(h8_uthermal_threshold); h8_set_cpu_speed(h8_ldamp); /* adjustable */ if(h8_debug & 0x10) @@ -1144,7 +1144,7 @@ /* * global_rpb_counter is consumed by alpha_delay() in determining just * how much time to delay. It is necessary that the number of microseconds - * in DELAY(n) be kept consistent over a variety of cpu clock speeds. + * in DELAY(n) be kept consistent over a variety of CPU clock speeds. * To that end global_rpb_counter is here adjusted. */ @@ -1183,7 +1183,7 @@ } /* - * Gets value stored in rpb representing cpu clock speed and adjusts this + * Gets value stored in rpb representing CPU clock speed and adjusts this * value based on the current clock speed divisor. */ u_long diff -u --recursive --new-file v2.1.106/linux/drivers/char/h8.h linux/drivers/char/h8.h --- v2.1.106/linux/drivers/char/h8.h Sat Sep 6 10:16:07 1997 +++ linux/drivers/char/h8.h Wed Jun 24 14:30:09 1998 @@ -183,7 +183,7 @@ #define H8_SYSTEM_DELAY_TEST 0x100000 #define H8_POWER_SWITCH_TEST 0x200000 -/* cpu speeds and clock divisor values */ +/* CPU speeds and clock divisor values */ #define MHZ_14 5 #define MHZ_28 4 #define MHZ_57 3 diff -u --recursive --new-file v2.1.106/linux/drivers/char/i2c.h linux/drivers/char/i2c.h --- v2.1.106/linux/drivers/char/i2c.h Wed Apr 8 19:36:26 1998 +++ linux/drivers/char/i2c.h Wed Jun 24 14:30:09 1998 @@ -6,7 +6,7 @@ * There are: * * i2c the basic control module (like scsi_mod) - * bus driver a driver with a i2c bus (hostadapter driver) + * 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) * diff -u --recursive --new-file v2.1.106/linux/drivers/char/istallion.c linux/drivers/char/istallion.c --- v2.1.106/linux/drivers/char/istallion.c Sun Jun 7 11:16:30 1998 +++ linux/drivers/char/istallion.c Mon Jun 22 23:00:51 1998 @@ -170,7 +170,7 @@ */ static char *stli_drvtitle = "Stallion Intelligent Multiport Serial Driver"; static char *stli_drvname = "istallion"; -static char *stli_drvversion = "5.4.5"; +static char *stli_drvversion = "5.4.6"; static char *stli_serialname = "ttyE"; static char *stli_calloutname = "cue"; @@ -1425,12 +1425,12 @@ (tail - head - 1); count = MIN(len, count); EBRDDISABLE(brdp); + restore_flags(flags); down(&stli_tmpwritesem); copy_from_user(stli_tmpwritebuf, chbuf, count); up(&stli_tmpwritesem); chbuf = &stli_tmpwritebuf[0]; - restore_flags(flags); } /* diff -u --recursive --new-file v2.1.106/linux/drivers/char/mem.c linux/drivers/char/mem.c --- v2.1.106/linux/drivers/char/mem.c Tue Jun 23 10:01:22 1998 +++ linux/drivers/char/mem.c Wed Jun 24 14:44:00 1998 @@ -41,8 +41,8 @@ #ifdef CONFIG_VIDEO_DEV extern int videodev_init(void); #endif -#if defined(CONFIG_FB) -extern void fbmem_init( void ); +#ifdef CONFIG_FB +extern void fbmem_init(void); #endif static ssize_t do_write_mem(struct file * file, void *p, unsigned long realp, @@ -63,7 +63,7 @@ written+=sz; } #endif - if (copy_from_user(p, buf, count) < 0) + if (copy_from_user(p, buf, count)) return -EFAULT; written += count; *ppos += written; @@ -104,7 +104,7 @@ } } #endif - if (copy_to_user(buf, __va(p), count) < 0) + if (copy_to_user(buf, __va(p), count)) return -EFAULT; read += count; *ppos += read; @@ -552,7 +552,7 @@ #endif #ifdef CONFIG_JOYSTICK /* - * Some joysticks only appear when the soundcard they are + * Some joysticks only appear when the sound card they are * connected to is configured. Keep the sound/joystick ordering. */ js_init(); diff -u --recursive --new-file v2.1.106/linux/drivers/char/msp3400.c linux/drivers/char/msp3400.c --- v2.1.106/linux/drivers/char/msp3400.c Tue Jun 23 10:01:22 1998 +++ linux/drivers/char/msp3400.c Wed Jun 24 14:30:09 1998 @@ -5,17 +5,17 @@ * * what works and what doesn't: * - * AM-Mono + * AM mono * probably doesn't (untested) * - * FM-Mono - * should work. The stereo modes are backward compatible to FM-mono, - * therefore FM-Mono should be allways available. + * FM-mono + * should work. FM stereo modes are backward-compatible to mono. + * Therefore FM mono should always be available. * - * FM-Stereo (B/G, used in germany) + * FM stereo (B/G, used in Germany) * should work, with autodetect * - * FM-Stereo (satellite) + * FM stereo (satellite) * should work, no autodetect (i.e. default is mono, but you can * switch to stereo -- untested) * @@ -605,7 +605,7 @@ dprintk("msp3400: carrier2 val: %5d / %s\n", val,cd[this].name); } - /* programm the msp3400 according to the results */ + /* program the msp3400 according to the results */ switch (max1) { case 0: /* 4.5 */ case 1: /* 5.5 */ diff -u --recursive --new-file v2.1.106/linux/drivers/char/random.c linux/drivers/char/random.c --- v2.1.106/linux/drivers/char/random.c Tue Jun 23 10:01:22 1998 +++ linux/drivers/char/random.c Wed Jun 24 14:30:09 1998 @@ -1715,9 +1715,9 @@ /* * As close as possible to RFC 793, which - * suggests using a 250kHz clock. - * Further reading shows this assumes 2Mb/s networks. - * For 10Mb/s ethernet, a 1MHz clock is appropriate. + * suggests using a 250 kHz clock. + * Further reading shows this assumes 2 Mb/s networks. + * For 10 Mb/s Ethernet, a 1 MHz clock is appropriate. * That's funny, Linux has one built in! Use it! * (Networks are faster now - should this be increased?) */ diff -u --recursive --new-file v2.1.106/linux/drivers/char/rtc.c linux/drivers/char/rtc.c --- v2.1.106/linux/drivers/char/rtc.c Thu May 7 22:51:49 1998 +++ linux/drivers/char/rtc.c Wed Jun 24 14:16:31 1998 @@ -134,11 +134,8 @@ rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0); wake_up_interruptible(&rtc_wait); - if (rtc_status & RTC_TIMER_ON) { - del_timer(&rtc_irq_timer); - rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100; - add_timer(&rtc_irq_timer); - } + if (rtc_status & RTC_TIMER_ON) + mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100); } /* @@ -596,9 +593,7 @@ unsigned long flags; printk(KERN_INFO "rtc: lost some interrupts at %ldHz.\n", rtc_freq); - del_timer(&rtc_irq_timer); - rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100; - add_timer(&rtc_irq_timer); + mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100); save_flags(flags); cli(); diff -u --recursive --new-file v2.1.106/linux/drivers/char/selection.c linux/drivers/char/selection.c --- v2.1.106/linux/drivers/char/selection.c Mon Feb 23 18:12:04 1998 +++ linux/drivers/char/selection.c Wed Jun 24 14:44:00 1998 @@ -22,6 +22,7 @@ #include #include +#include #include #ifndef MIN @@ -120,15 +121,11 @@ int sel_mode, new_sel_start, new_sel_end, spc; char *bp, *obp; int i, ps, pe; - unsigned long num_lines, num_columns, size_row; + unsigned int currcons = fg_console; do_unblank_screen(); poke_blanked_console(); - num_lines = get_video_num_lines(fg_console); - num_columns = get_video_num_columns(fg_console); - size_row = get_video_size_row(fg_console); - { unsigned short *args, xs, ys, xe, ye; args = (unsigned short *)(arg + 1); @@ -150,12 +147,12 @@ sel_mode = *args; } xs--; ys--; xe--; ye--; - xs = limit(xs, num_columns - 1); - ys = limit(ys, num_lines - 1); - xe = limit(xe, num_columns - 1); - ye = limit(ye, num_lines - 1); - ps = ys * size_row + (xs << 1); - pe = ye * size_row + (xe << 1); + xs = limit(xs, video_num_columns - 1); + ys = limit(ys, video_num_lines - 1); + xe = limit(xe, video_num_columns - 1); + ye = limit(ye, video_num_lines - 1); + ps = ys * video_size_row + (xs << 1); + pe = ye * video_size_row + (xe << 1); if (sel_mode == 4) { /* useful for screendump without selection highlights */ @@ -195,7 +192,7 @@ (!spc && !inword(sel_pos(ps)))) break; new_sel_start = ps; - if (!(ps % size_row)) + if (!(ps % video_size_row)) break; } spc = isspace(sel_pos(pe)); @@ -205,14 +202,14 @@ (!spc && !inword(sel_pos(pe)))) break; new_sel_end = pe; - if (!((pe + 2) % size_row)) + if (!((pe + 2) % video_size_row)) break; } break; case 2: /* line-by-line selection */ - new_sel_start = ps - ps % size_row; - new_sel_end = pe + size_row - - pe % size_row - 2; + new_sel_start = ps - ps % video_size_row; + new_sel_end = pe + video_size_row + - pe % video_size_row - 2; break; case 3: highlight_pointer(pe); @@ -226,9 +223,11 @@ /* select to end of line if on trailing space */ if (new_sel_end > new_sel_start && - !atedge(new_sel_end, size_row) && isspace(sel_pos(new_sel_end))) { + !atedge(new_sel_end, video_size_row) && + isspace(sel_pos(new_sel_end))) { for (pe = new_sel_end + 2; ; pe += 2) - if (!isspace(sel_pos(pe)) || atedge(pe, size_row)) + if (!isspace(sel_pos(pe)) || + atedge(pe, video_size_row)) break; if (isspace(sel_pos(pe))) new_sel_end = pe; @@ -273,7 +272,7 @@ *bp = sel_pos(i); if (!isspace(*bp++)) obp = bp; - if (! ((i + 2) % size_row)) { + if (! ((i + 2) % video_size_row)) { /* strip trailing blanks from line and add newline, unless non-space at end of line. */ if (obp != bp) { diff -u --recursive --new-file v2.1.106/linux/drivers/char/stallion.c linux/drivers/char/stallion.c --- v2.1.106/linux/drivers/char/stallion.c Sun Jun 7 11:16:30 1998 +++ linux/drivers/char/stallion.c Mon Jun 22 23:00:51 1998 @@ -142,7 +142,7 @@ */ static char *stl_drvtitle = "Stallion Multiport Serial Driver"; static char *stl_drvname = "stallion"; -static char *stl_drvversion = "5.4.5"; +static char *stl_drvversion = "5.4.6"; static char *stl_serialname = "ttyE"; static char *stl_calloutname = "cue"; @@ -1082,7 +1082,6 @@ { stlport_t *portp; unsigned int len, stlen; - unsigned long flags; unsigned char *chbuf; char *head, *tail; @@ -1114,12 +1113,9 @@ (tail - head - 1); count = MIN(len, count); - save_flags(flags); - cli(); down(&stl_tmpwritesem); copy_from_user(stl_tmpwritebuf, chbuf, count); up(&stl_tmpwritesem); - restore_flags(flags); chbuf = &stl_tmpwritebuf[0]; } diff -u --recursive --new-file v2.1.106/linux/drivers/char/tga.c linux/drivers/char/tga.c --- v2.1.106/linux/drivers/char/tga.c Fri Apr 10 13:03:48 1998 +++ linux/drivers/char/tga.c Wed Dec 31 16:00:00 1969 @@ -1,1169 +0,0 @@ -/* - * linux/drivers/char/tga.c - * - * Copyright (C) 1995 Jay Estabrook - */ - -/* - * tga.c - * - * This module exports the console io support for DEC's TGA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -extern struct console vt_console_driver; - -/* TGA hardware description (minimal) */ -/* - * Offsets within Memory Space - */ -#define TGA_ROM_OFFSET 0x0000000 -#define TGA_REGS_OFFSET 0x0100000 -#define TGA_8PLANE_FB_OFFSET 0x0200000 -#define TGA_24PLANE_FB_OFFSET 0x0804000 -#define TGA_24PLUSZ_FB_OFFSET 0x1004000 - -#define TGA_PLANEMASK_REG 0x0028 -#define TGA_MODE_REG 0x0030 -#define TGA_RASTEROP_REG 0x0034 -#define TGA_DEEP_REG 0x0050 -#define TGA_PIXELMASK_REG 0x005c -#define TGA_CURSOR_BASE_REG 0x0060 -#define TGA_HORIZ_REG 0x0064 -#define TGA_VERT_REG 0x0068 -#define TGA_BASE_ADDR_REG 0x006c -#define TGA_VALID_REG 0x0070 -#define TGA_CURSOR_XY_REG 0x0074 -#define TGA_INTR_STAT_REG 0x007c -#define TGA_RAMDAC_SETUP_REG 0x00c0 -#define TGA_BLOCK_COLOR0_REG 0x0140 -#define TGA_BLOCK_COLOR1_REG 0x0144 -#define TGA_CLOCK_REG 0x01e8 -#define TGA_RAMDAC_REG 0x01f0 -#define TGA_CMD_STAT_REG 0x01f8 - -/* - * useful defines for managing the BT485 on the 8-plane TGA - */ -#define BT485_READ_BIT 0x01 -#define BT485_WRITE_BIT 0x00 - -#define BT485_ADDR_PAL_WRITE 0x00 -#define BT485_DATA_PAL 0x02 -#define BT485_PIXEL_MASK 0x04 -#define BT485_ADDR_PAL_READ 0x06 -#define BT485_ADDR_CUR_WRITE 0x08 -#define BT485_DATA_CUR 0x0a -#define BT485_CMD_0 0x0c -#define BT485_ADDR_CUR_READ 0x0e -#define BT485_CMD_1 0x10 -#define BT485_CMD_2 0x12 -#define BT485_STATUS 0x14 -#define BT485_CMD_3 0x14 -#define BT485_CUR_RAM 0x16 -#define BT485_CUR_LOW_X 0x18 -#define BT485_CUR_HIGH_X 0x1a -#define BT485_CUR_LOW_Y 0x1c -#define BT485_CUR_HIGH_Y 0x1e - -/* - * useful defines for managing the BT463 on the 24-plane TGAs - */ -#define BT463_ADDR_LO 0x0 -#define BT463_ADDR_HI 0x1 -#define BT463_REG_ACC 0x2 -#define BT463_PALETTE 0x3 - -#define BT463_CUR_CLR_0 0x0100 -#define BT463_CUR_CLR_1 0x0101 - -#define BT463_CMD_REG_0 0x0201 -#define BT463_CMD_REG_1 0x0202 -#define BT463_CMD_REG_2 0x0203 - -#define BT463_READ_MASK_0 0x0205 -#define BT463_READ_MASK_1 0x0206 -#define BT463_READ_MASK_2 0x0207 -#define BT463_READ_MASK_3 0x0208 - -#define BT463_BLINK_MASK_0 0x0209 -#define BT463_BLINK_MASK_1 0x020a -#define BT463_BLINK_MASK_2 0x020b -#define BT463_BLINK_MASK_3 0x020c - -#define BT463_WINDOW_TYPE_BASE 0x0300 - -/* - * built-in font management constants - * - * NOTE: the built-in font is 8x16, and the video resolution - * is 640x480 @ 60Hz. - * This means we could put 30 rows of text on the screen (480/16). - * However, we wish to make then TGA look just like a VGA, as the - * default, so, we pad the character to 8x18, and leave some scan - * lines at the bottom unused. - */ -#define TGA_F_WIDTH 8 -#define TGA_F_HEIGHT 16 -#define TGA_F_HEIGHT_PADDED 18 - -int tga_type; -unsigned long tga_mem_base; -unsigned long tga_fb_base; -unsigned long tga_regs_base; -unsigned int tga_bpp, tga_fb_width, tga_fb_height, tga_fb_stride; - -static unsigned int fb_offset_presets[4] __initdata = { - TGA_8PLANE_FB_OFFSET, - TGA_24PLANE_FB_OFFSET, - 0xffffffff, - TGA_24PLUSZ_FB_OFFSET -}; - -static unsigned int deep_presets[4] __initdata = { - 0x00014000, - 0x0001440d, - 0xffffffff, - 0x0001441d -}; - -static unsigned int rasterop_presets[4] __initdata = { - 0x00000003, - 0x00000303, - 0xffffffff, - 0x00000303 -}; - -static unsigned int mode_presets[4] __initdata = { - 0x00002000, - 0x00002300, - 0xffffffff, - 0x00002300 -}; - -static unsigned int base_addr_presets[4] __initdata = { - 0x00000000, - 0x00000001, - 0xffffffff, - 0x00000001 -}; - -#define TGA_WRITE_REG(v,r) \ - { writel((v), tga_regs_base+(r)); mb(); } - -#define TGA_READ_REG(r) readl(tga_regs_base+(r)) - -#define BT485_WRITE(v,r) \ - TGA_WRITE_REG((r),TGA_RAMDAC_SETUP_REG); \ - TGA_WRITE_REG(((v)&0xff)|((r)<<8),TGA_RAMDAC_REG); - -#define BT463_LOAD_ADDR(a) \ - TGA_WRITE_REG(BT463_ADDR_LO<<2, TGA_RAMDAC_SETUP_REG); \ - TGA_WRITE_REG((BT463_ADDR_LO<<10)|((a)&0xff), TGA_RAMDAC_REG); \ - TGA_WRITE_REG(BT463_ADDR_HI<<2, TGA_RAMDAC_SETUP_REG); \ - TGA_WRITE_REG((BT463_ADDR_HI<<10)|(((a)>>8)&0xff), TGA_RAMDAC_REG); - -#define BT463_WRITE(m,a,v) \ - BT463_LOAD_ADDR((a)); \ - TGA_WRITE_REG(((m)<<2),TGA_RAMDAC_SETUP_REG); \ - TGA_WRITE_REG(((m)<<10)|((v)&0xff),TGA_RAMDAC_REG); - -extern char tga_builtin_font[]; - -void tga_init_video(void); -void tga_clear_screen(void); - -void -set_palette (void) -{ - int i, j; - - if (console_blanked || vt_cons[fg_console]->vc_mode == KD_GRAPHICS) - return; - - - if (tga_type == 0) { /* 8-plane */ - BT485_WRITE(0x00, BT485_ADDR_PAL_WRITE); - TGA_WRITE_REG(BT485_DATA_PAL, TGA_RAMDAC_SETUP_REG); - - for (i = 0; i < 16; i++) { - j = color_table[i]; - TGA_WRITE_REG(default_red[j]|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG); - TGA_WRITE_REG(default_grn[j]|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG); - TGA_WRITE_REG(default_blu[j]|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG); - } - } else { - BT463_LOAD_ADDR(0x0000); - TGA_WRITE_REG((BT463_PALETTE<<2), TGA_RAMDAC_REG); - - for (i = 0; i < 16; i++) { - j = color_table[i]; - TGA_WRITE_REG(default_red[j]|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(default_grn[j]|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(default_blu[j]|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - } - } -} - -void -__set_origin(unsigned short offset) -{ - /* - * should not be called, but if so, do nothing... - */ -} - -/* - * Hide the cursor from view, during blanking, usually... - */ -void -hide_cursor(void) -{ - unsigned long flags; - save_flags(flags); cli(); - - if (tga_type == 0) { - BT485_WRITE(0x20, BT485_CMD_2); - } else { - TGA_WRITE_REG(0x03, TGA_VALID_REG); /* SCANNING and BLANK */ - } - - restore_flags(flags); -} - -void -set_cursor(int currcons) -{ - unsigned int idx, xt, yt, row, col; - unsigned long flags; - - if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS) - return; - - if (__real_origin != __origin) - __set_origin(__real_origin); - - save_flags(flags); cli(); - - if (deccm) { - idx = (pos - video_mem_base) >> 1; - col = idx % 80; - row = (idx - col) / 80; - - if (tga_type == 0) { /* 8-plane */ - - xt = col * TGA_F_WIDTH + 64; - yt = row * TGA_F_HEIGHT_PADDED + 64; - - /* make sure it's enabled */ - BT485_WRITE(0x22, BT485_CMD_2); /* WIN cursor type */ - - BT485_WRITE(xt, BT485_CUR_LOW_X); - BT485_WRITE((xt >> 8), BT485_CUR_HIGH_X); - BT485_WRITE(yt, BT485_CUR_LOW_Y); - BT485_WRITE((yt >> 8), BT485_CUR_HIGH_Y); - - } else { - - xt = col * TGA_F_WIDTH + 144; - yt = row * TGA_F_HEIGHT_PADDED + 35; - - TGA_WRITE_REG(0x05, TGA_VALID_REG); /* SCANNING and CURSOR */ - TGA_WRITE_REG(xt | (yt << 12), TGA_CURSOR_XY_REG); - } - - } else - hide_cursor(); - restore_flags(flags); -} - -__initfunc(unsigned long -con_type_init(unsigned long kmem_start, const char **display_desc)) -{ - can_do_color = 1; - - /* - * fake the screen memory with some CPU memory - */ - video_mem_base = kmem_start; - kmem_start += video_screen_size; - video_mem_term = kmem_start; - - video_type = VIDEO_TYPE_TGAC; - - *display_desc = "TGA"; - - return kmem_start; -} - -__initfunc(void -con_type_init_finish(void)) -{ -} - -/* - * NOTE: get_scrmem() and set_scrmem() are here only because - * the VGA version of set_scrmem() has some direct VGA references. - */ -void -get_scrmem(int currcons) -{ - memcpyw((unsigned short *)vc_scrbuf[currcons], - (unsigned short *)origin, video_screen_size); - origin = video_mem_start = (unsigned long)vc_scrbuf[currcons]; - scr_end = video_mem_end = video_mem_start + video_screen_size; - pos = origin + y*video_size_row + (x<<1); -} - -void -set_scrmem(int currcons, long offset) -{ - if (video_mem_term - video_mem_base < offset + video_screen_size) - offset = 0; /* strange ... */ - memcpyw((unsigned short *)(video_mem_base + offset), - (unsigned short *) origin, video_screen_size); - video_mem_start = video_mem_base; - video_mem_end = video_mem_term; - origin = video_mem_base + offset; - scr_end = origin + video_screen_size; - pos = origin + y*video_size_row + (x<<1); -} - -/* - * PIO_FONT support. - * - * for now, we will use/allow *only* our built-in font... - */ -int -set_get_font(char * arg, int set, int ch512) -{ - return -EINVAL; -} - -/* - * Adjust the screen to fit a font of a certain height - * - * Returns < 0 for error, 0 if nothing changed, and the number - * of lines on the adjusted console if changed. - * - * for now, we only support the built-in font... - */ -int -con_adjust_height(unsigned long fontheight) -{ - return -EINVAL; -} - -/* NOTE: - * this is here, and not in console.c, because the VGA version - * tests the controller type to see if color can be done. We *KNOW* - * that we can do color on the TGA... :-) - * - * FIXME? maybe the init codes for VGA and TGA could set - * a flag for (in)ability to do colormap set/get??? - */ - -int -set_get_cmap(unsigned char * arg, int set) { - int i; - - i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, 16*3); - if (i) - return i; - - for (i=0; i<16; i++) { - if (set) { - get_user(default_red[i], arg++) ; - get_user(default_grn[i], arg++) ; - get_user(default_blu[i], arg++) ; - } else { - put_user (default_red[i], arg++) ; - put_user (default_grn[i], arg++) ; - put_user (default_blu[i], arg++) ; - } - } - if (set) { - for (i=0; ivc_palette[k++] = default_red[j]; - vc_cons[i].d->vc_palette[k++] = default_grn[j]; - vc_cons[i].d->vc_palette[k++] = default_blu[j]; - } - } - set_palette() ; - } - - return 0; -} - -/* - * dummy routines for the VESA blanking code, which is VGA only, - * so we don't have to carry that stuff around for the TGA... - */ -void vesa_powerdown(void) -{ -} -void vesa_blank(void) -{ -} -void vesa_unblank(void) -{ -} -void set_vesa_blanking(const unsigned long arg) -{ -} - - -/* - * See if we have a TGA card. - * Just a placeholder at the moment, because of the strange - * way the TGA card is initialized. This has to be enabled when - * the kernel initializes PCI devices before the console. - */ -__initfunc(int con_is_present(void)) -{ -#if 0 - unsigned char pci_bus, pci_devfn; - int status; - - status = pcibios_find_device (PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA, - 0, &pci_bus, &pci_devfn); - return (status == PCIBIOS_DEVICE_NOT_FOUND) ? 0 : 1; -#endif - return 1; -} - -/* - * video init code, called from within the PCI bus probing code; - * when TGA console is configured, at the end of the probing code, - * we call here to look for a TGA device, and proceed... - */ -__initfunc(void -tga_console_init(void)) -{ - struct pci_dev *dev; - - /* - * first, find the TGA among the PCI devices... - */ - if (! (dev = pci_find_device(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA, NULL))) { - /* PANIC!!! */ - printk("tga_console_init: TGA not found!!! :-(\n"); - return; - } - - /* - * read BASE_REG_0 for memory address - */ - tga_mem_base = dev->base_address[0] & PCI_BASE_ADDRESS_MEM_MASK; -#ifdef DEBUG - printk("tga_console_init: mem_base 0x%lx\n", tga_mem_base); -#endif /* DEBUG */ - - tga_type = (readl(tga_mem_base) >> 12) & 0x0f; - if (tga_type != 0 && tga_type != 1 && tga_type != 3) { - printk("TGA type (0x%x) unrecognized!\n", tga_type); - return; - } - tga_init_video(); - tga_clear_screen(); - - /* - * FINALLY, we can register TGA as console (whew!) - */ -#ifdef CONFIG_VT_CONSOLE - register_console(&vt_console_driver); -#endif -} - -unsigned char PLLbits[7] __initdata = { 0x80, 0x04, 0x00, 0x24, 0x44, 0x80, 0xb8 }; - -const unsigned long bt485_cursor_source[64] __initdata = { - 0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff, - 0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff, - 0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff, - 0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -}; - -const unsigned int bt463_cursor_source[256] __initdata = { - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0xffff0000, 0x00000000, 0x00000000, 0x00000000, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -}; - -__initfunc(void -tga_init_video(void)) -{ - int i, j, temp; - unsigned char *cbp; - - tga_regs_base = (tga_mem_base + TGA_REGS_OFFSET); - tga_fb_base = (tga_mem_base + fb_offset_presets[tga_type]); - - /* first, disable video timing */ - TGA_WRITE_REG(0x03, TGA_VALID_REG); /* SCANNING and BLANK */ - - /* write the DEEP register */ - while (TGA_READ_REG(TGA_CMD_STAT_REG) & 1) /* wait for not busy */ - continue; - - mb(); - TGA_WRITE_REG(deep_presets[tga_type], TGA_DEEP_REG); - while (TGA_READ_REG(TGA_CMD_STAT_REG) & 1) /* wait for not busy */ - continue; - mb(); - - /* write some more registers */ - TGA_WRITE_REG(rasterop_presets[tga_type], TGA_RASTEROP_REG); - TGA_WRITE_REG(mode_presets[tga_type], TGA_MODE_REG); - TGA_WRITE_REG(base_addr_presets[tga_type], TGA_BASE_ADDR_REG); - - /* write the PLL for 640x480 @ 60Hz */ - for (i = 0; i <= 6; i++) { - for (j = 0; j <= 7; j++) { - temp = (PLLbits[i] >> (7-j)) & 1; - if (i == 6 && j == 7) - temp |= 2; - TGA_WRITE_REG(temp, TGA_CLOCK_REG); - } - } - - /* write some more registers */ - TGA_WRITE_REG(0xffffffff, TGA_PLANEMASK_REG); - TGA_WRITE_REG(0xffffffff, TGA_PIXELMASK_REG); - TGA_WRITE_REG(0x12345678, TGA_BLOCK_COLOR0_REG); - TGA_WRITE_REG(0x12345678, TGA_BLOCK_COLOR1_REG); - - /* init video timing regs for 640x480 @ 60 Hz */ - TGA_WRITE_REG(0x018608a0, TGA_HORIZ_REG); - TGA_WRITE_REG(0x084251e0, TGA_VERT_REG); - - if (tga_type == 0) { /* 8-plane */ - - tga_bpp = 1; - - /* init BT485 RAMDAC registers */ - BT485_WRITE(0xa2, BT485_CMD_0); - BT485_WRITE(0x01, BT485_ADDR_PAL_WRITE); - BT485_WRITE(0x14, BT485_CMD_3); /* cursor 64x64 */ - BT485_WRITE(0x40, BT485_CMD_1); - BT485_WRITE(0x22, BT485_CMD_2); /* WIN cursor type */ - BT485_WRITE(0xff, BT485_PIXEL_MASK); - - /* fill palette registers */ - BT485_WRITE(0x00, BT485_ADDR_PAL_WRITE); - TGA_WRITE_REG(BT485_DATA_PAL, TGA_RAMDAC_SETUP_REG); - - for (i = 0; i < 16; i++) { - j = color_table[i]; - TGA_WRITE_REG(default_red[j]|(BT485_DATA_PAL<<8), - TGA_RAMDAC_REG); - TGA_WRITE_REG(default_grn[j]|(BT485_DATA_PAL<<8), - TGA_RAMDAC_REG); - TGA_WRITE_REG(default_blu[j]|(BT485_DATA_PAL<<8), - TGA_RAMDAC_REG); - } - for (i = 0; i < 240*3; i += 4) { - TGA_WRITE_REG(0x55|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG); - } - - /* initialize RAMDAC cursor colors */ - BT485_WRITE(0, BT485_ADDR_CUR_WRITE); - - BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */ - BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */ - BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */ - - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */ - - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 2 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 2 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 2 BLACK */ - - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 3 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 3 BLACK */ - BT485_WRITE(0x00, BT485_DATA_CUR); /* color 3 BLACK */ - - /* initialize RAMDAC cursor RAM */ - BT485_WRITE(0x00, BT485_ADDR_PAL_WRITE); - cbp = (unsigned char *)bt485_cursor_source; - for (i = 0; i < 512; i++) { - BT485_WRITE(*cbp++, BT485_CUR_RAM); - } - for (i = 0; i < 512; i++) { - BT485_WRITE(0xff, BT485_CUR_RAM); - } - - } else { /* 24-plane or 24plusZ */ - - tga_bpp = 4; - - TGA_WRITE_REG(0x01, TGA_VALID_REG); /* SCANNING */ - - /* - * init some registers - */ - BT463_WRITE(BT463_REG_ACC, BT463_CMD_REG_0, 0x40); - BT463_WRITE(BT463_REG_ACC, BT463_CMD_REG_1, 0x08); - BT463_WRITE(BT463_REG_ACC, BT463_CMD_REG_2, 0x40); - - BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_0, 0xff); - BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_1, 0xff); - BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_2, 0xff); - BT463_WRITE(BT463_REG_ACC, BT463_READ_MASK_3, 0x0f); - - BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_0, 0x00); - BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_1, 0x00); - BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_2, 0x00); - BT463_WRITE(BT463_REG_ACC, BT463_BLINK_MASK_3, 0x00); - - /* - * fill the palette - */ - BT463_LOAD_ADDR(0x0000); - TGA_WRITE_REG((BT463_PALETTE<<2), TGA_RAMDAC_REG); - - for (i = 0; i < 16; i++) { - j = color_table[i]; - TGA_WRITE_REG(default_red[j]|(BT463_PALETTE<<10), - TGA_RAMDAC_REG); - TGA_WRITE_REG(default_grn[j]|(BT463_PALETTE<<10), - TGA_RAMDAC_REG); - TGA_WRITE_REG(default_blu[j]|(BT463_PALETTE<<10), - TGA_RAMDAC_REG); - } - for (i = 0; i < 512*3; i += 4) { - TGA_WRITE_REG(0x55|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_PALETTE<<10), TGA_RAMDAC_REG); - } - - /* - * fill window type table after start of vertical retrace - */ - while (!(TGA_READ_REG(TGA_INTR_STAT_REG) & 0x01)) - continue; - TGA_WRITE_REG(0x01, TGA_INTR_STAT_REG); - mb(); - while (!(TGA_READ_REG(TGA_INTR_STAT_REG) & 0x01)) - continue; - TGA_WRITE_REG(0x01, TGA_INTR_STAT_REG); - - BT463_LOAD_ADDR(BT463_WINDOW_TYPE_BASE); - TGA_WRITE_REG((BT463_REG_ACC<<2), TGA_RAMDAC_SETUP_REG); - - for (i = 0; i < 16; i++) { - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x01|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x80|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - } - - /* - * init cursor colors - */ - BT463_LOAD_ADDR(BT463_CUR_CLR_0); - - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* background */ - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* background */ - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* background */ - - TGA_WRITE_REG(0xff|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* foreground */ - TGA_WRITE_REG(0xff|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* foreground */ - TGA_WRITE_REG(0xff|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); /* foreground */ - - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - TGA_WRITE_REG(0x00|(BT463_REG_ACC<<10), TGA_RAMDAC_REG); - - /* - * finally, init the cursor shape - */ - temp = tga_fb_base - 1024; /* this assumes video starts at base - and base is beyond memory start*/ - - for (i = 0; i < 256; i++) { - writel(bt463_cursor_source[i], temp + i*4); - } - TGA_WRITE_REG(temp & 0x000fffff, TGA_CURSOR_BASE_REG); - } - - /* finally, enable video scan & cursor - (and pray for the monitor... :-) */ - TGA_WRITE_REG(0x05, TGA_VALID_REG); /* SCANNING and CURSOR */ - - /* oh, and set the globals describing the resolution... :-) */ - tga_fb_width = 640 * tga_bpp; - tga_fb_height = 480; - tga_fb_stride = tga_fb_width / sizeof(int); -} - -__initfunc(void -tga_clear_screen(void)) -{ - register int i, j; - register unsigned int *dst; - - dst = (unsigned int *) ((unsigned long)tga_fb_base); - for (i = 0; i < tga_fb_height; i++, dst += tga_fb_stride) { - for (j = 0; j < tga_fb_stride; j++) { - writel(0, (dst+j)); - } - } - - /* also clear out the "shadow" screen memory */ - memset((char *)video_mem_base, 0, (video_mem_term - video_mem_base)); -} - -/* - * tga_blitc - * - * Displays an ASCII character at a specified character cell - * position. - * - * Called from scr_writew() when the destination is - * the "shadow" screen - */ -static unsigned int -fontmask_bits[16] = { - 0x00000000, - 0xff000000, - 0x00ff0000, - 0xffff0000, - 0x0000ff00, - 0xff00ff00, - 0x00ffff00, - 0xffffff00, - 0x000000ff, - 0xff0000ff, - 0x00ff00ff, - 0xffff00ff, - 0x0000ffff, - 0xff00ffff, - 0x00ffffff, - 0xffffffff -}; - -int -tga_blitc(unsigned int charattr, unsigned long addr) -{ - int row, col, temp, c, attrib; - register unsigned int fgmask, bgmask, data, rowbits; - register unsigned int *dst; - register unsigned char *font_row; - register int i, j, stride; - - c = charattr & 0x00ff; - attrib = (charattr >> 8) & 0x00ff; - - /* - * extract foreground and background indices - * NOTE: we always treat blink/underline bits as color for now... - */ - fgmask = attrib & 0x0f; - bgmask = (attrib >> 4) & 0x0f; - - i = (c & 0xff) << 4; /* NOTE: assumption of 16 bytes per character bitmap */ - - /* - * calculate (row,col) from addr and video_mem_base - */ - temp = (addr - video_mem_base) >> 1; - col = temp % 80; - row = (temp - col) / 80; - - /* - * calculate destination address - */ - dst = (unsigned int *) ( (unsigned long)tga_fb_base - + ( row * tga_fb_width * TGA_F_HEIGHT_PADDED ) - + ( col * TGA_F_WIDTH * tga_bpp) ); - - font_row = (unsigned char *)&tga_builtin_font[i]; - stride = tga_fb_stride; - - if (tga_type == 0) { /* 8-plane */ - - fgmask = fgmask << 8 | fgmask; - fgmask |= fgmask << 16; - bgmask = bgmask << 8 | bgmask; - bgmask |= bgmask << 16; - - for ( j = 0; j < TGA_F_HEIGHT_PADDED; j++ ) { - if (j < TGA_F_HEIGHT) { - rowbits = font_row[j]; - } else { - /* dup the last n rows only if char > 0x7f */ - if (c & 0x80) - rowbits = font_row[j-(TGA_F_HEIGHT_PADDED-TGA_F_HEIGHT)]; - else - rowbits = 0; - } - data = fontmask_bits[(rowbits>>4)&0xf]; - data = (data & fgmask) | (~data & bgmask); - writel(data, dst); - data = fontmask_bits[rowbits&0xf]; - data = (data & fgmask) | (~data & bgmask); - writel(data, (dst+1)); - dst += stride; - } - } else { /* 24-plane */ - - fgmask = (default_red[fgmask] << 16) | - (default_grn[fgmask] << 8) | - (default_blu[fgmask] << 0); - bgmask = (default_red[bgmask] << 16) | - (default_grn[bgmask] << 8) | - (default_blu[bgmask] << 0); - - for ( i = 0; i < TGA_F_HEIGHT_PADDED; i++ ) { - if (i < TGA_F_HEIGHT) { - rowbits = font_row[i]; - } else { - /* dup the last n rows only if char > 0x7f */ - if (c & 0x80) - rowbits = font_row[i-(TGA_F_HEIGHT_PADDED-TGA_F_HEIGHT)]; - else - rowbits = 0; - } - data = 1 << (TGA_F_WIDTH - 1); - for (j = 0; j < TGA_F_WIDTH; j++, data >>= 1) { - if (rowbits & data) - writel(fgmask, (dst+j)); - else - writel(bgmask, (dst+j)); - } - dst += stride; - } - } - return (0); -} - -/* - * font table of displayable characters. - */ -char tga_builtin_font[]={ -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, -0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, -0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, -0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, -0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, -0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, -0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, -0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00, -0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00, -0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b, 0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, -0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, -0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 0x18, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0xfc, 0x66, 0x66, 0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, -0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, -0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06, 0x0c, 0x1f, 0x00, 0x00, -0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, -0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, -0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, -0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, -0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, -0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, -0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -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 -}; diff -u --recursive --new-file v2.1.106/linux/drivers/char/vc_screen.c linux/drivers/char/vc_screen.c --- v2.1.106/linux/drivers/char/vc_screen.c Thu Feb 12 20:56:06 1998 +++ linux/drivers/char/vc_screen.c Wed Jun 24 14:44:00 1998 @@ -31,8 +31,10 @@ #include #include #include +#include #include #include +#include #undef attr #undef org @@ -55,18 +57,15 @@ vcs_size(struct inode *inode) { int size; -#ifdef CONFIG_FB_CONSOLE - int cons = MINOR(inode->i_rdev) & 127; - - if (cons == 0) - cons = fg_console; + int currcons = MINOR(inode->i_rdev) & 127; + if (currcons == 0) + currcons = fg_console; else - cons--; - if (!vc_cons_allocated(cons)) + currcons--; + if (!vc_cons_allocated(currcons)) return -ENXIO; -#endif - size = get_video_num_lines(cons) * get_video_num_columns(cons); + size = video_num_lines * video_num_columns; if (MINOR(inode->i_rdev) & 128) size = 2*size + HEADER_SIZE; @@ -132,8 +131,8 @@ } else { if (p < HEADER_SIZE) { char header[HEADER_SIZE]; - header[0] = (char) get_video_num_lines(currcons); - header[1] = (char) get_video_num_columns(currcons); + header[0] = (char) video_num_lines; + header[1] = (char) video_num_columns; getconsxy(currcons, header+2); while (p < HEADER_SIZE && count > 0) { count--; put_user(header[p++], buf++); } @@ -142,7 +141,11 @@ p -= HEADER_SIZE; org = screen_pos(currcons, p/2, viewed); if ((p & 1) && count > 0) +#ifdef __BIG_ENDIAN + { count--; put_user(func_scr_readw(org++) & 0xff, buf++); } +#else { count--; put_user(func_scr_readw(org++) >> 8, buf++); } +#endif } while (count > 1) { put_user(func_scr_readw(org++), (unsigned short *) buf); @@ -150,7 +153,11 @@ count -= 2; } if (count > 0) +#ifdef __BIG_ENDIAN + put_user(func_scr_readw(org) >> 8, buf++); +#else put_user(func_scr_readw(org) & 0xff, buf++); +#endif } read = buf - buf0; *ppos += read; @@ -212,8 +219,13 @@ char c; count--; get_user(c,buf++); +#ifdef __BIG_ENDIAN + func_scr_writew(c | + (func_scr_readw(org) & 0xff00), org); +#else func_scr_writew((c << 8) | (func_scr_readw(org) & 0xff), org); +#endif org++; } } @@ -227,14 +239,16 @@ if (count > 0) { unsigned char c; get_user(c, (const unsigned char*)buf++); +#ifdef __BIG_ENDIAN + func_scr_writew((func_scr_readw(org) & 0xff) | (c << 8), org); +#else func_scr_writew((func_scr_readw(org) & 0xff00) | c, org); +#endif } } -#ifdef CONFIG_FB_CONSOLE if (currcons == fg_console) /* Horribly inefficient if count < screen size. */ update_screen(currcons); -#endif written = buf - buf0; *ppos += written; RETURN( written ); diff -u --recursive --new-file v2.1.106/linux/drivers/char/vesa_blank.c linux/drivers/char/vesa_blank.c --- v2.1.106/linux/drivers/char/vesa_blank.c Mon Oct 28 04:29:23 1996 +++ linux/drivers/char/vesa_blank.c Wed Dec 31 16:00:00 1969 @@ -1,290 +0,0 @@ -/* - * vesa_blank.c - * - * Exported functions: - * void vesa_blank(void); - * void vesa_unblank(void); - * void vesa_powerdown(void); - * void set_vesa_blanking(const unsigned long arg); - * - * Not all hardware reacts well to this code - activate at your own risk. - * Activation is done using a sufficiently recent version of setterm - * or using a tiny C program like the following. - * ------------------------------------------------------------------------ -|#include -|#include -|main(int argc, char *argv[]) { -| int fd; -| struct { char ten, onoff; } arg; -| -| if (argc != 2) { -| fprintf(stderr, "usage: setvesablank on|vsync|hsync|powerdown|off\n"); -| exit(1); -| } -| if ((fd = open("/dev/console", 0)) < 0) -| fd = 0; -| arg.ten = 10; -| arg.onoff = 0; -| if (!strcmp(argv[1], "on") || !strcmp(argv[1], "vsync")) -| arg.onoff = 1; -| else if (!strcmp(argv[1], "hsync")) -| arg.onoff = 2; -| else if (!strcmp(argv[1], "powerdown")) -| arg.onoff = 3; -| if (ioctl(fd, TIOCLINUX, &arg)) { -| perror("setvesablank: TIOCLINUX"); -| exit(1); -| } -| exit(0); -|} ------------------------------------------------------------------------ -*/ - -#include -#include -#include -#include - -extern unsigned short video_port_reg, video_port_val; - -/* - * This file handles the VESA Power Saving Protocol that lets a - * monitor be powered down whenever not needed for a longer time. - * The VESA protocol defines: - * - * Mode/Status HSync VSync Video - * ------------------------------------------- - * "On" on on active (mode 0) - * "Suspend" {either} on off blank (mode 1) - * { or } off on blank (mode 2) - * "Off" off off blank (mode 3) - * - * Original code taken from the Power Management Utility (PMU) of - * Huang shi chao, delivered together with many new monitor models - * capable of the VESA Power Saving Protocol. - * - * Adapted to Linux by Christoph Rimek (chrimek@toppoint.de) 15-may-94. - * A slightly adapted fragment of his README follows. - * - * Two-stage blanking by todd j. derr (tjd@barefoot.org) 10-oct-95. - -Patch (based on Linux Kernel revision 1.0) for handling the Power Saving -feature of the new monitor generation. The code works on all these monitors -(mine is a Smile 1506) and should run on *all* video adapter cards (change -some i/o-addresses), although tested only on two different VGA-cards: a -cheap Cirrus Logic (5428) and a miro Crystal 8S (S3-805). - -You can choose from two options: - -(1) Setting vesa_blanking_mode to 1 or 2. - The code will save the current setting of your video adapters' - register settings and then program the controller to turn off - the vertical synchronization pulse (mode 1) or horizontal - synchronization pulse (mode 2). Mode 1 should work with most - monitors, but the VESA spec allows mode 2, so it's included for - completeness. You may set this blanking interval in minutes by - echoing the escape sequence 'ESC[9;interval]' to the terminal. - By default this interval is set to 10 minutes. - - If you use one of these modes, you can also set a second interval - by echoing the escape sequence 'ESC[14;interval]' to the terminal. - The monitor will be turned off completely (mode 3) after being in - suspend mode for the specified interval. An interval of 0 disables - this feature which is the default. - - Both intervals may be set within the range of 0..60 minutes. - -(2) Setting vesa_blanking_mode to 3. - If your monitor locally has an Off_Mode timer then you should not - force your video card to send the OFF-signal - your monitor will - power down by itself. - If your monitor cannot handle this and needs the Off-signal directly, - or if you like your monitor to power down immediately when the - blank_timer times out, then you choose this option. - -On the other hand I'd recommend to not choose this second option unless -it is absolutely necessary. Powering down a monitor to the Off_State with -an approx. power consumption of 3-5 Watts is a rather strong action for -the CRT and it should not be done every now and then. If the software only -sends the signal to enter Standby mode, you have the chance to interfere -before the monitor powers down. Do not set a too short period, if you love -your hardware :-)) . - -By default vesa_blanking_mode is set to 0, thus not using any power saving -features. -*/ - -#define seq_port_reg (0x3c4) /* Sequencer register select port */ -#define seq_port_val (0x3c5) /* Sequencer register value port */ -#define video_misc_rd (0x3cc) /* Video misc. read port */ -#define video_misc_wr (0x3c2) /* Video misc. write port */ - -/* structure holding original VGA register settings */ -static struct { - unsigned char SeqCtrlIndex; /* Sequencer Index reg. */ - unsigned char CrtCtrlIndex; /* CRT-Contr. Index reg. */ - unsigned char CrtMiscIO; /* Miscellaneous register */ - unsigned char HorizontalTotal; /* CRT-Controller:00h */ - unsigned char HorizDisplayEnd; /* CRT-Controller:01h */ - unsigned char StartHorizRetrace; /* CRT-Controller:04h */ - unsigned char EndHorizRetrace; /* CRT-Controller:05h */ - unsigned char Overflow; /* CRT-Controller:07h */ - unsigned char StartVertRetrace; /* CRT-Controller:10h */ - unsigned char EndVertRetrace; /* CRT-Controller:11h */ - unsigned char ModeControl; /* CRT-Controller:17h */ - unsigned char ClockingMode; /* Seq-Controller:01h */ -} vga; - -#define VESA_NO_BLANKING 0 -#define VESA_VSYNC_SUSPEND 1 -#define VESA_HSYNC_SUSPEND 2 -#define VESA_POWERDOWN (VESA_HSYNC_SUSPEND | VESA_VSYNC_SUSPEND) - -#define DEFAULT_VESA_BLANKING_MODE VESA_NO_BLANKING - -static int vesa_blanking_mode = DEFAULT_VESA_BLANKING_MODE; -static int suspend_vesa_blanking_mode = DEFAULT_VESA_BLANKING_MODE; -static int vesa_blanked = 0; - -/* routine to blank a vesa screen */ -void vesa_blank(void) -{ - int mode; - - if((mode = vesa_blanking_mode) == 0) - return; - - /* save original values of VGA controller registers */ - if(!vesa_blanked) { - cli(); - vga.SeqCtrlIndex = inb_p(seq_port_reg); - vga.CrtCtrlIndex = inb_p(video_port_reg); - vga.CrtMiscIO = inb_p(video_misc_rd); - sti(); - - outb_p(0x00,video_port_reg); /* HorizontalTotal */ - vga.HorizontalTotal = inb_p(video_port_val); - outb_p(0x01,video_port_reg); /* HorizDisplayEnd */ - vga.HorizDisplayEnd = inb_p(video_port_val); - outb_p(0x04,video_port_reg); /* StartHorizRetrace */ - vga.StartHorizRetrace = inb_p(video_port_val); - outb_p(0x05,video_port_reg); /* EndHorizRetrace */ - vga.EndHorizRetrace = inb_p(video_port_val); - outb_p(0x07,video_port_reg); /* Overflow */ - vga.Overflow = inb_p(video_port_val); - outb_p(0x10,video_port_reg); /* StartVertRetrace */ - vga.StartVertRetrace = inb_p(video_port_val); - outb_p(0x11,video_port_reg); /* EndVertRetrace */ - vga.EndVertRetrace = inb_p(video_port_val); - outb_p(0x17,video_port_reg); /* ModeControl */ - vga.ModeControl = inb_p(video_port_val); - outb_p(0x01,seq_port_reg); /* ClockingMode */ - vga.ClockingMode = inb_p(seq_port_val); - } - - /* assure that video is enabled */ - /* "0x20" is VIDEO_ENABLE_bit in register 01 of sequencer */ - cli(); - outb_p(0x01,seq_port_reg); - outb_p(vga.ClockingMode | 0x20,seq_port_val); - - /* test for vertical retrace in process.... */ - if ((vga.CrtMiscIO & 0x80) == 0x80) - outb_p(vga.CrtMiscIO & 0xef,video_misc_wr); - - /* - * Set to minimum (0) and - * to maximum (incl. overflow) - * Result: turn off vertical sync (VSync) pulse. - */ - if (mode & VESA_VSYNC_SUSPEND) { - outb_p(0x10,video_port_reg); /* StartVertRetrace */ - outb_p(0xff,video_port_val); /* maximum value */ - outb_p(0x11,video_port_reg); /* EndVertRetrace */ - outb_p(0x40,video_port_val); /* minimum (bits 0..3) */ - outb_p(0x07,video_port_reg); /* Overflow */ - outb_p(vga.Overflow | 0x84,video_port_val); /* bits 9,10 of */ - /* vert. retrace */ - } - - if (mode & VESA_HSYNC_SUSPEND) { - /* - * Set to minimum (0) and - * to maximum - * Result: turn off horizontal sync (HSync) pulse. - */ - outb_p(0x04,video_port_reg); /* StartHorizRetrace */ - outb_p(0xff,video_port_val); /* maximum */ - outb_p(0x05,video_port_reg); /* EndHorizRetrace */ - outb_p(0x00,video_port_val); /* minimum (0) */ - } - - /* restore both index registers */ - outb_p(vga.SeqCtrlIndex,seq_port_reg); - outb_p(vga.CrtCtrlIndex,video_port_reg); - sti(); - - vesa_blanked = mode; -} - -/* routine to unblank a vesa screen */ -void vesa_unblank(void) -{ - if (!vesa_blanked) - return; - - /* restore original values of VGA controller registers */ - cli(); - outb_p(vga.CrtMiscIO,video_misc_wr); - - outb_p(0x00,video_port_reg); /* HorizontalTotal */ - outb_p(vga.HorizontalTotal,video_port_val); - outb_p(0x01,video_port_reg); /* HorizDisplayEnd */ - outb_p(vga.HorizDisplayEnd,video_port_val); - outb_p(0x04,video_port_reg); /* StartHorizRetrace */ - outb_p(vga.StartHorizRetrace,video_port_val); - outb_p(0x05,video_port_reg); /* EndHorizRetrace */ - outb_p(vga.EndHorizRetrace,video_port_val); - outb_p(0x07,video_port_reg); /* Overflow */ - outb_p(vga.Overflow,video_port_val); - outb_p(0x10,video_port_reg); /* StartVertRetrace */ - outb_p(vga.StartVertRetrace,video_port_val); - outb_p(0x11,video_port_reg); /* EndVertRetrace */ - outb_p(vga.EndVertRetrace,video_port_val); - outb_p(0x17,video_port_reg); /* ModeControl */ - outb_p(vga.ModeControl,video_port_val); - outb_p(0x01,seq_port_reg); /* ClockingMode */ - outb_p(vga.ClockingMode,seq_port_val); - - /* restore index/control registers */ - outb_p(vga.SeqCtrlIndex,seq_port_reg); - outb_p(vga.CrtCtrlIndex,video_port_reg); - sti(); - - vesa_blanked = 0; -} - -void set_vesa_blanking(const unsigned long arg) -{ - unsigned char *argp = (unsigned char *)(arg + 1); - unsigned int mode; - - if (verify_area(VERIFY_READ, argp, 1)) - return; - - get_user(mode, argp); - vesa_blanking_mode = suspend_vesa_blanking_mode = - ((mode <= VESA_POWERDOWN) ? mode : DEFAULT_VESA_BLANKING_MODE); -} - -void vesa_powerdown(void) -{ - if(vesa_blanking_mode == VESA_VSYNC_SUSPEND - || vesa_blanking_mode == VESA_HSYNC_SUSPEND) - { - vesa_blanking_mode = VESA_POWERDOWN; - vesa_blank(); - vesa_blanking_mode = suspend_vesa_blanking_mode; - } -} diff -u --recursive --new-file v2.1.106/linux/drivers/char/vga.c linux/drivers/char/vga.c --- v2.1.106/linux/drivers/char/vga.c Tue Dec 9 12:23:52 1997 +++ linux/drivers/char/vga.c Wed Dec 31 16:00:00 1969 @@ -1,635 +0,0 @@ -/* - * linux/drivers/char/vga.c - * - * Copyright (C) 1991, 1992 Linus Torvalds - * 1995 Jay Estabrook - */ - -/* - * vga.c - * - * This module exports the console low-level io support for VGA - * - * 'int con_get_font(char *data)' - * 'int con_set_font(char *data, int ch512)' - * 'int con_adjust_height(int fontheight)' - * - * 'int con_get_cmap(char *)' - * 'int con_set_cmap(char *)' - * - * 'int reset_palette(int currcons)' - * 'void set_palette(void)' - * - * User definable mapping table and font loading by Eugene G. Crosser, - * - * - * Improved loadable font/UTF-8 support by H. Peter Anvin - * Feb-Sep 1995 - * - * Colour palette handling, by Simon Tatham - * 17-Jun-95 - * - * if 512 char mode is already enabled don't re-enable it, - * because it causes screen to flicker, by Mitja Horvat - * 5-May-96 - * - * Use 2 outw instead of 4 outb_p to reduce erroneous text - * flashing on RHS of screen during heavy console scrolling . - * Oct 1996, Paul Gortmaker. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#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 */ - -#define dac_reg (0x3c8) -#define dac_val (0x3c9) - -#ifdef __powerpc__ -#define VGA_OFFSET 0xC0000000; -#else -#define VGA_OFFSET 0x0 -#endif - -/* - * By replacing the four outb_p with two back to back outw, we can reduce - * the window of opportunity to see text mislocated to the RHS of the - * console during heavy scrolling activity. However there is the remote - * possibility that some pre-dinosaur hardware won't like the back to back - * I/O. Since the Xservers get away with it, we should be able to as well. - */ -static inline void write_vga(unsigned char reg, unsigned int val) -{ -#ifndef SLOW_VGA - unsigned int v1, v2; - - v1 = reg + (val & 0xff00); - v2 = reg + 1 + ((val << 8) & 0xff00); - outw(v1, video_port_reg); - outw(v2, video_port_reg); -#else - outb_p(reg, video_port_reg); - outb_p(val >> 8, video_port_val); - outb_p(reg+1, video_port_reg); - outb_p(val & 0xff, video_port_val); -#endif -} - -void -set_palette (void) -{ - int i, j ; - - if (video_type != VIDEO_TYPE_VGAC || console_blanked || - vt_cons[fg_console]->vc_mode == KD_GRAPHICS) - return ; - - for (i=j=0; i<16; i++) { - outb_p (color_table[i], dac_reg) ; - outb_p (vc_cons[fg_console].d->vc_palette[j++]>>2, dac_val) ; - outb_p (vc_cons[fg_console].d->vc_palette[j++]>>2, dac_val) ; - outb_p (vc_cons[fg_console].d->vc_palette[j++]>>2, dac_val) ; - } -} - -void -__set_origin(unsigned short offset) -{ - clear_selection(); - - __origin = offset; - write_vga(12, offset); -} - -/* - * Put the cursor just beyond the end of the display adaptor memory. - */ -void -hide_cursor(void) -{ - /* This is inefficient, we could just put the cursor at 0xffff, - but perhaps the delays due to the inefficiency are useful for - some hardware... */ - write_vga(14, (video_mem_term - video_mem_base - 1)>>1); -} - -void -set_cursor(int currcons) -{ - if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS) - return; - if (__real_origin != __origin) - __set_origin(__real_origin); - if (deccm) { - write_vga(14, (pos - video_mem_base)>>1); - } else - hide_cursor(); -} - -__initfunc(int con_is_present(void)) -{ - unsigned short saved; - unsigned short *p; - - /* - * Find out if there is a graphics card present. - * Are there smarter methods around? - */ - p = (unsigned short *) video_mem_base; - saved = scr_readw(p); - scr_writew(0xAA55, p); - if (scr_readw(p) != 0xAA55) { - scr_writew(saved, p); - return 0; - } - scr_writew(0x55AA, p); - if (scr_readw(p) != 0x55AA) { - scr_writew(saved, p); - return 0; - } - scr_writew(saved, p); - return 1; -} - -__initfunc(unsigned long -con_type_init(unsigned long kmem_start, const char **display_desc)) -{ - if (ORIG_VIDEO_MODE == 7) /* Is this a monochrome display? */ - { - video_mem_base = 0xb0000 + VGA_OFFSET; - video_port_reg = 0x3b4; - video_port_val = 0x3b5; - if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) - { - video_type = VIDEO_TYPE_EGAM; - video_mem_term = 0xb8000 + VGA_OFFSET; - *display_desc = "EGA+"; - request_region(0x3b0,16,"ega"); - } - else - { - video_type = VIDEO_TYPE_MDA; - video_mem_term = 0xb2000 + VGA_OFFSET; - *display_desc = "*MDA"; - request_region(0x3b0,12,"mda"); - request_region(0x3bf, 1,"mda"); - } - } - else /* If not, it is color. */ - { - can_do_color = 1; - video_mem_base = 0xb8000 + VGA_OFFSET; - video_port_reg = 0x3d4; - video_port_val = 0x3d5; - if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) - { - int i ; - - video_mem_term = 0xc0000 + VGA_OFFSET; - - if (!ORIG_VIDEO_ISVGA) { - video_type = VIDEO_TYPE_EGAC; - *display_desc = "EGA"; - request_region(0x3c0,32,"ega"); - } else { - video_type = VIDEO_TYPE_VGAC; - *display_desc = "VGA+"; - request_region(0x3c0,32,"vga+"); - -#ifdef VGA_CAN_DO_64KB - /* - * get 64K rather than 32K of video RAM. - * This doesn't actually work on all "VGA" - * controllers (it seems like setting MM=01 - * and COE=1 isn't necessarily a good idea) - */ - video_mem_base = 0xa0000 + VGA_OFFSET; - video_mem_term = 0xb0000 + VGA_OFFSET; - outb_p (6, 0x3ce) ; - outb_p (6, 0x3cf) ; -#endif - - /* - * Normalise the palette registers, to point - * the 16 screen colours to the first 16 - * DAC entries. - */ - - for (i=0; i<16; i++) { - inb_p (0x3da) ; - outb_p (i, 0x3c0) ; - outb_p (i, 0x3c0) ; - } - outb_p (0x20, 0x3c0) ; - - /* now set the DAC registers back to their - * default values */ - - for (i=0; i<16; i++) { - outb_p (color_table[i], 0x3c8) ; - outb_p (default_red[i], 0x3c9) ; - outb_p (default_grn[i], 0x3c9) ; - outb_p (default_blu[i], 0x3c9) ; - } - } - } - else - { - video_type = VIDEO_TYPE_CGA; - video_mem_term = 0xba000 + VGA_OFFSET; - *display_desc = "*CGA"; - request_region(0x3d4,2,"cga"); - } - } - return kmem_start; -} - -__initfunc(void -con_type_init_finish(void)) -{ -} - -void -get_scrmem(int currcons) -{ - memcpyw((unsigned short *)vc_scrbuf[currcons], - (unsigned short *)origin, video_screen_size); - origin = video_mem_start = (unsigned long)vc_scrbuf[currcons]; - scr_end = video_mem_end = video_mem_start + video_screen_size; - pos = origin + y*video_size_row + (x<<1); -} - -void -set_scrmem(int currcons, long offset) -{ -#ifdef CONFIG_HGA - /* This works with XFree86 1.2, 1.3 and 2.0 - This code could be extended and made more generally useful if we could - determine the actual video mode. It appears that this should be - possible on a genuine Hercules card, but I (WM) haven't been able to - read from any of the required registers on my clone card. - */ - /* This code should work with Hercules and MDA cards. */ - if (video_type == VIDEO_TYPE_MDA) - { - if (vcmode == KD_TEXT) - { - /* Ensure that the card is in text mode. */ - int i; - static char herc_txt_tbl[12] = { - 0x61,0x50,0x52,0x0f,0x19,6,0x19,0x19,2,0x0d,0x0b,0x0c }; - outb_p(0, 0x3bf); /* Back to power-on defaults */ - outb_p(0, 0x3b8); /* Blank the screen, select page 0, etc */ - for ( i = 0 ; i < 12 ; i++ ) - { - outb_p(i, 0x3b4); - outb_p(herc_txt_tbl[i], 0x3b5); - } - } -#define HGA_BLINKER_ON 0x20 -#define HGA_SCREEN_ON 8 - /* Make sure that the hardware is not blanked */ - outb_p(HGA_BLINKER_ON | HGA_SCREEN_ON, 0x3b8); - } -#endif CONFIG_HGA - - if (video_mem_term - video_mem_base < offset + video_screen_size) - offset = 0; /* strange ... */ - memcpyw((unsigned short *)(video_mem_base + offset), - (unsigned short *) origin, video_screen_size); - video_mem_start = video_mem_base; - video_mem_end = video_mem_term; - origin = video_mem_base + offset; - scr_end = origin + video_screen_size; - pos = origin + y*video_size_row + (x<<1); - has_wrapped = 0; -} - -/* - * PIO_FONT support. - * - * The font loading code goes back to the codepage package by - * Joel Hoffman (joel@wam.umd.edu). (He reports that the original - * reference is: "From: p. 307 of _Programmer's Guide to PC & PS/2 - * Video Systems_ by Richard Wilton. 1987. Microsoft Press".) - * - * Change for certain monochrome monitors by Yury Shevchuck - * (sizif@botik.yaroslavl.su). - */ - -#define colourmap ((char *)0xa0000) -/* Pauline Middelink reports that we - should use 0xA0000 for the bwmap as well.. */ -#define blackwmap ((char *)0xa0000) -#define cmapsz 8192 -#define attrib_port (0x3c0) -#define seq_port_reg (0x3c4) -#define seq_port_val (0x3c5) -#define gr_port_reg (0x3ce) -#define gr_port_val (0x3cf) - -int -set_get_font(char * arg, int set, int ch512) -{ -#ifdef CAN_LOAD_EGA_FONTS - static int ch512enabled = 0; - int i; - char *charmap; - int beg; - unsigned short video_port_status = video_port_reg + 6; - int font_select = 0x00; - - /* no use to "load" CGA... */ - - if (video_type == VIDEO_TYPE_EGAC || video_type == VIDEO_TYPE_VGAC) { - charmap = colourmap; - beg = 0x0e; -#ifdef VGA_CAN_DO_64KB - if (video_type == VIDEO_TYPE_VGAC) - beg = 0x06; -#endif - } else if (video_type == VIDEO_TYPE_EGAM) { - charmap = blackwmap; - beg = 0x0a; - } else - return -EINVAL; - - if (arg) - { - i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, - ch512 ? 2*cmapsz : cmapsz); - if (i) - return i; - } - else - ch512 = 0; /* Default font is always 256 */ - -#ifdef BROKEN_GRAPHICS_PROGRAMS - /* - * All fonts are loaded in slot 0 (0:1 for 512 ch) - */ - - if (!arg) - return -EINVAL; /* Return to default font not supported */ - - video_font_is_default = 0; - font_select = ch512 ? 0x04 : 0x00; -#else - /* - * The default font is kept in slot 0 and is never touched. - * A custom font is loaded in slot 2 (256 ch) or 2:3 (512 ch) - */ - - if (set) - { - video_font_is_default = !arg; - font_select = arg ? (ch512 ? 0x0e : 0x0a) : 0x00; - } - - if ( !video_font_is_default ) - charmap += 4*cmapsz; -#endif - - cli(); - outb_p( 0x00, seq_port_reg ); /* First, the sequencer */ - outb_p( 0x01, seq_port_val ); /* Synchronous reset */ - outb_p( 0x02, seq_port_reg ); - outb_p( 0x04, seq_port_val ); /* CPU writes only to map 2 */ - outb_p( 0x04, seq_port_reg ); - outb_p( 0x07, seq_port_val ); /* Sequential addressing */ - outb_p( 0x00, seq_port_reg ); - outb_p( 0x03, seq_port_val ); /* Clear synchronous reset */ - - outb_p( 0x04, gr_port_reg ); /* Now, the graphics controller */ - outb_p( 0x02, gr_port_val ); /* select map 2 */ - outb_p( 0x05, gr_port_reg ); - outb_p( 0x00, gr_port_val ); /* disable odd-even addressing */ - outb_p( 0x06, gr_port_reg ); - outb_p( 0x00, gr_port_val ); /* map start at A000:0000 */ - sti(); - - if (arg) - { - if (set) - for (i=0; i 32 || (video_type != VIDEO_TYPE_VGAC && - video_type != VIDEO_TYPE_EGAC && video_type != VIDEO_TYPE_EGAM)) - return -EINVAL; - - if ( fontheight == video_font_height || fontheight == 0 ) - return 0; - - 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 */ - - /* Reprogram the CRTC for the new font size - Note: the attempt to read the overflow register will fail - on an EGA, but using 0xff for the previous value appears to - be OK for EGA text modes in the range 257-512 scan lines, so I - guess we don't need to worry about it. - - The same applies for the spill bits in the font size and cursor - registers; they are write-only on EGA, but it appears that they - are all don't care bits on EGA, so I guess it doesn't matter. */ - - cli(); - outb_p( 0x07, video_port_reg ); /* CRTC overflow register */ - ovr = inb_p(video_port_val); - outb_p( 0x09, video_port_reg ); /* Font size register */ - fsr = inb_p(video_port_val); - outb_p( 0x0a, video_port_reg ); /* Cursor start */ - curs = inb_p(video_port_val); - outb_p( 0x0b, video_port_reg ); /* Cursor end */ - cure = inb_p(video_port_val); - sti(); - - vde = maxscan & 0xff; /* Vertical display end reg */ - ovr = (ovr & 0xbd) + /* Overflow register */ - ((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, video_port_reg ); /* CRTC overflow register */ - outb_p( ovr, video_port_val ); - outb_p( 0x09, video_port_reg ); /* Font size */ - outb_p( fsr, video_port_val ); - outb_p( 0x0a, video_port_reg ); /* Cursor start */ - outb_p( curs, video_port_val ); - outb_p( 0x0b, video_port_reg ); /* Cursor end */ - outb_p( cure, video_port_val ); - outb_p( 0x12, video_port_reg ); /* Vertical display limit */ - outb_p( vde, video_port_val ); - sti(); - - if ( rows == video_num_lines ) { - /* Change didn't affect number of lines -- no need to scare - the rest of the world */ - return 0; - } - - vc_resize(rows, 0); /* Adjust console size */ - - return rows; -} - -int -set_get_cmap(unsigned char * arg, int set) { -#ifdef CAN_LOAD_PALETTE - int i; - - /* no use to set colourmaps in less than colour VGA */ - - if (video_type != VIDEO_TYPE_VGAC) - return -EINVAL; - - i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, 16*3); - if (i) - return i; - - for (i=0; i<16; i++) { - if (set) { - get_user(default_red[i], arg++) ; - get_user(default_grn[i], arg++) ; - get_user(default_blu[i], arg++) ; - } else { - put_user (default_red[i], arg++) ; - put_user (default_grn[i], arg++) ; - put_user (default_blu[i], arg++) ; - } - } - if (set) { - for (i=0; ivc_palette[k++] = default_red[j]; - vc_cons[i].d->vc_palette[k++] = default_grn[j]; - vc_cons[i].d->vc_palette[k++] = default_blu[j]; - } - } - set_palette() ; - } - - return 0; -#else - return -EINVAL; -#endif -} diff -u --recursive --new-file v2.1.106/linux/drivers/char/vt.c linux/drivers/char/vt.c --- v2.1.106/linux/drivers/char/vt.c Thu May 7 22:51:49 1998 +++ linux/drivers/char/vt.c Wed Jun 24 14:44:00 1998 @@ -416,7 +416,11 @@ if (i) return i; i = con_adjust_height(cfdarg.charheight); - return (i <= 0) ? i : kd_size_changed(i, 0); + /* + * ++Geert: vc_resize_con() will take note of the + * changed screen size, if necessary + */ + return (i <= 0) ? i : 0; } else return -EINVAL; case GIO_FONTX: @@ -1013,7 +1017,10 @@ if (i) return i; i = con_adjust_height(default_font_height); - if ( i > 0 ) kd_size_changed(i, 0); + /* + * ++Geert: vc_resize_con() will take note of the + * changed screen size, if necessary + */ con_set_default_unimap(); return 0; diff -u --recursive --new-file v2.1.106/linux/drivers/char/wdt.c linux/drivers/char/wdt.c --- v2.1.106/linux/drivers/char/wdt.c Mon Jan 12 15:12:42 1998 +++ linux/drivers/char/wdt.c Wed Jun 24 14:30:09 1998 @@ -184,7 +184,7 @@ } /* - * Read reports the temperature in farenheit + * Read reports the temperature in degrees Fahrenheit. */ static ssize_t wdt_read(struct file *file, char *buf, size_t count, loff_t *ptr) diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/aty.c linux/drivers/macintosh/aty.c --- v2.1.106/linux/drivers/macintosh/aty.c Fri May 8 23:14:47 1998 +++ linux/drivers/macintosh/aty.c Wed Jun 24 14:44:00 1998 @@ -11,16 +11,16 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#include /* for CONFIG_CHIP_ID and CONFIG_STAT0 */ +#include #include #include #include #include -#include #include #include #include #include +#include #include #include #include @@ -28,6 +28,9 @@ #include #include "pmac-cons.h" #include "aty.h" +#ifdef CONFIG_ABSCON_COMPAT +#include +#endif struct aty_cmap_regs { unsigned char windex; @@ -708,7 +711,8 @@ pmac_init_palette(); /* Initialize colormap */ /* clear screen */ - fb_start = frame_buffer + (((n_scanlines % 16) * line_pitch) >> 1); + fb_start = frame_buffer + ((chip_type == MACH64_GX_ID) ? + init->offset[color_mode] : 0); memsetw((unsigned short *) fb_start, 0, total_vram); display_info.height = n_scanlines; diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/chips.c linux/drivers/macintosh/chips.c --- v2.1.106/linux/drivers/macintosh/chips.c Fri May 8 23:14:47 1998 +++ linux/drivers/macintosh/chips.c Wed Jun 24 14:44:00 1998 @@ -8,13 +8,15 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ +#include #include #include #include #include -#include #include #include +#include +#include #include #include #include @@ -25,6 +27,7 @@ #include #include "pmac-cons.h" #include "chips.h" +#include static unsigned char *frame_buffer; diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/control.c linux/drivers/macintosh/control.c --- v2.1.106/linux/drivers/macintosh/control.c Fri May 8 23:14:47 1998 +++ linux/drivers/macintosh/control.c Wed Jun 24 14:44:00 1998 @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -23,6 +23,7 @@ #include #include "pmac-cons.h" #include "control.h" +#include /* * Structure of the registers for the RADACAL colormap device. diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/imstt.c linux/drivers/macintosh/imstt.c --- v2.1.106/linux/drivers/macintosh/imstt.c Sun Jun 7 11:16:31 1998 +++ linux/drivers/macintosh/imstt.c Wed Jun 24 14:44:01 1998 @@ -9,15 +9,16 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ + #include #include #include #include #include -#include #include #include +#include #include #include #include @@ -27,6 +28,7 @@ #include #include "pmac-cons.h" #include "imstt.h" +#include enum { diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/platinum.c linux/drivers/macintosh/platinum.c --- v2.1.106/linux/drivers/macintosh/platinum.c Fri May 8 23:14:47 1998 +++ linux/drivers/macintosh/platinum.c Wed Jun 24 14:44:01 1998 @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -21,6 +21,7 @@ #include #include "pmac-cons.h" #include "platinum.h" +#include /* * Structure of the registers for the DACula colormap device. @@ -37,7 +38,7 @@ }; /* - * Structure of the registers for the "platinum" display adaptor". + * Structure of the registers for the "platinum" display adaptor. */ #define PAD(x) char x[12] @@ -424,7 +425,7 @@ cmap_regs = ioremap(cmap_regs_phys, 0x1000); /* Grok total video ram */ - plat_regs->reg[16].r = (unsigned)frame_buffer; + plat_regs->reg[16].r = (unsigned)frame_buffer_phys; plat_regs->reg[20].r = 0x1011; /* select max vram */ plat_regs->reg[24].r = 0; /* switch in vram */ eieio(); @@ -521,7 +522,7 @@ for (i = 0; i < 26; ++i) plat_regs->reg[i+32].r = init->regs[i]; plat_regs->reg[26+32].r = (one_mb ? init->plat_offset[color_mode] + 4 - color_mode : init->plat_offset[color_mode]); - plat_regs->reg[16].r = (unsigned) frame_buffer; + plat_regs->reg[16].r = (unsigned) frame_buffer_phys + init->fb_offset; plat_regs->reg[18].r = line_pitch; plat_regs->reg[19].r = (one_mb ? init->mode[color_mode+1] : init->mode[color_mode]); plat_regs->reg[20].r = (one_mb ? 0x11 : 0x1011); diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/pmac-cons.c linux/drivers/macintosh/pmac-cons.c --- v2.1.106/linux/drivers/macintosh/pmac-cons.c Fri May 8 23:14:47 1998 +++ linux/drivers/macintosh/pmac-cons.c Wed Jun 24 14:44:01 1998 @@ -12,9 +12,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -40,6 +40,7 @@ #ifdef CONFIG_IMSTT_VIDEO #include "imstt.h" #endif +#include int video_mode = VMODE_NVRAM; int color_mode = CMODE_NVRAM; @@ -320,7 +321,7 @@ hide_cursor(); } else { old_cursor = cursor_pos; - cursor_pos = (pos - video_mem_base) >> 1; + cursor_pos = (pos - video_mem_start) >> 1; if (old_cursor != -1) invert_cursor(-1); invert_cursor(cursor_pos); @@ -394,7 +395,7 @@ } int -set_get_font(char *p, int set, int ch512) +set_get_font(unsigned char *p, int set, int ch512) { return 0; } diff -u --recursive --new-file v2.1.106/linux/drivers/macintosh/valkyrie.c linux/drivers/macintosh/valkyrie.c --- v2.1.106/linux/drivers/macintosh/valkyrie.c Fri May 8 23:14:47 1998 +++ linux/drivers/macintosh/valkyrie.c Wed Jun 24 14:44:01 1998 @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -23,6 +23,7 @@ #include #include "pmac-cons.h" #include "valkyrie.h" +#include /* * Structure of the registers for the Valkyrie colormap registers. diff -u --recursive --new-file v2.1.106/linux/drivers/net/3c505.c linux/drivers/net/3c505.c --- v2.1.106/linux/drivers/net/3c505.c Mon Feb 23 18:12:05 1998 +++ linux/drivers/net/3c505.c Wed Jun 24 14:36:49 1998 @@ -1,9 +1,9 @@ /* - * Linux ethernet device driver for the 3Com Etherlink Plus (3C505) + * Linux Ethernet device driver for the 3Com Etherlink Plus (3C505) * By Craig Southeren, Juha Laiho and Philip Blundell * * 3c505.c This module implements an interface to the 3Com - * Etherlink Plus (3c505) ethernet card. Linux device + * Etherlink Plus (3c505) Ethernet card. Linux device * driver interface reverse engineered from the Linux 3C509 * device drivers. Some 3C505 information gleaned from * the Crynwr packet driver. Still this driver would not @@ -1568,7 +1568,7 @@ outb_control(adapter->hcr_val & ~CMDE, dev); /* - * copy ethernet address into structure + * copy Ethernet address into structure */ for (i = 0; i < 6; i++) dev->dev_addr[i] = adapter->rx_pcb.data.eth_addr[i]; diff -u --recursive --new-file v2.1.106/linux/drivers/net/3c505.h linux/drivers/net/3c505.h --- v2.1.106/linux/drivers/net/3c505.h Sun Feb 2 05:18:35 1997 +++ linux/drivers/net/3c505.h Wed Jun 24 14:36:49 1998 @@ -216,7 +216,7 @@ /* Primary Command Block. The most important data structure. All communication between the host and the adapter is done with these. (Except for the actual -ethernet data, which has different packaging.) +Ethernet data, which has different packaging.) */ typedef struct { byte command; diff -u --recursive --new-file v2.1.106/linux/drivers/net/Config.in linux/drivers/net/Config.in --- v2.1.106/linux/drivers/net/Config.in Tue Jun 23 10:01:23 1998 +++ linux/drivers/net/Config.in Wed Jun 24 14:26:13 1998 @@ -188,6 +188,7 @@ if [ "$CONFIG_TR" = "y" ]; then tristate 'IBM Tropic chipset based adaptor support' CONFIG_IBMTR # tristate 'IBM Lanstreamer PCI adaptor support' CONFIG_IBMLS + tristate 'SysKonnect adapter support' CONFIG_SKTR fi if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then diff -u --recursive --new-file v2.1.106/linux/drivers/net/Makefile linux/drivers/net/Makefile --- v2.1.106/linux/drivers/net/Makefile Tue Jun 23 10:01:23 1998 +++ linux/drivers/net/Makefile Wed Jun 24 14:26:13 1998 @@ -61,6 +61,14 @@ endif endif +ifeq ($(CONFIG_SKTR),y) +L_OBJS += sktr.o +else + ifeq ($(CONFIG_SKTR),m) + M_OBJS += sktr.o + endif +endif + ifeq ($(CONFIG_ETHERTAP),y) L_OBJS += ethertap.o else diff -u --recursive --new-file v2.1.106/linux/drivers/net/Space.c linux/drivers/net/Space.c --- v2.1.106/linux/drivers/net/Space.c Tue Jun 23 10:01:23 1998 +++ linux/drivers/net/Space.c Wed Jun 24 14:26:13 1998 @@ -551,6 +551,9 @@ #ifdef CONFIG_IBMTR && ibmtr_probe(dev) #endif +#ifdef CONFIG_SKTR + && sktr_probe(dev) +#endif && 1 ) { return 1; /* -ENODEV or -EAGAIN would be more accurate. */ } diff -u --recursive --new-file v2.1.106/linux/drivers/net/cops.c linux/drivers/net/cops.c --- v2.1.106/linux/drivers/net/cops.c Tue Jun 23 10:01:23 1998 +++ linux/drivers/net/cops.c Mon Jun 15 23:51:02 1998 @@ -336,14 +336,15 @@ if(board==DAYNA) printk("%s: %s at %#3x, using IRQ %d, in Dayna mode.\n", dev->name, cardname, ioaddr, dev->irq); - if(board==TANGENT) + if(board==TANGENT) { if(dev->irq) printk("%s: %s at %#3x, IRQ %d, in Tangent mode\n", dev->name, cardname, ioaddr, dev->irq); - else - printk("%s: %s at %#3x, using polled IO, in Tangent mode.\n", - dev->name, cardname, ioaddr); + else + printk("%s: %s at %#3x, using polled IO, in Tangent mode.\n", + dev->name, cardname, ioaddr); + } return 0; } diff -u --recursive --new-file v2.1.106/linux/drivers/net/eexpress.c linux/drivers/net/eexpress.c --- v2.1.106/linux/drivers/net/eexpress.c Sun Jun 7 11:16:32 1998 +++ linux/drivers/net/eexpress.c Wed Jun 24 14:36:49 1998 @@ -65,7 +65,7 @@ * Note by Zoltan Szilagyi 10-12-96: * * I've succeeded in eliminating the "CU wedged" messages, and hence the - * lockups, which were only occuring with cards running in 8-bit mode ("force + * lockups, which were only occurring with cards running in 8-bit mode ("force * 8-bit operation" in Intel's SoftSet utility). This version of the driver * sets the 82586 and the ASIC to 8-bit mode at startup; it also stops the * CU before submitting a packet for transmission, and then restarts it as soon diff -u --recursive --new-file v2.1.106/linux/drivers/net/ne2k-pci.c linux/drivers/net/ne2k-pci.c --- v2.1.106/linux/drivers/net/ne2k-pci.c Tue Jun 9 11:57:30 1998 +++ linux/drivers/net/ne2k-pci.c Tue Jun 16 14:36:02 1998 @@ -103,7 +103,7 @@ struct ne2k_pci_card { struct ne2k_pci_card *next; struct device *dev; - unsigned char pci_bus, pci_device_fn; + struct pci_dev *pci_dev; }; /* A list of all installed devices, for removing the driver module. */ static struct ne2k_pci_card *ne2k_card_list = NULL; @@ -170,45 +170,29 @@ __initfunc (int ne2k_pci_probe(struct device *dev)) { - static int pci_index = 0; /* Static, for multiple calls. */ + struct pci_dev *pdev = NULL; int cards_found = 0; int i; - if ( ! pcibios_present()) + if ( ! pci_present()) return -ENODEV; - for (;pci_index < 0xff; pci_index++) { - unsigned char pci_bus, pci_device_fn; + while ((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pdev)) != NULL) { u8 pci_irq_line; - u16 pci_command, new_command, vendor, device; + u16 pci_command, new_command; u32 pci_ioaddr; - if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8, pci_index, - &pci_bus, &pci_device_fn) - != PCIBIOS_SUCCESSFUL) - break; - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_VENDOR_ID, &vendor); - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_DEVICE_ID, &device); - /* Note: some vendor IDs (RealTek) have non-NE2k cards as well. */ for (i = 0; pci_clone_list[i].vendor != 0; i++) - if (pci_clone_list[i].vendor == vendor - && pci_clone_list[i].dev_id == device) + if (pci_clone_list[i].vendor == pdev->vendor + && pci_clone_list[i].dev_id == pdev->device) break; if (pci_clone_list[i].vendor == 0) continue; - pcibios_read_config_dword(pci_bus, pci_device_fn, - PCI_BASE_ADDRESS_0, &pci_ioaddr); - pcibios_read_config_byte(pci_bus, pci_device_fn, - PCI_INTERRUPT_LINE, &pci_irq_line); - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, &pci_command); - - /* Remove I/O space marker in bit 0. */ - pci_ioaddr &= PCI_BASE_ADDRESS_IO_MASK; + pci_ioaddr = pdev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK; + pci_irq_line = pdev->irq; + pci_read_config_word(pdev, PCI_COMMAND, &pci_command); /* Avoid already found cards from previous calls */ if (check_region(pci_ioaddr, NE_IO_EXTENT)) @@ -228,8 +212,7 @@ printk(KERN_INFO " The PCI BIOS has not enabled this" " NE2k clone! Updating PCI command %4.4x->%4.4x.\n", pci_command, new_command); - pcibios_write_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, new_command); + pci_write_config_word(pdev, PCI_COMMAND, new_command); } if (pci_irq_line <= 0 || pci_irq_line >= NR_IRQS) @@ -252,8 +235,7 @@ ne2k_card->next = ne2k_card_list; ne2k_card_list = ne2k_card; ne2k_card->dev = dev; - ne2k_card->pci_bus = pci_bus; - ne2k_card->pci_device_fn = pci_device_fn; + ne2k_card->pci_dev = pdev; } dev = 0; diff -u --recursive --new-file v2.1.106/linux/drivers/net/sdla_fr.c linux/drivers/net/sdla_fr.c --- v2.1.106/linux/drivers/net/sdla_fr.c Thu May 7 22:51:50 1998 +++ linux/drivers/net/sdla_fr.c Wed Jun 24 14:34:44 1998 @@ -53,7 +53,7 @@ * This caused the If_send() routine to get into* the if clause for it(0,dev->tbusy) * forever. * The code got into this stage due to an -* interrupt occuring within the if clause for +* interrupt occurring within the if clause for * set_bit(0,dev->tbusy). Since an interrupt * disables furhter transmit interrupt and * makes dev->tbusy = 0, this effect was undone * by making dev->tbusy = 1 in the if clause. @@ -1224,7 +1224,7 @@ } /* switch_net_numbers */ /*============================================================================ - * Get ethernet-style interface statistics. + * Get Ethernet-style interface statistics. * Return a pointer to struct enet_statistics. */ @@ -2158,7 +2158,7 @@ /****** Firmware Asynchronous Event Handlers ********************************/ /*============================================================================ - * Main asyncronous event/error handler. + * Main asynchronous event/error handler. * This routine is called whenever firmware command returns non-zero * return code. * diff -u --recursive --new-file v2.1.106/linux/drivers/net/sdla_ppp.c linux/drivers/net/sdla_ppp.c --- v2.1.106/linux/drivers/net/sdla_ppp.c Wed Apr 8 19:36:27 1998 +++ linux/drivers/net/sdla_ppp.c Wed Jun 24 14:34:44 1998 @@ -841,7 +841,7 @@ } /* switch_net_numbers */ /*============================================================================ - * Get ethernet-style interface statistics. + * Get Ethernet-style interface statistics. * Return a pointer to struct enet_statistics. */ @@ -2183,7 +2183,7 @@ { ppp_mbox_t *mb = card->mbox; int err, i; - /* The critical flag is unset because during intialization (if_open) + /* The critical flag is unset because during initialization (if_open) * we want the interrupts to be enabled so that when the wpp_isr is * called it does not exit due to critical flag set. */ diff -u --recursive --new-file v2.1.106/linux/drivers/net/sdla_x25.c linux/drivers/net/sdla_x25.c --- v2.1.106/linux/drivers/net/sdla_x25.c Thu May 7 22:51:50 1998 +++ linux/drivers/net/sdla_x25.c Wed Jun 24 14:34:44 1998 @@ -167,7 +167,7 @@ static int x25_error (sdla_t* card, int err, int cmd, int lcn); /* X.25 asynchronous event handlers */ -static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); +static int incoming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); static int call_accepted (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); static int call_cleared (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); static int timeout_event (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); @@ -822,7 +822,7 @@ } /*============================================================================ - * Get ethernet-style interface statistics. + * Get Ethernet-style interface statistics. * Return a pointer to struct net_device_stats */ @@ -1177,7 +1177,7 @@ /* If there is a packet queued for transmission then kick * the channel's send routine. When transmission is complete - * or if error has occured, release socket buffer and reset + * or if error has occurred, release socket buffer and reset * 'tbusy' flag. */ if (skb && (chan_send(dev, skb) == 0)) @@ -1204,8 +1204,8 @@ /****** SDLA Firmware-Specific Functions ************************************* * Almost all X.25 commands can unexpetedly fail due to so called 'X.25 - * asynchronous events' such as restart, interrupt, incomming call request, - * call clear request, etc. They can't be ignored and have to be delt with + * asynchronous events' such as restart, interrupt, incoming call request, + * call clear request, etc. They can't be ignored and have to be dealt with * immediately. To tackle with this problem we execute each interface command * in a loop until good return code is received or maximum number of retries * is reached. Each interface command returns non-zero return code, an @@ -1643,8 +1643,8 @@ mb->data[dlen] = '\0'; switch (mb->cmd.pktType & 0x7F) { - case 0x30: /* incomming call */ - retry = incomming_call(card, cmd, lcn, mb); + case 0x30: /* incoming call */ + retry = incoming_call(card, cmd, lcn, mb); break; case 0x31: /* connected */ @@ -1728,7 +1728,7 @@ */ /*============================================================================ - * Handle X.25 incomming call request. + * Handle X.25 incoming call request. * RFC 1356 establishes the following rules: * 1. The first octet in the Call User Data (CUD) field of the call * request packet contains NLPID identifying protocol encapsulation. @@ -1736,12 +1736,12 @@ * protocol encapsulation. * 3. A diagnostic code 249 defined by ISO/IEC 8208 may be used when * clearing a call because protocol encapsulation is not supported. - * 4. If an incomming call is received while a call request is pending - * (i.e. call collision has occured), the incomming call shall be + * 4. If an incoming call is received while a call request is pending + * (i.e. call collision has occurred), the incoming call shall be * rejected and call request shall be retried. */ -static int incomming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) +static int incoming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) { wan_device_t* wandev = &card->wandev; int new_lcn = mb->cmd.lcn; @@ -1754,7 +1754,7 @@ if (dev != NULL) { printk(KERN_INFO - "%s: X.25 incomming call collision on LCN %d!\n", + "%s: X.25 incoming call collision on LCN %d!\n", card->devname, new_lcn); x25_clear_call(card, new_lcn, 0, 0); return 1; @@ -1764,7 +1764,7 @@ if (mb->cmd.qdm & 0x02) { printk(KERN_INFO - "%s: X.25 incomming call on LCN %d with D-bit set!\n", + "%s: X.25 incoming call on LCN %d with D-bit set!\n", card->devname, new_lcn); x25_clear_call(card, new_lcn, 0, 0); return 1; @@ -1775,13 +1775,13 @@ if (info == NULL) { printk(KERN_ERR - "%s: not enough memory to parse X.25 incomming call " + "%s: not enough memory to parse X.25 incoming call " "on LCN %d!\n", card->devname, new_lcn); x25_clear_call(card, new_lcn, 0, 0); return 1; } parse_call_info(mb->data, info); - printk(KERN_INFO "%s: X.25 incomming call on LCN %d! Call data: %s\n", + printk(KERN_INFO "%s: X.25 incoming call on LCN %d! Call data: %s\n", card->devname, new_lcn, mb->data); /* Find available channel */ @@ -1793,7 +1793,7 @@ continue; if (strcmp(info->src, chan->addr) == 0) break; - /* If just an '@' is specified, accept all incomming calls */ + /* If just an '@' is specified, accept all incoming calls */ if (strcmp(chan->addr, "") == 0) break; } @@ -1809,7 +1809,7 @@ else if (info->nuser == 0) { printk(KERN_INFO - "%s: no user data in incomming call on LCN %d!\n", + "%s: no user data in incoming call on LCN %d!\n", card->devname, new_lcn); x25_clear_call(card, new_lcn, 0, 0); } @@ -1831,7 +1831,7 @@ break; default: printk(KERN_INFO - "%s: unsupported NLPID 0x%02X in incomming call " + "%s: unsupported NLPID 0x%02X in incoming call " "on LCN %d!\n", card->devname, info->user[0], new_lcn); x25_clear_call(card, new_lcn, 0, 249); } diff -u --recursive --new-file v2.1.106/linux/drivers/net/sdladrv.c linux/drivers/net/sdladrv.c --- v2.1.106/linux/drivers/net/sdladrv.c Thu Mar 26 15:57:03 1998 +++ linux/drivers/net/sdladrv.c Wed Jun 24 14:34:44 1998 @@ -495,7 +495,7 @@ } /*============================================================================ - * Map shared memory window into SDLA adress space. + * Map shared memory window into SDLA address space. */ EXPORT_SYMBOL(sdla_mapmem); diff -u --recursive --new-file v2.1.106/linux/drivers/net/sktr.c linux/drivers/net/sktr.c --- v2.1.106/linux/drivers/net/sktr.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/sktr.c Wed Jun 24 14:26:13 1998 @@ -0,0 +1,2696 @@ +/* + * sktr.c: A network driver for the SysKonnect Token Ring ISA/PCI Adapters. + * + * Written 1997 by Christoph Goos + * + * A fine result of the Linux Systems Network Architecture Project. + * http://samba.anu.edu.au/linux-sna/ + * + * This software may be used and distributed according to the terms + * of the GNU Public License, incorporated herein by reference. + * + * This device driver works with the following SysKonnect adapters: + * - SysKonnect TR4/16(+) ISA (SK-4190) + * - SysKonnect TR4/16(+) PCI (SK-4590) + * - SysKonnect TR4/16 PCI (SK-4591) + * + * Sources: + * - The hardware related parts of this driver are take from + * the SysKonnect Token Ring driver for Windows NT. + * - I used the IBM Token Ring driver 'ibmtr.c' as a base for this + * driver, as well as the 'skeleton.c' driver by Donald Becker. + * - Also various other drivers in the linux source tree were taken + * as samples for some tasks. + * + * Maintainer(s): + * JS Jay Schulist jschlst@samba.anu.edu.au + * CG Christoph Goos cgoos@syskonnect.de + * + * Modification History: + * 29-Aug-97 CG Created + * 04-Apr-98 CG Fixed problems caused by tok_timer_check + * 10-Apr-98 CG Fixed lockups at cable disconnection + * 27-May-98 JS Formated to Linux Kernel Format + * 31-May-98 JS Hacked in PCI support + * 16-Jun-98 JS Modulized for multiple cards with one driver + * + * To do: + * 1. Selectable 16 Mbps or 4Mbps + * 2. Multi/Broadcast packet handling + * + */ + +static const char *version = "sktr.c: v1.01 08/29/97 by Christoph Goos\n"; + +#include +#ifdef MODULE +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "sktr.h" /* Our Stuff */ +#include "sktr_firmware.h" /* SysKonnect adapter firmware */ + +/* A zero-terminated list of I/O addresses to be probed. */ +static unsigned int sktr_portlist[] __initdata = { + 0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900, + 0 +}; + +/* A zero-terminated list of IRQs to be probed. + * Used again after initial probe for sktr_chipset_init, called from sktr_open. + */ +static unsigned short sktr_irqlist[] = { + 3, 5, 9, 10, 11, 12, 15, + 0 +}; + +/* A zero-terminated list of DMAs to be probed. */ +static int sktr_dmalist[] __initdata = { + 5, 6, 7, + 0 +}; + +/* Card names */ +static char *pci_cardname = "SK NET TR 4/16 PCI\0"; +static char *isa_cardname = "SK NET TR 4/16 ISA\0"; +static char *AdapterName; + +/* Use 0 for production, 1 for verification, 2 for debug, and + * 3 for very verbose debug. + */ +#ifndef SKTR_DEBUG +#define SKTR_DEBUG 1 +#endif +static unsigned int sktr_debug = SKTR_DEBUG; + +/* The number of low I/O ports used by the tokencard. */ +#define SKTR_IO_EXTENT 32 + +/* Index to functions, as function prototypes. + * Alphabetical by function name. + */ + +/* "B" */ +static int sktr_bringup_diags(struct device *dev); +/* "C" */ +static void sktr_cancel_tx_queue(struct net_local* tp); +static int sktr_chipset_init(struct device *dev); +static void sktr_chk_irq(struct device *dev); +static unsigned char sktr_chk_frame(struct device *dev, unsigned char *Addr); +static void sktr_chk_outstanding_cmds(struct device *dev); +static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr); +static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType); +static int sktr_close(struct device *dev); +static void sktr_cmd_status_irq(struct device *dev); +/* "D" */ +static void sktr_disable_interrupts(struct device *dev); +static void sktr_dump(unsigned char *Data, int length); +/* "E" */ +static void sktr_enable_interrupts(struct device *dev); +static void sktr_exec_cmd(struct device *dev, unsigned short Command); +static void sktr_exec_sifcmd(struct device *dev, unsigned int WriteValue); +/* "F" */ +static unsigned char *sktr_fix_srouting(unsigned char *buf, short *FrameLen); +/* "G" */ +static struct enet_statistics *sktr_get_stats(struct device *dev); +/* "H" */ +static void sktr_hardware_send_packet(struct device *dev, + struct net_local* tp); +/* "I" */ +static int sktr_init_adapter(struct device *dev); +static int sktr_init_card(struct device *dev); +static void sktr_init_ipb(struct net_local *tp); +static void sktr_init_net_local(struct device *dev); +static void sktr_init_opb(struct net_local *tp); +static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static int sktr_isa_chk_card(struct device *dev, int ioaddr); +static int sktr_isa_chk_ioaddr(int ioaddr); +/* "O" */ +static int sktr_open(struct device *dev); +static void sktr_open_adapter(struct device *dev); +/* "P" */ +static int sktr_pci_chk_card(struct device *dev); +int sktr_probe(struct device *dev); +static int sktr_probe1(struct device *dev, int ioaddr); +/* "R" */ +static void sktr_rcv_status_irq(struct device *dev); +static void sktr_read_addr(struct device *dev, unsigned char *Address); +static void sktr_read_ptr(struct device *dev); +static void sktr_read_ram(struct device *dev, unsigned char *Data, + unsigned short Address, int Length); +static int sktr_reset_adapter(struct device *dev); +static void sktr_reset_interrupt(struct device *dev); +static void sktr_ring_status_irq(struct device *dev); +/* "S" */ +static int sktr_send_packet(struct sk_buff *skb, struct device *dev); +static void sktr_set_multicast_list(struct device *dev); +/* "T" */ +static void sktr_timer_chk(unsigned long data); +static void sktr_timer_end_wait(unsigned long data); +static void sktr_tx_status_irq(struct device *dev); +/* "U" */ +static void sktr_update_rcv_stats(struct net_local *tp, + unsigned char DataPtr[], unsigned int Length); +/* "W" */ +static void sktr_wait(unsigned long time); +static void sktr_write_rpl_status(RPL *rpl, unsigned int Status); +static void sktr_write_tpl_status(TPL *tpl, unsigned int Status); + +/* + * Check for a network adapter of this type, and return '0' if one exists. + * If dev->base_addr == 0, probe all likely locations. + * If dev->base_addr == 1, always return failure. + */ +__initfunc(int sktr_probe(struct device *dev)) +{ + int i; + int base_addr = dev ? dev->base_addr : 0; + + if(base_addr > 0x1ff) /* Check a single specified location. */ + return (sktr_probe1(dev, base_addr)); + else if(base_addr != 0) /* Don't probe at all. */ + return (-ENXIO); + + for(i = 0; sktr_portlist[i]; i++) + { + int ioaddr = sktr_portlist[i]; + if(check_region(ioaddr, SKTR_IO_EXTENT)) + continue; + if(sktr_probe1(dev, ioaddr)) + { +#ifndef MODULE + tr_freedev(dev); +#endif + } + else + return (0); + } + + return (-ENODEV); +} + +/* + * Detect and setup the PCI SysKonnect TR cards in slot order. + */ +__initfunc(static int sktr_pci_chk_card(struct device *dev)) +{ + static int pci_index = 0; + unsigned char pci_bus, pci_device_fn; + + if(!pci_present()) + return (-1); /* No PCI present. */ + + for(; pci_index < 0xff; pci_index++) + { + unsigned int pci_irq_line; + struct pci_dev *pdev; + unsigned short pci_command, new_command, vendor, device; + unsigned int pci_ioaddr; + + if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8, + pci_index, &pci_bus, &pci_device_fn) + != PCIBIOS_SUCCESSFUL) + { + break; + } + + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_VENDOR_ID, &vendor); + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_DEVICE_ID, &device); + + pdev = pci_find_slot(pci_bus, pci_device_fn); + pci_irq_line = pdev->irq; + pci_ioaddr = pdev->base_address[0]; + + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, &pci_command); + + /* Remove I/O space marker in bit 0. */ + pci_ioaddr &= ~3; + + if(vendor != PCI_VENDOR_ID_SK) + continue; + if(device != PCI_DEVICE_ID_SK_TR) + continue; + if(check_region(pci_ioaddr, SKTR_IO_EXTENT)) + continue; + request_region(pci_ioaddr, SKTR_IO_EXTENT, pci_cardname); + if(request_irq(pdev->irq, sktr_interrupt, SA_SHIRQ, + pci_cardname, dev)) + return (-ENODEV); /* continue; ?? */ + + AdapterName = pci_cardname; + + new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO); + + if(pci_command != new_command) + { + printk("The PCI BIOS has not enabled this" + "device! Updating PCI command %4.4x->%4.4x.\n", + pci_command, new_command); + pcibios_write_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, new_command); + } + + /* At this point we have found a valid PCI TR card. */ + dev->base_addr = pci_ioaddr; + dev->irq = pci_irq_line; + dev->dma = 0; + + printk("%s: %s found at %#4x, using IRQ %d.\n", + dev->name, AdapterName, pci_ioaddr, dev->irq); + + return (0); + } + + return (-1); +} + +/* + * Detect and setup the ISA SysKonnect TR cards. + */ +__initfunc(static int sktr_isa_chk_card(struct device *dev, int ioaddr)) +{ + int i, err; + + err = sktr_isa_chk_ioaddr(ioaddr); + if(err < 0) + return (-ENODEV); + + if(virt_to_bus((void*)((unsigned long)dev->priv+sizeof(struct net_local))) + > ISA_MAX_ADDRESS) + { + printk("%s: Memory not accessible for DMA\n", dev->name); + kfree(dev->priv); + return (-EAGAIN); + } + + AdapterName = isa_cardname; + + /* Grab the region so that no one else tries to probe our ioports. */ + request_region(ioaddr, SKTR_IO_EXTENT, AdapterName); + dev->base_addr = ioaddr; + + /* Autoselect IRQ and DMA if dev->irq == 0 */ + if(dev->irq == 0) + { + for(i = 0; sktr_irqlist[i] != 0; i++) + { + dev->irq = sktr_irqlist[i]; + err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev); + if(!err) + break; + } + + if(sktr_irqlist[i] == 0) + { + printk("%s: AutoSelect no IRQ available\n", dev->name); + return (-EAGAIN); + } + } + else + { + err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev); + if(err) + { + printk("%s: Selected IRQ not available\n", dev->name); + return (-EAGAIN); + } + } + + /* Always allocate the DMA channel after IRQ and clean up on failure */ + if(dev->dma == 0) + { + for(i = 0; sktr_dmalist[i] != 0; i++) + { + dev->dma = sktr_dmalist[i]; + err = request_dma(dev->dma, AdapterName); + if(!err) + break; + } + + if(dev->dma == 0) + { + printk("%s: AutoSelect no DMA available\n", dev->name); + free_irq(dev->irq, NULL); + return (-EAGAIN); + } + } + else + { + err = request_dma(dev->dma, AdapterName); + if(err) + { + printk("%s: Selected DMA not available\n", dev->name); + free_irq(dev->irq, NULL); + return (-EAGAIN); + } + } + + disable_dma(dev->dma); + set_dma_mode(dev->dma, DMA_MODE_CASCADE); + enable_dma(dev->dma); + + printk("%s: %s found at %#4x, using IRQ %d and DMA %d.\n", + dev->name, AdapterName, ioaddr, dev->irq, dev->dma); + + return (0); +} + +__initfunc(static int sktr_probe1(struct device *dev, int ioaddr)) +{ + static unsigned version_printed = 0; + struct net_local *tp; + int err; + + if(sktr_debug && version_printed++ == 0) + printk("%s", version); + +#ifndef MODULE + dev = init_trdev(dev, 0); + if(dev == NULL) + return (-ENOMEM); +#endif + + err = sktr_pci_chk_card(dev); + if(err < 0) + { + err = sktr_isa_chk_card(dev, ioaddr); + if(err < 0) + return (-ENODEV); + } + + /* Setup this devices private information structure */ + tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA); + if(tp == NULL) + return (-ENOMEM); + memset(tp, 0, sizeof(struct net_local)); + + dev->priv = tp; + dev->init = sktr_init_card; + dev->open = sktr_open; + dev->stop = sktr_close; + dev->hard_start_xmit = sktr_send_packet; + dev->get_stats = sktr_get_stats; + dev->set_multicast_list = &sktr_set_multicast_list; + + return (0); +} + +/* Dummy function */ +__initfunc(static int sktr_init_card(struct device *dev)) +{ + if(sktr_debug > 3) + printk("%s: sktr_init_card\n", dev->name); + + return (0); +} + +/* + * This function tests if an adapter is really installed at the + * given I/O address. Return negative if no adapter at IO addr. + */ +__initfunc(static int sktr_isa_chk_ioaddr(int ioaddr)) +{ + unsigned char old, chk1, chk2; + + old = inb(ioaddr + SIFADR); /* Get the old SIFADR value */ + + chk1 = 0; /* Begin with check value 0 */ + do { + /* Write new SIFADR value */ + outb(chk1, ioaddr + SIFADR); + + /* Read, invert and write */ + chk2 = inb(ioaddr + SIFADD); + chk2 ^= 0x0FE; + outb(chk2, ioaddr + SIFADR); + + /* Read, invert and compare */ + chk2 = inb(ioaddr + SIFADD); + chk2 ^= 0x0FE; + + if(chk1 != chk2) + return (-1); /* No adapter */ + + chk1 -= 2; + } while(chk1 != 0); /* Repeat 128 times (all byte values) */ + + /* Restore the SIFADR value */ + outb(old, ioaddr + SIFADR); + + return (0); +} + +/* + * Open/initialize the board. This is called sometime after + * booting when the 'ifconfig' program is run. + * + * This routine should set everything up anew at each open, even + * registers that "should" only need to be set once at boot, so that + * there is non-reboot way to recover if something goes wrong. + */ +static int sktr_open(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + int err; + + /* Reset the hardware here. Don't forget to set the station address. */ + err = sktr_chipset_init(dev); + if(err) + { + printk(KERN_INFO "%s: Chipset initialization error\n", + dev->name); + return (-1); + } + + dev->addr_len = 6; + sktr_read_addr(dev, (unsigned char*)dev->dev_addr); + + init_timer(&tp->timer); + tp->timer.expires = jiffies + 30*HZ; + tp->timer.function = sktr_timer_end_wait; + tp->timer.data = (unsigned long)dev; + tp->timer.next = NULL; + tp->timer.prev = NULL; + add_timer(&tp->timer); + + sktr_read_ptr(dev); + sktr_enable_interrupts(dev); + sktr_open_adapter(dev); + + dev->tbusy = 0; + dev->interrupt = 0; + dev->start = 0; + + /* Wait for interrupt from hardware. If interrupt does not come, + * there will be a timeout from the timer. + */ + tp->Sleeping = 1; + interruptible_sleep_on(&tp->wait_for_tok_int); + del_timer(&tp->timer); + + /* If AdapterVirtOpenFlag is 1, the adapter is now open for use */ + if(tp->AdapterVirtOpenFlag == 0) + { + sktr_disable_interrupts(dev); + return (-1); + } + + dev->start = 1; + + tp->StartTime = jiffies; + + /* Start function control timer */ + tp->timer.expires = jiffies + 2*HZ; + tp->timer.function = sktr_timer_chk; + tp->timer.data = (unsigned long)dev; + add_timer(&tp->timer); + +#ifdef MODULE + MOD_INC_USE_COUNT; +#endif + + return (0); +} + +/* + * Timeout function while waiting for event + */ +static void sktr_timer_end_wait(unsigned long data) +{ + struct device *dev = (struct device*)data; + struct net_local *tp = (struct net_local *)dev->priv; + + if(tp->Sleeping) + { + tp->Sleeping = 0; + wake_up_interruptible(&tp->wait_for_tok_int); + } + + return; +} + +/* + * Initialize the chipset + */ +static int sktr_chipset_init(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char PosReg, Tmp; + int i, err; + + sktr_init_ipb(tp); + sktr_init_opb(tp); + sktr_init_net_local(dev); + + /* Set pos register: selects irq and dma channel. + * Only for ISA bus adapters. + */ + if(dev->dma > 0) + { + PosReg = 0; + for(i = 0; sktr_irqlist[i] != 0; i++) + { + if(sktr_irqlist[i] == dev->irq) + break; + } + + /* Choose default cycle time, 500 nsec */ + PosReg |= CYCLE_TIME << 2; + PosReg |= i << 4; + i = dev->dma - 5; + PosReg |= i; + + if(tp->DataRate == SPEED_4) + PosReg |= LINE_SPEED_BIT; + else + PosReg &= ~LINE_SPEED_BIT; + + outb(PosReg, dev->base_addr + POSREG); + Tmp = inb(dev->base_addr + POSREG); + if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME)) + printk(KERN_INFO "%s: POSREG error\n", dev->name); + } + + err = sktr_reset_adapter(dev); + if(err < 0) + return (-1); + + err = sktr_bringup_diags(dev); + if(err < 0) + return (-1); + + err = sktr_init_adapter(dev); + if(err < 0) + return (-1); + + return (0); +} + +/* + * Initializes the net_local structure. + */ +static void sktr_init_net_local(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + int i; + + tp->scb.CMD = 0; + tp->scb.Parm[0] = 0; + tp->scb.Parm[1] = 0; + + tp->ssb.STS = 0; + tp->ssb.Parm[0] = 0; + tp->ssb.Parm[1] = 0; + tp->ssb.Parm[2] = 0; + + tp->CMDqueue = 0; + + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 0; + tp->ScbInUse = 0; + tp->OpenCommandIssued = 0; + tp->ReOpenInProgress = 0; + tp->HaltInProgress = 0; + tp->TransmitHaltScheduled = 0; + tp->LobeWireFaultLogged = 0; + tp->LastOpenStatus = 0; + tp->MaxPacketSize = DEFAULT_PACKET_SIZE; + + skb_queue_head_init(&tp->SendSkbQueue); + tp->QueueSkb = MAX_TX_QUEUE; + + /* Create circular chain of transmit lists */ + for (i = 0; i < TPL_NUM; i++) + { + tp->Tpl[i].NextTPLAddr = htonl((unsigned long) virt_to_bus(&tp->Tpl[(i+1) % TPL_NUM])); + tp->Tpl[i].Status = 0; + tp->Tpl[i].FrameSize = 0; + tp->Tpl[i].FragList[0].DataCount = 0; + tp->Tpl[i].FragList[0].DataAddr = 0; + tp->Tpl[i].NextTPLPtr = &tp->Tpl[(i+1) % TPL_NUM]; + tp->Tpl[i].MData = NULL; + tp->Tpl[i].TPLIndex = i; + tp->Tpl[i].BusyFlag = 0; + } + + tp->TplFree = tp->TplBusy = &tp->Tpl[0]; + + /* Create circular chain of receive lists */ + for (i = 0; i < RPL_NUM; i++) + { + tp->Rpl[i].NextRPLAddr = htonl((unsigned long) virt_to_bus(&tp->Rpl[(i+1) % RPL_NUM])); + tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); + tp->Rpl[i].FrameSize = 0; + tp->Rpl[i].FragList[0].DataCount = SWAPB(tp->MaxPacketSize); + + /* Alloc skb and point adapter to data area */ + tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize); + + /* skb == NULL ? then use local buffer */ + if(tp->Rpl[i].Skb == NULL) + { + tp->Rpl[i].SkbStat = SKB_UNAVAILABLE; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); + tp->Rpl[i].MData = tp->LocalRxBuffers[i]; + } + else /* SKB != NULL */ + { + tp->Rpl[i].Skb->dev = dev; + skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize); + + /* data unreachable for DMA ? then use local buffer */ + if(virt_to_bus(tp->Rpl[i].Skb->data) + tp->MaxPacketSize > ISA_MAX_ADDRESS) + { + tp->Rpl[i].SkbStat = SKB_DATA_COPY; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); + tp->Rpl[i].MData = tp->LocalRxBuffers[i]; + } + else /* DMA directly in skb->data */ + { + tp->Rpl[i].SkbStat = SKB_DMA_DIRECT; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->Rpl[i].Skb->data)); + tp->Rpl[i].MData = tp->Rpl[i].Skb->data; + } + } + + tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM]; + tp->Rpl[i].RPLIndex = i; + } + + tp->RplHead = &tp->Rpl[0]; + tp->RplTail = &tp->Rpl[RPL_NUM-1]; + tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); + + return; +} + +/* + * Initializes the initialisation parameter block. + */ +static void sktr_init_ipb(struct net_local *tp) +{ + tp->ipb.Init_Options = BURST_MODE; + tp->ipb.CMD_Status_IV = 0; + tp->ipb.TX_IV = 0; + tp->ipb.RX_IV = 0; + tp->ipb.Ring_Status_IV = 0; + tp->ipb.SCB_Clear_IV = 0; + tp->ipb.Adapter_CHK_IV = 0; + tp->ipb.RX_Burst_Size = BURST_SIZE; + tp->ipb.TX_Burst_Size = BURST_SIZE; + tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES; + tp->ipb.SCB_Addr = 0; + tp->ipb.SSB_Addr = 0; + + return; +} + +/* + * Initializes the open parameter block. + */ +static void sktr_init_opb(struct net_local *tp) +{ + unsigned long Addr; + unsigned short RplSize = RPL_SIZE; + unsigned short TplSize = TPL_SIZE; + unsigned short BufferSize = BUFFER_SIZE; + + tp->ocpl.OPENOptions = 0; + tp->ocpl.OPENOptions |= ENABLE_FULL_DUPLEX_SELECTION; + tp->ocpl.OPENOptions |= PAD_ROUTING_FIELD; + tp->ocpl.FullDuplex = 0; + tp->ocpl.FullDuplex |= OPEN_FULL_DUPLEX_OFF; + + /* Fixme: If mac address setable: + * for (i=0; iVam->ocpl.NodeAddr[i] = mac->CurrentAddress[i]; + */ + + tp->ocpl.GroupAddr = 0; + tp->ocpl.FunctAddr = 0; + tp->ocpl.RxListSize = SWAPB(RplSize); + tp->ocpl.TxListSize = SWAPB(TplSize); + tp->ocpl.BufSize = SWAPB(BufferSize); + tp->ocpl.Reserved = 0; + tp->ocpl.TXBufMin = TX_BUF_MIN; + tp->ocpl.TXBufMax = TX_BUF_MAX; + + Addr = htonl(virt_to_bus(tp->ProductID)); + + tp->ocpl.ProdIDAddr[0] = LOWORD(Addr); + tp->ocpl.ProdIDAddr[1] = HIWORD(Addr); + + return; +} + +/* + * Send OPEN command to adapter + */ +static void sktr_open_adapter(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + if(tp->OpenCommandIssued) + return; + + tp->OpenCommandIssued = 1; + sktr_exec_cmd(dev, OC_OPEN); + + return; +} + +/* + * Clear the adapter's interrupt flag. Clear system interrupt enable + * (SINTEN): disable adapter to system interrupts. + */ +static void sktr_disable_interrupts(struct device *dev) +{ + outb(0, dev->base_addr + SIFACL); + + return; +} + +/* + * Set the adapter's interrupt flag. Set system interrupt enable + * (SINTEN): enable adapter to system interrupts. + */ +static void sktr_enable_interrupts(struct device *dev) +{ + outb(ACL_SINTEN, dev->base_addr + SIFACL); + + return; +} + +/* + * Put command in command queue, try to execute it. + */ +static void sktr_exec_cmd(struct device *dev, unsigned short Command) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + tp->CMDqueue |= Command; + sktr_chk_outstanding_cmds(dev); + + return; +} + +/* + * Linux always gives 18 byte of source routing information in the frame header. + * But the length field can indicate shorter length. Then cut header + * appropriate. + */ +static unsigned char *sktr_fix_srouting(unsigned char *buf, short *FrameLen) +{ + struct trh_hdr *trh = (struct trh_hdr *)buf; + int len; + + if(buf[8] & TR_RII) + { + trh->rcf &= ~SWAPB((unsigned short) TR_RCF_LONGEST_FRAME_MASK); + trh->rcf |= SWAPB((unsigned short) TR_RCF_FRAME4K); + len = (SWAPB(trh->rcf) & TR_RCF_LEN_MASK) >> 8; + if(len < 18) + { + memcpy(&buf[18-len],buf,sizeof(struct trh_hdr)-18+len); + *FrameLen -= (18 - len); + } + return (&buf[18-len]); + } + + return (buf); +} + +/* + * Gets skb from system, queues it and checks if it can be sent + */ +static int sktr_send_packet(struct sk_buff *skb, struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + if(dev->tbusy) + { + /* + * If we get here, some higher level has decided we are broken. + * There should really be a "kick me" function call instead. + * + * Resetting the token ring adapter takes a long time so just + * fake transmission time and go on trying. Our own timeout + * routine is in sktr_timer_chk() + */ + dev->tbusy = 0; + dev->trans_start = jiffies; + return (1); + } + + /* + * If some higher layer thinks we've missed an tx-done interrupt we + * are passed NULL. + */ + if(skb == NULL) + return (0); + + /* + * 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); + return (1); + } + + if(tp->QueueSkb == 0) + return (1); /* Return with tbusy set: queue full */ + + tp->QueueSkb--; + skb_queue_tail(&tp->SendSkbQueue, skb); + sktr_hardware_send_packet(dev, tp); + if(tp->QueueSkb > 0) + dev->tbusy = 0; + + return (0); +} + +/* + * Move frames from internal skb queue into adapter tx queue + */ +static void sktr_hardware_send_packet(struct device *dev, struct net_local* tp) +{ + TPL *tpl; + short length; + unsigned char *buf, *newbuf; + struct sk_buff *skb; + int i; + + for(;;) + { + /* Try to get a free TPL from the chain. + * + * NOTE: We *must* always leave one unused TPL in the chain, + * because otherwise the adapter might send frames twice. + */ + if(tp->TplFree->NextTPLPtr->BusyFlag) /* No free TPL */ + { + printk(KERN_INFO "%s: No free TPL\n", dev->name); + return; + } + + /* Send first buffer from queue */ + skb = skb_dequeue(&tp->SendSkbQueue); + if(skb == NULL) + return; + + tp->QueueSkb++; + /* Is buffer reachable for Busmaster-DMA? */ + if(virt_to_bus((void*)(((long) skb->data) + skb->len)) + > ISA_MAX_ADDRESS) + { + /* Copy frame to local buffer */ + i = tp->TplFree->TPLIndex; + length = skb->len; + buf = tp->LocalTxBuffers[i]; + memcpy(buf, skb->data, length); + newbuf = sktr_fix_srouting(buf, &length); + } + else + { + /* Send direct from skb->data */ + length = skb->len; + newbuf = sktr_fix_srouting(skb->data, &length); + } + + /* Source address in packet? */ + sktr_chk_src_addr(newbuf, dev->dev_addr); + + tp->LastSendTime = jiffies; + tpl = tp->TplFree; /* Get the "free" TPL */ + tpl->BusyFlag = 1; /* Mark TPL as busy */ + tp->TplFree = tpl->NextTPLPtr; + + /* Save the skb for delayed return of skb to system */ + tpl->Skb = skb; + tpl->FragList[0].DataCount = (unsigned short) SWAPB(length); + tpl->FragList[0].DataAddr = htonl(virt_to_bus(newbuf)); + + /* Write the data length in the transmit list. */ + tpl->FrameSize = (unsigned short) SWAPB(length); + tpl->MData = newbuf; + + /* Transmit the frame and set the status values. */ + sktr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME + | TX_END_FRAME | TX_PASS_SRC_ADDR + | TX_FRAME_IRQ); + + /* Let adapter send the frame. */ + sktr_exec_sifcmd(dev, CMD_TX_VALID); + } + + return; +} + +/* + * Write the given value to the 'Status' field of the specified TPL. + * NOTE: This function should be used whenever the status of any TPL must be + * modified by the driver, because the compiler may otherwise change the + * order of instructions such that writing the TPL status may be executed at + * an undesireable time. When this function is used, the status is always + * written when the function is called. + */ +static void sktr_write_tpl_status(TPL *tpl, unsigned int Status) +{ + tpl->Status = Status; +} + +static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr) +{ + unsigned char SRBit; + + if((((unsigned long)frame[8]) & ~0x80) != 0) /* Compare 4 bytes */ + return; + if((unsigned short)frame[12] != 0) /* Compare 2 bytes */ + return; + + SRBit = frame[8] & 0x80; + memcpy(&frame[8], hw_addr, 6); + frame[8] |= SRBit; + + return; +} + +/* + * The timer routine: Check if adapter still open and working, reopen if not. + */ +static void sktr_timer_chk(unsigned long data) +{ + struct device *dev = (struct device*)data; + struct net_local *tp = (struct net_local*)dev->priv; + + if(tp->HaltInProgress) + return; + + sktr_chk_outstanding_cmds(dev); + if(tp->LastSendTime + SEND_TIMEOUT < jiffies + && (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy)) + { + /* Anything to send, but stalled to long */ + tp->LastSendTime = jiffies; + sktr_exec_cmd(dev, OC_CLOSE); /* Does reopen automatically */ + } + + tp->timer.expires = jiffies + 2*HZ; + add_timer(&tp->timer); + + if(tp->AdapterOpenFlag || tp->ReOpenInProgress) + return; + tp->ReOpenInProgress = 1; + sktr_open_adapter(dev); + + return; +} + +/* + * The typical workload of the driver: Handle the network interface interrupts. + */ +static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + struct device *dev = dev_id; + struct net_local *tp; + int ioaddr; + unsigned short irq_type; + + if(dev == NULL) + { + printk("%s: irq %d for unknown device.\n", dev->name, irq); + return; + } + + dev->interrupt = 1; + + ioaddr = dev->base_addr; + tp = (struct net_local *)dev->priv; + + irq_type = inw(ioaddr + SIFSTS); + + while(irq_type & STS_SYSTEM_IRQ) + { + irq_type &= STS_IRQ_MASK; + + if(!sktr_chk_ssb(tp, irq_type)) + { + printk(KERN_INFO "%s: DATA LATE occured\n", dev->name); + break; + } + + switch(irq_type) + { + case STS_IRQ_RECEIVE_STATUS: + sktr_reset_interrupt(dev); + sktr_rcv_status_irq(dev); + break; + + case STS_IRQ_TRANSMIT_STATUS: + /* Check if TRANSMIT.HALT command is complete */ + if(tp->ssb.Parm[0] & COMMAND_COMPLETE) + { + tp->TransmitCommandActive = 0; + tp->TransmitHaltScheduled = 0; + + /* Issue a new transmit command. */ + sktr_exec_cmd(dev, OC_TRANSMIT); + } + + sktr_reset_interrupt(dev); + sktr_tx_status_irq(dev); + break; + + case STS_IRQ_COMMAND_STATUS: + /* The SSB contains status of last command + * other than receive/transmit. + */ + sktr_cmd_status_irq(dev); + break; + + case STS_IRQ_SCB_CLEAR: + /* The SCB is free for another command. */ + tp->ScbInUse = 0; + sktr_chk_outstanding_cmds(dev); + break; + + case STS_IRQ_RING_STATUS: + sktr_ring_status_irq(dev); + break; + + case STS_IRQ_ADAPTER_CHECK: + sktr_chk_irq(dev); + break; + + default: + printk(KERN_INFO "Unknown Token Ring IRQ\n"); + break; + } + + /* Reset system interrupt if not already done. */ + if(irq_type != STS_IRQ_TRANSMIT_STATUS + && irq_type != STS_IRQ_RECEIVE_STATUS) + { + sktr_reset_interrupt(dev); + } + + irq_type = inw(ioaddr + SIFSTS); + } + + dev->interrupt = 0; + + return; +} + +/* + * Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command. + */ +static void sktr_reset_interrupt(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + SSB *ssb = &tp->ssb; + + /* + * [Workaround for "Data Late"] + * Set all fields of the SSB to well-defined values so we can + * check if the adapter has written the SSB. + */ + + ssb->STS = (unsigned short) -1; + ssb->Parm[0] = (unsigned short) -1; + ssb->Parm[1] = (unsigned short) -1; + ssb->Parm[2] = (unsigned short) -1; + + /* Free SSB by issuing SSB_CLEAR command after reading IRQ code + * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts. + */ + sktr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ); + + return; +} + +/* + * Check if the SSB has actually been written by the adapter. + */ +static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType) +{ + SSB *ssb = &tp->ssb; /* The address of the SSB. */ + + /* C 0 1 2 INTERRUPT CODE + * - - - - -------------- + * 1 1 1 1 TRANSMIT STATUS + * 1 1 1 1 RECEIVE STATUS + * 1 ? ? 0 COMMAND STATUS + * 0 0 0 0 SCB CLEAR + * 1 1 0 0 RING STATUS + * 0 0 0 0 ADAPTER CHECK + * + * 0 = SSB field not affected by interrupt + * 1 = SSB field is affected by interrupt + * + * C = SSB ADDRESS +0: COMMAND + * 0 = SSB ADDRESS +2: STATUS 0 + * 1 = SSB ADDRESS +4: STATUS 1 + * 2 = SSB ADDRESS +6: STATUS 2 + */ + + /* Check if this interrupt does use the SSB. */ + + if(IrqType != STS_IRQ_TRANSMIT_STATUS + && IrqType != STS_IRQ_RECEIVE_STATUS + && IrqType != STS_IRQ_COMMAND_STATUS + && IrqType != STS_IRQ_RING_STATUS) + { + return (1); /* SSB not involved. */ + } + + /* Note: All fields of the SSB have been set to all ones (-1) after it + * has last been used by the software (see DriverIsr()). + * + * Check if the affected SSB fields are still unchanged. + */ + + if(ssb->STS == (unsigned short) -1) + return (0); /* Command field not yet available. */ + if(IrqType == STS_IRQ_COMMAND_STATUS) + return (1); /* Status fields not always affected. */ + if(ssb->Parm[0] == (unsigned short) -1) + return (0); /* Status 1 field not yet available. */ + if(IrqType == STS_IRQ_RING_STATUS) + return (1); /* Status 2 & 3 fields not affected. */ + + /* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */ + if(ssb->Parm[1] == (unsigned short) -1) + return (0); /* Status 2 field not yet available. */ + if(ssb->Parm[2] == (unsigned short) -1) + return (0); /* Status 3 field not yet available. */ + + return (1); /* All SSB fields have been written by the adapter. */ +} + +/* + * Evaluates the command results status in the SSB status field. + */ +static void sktr_cmd_status_irq(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short ssb_cmd, ssb_parm_0; + unsigned short ssb_parm_1; + char *open_err = "Open error -"; + char *code_err = "Open code -"; + + /* Copy the ssb values to local variables */ + ssb_cmd = tp->ssb.STS; + ssb_parm_0 = tp->ssb.Parm[0]; + ssb_parm_1 = tp->ssb.Parm[1]; + + if(ssb_cmd == OPEN) + { + tp->Sleeping = 0; + if(!tp->ReOpenInProgress) + wake_up_interruptible(&tp->wait_for_tok_int); + + tp->OpenCommandIssued = 0; + tp->ScbInUse = 0; + + if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION) + { + /* Success, the adapter is open. */ + tp->LobeWireFaultLogged = 0; + tp->AdapterOpenFlag = 1; + tp->AdapterVirtOpenFlag = 1; + tp->TransmitCommandActive = 0; + sktr_exec_cmd(dev, OC_TRANSMIT); + sktr_exec_cmd(dev, OC_RECEIVE); + + if(tp->ReOpenInProgress) + tp->ReOpenInProgress = 0; + + return; + } + else /* The adapter did not open. */ + { + if(ssb_parm_0 & NODE_ADDR_ERROR) + printk(KERN_INFO "%s: Node address error\n", + dev->name); + if(ssb_parm_0 & LIST_SIZE_ERROR) + printk(KERN_INFO "%s: List size error\n", + dev->name); + if(ssb_parm_0 & BUF_SIZE_ERROR) + printk(KERN_INFO "%s: Buffer size error\n", + dev->name); + if(ssb_parm_0 & TX_BUF_COUNT_ERROR) + printk(KERN_INFO "%s: Tx buffer count error\n", + dev->name); + if(ssb_parm_0 & INVALID_OPEN_OPTION) + printk(KERN_INFO "%s: Invalid open option\n", + dev->name); + if(ssb_parm_0 & OPEN_ERROR) + { + /* Show the open phase. */ + switch(ssb_parm_0 & OPEN_PHASES_MASK) + { + case LOBE_MEDIA_TEST: + if(!tp->LobeWireFaultLogged) + { + tp->LobeWireFaultLogged = 1; + printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err); + } + tp->ReOpenInProgress = 1; + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 1; + sktr_open_adapter(dev); + return; + + case PHYSICAL_INSERTION: + printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err); + break; + + case ADDRESS_VERIFICATION: + printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err); + break; + + case PARTICIPATION_IN_RING_POLL: + printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err); + break; + + case REQUEST_INITIALISATION: + printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err); + break; + + case FULLDUPLEX_CHECK: + printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err); + break; + + default: + printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err); + break; + } + + /* Show the open errors. */ + switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK) + { + case OPEN_FUNCTION_FAILURE: + printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FUNCTION_FAILURE; + break; + + case OPEN_SIGNAL_LOSS: + printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_SIGNAL_LOSS; + break; + + case OPEN_TIMEOUT: + printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_TIMEOUT; + break; + + case OPEN_RING_FAILURE: + printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_RING_FAILURE; + break; + + case OPEN_RING_BEACONING: + printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_RING_BEACONING; + break; + + case OPEN_DUPLICATE_NODEADDR: + printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_DUPLICATE_NODEADDR; + break; + + case OPEN_REQUEST_INIT: + printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_REQUEST_INIT; + break; + + case OPEN_REMOVE_RECEIVED: + printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err); + tp->LastOpenStatus = + OPEN_REMOVE_RECEIVED; + break; + + case OPEN_FULLDUPLEX_SET: + printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FULLDUPLEX_SET; + break; + + default: + printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FUNCTION_FAILURE; + break; + } + } + + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 0; + + return; + } + } + else + { + if(ssb_cmd != READ_ERROR_LOG) + return; + + /* Add values from the error log table to the MAC + * statistics counters and update the errorlogtable + * memory. + */ + tp->MacStat.line_errors += tp->errorlogtable.Line_Error; + tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error; + tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error; + tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error; + tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error; + tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error; + tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error; + tp->MacStat.token_errors += tp->errorlogtable.Token_Error; + tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error; + tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error; + tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters; + tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error; + tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error; + } + + return; +} + +/* + * The inverse routine to sktr_open(). + */ +static int sktr_close(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + dev->tbusy = 1; + dev->start = 0; + + del_timer(&tp->timer); + + /* Flush the Tx and disable Rx here. */ + + tp->HaltInProgress = 1; + sktr_exec_cmd(dev, OC_CLOSE); + tp->timer.expires = jiffies + 1*HZ; + tp->timer.function = sktr_timer_end_wait; + tp->timer.data = (unsigned long)dev; + add_timer(&tp->timer); + + sktr_enable_interrupts(dev); + + tp->Sleeping = 1; + interruptible_sleep_on(&tp->wait_for_tok_int); + tp->TransmitCommandActive = 0; + + del_timer(&tp->timer); + sktr_disable_interrupts(dev); + + if(dev->dma > 0) + disable_dma(dev->dma); + outw(0xFF00, dev->base_addr + SIFCMD); + if(dev->dma > 0) + outb(0xff, dev->base_addr + POSREG); + +#ifdef MODULE + MOD_DEC_USE_COUNT; +#endif + + sktr_cancel_tx_queue(tp); + + return (0); +} + +/* + * Get the current statistics. This may be called with the card open + * or closed. + */ +static struct enet_statistics *sktr_get_stats(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + return ((struct enet_statistics *)&tp->MacStat); +} + +/* + * Set or clear the multicast filter for this adapter. + */ +static void sktr_set_multicast_list(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned int OpenOptions; + + OpenOptions = tp->ocpl.OPENOptions & + ~(PASS_ADAPTER_MAC_FRAMES + | PASS_ATTENTION_FRAMES + | PASS_BEACON_MAC_FRAMES + | COPY_ALL_MAC_FRAMES + | COPY_ALL_NON_MAC_FRAMES); + + if(dev->flags & IFF_PROMISC) + /* Enable promiscuous mode */ + OpenOptions |= COPY_ALL_NON_MAC_FRAMES | COPY_ALL_MAC_FRAMES; + else + { + if(dev->flags & IFF_ALLMULTI) + /* || dev->mc_count > HW_MAX_ADDRS) */ + { + /* Disable promiscuous mode, use normal mode. */ + } + else + { + if(dev->mc_count) + { + /* Walk the address list, and load the filter */ + } + } + } + + tp->ocpl.OPENOptions = OpenOptions; + sktr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS); + + return; +} + +/* + * Wait for some time (microseconds) + */ +static void sktr_wait(unsigned long time) +{ + long tmp; + + tmp = jiffies + time/(1000000/HZ); + do { + current->timeout = tmp; + current->state = TASK_INTERRUPTIBLE; + schedule(); + } while(tmp > jiffies); + + return; +} + +/* + * Write a command value to the SIFCMD register + */ +static void sktr_exec_sifcmd(struct device *dev, unsigned int WriteValue) +{ + int ioaddr = dev->base_addr; + unsigned short cmd; + unsigned short SifStsValue; + unsigned long loop_counter; + + WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER); + cmd = (unsigned short)WriteValue; + loop_counter = 0,5 * 800000; + do { + SifStsValue = inw(ioaddr + SIFSTS); + } while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--); + outw(cmd, ioaddr + SIFCMD); + + return; +} + +/* + * Processes adapter hardware reset, halts adapter and downloads firmware, + * clears the halt bit. + */ +static int sktr_reset_adapter(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short *fw_ptr = (unsigned short *)&sktr_code; + unsigned short count, c; + int ioaddr = dev->base_addr; + + /* Hardware adapter reset */ + outw(ACL_ARESET, ioaddr + SIFACL); + sktr_wait(40); + + c = inw(ioaddr + SIFACL); + sktr_wait(20); + + if(dev->dma == 0) /* For PCI adapters */ + { + c &= ~(ACL_SPEED4 | ACL_SPEED16); /* Clear bits */ + if(tp->DataRate == SPEED_4) + c |= ACL_SPEED4; /* Set 4Mbps */ + else + c |= ACL_SPEED16; /* Set 16Mbps */ + } + + /* In case a comand is pending - forget it */ + tp->ScbInUse = 0; + + c &= ~ACL_ARESET; /* Clear adapter reset bit */ + c |= ACL_CPHALT; /* Halt adapter CPU, allow download */ + c &= ~ACL_PSDMAEN; /* Clear pseudo dma bit */ + outw(c, ioaddr + SIFACL); + sktr_wait(40); + + /* Download firmware via DIO interface: */ + do { + /* Download first address part */ + outw(*fw_ptr, ioaddr + SIFADX); + fw_ptr++; + + /* Download second address part */ + outw(*fw_ptr, ioaddr + SIFADD); + fw_ptr++; + + if((count = *fw_ptr) != 0) /* Load loop counter */ + { + fw_ptr++; /* Download block data */ + for(; count > 0; count--) + { + outw(*fw_ptr, ioaddr + SIFINC); + fw_ptr++; + } + } + else /* Stop, if last block downloaded */ + { + c = inw(ioaddr + SIFACL); + c &= (~ACL_CPHALT | ACL_SINTEN); + + /* Clear CPHALT and start BUD */ + outw(c, ioaddr + SIFACL); + return (1); + } + } while(count == 0); + + return (-1); +} + +/* + * Starts bring up diagnostics of token ring adapter and evaluates + * diagnostic results. + */ +static int sktr_bringup_diags(struct device *dev) +{ + int loop_cnt, retry_cnt; + unsigned short Status; + int ioaddr = dev->base_addr; + + sktr_wait(HALF_SECOND); + sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); + sktr_wait(HALF_SECOND); + + retry_cnt = BUD_MAX_RETRIES; /* maximal number of retrys */ + + do { + retry_cnt--; + if(sktr_debug > 3) + printk(KERN_INFO "BUD-Status: \n"); + loop_cnt = BUD_MAX_LOOPCNT; /* maximum: three seconds*/ + do { /* Inspect BUD results */ + loop_cnt--; + sktr_wait(HALF_SECOND); + Status = inw(ioaddr + SIFSTS); + Status &= STS_MASK; + + if(sktr_debug > 3) + printk(KERN_INFO " %04X \n", Status); + /* BUD successfully completed */ + if(Status == STS_INITIALIZE) + return (1); + /* Unrecoverable hardware error, BUD not completed? */ + } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST)) + != (STS_ERROR | STS_TEST))); + + /* Error preventing completion of BUD */ + if(retry_cnt > 0) + { + printk(KERN_INFO "%s: Adapter Software Reset.\n", + dev->name); + sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); + sktr_wait(HALF_SECOND); + } + } while(retry_cnt > 0); + + Status = inw(ioaddr + SIFSTS); + Status &= STS_ERROR_MASK; /* Hardware error occured! */ + + printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n", + dev->name, Status); + + return (-1); +} + +/* + * Copy initialisation data to adapter memory, beginning at address + * 1:0A00; Starting DMA test and evaluating result bits. + */ +static int sktr_init_adapter(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B}; + const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7, + 0xC5, 0xD9, 0xC3, 0xD4}; + void *ptr = (void *)&tp->ipb; + unsigned short *ipb_ptr = (unsigned short *)ptr; + unsigned char *cb_ptr = (unsigned char *) &tp->scb; + unsigned char *sb_ptr = (unsigned char *) &tp->ssb; + unsigned short Status; + int i, loop_cnt, retry_cnt; + int ioaddr = dev->base_addr; + + /* Normalize: byte order low/high, word order high/low! (only IPB!) */ + tp->ipb.SCB_Addr = SWAPW(virt_to_bus(&tp->scb)); + tp->ipb.SSB_Addr = SWAPW(virt_to_bus(&tp->ssb)); + + /* Maximum: three initialization retries */ + retry_cnt = INIT_MAX_RETRIES; + + do { + retry_cnt--; + + /* Transfer initialization block */ + outw(0x0001, ioaddr + SIFADX); + + /* To address 0001:0A00 of adapter RAM */ + outw(0x0A00, ioaddr + SIFADD); + + /* Write 11 words to adapter RAM */ + for(i = 0; i < 11; i++) + outw(ipb_ptr[i], ioaddr + SIFINC); + + /* Execute SCB adapter command */ + sktr_exec_sifcmd(dev, CMD_EXECUTE); + + loop_cnt = INIT_MAX_LOOPCNT; /* Maximum: 11 seconds */ + + /* While remaining retries, no error and not completed */ + do { + Status = 0; + loop_cnt--; + sktr_wait(HALF_SECOND); + + /* Mask interesting status bits */ + Status = inw(ioaddr + SIFSTS); + Status &= STS_MASK; + } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0) + && ((Status & STS_ERROR) == 0) && (loop_cnt != 0)); + + if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0) + { + /* Initialization completed without error */ + i = 0; + do { /* Test if contents of SCB is valid */ + if(SCB_Test[i] != *(cb_ptr + i)) + /* DMA data error: wrong data in SCB */ + return (-1); + i++; + } while(i < 6); + + i = 0; + do { /* Test if contents of SSB is valid */ + if(SSB_Test[i] != *(sb_ptr + i)) + /* DMA data error: wrong data in SSB */ + return (-1); + i++; + } while (i < 8); + + return (1); /* Adapter successfully initialized */ + } + else + { + if((Status & STS_ERROR) != 0) + { + /* Initialization error occured */ + Status = inw(ioaddr + SIFSTS); + Status &= STS_ERROR_MASK; + /* ShowInitialisationErrorCode(Status); */ + return (-1); /* Unrecoverable error */ + } + else + { + if(retry_cnt > 0) + { + /* Reset adapter and try init again */ + sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); + sktr_wait(HALF_SECOND); + } + } + } + } while(retry_cnt > 0); + + return (-1); +} + +/* + * Check for outstanding commands in command queue and tries to execute + * command immediately. Corresponding command flag in command queue is cleared. + */ +static void sktr_chk_outstanding_cmds(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned long Addr = 0; + unsigned char i = 0; + + if(tp->CMDqueue == 0) + return; /* No command execution */ + + /* If SCB in use: no command */ + if(tp->ScbInUse == 1) + return; + + /* Check if adapter is opened, avoiding COMMAND_REJECT + * interrupt by the adapter! + */ + if(tp->AdapterOpenFlag == 0) + { + if(tp->CMDqueue & OC_OPEN) + { + /* Execute OPEN command */ + tp->CMDqueue ^= OC_OPEN; + + /* Copy the 18 bytes of the product ID */ + while((AdapterName[i] != '\0') && (i < PROD_ID_SIZE)) + { + tp->ProductID[i] = AdapterName[i]; + i++; + } + + Addr = htonl(virt_to_bus(&tp->ocpl)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = OPEN; + } + else + /* No OPEN command queued, but adapter closed. Note: + * We'll try to re-open the adapter in DriverPoll() + */ + return; /* No adapter command issued */ + } + else + { + /* Adapter is open; evaluate command queue: try to execute + * outstanding commands (depending on priority!) CLOSE + * command queued + */ + if(tp->CMDqueue & OC_CLOSE) + { + tp->CMDqueue ^= OC_CLOSE; + tp->AdapterOpenFlag = 0; + tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */ + tp->scb.Parm[1] = 0; /* but should be set to zero! */ + tp->scb.CMD = CLOSE; + if(!tp->HaltInProgress) + tp->CMDqueue |= OC_OPEN; /* re-open adapter */ + else + tp->CMDqueue = 0; /* no more commands */ + } + else + { + if(tp->CMDqueue & OC_RECEIVE) + { + tp->CMDqueue ^= OC_RECEIVE; + Addr = htonl(virt_to_bus(tp->RplHead)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = RECEIVE; + } + else + { + if(tp->CMDqueue & OC_TRANSMIT_HALT) + { + /* NOTE: TRANSMIT.HALT must be checked + * before TRANSMIT. + */ + tp->CMDqueue ^= OC_TRANSMIT_HALT; + tp->scb.CMD = TRANSMIT_HALT; + + /* Parm[0] and Parm[1] are ignored + * but should be set to zero! + */ + tp->scb.Parm[0] = 0; + tp->scb.Parm[1] = 0; + } + else + { + if(tp->CMDqueue & OC_TRANSMIT) + { + /* NOTE: TRANSMIT must be + * checked after TRANSMIT.HALT + */ + if(tp->TransmitCommandActive) + { + if(!tp->TransmitHaltScheduled) + { + tp->TransmitHaltScheduled = 1; + sktr_exec_cmd(dev, OC_TRANSMIT_HALT) ; + } + tp->TransmitCommandActive = 0; + return; + } + + tp->CMDqueue ^= OC_TRANSMIT; + sktr_cancel_tx_queue(tp); + Addr = htonl(virt_to_bus(tp->TplBusy)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = TRANSMIT; + tp->TransmitCommandActive = 1; + } + else + { + if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS) + { + tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS; + tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/ + tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION; + tp->scb.Parm[1] = 0; /* is ignored but should be zero */ + tp->scb.CMD = MODIFY_OPEN_PARMS; + } + else + { + if(tp->CMDqueue & OC_SET_FUNCT_ADDR) + { + tp->CMDqueue ^= OC_SET_FUNCT_ADDR; + tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr); + tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr); + tp->scb.CMD = SET_FUNCT_ADDR; + } + else + { + if(tp->CMDqueue & OC_SET_GROUP_ADDR) + { + tp->CMDqueue ^= OC_SET_GROUP_ADDR; + tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr); + tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr); + tp->scb.CMD = SET_GROUP_ADDR; + } + else + { + if(tp->CMDqueue & OC_READ_ERROR_LOG) + { + tp->CMDqueue ^= OC_READ_ERROR_LOG; + Addr = htonl(virt_to_bus(&tp->errorlogtable)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = READ_ERROR_LOG; + } + else + { + printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n"); + tp->CMDqueue = 0; + return; + } + } + } + } + } + } + } + } + } + + tp->ScbInUse = 1; /* Set semaphore: SCB in use. */ + + /* Execute SCB and generate IRQ when done. */ + sktr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST); + + return; +} + +/* + * IRQ conditions: signal loss on the ring, transmit or receive of beacon + * frames (disabled if bit 1 of OPEN option is set); report error MAC + * frame transmit (disabled if bit 2 of OPEN option is set); open or short + * cirquit fault on the lobe is detected; remove MAC frame received; + * error counter overflow (255); opened adapter is the only station in ring. + * After some of the IRQs the adapter is closed! + */ +static void sktr_ring_status_irq(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + tp->CurrentRingStatus = SWAPB(tp->ssb.Parm[0]); + + /* First: fill up statistics */ + if(tp->ssb.Parm[0] & SIGNAL_LOSS) + { + printk(KERN_INFO "%s: Signal Loss\n", dev->name); + tp->MacStat.line_errors++; + } + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT) + { + printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", + dev->name); + tp->MacStat.line_errors++; + } + + if(tp->ssb.Parm[0] & RING_RECOVERY) + printk(KERN_INFO "%s: Ring Recovery\n", dev->name); + + /* Counter overflow: read error log */ + if(tp->ssb.Parm[0] & COUNTER_OVERFLOW) + { + printk(KERN_INFO "%s: Counter Overflow\n", dev->name); + sktr_exec_cmd(dev, OC_READ_ERROR_LOG); + } + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & REMOVE_RECEIVED) + printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", + dev->name); + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR) + printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", + dev->name); + + if(tp->ssb.Parm[0] & HARD_ERROR) + printk(KERN_INFO "%s: Hard Error\n", dev->name); + + if(tp->ssb.Parm[0] & SOFT_ERROR) + printk(KERN_INFO "%s: Soft Error\n", dev->name); + + if(tp->ssb.Parm[0] & TRANSMIT_BEACON) + printk(KERN_INFO "%s: Transmit Beacon\n", dev->name); + + if(tp->ssb.Parm[0] & SINGLE_STATION) + printk(KERN_INFO "%s: Single Station\n", dev->name); + + /* Check if adapter has been closed */ + if(tp->ssb.Parm[0] & ADAPTER_CLOSED) + { + printk(KERN_INFO "%s: Adapter closed (Reopening)," + "QueueSkb %d, CurrentRingStat %x\n", + dev->name, tp->QueueSkb, tp->CurrentRingStatus); + tp->AdapterOpenFlag = 0; + sktr_open_adapter(dev); + } + + return; +} + +/* + * Issued if adapter has encountered an unrecoverable hardware + * or software error. + */ +static void sktr_chk_irq(struct device *dev) +{ + int i; + unsigned short AdapterCheckBlock[4]; + unsigned short ioaddr = dev->base_addr; + struct net_local *tp = (struct net_local *)dev->priv; + + tp->AdapterOpenFlag = 0; /* Adapter closed now */ + + /* Page number of adapter memory */ + outw(0x0001, ioaddr + SIFADX); + /* Address offset */ + outw(CHECKADDR, ioaddr + SIFADR); + + /* Reading 8 byte adapter check block. */ + for(i = 0; i < 4; i++) + AdapterCheckBlock[i] = inw(ioaddr + SIFINC); + + if(sktr_debug > 3) + { + printk("%s: AdapterCheckBlock: ", dev->name); + for (i = 0; i < 4; i++) + printk("%04X", AdapterCheckBlock[i]); + printk("\n"); + } + + switch(AdapterCheckBlock[0]) + { + case DIO_PARITY: + printk(KERN_INFO "%s: DIO parity error\n", dev->name); + break; + + case DMA_READ_ABORT: + printk(KERN_INFO "%s DMA read operation aborted:\n", + dev->name); + switch (AdapterCheckBlock[1]) + { + case 0: + printk(KERN_INFO "Timeout\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 1: + printk(KERN_INFO "Parity error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 2: + printk(KERN_INFO "Bus error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + default: + printk(KERN_INFO "Unknown error.\n"); + break; + } + break; + + case DMA_WRITE_ABORT: + printk(KERN_INFO "%s: DMA write operation aborted: \n", + dev->name); + switch (AdapterCheckBlock[1]) + { + case 0: + printk(KERN_INFO "Timeout\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 1: + printk(KERN_INFO "Parity error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 2: + printk(KERN_INFO "Bus error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + default: + printk(KERN_INFO "Unknown error.\n"); + break; + } + break; + + case ILLEGAL_OP_CODE: + printk("%s: Illegal operation code in firmware\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case PARITY_ERRORS: + printk("%s: Adapter internal bus parity error\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case RAM_DATA_ERROR: + printk("%s: RAM data error\n", dev->name); + /* Parm[0-1]: MSW/LSW address of RAM location. */ + break; + + case RAM_PARITY_ERROR: + printk("%s: RAM parity error\n", dev->name); + /* Parm[0-1]: MSW/LSW address of RAM location. */ + break; + + case RING_UNDERRUN: + printk("%s: Internal DMA underrun detected\n", + dev->name); + break; + + case INVALID_IRQ: + printk("%s: Unrecognized interrupt detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case INVALID_ERROR_IRQ: + printk("%s: Unrecognized error interrupt detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case INVALID_XOP: + printk("%s: Unrecognized XOP request detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + default: + printk("%s: Unknown status", dev->name); + break; + } + + if(sktr_chipset_init(dev) == 1) + { + /* Restart of firmware successful */ + tp->AdapterOpenFlag = 1; + } + + return; +} + +/* + * Internal adapter pointer to RAM data are copied from adapter into + * host system. + */ +static void sktr_read_ptr(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short adapterram; + + sktr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr, + ADAPTER_INT_PTRS, 16); + sktr_read_ram(dev, (unsigned char *)&adapterram, + (unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2); + + printk(KERN_INFO "%s: Adapter RAM size: %d K\n", + dev->name, SWAPB(adapterram)); + + return; +} + +/* + * Reads a number of bytes from adapter to system memory. + */ +static void sktr_read_ram(struct device *dev, unsigned char *Data, + unsigned short Address, int Length) +{ + int i; + unsigned short old_sifadx, old_sifadr, InWord; + unsigned short ioaddr = dev->base_addr; + + /* Save the current values */ + old_sifadx = inw(ioaddr + SIFADX); + old_sifadr = inw(ioaddr + SIFADR); + + /* Page number of adapter memory */ + outw(0x0001, ioaddr + SIFADX); + /* Address offset in adapter RAM */ + outw(Address, ioaddr + SIFADR); + + /* Copy len byte from adapter memory to system data area. */ + i = 0; + for(;;) + { + InWord = inw(ioaddr + SIFINC); + + *(Data + i) = HIBYTE(InWord); /* Write first byte */ + if(++i == Length) /* All is done break */ + break; + + *(Data + i) = LOBYTE(InWord); /* Write second byte */ + if (++i == Length) /* All is done break */ + break; + } + + /* Restore original values */ + outw(old_sifadx, ioaddr + SIFADX); + outw(old_sifadr, ioaddr + SIFADR); + + return; +} + +/* + * Reads MAC address from adapter ROM. + */ +static void sktr_read_addr(struct device *dev, unsigned char *Address) +{ + int i, In; + unsigned short ioaddr = dev->base_addr; + + /* Address: 0000:0000 */ + outw(0, ioaddr + SIFADX); + outw(0, ioaddr + SIFADR); + + /* Read six byte MAC address data */ + for(i = 0; i < 6; i++) + { + In = inw(ioaddr + SIFINC); + *(Address + i) = (unsigned char)(In >> 8); + } + + return; +} + +/* + * Cancel all queued packets in the transmission queue. + */ +static void sktr_cancel_tx_queue(struct net_local* tp) +{ + TPL *tpl; + struct sk_buff *skb; + + /* + * NOTE: There must not be an active TRANSMIT command pending, when + * this function is called. + */ + if(tp->TransmitCommandActive) + return; + + for(;;) + { + tpl = tp->TplBusy; + if(!tpl->BusyFlag) + break; + /* "Remove" TPL from busy list. */ + tp->TplBusy = tpl->NextTPLPtr; + sktr_write_tpl_status(tpl, 0); /* Clear VALID bit */ + tpl->BusyFlag = 0; /* "free" TPL */ + + printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl); + + dev_kfree_skb(tpl->Skb); + } + + for(;;) + { + skb = skb_dequeue(&tp->SendSkbQueue); + if(skb == NULL) + break; + tp->QueueSkb++; + dev_kfree_skb(skb); + } + + return; +} + +/* + * This function is called whenever a transmit interrupt is generated by the + * adapter. For a command complete interrupt, it is checked if we have to + * issue a new transmit command or not. + */ +static void sktr_tx_status_irq(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char HighByte, HighAc, LowAc; + TPL *tpl; + + /* NOTE: At this point the SSB from TRANSMIT STATUS is no longer + * available, because the CLEAR SSB command has already been issued. + * + * Process all complete transmissions. + */ + + for(;;) + { + tpl = tp->TplBusy; + if(!tpl->BusyFlag || (tpl->Status + & (TX_VALID | TX_FRAME_COMPLETE)) + != TX_FRAME_COMPLETE) + { + break; + } + + /* "Remove" TPL from busy list. */ + tp->TplBusy = tpl->NextTPLPtr ; + + if(sktr_debug > 3) + sktr_dump(tpl->MData, SWAPB(tpl->FrameSize)); + + /* Check the transmit status field only for directed frames*/ + if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0) + { + HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status); + HighAc = GET_FRAME_STATUS_HIGH_AC(HighByte); + LowAc = GET_FRAME_STATUS_LOW_AC(HighByte); + + if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED)) + { + printk(KERN_INFO "%s: (DA=%08lX not recognized)", + dev->name, + *(unsigned long *)&tpl->MData[2+2]); + } + else + { + if(sktr_debug > 3) + printk("%s: Directed frame tx'd\n", + dev->name); + } + } + else + { + if(!DIRECTED_FRAME(tpl)) + { + if(sktr_debug > 3) + printk("%s: Broadcast frame tx'd\n", + dev->name); + } + } + + tp->MacStat.tx_packets++; + dev_kfree_skb(tpl->Skb); + tpl->BusyFlag = 0; /* "free" TPL */ + } + + dev->tbusy = 0; + if(tp->QueueSkb < MAX_TX_QUEUE) + sktr_hardware_send_packet(dev, tp); + + return; +} + +/* + * Called if a frame receive interrupt is generated by the adapter. + * Check if the frame is valid and indicate it to system. + */ +static void sktr_rcv_status_irq(struct device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char *ReceiveDataPtr; + struct sk_buff *skb; + unsigned int Length, Length2; + RPL *rpl; + RPL *SaveHead; + + /* NOTE: At this point the SSB from RECEIVE STATUS is no longer + * available, because the CLEAR SSB command has already been issued. + * + * Process all complete receives. + */ + + for(;;) + { + rpl = tp->RplHead; + if(rpl->Status & RX_VALID) + break; /* RPL still in use by adapter */ + + /* Forward RPLHead pointer to next list. */ + SaveHead = tp->RplHead; + tp->RplHead = rpl->NextRPLPtr; + + /* Get the frame size (Byte swap for Intel). + * Do this early (see workaround comment below) + */ + Length = (unsigned short)SWAPB(rpl->FrameSize); + + /* Check if the Frame_Start, Frame_End and + * Frame_Complete bits are set. + */ + if((rpl->Status & VALID_SINGLE_BUFFER_FRAME) + == VALID_SINGLE_BUFFER_FRAME) + { + ReceiveDataPtr = rpl->MData; + + /* Workaround for delayed write of FrameSize on ISA + * (FrameSize is false but valid-bit is reset) + * Frame size is set to zero when the RPL is freed. + * Length2 is there because there have also been + * cases where the FrameSize was partially written + */ + Length2 = (unsigned short)SWAPB(rpl->FrameSize); + + if(Length == 0 || Length != Length2) + { + tp->RplHead = SaveHead; + break; /* Return to sktr_interrupt */ + } + + /* Drop frames sent by myself */ + if(sktr_chk_frame(dev, rpl->MData)) + { + printk(KERN_INFO "%s: Received my own frame\n", + dev->name); + if(rpl->Skb != NULL) + dev_kfree_skb(rpl->Skb); + } + else + { + sktr_update_rcv_stats(tp,ReceiveDataPtr,Length); + + if(sktr_debug > 3) + printk("%s: Packet Length %04X (%d)\n", + dev->name, Length, Length); + + /* Indicate the received frame to system the + * adapter does the Source-Routing padding for + * us. See: OpenOptions in sktr_init_opb() + */ + skb = rpl->Skb; + if(rpl->SkbStat == SKB_UNAVAILABLE) + { + /* Try again to allocate skb */ + skb = dev_alloc_skb(tp->MaxPacketSize); + if(skb == NULL) + { + /* Update Stats ?? */ + } + else + { + skb->dev = dev; + skb_put(skb, tp->MaxPacketSize); + rpl->SkbStat = SKB_DATA_COPY; + ReceiveDataPtr = rpl->MData; + } + } + + if(rpl->SkbStat == SKB_DATA_COPY + || rpl->SkbStat == SKB_DMA_DIRECT) + { + if(rpl->SkbStat == SKB_DATA_COPY) + { + memmove(skb->data, ReceiveDataPtr, Length); + } + + /* Deliver frame to system */ + rpl->Skb = NULL; + skb_trim(skb,Length); + skb->protocol = tr_type_trans(skb,dev); + netif_rx(skb); + } + } + } + else /* Invalid frame */ + { + if(rpl->Skb != NULL) + dev_kfree_skb(rpl->Skb); + + /* Skip list. */ + if(rpl->Status & RX_START_FRAME) + /* Frame start bit is set -> overflow. */ + tp->MacStat.rx_errors++; + } + + /* Allocate new skb for rpl */ + rpl->Skb = dev_alloc_skb(tp->MaxPacketSize); + + /* skb == NULL ? then use local buffer */ + if(rpl->Skb == NULL) + { + rpl->SkbStat = SKB_UNAVAILABLE; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); + rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; + } + else /* skb != NULL */ + { + rpl->Skb->dev = dev; + skb_put(rpl->Skb, tp->MaxPacketSize); + + /* Data unreachable for DMA ? then use local buffer */ + if(virt_to_bus(rpl->Skb->data) + tp->MaxPacketSize + > ISA_MAX_ADDRESS) + { + rpl->SkbStat = SKB_DATA_COPY; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); + rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; + } + else + { + /* DMA directly in skb->data */ + rpl->SkbStat = SKB_DMA_DIRECT; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(rpl->Skb->data)); + rpl->MData = rpl->Skb->data; + } + } + + rpl->FragList[0].DataCount = SWAPB(tp->MaxPacketSize); + rpl->FrameSize = 0; + + /* Pass the last RPL back to the adapter */ + tp->RplTail->FrameSize = 0; + + /* Reset the CSTAT field in the list. */ + sktr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ); + + /* Current RPL becomes last one in list. */ + tp->RplTail = tp->RplTail->NextRPLPtr; + + /* Inform adapter about RPL valid. */ + sktr_exec_sifcmd(dev, CMD_RX_VALID); + } + + return; +} + +/* + * This function should be used whenever the status of any RPL must be + * modified by the driver, because the compiler may otherwise change the + * order of instructions such that writing the RPL status may be executed + * at an undesireable time. When this function is used, the status is + * always written when the function is called. + */ +static void sktr_write_rpl_status(RPL *rpl, unsigned int Status) +{ + rpl->Status = Status; + + return; +} + +/* + * The function updates the statistic counters in mac->MacStat. + * It differtiates between directed and broadcast/multicast ( ==functional) + * frames. + */ +static void sktr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[], + unsigned int Length) +{ + tp->MacStat.rx_packets++; + + /* Test functional bit */ + if(DataPtr[2] & GROUP_BIT) + tp->MacStat.multicast++; + + return; +} + +/* + * Check if it is a frame of myself. Compare source address with my current + * address in reverse direction, and mask out the TR_RII. + */ +static unsigned char sktr_chk_frame(struct device *dev, unsigned char *Addr) +{ + int i; + + for(i = 5; i > 0; i--) + { + if(Addr[8 + i] != dev->dev_addr[i]) + return (0); + } + + /* Mask out RIF bit. */ + if((Addr[8] & ~TR_RII) != (unsigned char)(dev->dev_addr[0])) + return (0); + + return (1); /* It is my frame. */ +} + +/* + * Dump Packet (data) + */ +static void sktr_dump(unsigned char *Data, int length) +{ + int i, j; + + for (i = 0, j = 0; i < length / 8; i++, j += 8) + { + printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n", + Data[j+0],Data[j+1],Data[j+2],Data[j+3], + Data[j+4],Data[j+5],Data[j+6],Data[j+7]); + } + + return; +} + +#ifdef MODULE + +static struct device* dev_sktr[SKTR_MAX_ADAPTERS]; +static int io[SKTR_MAX_ADAPTERS] = { 0, 0 }; +static int irq[SKTR_MAX_ADAPTERS] = { 0, 0 }; +static int mem[SKTR_MAX_ADAPTERS] = { 0, 0 }; + +MODULE_PARM(io, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); +MODULE_PARM(mem, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); + +int init_module(void) +{ + int i; + + for(i = 0; i < SKTR_MAX_ADAPTERS; i++) + { + irq[i] = 0; + mem[i] = 0; + dev_sktr[i] = NULL; + dev_sktr[i] = init_trdev(dev_sktr[i], 0); + if(dev_sktr[i] == NULL) + return (-ENOMEM); + + dev_sktr[i]->base_addr = io[i]; + dev_sktr[i]->irq = irq[i]; + dev_sktr[i]->mem_start = mem[i]; + dev_sktr[i]->init = &sktr_probe; + + if(register_trdev(dev_sktr[i]) != 0) + { + kfree_s(dev_sktr[i], sizeof(struct device)); + dev_sktr[i] = NULL; + if(i == 0) + { + printk("sktr: register_trdev() returned non-zero.\n"); + return (-EIO); + } + else + return (0); + } + } + + return (0); +} + +void cleanup_module(void) +{ + int i; + + for(i = 0; i < SKTR_MAX_ADAPTERS; i++) + { + if(dev_sktr[i]) + { + unregister_trdev(dev_sktr[i]); + release_region(dev_sktr[i]->base_addr, SKTR_IO_EXTENT); + if(dev_sktr[i]->irq) + free_irq(dev_sktr[i]->irq, dev_sktr[i]); + if(dev_sktr[i]->dma > 0) + free_dma(dev_sktr[i]->dma); + if(dev_sktr[i]->priv) + kfree_s(dev_sktr[i]->priv, sizeof(struct net_local)); + kfree_s(dev_sktr[i], sizeof(struct device)); + dev_sktr[i] = NULL; + } + } +} +#endif /* MODULE */ diff -u --recursive --new-file v2.1.106/linux/drivers/net/sktr.h linux/drivers/net/sktr.h --- v2.1.106/linux/drivers/net/sktr.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/sktr.h Wed Jun 24 14:26:13 1998 @@ -0,0 +1,1098 @@ +/* sktr.h: SysKonnect TokenRing driver for Linux + * + * Authors: + * - Christoph Goos + */ + +#ifndef __LINUX_SKTR_H +#define __LINUX_SKTR_H + +#ifdef __KERNEL__ + +#define SKTR_MAX_ADAPTERS 7 + +#define SEND_TIMEOUT 10*HZ + +#define TR_RCF_LONGEST_FRAME_MASK 0x0070 +#define TR_RCF_FRAME4K 0x0030 + +/*------------------------------------------------------------------*/ +/* Bit order for adapter communication with DMA */ +/* -------------------------------------------------------------- */ +/* Bit 8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7| */ +/* -------------------------------------------------------------- */ +/* The bytes in a word must be byte swapped. Also, if a double */ +/* word is used for storage, then the words, as well as the bytes, */ +/* must be swapped. */ +/* Bit order for adapter communication with DIO */ +/* -------------------------------------------------------------- */ +/* Bit 0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15| */ +/* -------------------------------------------------------------- */ +/*------------------------------------------------------------------*/ + +/* Swap bytes of a word. */ +#define SWAPB(x) (((unsigned short)((x) << 8)) | ((unsigned short)((x) >> 8))) + +/* Swap words of a long. */ +#define SWAPW(x) (((x) << 16) | ((x) >> 16)) + +/* Get the low byte of a word. */ +#define LOBYTE(w) ((unsigned char)(w)) + +/* Get the high byte of a word. */ +#define HIBYTE(w) ((unsigned char)((unsigned short)(w) >> 8)) + +/* Get the low word of a long. */ +#define LOWORD(l) ((unsigned short)(l)) + +/* Get the high word of a long. */ +#define HIWORD(l) ((unsigned short)((unsigned long)(l) >> 16)) + + + +/* Token ring adapter I/O addresses for normal mode. */ +#define SIFDAT 0L /* SIF/DMA data. */ +#define SIFINC 2L /* IO Word data with auto increment. */ +#define SIFINH 3L /* IO Byte data with auto increment. */ +#define SIFADR 4L /* SIF/DMA Address. */ +#define SIFCMD 6L /* SIF Command. */ +#define SIFSTS 6L /* SIF Status. */ +#define SIFACL 8L /* SIF Adapter Control Register. */ +#define SIFADD 10L /* SIF/DMA Address. */ +#define SIFADX 12L +#define DMALEN 14L /* SIF DMA length. */ +#define POSREG 16L /* Adapter Program Option Select (POS) + * Register: base IO address + 16 byte. + */ +#define POSREG_2 24L /* only for TR4/16+ adapter + * base IO address + 24 byte. + */ + + +/* SIFCMD command codes (high-low) */ +#define CMD_INTERRUPT_ADAPTER 0x8000 /* Cause internal adapter interrupt */ +#define CMD_ADAPTER_RESET 0x4000 /* Hardware reset of adapter */ +#define CMD_SSB_CLEAR 0x2000 /* Acknowledge to adapter to + * system interrupts. + */ +#define CMD_EXECUTE 0x1000 /* Execute SCB command */ +#define CMD_SCB_REQUEST 0x0800 /* Request adapter to interrupt + * system when SCB is available for + * another command. + */ +#define CMD_RX_CONTINUE 0x0400 /* Continue receive after odd pointer + * stop. (odd pointer receive method) + */ +#define CMD_RX_VALID 0x0200 /* Now actual RPL is valid. */ +#define CMD_TX_VALID 0x0100 /* Now actual TPL is valid. (valid + * bit receive/transmit method) + */ +#define CMD_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system + * interrupt is reset. + */ +#define CMD_CLEAR_SYSTEM_IRQ 0x0080 /* Clear SYSTEM_INTERRUPT bit. + * (write: 1=ignore, 0=reset) + */ +#define EXEC_SOFT_RESET 0xFF00 /* adapter soft reset. (restart + * adapter after hardware reset) + */ + + +/* ACL commands (high-low) */ +#define ACL_SWHLDA 0x0800 /* Software hold acknowledge. */ +#define ACL_SWDDIR 0x0400 /* Data transfer direction. */ +#define ACL_SWHRQ 0x0200 /* Pseudo DMA operation. */ +#define ACL_PSDMAEN 0x0100 /* Enable pseudo system DMA. */ +#define ACL_ARESET 0x0080 /* Adapter hardware reset command. + * (held in reset condition as + * long as bit is set) + */ +#define ACL_CPHALT 0x0040 /* Communication processor halt. + * (can only be set while ACL_ARESET + * bit is set; prevents adapter + * processor from executing code while + * downloading firmware) + */ +#define ACL_BOOT 0x0020 +#define ACL_SINTEN 0x0008 /* System interrupt enable/disable + * (1/0): can be written if ACL_ARESET + * is zero. + */ +#define ACL_SPEED4 0x0003 +#define ACL_SPEED16 0x0001 +#define PS_DMA_MASK (ACL_SWHRQ | ACL_PSDMAEN) + + +/* SIFSTS register return codes (high-low) */ +#define STS_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system + * interrupt is valid. + */ +#define STS_INITIALIZE 0x0040 /* INITIALIZE status. (ready to + * initialize) + */ +#define STS_TEST 0x0020 /* TEST status. (BUD not completed) */ +#define STS_ERROR 0x0010 /* ERROR status. (unrecoverable + * HW error occurred) + */ +#define STS_MASK 0x00F0 /* Mask interesting status bits. */ +#define STS_ERROR_MASK 0x000F /* Get Error Code by masking the + * interrupt code bits. + */ +#define ADAPTER_INT_PTRS 0x0A00 /* Address offset of adapter internal + * pointers 01:0a00 (high-low) have to + * be read after init and before open. + */ + + +/* Interrupt Codes (only MAC IRQs) */ +#define STS_IRQ_ADAPTER_CHECK 0x0000 /* unrecoverable hardware or + * software error. + */ +#define STS_IRQ_RING_STATUS 0x0004 /* SSB is updated with ring status. */ +#define STS_IRQ_SCB_CLEAR 0x0006 /* SCB clear, following an + * SCB_REQUEST IRQ. + */ +#define STS_IRQ_COMMAND_STATUS 0x0008 /* SSB is updated with command + * status. + */ +#define STS_IRQ_RECEIVE_STATUS 0x000A /* SSB is updated with receive + * status. + */ +#define STS_IRQ_TRANSMIT_STATUS 0x000C /* SSB is updated with transmit + * status + */ +#define STS_IRQ_MASK 0x000F /* = STS_ERROR_MASK. */ + + +/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */ +#define COMMAND_COMPLETE 0x0080 /* TRANSMIT command completed + * (avoid this!) issue another transmit + * to send additional frames. + */ +#define FRAME_COMPLETE 0x0040 /* Frame has been transmitted; + * INTERRUPT_FRAME bit was set in the + * CSTAT request; indication of possibly + * more than one frame transmissions! + * SSB.Parm[0-1]: 32 bit pointer to + * TPL of last frame. + */ +#define LIST_ERROR 0x0020 /* Error in one of the TPLs that + * compose the frame; TRANSMIT + * terminated; Parm[1-2]: 32 bit pointer + * to TPL which starts the error + * frame; error details in bits 8-13. + * (14?) + */ +#define FRAME_SIZE_ERROR 0x8000 /* FRAME_SIZE does not equal the sum of + * the valid DATA_COUNT fields; + * FRAME_SIZE less than header plus + * information field. (15 bytes + + * routing field) Or if FRAME_SIZE + * was specified as zero in one list. + */ +#define TX_THRESHOLD 0x4000 /* FRAME_SIZE greater than (BUFFER_SIZE + * - 9) * TX_BUF_MAX. + */ +#define ODD_ADDRESS 0x2000 /* Odd forward pointer value is + * read on a list without END_FRAME + * indication. + */ +#define FRAME_ERROR 0x1000 /* START_FRAME bit is (not) anticipated, + * but (not) set. + */ +#define ACCESS_PRIORITY_ERROR 0x0800 /* Access priority requested has not + * been allowed. + */ +#define UNENABLED_MAC_FRAME 0x0400 /* MAC frame has source class of zero + * or MAC frame PCF ATTN field is + * greater than one. + */ +#define ILLEGAL_FRAME_FORMAT 0x0200 /* Bit 0 or FC field was set to one. */ + + +/* + * Since we need to support some functions even if the adapter is in a + * CLOSED state, we have a (pseudo-) command queue which holds commands + * that are outstandig to be executed. + * + * Each time a command completes, an interrupt occurs and the next + * command is executed. The command queue is actually a simple word with + * a bit for each outstandig command. Therefore the commands will not be + * executed in the order they have been queued. + * + * The following defines the command code bits and the command queue: + */ +#define OC_OPEN 0x0001 /* OPEN command */ +#define OC_TRANSMIT 0x0002 /* TRANSMIT command */ +#define OC_TRANSMIT_HALT 0x0004 /* TRANSMIT_HALT command */ +#define OC_RECEIVE 0x0008 /* RECEIVE command */ +#define OC_CLOSE 0x0010 /* CLOSE command */ +#define OC_SET_GROUP_ADDR 0x0020 /* SET_GROUP_ADDR command */ +#define OC_SET_FUNCT_ADDR 0x0040 /* SET_FUNCT_ADDR command */ +#define OC_READ_ERROR_LOG 0x0080 /* READ_ERROR_LOG command */ +#define OC_READ_ADAPTER 0x0100 /* READ_ADAPTER command */ +#define OC_MODIFY_OPEN_PARMS 0x0400 /* MODIFY_OPEN_PARMS command */ +#define OC_RESTORE_OPEN_PARMS 0x0800 /* RESTORE_OPEN_PARMS command */ +#define OC_SET_FIRST_16_GROUP 0x1000 /* SET_FIRST_16_GROUP command */ +#define OC_SET_BRIDGE_PARMS 0x2000 /* SET_BRIDGE_PARMS command */ +#define OC_CONFIG_BRIDGE_PARMS 0x4000 /* CONFIG_BRIDGE_PARMS command */ + +#define OPEN 0x0300 /* C: open command. S: completion. */ +#define TRANSMIT 0x0400 /* C: transmit command. S: completion + * status. (reject: COMMAND_REJECT if + * adapter not opened, TRANSMIT already + * issued or address passed in the SCB + * not word aligned) + */ +#define TRANSMIT_HALT 0x0500 /* C: interrupt TX TPL chain; if no + * TRANSMIT command issued, the command + * is ignored. (completion with TRANSMIT + * status (0x0400)!) + */ +#define RECEIVE 0x0600 /* C: receive command. S: completion + * status. (reject: COMMAND_REJECT if + * adapter not opened, RECEIVE already + * issued or address passed in the SCB + * not word aligned) + */ +#define CLOSE 0x0700 /* C: close adapter. S: completion. + * (COMMAND_REJECT if adapter not open) + */ +#define SET_GROUP_ADDR 0x0800 /* C: alter adapter group address after + * OPEN. S: completion. (COMMAND_REJECT + * if adapter not open) + */ +#define SET_FUNCT_ADDR 0x0900 /* C: alter adapter functional address + * after OPEN. S: completion. + * (COMMAND_REJECT if adapter not open) + */ +#define READ_ERROR_LOG 0x0A00 /* C: read adapter error counters. + * S: completion. (command ignored + * if adapter not open!) + */ +#define READ_ADAPTER 0x0B00 /* C: read data from adapter memory. + * (important: after init and before + * open!) S: completion. (ADAPTER_CHECK + * interrupt if undefined storage area + * read) + */ +#define MODIFY_OPEN_PARMS 0x0D00 /* C: modify some adapter operational + * parameters. (bit correspondend to + * WRAP_INTERFACE is ignored) + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define RESTORE_OPEN_PARMS 0x0E00 /* C: modify some adapter operational + * parameters. (bit correspondend + * to WRAP_INTERFACE is ignored) + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define SET_FIRST_16_GROUP 0x0F00 /* C: alter the first two bytes in + * adapter group address. + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define SET_BRIDGE_PARMS 0x1000 /* C: values and conditions for the + * adapter hardware to use when frames + * are copied for forwarding. + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define CONFIG_BRIDGE_PARMS 0x1100 /* C: .. + * S: completion. (reject: + * COMMAND_REJECT) + */ + +#define SPEED_4 4 +#define SPEED_16 16 /* Default transmission speed */ + + +/* Initialization Parameter Block (IPB); word alignment necessary! */ +#define BURST_SIZE 0x0018 /* Default burst size */ +#define BURST_MODE 0x9F00 /* Burst mode enable */ +#define DMA_RETRIES 0x0505 /* Magic DMA retry number... */ + +#define CYCLE_TIME 3 /* Default AT-bus cycle time: 500 ns + * (later adapter version: fix cycle time!) + */ +#define LINE_SPEED_BIT 0x80 + +/* Macro definition for the wait function. */ +#define ONE_SECOND_TICKS 1000000 +#define HALF_SECOND (ONE_SECOND_TICKS / 2) +#define ONE_SECOND (ONE_SECOND_TICKS) +#define TWO_SECONDS (ONE_SECOND_TICKS * 2) +#define THREE_SECONDS (ONE_SECOND_TICKS * 3) +#define FOUR_SECONDS (ONE_SECOND_TICKS * 4) +#define FIVE_SECONDS (ONE_SECOND_TICKS * 5) + +#define BUFFER_SIZE 2048 /* Buffers on Adapter */ + +#pragma pack(1) +typedef struct { + unsigned short Init_Options; /* Initialize with burst mode; + * LLC disabled. (MAC only) + */ + + /* Interrupt vectors the adapter places on attached system bus. */ + unsigned char CMD_Status_IV; /* Interrupt vector: command status. */ + unsigned char TX_IV; /* Interrupt vector: transmit. */ + unsigned char RX_IV; /* Interrupt vector: receive. */ + unsigned char Ring_Status_IV; /* Interrupt vector: ring status. */ + unsigned char SCB_Clear_IV; /* Interrupt vector: SCB clear. */ + unsigned char Adapter_CHK_IV; /* Interrupt vector: adapter check. */ + + unsigned short RX_Burst_Size; /* Max. number of transfer cycles. */ + unsigned short TX_Burst_Size; /* During DMA burst; even value! */ + unsigned short DMA_Abort_Thrhld; /* Number of DMA retries. */ + + unsigned long SCB_Addr; /* SCB address: even, word aligned, high-low. */ + unsigned long SSB_Addr; /* SSB address: even, word aligned, high-low. */ +} IPB, *IPB_Ptr; +#pragma pack() + +/* + * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to + * be reopened) + */ +#define BUFFER_SIZE 2048 /* Buffers on Adapter. */ +#define TPL_SIZE 8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */ +#define RPL_SIZE 14 /* (with TI firmware v2.26 handling + * up to nine fragments possible) + */ +#define TX_BUF_MIN 20 /* ??? (Stephan: calculation with */ +#define TX_BUF_MAX 40 /* BUFFER_SIZE and MAX_FRAME_SIZE) ??? + */ +#define DISABLE_EARLY_TOKEN_RELEASE 0x1000 + +/* OPEN Options (high-low) */ +#define WRAP_INTERFACE 0x0080 /* Inserting omitted for test + * purposes; transmit data appears + * as receive data. (usefull for + * testing; change: CLOSE necessary) + */ +#define DISABLE_HARD_ERROR 0x0040 /* On HARD_ERROR & TRANSMIT_BEACON + * no RING.STATUS interrupt. + */ +#define DISABLE_SOFT_ERROR 0x0020 /* On SOFT_ERROR, no RING.STATUS + * interrupt. + */ +#define PASS_ADAPTER_MAC_FRAMES 0x0010 /* Passing unsupported MAC frames + * to system. + */ +#define PASS_ATTENTION_FRAMES 0x0008 /* All changed attention MAC frames are + * passed to the system. + */ +#define PAD_ROUTING_FIELD 0x0004 /* Routing field is padded to 18 + * bytes. + */ +#define FRAME_HOLD 0x0002 /* Adapter waits for entire frame before + * initiating DMA transfer; otherwise: + * DMA transfer initiation if internal + * buffer filled. + */ +#define CONTENDER 0x0001 /* Adapter participates in the monitor + * contention process. + */ +#define PASS_BEACON_MAC_FRAMES 0x8000 /* Adapter passes beacon MAC frames + * to the system. + */ +#define EARLY_TOKEN_RELEASE 0x1000 /* Only valid in 16 Mbps operation; + * 0 = ETR. (no effect in 4 Mbps + * operation) + */ +#define COPY_ALL_MAC_FRAMES 0x0400 /* All MAC frames are copied to + * the system. (after OPEN: duplicate + * address test (DAT) MAC frame is + * first received frame copied to the + * system) + */ +#define COPY_ALL_NON_MAC_FRAMES 0x0200 /* All non MAC frames are copied to + * the system. + */ +#define PASS_FIRST_BUF_ONLY 0x0100 /* Passes only first internal buffer + * of each received frame; FrameSize + * of RPLs must contain internal + * BUFFER_SIZE bits for promiscous mode. + */ +#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 /* Enable the use of full-duplex + * settings with bits in byte 22 in + * ocpl. (new feature in firmware + * version 3.09) + */ + +/* Full-duplex settings */ +#define OPEN_FULL_DUPLEX_OFF 0x0000 +#define OPEN_FULL_DUPLEX_ON 0x00c0 +#define OPEN_FULL_DUPLEX_AUTO 0x0080 + +#define PROD_ID_SIZE 18 /* Length of product ID. */ + +#define TX_FRAG_NUM 3 /* Number of fragments used in one TPL. */ +#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more + * fragments following. + */ + +#define ISA_MAX_ADDRESS 0x00ffffff + +#pragma pack(1) +typedef struct { + unsigned short OPENOptions; + unsigned char NodeAddr[6]; /* Adapter node address; use ROM + * address + */ + unsigned long GroupAddr; /* Multicast: high order + * bytes = 0xC000 + */ + unsigned long FunctAddr; /* High order bytes = 0xC000 */ + unsigned short RxListSize; /* RPL size: 0 (=26), 14, 20 or + * 26 bytes read by the adapter. + * (Depending on the number of + * fragments/list) + */ + unsigned short TxListSize; /* TPL size */ + unsigned short BufSize; /* Is automatically rounded up to the + * nearest nK boundary. + */ + unsigned short FullDuplex; + unsigned short Reserved; + unsigned char TXBufMin; /* Number of adapter buffers reserved + * for transmission a minimum of 2 + * buffers must be allocated. + */ + unsigned char TXBufMax; /* Maximum number of adapter buffers + * for transmit; a minimum of 2 buffers + * must be available for receive. + * Default: 6 + */ + unsigned short ProdIDAddr[2]; /* Pointer to product ID. */ +} OPB, *OPB_Ptr; +#pragma pack() + +/* + * SCB: adapter commands enabled by the host system started by writing + * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO + * register. (special case: | CMD_SYSTEM_IRQ for initialization) + */ +#pragma pack(1) +typedef struct { + unsigned short CMD; /* Command code */ + unsigned short Parm[2]; /* Pointer to Command Parameter Block */ +} SCB; /* System Command Block (32 bit physical address; big endian)*/ +#pragma pack() + +/* + * SSB: adapter command return status can be evaluated after COMMAND_STATUS + * adapter to system interrupt after reading SSB, the availability of the SSB + * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR + * in the SIFCMD IO register. + */ +#pragma pack(1) +typedef struct { + unsigned short STS; /* Status code */ + unsigned short Parm[3]; /* Parameter or pointer to Status Parameter + * Block. + */ +} SSB; /* System Status Block (big endian - physical address) */ +#pragma pack() + +typedef struct { + unsigned short BurnedInAddrPtr; /* Pointer to adapter burned in + * address. (BIA) + */ + unsigned short SoftwareLevelPtr;/* Pointer to software level data. */ + unsigned short AdapterAddrPtr; /* Pointer to adapter addresses. */ + unsigned short AdapterParmsPtr; /* Pointer to adapter parameters. */ + unsigned short MACBufferPtr; /* Pointer to MAC buffer. (internal) */ + unsigned short LLCCountersPtr; /* Pointer to LLC counters. */ + unsigned short SpeedFlagPtr; /* Pointer to data rate flag. + * (4/16 Mbps) + */ + unsigned short AdapterRAMPtr; /* Pointer to adapter RAM found. (KB) */ +} INTPTRS; /* Adapter internal pointers */ + +#pragma pack(1) +typedef struct { + unsigned char Line_Error; /* Line error: code violation in + * frame or in a token, or FCS error. + */ + unsigned char Internal_Error; /* IBM specific. (Reserved_1) */ + unsigned char Burst_Error; + unsigned char ARI_FCI_Error; /* ARI/FCI bit zero in AMP or + * SMP MAC frame. + */ + unsigned char AbortDelimeters; /* IBM specific. (Reserved_2) */ + unsigned char Reserved_3; + unsigned char Lost_Frame_Error; /* Receive of end of transmitted + * frame failed. + */ + unsigned char Rx_Congest_Error; /* Adapter in repeat mode has not + * enough buffer space to copy incoming + * frame. + */ + unsigned char Frame_Copied_Error;/* ARI bit not zero in frame + * addressed to adapter. + */ + unsigned char Frequency_Error; /* IBM specific. (Reserved_4) */ + unsigned char Token_Error; /* (active only in monitor station) */ + unsigned char Reserved_5; + unsigned char DMA_Bus_Error; /* DMA bus errors not exceeding the + * abort thresholds. + */ + unsigned char DMA_Parity_Error; /* DMA parity errors not exceeding + * the abort thresholds. + */ +} ERRORTAB; /* Adapter error counters */ +#pragma pack() + + +/*--------------------- Send and Receive definitions -------------------*/ +#pragma pack(1) +typedef struct { + unsigned short DataCount; /* Value 0, even and odd values are + * permitted; value is unaltered most + * significant bit set: following + * fragments last fragment: most + * significant bit is not evaluated. + * (???) + */ + unsigned long DataAddr; /* Pointer to frame data fragment; + * even or odd. + */ +} Fragment; +#pragma pack() + +#define MAX_FRAG_NUMBERS 9 /* Maximal number of fragments possible to use + * in one RPL/TPL. (depending on TI firmware + * version) + */ +#define MAX_TX_QUEUE 10 /* Maximal number of skb's queued in driver. */ + +/* + * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504 + * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176, + * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide + * Page 2-27. + */ +#define HEADER_SIZE (1 + 1 + 6 + 6) +#define SRC_SIZE 18 +#define MIN_DATA_SIZE 516 +#define DEFAULT_DATA_SIZE 4472 +#define MAX_DATA_SIZE 17800 + +#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE) +#define MIN_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE) +#define MAX_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE) + +/* + * Macros to deal with the frame status field. + */ +#define AC_NOT_RECOGNIZED 0x00 +#define GROUP_BIT 0x80 +#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8)) +#define GET_FRAME_STATUS_HIGH_AC(Fs) ((unsigned char)(((Fs) & 0xC0) >> 6)) +#define GET_FRAME_STATUS_LOW_AC(Fs) ((unsigned char)(((Fs) & 0x0C) >> 2)) +#define DIRECTED_FRAME(Context) (!((Context)->MData[2] & GROUP_BIT)) + + +/*--------------------- Send Functions ---------------------------------*/ +/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */ + +#define TX_VALID 0x0080 /* R: set via TRANSMIT.VALID interrupt. + * C: always reset to zero! + */ +#define TX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero. + * C: set to one. + */ +#define TX_START_FRAME 0x0020 /* R: start of a frame: 1 + * C: unchanged. + */ +#define TX_END_FRAME 0x0010 /* R: end of a frame: 1 + * C: unchanged. + */ +#define TX_FRAME_IRQ 0x0008 /* R: request interrupt generation + * after transmission. + * C: unchanged. + */ +#define TX_ERROR 0x0004 /* R: reserved. + * C: set to one if Error occurred. + */ +#define TX_INTERFRAME_WAIT 0x0004 +#define TX_PASS_CRC 0x0002 /* R: set if CRC value is already + * calculated. (valid only in + * FRAME_START TPL) + * C: unchanged. + */ +#define TX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame + * source address and does not overwrite + * with the adapter node address. + * (valid only in FRAME_START TPL) + * + * C: unchanged. + */ +#define TX_STRIP_FS 0xFF00 /* R: reserved. + * C: if no Transmission Error, + * field contains copy of FS byte after + * stripping of frame. + */ + +/* + * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL, + * but possibly multiple TPLs for one frame) the length of the TPLs has to be + * initialized in the OPL. (OPEN parameter list) + */ +#define TPL_NUM 3 /* Number of Transmit Parameter Lists. + * !! MUST BE >= 3 !! + */ + +#pragma pack(1) +typedef struct s_TPL TPL; + +struct s_TPL { /* Transmit Parameter List (align on even word boundaries) */ + unsigned long NextTPLAddr; /* Pointer to next TPL in chain; if + * pointer is odd: this is the last + * TPL. Pointing to itself can cause + * problems! + */ + volatile unsigned short Status; /* Initialized by the adapter: + * CSTAT_REQUEST important: update least + * significant bit first! Set by the + * adapter: CSTAT_COMPLETE status. + */ + unsigned short FrameSize; /* Number of bytes to be transmitted + * as a frame including AC/FC, + * Destination, Source, Routing field + * not including CRC, FS, End Delimiter + * (valid only if START_FRAME bit in + * CSTAT nonzero) must not be zero in + * any list; maximum value: (BUFFER_SIZE + * - 8) * TX_BUF_MAX sum of DataCount + * values in FragmentList must equal + * Frame_Size value in START_FRAME TPL! + * frame data fragment list. + */ + + /* TPL/RPL size in OPEN parameter list depending on maximal + * numbers of fragments used in one parameter list. + */ + Fragment FragList[TX_FRAG_NUM]; /* Maximum: nine frame fragments in one + * TPL actual version of firmware: 9 + * fragments possible. + */ +#pragma pack() + + /* Special proprietary data and precalculations */ + + TPL *NextTPLPtr; /* Pointer to next TPL in chain. */ + unsigned char *MData; + struct sk_buff *Skb; + unsigned char TPLIndex; + volatile unsigned char BusyFlag;/* Flag: TPL busy? */ +}; + +/* ---------------------Receive Functions-------------------------------* + * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values. + * (high-low) + */ +#define RX_VALID 0x0080 /* R: set; tell adapter with + * RECEIVE.VALID interrupt. + * C: reset to zero. + */ +#define RX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero, + * C: set to one. + */ +#define RX_START_FRAME 0x0020 /* R: must be reset to zero. + * C: set to one on the list. + */ +#define RX_END_FRAME 0x0010 /* R: must be reset to zero. + * C: set to one on the list + * that ends the frame. + */ +#define RX_FRAME_IRQ 0x0008 /* R: request interrupt generation + * after receive. + * C: unchanged. + */ +#define RX_INTERFRAME_WAIT 0x0004 /* R: after receiving a frame: + * interrupt and wait for a + * RECEIVE.CONTINUE. + * C: unchanged. + */ +#define RX_PASS_CRC 0x0002 /* R: if set, the adapter includes + * the CRC in data passed. (last four + * bytes; valid only if FRAME_START is + * set) + * C: set, if CRC is included in + * received data. + */ +#define RX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame + * source address and does not + * overwrite with the adapter node + * address. (valid only if FRAME_START + * is set) + * C: unchanged. + */ +#define RX_RECEIVE_FS 0xFC00 /* R: reserved; must be reset to zero. + * C: on lists with START_FRAME, field + * contains frame status field from + * received frame; otherwise cleared. + */ +#define RX_ADDR_MATCH 0x0300 /* R: reserved; must be reset to zero. + * C: address match code mask. + */ +#define RX_STATUS_MASK 0x00FF /* Mask for receive status bits. */ + +#define RX_INTERN_ADDR_MATCH 0x0100 /* C: internally address match. */ +#define RX_EXTERN_ADDR_MATCH 0x0200 /* C: externally matched via + * XMATCH/XFAIL interface. + */ +#define RX_INTEXT_ADDR_MATCH 0x0300 /* C: internally and externally + * matched. + */ +#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */ + +/* Constants for Command Status Interrupt. + * COMMAND_REJECT status field bit functions (SSB.Parm[0]) + */ +#define ILLEGAL_COMMAND 0x0080 /* Set if an unknown command + * is issued to the adapter + */ +#define ADDRESS_ERROR 0x0040 /* Set if any address field in + * the SCB is odd. (not word aligned) + */ +#define ADAPTER_OPEN 0x0020 /* Command issued illegal with + * open adapter. + */ +#define ADAPTER_CLOSE 0x0010 /* Command issued illegal with + * closed adapter. + */ +#define SAME_COMMAND 0x0008 /* Command issued with same command + * already executing. + */ + +/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */ +#define NODE_ADDR_ERROR 0x0040 /* Wrong address or BIA read + * zero address. + */ +#define LIST_SIZE_ERROR 0x0020 /* If List_Size value not in 0, + * 14, 20, 26. + */ +#define BUF_SIZE_ERROR 0x0010 /* Not enough available memory for + * two buffers. + */ +#define TX_BUF_COUNT_ERROR 0x0004 /* Remaining receive buffers less than + * two. + */ +#define OPEN_ERROR 0x0002 /* Error during ring insertion; more + * information in bits 8-15. + */ + +/* Standard return codes */ +#define GOOD_COMPLETION 0x0080 /* =OPEN_SUCCESSFULL */ +#define INVALID_OPEN_OPTION 0x0001 /* OPEN options are not supported by + * the adapter. + */ + +/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB) */ +#define OPEN_PHASES_MASK 0xF000 /* Check only the bits 8-11. */ +#define LOBE_MEDIA_TEST 0x1000 +#define PHYSICAL_INSERTION 0x2000 +#define ADDRESS_VERIFICATION 0x3000 +#define PARTICIPATION_IN_RING_POLL 0x4000 +#define REQUEST_INITIALISATION 0x5000 +#define FULLDUPLEX_CHECK 0x6000 + +/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */ +#define OPEN_ERROR_CODES_MASK 0x0F00 /* Check only the bits 12-15. */ +#define OPEN_FUNCTION_FAILURE 0x0100 /* Unable to transmit to itself or + * frames received before insertion. + */ +#define OPEN_SIGNAL_LOSS 0x0200 /* Signal loss condition detected at + * receiver. + */ +#define OPEN_TIMEOUT 0x0500 /* Insertion timer expired before + * logical insertion. + */ +#define OPEN_RING_FAILURE 0x0600 /* Unable to receive own ring purge + * MAC frames. + */ +#define OPEN_RING_BEACONING 0x0700 /* Beacon MAC frame received after + * ring insertion. + */ +#define OPEN_DUPLICATE_NODEADDR 0x0800 /* Other station in ring found + * with the same address. + */ +#define OPEN_REQUEST_INIT 0x0900 /* RPS present but does not respond. */ +#define OPEN_REMOVE_RECEIVED 0x0A00 /* Adapter received a remove adapter + * MAC frame. + */ +#define OPEN_FULLDUPLEX_SET 0x0D00 /* Got this with full duplex on when + * trying to connect to a normal ring. + */ + +/* SET_BRIDGE_PARMS return codes: */ +#define BRIDGE_INVALID_MAX_LEN 0x4000 /* MAX_ROUTING_FIELD_LENGTH odd, + * less than 6 or > 30. + */ +#define BRIDGE_INVALID_SRC_RING 0x2000 /* SOURCE_RING number zero, too large + * or = TARGET_RING. + */ +#define BRIDGE_INVALID_TRG_RING 0x1000 /* TARGET_RING number zero, too large + * or = SOURCE_RING. + */ +#define BRIDGE_INVALID_BRDGE_NO 0x0800 /* BRIDGE_NUMBER too large. */ +#define BRIDGE_INVALID_OPTIONS 0x0400 /* Invalid bridge options. */ +#define BRIDGE_DIAGS_FAILED 0x0200 /* Diagnostics of TMS380SRA failed. */ +#define BRIDGE_NO_SRA 0x0100 /* The TMS380SRA does not exist in HW + * configuration. + */ + +/* + * Bring Up Diagnostics error codes. + */ +#define BUD_INITIAL_ERROR 0x0 +#define BUD_CHECKSUM_ERROR 0x1 +#define BUD_ADAPTER_RAM_ERROR 0x2 +#define BUD_INSTRUCTION_ERROR 0x3 +#define BUD_CONTEXT_ERROR 0x4 +#define BUD_PROTOCOL_ERROR 0x5 +#define BUD_INTERFACE_ERROR 0x6 + +/* BUD constants */ +#define BUD_MAX_RETRIES 3 +#define BUD_MAX_LOOPCNT 6 +#define BUD_TIMEOUT 3000 + +/* Initialization constants */ +#define INIT_MAX_RETRIES 3 /* Maximum three retries. */ +#define INIT_MAX_LOOPCNT 22 /* Maximum loop counts. */ + +/* RING STATUS field values (high/low) */ +#define SIGNAL_LOSS 0x0080 /* Loss of signal on the ring + * detected. + */ +#define HARD_ERROR 0x0040 /* Transmitting or receiving beacon + * frames. + */ +#define SOFT_ERROR 0x0020 /* Report error MAC frame + * transmitted. + */ +#define TRANSMIT_BEACON 0x0010 /* Transmitting beacon frames on the + * ring. + */ +#define LOBE_WIRE_FAULT 0x0008 /* Open or short circuit in the + * cable to concentrator; adapter + * closed. + */ +#define AUTO_REMOVAL_ERROR 0x0004 /* Lobe wrap test failed, deinserted; + * adapter closed. + */ +#define REMOVE_RECEIVED 0x0001 /* Received a remove ring station MAC + * MAC frame request; adapter closed. + */ +#define COUNTER_OVERFLOW 0x8000 /* Overflow of one of the adapters + * error counters; READ.ERROR.LOG. + */ +#define SINGLE_STATION 0x4000 /* Adapter is the only station on the + * ring. + */ +#define RING_RECOVERY 0x2000 /* Claim token MAC frames on the ring; + * reset after ring purge frame. + */ + +#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\ + REMOVE_RECEIVED) + +/* Adapter_check_block.Status field bit assignments: */ +#define DIO_PARITY 0x8000 /* Adapter detects bad parity + * through direct I/O access. + */ +#define DMA_READ_ABORT 0x4000 /* Aborting DMA read operation + * from system Parm[0]: 0=timeout, + * 1=parity error, 2=bus error; + * Parm[1]: 32 bit pointer to host + * system address at failure. + */ +#define DMA_WRITE_ABORT 0x2000 /* Aborting DMA write operation + * to system. (parameters analogous to + * DMA_READ_ABORT) + */ +#define ILLEGAL_OP_CODE 0x1000 /* Illegal operation code in the + * the adapters firmware Parm[0]-2: + * communications processor registers + * R13-R15. + */ +#define PARITY_ERRORS 0x0800 /* Adapter detects internal bus + * parity error. + */ +#define RAM_DATA_ERROR 0x0080 /* Valid only during RAM testing; + * RAM data error Parm[0-1]: 32 bit + * pointer to RAM location. + */ +#define RAM_PARITY_ERROR 0x0040 /* Valid only during RAM testing; + * RAM parity error Parm[0-1]: 32 bit + * pointer to RAM location. + */ +#define RING_UNDERRUN 0x0020 /* Internal DMA underrun when + * transmitting onto ring. + */ +#define INVALID_IRQ 0x0008 /* Unrecognized interrupt generated + * internal to adapter Parm[0-2]: + * adapter register R13-R15. + */ +#define INVALID_ERROR_IRQ 0x0004 /* Unrecognized error interrupt + * generated Parm[0-2]: adapter register + * R13-R15. + */ +#define INVALID_XOP 0x0002 /* Unrecognized XOP request in + * communication processor Parm[0-2]: + * adapter register R13-R15. + */ +#define CHECKADDR 0x05E0 /* Adapter check status information + * address offset. + */ +#define ROM_PAGE_0 0x0000 /* Adapter ROM page 0. */ + +/* + * RECEIVE.STATUS interrupt result SSB values: (high-low) + * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0]) + */ +#define RX_COMPLETE 0x0080 /* SSB.Parm[0]; SSB.Parm[1]: 32 + * bit pointer to last RPL. + */ +#define RX_SUSPENDED 0x0040 /* SSB.Parm[0]; SSB.Parm[1]: 32 + * bit pointer to RPL with odd + * forward pointer. + */ + +/* Valid receive CSTAT: */ +#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \ + RX_FRAME_COMPLETE) +#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \ + RX_FRAME_COMPLETE) + +typedef enum SKB_STAT SKB_STAT; +enum SKB_STAT { + SKB_UNAVAILABLE, + SKB_DMA_DIRECT, + SKB_DATA_COPY +}; + +/* Receive Parameter List (RPL) The length of the RPLs has to be initialized + * in the OPL. (OPEN parameter list) + */ +#define RPL_NUM 3 + +#define RX_FRAG_NUM 1 /* Maximal number of used fragments in one RPL. + * (up to firmware v2.24: 3, now: up to 9) + */ + +#pragma pack(1) +typedef struct s_RPL RPL; +struct s_RPL { /* Receive Parameter List */ + unsigned long NextRPLAddr; /* Pointer to next RPL in chain + * (normalized = physical 32 bit + * address) if pointer is odd: this + * is last RPL. Pointing to itself can + * cause problems! + */ + volatile unsigned short Status; /* Set by creation of Receive Parameter + * List RECEIVE_CSTAT_COMPLETE set by + * adapter in lists that start or end + * a frame. + */ + volatile unsigned short FrameSize; /* Number of bytes received as a + * frame including AC/FC, Destination, + * Source, Routing field not including + * CRC, FS (Frame Status), End Delimiter + * (valid only if START_FRAME bit in + * CSTAT nonzero) must not be zero in + * any list; maximum value: (BUFFER_SIZE + * - 8) * TX_BUF_MAX sum of DataCount + * values in FragmentList must equal + * Frame_Size value in START_FRAME TPL! + * frame data fragment list + */ + + /* TPL/RPL size in OPEN parameter list depending on maximal numbers + * of fragments used in one parameter list. + */ + Fragment FragList[RX_FRAG_NUM]; /* Maximum: nine frame fragments in + * one TPL. Actual version of firmware: + * 9 fragments possible. + */ +#pragma pack() + + /* Special proprietary data and precalculations. */ + RPL *NextRPLPtr; /* Logical pointer to next RPL in chain. */ + unsigned char *MData; + struct sk_buff *Skb; + SKB_STAT SkbStat; + int RPLIndex; +}; + +/* Information that need to be kept for each board. */ +typedef struct net_local { +#pragma pack(1) + IPB ipb; /* Initialization Parameter Block. */ + SCB scb; /* System Command Block: system to adapter + * communication. + */ + SSB ssb; /* System Status Block: adapter to system + * communication. + */ + OPB ocpl; /* Open Options Parameter Block. */ + + ERRORTAB errorlogtable; /* Adapter statistic error counters. + * (read from adapter memory) + */ + unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */ +#pragma pack() + + TPL Tpl[TPL_NUM]; + TPL *TplFree; + TPL *TplBusy; + unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE]; + + RPL Rpl[RPL_NUM]; + RPL *RplHead; + RPL *RplTail; + unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE]; + + int DataRate; + unsigned char ScbInUse; + unsigned short CMDqueue; + + unsigned long AdapterOpenFlag:1; + unsigned long AdapterVirtOpenFlag:1; + unsigned long OpenCommandIssued:1; + unsigned long TransmitCommandActive:1; + unsigned long TransmitHaltScheduled:1; + unsigned long HaltInProgress:1; + unsigned long LobeWireFaultLogged:1; + unsigned long ReOpenInProgress:1; + unsigned long Sleeping:1; + + unsigned long LastOpenStatus; + unsigned short CurrentRingStatus; + unsigned long MaxPacketSize; + + unsigned long StartTime; + unsigned long LastSendTime; + + struct sk_buff_head SendSkbQueue; + unsigned short QueueSkb; + + struct tr_statistics MacStat; /* MAC statistics structure */ + + struct timer_list timer; + + struct wait_queue *wait_for_tok_int; + + INTPTRS intptrs; /* Internal adapter pointer. Must be read + * before OPEN command. + */ +} NET_LOCAL; + +#endif /* __KERNEL__ */ +#endif /* __LINUX_SKTR_H */ diff -u --recursive --new-file v2.1.106/linux/drivers/net/sktr_firmware.h linux/drivers/net/sktr_firmware.h --- v2.1.106/linux/drivers/net/sktr_firmware.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/sktr_firmware.h Wed Jun 24 14:26:13 1998 @@ -0,0 +1,3616 @@ +/* + * The firmware this driver downloads into the tokenring card is a + * seperate program and is not GPL'd source code, even though the Linux + * side driver and the routine that loads this data into the card are. + * + * This firmware is licensed to you strictly for use in conjunction + * with the use of SysKonnect TokenRing adapters. There is no + * waranty expressed or implied about its fitness for any purpose. + */ + +/* sktr_firmware.h: SysKonnect TokenRing driver firmware dump for Linux. + * + * Notes: + * - Loaded from sktr_reset_adapter upon adapter reset. + * + * Authors: + * - Christoph Goos + */ + +#include + +#if defined(CONFIG_SKTR) || defined(CONFIG_SKTR_MODULE) + +unsigned char sktr_code[] = { + 0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x68, 0x54, + 0x73, 0x69, 0x63, 0x20, 0x64, 0x6F, 0x20, 0x65, + 0x73, 0x69, 0x72, 0x20, 0x6C, 0x65, 0x61, 0x65, + 0x65, 0x73, 0x20, 0x64, 0x6E, 0x75, 0x65, 0x64, + 0x20, 0x72, 0x69, 0x6C, 0x65, 0x63, 0x63, 0x6E, + 0x20, 0x65, 0x6E, 0x4F, 0x79, 0x6C, 0x20, 0x2C, + 0x6C, 0x41, 0x20, 0x6C, 0x69, 0x72, 0x68, 0x67, + 0x73, 0x74, 0x72, 0x20, 0x73, 0x65, 0x72, 0x65, + 0x65, 0x76, 0x2E, 0x64, 0x60, 0x01, 0x42, 0x01, + 0x00, 0x08, 0x08, 0x16, 0xB0, 0x03, 0xE0, 0x04, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xFF, 0xFF, + 0xFC, 0x13, 0x80, 0x03, 0xA0, 0x07, 0x42, 0x01, + 0x00, 0x08, 0x20, 0x07, 0x00, 0x00, 0xE0, 0x04, + 0x00, 0x01, 0x8B, 0x07, 0x00, 0x3D, 0x60, 0x01, + 0x42, 0x01, 0x80, 0x00, 0x09, 0x13, 0x8B, 0x07, + 0x00, 0x2D, 0x20, 0xC0, 0x4E, 0x01, 0x80, 0x02, + 0x41, 0x0F, 0x02, 0x11, 0x8B, 0x07, 0x00, 0x3D, + 0x0B, 0xC8, 0x4A, 0x01, 0x00, 0x02, 0x00, 0x90, + 0xA0, 0x09, 0x00, 0xC8, 0x66, 0x01, 0xE0, 0x02, + 0xA0, 0x00, 0xA0, 0x07, 0x04, 0x01, 0x20, 0x00, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0xFE, 0x20, 0x48, + 0x2A, 0xE0, 0x42, 0x01, 0xE0, 0x04, 0x02, 0x01, + 0xE0, 0x04, 0x60, 0x09, 0xE0, 0x04, 0x82, 0x01, + 0x60, 0x01, 0x1C, 0x01, 0x04, 0x00, 0x03, 0x16, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x0C, 0xA0, 0x06, + 0xBC, 0xA1, 0xA0, 0x07, 0x04, 0x01, 0x2D, 0x00, + 0x20, 0xC2, 0x00, 0xE0, 0x88, 0x02, 0x11, 0xE3, + 0x14, 0x16, 0xA0, 0x07, 0x04, 0x01, 0x2E, 0x00, + 0x60, 0x01, 0x42, 0x01, 0x00, 0x03, 0x0D, 0x16, + 0xA0, 0x07, 0x04, 0x01, 0x21, 0x00, 0x88, 0x07, + 0x00, 0xA0, 0x89, 0x07, 0xFE, 0xFF, 0xA8, 0x09, + 0xA9, 0x09, 0x8A, 0x07, 0x02, 0xE0, 0xA0, 0x06, + 0x84, 0xEC, 0x56, 0x10, 0x88, 0x07, 0x00, 0x90, + 0x89, 0x07, 0xFE, 0x9F, 0xA8, 0x09, 0xA9, 0x09, + 0x8A, 0x07, 0x78, 0xE0, 0xA0, 0x06, 0x84, 0xEC, + 0x4B, 0x10, 0xA0, 0x05, 0x04, 0x01, 0x88, 0x07, + 0x08, 0x00, 0x89, 0x07, 0x7A, 0x00, 0x00, 0x03, + 0x01, 0x00, 0xA0, 0x06, 0xD2, 0xAC, 0x40, 0x10, + 0xA0, 0x06, 0xBC, 0xA1, 0xE0, 0x02, 0xF4, 0x03, + 0x88, 0x07, 0xA0, 0x00, 0x89, 0x07, 0xFE, 0x00, + 0xA0, 0x06, 0xD2, 0xAC, 0x35, 0x10, 0xE0, 0x02, + 0xA0, 0x00, 0xE0, 0x04, 0x7E, 0x01, 0xC8, 0x04, + 0x09, 0x02, 0xF2, 0x03, 0x48, 0x62, 0xE0, 0xC1, + 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, + 0x18, 0xCE, 0x09, 0x06, 0xFD, 0x16, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x40, 0x07, 0xC8, 0x40, 0x01, + 0x88, 0x07, 0xF4, 0x03, 0x89, 0x07, 0xFE, 0x3F, + 0xA0, 0x06, 0xD2, 0xAC, 0x19, 0x10, 0xE0, 0x02, + 0xA0, 0x00, 0xA0, 0x06, 0xFA, 0xAD, 0x14, 0x10, + 0x08, 0xC8, 0x44, 0x04, 0x09, 0xC8, 0x46, 0x04, + 0xA0, 0x06, 0x28, 0xAD, 0x0D, 0x10, 0x81, 0x07, + 0x7C, 0xE0, 0xB1, 0xC0, 0x26, 0x13, 0x01, 0xC8, + 0xE0, 0x00, 0xA0, 0x05, 0x04, 0x01, 0x92, 0x06, + 0x03, 0x10, 0x60, 0xC0, 0xE0, 0x00, 0xF5, 0x10, + 0xE0, 0x01, 0x04, 0x01, 0x10, 0x00, 0xB0, 0x03, + 0xFF, 0x10, 0xA0, 0x01, 0x04, 0x01, 0x00, 0x80, + 0x80, 0x03, 0x80, 0x07, 0xA0, 0x00, 0xC2, 0x04, + 0x80, 0xCC, 0x81, 0x07, 0xAA, 0xA1, 0x82, 0x02, + 0x1E, 0x00, 0x02, 0x16, 0x81, 0x07, 0xB4, 0xA1, + 0x81, 0xC4, 0x81, 0x8C, 0xE9, 0x16, 0x82, 0x02, + 0x7C, 0x00, 0xF2, 0x16, 0x00, 0x03, 0x0F, 0x00, + 0x5B, 0x04, 0x81, 0x07, 0x08, 0xE1, 0x82, 0x07, + 0x04, 0x00, 0xE0, 0x04, 0x80, 0x01, 0xE0, 0x04, + 0x82, 0x01, 0x91, 0xC4, 0xB1, 0x8C, 0xD8, 0x16, + 0x82, 0x02, 0x7C, 0x00, 0xFA, 0x16, 0x20, 0xC8, + 0x04, 0xE0, 0x82, 0x01, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0x80, 0x01, + 0x81, 0x07, 0x86, 0xE0, 0xB1, 0xC0, 0x07, 0x13, + 0xB1, 0xC4, 0xFC, 0x10, 0xA0, 0x07, 0x04, 0x01, + 0x2E, 0x00, 0x60, 0x04, 0xAA, 0xA1, 0x81, 0x07, + 0x34, 0xE0, 0x82, 0x07, 0xFC, 0x05, 0x83, 0x07, + 0x0A, 0x00, 0xB1, 0xCC, 0x43, 0x06, 0xFD, 0x16, + 0x02, 0x02, 0x00, 0x06, 0x60, 0xD0, 0x4E, 0x01, + 0xED, 0x13, 0x21, 0x02, 0x00, 0xF7, 0x21, 0x02, + 0x00, 0xC0, 0x81, 0xDC, 0x60, 0xD0, 0x4F, 0x01, + 0xC1, 0xC0, 0x41, 0x09, 0x21, 0x02, 0x00, 0xF0, + 0x81, 0xDC, 0x43, 0x02, 0x00, 0x0F, 0x23, 0x02, + 0x00, 0xF0, 0x83, 0xDC, 0x01, 0x02, 0x32, 0x0C, + 0xA0, 0xC0, 0x44, 0x04, 0xE0, 0xC0, 0x46, 0x04, + 0x03, 0xC1, 0x02, 0x61, 0x84, 0x05, 0x04, 0xC8, + 0x48, 0x04, 0x03, 0xC1, 0x84, 0x05, 0x04, 0xA1, + 0x01, 0xA1, 0x04, 0xC8, 0x30, 0x0C, 0x03, 0xC1, + 0x84, 0x05, 0xF1, 0x04, 0x04, 0x06, 0xFD, 0x16, + 0x08, 0x02, 0x00, 0xA0, 0xA8, 0x09, 0x60, 0xC2, + 0x30, 0x0C, 0x29, 0x02, 0xFF, 0x03, 0xA9, 0x09, + 0x29, 0x02, 0x40, 0x00, 0x80, 0x07, 0x00, 0x90, + 0xA0, 0x09, 0x8A, 0x07, 0xFE, 0x9F, 0x2A, 0x02, + 0xFF, 0x03, 0xAA, 0x09, 0x01, 0x02, 0x32, 0x0C, + 0x05, 0x02, 0x00, 0x00, 0x03, 0xC1, 0x84, 0x05, + 0x11, 0x07, 0xC1, 0x05, 0x85, 0x05, 0x04, 0x06, + 0x0B, 0x13, 0x85, 0x80, 0xF9, 0x1A, 0x05, 0x80, + 0xF8, 0x1A, 0x85, 0x82, 0xF5, 0x1A, 0x05, 0x82, + 0xF4, 0x1A, 0x45, 0x82, 0xF1, 0x1A, 0xF1, 0x10, + 0x20, 0x2D, 0x02, 0x00, 0x60, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x08, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 0x48, 0x10, + 0x60, 0x01, 0x42, 0x01, 0x00, 0x80, 0x06, 0x16, + 0x8A, 0x07, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, + 0x00, 0x80, 0x3E, 0x10, 0x60, 0x01, 0x02, 0x01, + 0x00, 0x10, 0x0A, 0x16, 0x60, 0x01, 0x00, 0x01, + 0x00, 0x04, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x80, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0x30, 0x10, + 0x60, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0A, 0x16, + 0x60, 0x01, 0x00, 0x01, 0x00, 0x04, 0x06, 0x16, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0D, 0x02, + 0x01, 0x00, 0x0D, 0x10, 0x60, 0x01, 0x02, 0x01, + 0x00, 0x04, 0x16, 0x16, 0x60, 0x01, 0x00, 0x01, + 0x00, 0x08, 0x12, 0x16, 0xA0, 0x01, 0x02, 0x01, + 0x00, 0x04, 0x0D, 0x02, 0x02, 0x00, 0xA0, 0xC3, + 0x0E, 0x01, 0xE0, 0xC3, 0x10, 0x01, 0x8A, 0x07, + 0x00, 0x20, 0x60, 0x01, 0x00, 0x01, 0x00, 0x80, + 0x0B, 0x13, 0x8A, 0x07, 0x00, 0x40, 0x08, 0x10, + 0x8A, 0x07, 0x04, 0x00, 0x05, 0x10, 0x8A, 0x07, + 0x02, 0x00, 0x02, 0x10, 0x8A, 0x07, 0x08, 0x00, + 0x00, 0x03, 0x00, 0x00, 0xE0, 0x04, 0x82, 0x01, + 0x8B, 0x07, 0xE0, 0x05, 0xCA, 0xCE, 0xCD, 0xCE, + 0xCE, 0xCE, 0xCF, 0xC6, 0x20, 0xC3, 0x58, 0x07, + 0x20, 0x23, 0x04, 0xE0, 0x12, 0x13, 0x8B, 0x07, + 0x18, 0xFF, 0x8A, 0x02, 0x00, 0x80, 0x0A, 0x13, + 0x8B, 0x05, 0xCD, 0xA2, 0x8A, 0x02, 0x00, 0x40, + 0x05, 0x13, 0x8A, 0x02, 0x00, 0x20, 0x02, 0x13, + 0x8B, 0x07, 0x1D, 0xFF, 0x0B, 0xC8, 0x04, 0x01, + 0x0D, 0x10, 0x20, 0xD3, 0x05, 0x01, 0xFD, 0x11, + 0x20, 0xD8, 0xDF, 0x07, 0x17, 0x01, 0x8B, 0x07, + 0x80, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x04, 0x01, + 0xE0, 0x22, 0x86, 0xE1, 0xFB, 0x16, 0xE0, 0x02, + 0xA0, 0x00, 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, + 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0xF6, 0x60, 0x04, 0x90, 0xA0, + 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, 0x02, 0x01, + 0xFF, 0xDF, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x09, 0x07, 0xA0, 0xC2, + 0x04, 0x01, 0x8A, 0x01, 0x80, 0x00, 0x4A, 0x52, + 0x89, 0xD2, 0x0A, 0xC8, 0x04, 0x01, 0xA0, 0xD2, + 0x04, 0x01, 0xF9, 0x16, 0x49, 0x05, 0x89, 0x01, + 0x00, 0x80, 0x49, 0x01, 0x00, 0x40, 0x0E, 0x13, + 0x09, 0xF8, 0x3A, 0x07, 0x60, 0xC2, 0x36, 0x07, + 0x03, 0x16, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, + 0xE0, 0x04, 0x36, 0x07, 0x54, 0x04, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x60, 0x22, 0x86, 0xE1, + 0xC2, 0x13, 0xE0, 0x04, 0x82, 0x01, 0x60, 0x04, + 0xE0, 0xA3, 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, + 0x62, 0x09, 0xE8, 0x03, 0xC9, 0x04, 0xA0, 0xC1, + 0x34, 0x06, 0x04, 0x16, 0xA0, 0x06, 0x50, 0xB5, + 0xE0, 0x04, 0x20, 0x09, 0x86, 0x07, 0xE8, 0x05, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 0x20, 0xC2, + 0x84, 0x01, 0x20, 0x48, 0x08, 0xE0, 0x84, 0x01, + 0x20, 0x22, 0x08, 0xE0, 0x08, 0x13, 0x60, 0x01, + 0xAE, 0x01, 0x01, 0x00, 0x04, 0x16, 0xE0, 0x01, + 0x34, 0x06, 0x00, 0x80, 0x06, 0x10, 0x20, 0xC2, + 0x32, 0x09, 0x06, 0x13, 0xE0, 0x01, 0x34, 0x06, + 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x09, 0x07, + 0xA0, 0x05, 0xEE, 0x05, 0x20, 0x06, 0xEC, 0x05, + 0x02, 0x16, 0x16, 0xC2, 0x03, 0x16, 0x49, 0xC2, + 0x12, 0x16, 0x80, 0x03, 0x98, 0xC5, 0xE8, 0xC1, + 0x02, 0x00, 0xE0, 0xE9, 0x14, 0xE0, 0x04, 0x00, + 0xD7, 0x04, 0x27, 0x02, 0x08, 0x00, 0xA0, 0x06, + 0xE6, 0xB4, 0x16, 0xC2, 0x04, 0x13, 0x28, 0xC8, + 0x08, 0x00, 0xEC, 0x05, 0xEF, 0x13, 0x54, 0x04, + 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC1, 0x86, 0x01, + 0x47, 0x02, 0x0E, 0x00, 0xA7, 0xC2, 0x90, 0xE1, + 0x5A, 0x04, 0x8A, 0x07, 0x00, 0xA0, 0x0A, 0xC8, + 0x86, 0x01, 0xC7, 0xA1, 0x27, 0x02, 0x98, 0xE1, + 0x37, 0xE8, 0x34, 0x06, 0x17, 0xE8, 0xD2, 0x06, + 0xE0, 0x04, 0x30, 0x06, 0x60, 0x04, 0xF2, 0xA9, + 0x0A, 0xE8, 0xD2, 0x06, 0xE0, 0x01, 0x34, 0x06, + 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x20, 0xE0, + 0x18, 0xE0, 0x5B, 0x04, 0xA0, 0x05, 0x20, 0x09, + 0x20, 0x88, 0x20, 0x09, 0x16, 0xE0, 0xE5, 0x1A, + 0xE0, 0x04, 0x20, 0x09, 0xA0, 0x06, 0xD0, 0xD5, + 0x80, 0x03, 0xA0, 0x05, 0x32, 0x09, 0x80, 0x03, + 0x01, 0xC3, 0xFB, 0x13, 0x60, 0x01, 0x6A, 0x09, + 0x01, 0x00, 0x78, 0x13, 0xA0, 0x05, 0x32, 0x09, + 0x75, 0x10, 0x41, 0xC0, 0x06, 0x13, 0x01, 0xC8, + 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x01, 0x11, + 0x7B, 0x10, 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, + 0x79, 0x16, 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, + 0x41, 0xC0, 0x04, 0x13, 0x01, 0xC8, 0x8A, 0x01, + 0x01, 0xC8, 0x18, 0x09, 0x86, 0x07, 0x43, 0x00, + 0x06, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x02, 0xFC, + 0x17, 0xC2, 0x60, 0x04, 0xFA, 0xA6, 0xE0, 0x04, + 0x18, 0x09, 0xC7, 0x61, 0x08, 0x07, 0x60, 0x01, + 0x06, 0xFC, 0x40, 0x00, 0x02, 0x13, 0x08, 0x02, + 0x01, 0x00, 0x09, 0x10, 0x4C, 0xC2, 0x20, 0xC3, + 0x00, 0xFC, 0x2A, 0x13, 0x0C, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x02, 0xFC, 0x1B, 0x11, 0x4B, 0x01, + 0x00, 0x01, 0xF4, 0x16, 0xC8, 0x22, 0x12, 0x13, + 0xCB, 0x01, 0x00, 0x40, 0x0B, 0xC8, 0x02, 0xFC, + 0x0D, 0x10, 0xE0, 0xC1, 0x18, 0x09, 0x01, 0xC3, + 0x21, 0x13, 0x4C, 0xC2, 0x15, 0x13, 0x0C, 0xC8, + 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x06, 0x11, + 0xCC, 0x81, 0xD5, 0x13, 0x4C, 0xC2, 0x20, 0xC3, + 0x00, 0xFC, 0xF4, 0x10, 0x09, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x02, 0xFC, 0x1E, 0x16, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x09, 0xC3, 0x19, 0x10, + 0x09, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, + 0x05, 0x16, 0xA0, 0x07, 0x02, 0xFC, 0x00, 0x80, + 0x09, 0xC3, 0x0F, 0x10, 0xE0, 0xC2, 0x02, 0x0C, + 0x01, 0x11, 0x1E, 0x10, 0x20, 0xD8, 0x00, 0xE2, + 0x83, 0x01, 0x8B, 0x09, 0x8B, 0x09, 0x8B, 0x09, + 0x8B, 0x09, 0xA0, 0x07, 0x8A, 0x01, 0x43, 0x00, + 0x13, 0x10, 0x0C, 0xC8, 0x8A, 0x01, 0x0C, 0xC8, + 0x18, 0x09, 0x0E, 0x10, 0x00, 0x03, 0x02, 0x00, + 0xE0, 0xC0, 0x6C, 0x01, 0x20, 0xC3, 0x8A, 0x01, + 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x81, 0x13, + 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0xB9, 0x13, + 0x01, 0x83, 0x31, 0x16, 0x03, 0xC8, 0x6C, 0x01, + 0x40, 0x01, 0x10, 0x00, 0x14, 0x16, 0xE0, 0xC2, + 0x2E, 0x06, 0x11, 0x13, 0xE0, 0xC2, 0xF8, 0x05, + 0x0E, 0x13, 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, + 0x80, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x36, 0x07, + 0x06, 0x13, 0xE0, 0x04, 0x36, 0x07, 0x80, 0x01, + 0x20, 0x00, 0x60, 0x04, 0xF2, 0xA9, 0x40, 0x01, + 0x20, 0x00, 0xF9, 0x13, 0x90, 0x03, 0xFF, 0x11, + 0x80, 0x03, 0x08, 0x01, 0x00, 0x04, 0x19, 0x16, + 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 0x15, 0x16, + 0x88, 0x01, 0x00, 0x1A, 0xC8, 0x01, 0x00, 0x01, + 0xC8, 0xC5, 0x0F, 0x10, 0xE0, 0x04, 0x18, 0x09, + 0xC0, 0x01, 0x04, 0x00, 0x15, 0x10, 0x81, 0xC1, + 0x01, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x00, 0xFC, + 0x77, 0xC0, 0x17, 0xC2, 0x48, 0x01, 0x00, 0x18, + 0xE4, 0x13, 0x40, 0x01, 0x40, 0x00, 0x15, 0x16, + 0x80, 0x01, 0x45, 0x00, 0x46, 0xC1, 0x20, 0xD0, + 0x07, 0xFC, 0x60, 0x81, 0x18, 0x09, 0xE6, 0x13, + 0xE0, 0xC2, 0x08, 0xFC, 0x08, 0x11, 0xE0, 0xC2, + 0x0E, 0xFC, 0x07, 0x15, 0x06, 0x13, 0xE0, 0xC2, + 0x14, 0xFC, 0x03, 0x15, 0x02, 0x13, 0xC0, 0x01, + 0x01, 0x00, 0x48, 0x01, 0x00, 0x01, 0x11, 0x13, + 0x40, 0x01, 0x80, 0x40, 0x69, 0x13, 0x60, 0x04, + 0x66, 0xA6, 0x48, 0x01, 0x01, 0x00, 0x03, 0x16, + 0x40, 0x01, 0x00, 0x40, 0x0B, 0x16, 0xC8, 0x01, + 0x00, 0x40, 0xA0, 0x05, 0x32, 0x09, 0xC8, 0xC5, + 0x05, 0x10, 0xC0, 0x01, 0x40, 0x00, 0x40, 0x01, + 0x04, 0x00, 0xEF, 0x13, 0xB7, 0x01, 0x20, 0x00, + 0xD7, 0xC2, 0xC4, 0x62, 0x0B, 0x05, 0x2B, 0x02, + 0xFC, 0xFF, 0xCB, 0xC5, 0x02, 0x15, 0x46, 0x81, + 0x6A, 0x13, 0x08, 0x01, 0x00, 0x5E, 0x67, 0x16, + 0x08, 0x01, 0x88, 0x00, 0x13, 0x16, 0x86, 0x02, + 0x43, 0x00, 0x25, 0x16, 0x40, 0x01, 0x00, 0x40, + 0x0B, 0x13, 0x08, 0x01, 0x03, 0x00, 0x08, 0x13, + 0x84, 0xC2, 0x2A, 0x02, 0xD8, 0xFF, 0x06, 0xC8, + 0x6C, 0x01, 0x0A, 0x68, 0x04, 0xFC, 0x73, 0x10, + 0x60, 0x04, 0xD2, 0xA8, 0x40, 0x01, 0x01, 0x00, + 0xEA, 0x13, 0x08, 0x01, 0x02, 0x00, 0xE7, 0x16, + 0x48, 0x01, 0x01, 0x00, 0xE4, 0x16, 0x40, 0x01, + 0x00, 0x40, 0x04, 0x16, 0x60, 0x01, 0xA8, 0x09, + 0x80, 0x00, 0xDD, 0x13, 0x8A, 0x07, 0x80, 0x00, + 0xA0, 0x06, 0x32, 0xA5, 0xD8, 0x10, 0x00, 0xC0, + 0xE7, 0x11, 0x60, 0xC2, 0x6A, 0x09, 0x40, 0x01, + 0x00, 0x40, 0x0A, 0x13, 0x48, 0x01, 0x01, 0x00, + 0x34, 0x13, 0x48, 0x01, 0x02, 0x00, 0x0A, 0x13, + 0x49, 0x01, 0x04, 0x00, 0xD9, 0x16, 0x06, 0x10, + 0x49, 0x01, 0x02, 0x00, 0x03, 0x13, 0x08, 0x01, + 0x03, 0x00, 0x6E, 0x13, 0x49, 0x01, 0x01, 0x00, + 0x12, 0x13, 0x40, 0x01, 0x80, 0x40, 0x01, 0x16, + 0x46, 0xC1, 0xE0, 0x04, 0x00, 0xFC, 0x87, 0x07, + 0xF8, 0x05, 0x17, 0xC2, 0x14, 0x13, 0xC7, 0x05, + 0x17, 0xC8, 0x6C, 0x01, 0x05, 0xC8, 0x00, 0xFC, + 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x07, 0x02, + 0x02, 0xFC, 0xE0, 0xA1, 0x2C, 0x09, 0xE0, 0xCD, + 0xEE, 0x05, 0xE0, 0xC5, 0x04, 0xFC, 0x20, 0xC8, + 0x2C, 0x09, 0x04, 0xFC, 0xE2, 0x10, 0xC5, 0xCD, + 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x60, 0x04, + 0xB6, 0xA8, 0x06, 0xC8, 0x6C, 0x01, 0x85, 0x81, + 0x1A, 0x13, 0xE0, 0xC2, 0x04, 0xFC, 0x17, 0x15, + 0x86, 0xC2, 0x8A, 0xA2, 0xAA, 0xC1, 0x32, 0x0C, + 0x06, 0xC8, 0x6C, 0x01, 0x0B, 0xA8, 0x04, 0xFC, + 0x1A, 0x09, 0x0A, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, + 0x02, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 0x06, 0xC8, + 0x6C, 0x01, 0x0B, 0xC8, 0x02, 0xFC, 0xA0, 0x06, + 0x3E, 0xB4, 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0xA0, 0x01, 0x02, 0xFC, 0x02, 0x00, + 0x87, 0x07, 0x30, 0x06, 0xE7, 0x01, 0x04, 0x00, + 0x40, 0x00, 0xD7, 0x04, 0x27, 0x02, 0x0C, 0x00, + 0x05, 0xC2, 0x60, 0x01, 0x6A, 0x09, 0x04, 0x00, + 0x03, 0x16, 0xE0, 0x01, 0x02, 0xFC, 0x20, 0x00, + 0xA0, 0x06, 0xFC, 0xB4, 0xC0, 0x01, 0x20, 0x00, + 0x60, 0x04, 0x66, 0xA6, 0x48, 0x01, 0x00, 0x18, + 0x03, 0x13, 0x48, 0x01, 0x00, 0x10, 0x02, 0x16, + 0xA0, 0x05, 0x32, 0x09, 0x86, 0x02, 0x43, 0x00, + 0x03, 0x13, 0x40, 0x01, 0x80, 0x40, 0x98, 0x13, + 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, + 0x85, 0xC2, 0xA0, 0x06, 0x3E, 0xB4, 0x20, 0x06, + 0x62, 0x09, 0xE6, 0x16, 0xA0, 0x06, 0xD0, 0xD5, + 0xE3, 0x10, 0xA0, 0xC2, 0xF6, 0x05, 0x56, 0x16, + 0x19, 0xC8, 0xF0, 0x05, 0xA9, 0xC2, 0x0A, 0x00, + 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 0x0A, 0xD8, + 0x80, 0x01, 0x29, 0xC8, 0x06, 0x00, 0x8C, 0x01, + 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 0x09, 0xC8, + 0xF4, 0x05, 0x46, 0x10, 0x29, 0xC8, 0x06, 0x00, + 0x6C, 0x01, 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, + 0x20, 0xC8, 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, + 0x12, 0xFC, 0xB2, 0x01, 0xA0, 0xF2, 0x2E, 0x09, + 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0xC4, 0xE1, 0x10, 0x47, 0x01, 0x08, 0x00, + 0x06, 0x16, 0xA8, 0xC2, 0x06, 0x00, 0xA0, 0x06, + 0x3E, 0xB4, 0xE8, 0x04, 0x06, 0x00, 0x07, 0x01, + 0x20, 0x00, 0x31, 0x13, 0xE8, 0x04, 0x02, 0x00, + 0x3B, 0x10, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x06, + 0x3E, 0xB4, 0x29, 0x10, 0x00, 0x03, 0x02, 0x00, + 0x20, 0xC2, 0x8C, 0x01, 0xE0, 0xC0, 0x6C, 0x01, + 0x20, 0xC2, 0xF4, 0x05, 0x28, 0xC8, 0x08, 0x00, + 0x6C, 0x01, 0xE8, 0xC1, 0x0A, 0x00, 0x20, 0xC3, + 0x02, 0xFC, 0x8C, 0x01, 0x20, 0x00, 0x0C, 0xC8, + 0x02, 0xFC, 0x0C, 0x01, 0x00, 0xFE, 0x3B, 0x16, + 0x47, 0x01, 0x40, 0x00, 0x50, 0x13, 0x60, 0xC2, + 0xF0, 0x05, 0xA7, 0x16, 0xE0, 0x04, 0xF4, 0x05, + 0x0C, 0xCA, 0x08, 0x00, 0x47, 0x01, 0x80, 0x00, + 0xC9, 0x16, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA0, 0xC2, 0x00, 0xFC, 0xD2, 0x16, 0xE8, 0xC1, + 0x02, 0x00, 0xD7, 0xC2, 0x0F, 0x16, 0x27, 0x02, + 0x10, 0x00, 0xD8, 0x04, 0x57, 0xC2, 0x0E, 0x13, + 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, + 0x03, 0xC8, 0x6C, 0x01, 0x0D, 0x11, 0x90, 0x03, + 0xFF, 0x11, 0x80, 0x03, 0xD7, 0x04, 0xC3, 0x01, + 0x00, 0x80, 0xED, 0x10, 0xE7, 0x01, 0xF4, 0xFF, + 0x20, 0x00, 0xC8, 0xCD, 0xC8, 0xC5, 0xF0, 0x10, + 0x90, 0x03, 0xF8, 0x11, 0xE0, 0x02, 0xC0, 0x00, + 0x60, 0xC3, 0xFA, 0x00, 0xA0, 0xC3, 0xFC, 0x00, + 0xE0, 0xC3, 0xFE, 0x00, 0x54, 0x04, 0xE8, 0xC2, + 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x0C, 0xC3, + 0x33, 0x11, 0x20, 0x23, 0x0A, 0xE0, 0x45, 0x13, + 0x20, 0x23, 0x10, 0xE0, 0x46, 0x13, 0x20, 0x23, + 0x0E, 0xE0, 0x13, 0x13, 0xE0, 0x21, 0x16, 0xE0, + 0xB6, 0x16, 0x20, 0x23, 0x06, 0xE0, 0x03, 0x16, + 0x20, 0x27, 0xA8, 0xE4, 0x0A, 0x13, 0xE8, 0xC2, + 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x4C, 0x01, + 0x88, 0x00, 0xA9, 0x16, 0x0C, 0x01, 0x44, 0x00, + 0xA6, 0x16, 0x20, 0x06, 0x16, 0x09, 0xA3, 0x13, + 0x0A, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x04, 0xE0, + 0x02, 0xFC, 0x0B, 0xC8, 0x6C, 0x01, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x81, 0x20, 0xC3, 0x80, 0x01, + 0xA0, 0x01, 0x80, 0x01, 0x00, 0xC4, 0x0C, 0xC8, + 0x80, 0x01, 0x0A, 0xC8, 0x8C, 0x01, 0xAC, 0x10, + 0x0A, 0xC2, 0x0F, 0x13, 0x08, 0xC8, 0x6C, 0x01, + 0xA0, 0xC2, 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, + 0x20, 0x23, 0x12, 0xE0, 0xF5, 0x16, 0x0B, 0xC8, + 0x6C, 0x01, 0x0C, 0xC8, 0x02, 0xFC, 0x60, 0x04, + 0x72, 0xA9, 0x8A, 0x07, 0x00, 0x04, 0x60, 0x04, + 0x8A, 0xA3, 0x8A, 0x07, 0x20, 0x00, 0x60, 0x04, + 0x8A, 0xA3, 0x8A, 0x07, 0x00, 0x02, 0x20, 0x27, + 0x0E, 0xE0, 0x04, 0x16, 0xA0, 0x06, 0x32, 0xA5, + 0xC3, 0x01, 0x00, 0x80, 0xA8, 0xC2, 0x06, 0x00, + 0x60, 0x04, 0x98, 0xA9, 0x00, 0x03, 0x02, 0x00, + 0xC0, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x2E, 0x06, + 0x08, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 0x05, 0x13, + 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 0x80, 0x01, + 0x10, 0x00, 0x90, 0x03, 0xFF, 0x7F, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x20, 0xC2, 0xF6, 0x05, + 0x20, 0xE2, 0xF4, 0x05, 0x0E, 0x16, 0x20, 0xD8, + 0x2E, 0x09, 0x80, 0x01, 0x2B, 0xC8, 0x06, 0x00, + 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, + 0x0B, 0xC8, 0xF4, 0x05, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 0xDB, 0x04, + 0x57, 0xC2, 0x05, 0x16, 0xCB, 0xCD, 0xCB, 0xC5, + 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xC7, 0x05, + 0x57, 0xC2, 0x4B, 0xC6, 0xCB, 0xC5, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x0B, 0xC2, 0x20, 0xC3, 0xF4, 0x05, 0x0F, 0x13, + 0xA8, 0xC2, 0x0A, 0x00, 0x4A, 0x01, 0x10, 0x00, + 0x16, 0x16, 0xA0, 0x22, 0x04, 0xE0, 0x1A, 0x16, + 0x08, 0xC3, 0xA0, 0x06, 0x36, 0xAC, 0x0C, 0xC2, + 0x20, 0xC3, 0xF4, 0x05, 0x13, 0x16, 0x68, 0x01, + 0x0A, 0x00, 0x10, 0x00, 0x03, 0x13, 0xE0, 0xC2, + 0xF6, 0x05, 0x05, 0x16, 0xA0, 0x06, 0x78, 0xAC, + 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, + 0xF0, 0x05, 0xA0, 0x06, 0xE6, 0xB4, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, + 0xA0, 0x06, 0x2C, 0xB5, 0x80, 0x03, 0x00, 0x03, + 0x02, 0x00, 0x87, 0x07, 0xF0, 0x05, 0xCB, 0xC2, + 0x08, 0x16, 0xA0, 0x06, 0x36, 0xAC, 0x20, 0x07, + 0xF6, 0x05, 0x60, 0xCB, 0xF4, 0x05, 0x02, 0x00, + 0x80, 0x03, 0xE0, 0x04, 0xF6, 0x05, 0x20, 0xC2, + 0xF4, 0x05, 0x05, 0x16, 0x17, 0xC2, 0x03, 0x13, + 0xD8, 0xC5, 0xA0, 0x06, 0x78, 0xAC, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC3, 0xA0, 0x06, + 0x36, 0xAC, 0x8C, 0xC2, 0xCC, 0xC1, 0x27, 0x02, + 0x10, 0x00, 0x88, 0x07, 0xF0, 0x05, 0x88, 0xC1, + 0x18, 0xC2, 0x26, 0x13, 0xA8, 0x82, 0x02, 0x00, + 0xFA, 0x16, 0xE8, 0xC2, 0x0A, 0x00, 0xE0, 0x22, + 0x1E, 0xE0, 0xF5, 0x16, 0x98, 0xC5, 0xE0, 0x22, + 0x1C, 0xE0, 0x0B, 0x16, 0x28, 0xC8, 0x06, 0x00, + 0xF4, 0x00, 0xE0, 0x02, 0xE0, 0x00, 0xA0, 0x06, + 0x3E, 0xB4, 0xE0, 0x02, 0xC0, 0x00, 0xE8, 0x04, + 0x06, 0x00, 0xE0, 0x22, 0x18, 0xE0, 0xE4, 0x13, + 0x20, 0xEA, 0x22, 0xE0, 0x0A, 0x00, 0xA0, 0xEA, + 0x18, 0xE0, 0x04, 0x00, 0xDA, 0x04, 0xA0, 0x06, + 0xE6, 0xB4, 0x47, 0x06, 0x06, 0xC2, 0xD8, 0x10, + 0x06, 0xC8, 0xF2, 0x05, 0x60, 0xCB, 0xF4, 0x05, + 0x02, 0x00, 0x54, 0x04, 0x20, 0xC2, 0xF4, 0x05, + 0x13, 0x13, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, + 0x8B, 0x0B, 0x8B, 0x0B, 0x60, 0x01, 0x9C, 0x01, + 0x00, 0x40, 0x0A, 0x16, 0x60, 0xC2, 0x6C, 0x01, + 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC2, + 0x02, 0xFC, 0x03, 0x11, 0x09, 0xC8, 0x6C, 0x01, + 0x5B, 0x04, 0x09, 0xC8, 0x6C, 0x01, 0x4B, 0xC2, + 0x87, 0x07, 0xF0, 0x05, 0xA0, 0x06, 0x2C, 0xB5, + 0xE0, 0x04, 0xF4, 0x05, 0x59, 0x04, 0xA8, 0xC2, + 0x0A, 0x00, 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, + 0x0A, 0xD8, 0x80, 0x01, 0x28, 0xC8, 0x06, 0x00, + 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, + 0x08, 0xC8, 0xF4, 0x05, 0x5B, 0x04, 0x20, 0xC3, + 0x6C, 0x01, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 0x20, 0xC8, + 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 0x12, 0xFC, + 0xB2, 0x01, 0x0C, 0xC8, 0x6C, 0x01, 0xA0, 0xF2, + 0x2E, 0x09, 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, + 0x80, 0x01, 0x00, 0xC4, 0xDD, 0x10, 0x48, 0xC0, + 0x89, 0xC0, 0x81, 0x60, 0xC2, 0x05, 0x5B, 0x04, + 0x0B, 0xC3, 0xA0, 0x06, 0xC8, 0xAC, 0x41, 0xCC, + 0x42, 0x06, 0xFD, 0x16, 0xA0, 0x06, 0xC8, 0xAC, + 0x01, 0xC1, 0x44, 0x8C, 0x12, 0x16, 0xC4, 0x05, + 0x42, 0x06, 0xFB, 0x16, 0x04, 0x02, 0x0E, 0xAD, + 0x03, 0x02, 0x01, 0x01, 0x94, 0x06, 0x03, 0x02, + 0x5A, 0x5A, 0x94, 0x06, 0x43, 0x05, 0x94, 0x06, + 0x03, 0x07, 0x94, 0x06, 0xC3, 0x04, 0x94, 0x06, + 0xCC, 0x05, 0x5C, 0x04, 0xCB, 0xC1, 0xA0, 0x06, + 0xC8, 0xAC, 0x43, 0xCC, 0x42, 0x06, 0xFD, 0x16, + 0xA0, 0x06, 0xC8, 0xAC, 0x43, 0x8C, 0xF5, 0x16, + 0x42, 0x06, 0xFC, 0x16, 0x57, 0x04, 0x8B, 0xC2, + 0x08, 0xC0, 0x49, 0xC1, 0x85, 0x05, 0x80, 0x02, + 0x40, 0x00, 0x03, 0x11, 0x80, 0x02, 0x4F, 0x00, + 0x45, 0x12, 0x01, 0x02, 0xC8, 0xAC, 0xA1, 0x09, + 0x01, 0x80, 0x40, 0x13, 0x01, 0x02, 0xF8, 0xAD, + 0xA1, 0x09, 0x01, 0x80, 0x3B, 0x13, 0x60, 0xC0, + 0x06, 0x00, 0xA1, 0x09, 0x01, 0x80, 0x36, 0x13, + 0x81, 0x05, 0x01, 0x80, 0x33, 0x13, 0x4A, 0xC0, + 0xA1, 0x09, 0x01, 0x80, 0x2F, 0x13, 0x00, 0xC8, + 0x6A, 0x01, 0x80, 0x02, 0x80, 0x00, 0x17, 0x14, + 0x01, 0x02, 0x00, 0xF8, 0xA0, 0xC1, 0x40, 0x01, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 0x02, 0x02, + 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0xB1, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x08, 0x02, 0x10, 0xF8, 0x06, 0xC8, + 0x40, 0x01, 0x00, 0xC0, 0x02, 0x13, 0x08, 0x02, + 0x00, 0xF8, 0x09, 0x02, 0xFE, 0xFB, 0xA0, 0x06, + 0xD2, 0xAC, 0x25, 0x10, 0x80, 0x02, 0x80, 0x00, + 0x09, 0x14, 0x01, 0x02, 0x00, 0xF8, 0x02, 0x02, + 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0x72, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0x80, 0x05, 0x80, 0x02, + 0x80, 0x00, 0x04, 0x12, 0x60, 0x01, 0x04, 0x01, + 0x20, 0x00, 0x05, 0x13, 0x40, 0x81, 0xAB, 0x16, + 0x80, 0x02, 0x80, 0x00, 0x0B, 0x14, 0xA0, 0x07, + 0x6A, 0x01, 0x7E, 0x00, 0x02, 0x02, 0x00, 0x10, + 0x03, 0x02, 0x00, 0x04, 0xC1, 0x04, 0x81, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0xCA, 0x05, 0x5A, 0x04, + 0x00, 0x02, 0xEA, 0xAD, 0x01, 0x02, 0x1A, 0xAF, + 0x40, 0x02, 0x00, 0xFC, 0x41, 0x02, 0x00, 0xFC, + 0x40, 0x80, 0x04, 0x13, 0xA0, 0x07, 0x04, 0x01, + 0x3C, 0x00, 0x5B, 0x04, 0xC0, 0x04, 0x01, 0x02, + 0x08, 0x00, 0x02, 0x02, 0x00, 0x12, 0xE0, 0xC1, + 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, + 0x03, 0x02, 0x00, 0x01, 0x00, 0xC8, 0x6A, 0x01, + 0xA0, 0xCC, 0x10, 0xF8, 0x80, 0x05, 0x03, 0x06, + 0xF9, 0x16, 0x22, 0x02, 0x00, 0x02, 0x01, 0x06, + 0xF3, 0x16, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0x07, 0xC8, 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, + 0x40, 0xC0, 0x01, 0x06, 0x01, 0xC8, 0x6A, 0x01, + 0x61, 0x02, 0x00, 0x80, 0x01, 0xC8, 0x10, 0xF8, + 0x00, 0x06, 0xF6, 0x16, 0xC0, 0x04, 0xC8, 0x04, + 0xC9, 0x04, 0x03, 0x02, 0x00, 0x08, 0x00, 0xC8, + 0x6A, 0x01, 0x80, 0xC1, 0x66, 0x02, 0x00, 0x80, + 0x20, 0xC1, 0x10, 0xF8, 0x06, 0x81, 0x15, 0x16, + 0x08, 0xC2, 0x06, 0x13, 0x80, 0x05, 0x03, 0x06, + 0xF2, 0x16, 0x08, 0xC2, 0x0D, 0x13, 0x19, 0x10, + 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 0x20, 0xC1, + 0x10, 0xF8, 0x84, 0x02, 0x55, 0x55, 0x02, 0x16, + 0x06, 0xC2, 0xF0, 0x10, 0x06, 0x81, 0xEE, 0x13, + 0x5B, 0x04, 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, + 0x60, 0xC1, 0x10, 0xF8, 0x05, 0x81, 0x03, 0x13, + 0x85, 0x02, 0x55, 0x55, 0xF5, 0x16, 0x08, 0xC2, + 0xE1, 0x13, 0x40, 0xC2, 0x09, 0x06, 0x48, 0x02, + 0xFF, 0x07, 0xC0, 0x04, 0x01, 0x02, 0x08, 0x00, + 0x02, 0x02, 0x00, 0x12, 0x03, 0x02, 0x00, 0x01, + 0x00, 0xC8, 0x6A, 0x01, 0x32, 0xC8, 0x10, 0xF8, + 0x80, 0x05, 0x03, 0x06, 0xF9, 0x16, 0x22, 0x02, + 0x00, 0x02, 0x01, 0x06, 0xF3, 0x16, 0x88, 0x02, + 0x40, 0x00, 0x13, 0x15, 0x89, 0x02, 0x4F, 0x00, + 0x10, 0x11, 0xC0, 0x04, 0x02, 0x02, 0x00, 0x12, + 0x01, 0x02, 0x08, 0x00, 0x03, 0x02, 0x00, 0x01, + 0x80, 0xCC, 0x03, 0x06, 0xFD, 0x16, 0x22, 0x02, + 0x00, 0x02, 0x01, 0x06, 0xF7, 0x16, 0xCB, 0x05, + 0x5B, 0x04, 0xA0, 0x07, 0x04, 0x01, 0x37, 0x00, + 0x5B, 0x04, 0x33, 0x07, 0x33, 0x07, 0x0C, 0x10, + 0x13, 0x07, 0x23, 0x07, 0x02, 0x00, 0xCB, 0xC8, + 0x06, 0x00, 0x23, 0x02, 0x18, 0x00, 0xE0, 0xCC, + 0x6C, 0x01, 0xCD, 0xCC, 0xCE, 0xCC, 0xCF, 0xCC, + 0x83, 0x07, 0x30, 0x06, 0xD3, 0xC1, 0x0A, 0x13, + 0x83, 0x07, 0x36, 0x07, 0xD3, 0xC1, 0x06, 0x13, + 0x83, 0x07, 0xA0, 0x00, 0x93, 0x00, 0x0C, 0xC8, + 0x6C, 0x01, 0x80, 0x03, 0x63, 0x07, 0x02, 0x00, + 0x2A, 0x15, 0x63, 0xC2, 0x04, 0x00, 0x63, 0x42, + 0x06, 0x00, 0xDB, 0x13, 0x63, 0xC3, 0x1A, 0x00, + 0x49, 0xD2, 0x0C, 0x13, 0xC9, 0x06, 0x49, 0x72, + 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 0x49, 0x72, + 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, + 0x02, 0x00, 0x52, 0x04, 0x69, 0xC2, 0xC0, 0xE1, + 0x49, 0x72, 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, + 0xE9, 0xA2, 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, + 0x12, 0x00, 0x0F, 0x13, 0xDC, 0xC6, 0x03, 0x16, + 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, + 0x02, 0x00, 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, + 0xFF, 0x01, 0x93, 0x00, 0x0C, 0xC8, 0x6C, 0x01, + 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, + 0x00, 0xFC, 0xF1, 0x16, 0xE9, 0x48, 0x04, 0xE0, + 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 0x4C, 0xCB, + 0x04, 0x00, 0xED, 0x10, 0x00, 0x03, 0x02, 0x00, + 0xDB, 0xC2, 0x63, 0xC2, 0x04, 0x00, 0x4B, 0x42, + 0x9F, 0x13, 0x49, 0xD2, 0x0E, 0x13, 0xC9, 0x06, + 0x49, 0x72, 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, + 0x49, 0x72, 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, + 0x49, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x69, 0xC2, 0xC0, 0xE1, 0x49, 0x72, + 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 0xE9, 0xA2, + 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 0x12, 0x00, + 0x0C, 0x13, 0xDC, 0xC6, 0x03, 0x16, 0xE9, 0x48, + 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, + 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, + 0x00, 0xFC, 0xF4, 0x16, 0xF0, 0x10, 0x00, 0x03, + 0x02, 0x00, 0xBB, 0xC2, 0xBB, 0xC1, 0x86, 0xD1, + 0x03, 0x13, 0x86, 0xEA, 0x04, 0x00, 0x13, 0x10, + 0xA6, 0xD1, 0xC0, 0xE1, 0xC6, 0x06, 0x86, 0x71, + 0xCA, 0xC1, 0xE6, 0xA1, 0xB8, 0xE1, 0xA6, 0xEA, + 0x14, 0xE0, 0x04, 0x00, 0x1B, 0xC2, 0x86, 0x02, + 0x02, 0x00, 0x03, 0x16, 0xA0, 0x06, 0x0C, 0xB5, + 0x02, 0x10, 0xA0, 0x06, 0xE6, 0xB4, 0xDA, 0x04, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xAB, 0xC2, + 0x06, 0x00, 0x8C, 0x07, 0xE8, 0x05, 0x5C, 0xC2, + 0x16, 0x13, 0xA0, 0xC1, 0xEC, 0x05, 0x8A, 0x81, + 0x1A, 0x1A, 0xC6, 0xC1, 0x09, 0xC2, 0x59, 0xC2, + 0x20, 0x13, 0xE9, 0xA1, 0x08, 0x00, 0x87, 0x82, + 0xF9, 0x12, 0xA9, 0xA2, 0x08, 0x00, 0x87, 0x62, + 0xCA, 0xCA, 0x08, 0x00, 0x4A, 0x6A, 0x08, 0x00, + 0xC9, 0xC6, 0x0B, 0xC6, 0x80, 0x03, 0xCA, 0xCA, + 0x08, 0x00, 0x0A, 0xC8, 0xEC, 0x05, 0xDB, 0x04, + 0x0B, 0xCF, 0x0B, 0xC7, 0x80, 0x03, 0x8A, 0x61, + 0x46, 0xCA, 0x08, 0x00, 0xCA, 0xCA, 0x08, 0x00, + 0x0A, 0xC8, 0xEC, 0x05, 0xC9, 0xC6, 0x0B, 0xC7, + 0x80, 0x03, 0x87, 0x62, 0xCA, 0xCA, 0x08, 0x00, + 0xDB, 0x04, 0x0B, 0xC6, 0x0B, 0xCB, 0x02, 0x00, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xBB, 0xC1, + 0xDB, 0xC2, 0x8C, 0x07, 0xE8, 0x05, 0x4C, 0xC2, + 0xED, 0x04, 0x02, 0x00, 0x09, 0xC2, 0x59, 0xC2, + 0x18, 0x13, 0xA9, 0x81, 0x02, 0x00, 0xFA, 0x16, + 0xE9, 0x82, 0x04, 0x00, 0xF7, 0x16, 0x49, 0xCB, + 0x04, 0x00, 0x99, 0xC2, 0x0A, 0xC6, 0x0A, 0x13, + 0x08, 0x83, 0x04, 0x13, 0xA9, 0xAA, 0x08, 0x00, + 0x08, 0x00, 0x80, 0x03, 0x2A, 0xA8, 0x08, 0x00, + 0xEC, 0x05, 0x80, 0x03, 0x08, 0xCB, 0x02, 0x00, + 0x80, 0x03, 0x2D, 0x07, 0x02, 0x00, 0x8C, 0x07, + 0x08, 0x00, 0x06, 0xA3, 0x4C, 0xC2, 0x09, 0xC2, + 0x59, 0xC2, 0x13, 0x13, 0xE9, 0x82, 0x04, 0x00, + 0xFA, 0x16, 0xAD, 0x07, 0x02, 0x00, 0x01, 0x00, + 0x49, 0xCB, 0x04, 0x00, 0x19, 0xC6, 0x01, 0x13, + 0x80, 0x03, 0x08, 0x83, 0x04, 0x16, 0xA0, 0x49, + 0x14, 0xE0, 0x04, 0x00, 0x80, 0x03, 0x08, 0xCB, + 0x02, 0x00, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x0B, 0x06, 0x1F, 0x11, 0x4D, 0x13, 0x8B, 0x07, + 0x00, 0x4E, 0x60, 0x01, 0x42, 0x01, 0x80, 0x00, + 0x09, 0x13, 0x8B, 0x07, 0x00, 0x3A, 0x20, 0xC1, + 0x4E, 0x01, 0x84, 0x02, 0x41, 0x0F, 0x02, 0x11, + 0x8B, 0x07, 0x00, 0x4E, 0x0B, 0xC8, 0x44, 0x01, + 0xA0, 0x07, 0x62, 0x09, 0xE8, 0x03, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x40, 0x01, + 0x00, 0x20, 0x84, 0x07, 0x34, 0xAF, 0x60, 0x04, + 0x42, 0xAF, 0x20, 0xC8, 0x16, 0xE0, 0xE0, 0x00, + 0xE0, 0xC2, 0x6A, 0x09, 0xE0, 0x22, 0x10, 0xE0, + 0x03, 0x13, 0x20, 0xE8, 0x14, 0xE0, 0xE0, 0x00, + 0x20, 0xC8, 0x04, 0xE0, 0x82, 0x01, 0x20, 0xC8, + 0xE2, 0x00, 0x8A, 0x01, 0xE0, 0x04, 0x18, 0x09, + 0xE0, 0x04, 0xF4, 0x05, 0xE0, 0x04, 0xF8, 0x05, + 0xE0, 0x04, 0xF0, 0x05, 0xE0, 0x04, 0x42, 0x07, + 0xA0, 0x07, 0x88, 0x01, 0x20, 0x00, 0xE0, 0xC2, + 0x30, 0x09, 0x09, 0x13, 0xA0, 0x07, 0x88, 0x01, + 0x80, 0x00, 0x20, 0xE8, 0x16, 0xE0, 0x80, 0x01, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x03, 0x8B, 0x07, + 0x00, 0xA0, 0x0B, 0xE8, 0x86, 0x01, 0x80, 0x03, + 0xE0, 0x04, 0x86, 0x01, 0xE0, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, + 0xCB, 0x04, 0xB0, 0x03, 0x0B, 0x06, 0x04, 0x13, + 0x60, 0x01, 0x9C, 0x01, 0x00, 0x40, 0xF9, 0x16, + 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, 0x08, 0xE0, + 0x6A, 0x09, 0x8B, 0x07, 0x00, 0x80, 0x0B, 0xC8, + 0x98, 0x07, 0x0B, 0xC8, 0x78, 0x07, 0x20, 0xC8, + 0x04, 0xE0, 0x82, 0x01, 0x8B, 0x07, 0x6F, 0x87, + 0x0B, 0x48, 0x3A, 0x07, 0xE0, 0xC2, 0x50, 0x07, + 0x8B, 0x02, 0x58, 0x07, 0x10, 0x13, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, + 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0x8B, 0x07, + 0x58, 0x07, 0x0B, 0xC8, 0x50, 0x07, 0x8B, 0x07, + 0x0C, 0xB8, 0x0B, 0xC8, 0x52, 0x07, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC2, 0x1A, 0x09, + 0x0C, 0x13, 0x20, 0x06, 0x1C, 0x09, 0x0B, 0xC8, + 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 0x1A, 0x09, + 0x4B, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x41, 0xC0, 0x0F, 0x13, 0x81, 0x80, + 0x0D, 0x13, 0x82, 0xA0, 0xE2, 0xC2, 0x32, 0x0C, + 0x12, 0x09, 0x0B, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 0x07, 0x11, + 0x02, 0xC8, 0x00, 0xFC, 0xED, 0x04, 0x02, 0x00, + 0xE0, 0x04, 0x6C, 0x01, 0x80, 0x03, 0x42, 0xCB, + 0x02, 0x00, 0x02, 0xC8, 0x6C, 0x01, 0x8B, 0xC0, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x83, 0x07, + 0x00, 0x80, 0x60, 0xC2, 0x7E, 0x09, 0x09, 0xC1, + 0x24, 0x02, 0xF8, 0xFF, 0xA9, 0x08, 0x01, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0B, 0x02, + 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, + 0x06, 0x13, 0x8B, 0x05, 0xCC, 0x05, 0x0B, 0x88, + 0x46, 0x04, 0x27, 0x1B, 0xF6, 0x10, 0x09, 0xC2, + 0x8B, 0xC2, 0x08, 0x06, 0x0A, 0x13, 0x8B, 0x05, + 0xCC, 0x05, 0x0B, 0x88, 0x46, 0x04, 0x1D, 0x1B, + 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 0xED, 0x16, + 0xF4, 0x10, 0x82, 0xC0, 0x14, 0x13, 0x02, 0xC8, + 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 0x0A, 0xC8, + 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, + 0x0A, 0xC2, 0x08, 0xA2, 0x02, 0xCA, 0x32, 0x0C, + 0x8A, 0xC0, 0x87, 0x05, 0xD6, 0x10, 0x4A, 0xC0, + 0xEE, 0x10, 0x47, 0xCB, 0x02, 0x00, 0xE0, 0x04, + 0x6C, 0x01, 0x8B, 0x07, 0x43, 0x00, 0xE0, 0x04, + 0x00, 0x0C, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, + 0x6C, 0x01, 0x8B, 0x02, 0x43, 0x00, 0x04, 0x13, + 0x60, 0x01, 0x02, 0xFC, 0x20, 0x00, 0x06, 0x13, + 0x8B, 0xC2, 0xA0, 0x06, 0x42, 0xB4, 0x90, 0x03, + 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x02, 0xFC, + 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, + 0x0B, 0x16, 0x0A, 0x02, 0x02, 0xFC, 0xA0, 0xA2, + 0x2C, 0x09, 0xA0, 0xCE, 0xEE, 0x05, 0xA0, 0xC6, + 0x04, 0xFC, 0x20, 0xC8, 0x2C, 0x09, 0x04, 0xFC, + 0x8A, 0x07, 0xF8, 0x05, 0x5A, 0xC2, 0x08, 0x13, + 0xCA, 0x05, 0x5A, 0xC2, 0x09, 0xC8, 0x6C, 0x01, + 0x0B, 0xC8, 0x00, 0xFC, 0x8B, 0xC6, 0x02, 0x10, + 0x8B, 0xCE, 0x8B, 0xC6, 0x20, 0x20, 0x1A, 0xE0, + 0x05, 0x16, 0x20, 0xE8, 0x04, 0xE0, 0x3A, 0x07, + 0xE0, 0x04, 0x36, 0x07, 0x90, 0x03, 0x7F, 0x00, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, + 0x6C, 0x01, 0xCC, 0x04, 0xE0, 0x04, 0x00, 0xFC, + 0x8B, 0xC2, 0xA0, 0x06, 0x50, 0xB4, 0x90, 0x03, + 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x07, 0x02, 0xFC, + 0x00, 0x80, 0x20, 0xC8, 0x8C, 0xE1, 0x04, 0xFC, + 0x41, 0xC0, 0x0F, 0x16, 0x20, 0xD8, 0x00, 0xE2, + 0x83, 0x01, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, + 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, + 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x0A, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0x0A, 0xC8, 0x6C, 0x01, + 0x20, 0xC3, 0x00, 0xFC, 0xE0, 0x04, 0x00, 0xFC, + 0x8A, 0x02, 0x43, 0x00, 0xDF, 0x13, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, + 0x20, 0x98, 0x84, 0x09, 0x1D, 0x09, 0x0A, 0x13, + 0x20, 0xC8, 0x1A, 0x09, 0x00, 0xFC, 0x0A, 0xC8, + 0x1A, 0x09, 0xA0, 0x05, 0x1C, 0x09, 0x8C, 0xC2, + 0xE5, 0x16, 0x5B, 0x04, 0x41, 0xC0, 0x10, 0x13, + 0x8A, 0xA2, 0x82, 0xCA, 0x32, 0x0C, 0x1A, 0x09, + 0x02, 0xC8, 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, + 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, + 0x09, 0x13, 0x8C, 0xC2, 0xD3, 0x16, 0x5B, 0x04, + 0x4A, 0xC0, 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, + 0x00, 0xE2, 0x1B, 0x16, 0xE0, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0xA0, 0x07, 0x64, 0x09, 0x00, 0x70, + 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0x07, 0x13, + 0x20, 0x06, 0x64, 0x09, 0xF9, 0x16, 0x0A, 0x02, + 0x00, 0x01, 0x60, 0x04, 0x8A, 0xA3, 0x60, 0x01, + 0x02, 0x0C, 0x00, 0x01, 0xE2, 0x13, 0x20, 0xD8, + 0x2F, 0x09, 0x83, 0x01, 0xA0, 0x07, 0x02, 0x0C, + 0x00, 0x80, 0x0A, 0xC8, 0x8A, 0x01, 0x0A, 0xC8, + 0x18, 0x09, 0xD7, 0x10, 0xD8, 0x04, 0x57, 0xC2, + 0x03, 0x16, 0xC8, 0xCD, 0xC8, 0xC5, 0x5B, 0x04, + 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, + 0x5B, 0x04, 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xA2, + 0x20, 0xCA, 0x00, 0xFC, 0x32, 0x0C, 0x18, 0x09, + 0x02, 0x10, 0x08, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0x57, 0xC2, 0x03, 0x16, 0xC8, 0xCD, + 0xC8, 0xC5, 0x5B, 0x04, 0xC7, 0x05, 0x17, 0xC8, + 0x6C, 0x01, 0x08, 0xC8, 0x00, 0xFC, 0xC8, 0xC5, + 0x5B, 0x04, 0x17, 0xC6, 0x02, 0x16, 0xC8, 0xC9, + 0x02, 0x00, 0xC8, 0xC5, 0x5B, 0x04, 0x17, 0xC2, + 0x08, 0xC8, 0x6C, 0x01, 0x07, 0x13, 0xE0, 0xC5, + 0x00, 0xFC, 0x08, 0xA2, 0x28, 0xC8, 0x32, 0x0C, + 0x00, 0xFC, 0x18, 0x09, 0x5B, 0x04, 0x60, 0x01, + 0x82, 0x01, 0x00, 0x20, 0x0A, 0x16, 0x60, 0xC2, + 0x84, 0x01, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x20, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x20, 0x09, 0xC8, + 0x84, 0x01, 0xC9, 0x04, 0x5B, 0x04, 0xA0, 0x06, + 0xBE, 0xB7, 0xD3, 0x04, 0xE0, 0x04, 0x02, 0x01, + 0x20, 0xE8, 0x14, 0xE0, 0x00, 0x01, 0x20, 0xC8, + 0x16, 0xE0, 0x04, 0x01, 0x05, 0x2C, 0x20, 0x48, + 0x14, 0xE0, 0x00, 0x01, 0x8C, 0x07, 0x00, 0x0A, + 0x8D, 0x07, 0xD8, 0x07, 0x8E, 0x07, 0x18, 0x00, + 0x7C, 0xCF, 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x02, + 0xD8, 0x07, 0x8F, 0x07, 0x11, 0xFF, 0x8B, 0x02, + 0x3B, 0x59, 0x21, 0x16, 0x8A, 0x02, 0x3B, 0x59, + 0x1E, 0x13, 0x8F, 0x05, 0x20, 0x20, 0x16, 0xE0, + 0x01, 0x16, 0x19, 0x10, 0x20, 0x20, 0x04, 0xE0, + 0x16, 0x16, 0x00, 0x01, 0xBF, 0x00, 0x13, 0x16, + 0x8B, 0x07, 0xC0, 0x40, 0x00, 0x01, 0x00, 0x60, + 0x10, 0x13, 0x40, 0x01, 0x00, 0x60, 0x0B, 0x16, + 0x8B, 0x07, 0xC4, 0x44, 0xA0, 0xC3, 0x02, 0x01, + 0x0E, 0x48, 0x02, 0x01, 0x4E, 0x01, 0x00, 0x10, + 0x04, 0x16, 0x8F, 0x07, 0x18, 0xFF, 0x60, 0x04, + 0x94, 0xB7, 0x0B, 0xC3, 0x4B, 0xC3, 0x20, 0x20, + 0x0A, 0xE0, 0x02, 0x16, 0x6B, 0x02, 0x20, 0x20, + 0x20, 0x20, 0x0C, 0xE0, 0x02, 0x16, 0x6C, 0x02, + 0x00, 0x20, 0x20, 0x20, 0x0E, 0xE0, 0x02, 0x16, + 0x6C, 0x02, 0x20, 0x00, 0x8F, 0x05, 0x20, 0x20, + 0x10, 0xE0, 0x07, 0x16, 0x6D, 0x02, 0x20, 0x00, + 0x20, 0x21, 0x22, 0xE0, 0xE4, 0x13, 0x04, 0xC1, + 0x02, 0x16, 0x84, 0x07, 0xFE, 0x7F, 0x8F, 0x05, + 0x20, 0x20, 0x12, 0xE0, 0x02, 0x16, 0x6D, 0x02, + 0x00, 0x20, 0x60, 0x21, 0x22, 0xE0, 0xD7, 0x13, + 0x45, 0xC1, 0x02, 0x16, 0x85, 0x07, 0xFE, 0x7F, + 0x8F, 0x05, 0x86, 0xD1, 0x0B, 0x13, 0xA0, 0x25, + 0x26, 0xE0, 0x08, 0x13, 0x8F, 0x05, 0x20, 0x26, + 0x22, 0xE0, 0x04, 0x16, 0x8F, 0x05, 0xA0, 0x26, + 0x22, 0xE0, 0x02, 0x13, 0x60, 0x04, 0x94, 0xB7, + 0x01, 0xD8, 0xEC, 0x08, 0x20, 0xD8, 0xDB, 0x07, + 0x00, 0x09, 0x02, 0xD8, 0xF6, 0x08, 0x20, 0xD8, + 0xDD, 0x07, 0xE2, 0x08, 0xE0, 0x02, 0x58, 0x07, + 0x20, 0xD8, 0xEF, 0x07, 0xF4, 0x07, 0x20, 0xD8, + 0xF1, 0x07, 0xF6, 0x07, 0x20, 0xD8, 0xF3, 0x07, + 0xF8, 0x07, 0x09, 0x02, 0x06, 0x00, 0xCB, 0x04, + 0x0F, 0x02, 0xEE, 0x07, 0x8F, 0x05, 0xCB, 0xDF, + 0x09, 0x06, 0xFC, 0x16, 0xA0, 0x06, 0xBE, 0xB7, + 0x89, 0x07, 0x5C, 0xE3, 0xE0, 0x04, 0x1A, 0x01, + 0x20, 0xC8, 0xE4, 0x07, 0x18, 0x01, 0x19, 0xC8, + 0x0C, 0x01, 0x39, 0xC8, 0x0A, 0x01, 0x39, 0xC8, + 0x12, 0x01, 0x09, 0x16, 0x79, 0xC3, 0x0F, 0x02, + 0x00, 0xE0, 0x4F, 0x63, 0x2D, 0x02, 0x00, 0x90, + 0x0D, 0xC8, 0x14, 0x01, 0x02, 0x10, 0x39, 0xC8, + 0x14, 0x01, 0xF9, 0xC3, 0x3F, 0xC8, 0x0E, 0x01, + 0x1F, 0xC8, 0x10, 0x01, 0xE0, 0x04, 0x14, 0x09, + 0xB9, 0xC2, 0x1A, 0xC8, 0x00, 0x01, 0x96, 0x06, + 0x89, 0x02, 0x84, 0xE3, 0xE0, 0x16, 0x8F, 0x07, + 0x1C, 0xFF, 0x8C, 0x07, 0x00, 0x0A, 0x8D, 0x07, + 0x84, 0xE3, 0x8E, 0x07, 0x10, 0x00, 0x7C, 0x8F, + 0x44, 0x16, 0x4E, 0x06, 0xFC, 0x16, 0xA0, 0xC3, + 0xE2, 0x07, 0xE0, 0xC3, 0xE0, 0x07, 0xCE, 0x83, + 0x01, 0x14, 0xCE, 0xC3, 0x0F, 0xC8, 0x1A, 0x01, + 0x8C, 0x07, 0x94, 0xE3, 0x8D, 0x07, 0x00, 0x0A, + 0x8E, 0x07, 0xA4, 0xE3, 0x8C, 0x63, 0x7C, 0xCF, + 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x04, 0x30, 0x09, + 0x20, 0x01, 0x42, 0x01, 0x00, 0x04, 0x02, 0x16, + 0x20, 0x07, 0x30, 0x09, 0x60, 0xC2, 0x62, 0x01, + 0xE0, 0x04, 0x62, 0x01, 0x8E, 0x07, 0x00, 0x80, + 0x8C, 0x07, 0x34, 0x09, 0x8D, 0x07, 0x06, 0x00, + 0x3E, 0xDF, 0x8E, 0x05, 0x0D, 0x06, 0xFC, 0x16, + 0xFE, 0xD3, 0xCF, 0x06, 0x8E, 0x05, 0xFE, 0xD3, + 0xCF, 0x06, 0x8C, 0x07, 0x34, 0x09, 0x09, 0xC8, + 0x62, 0x01, 0xC9, 0x04, 0x5C, 0xA3, 0x7C, 0xE2, + 0x5C, 0xA3, 0x7C, 0xE2, 0x5C, 0xA3, 0x7C, 0xE2, + 0x02, 0x13, 0xCD, 0x83, 0x09, 0x13, 0x20, 0x07, + 0x34, 0x09, 0x06, 0x10, 0x8F, 0x07, 0x19, 0xFF, + 0xCD, 0xA3, 0x0F, 0xC8, 0x04, 0x01, 0xFF, 0x10, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0xE0, 0xC3, + 0xEE, 0x07, 0xE0, 0x43, 0x06, 0xE0, 0x0F, 0xC8, + 0x00, 0x01, 0x20, 0xC0, 0x04, 0xE0, 0xE0, 0x04, + 0xFE, 0x06, 0xD3, 0x04, 0xE0, 0x04, 0x04, 0x01, + 0x60, 0x04, 0x0C, 0xB8, 0x8C, 0x07, 0x00, 0x0A, + 0x8D, 0x07, 0x18, 0x00, 0x8E, 0x07, 0x3B, 0x59, + 0x0E, 0xCF, 0x4D, 0x06, 0xFD, 0x16, 0x5B, 0x04, + 0x93, 0x01, 0x00, 0x80, 0x20, 0x04, 0xC0, 0xE2, + 0x60, 0xD0, 0x98, 0x07, 0x1C, 0x13, 0x00, 0x03, + 0x02, 0x00, 0xA0, 0xC0, 0x46, 0x07, 0x12, 0xC8, + 0x46, 0x07, 0x02, 0x16, 0x93, 0x01, 0x20, 0x00, + 0x00, 0x03, 0x0F, 0x00, 0x20, 0x04, 0xE8, 0xE2, + 0x93, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x40, + 0x00, 0x01, 0xFE, 0x00, 0x49, 0x16, 0xC4, 0xC3, + 0x25, 0x16, 0xD3, 0xC3, 0xC5, 0x43, 0x0C, 0x16, + 0xE0, 0xC3, 0x98, 0x07, 0x03, 0x11, 0xE0, 0x02, + 0x98, 0x07, 0x51, 0x04, 0xE0, 0xC3, 0x78, 0x07, + 0x0A, 0x11, 0xE0, 0x02, 0x78, 0x07, 0x51, 0x04, + 0xD3, 0x11, 0x4F, 0x01, 0x00, 0x20, 0xE4, 0x13, + 0x4F, 0x01, 0x20, 0x00, 0xD1, 0x13, 0x05, 0x2C, + 0x41, 0xA0, 0x21, 0x04, 0xC0, 0xE2, 0x8B, 0x07, + 0x0C, 0xB8, 0x00, 0x01, 0x00, 0x40, 0x0F, 0x13, + 0xDD, 0xC3, 0x4F, 0x02, 0x0F, 0x00, 0x2F, 0xE1, + 0x14, 0xE0, 0x5B, 0x04, 0xE4, 0xC3, 0xC0, 0xE1, + 0xCF, 0x73, 0x2F, 0x41, 0x14, 0xE0, 0x6F, 0xC3, + 0xEC, 0xEA, 0x8B, 0x07, 0x0C, 0xB8, 0x4B, 0xC2, + 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 0x08, 0x00, + 0xBD, 0xC0, 0xA0, 0xC3, 0xEA, 0x07, 0xE0, 0xC3, + 0xEC, 0x07, 0xA0, 0x06, 0x00, 0xBA, 0xC0, 0x01, + 0x00, 0x40, 0x02, 0xD8, 0x17, 0x01, 0x62, 0x02, + 0x80, 0xFF, 0xA0, 0x06, 0x54, 0xBA, 0x02, 0xC8, + 0x04, 0x01, 0x90, 0x03, 0x3F, 0x60, 0x59, 0x04, + 0xC0, 0xC3, 0xCF, 0x73, 0xEF, 0xC3, 0xC0, 0xE1, + 0xCF, 0x73, 0xAF, 0xC3, 0xDE, 0xEA, 0x9E, 0xC3, + 0x4E, 0x02, 0x0F, 0x00, 0x2E, 0x21, 0x14, 0xE0, + 0x08, 0x13, 0x2F, 0x40, 0x14, 0xE0, 0xCF, 0xA3, + 0x2F, 0x04, 0xF0, 0xE2, 0x40, 0x01, 0x00, 0x40, + 0xA4, 0x13, 0xC4, 0xC3, 0xC7, 0x16, 0x00, 0x01, + 0xFE, 0x00, 0xE6, 0x16, 0x9E, 0x10, 0x40, 0x01, + 0x00, 0x40, 0x05, 0x16, 0x20, 0xE0, 0x14, 0xE0, + 0x65, 0x02, 0x00, 0x58, 0x96, 0x10, 0x20, 0xD8, + 0xDE, 0x07, 0x17, 0x01, 0x8F, 0x07, 0x86, 0xFF, + 0x0F, 0xC8, 0x04, 0x01, 0xC0, 0x01, 0x00, 0x40, + 0x45, 0x02, 0xFF, 0xA7, 0x8A, 0x10, 0x20, 0xC3, + 0xFE, 0x06, 0x20, 0x27, 0x38, 0xE3, 0x07, 0x13, + 0x20, 0x23, 0x22, 0xE0, 0x1A, 0x13, 0x65, 0x02, + 0xFF, 0xDF, 0x20, 0x40, 0x14, 0xE0, 0x20, 0xE0, + 0x16, 0xE0, 0x0C, 0xC8, 0xE6, 0x08, 0x8D, 0x07, + 0xE2, 0x08, 0x58, 0x04, 0x20, 0x48, 0x08, 0xE0, + 0xFE, 0x06, 0x20, 0xC3, 0xE6, 0x08, 0x20, 0x27, + 0x38, 0xE3, 0x19, 0x16, 0x80, 0x03, 0x02, 0xC3, + 0x6C, 0xC2, 0x0A, 0x00, 0x99, 0x06, 0x60, 0x04, + 0x0C, 0xB8, 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, + 0x01, 0x00, 0x8D, 0x07, 0x06, 0x06, 0xCE, 0x04, + 0xE0, 0xC3, 0x08, 0x06, 0x01, 0x13, 0x97, 0x06, + 0x20, 0xD8, 0x07, 0x06, 0x17, 0x01, 0x8B, 0x07, + 0x82, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0xA0, 0x06, + 0xB4, 0xBE, 0x60, 0x04, 0x0C, 0xB8, 0xA0, 0xC2, + 0xEE, 0x07, 0x8C, 0x07, 0x06, 0x00, 0x8D, 0x07, + 0xEE, 0x08, 0xA0, 0xC3, 0xE6, 0x07, 0xE0, 0xC3, + 0xE8, 0x07, 0x97, 0x06, 0xA0, 0xC2, 0xF4, 0x07, + 0x8D, 0x07, 0xF4, 0x08, 0xDD, 0x04, 0x8C, 0x07, + 0x02, 0x00, 0x97, 0x06, 0x8D, 0x07, 0x00, 0x80, + 0xA0, 0xC2, 0xEE, 0x08, 0x0A, 0x88, 0x0C, 0x06, + 0x14, 0x1B, 0x82, 0x07, 0xD0, 0xB9, 0xA0, 0xC3, + 0xF0, 0x08, 0xE0, 0xC3, 0xF2, 0x08, 0x8B, 0x07, + 0x0C, 0xE3, 0x8A, 0x02, 0x14, 0x00, 0x04, 0x1A, + 0x8B, 0x07, 0xBA, 0xEA, 0x2A, 0x02, 0xEC, 0xFF, + 0x8A, 0xA2, 0xCA, 0xA2, 0xDB, 0xC2, 0x01, 0x13, + 0x9B, 0x06, 0x20, 0xC8, 0xEE, 0x08, 0xF2, 0x08, + 0x20, 0xC8, 0x20, 0xE0, 0xEE, 0x08, 0x0D, 0xC8, + 0xF0, 0x08, 0x8D, 0x07, 0xEC, 0x08, 0x20, 0xE0, + 0x18, 0xE0, 0x65, 0x02, 0x00, 0x58, 0x58, 0x04, + 0x45, 0x02, 0xFF, 0xA7, 0x80, 0x03, 0x60, 0xC0, + 0xEE, 0x05, 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, + 0x02, 0x01, 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, + 0xEE, 0x05, 0xF9, 0x16, 0x39, 0x10, 0x60, 0xD0, + 0x03, 0x01, 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, + 0x4C, 0xCC, 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, + 0xB1, 0x07, 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, + 0x00, 0x01, 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, + 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, + 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 0xEE, 0x05, + 0xF9, 0x16, 0x1E, 0x10, 0x60, 0xD0, 0x03, 0x01, + 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 0x4C, 0xCC, + 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 0xB1, 0x07, + 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 0x00, 0x01, + 0xA0, 0x03, 0x60, 0xD0, 0x03, 0x01, 0x01, 0x13, + 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 0x21, 0x02, + 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 0x06, 0x00, + 0xF7, 0x16, 0x01, 0x88, 0xEE, 0x05, 0xF9, 0x16, + 0xCD, 0x04, 0x8A, 0x07, 0x00, 0x40, 0x20, 0xC3, + 0x00, 0x01, 0x0C, 0x01, 0x00, 0x80, 0x02, 0x13, + 0x8A, 0x07, 0x00, 0x20, 0xA0, 0xC3, 0x0E, 0x01, + 0xE0, 0xC3, 0x10, 0x01, 0xB0, 0x03, 0x20, 0xC3, + 0x58, 0x07, 0x20, 0x23, 0x04, 0xE0, 0x02, 0x13, + 0x60, 0x04, 0x8E, 0xB7, 0x60, 0x04, 0x8A, 0xA3, + 0x8D, 0x07, 0x00, 0x20, 0x20, 0x20, 0x0A, 0xE0, + 0x01, 0x16, 0x5B, 0x04, 0x0D, 0x02, 0x32, 0x0C, + 0x5D, 0xC2, 0x01, 0x11, 0xDD, 0x04, 0xCD, 0x05, + 0x0D, 0x88, 0x30, 0x0C, 0xF9, 0x16, 0x60, 0xC2, + 0x0A, 0x06, 0x8D, 0x07, 0x6A, 0x09, 0xA0, 0x06, + 0xF4, 0xBE, 0x09, 0x02, 0x48, 0x00, 0xE0, 0xC3, + 0x30, 0x09, 0x03, 0x16, 0xE0, 0x01, 0x6A, 0x09, + 0x10, 0x00, 0xE0, 0xC2, 0x6A, 0x09, 0x0F, 0x02, + 0x00, 0x01, 0xC9, 0x26, 0x02, 0x13, 0x60, 0x04, + 0x86, 0xBD, 0x09, 0x02, 0x00, 0x12, 0x4B, 0x01, + 0x10, 0x00, 0x02, 0x13, 0x09, 0x02, 0x00, 0x13, + 0x09, 0xD8, 0x2E, 0x09, 0x8F, 0x07, 0x00, 0x40, + 0x89, 0x07, 0x6C, 0x09, 0xCB, 0x04, 0xF9, 0xE2, + 0xF9, 0xE2, 0xF9, 0xE2, 0x07, 0x16, 0x8B, 0x07, + 0x34, 0x09, 0x8C, 0x07, 0x6C, 0x09, 0x3B, 0xCF, + 0x3B, 0xCF, 0x1B, 0xC7, 0x20, 0xC3, 0x6C, 0x09, + 0x19, 0x11, 0x8F, 0x07, 0x00, 0x20, 0x89, 0x07, + 0x7A, 0x09, 0xA0, 0x06, 0x3A, 0xBB, 0xA0, 0x06, + 0x3A, 0xBB, 0x12, 0x10, 0x4C, 0xCE, 0x5B, 0x04, + 0x19, 0xC3, 0x02, 0x16, 0x8C, 0x07, 0x1A, 0x00, + 0x4C, 0xC3, 0x2D, 0x02, 0xF8, 0xFF, 0x0A, 0x02, + 0x09, 0x00, 0x2D, 0x02, 0xFA, 0xFF, 0xF2, 0x13, + 0x0A, 0x06, 0xFB, 0x16, 0x60, 0x04, 0x86, 0xBD, + 0x8F, 0x07, 0x00, 0x10, 0xD9, 0xC2, 0xFA, 0x11, + 0x02, 0x16, 0x8B, 0x07, 0x00, 0x04, 0x4B, 0xC3, + 0x8D, 0x02, 0x20, 0x00, 0x02, 0x14, 0x0D, 0x02, + 0x20, 0x00, 0x8D, 0x02, 0x00, 0x04, 0x02, 0x12, + 0x0D, 0x02, 0x00, 0x04, 0x2D, 0x02, 0xF8, 0xFF, + 0x0D, 0xC8, 0x2C, 0x09, 0x2B, 0x02, 0xFF, 0x03, + 0x8B, 0x01, 0xFF, 0x03, 0x4B, 0xCE, 0x60, 0xC3, + 0x6A, 0x09, 0x60, 0x23, 0x18, 0xE0, 0x0C, 0x16, + 0x49, 0xC3, 0xDD, 0xC2, 0x0F, 0x02, 0x01, 0x01, + 0x8B, 0x01, 0x80, 0xC0, 0xD7, 0x16, 0x8F, 0x05, + 0xED, 0xC2, 0x02, 0x00, 0xD3, 0x16, 0x02, 0x10, + 0x8D, 0x07, 0xBA, 0xEA, 0x3D, 0xC8, 0xA8, 0x09, + 0x1D, 0xC8, 0xAA, 0x09, 0xCB, 0x04, 0xE0, 0x04, + 0xF8, 0x05, 0xE0, 0x04, 0x66, 0x09, 0x20, 0xC8, + 0x30, 0x0C, 0x80, 0x09, 0xA0, 0x07, 0x82, 0x09, + 0xFE, 0xDF, 0x8D, 0x07, 0xFE, 0xDF, 0xE0, 0xC3, + 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x24, 0x16, + 0xE0, 0xC3, 0x30, 0x0C, 0x4F, 0x63, 0xFF, 0x04, + 0xFF, 0x04, 0x4D, 0x06, 0xFD, 0x16, 0x8D, 0x07, + 0xFE, 0xDF, 0x20, 0x04, 0xA2, 0xEA, 0xA0, 0xC3, + 0xA2, 0xEA, 0xEE, 0xC3, 0x12, 0x00, 0xAA, 0x16, + 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x8C, 0x07, + 0x00, 0xE0, 0xAC, 0x09, 0x0D, 0x63, 0x0C, 0x13, + 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x2D, 0x02, + 0x40, 0x00, 0x1D, 0x0A, 0x2D, 0x02, 0x32, 0x0C, + 0xBD, 0x07, 0xFF, 0x7F, 0x0C, 0x06, 0xFC, 0x16, + 0x20, 0xC3, 0x46, 0x04, 0x8C, 0x02, 0x80, 0x00, + 0x13, 0x1A, 0xAC, 0x02, 0x0C, 0xC8, 0x9A, 0x00, + 0xE0, 0x02, 0x80, 0x00, 0x88, 0x07, 0x80, 0x00, + 0x60, 0xC2, 0x46, 0x04, 0xA0, 0x06, 0x28, 0xAD, + 0x02, 0x10, 0x9D, 0x00, 0x05, 0x10, 0x9D, 0x00, + 0x8F, 0x07, 0x00, 0x08, 0x60, 0x04, 0x86, 0xBD, + 0x4B, 0x2D, 0x81, 0xC3, 0xC9, 0x05, 0x8F, 0x07, + 0x00, 0x10, 0x8E, 0x02, 0x02, 0x00, 0xF6, 0x11, + 0x8F, 0x07, 0x00, 0x04, 0xC9, 0x05, 0xD9, 0xC2, + 0xE0, 0x26, 0x26, 0xE0, 0x02, 0x16, 0x2B, 0x02, + 0x06, 0x00, 0x4B, 0xC6, 0x4B, 0xC3, 0xCB, 0x72, + 0x2E, 0x02, 0xFE, 0xFF, 0x8B, 0x83, 0xE6, 0x1B, + 0xCD, 0x06, 0x4D, 0x73, 0xCD, 0x82, 0xE2, 0x1B, + 0xE0, 0x04, 0x1A, 0x09, 0xE0, 0x04, 0x1C, 0x09, + 0x4D, 0xC3, 0x02, 0x13, 0x60, 0x66, 0x12, 0xE0, + 0xC9, 0x05, 0xCF, 0x04, 0x81, 0x2D, 0x01, 0xC8, + 0x6C, 0x01, 0xD4, 0x13, 0x0F, 0xC8, 0x00, 0xFC, + 0xC1, 0xC3, 0x0D, 0x06, 0xF7, 0x15, 0x0D, 0x02, + 0x36, 0x07, 0x0E, 0x02, 0x98, 0x08, 0x0C, 0x02, + 0x03, 0x00, 0x8D, 0xCB, 0x02, 0x00, 0x81, 0x2D, + 0x81, 0xCB, 0x06, 0x00, 0xC3, 0x13, 0xEE, 0x04, + 0x0C, 0x00, 0x2E, 0x02, 0x18, 0x00, 0x0C, 0x06, + 0xF4, 0x16, 0xE0, 0x04, 0x96, 0x08, 0x1F, 0x2E, + 0xB9, 0xC3, 0xD9, 0xC3, 0x89, 0x07, 0x12, 0x00, + 0x8D, 0x07, 0x3A, 0x09, 0xA0, 0x06, 0xF4, 0xBE, + 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, + 0x09, 0x16, 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, + 0x20, 0xE8, 0x18, 0xE0, 0x98, 0x07, 0x20, 0xE8, + 0x12, 0xE0, 0x78, 0x07, 0x60, 0xC3, 0x6A, 0x09, + 0x60, 0x23, 0x1E, 0xE0, 0x03, 0x16, 0x20, 0x48, + 0xA4, 0xE3, 0x6A, 0x09, 0x60, 0x23, 0x22, 0xE0, + 0x06, 0x13, 0x60, 0x27, 0xA6, 0xE3, 0x03, 0x13, + 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 0x20, 0x2D, + 0x00, 0x00, 0x8E, 0x07, 0x00, 0x00, 0xA0, 0x06, + 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 0xA0, 0xC0, + 0x04, 0x08, 0xEF, 0xC3, 0x06, 0x00, 0x1B, 0x16, + 0xA0, 0xC3, 0x72, 0x09, 0xE0, 0xC3, 0x74, 0x09, + 0xA0, 0x06, 0xC2, 0xBD, 0xA0, 0xC3, 0x76, 0x09, + 0xE0, 0xC3, 0x78, 0x09, 0xA0, 0x06, 0xE0, 0xBD, + 0x20, 0xE0, 0x0A, 0xE0, 0x60, 0xC3, 0xD8, 0x07, + 0x60, 0x23, 0x16, 0xE0, 0x05, 0x16, 0xE0, 0x04, + 0x2E, 0x06, 0x60, 0x41, 0x04, 0xE0, 0x4D, 0x2E, + 0x8D, 0x07, 0x00, 0x80, 0x52, 0x04, 0xCF, 0x73, + 0x2F, 0x02, 0x00, 0x02, 0x4F, 0xC3, 0x52, 0x04, + 0x20, 0x20, 0x0A, 0xE0, 0x03, 0x13, 0x8D, 0x07, + 0x00, 0x10, 0x5B, 0x04, 0x20, 0x40, 0x0A, 0xE0, + 0x40, 0x02, 0xFF, 0xF0, 0x8E, 0x07, 0x02, 0x00, + 0xA0, 0x06, 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, + 0xA0, 0xC0, 0x04, 0x08, 0xA0, 0x06, 0xB4, 0xBE, + 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, + 0x66, 0x16, 0x20, 0x04, 0xB6, 0xEA, 0x63, 0x10, + 0x6E, 0x02, 0x00, 0x80, 0x8D, 0x07, 0x00, 0xC0, + 0x0D, 0xC8, 0xA6, 0x01, 0x0E, 0xC8, 0x72, 0x09, + 0x0F, 0xC8, 0x74, 0x09, 0x0E, 0xC8, 0xA8, 0x01, + 0x0F, 0xC8, 0xAA, 0x01, 0x12, 0x10, 0x8F, 0x01, + 0x01, 0x00, 0x8A, 0x07, 0x76, 0x09, 0xA0, 0xE3, + 0x4E, 0x09, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, + 0xE0, 0xE3, 0x50, 0x09, 0x8F, 0xE6, 0x8A, 0x07, + 0xAC, 0x01, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, + 0x8F, 0xE6, 0x20, 0x20, 0x0A, 0xE0, 0x3F, 0x13, + 0x8D, 0x07, 0x00, 0x10, 0x5B, 0x04, 0x20, 0x20, + 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, + 0x5B, 0x04, 0x8E, 0xC3, 0x04, 0x13, 0xE0, 0x01, + 0x50, 0x09, 0x00, 0x01, 0x06, 0x10, 0xA0, 0x01, + 0x50, 0x09, 0x00, 0x01, 0xA0, 0x01, 0x78, 0x09, + 0x00, 0x01, 0xA0, 0xC3, 0x76, 0x09, 0xE0, 0xC3, + 0x78, 0x09, 0xA0, 0xE3, 0x4E, 0x09, 0xE0, 0xE3, + 0x50, 0x09, 0x0E, 0xC8, 0xAC, 0x01, 0x0F, 0xC8, + 0xAE, 0x01, 0x0E, 0xC8, 0x76, 0x09, 0x0F, 0xC8, + 0x78, 0x09, 0x19, 0x10, 0x6E, 0x02, 0x00, 0x80, + 0x0E, 0xC8, 0xA6, 0x01, 0x20, 0x20, 0x0A, 0xE0, + 0x12, 0x13, 0x0D, 0x02, 0x00, 0x10, 0x5B, 0x04, + 0x8D, 0x07, 0x28, 0x07, 0x89, 0x07, 0x0E, 0x00, + 0xA0, 0x06, 0xFA, 0xBE, 0x8D, 0x07, 0x28, 0x07, + 0xFD, 0x04, 0x8D, 0x02, 0x36, 0x07, 0xFC, 0x16, + 0x20, 0x48, 0x14, 0xE0, 0xFE, 0x06, 0x8D, 0x07, + 0x00, 0x80, 0x52, 0x04, 0xA0, 0xC2, 0xEE, 0x07, + 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 0xF0, 0x08, + 0x97, 0x06, 0x7D, 0xC2, 0x5D, 0xC3, 0x60, 0x43, + 0x22, 0xE0, 0xA0, 0x06, 0xFA, 0xBE, 0xEF, 0x10, + 0x0E, 0xC8, 0x06, 0x06, 0x0F, 0xC8, 0x08, 0x06, + 0xEA, 0x10, 0xB0, 0x03, 0xA0, 0x01, 0x60, 0x07, + 0x26, 0x00, 0x40, 0x02, 0x00, 0xC0, 0xE0, 0x04, + 0x06, 0x06, 0x8C, 0x07, 0x10, 0x40, 0xCC, 0x44, + 0xE0, 0x04, 0xFE, 0x06, 0x85, 0x07, 0x40, 0x80, + 0x5B, 0x04, 0x02, 0xC8, 0x04, 0x08, 0x8F, 0x07, + 0xFA, 0x07, 0xCE, 0xCB, 0x02, 0x00, 0x8E, 0x07, + 0x36, 0x07, 0xCE, 0xCB, 0x04, 0x00, 0x8D, 0x07, + 0x30, 0x06, 0x8E, 0x07, 0x10, 0x00, 0x4D, 0x2C, + 0x5B, 0x04, 0xA0, 0xC2, 0xF2, 0x07, 0x02, 0x10, + 0xA0, 0xC2, 0xF8, 0x07, 0x0B, 0xC8, 0xEA, 0x08, + 0x09, 0xC3, 0x0A, 0x13, 0xA0, 0x06, 0x36, 0xBA, + 0xA0, 0xC2, 0x00, 0x01, 0xA0, 0xE2, 0x06, 0xE0, + 0x4C, 0xA3, 0xCC, 0xA3, 0x01, 0x17, 0x8E, 0x05, + 0x4C, 0x62, 0xE0, 0xC2, 0xEA, 0x08, 0x5B, 0x04, + 0x8D, 0x07, 0x00, 0x10, 0x20, 0x20, 0x0A, 0xE0, + 0x01, 0x13, 0x5B, 0x04, 0x0D, 0x02, 0x48, 0x00, + 0xE0, 0xC3, 0x30, 0x09, 0x02, 0x16, 0xCE, 0x01, + 0x10, 0x00, 0x8D, 0x27, 0x03, 0x13, 0x0D, 0x02, + 0x00, 0x01, 0x52, 0x04, 0x00, 0x03, 0x02, 0x00, + 0x60, 0xC3, 0x6A, 0x09, 0x4D, 0x02, 0x08, 0x80, + 0x4E, 0x02, 0xF7, 0x7F, 0x8D, 0xE3, 0xE0, 0xC3, + 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x04, 0x13, + 0x8D, 0x07, 0x06, 0x00, 0x8D, 0x27, 0x02, 0x13, + 0xA0, 0xE3, 0x10, 0xE0, 0x0E, 0xC8, 0x6A, 0x09, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x09, 0x13, + 0x0D, 0x02, 0x00, 0x12, 0x4E, 0x01, 0x10, 0x00, + 0x02, 0x13, 0x0D, 0x02, 0x00, 0x13, 0x0D, 0xD8, + 0x2E, 0x09, 0x60, 0xC3, 0x80, 0x01, 0x4E, 0x02, + 0x01, 0x00, 0x4D, 0x02, 0xFE, 0xFF, 0x4E, 0xE3, + 0x0D, 0xC8, 0x80, 0x01, 0x20, 0xD8, 0x40, 0xE2, + 0x2F, 0x09, 0x20, 0x01, 0x6A, 0x09, 0x06, 0x00, + 0x03, 0x13, 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, + 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x03, 0x13, + 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, 0x00, 0x03, + 0x0F, 0x00, 0x60, 0x04, 0x88, 0xBE, 0x20, 0x20, + 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, + 0x5B, 0x04, 0x09, 0x02, 0x08, 0x00, 0x0D, 0x02, + 0x58, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 0xA0, 0x07, + 0x02, 0x02, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x04, + 0xE0, 0xC3, 0x58, 0x09, 0x0F, 0x01, 0x00, 0x7C, + 0x01, 0x13, 0x52, 0x04, 0x8F, 0xC3, 0x4E, 0x02, + 0x0F, 0x00, 0xFB, 0x13, 0x8E, 0x02, 0x0F, 0x00, + 0xF8, 0x13, 0x0D, 0x02, 0x00, 0x40, 0x4F, 0xC2, + 0x49, 0x09, 0x49, 0x02, 0x3F, 0x00, 0x09, 0x01, + 0x01, 0x00, 0xEF, 0x16, 0x89, 0x02, 0x06, 0x00, + 0xEC, 0x1A, 0x89, 0x02, 0x20, 0x00, 0xE9, 0x14, + 0xC9, 0x06, 0x1F, 0x09, 0x4F, 0x02, 0x00, 0x40, + 0x4F, 0xE2, 0x69, 0x02, 0x00, 0x80, 0x09, 0xC8, + 0x58, 0x09, 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, + 0x1F, 0x09, 0x09, 0x06, 0xFD, 0x16, 0x4F, 0x05, + 0x0D, 0x02, 0x00, 0x20, 0x60, 0xC2, 0x5A, 0x09, + 0xD4, 0x13, 0x4F, 0x26, 0xD2, 0x16, 0x0D, 0x02, + 0x00, 0x10, 0x60, 0xC2, 0x5C, 0x09, 0xCD, 0x13, + 0x4F, 0x26, 0xCB, 0x16, 0x0D, 0x02, 0x00, 0x30, + 0x20, 0x88, 0x5A, 0x09, 0x5C, 0x09, 0xC5, 0x13, + 0xE0, 0xC3, 0x5A, 0x09, 0x4E, 0xC2, 0x1F, 0x0A, + 0x09, 0x06, 0xFD, 0x16, 0xE0, 0xE3, 0x5E, 0x09, + 0x0F, 0xC8, 0x5A, 0x09, 0xE0, 0xC3, 0x5C, 0x09, + 0x4E, 0xC2, 0x1F, 0x0A, 0x09, 0x06, 0xFD, 0x16, + 0xE0, 0xE3, 0x5E, 0x09, 0x0F, 0xC8, 0x5C, 0x09, + 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 0x1F, 0x0A, + 0x09, 0x06, 0xFD, 0x16, 0x0D, 0x02, 0x00, 0x08, + 0x60, 0xC2, 0x5E, 0x09, 0x4F, 0x26, 0xA5, 0x16, + 0x4F, 0x05, 0x0F, 0xC8, 0x5E, 0x09, 0x0F, 0x02, + 0x02, 0x02, 0x0E, 0x02, 0x03, 0x00, 0x60, 0xC3, + 0x40, 0x01, 0x0C, 0x02, 0xFE, 0xC0, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x04, 0xCF, 0x05, 0x09, 0x02, + 0x55, 0x55, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, + 0x09, 0x07, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, + 0x0E, 0x06, 0xF4, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x09, 0x02, + 0x08, 0x00, 0x0E, 0x02, 0x58, 0x09, 0x0F, 0x02, + 0x02, 0x02, 0xFE, 0xCF, 0x49, 0x06, 0xFD, 0x16, + 0x60, 0x04, 0x88, 0xBE, 0xC9, 0xC7, 0x5F, 0x82, + 0x01, 0x16, 0x5B, 0x04, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x0D, 0x02, + 0x00, 0x01, 0x52, 0x04, 0x8D, 0x07, 0x00, 0x10, + 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, + 0x00, 0x08, 0x20, 0x20, 0x10, 0xE0, 0x05, 0x13, + 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x10, 0xE0, + 0x20, 0x07, 0x9C, 0x08, 0x20, 0x07, 0xB4, 0x08, + 0x20, 0x07, 0xCC, 0x08, 0xA0, 0x07, 0xA2, 0x08, + 0x84, 0x02, 0xA0, 0x07, 0xBA, 0x08, 0x84, 0x02, + 0xA0, 0x07, 0xD2, 0x08, 0x84, 0x02, 0xA0, 0x07, + 0x04, 0x09, 0x00, 0x40, 0xE0, 0x04, 0x06, 0x09, + 0xE0, 0x04, 0x08, 0x09, 0x0E, 0xC8, 0x4C, 0x08, + 0x0F, 0xC8, 0x4E, 0x08, 0x0E, 0xC8, 0x8E, 0x08, + 0x0F, 0xC8, 0x90, 0x08, 0xE0, 0x04, 0x5A, 0x08, + 0xE0, 0x04, 0x60, 0x08, 0xE0, 0x02, 0x78, 0x07, + 0xE0, 0x04, 0x94, 0x08, 0x20, 0x40, 0x40, 0xE3, + 0x20, 0xE0, 0x0C, 0xE0, 0x60, 0x04, 0xBC, 0xC6, + 0x80, 0x01, 0x00, 0xF0, 0xC0, 0x01, 0x00, 0x40, + 0x10, 0x10, 0x80, 0x01, 0x00, 0xF0, 0x0D, 0x10, + 0xC0, 0x01, 0x00, 0xF0, 0x20, 0x40, 0x06, 0xE0, + 0x08, 0x10, 0xC0, 0x01, 0x00, 0xF0, 0x80, 0x01, + 0x00, 0x20, 0xE0, 0xC3, 0x94, 0x08, 0x01, 0x16, + 0x5B, 0x04, 0x4B, 0xC0, 0x20, 0x04, 0xDA, 0xEA, + 0x40, 0x01, 0x00, 0x20, 0xFB, 0x16, 0x51, 0x04, + 0xA0, 0xC2, 0xD8, 0x07, 0x4A, 0x01, 0x40, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0xE0, 0x02, 0x78, 0x07, + 0x20, 0x20, 0x0C, 0xE0, 0xEF, 0x16, 0x43, 0xC2, + 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 0x20, 0x2F, + 0x36, 0x07, 0x20, 0x40, 0x0C, 0xE0, 0xA0, 0x06, + 0xAC, 0xC1, 0xA0, 0xC3, 0x94, 0x08, 0xFB, 0x16, + 0xA0, 0x06, 0x3A, 0xC2, 0x8E, 0x07, 0x04, 0x09, + 0x9E, 0x07, 0x00, 0x80, 0x20, 0x20, 0x10, 0xE0, + 0x05, 0x16, 0x8F, 0x07, 0x4C, 0x08, 0xBF, 0xCF, + 0xBF, 0xCF, 0x9F, 0xC7, 0xA0, 0x06, 0x5A, 0xC2, + 0x20, 0xE8, 0x3C, 0xE3, 0x62, 0x07, 0xA0, 0x06, + 0x3A, 0xC2, 0x20, 0x48, 0x3C, 0xE3, 0x62, 0x07, + 0x20, 0x40, 0x40, 0xE3, 0x20, 0xE0, 0x04, 0xE0, + 0x20, 0x48, 0x10, 0xE0, 0x58, 0x07, 0x5B, 0x04, + 0x80, 0x01, 0x00, 0xF0, 0x20, 0xE0, 0x04, 0xE0, + 0x60, 0x01, 0x60, 0x07, 0x02, 0x00, 0x02, 0x13, + 0x9B, 0x06, 0xB8, 0x10, 0x20, 0xE8, 0x1E, 0xE0, + 0x58, 0x07, 0xB4, 0x10, 0x9B, 0x06, 0x80, 0x03, + 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 0x00, 0x40, + 0x07, 0x16, 0x8D, 0x07, 0x00, 0x09, 0xA0, 0x06, + 0x68, 0xB8, 0xE0, 0x02, 0x78, 0x07, 0x5B, 0x04, + 0xC4, 0x01, 0x02, 0x00, 0xE0, 0x02, 0x78, 0x07, + 0x5B, 0x04, 0x0E, 0x68, 0x96, 0x08, 0xE9, 0x04, + 0x0C, 0x00, 0x11, 0x10, 0x0E, 0x02, 0x00, 0x23, + 0x4E, 0xDB, 0x01, 0x00, 0xCC, 0x01, 0x00, 0x04, + 0x4C, 0xD7, 0x1C, 0x10, 0x60, 0xC2, 0x5C, 0x07, + 0x20, 0x06, 0x94, 0x08, 0xA9, 0xC2, 0x08, 0x00, + 0xA9, 0xC3, 0x0C, 0x00, 0xEA, 0x16, 0x29, 0x07, + 0x04, 0x00, 0x69, 0x01, 0x0A, 0x00, 0x01, 0x00, + 0x2D, 0x13, 0x49, 0xC3, 0x2D, 0x02, 0x0E, 0x00, + 0x0A, 0xC3, 0x1D, 0xD3, 0x8C, 0x01, 0x00, 0x84, + 0xCC, 0x01, 0x00, 0x40, 0x0A, 0x01, 0x00, 0x5E, + 0xDD, 0x16, 0x4C, 0xC7, 0xA9, 0xC3, 0x10, 0x00, + 0xE9, 0xC3, 0x12, 0x00, 0x41, 0xCA, 0x10, 0x00, + 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 0x8E, 0x05, + 0x8C, 0x07, 0x02, 0x00, 0xA0, 0xC2, 0xF6, 0x07, + 0xA0, 0x06, 0x00, 0xBA, 0x69, 0xC0, 0x10, 0x00, + 0x29, 0xC8, 0x14, 0x00, 0x06, 0x09, 0x29, 0xC8, + 0x16, 0x00, 0x08, 0x09, 0x69, 0x01, 0x0E, 0x00, + 0x00, 0x08, 0x04, 0x16, 0x90, 0x03, 0x7F, 0x00, + 0xA0, 0x06, 0x5A, 0xC2, 0x40, 0x01, 0x00, 0x40, + 0x01, 0x16, 0x51, 0x04, 0x60, 0x04, 0xBE, 0xC1, + 0xA9, 0xC3, 0x0C, 0x00, 0x0B, 0x13, 0x0E, 0x68, + 0x96, 0x08, 0xE9, 0x04, 0x0C, 0x00, 0x29, 0xC8, + 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC3, 0x00, 0xFC, + 0x01, 0x13, 0x1E, 0x2E, 0x29, 0x07, 0x04, 0x00, + 0x5B, 0x04, 0x81, 0x07, 0x20, 0x20, 0x89, 0x07, + 0x4C, 0x08, 0x41, 0xCE, 0x63, 0xCE, 0x10, 0x00, + 0x63, 0xC6, 0x12, 0x00, 0xA0, 0x06, 0x54, 0xBA, + 0x43, 0xC2, 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, + 0x20, 0xE0, 0x10, 0xE0, 0x60, 0x04, 0xEC, 0xC1, + 0x40, 0x01, 0x00, 0x04, 0xEA, 0x16, 0xA0, 0x06, + 0xAC, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 0x8C, 0x07, + 0x04, 0x00, 0x8D, 0x07, 0x4C, 0x08, 0xA0, 0xC3, + 0x8E, 0x08, 0xE0, 0xC3, 0x90, 0x08, 0xA0, 0x06, + 0x36, 0xBA, 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, + 0x01, 0x00, 0x13, 0x16, 0xE0, 0xC2, 0x94, 0x08, + 0xEA, 0x16, 0x60, 0x04, 0xEC, 0xC1, 0xE0, 0xC3, + 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 0x09, 0x16, + 0x60, 0x04, 0xEC, 0xC1, 0xA0, 0x06, 0x54, 0xBA, + 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, + 0xD7, 0x13, 0xA0, 0xC2, 0xF0, 0x07, 0x20, 0xC3, + 0x7C, 0x09, 0x8D, 0x07, 0x4C, 0x08, 0x9D, 0xC3, + 0xA0, 0x06, 0x36, 0xBA, 0xC0, 0x06, 0x20, 0xD0, + 0x50, 0x08, 0xC0, 0x06, 0x40, 0x01, 0x00, 0x04, + 0x0A, 0x16, 0x40, 0x01, 0x80, 0x00, 0x07, 0x13, + 0x0E, 0xC8, 0x4C, 0x08, 0x0F, 0xC8, 0x4E, 0x08, + 0xA0, 0x06, 0xA2, 0xC1, 0xD8, 0x10, 0x0E, 0xC8, + 0x8E, 0x08, 0x0F, 0xC8, 0x90, 0x08, 0x40, 0x01, + 0x00, 0x04, 0x0C, 0x13, 0x40, 0x01, 0x20, 0x00, + 0x58, 0x16, 0x81, 0x07, 0x10, 0x20, 0x9F, 0x10, + 0xA0, 0x06, 0xAC, 0xC1, 0xA0, 0xC3, 0x8E, 0x08, + 0xE0, 0xC3, 0x90, 0x08, 0x83, 0x07, 0x98, 0x08, + 0x63, 0x07, 0x04, 0x00, 0x2D, 0x11, 0x83, 0x07, + 0xB0, 0x08, 0x63, 0x07, 0x04, 0x00, 0x28, 0x11, + 0x83, 0x07, 0xC8, 0x08, 0x63, 0x07, 0x04, 0x00, + 0x23, 0x11, 0xC3, 0x60, 0x60, 0xC2, 0x46, 0x07, + 0xE7, 0x13, 0x69, 0x01, 0x0E, 0x00, 0x00, 0x08, + 0xE3, 0x13, 0x00, 0x03, 0x02, 0x00, 0x19, 0xC8, + 0x46, 0x07, 0x03, 0x16, 0xA0, 0x01, 0x3A, 0x07, + 0x20, 0x00, 0x00, 0x03, 0x0F, 0x00, 0xC0, 0x01, + 0x00, 0xF0, 0x80, 0x01, 0x00, 0x20, 0x01, 0x02, + 0x06, 0xC4, 0x60, 0x04, 0x9A, 0xC2, 0x81, 0x07, + 0x80, 0x20, 0xE0, 0xC8, 0x8E, 0x08, 0x14, 0x00, + 0xE0, 0xC8, 0x90, 0x08, 0x16, 0x00, 0xC7, 0x10, + 0xE0, 0xC8, 0x50, 0x08, 0x0E, 0x00, 0xCE, 0xC8, + 0x10, 0x00, 0xCF, 0xC8, 0x12, 0x00, 0x40, 0x01, + 0x20, 0x00, 0xBB, 0x16, 0xE3, 0xC1, 0x06, 0x00, + 0xC7, 0xC8, 0x08, 0x00, 0x07, 0xC8, 0x6C, 0x01, + 0x07, 0xC8, 0xE0, 0x08, 0x08, 0x02, 0x02, 0xFC, + 0xB8, 0x07, 0x00, 0x81, 0xE0, 0xC1, 0xE8, 0x00, + 0x07, 0xCE, 0x20, 0xC8, 0x52, 0x08, 0x92, 0x08, + 0xDA, 0x13, 0xCE, 0xC8, 0x14, 0x00, 0xCF, 0xC8, + 0x16, 0x00, 0x80, 0x01, 0x00, 0x04, 0x82, 0x07, + 0x54, 0x08, 0x32, 0xC1, 0x08, 0x11, 0x72, 0xC1, + 0x92, 0xC1, 0x82, 0x07, 0x8A, 0x08, 0x04, 0xC1, + 0x07, 0x16, 0x60, 0x04, 0x8E, 0xC5, 0x72, 0xC1, + 0xB2, 0xC1, 0x84, 0x01, 0x00, 0x80, 0xF9, 0x13, + 0x04, 0x68, 0x92, 0x08, 0xC7, 0xC1, 0x37, 0x16, + 0x20, 0x98, 0x97, 0x08, 0x85, 0x09, 0x16, 0x16, + 0x81, 0x07, 0x40, 0x20, 0xE0, 0xC1, 0x94, 0x08, + 0x57, 0x13, 0xA0, 0x06, 0xAC, 0xC1, 0xF4, 0x10, + 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 0x62, 0x07, + 0xE0, 0x26, 0x3A, 0xE3, 0x02, 0x13, 0xA0, 0x06, + 0x92, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 0x22, 0x10, + 0xA0, 0x06, 0x9C, 0xC1, 0x81, 0x2D, 0x01, 0xC2, + 0xFB, 0x13, 0xA0, 0x05, 0x96, 0x08, 0x23, 0xC8, + 0x08, 0x00, 0x6C, 0x01, 0xA0, 0x07, 0x02, 0xFC, + 0x00, 0x80, 0xC3, 0xC1, 0x27, 0x02, 0x06, 0x00, + 0xA0, 0x06, 0x0C, 0xB5, 0xA3, 0x05, 0x0C, 0x00, + 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xC8, 0xE0, 0x08, + 0x08, 0x02, 0x02, 0xFC, 0xB8, 0x07, 0x00, 0x81, + 0xF8, 0xC1, 0x04, 0xC1, 0x37, 0x13, 0xE0, 0xD2, + 0x03, 0x01, 0xD2, 0x13, 0x0B, 0x02, 0x0A, 0x01, + 0xC4, 0xCE, 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, + 0xFB, 0x04, 0x09, 0x02, 0x00, 0x04, 0x48, 0xA2, + 0xC9, 0xC6, 0x20, 0xA8, 0xE0, 0x08, 0x12, 0x01, + 0x20, 0xC8, 0xF2, 0x07, 0x00, 0x01, 0x47, 0xC2, + 0xC4, 0x81, 0x01, 0x14, 0x44, 0xC2, 0xC9, 0x61, + 0x09, 0xA2, 0x89, 0xA1, 0x01, 0x17, 0x85, 0x05, + 0x09, 0x61, 0xA8, 0x16, 0x82, 0x02, 0x8A, 0x08, + 0x05, 0x16, 0x40, 0x01, 0x10, 0x00, 0x12, 0x13, + 0x60, 0x04, 0xA6, 0xC3, 0x60, 0x04, 0xBC, 0xC4, + 0x60, 0x04, 0x40, 0xC3, 0x81, 0x07, 0x80, 0x20, + 0xFB, 0x10, 0x81, 0x07, 0x80, 0x20, 0xF8, 0x10, + 0x81, 0x07, 0x02, 0x20, 0xF5, 0x10, 0x81, 0x07, + 0x04, 0x20, 0xF2, 0x10, 0x23, 0xC8, 0x08, 0x00, + 0x6C, 0x01, 0x07, 0x05, 0xE0, 0xA1, 0xE8, 0x00, + 0x0C, 0x02, 0x04, 0xFC, 0x07, 0xCF, 0xE0, 0xC2, + 0x92, 0x08, 0xE8, 0x16, 0xE0, 0xD2, 0x03, 0x01, + 0x10, 0x16, 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, + 0x62, 0x07, 0xE0, 0x26, 0x3A, 0xE3, 0x07, 0x13, + 0x90, 0x03, 0xC8, 0x2F, 0xA0, 0x06, 0x92, 0xC1, + 0xE0, 0xD2, 0x03, 0x01, 0x02, 0x16, 0xA0, 0x06, + 0x54, 0xBA, 0x23, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA3, 0xC2, 0x0E, 0x00, 0x4A, 0x01, 0x00, 0x01, + 0x0B, 0x13, 0x0C, 0x02, 0x0E, 0xFC, 0x5C, 0xC2, + 0x49, 0x02, 0x00, 0x80, 0x0D, 0x02, 0x6C, 0x09, + 0x7D, 0xE2, 0x09, 0xCF, 0x3D, 0xCF, 0x3D, 0xCF, + 0x0C, 0x02, 0x00, 0xFC, 0x6C, 0xC3, 0x06, 0x00, + 0x4D, 0x02, 0xFF, 0xE0, 0x4A, 0x02, 0x00, 0x02, + 0x8A, 0xA2, 0x8A, 0xA2, 0x4A, 0xE3, 0x60, 0xE3, + 0x9E, 0x09, 0x0D, 0xCB, 0x06, 0x00, 0xCD, 0x06, + 0x0B, 0x02, 0x0F, 0x00, 0xEC, 0x82, 0x04, 0x00, + 0xAD, 0x11, 0xEC, 0xC3, 0x0E, 0x00, 0x11, 0x15, + 0x10, 0x13, 0x6C, 0xC2, 0x14, 0x00, 0x49, 0x02, + 0x00, 0x1F, 0xA7, 0x13, 0xC9, 0x06, 0x89, 0x02, + 0x12, 0x00, 0xA3, 0x1B, 0x49, 0x01, 0x01, 0x00, + 0xA0, 0x13, 0xC9, 0xA2, 0xEC, 0x82, 0x04, 0x00, + 0x9C, 0x11, 0x4D, 0xA3, 0x9D, 0x18, 0x14, 0x11, + 0x60, 0x01, 0x6A, 0x09, 0x00, 0x80, 0x18, 0x13, + 0x1D, 0x09, 0xCC, 0xA2, 0xEB, 0xC2, 0x08, 0x00, + 0x7B, 0x09, 0x4B, 0x02, 0x1E, 0x00, 0xA0, 0xC3, + 0xF0, 0x06, 0xAB, 0x23, 0x04, 0xE0, 0x8F, 0x16, + 0x60, 0x27, 0x3E, 0xE3, 0x8C, 0x16, 0x4D, 0xA3, + 0x4D, 0xA3, 0x4D, 0xA3, 0xCD, 0x06, 0x4D, 0x02, + 0x07, 0x00, 0x0D, 0x88, 0xEE, 0x06, 0x0A, 0x15, + 0x90, 0x03, 0xFF, 0x6F, 0x53, 0x2F, 0xA0, 0x05, + 0x94, 0x08, 0xC3, 0x04, 0xC0, 0x01, 0x00, 0x04, + 0x60, 0x04, 0xAA, 0xC3, 0x60, 0x01, 0x6A, 0x09, + 0x00, 0x80, 0xF2, 0x13, 0x01, 0x02, 0x08, 0x20, + 0x60, 0x04, 0xA2, 0xC5, 0x8D, 0x07, 0x00, 0x10, + 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, + 0x00, 0x08, 0x20, 0x20, 0x0E, 0xE0, 0x05, 0x13, + 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x0E, 0xE0, + 0xA0, 0x07, 0xFA, 0x08, 0x00, 0x80, 0x0E, 0xC8, + 0xFA, 0x07, 0x0F, 0xC8, 0xFC, 0x07, 0x0E, 0xC8, + 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xE0, 0x04, + 0x08, 0x08, 0xE0, 0x04, 0x0E, 0x08, 0xE0, 0x02, + 0x98, 0x07, 0x20, 0x40, 0x4C, 0xE3, 0x20, 0x07, + 0x2E, 0x06, 0x60, 0x04, 0x12, 0xCA, 0x00, 0x70, + 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 0x0B, 0x10, + 0x20, 0xF0, 0x4B, 0xE3, 0x02, 0x10, 0x20, 0xF0, + 0x4A, 0xE3, 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, + 0xE0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x20, 0xE8, + 0x46, 0xE3, 0x62, 0x07, 0x20, 0x04, 0xDA, 0xEA, + 0x40, 0x01, 0x00, 0x20, 0x04, 0x13, 0xFA, 0x10, + 0x40, 0x01, 0x00, 0x40, 0xF7, 0x16, 0x20, 0x07, + 0x2E, 0x06, 0x20, 0x50, 0x50, 0xE3, 0x51, 0x04, + 0xF1, 0x10, 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, + 0x00, 0x40, 0x07, 0x16, 0x8D, 0x07, 0xF6, 0x08, + 0xA0, 0x06, 0x68, 0xB8, 0xE0, 0x02, 0x98, 0x07, + 0x5B, 0x04, 0xC4, 0x01, 0x04, 0x00, 0xE0, 0x02, + 0x98, 0x07, 0x5B, 0x04, 0x60, 0x01, 0x60, 0x07, + 0x04, 0x00, 0x06, 0x16, 0x20, 0xE8, 0x1C, 0xE0, + 0x58, 0x07, 0x80, 0x03, 0xE0, 0x02, 0x98, 0x07, + 0x20, 0xD8, 0xDC, 0x07, 0x17, 0x01, 0x8F, 0x07, + 0x8E, 0xFF, 0x0F, 0xC8, 0x04, 0x01, 0x20, 0xE8, + 0x06, 0xE0, 0x58, 0x07, 0x80, 0x01, 0x00, 0x80, + 0x5B, 0x04, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, + 0x03, 0x13, 0xDB, 0x2D, 0x03, 0xC8, 0x4A, 0x08, + 0x49, 0x01, 0x00, 0x01, 0x02, 0x16, 0x60, 0x04, + 0x52, 0xC9, 0xE0, 0xC0, 0xF8, 0x05, 0xFD, 0x13, + 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, + 0xF8, 0x05, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, + 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x49, 0x01, + 0x00, 0x01, 0x4D, 0x16, 0x09, 0x01, 0x00, 0x5E, + 0x29, 0x16, 0x49, 0x01, 0x02, 0x00, 0x0B, 0x16, + 0x60, 0x01, 0x46, 0x08, 0x00, 0x02, 0x0A, 0x16, + 0x27, 0x02, 0x04, 0x00, 0x07, 0x88, 0x7E, 0x09, + 0x05, 0x12, 0x27, 0x02, 0xFC, 0xFF, 0xA0, 0x01, + 0x46, 0x08, 0x00, 0x02, 0xC7, 0xC1, 0x37, 0x15, + 0xD3, 0x2D, 0xE0, 0xC0, 0x4A, 0x08, 0x07, 0xA8, + 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 0x0C, 0x15, + 0x20, 0xC8, 0x3C, 0x08, 0xFA, 0x07, 0x20, 0xC8, + 0x3E, 0x08, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, + 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, + 0x60, 0x04, 0x52, 0xC9, 0xA0, 0x06, 0x54, 0xBA, + 0xD3, 0x2D, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, + 0x01, 0x13, 0xDB, 0x2D, 0x20, 0x88, 0x3E, 0x08, + 0x3A, 0x08, 0x0D, 0x16, 0x20, 0x88, 0x3C, 0x08, + 0x38, 0x08, 0x09, 0x16, 0xE0, 0x04, 0x44, 0x08, + 0x82, 0x07, 0x02, 0x08, 0x04, 0x61, 0xE0, 0x04, + 0x48, 0x08, 0x60, 0x04, 0x1E, 0xCA, 0x20, 0xC8, + 0x38, 0x08, 0xFA, 0x07, 0x20, 0xC8, 0x3A, 0x08, + 0xFC, 0x07, 0x60, 0x04, 0x12, 0xCA, 0x07, 0xA8, + 0x48, 0x08, 0x04, 0xC1, 0x1B, 0x16, 0x82, 0x02, + 0x38, 0x08, 0x0A, 0x16, 0x60, 0x01, 0xFC, 0x07, + 0x01, 0x00, 0x02, 0x16, 0xA0, 0x06, 0x6E, 0xCB, + 0xA0, 0x06, 0xFC, 0xCA, 0x80, 0x01, 0x10, 0x00, + 0x32, 0xC1, 0x07, 0x11, 0x72, 0xC1, 0x92, 0xC1, + 0x82, 0x07, 0x38, 0x08, 0x04, 0xC1, 0x06, 0x16, + 0xEA, 0x10, 0x72, 0xC1, 0xB2, 0xC1, 0x84, 0x01, + 0x00, 0x80, 0xE5, 0x13, 0xE0, 0xD2, 0x03, 0x01, + 0x34, 0x13, 0x0B, 0x02, 0x0A, 0x01, 0xC4, 0xCE, + 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 0xFB, 0x04, + 0xC8, 0xC6, 0x03, 0xA8, 0x12, 0x01, 0x20, 0xC8, + 0xF8, 0x07, 0x00, 0x01, 0xC7, 0xC2, 0xC4, 0x81, + 0x01, 0x14, 0xC4, 0xC2, 0x0B, 0xA8, 0x44, 0x08, + 0x0B, 0x61, 0x0B, 0xA2, 0x8B, 0xA1, 0x01, 0x17, + 0x85, 0x05, 0xCB, 0x61, 0xC6, 0x16, 0x40, 0x01, + 0x40, 0x00, 0x15, 0x16, 0x87, 0x07, 0x20, 0x00, + 0xE0, 0x61, 0x44, 0x08, 0xC4, 0x81, 0x08, 0x1A, + 0x07, 0xA8, 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, + 0x07, 0x61, 0x87, 0xA1, 0x01, 0x17, 0x85, 0x05, + 0x80, 0x01, 0x40, 0x00, 0x03, 0xC8, 0x6C, 0x01, + 0xE0, 0xC1, 0x04, 0xFC, 0xAC, 0x10, 0x60, 0x04, + 0xBC, 0xC7, 0x20, 0x01, 0x3A, 0x07, 0x00, 0x70, + 0x04, 0x13, 0xA0, 0x06, 0x28, 0xC7, 0x20, 0x07, + 0x2E, 0x06, 0xA0, 0x06, 0x54, 0xBA, 0xC1, 0x10, + 0xE0, 0xD2, 0x03, 0x01, 0x0A, 0x16, 0x20, 0x01, + 0x3A, 0x07, 0x00, 0x70, 0x04, 0x13, 0xA0, 0x06, + 0x28, 0xC7, 0x20, 0x07, 0x2E, 0x06, 0xA0, 0x06, + 0x54, 0xBA, 0x90, 0x03, 0xBF, 0x4F, 0xD3, 0x2D, + 0x60, 0x01, 0xFC, 0x07, 0x01, 0x00, 0x02, 0x16, + 0xA0, 0x06, 0x6E, 0xCB, 0x60, 0xD2, 0x46, 0x08, + 0x89, 0x01, 0x00, 0xF1, 0xC9, 0x01, 0x00, 0x70, + 0x40, 0x01, 0x10, 0x00, 0x1C, 0x13, 0x20, 0x88, + 0x3E, 0x08, 0x3A, 0x08, 0x04, 0x16, 0x20, 0x88, + 0x3C, 0x08, 0x38, 0x08, 0x14, 0x13, 0x89, 0x01, + 0x00, 0x10, 0x8D, 0x07, 0x44, 0x08, 0x9D, 0x07, + 0x00, 0x50, 0xA0, 0xC2, 0xF6, 0x07, 0x8C, 0x07, + 0x02, 0x00, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, + 0x3E, 0x08, 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, + 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x8D, 0x07, + 0x46, 0x08, 0x49, 0xC7, 0xA0, 0xC2, 0xF6, 0x07, + 0x8C, 0x07, 0x04, 0x00, 0xA0, 0xC3, 0x38, 0x08, + 0xE0, 0xC3, 0x3A, 0x08, 0xCC, 0xA3, 0x01, 0x17, + 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x20, 0xC8, + 0x3C, 0x08, 0xFC, 0x08, 0x20, 0xC8, 0x3E, 0x08, + 0xFE, 0x08, 0x09, 0x01, 0x00, 0x0C, 0x0C, 0x13, + 0x49, 0x01, 0x00, 0x04, 0x05, 0x16, 0xA0, 0x06, + 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0x04, 0x10, + 0x90, 0x03, 0x7F, 0x40, 0xA0, 0x06, 0x6C, 0xC7, + 0xC0, 0x01, 0x90, 0x00, 0xA0, 0x06, 0xFC, 0xCA, + 0x0B, 0xC8, 0x46, 0x08, 0xE0, 0xC2, 0x42, 0x07, + 0x2D, 0x13, 0xE0, 0xC2, 0x2E, 0x06, 0x2A, 0x13, + 0xE0, 0x02, 0x58, 0x07, 0x8F, 0x07, 0xBF, 0xFF, + 0x0F, 0x2C, 0xE0, 0x02, 0x98, 0x07, 0xE0, 0xC0, + 0x5C, 0x07, 0x03, 0xC8, 0x4A, 0x08, 0x03, 0xC8, + 0x6C, 0x01, 0xC3, 0xC2, 0xCB, 0xA2, 0xEB, 0xC2, + 0x32, 0x0C, 0x32, 0x13, 0x0B, 0xC8, 0x00, 0xFC, + 0x0B, 0xC3, 0x4B, 0xC3, 0x0B, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x00, 0xFC, 0xFA, 0x16, 0x00, 0x03, + 0x02, 0x00, 0x20, 0xC8, 0xF8, 0x05, 0x00, 0xFC, + 0x02, 0x16, 0x0D, 0xC8, 0xFA, 0x05, 0x0C, 0xC8, + 0xF8, 0x05, 0x00, 0x03, 0x0F, 0x00, 0x03, 0xC8, + 0x6C, 0x01, 0x1A, 0x10, 0xA0, 0xC3, 0x2E, 0x06, + 0x03, 0x13, 0xE0, 0xC0, 0xF8, 0x05, 0x0D, 0x16, + 0x4F, 0x2E, 0xC0, 0x01, 0x00, 0x80, 0xA0, 0x01, + 0x62, 0x07, 0x00, 0x80, 0x8E, 0xC3, 0x03, 0x13, + 0xA0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x60, 0x04, + 0x4E, 0xC7, 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, + 0x00, 0xFC, 0xF8, 0x05, 0x03, 0xC8, 0x4A, 0x08, + 0x60, 0x01, 0x6A, 0x09, 0x00, 0x04, 0x02, 0x13, + 0x60, 0x04, 0xE4, 0xC7, 0x8C, 0x07, 0x0E, 0x00, + 0x20, 0xC2, 0x0E, 0xFC, 0x0A, 0x15, 0x09, 0x13, + 0x20, 0xC2, 0x14, 0xFC, 0x48, 0x02, 0x00, 0x1F, + 0xC8, 0x06, 0x88, 0x02, 0x12, 0x00, 0xF0, 0x1B, + 0x08, 0xA3, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, + 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x07, 0x83, + 0xE7, 0x1A, 0xCC, 0x61, 0x07, 0xC8, 0x04, 0xFC, + 0xCC, 0xC1, 0xC0, 0x01, 0x40, 0x00, 0x60, 0x04, + 0xF0, 0xC7, 0x4B, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, + 0x20, 0xC3, 0x7A, 0x09, 0x8D, 0x07, 0xFA, 0x07, + 0x9D, 0xC3, 0xE0, 0xC3, 0xFC, 0x07, 0xA0, 0x06, + 0x00, 0xBA, 0x20, 0xC8, 0x3C, 0x08, 0x40, 0x08, + 0x20, 0xC8, 0x3E, 0x08, 0x42, 0x08, 0x0E, 0xC8, + 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xC4, 0x04, + 0x82, 0x07, 0x02, 0x08, 0xE0, 0x04, 0x44, 0x08, + 0x40, 0x01, 0x80, 0x00, 0x06, 0x16, 0x0E, 0xC8, + 0x38, 0x08, 0x0F, 0xC8, 0x3A, 0x08, 0xE0, 0x04, + 0x48, 0x08, 0xA0, 0x06, 0x54, 0xBA, 0xE0, 0xC2, + 0xFE, 0x07, 0x0D, 0x11, 0x0E, 0xC8, 0xFA, 0x07, + 0x0F, 0xC8, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, + 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, + 0xA0, 0x06, 0x32, 0xC7, 0xCB, 0x10, 0x80, 0x01, + 0x80, 0x00, 0x55, 0x04, 0x8B, 0xC0, 0xA0, 0xC2, + 0xF0, 0x07, 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, + 0xFA, 0x07, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, + 0x3E, 0x08, 0xA0, 0x06, 0x36, 0xBA, 0x60, 0x01, + 0xFC, 0x07, 0x01, 0x00, 0x04, 0x13, 0xA0, 0x07, + 0xFA, 0x08, 0x00, 0x80, 0x52, 0x04, 0x60, 0x01, + 0x60, 0x07, 0x04, 0x00, 0x07, 0x16, 0x20, 0xD0, + 0x04, 0xE0, 0x20, 0xE8, 0x1A, 0xE0, 0x58, 0x07, + 0x60, 0x04, 0x3E, 0xC7, 0xA0, 0x07, 0xFA, 0x08, + 0x00, 0x40, 0x20, 0xC8, 0x3C, 0x08, 0xFC, 0x08, + 0x20, 0xC8, 0x3E, 0x08, 0xFE, 0x08, 0xA0, 0x06, + 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0xD3, 0x10, + 0xAD, 0xC2, 0x02, 0x00, 0x6D, 0xC2, 0x00, 0x00, + 0x05, 0x16, 0xAA, 0x07, 0x02, 0x00, 0x36, 0x07, + 0x9A, 0x2C, 0x80, 0x03, 0xEA, 0x2C, 0x02, 0x00, + 0x41, 0xCB, 0x00, 0x00, 0x80, 0x03, 0x2D, 0xC3, + 0x18, 0x00, 0xAC, 0x07, 0x02, 0x00, 0x36, 0x07, + 0x20, 0x4B, 0x06, 0xEB, 0x0A, 0x00, 0x20, 0xEB, + 0x00, 0xEB, 0x0A, 0x00, 0x9C, 0x2E, 0x80, 0x03, + 0xA0, 0xC2, 0x22, 0xE0, 0x60, 0x04, 0x8A, 0xA3, + 0xED, 0xC0, 0x18, 0x00, 0xA0, 0x06, 0x3A, 0xCC, + 0x80, 0x03, 0x44, 0xC2, 0xC3, 0xC0, 0x02, 0x13, + 0xA0, 0x06, 0x3A, 0xCC, 0x19, 0xC3, 0x09, 0xCB, + 0x18, 0x00, 0xC9, 0x05, 0x19, 0xCB, 0x16, 0x00, + 0x4C, 0xC2, 0x2C, 0x02, 0x1A, 0x00, 0x0D, 0xCF, + 0x0E, 0xCF, 0x0F, 0xC7, 0x99, 0x00, 0x5B, 0x04, + 0x8C, 0x07, 0x0A, 0x09, 0x9C, 0xC2, 0xA0, 0x22, + 0x14, 0xE0, 0x06, 0x13, 0xA0, 0xC2, 0x58, 0x07, + 0xA0, 0x22, 0x20, 0xE0, 0x01, 0x16, 0x80, 0x03, + 0x03, 0xC1, 0xC3, 0x04, 0x8A, 0x07, 0x04, 0x00, + 0x84, 0xA2, 0x3A, 0xCF, 0x3A, 0xCF, 0x3A, 0xCF, + 0x3A, 0xCF, 0x3A, 0xCF, 0xE0, 0x02, 0x58, 0x07, + 0x8D, 0x07, 0x0A, 0x09, 0x0B, 0xC8, 0xC2, 0x07, + 0xA0, 0x06, 0x44, 0xB8, 0xE0, 0xC2, 0xC2, 0x07, + 0x20, 0xE0, 0x20, 0xE0, 0xE0, 0x02, 0xB8, 0x07, + 0x5B, 0x04, 0x2D, 0xC3, 0x18, 0x00, 0x8C, 0xC2, + 0x60, 0xC2, 0x6C, 0x01, 0x0A, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x00, 0xFC, 0x02, 0x13, 0x8B, 0xC2, + 0xF9, 0x10, 0x09, 0xC8, 0x6C, 0x01, 0x8B, 0x07, + 0xF8, 0x05, 0x5B, 0xC2, 0x0C, 0x13, 0xCB, 0x05, + 0x5B, 0xC2, 0xCA, 0xC6, 0xE0, 0xC2, 0x6C, 0x01, + 0x09, 0xC8, 0x6C, 0x01, 0x0C, 0xC8, 0x00, 0xFC, + 0x0B, 0xC8, 0x6C, 0x01, 0x02, 0x10, 0xCC, 0xCE, + 0xCA, 0xC6, 0xA0, 0xC2, 0xE0, 0x00, 0xA0, 0x22, + 0x1A, 0xE0, 0x06, 0x16, 0x20, 0xE8, 0x04, 0xE0, + 0x3A, 0x07, 0x20, 0x48, 0x1A, 0xE0, 0xE0, 0x00, + 0x80, 0x03, 0xE0, 0xD3, 0xAB, 0xE3, 0xE0, 0x04, + 0x8E, 0x09, 0xE0, 0xC1, 0xA8, 0x06, 0x05, 0x16, + 0x07, 0x02, 0xA2, 0x06, 0xA0, 0x06, 0x38, 0xB5, + 0x0B, 0x16, 0xE0, 0xC1, 0xBA, 0x06, 0x23, 0x16, + 0x07, 0x02, 0xB4, 0x06, 0xA0, 0x06, 0x38, 0xB5, + 0x1E, 0x13, 0x07, 0x02, 0xB8, 0x06, 0x02, 0x10, + 0x07, 0x02, 0xA6, 0x06, 0x60, 0xC1, 0x02, 0xFC, + 0x25, 0xC8, 0x0C, 0x00, 0x02, 0xFC, 0xC5, 0xC9, + 0x0C, 0x00, 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xCD, + 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xC5, 0xB7, 0x01, + 0x28, 0x00, 0x27, 0x02, 0xF4, 0xFF, 0xA7, 0x07, + 0x04, 0x00, 0x52, 0xCE, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0xFC, 0x97, 0x2E, 0xD2, 0x10, 0x00, 0x03, + 0x02, 0x00, 0xA0, 0x06, 0x50, 0xB5, 0x00, 0x03, + 0x0F, 0x00, 0x20, 0x2C, 0xF0, 0xED, 0xE0, 0x93, + 0xAB, 0xE3, 0x03, 0x16, 0x81, 0x02, 0x16, 0x00, + 0xC4, 0x16, 0x21, 0xC1, 0x10, 0xEB, 0x54, 0x04, + 0xE0, 0x93, 0x10, 0xE0, 0x03, 0x16, 0xA0, 0xD2, + 0xA8, 0xE3, 0x0B, 0x10, 0xCF, 0xD3, 0x09, 0x16, + 0xA0, 0x23, 0x08, 0xE0, 0x06, 0x16, 0x84, 0x07, + 0x20, 0x00, 0x04, 0xE8, 0xD2, 0x06, 0xA0, 0xD2, + 0x0C, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0x04, + 0x70, 0xD1, 0x22, 0xC1, 0x04, 0x00, 0xE2, 0x04, + 0x02, 0x00, 0x54, 0x04, 0x02, 0xC8, 0x6C, 0x01, + 0x82, 0xA0, 0x22, 0xC8, 0x32, 0x0C, 0x00, 0xFC, + 0x02, 0x02, 0x00, 0xFC, 0xE0, 0x93, 0xAA, 0xE3, + 0x13, 0x16, 0xB0, 0x03, 0x20, 0x98, 0xAA, 0xE3, + 0x65, 0x06, 0x0D, 0x16, 0x8B, 0x07, 0x17, 0xFC, + 0xDB, 0xD2, 0x8B, 0x09, 0x8B, 0x02, 0x15, 0x00, + 0x7B, 0x1B, 0xEB, 0xD2, 0xC4, 0xEA, 0x06, 0x13, + 0x77, 0x15, 0x20, 0x07, 0xA0, 0x09, 0x74, 0x10, + 0xA0, 0x06, 0x02, 0xD0, 0xA0, 0x48, 0x04, 0xE0, + 0x0E, 0x00, 0x85, 0x02, 0x07, 0x00, 0x0E, 0x13, + 0x0E, 0x01, 0x03, 0x00, 0x0B, 0x13, 0xA0, 0x23, + 0x22, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 0x0E, 0xE0, + 0x02, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 0x8E, 0x01, + 0x03, 0x00, 0x5E, 0x10, 0x05, 0xC8, 0xFC, 0x06, + 0xC3, 0xC0, 0x57, 0x16, 0xA0, 0x43, 0x10, 0xE0, + 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 0x0A, 0x16, + 0x22, 0x88, 0x10, 0x00, 0x6E, 0x09, 0x06, 0x16, + 0x22, 0x88, 0x12, 0x00, 0x70, 0x09, 0x02, 0x16, + 0xA0, 0xE3, 0x10, 0xE0, 0x85, 0x02, 0x09, 0x00, + 0x02, 0x13, 0xA0, 0x06, 0xB8, 0xD7, 0x45, 0xA1, + 0x65, 0xC1, 0xAC, 0xE3, 0x55, 0x04, 0x62, 0xC0, + 0x04, 0x00, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0x82, 0x02, 0x48, 0x04, 0x02, 0x1B, 0xA0, 0x43, + 0x0C, 0xE0, 0x22, 0xC1, 0x0E, 0x00, 0x51, 0x04, + 0x42, 0xC0, 0xE1, 0x04, 0x02, 0x00, 0xA2, 0xC0, + 0x0C, 0x00, 0x22, 0xC1, 0x0A, 0x00, 0x20, 0x21, + 0x18, 0xE0, 0x07, 0x13, 0xA1, 0xC8, 0x0A, 0x00, + 0x0A, 0x00, 0xA1, 0xC8, 0x08, 0x00, 0x08, 0x00, + 0xE2, 0x10, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA0, 0x06, 0x66, 0xD6, 0x60, 0x04, 0xB0, 0xCE, + 0x02, 0xC8, 0xD4, 0x06, 0x62, 0xC1, 0x02, 0x00, + 0x65, 0xC1, 0xD8, 0xE3, 0x55, 0x04, 0x0F, 0x10, + 0x0E, 0x10, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, + 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 0xA2, 0xD8, + 0xA0, 0xE3, 0x0C, 0xE0, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0x04, 0xA0, 0x2E, 0xF4, 0x03, 0x60, 0x04, + 0xE4, 0xCC, 0xA0, 0x06, 0x26, 0xD5, 0x0C, 0x10, + 0xA0, 0x06, 0x66, 0xD6, 0x09, 0x10, 0xA0, 0x06, + 0x2A, 0xD8, 0x06, 0x10, 0xA0, 0x06, 0x66, 0xD6, + 0x03, 0xC8, 0x2A, 0x09, 0xA0, 0xD2, 0xAA, 0xE3, + 0xA0, 0x06, 0x6E, 0xCF, 0xA0, 0x92, 0x26, 0xE0, + 0x0C, 0x16, 0xE0, 0xD3, 0x26, 0xE0, 0xE0, 0x23, + 0x14, 0xE0, 0x0A, 0x13, 0x0A, 0xC1, 0xC4, 0x83, + 0x07, 0x13, 0xC4, 0xC3, 0x24, 0xC1, 0xDC, 0xE3, + 0x54, 0x04, 0xCA, 0x93, 0xDC, 0x13, 0xCA, 0xD3, + 0xB0, 0x03, 0x0F, 0xD8, 0x59, 0x06, 0x04, 0x71, + 0x24, 0xC1, 0xEC, 0xE3, 0x54, 0x04, 0xA0, 0x23, + 0x0C, 0xE0, 0xD1, 0x13, 0x4D, 0xC3, 0xCF, 0x13, + 0x4D, 0x01, 0x00, 0x04, 0x0B, 0x13, 0x86, 0x07, + 0x02, 0x00, 0x84, 0x07, 0x26, 0x00, 0x46, 0x23, + 0x03, 0x13, 0x44, 0x06, 0x86, 0xA1, 0xFB, 0x10, + 0x46, 0x43, 0xB3, 0x10, 0x84, 0x07, 0x18, 0x00, + 0x8D, 0x01, 0x00, 0x04, 0x85, 0x07, 0xF4, 0x03, + 0xF5, 0x04, 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, + 0xA2, 0xD8, 0x20, 0xE8, 0x9C, 0x09, 0xFE, 0x03, + 0x20, 0xE8, 0x9E, 0x09, 0x06, 0x04, 0xA8, 0x10, + 0x85, 0x07, 0x1C, 0x07, 0x86, 0x07, 0x1A, 0x04, + 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0xC6, 0x05, + 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0x83, 0x07, + 0x00, 0x90, 0xA9, 0x10, 0x0B, 0xC3, 0x86, 0x07, + 0x00, 0x01, 0x85, 0x07, 0x00, 0x80, 0x20, 0xC1, + 0xD2, 0x06, 0x37, 0x13, 0xC4, 0x04, 0x60, 0xC0, + 0xD2, 0x06, 0x45, 0x20, 0x04, 0x13, 0x84, 0x05, + 0x15, 0x09, 0xF9, 0x16, 0x2E, 0x10, 0xCF, 0xD3, + 0x06, 0x16, 0xE0, 0x23, 0x14, 0xE0, 0x03, 0x16, + 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0xE0, 0x04, + 0xD2, 0x06, 0x23, 0x10, 0x64, 0xD0, 0x1C, 0x07, + 0x46, 0xB0, 0x10, 0x18, 0x01, 0xD9, 0x1C, 0x07, + 0x60, 0x23, 0x20, 0xE0, 0x0B, 0x13, 0x81, 0x07, + 0x18, 0x00, 0x61, 0xC0, 0xFC, 0xE3, 0x11, 0x88, + 0xCE, 0xED, 0x04, 0x13, 0x08, 0x02, 0x18, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x64, 0xD0, 0x28, 0x07, + 0x46, 0xB0, 0x08, 0x18, 0x01, 0xD9, 0x28, 0x07, + 0x46, 0xB0, 0x04, 0x17, 0x83, 0x07, 0x40, 0x80, + 0xA0, 0x06, 0x2A, 0xD8, 0x05, 0x48, 0xD2, 0x06, + 0xCA, 0x16, 0x20, 0xC1, 0x32, 0x09, 0x01, 0x16, + 0x5C, 0x04, 0x04, 0x02, 0x07, 0x00, 0x20, 0x06, + 0x32, 0x09, 0x05, 0x02, 0x00, 0x01, 0xC7, 0x10, + 0x0B, 0xC3, 0xC5, 0x04, 0x42, 0xC0, 0xC7, 0x04, + 0x20, 0xC2, 0x6C, 0x01, 0xE1, 0xA1, 0x04, 0x00, + 0x11, 0xC8, 0x6C, 0x01, 0xFB, 0x16, 0x08, 0xC8, + 0x6C, 0x01, 0xC8, 0x04, 0xA0, 0x43, 0x1A, 0xE0, + 0x22, 0xC1, 0x0E, 0x00, 0x0D, 0x15, 0x0C, 0x13, + 0xA0, 0xE3, 0x1A, 0xE0, 0xA0, 0x06, 0x14, 0xD8, + 0x08, 0xC2, 0x48, 0x13, 0x88, 0x02, 0x12, 0x00, + 0x45, 0x1B, 0x20, 0x22, 0x22, 0xE0, 0x42, 0x13, + 0x02, 0xC1, 0x08, 0xA1, 0x08, 0x05, 0x28, 0x02, + 0xF2, 0xFF, 0x07, 0xA2, 0x83, 0x07, 0x01, 0x80, + 0x88, 0x02, 0x04, 0x00, 0x6E, 0x11, 0x64, 0xC2, + 0x16, 0x00, 0x49, 0xD2, 0x02, 0x16, 0x02, 0x81, + 0x31, 0x16, 0x09, 0x01, 0x00, 0xF0, 0x28, 0x16, + 0x49, 0xC1, 0x45, 0x71, 0xC3, 0x04, 0x85, 0x02, + 0x09, 0x00, 0x7C, 0x13, 0x83, 0x07, 0x02, 0x80, + 0xA4, 0xC1, 0x14, 0x00, 0x88, 0x81, 0x76, 0x16, + 0x83, 0x05, 0x85, 0x02, 0x15, 0x00, 0x13, 0x1B, + 0x83, 0x05, 0x49, 0x99, 0x30, 0xEB, 0x0A, 0x13, + 0x09, 0x98, 0x0E, 0xE0, 0x6B, 0x16, 0x25, 0x98, + 0x30, 0xEB, 0x0C, 0xE0, 0x67, 0x16, 0xE0, 0xC1, + 0xEC, 0x06, 0x64, 0x16, 0xC3, 0x04, 0x52, 0xC2, + 0x0F, 0x13, 0x83, 0x07, 0x09, 0x80, 0xE0, 0xC1, + 0x6A, 0x09, 0x47, 0x01, 0x00, 0x10, 0x5A, 0x16, + 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0x06, 0xBE, 0xD6, + 0x60, 0x04, 0xB0, 0xCE, 0x60, 0x04, 0xBA, 0xCE, + 0x89, 0x07, 0x0E, 0x07, 0xC7, 0x04, 0xE5, 0xD1, + 0x46, 0xEB, 0x05, 0x13, 0xC7, 0x06, 0x27, 0x02, + 0x5C, 0xEB, 0x77, 0xCE, 0xFE, 0x15, 0x44, 0xC0, + 0x21, 0x02, 0x18, 0x00, 0x28, 0x02, 0xFC, 0xFF, + 0x36, 0x13, 0x91, 0xC1, 0x86, 0xD1, 0x1F, 0x13, + 0xC6, 0x06, 0x87, 0x07, 0x0E, 0x07, 0xF7, 0xC0, + 0x46, 0x02, 0xFF, 0xBF, 0x43, 0x02, 0xFF, 0x3F, + 0xA0, 0x91, 0xF5, 0xED, 0x09, 0x16, 0xB0, 0x03, + 0x20, 0x98, 0x0E, 0xE0, 0x5D, 0x06, 0x0F, 0x16, + 0x21, 0xC8, 0x02, 0x00, 0x0C, 0x07, 0x17, 0x10, + 0x47, 0x82, 0x0C, 0x1B, 0xC6, 0x90, 0xEB, 0x16, + 0x47, 0x06, 0xF7, 0x04, 0xB0, 0x03, 0x20, 0x98, + 0x5D, 0x06, 0x57, 0x06, 0x0C, 0x13, 0x83, 0x07, + 0x05, 0x80, 0x1C, 0x10, 0xD1, 0xC0, 0xE0, 0x20, + 0x16, 0xE0, 0x03, 0x16, 0x83, 0x07, 0x08, 0x80, + 0x15, 0x10, 0x60, 0x44, 0x26, 0xE0, 0x86, 0x71, + 0x46, 0xA0, 0x06, 0x62, 0x83, 0x07, 0x05, 0x80, + 0x08, 0xC2, 0xCB, 0x15, 0x0B, 0x16, 0xC3, 0x04, + 0x87, 0x07, 0x0E, 0x07, 0x77, 0xC0, 0x47, 0x82, + 0x05, 0x1B, 0x60, 0x20, 0x06, 0xE0, 0xFA, 0x16, + 0x83, 0x07, 0x07, 0x80, 0x5C, 0x04, 0xA0, 0x92, + 0x0E, 0xE0, 0x11, 0x16, 0x20, 0xC8, 0x20, 0xE0, + 0x08, 0x07, 0xE0, 0x04, 0x84, 0x01, 0x60, 0x05, + 0x02, 0x07, 0x4B, 0x13, 0x20, 0x48, 0x06, 0xE0, + 0x82, 0x01, 0xA0, 0x06, 0xD0, 0xD4, 0x83, 0x07, + 0x00, 0xC0, 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, + 0x1E, 0xE0, 0x02, 0x07, 0xA0, 0xE3, 0x04, 0xE0, + 0x08, 0x02, 0x24, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x42, 0x10, 0x20, 0xC1, 0x84, 0x01, 0x44, 0x02, + 0x00, 0x88, 0x2A, 0x13, 0x04, 0x48, 0x84, 0x01, + 0x20, 0x06, 0x02, 0x07, 0xF1, 0x16, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x15, 0x13, 0xA0, 0x23, + 0x22, 0xE0, 0x05, 0x16, 0xA0, 0x43, 0x22, 0xE0, + 0xA0, 0xD2, 0x0E, 0xE0, 0xCF, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0x04, 0x13, 0x20, 0x98, 0xA9, 0xE3, + 0x65, 0x06, 0x0C, 0x16, 0xA0, 0x92, 0x0E, 0xE0, + 0xC5, 0x13, 0xA0, 0xD2, 0xA8, 0xE3, 0xD3, 0x10, + 0x20, 0xC8, 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, + 0x00, 0xC0, 0x04, 0x10, 0x83, 0x07, 0x02, 0x00, + 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x04, 0xC0, 0xCE, + 0x20, 0xE8, 0x06, 0xE0, 0x82, 0x01, 0xA0, 0x06, + 0xD0, 0xD4, 0x20, 0x07, 0x02, 0x07, 0xA0, 0x43, + 0x04, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, + 0x20, 0x88, 0x20, 0xE0, 0x08, 0x07, 0x03, 0x16, + 0x20, 0xC8, 0x78, 0xEB, 0x08, 0x07, 0x60, 0x04, + 0xD2, 0xCE, 0x0E, 0x01, 0x03, 0x00, 0x16, 0x13, + 0xCF, 0xD3, 0x08, 0x16, 0xA0, 0x23, 0x20, 0xE0, + 0x03, 0x16, 0xA0, 0xD2, 0xA8, 0xE3, 0x02, 0x10, + 0xA0, 0xD2, 0x0E, 0xE0, 0x8E, 0x01, 0x03, 0x00, + 0x09, 0x10, 0x60, 0xC1, 0x84, 0x01, 0x60, 0x21, + 0x0A, 0xE0, 0x04, 0x16, 0x83, 0x07, 0x00, 0x84, + 0x60, 0x04, 0xCA, 0xCE, 0x20, 0xC8, 0x2E, 0xE0, + 0x84, 0x01, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0xE3, + 0x20, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x93, + 0x26, 0xE0, 0x10, 0x16, 0xA0, 0x23, 0x08, 0xE0, + 0x0D, 0x16, 0xA0, 0x23, 0x06, 0xE0, 0x02, 0x13, + 0x60, 0xE3, 0x1C, 0xE0, 0x60, 0xE3, 0x18, 0xE0, + 0xA0, 0x43, 0x06, 0xE0, 0x08, 0x02, 0x3C, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, + 0xA0, 0x92, 0xA8, 0xE3, 0x03, 0x13, 0xA0, 0x92, + 0xA9, 0xE3, 0x1E, 0x16, 0xE0, 0x23, 0x14, 0xE0, + 0x08, 0x13, 0x20, 0x98, 0xA9, 0xE3, 0x65, 0x06, + 0x04, 0x13, 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, + 0xCA, 0xCE, 0xA0, 0xD2, 0x0E, 0xE0, 0x20, 0xC8, + 0x20, 0xE0, 0x08, 0x07, 0xA0, 0x27, 0x04, 0xE0, + 0x0B, 0x16, 0x20, 0xC8, 0x1E, 0xE0, 0x08, 0x07, + 0xE0, 0x93, 0xA8, 0xE3, 0x05, 0x16, 0xA0, 0x23, + 0x12, 0xE0, 0x02, 0x13, 0x20, 0x06, 0x08, 0x07, + 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, + 0x3E, 0x13, 0xB0, 0x03, 0x20, 0x98, 0x0E, 0xE0, + 0x6F, 0x06, 0x0F, 0x16, 0xCF, 0xD3, 0x37, 0x16, + 0xA0, 0xD2, 0xA8, 0xE3, 0x60, 0x04, 0xD2, 0xCE, + 0xA0, 0x92, 0x0C, 0xE0, 0x30, 0x16, 0xE0, 0x23, + 0x14, 0xE0, 0xF6, 0x13, 0x83, 0x07, 0x06, 0x00, + 0x07, 0x10, 0x83, 0x07, 0x05, 0x00, 0xE0, 0x93, + 0x0E, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x07, 0x00, + 0x60, 0x04, 0xCA, 0xCE, 0x60, 0xE3, 0x12, 0xE0, + 0xE0, 0x23, 0x14, 0xE0, 0x11, 0x13, 0x20, 0x98, + 0x0C, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, + 0xA9, 0xE3, 0x65, 0x06, 0x14, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x10, 0x13, 0x20, 0xC1, + 0x84, 0x01, 0x20, 0x21, 0x06, 0xE0, 0xD2, 0x16, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x07, 0x13, + 0x20, 0x48, 0x06, 0xE0, 0x84, 0x01, 0x08, 0x02, + 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, + 0xD2, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x20, + 0xFA, 0x16, 0x08, 0x02, 0x78, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0xC2, 0xA2, 0x09, 0x03, 0x13, + 0x20, 0x06, 0xA2, 0x09, 0x21, 0x13, 0x20, 0xC2, + 0xA4, 0x09, 0xED, 0x13, 0x20, 0x06, 0xA4, 0x09, + 0xEA, 0x16, 0xA0, 0x07, 0xA4, 0x09, 0x05, 0x00, + 0xCD, 0x01, 0x00, 0x04, 0xE4, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x80, 0x00, 0x3E, 0x13, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x10, 0x02, 0x16, 0xA0, 0x06, + 0xE6, 0xD5, 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x10, + 0xE0, 0x01, 0x8E, 0x09, 0x80, 0x00, 0x83, 0x07, + 0x00, 0xA8, 0xA0, 0x06, 0x2A, 0xD8, 0x16, 0x10, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x21, 0x13, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x10, 0xA0, 0x07, + 0x08, 0x07, 0x05, 0x00, 0x83, 0x07, 0x08, 0xA8, + 0xA0, 0x23, 0x04, 0xE0, 0x05, 0x16, 0x20, 0xC8, + 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 0x08, 0xE8, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x20, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x01, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x08, 0xA0, 0xD2, + 0x0E, 0xE0, 0x83, 0x07, 0x10, 0x80, 0x60, 0x04, + 0xC0, 0xCE, 0x08, 0x02, 0x78, 0x00, 0xA0, 0x06, + 0xDA, 0xD4, 0x83, 0x07, 0x00, 0x82, 0x60, 0x04, + 0xCA, 0xCE, 0x60, 0x04, 0xD2, 0xCE, 0x20, 0x06, + 0x90, 0x09, 0x07, 0x15, 0xA0, 0xD2, 0x10, 0xE0, + 0xCA, 0x06, 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, + 0xF4, 0x10, 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0xC2, 0x90, 0x09, 0x88, 0x02, + 0x96, 0x00, 0x0D, 0x1B, 0xEA, 0x16, 0x20, 0x48, + 0x08, 0xE0, 0x82, 0x01, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x10, 0xA0, 0x06, 0xE6, 0xD5, 0x83, 0x07, + 0x00, 0x28, 0x60, 0x04, 0xC0, 0xCE, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x10, 0xDA, 0x16, 0x84, 0x07, + 0x04, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, + 0xB5, 0x07, 0x30, 0x06, 0xA0, 0x06, 0xA2, 0xD8, + 0xA0, 0x07, 0xF8, 0x03, 0x34, 0xD4, 0x60, 0x04, + 0xC0, 0xDB, 0xA0, 0x07, 0x90, 0x09, 0xF4, 0x01, + 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x08, 0x02, 0x36, 0x00, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x23, + 0x18, 0xE0, 0x06, 0x13, 0xA0, 0xE3, 0x18, 0xE0, + 0xE0, 0x2E, 0x00, 0x00, 0x41, 0xC0, 0xFA, 0x16, + 0xA0, 0x06, 0xE6, 0xD5, 0xB2, 0x10, 0x04, 0x02, + 0x64, 0x00, 0x04, 0x06, 0xFE, 0x16, 0x5B, 0x04, + 0xA0, 0xE3, 0x0A, 0xE0, 0x08, 0xC2, 0x02, 0x11, + 0xA0, 0x43, 0x0A, 0xE0, 0x20, 0x42, 0x04, 0xE0, + 0x28, 0x02, 0xFC, 0xE3, 0x58, 0xC0, 0x02, 0xC0, + 0x11, 0x88, 0xCE, 0xED, 0x03, 0x16, 0xD1, 0x2C, + 0x58, 0xC0, 0xD1, 0x04, 0x80, 0xC0, 0x0E, 0x01, + 0x00, 0x10, 0x0F, 0x13, 0x60, 0xCC, 0xCE, 0xED, + 0xC8, 0x05, 0x78, 0xCC, 0x03, 0x16, 0x41, 0x06, + 0x60, 0xCC, 0xD6, 0x06, 0x58, 0xC4, 0x02, 0x16, + 0x60, 0xC4, 0x00, 0x07, 0x21, 0x02, 0xFA, 0xFF, + 0x91, 0x2C, 0x5B, 0x04, 0x0B, 0xC3, 0xA0, 0x06, + 0xC2, 0xD5, 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, + 0x05, 0x16, 0x62, 0xC2, 0x02, 0x00, 0x60, 0x26, + 0xA8, 0xE4, 0x0D, 0x16, 0x42, 0xC2, 0xC9, 0x05, + 0x60, 0xCE, 0xF2, 0xED, 0x60, 0xC6, 0x7C, 0xEB, + 0xA0, 0x06, 0x10, 0xD6, 0x18, 0xCA, 0x0A, 0x00, + 0x20, 0x46, 0x26, 0xE0, 0x04, 0x16, 0xA0, 0xC0, + 0x6C, 0x01, 0x12, 0x2E, 0x1D, 0x10, 0x12, 0xC1, + 0x05, 0x13, 0x60, 0xC1, 0x6C, 0x01, 0x14, 0x2E, + 0x05, 0xC8, 0x6C, 0x01, 0xD2, 0x04, 0x48, 0x06, + 0x84, 0x07, 0x02, 0x00, 0x48, 0xC1, 0xA0, 0xC0, + 0x6C, 0x01, 0x02, 0xC0, 0xA0, 0x06, 0xA2, 0xD8, + 0x60, 0xC5, 0x02, 0xFC, 0x07, 0x02, 0xA2, 0x06, + 0x25, 0x02, 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, + 0x20, 0xC2, 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, + 0x5C, 0x04, 0x42, 0xC2, 0x29, 0x02, 0x08, 0x00, + 0x39, 0xC2, 0x48, 0x02, 0x00, 0xC0, 0x88, 0x02, + 0x00, 0xC0, 0x08, 0x16, 0x60, 0x8E, 0x2E, 0xE0, + 0x05, 0x16, 0x60, 0x86, 0x2E, 0xE0, 0x02, 0x16, + 0xC8, 0x04, 0x5B, 0x04, 0x08, 0x07, 0x5B, 0x04, + 0x20, 0x88, 0x8E, 0xE1, 0x6C, 0x01, 0x02, 0x16, + 0x60, 0x04, 0xBA, 0xCE, 0x5B, 0x04, 0x88, 0x07, + 0xAE, 0x01, 0x20, 0xE8, 0x0E, 0xE0, 0x80, 0x01, + 0x08, 0x06, 0xFE, 0x16, 0x20, 0x48, 0x0E, 0xE0, + 0x80, 0x01, 0x5B, 0x04, 0xC2, 0x04, 0xA0, 0x23, + 0x0C, 0xE0, 0x10, 0x16, 0x20, 0x2F, 0x30, 0x06, + 0x82, 0x07, 0xDF, 0xFF, 0x02, 0x2C, 0x82, 0x02, + 0xF4, 0x03, 0x06, 0x13, 0xE2, 0x04, 0x02, 0x00, + 0xA2, 0xC0, 0x06, 0x00, 0x12, 0x2E, 0xF4, 0x10, + 0xA0, 0x43, 0x0C, 0xE0, 0x5B, 0x04, 0x42, 0xC2, + 0x88, 0x07, 0x0E, 0x00, 0x09, 0xA2, 0x29, 0x02, + 0x08, 0x00, 0x78, 0xCE, 0x78, 0xCE, 0x78, 0xCE, + 0x60, 0xCE, 0x6C, 0x09, 0x60, 0xCE, 0x6E, 0x09, + 0x60, 0xCE, 0x70, 0x09, 0xA0, 0x23, 0x1A, 0xE0, + 0x0F, 0x16, 0x58, 0xC2, 0x49, 0x02, 0x80, 0x1F, + 0x60, 0x2A, 0x14, 0xE0, 0xA0, 0xE8, 0x04, 0xE0, + 0x0E, 0x00, 0x09, 0xC6, 0x49, 0x02, 0x00, 0x1F, + 0xC9, 0x06, 0x09, 0xA2, 0x89, 0xA8, 0x04, 0x00, + 0x28, 0x02, 0x02, 0x00, 0x58, 0xC2, 0x49, 0x0A, + 0x49, 0x02, 0x00, 0xF0, 0x09, 0xD6, 0xE2, 0x04, + 0x06, 0x00, 0x5B, 0x04, 0x00, 0x07, 0x82, 0xC0, + 0x53, 0x13, 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0xC1, + 0x06, 0xFC, 0x46, 0x02, 0x0F, 0x00, 0x86, 0x02, + 0x01, 0x00, 0x3D, 0x12, 0x06, 0x88, 0xF2, 0x06, + 0x12, 0x16, 0x01, 0x02, 0x0E, 0xFC, 0x31, 0x88, + 0xF4, 0x06, 0x0D, 0x16, 0x31, 0x88, 0xF6, 0x06, + 0x0A, 0x16, 0x31, 0x88, 0xF8, 0x06, 0x07, 0x16, + 0x86, 0x02, 0x02, 0x00, 0x2C, 0x16, 0x20, 0x88, + 0x0A, 0x07, 0xFA, 0x06, 0x28, 0x13, 0x20, 0xC1, + 0x6A, 0x09, 0x44, 0x01, 0x00, 0x08, 0x06, 0x13, + 0x86, 0x02, 0x02, 0x00, 0x20, 0x16, 0x44, 0x01, + 0x80, 0x00, 0x1D, 0x16, 0x00, 0x07, 0xE0, 0x23, + 0x14, 0xE0, 0x19, 0x16, 0x82, 0x02, 0x43, 0x00, + 0x16, 0x13, 0x00, 0x02, 0x02, 0xFC, 0x40, 0xC0, + 0xB0, 0x01, 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, + 0x01, 0x00, 0x07, 0x16, 0x60, 0xA0, 0x2C, 0x09, + 0x60, 0xCC, 0xEE, 0x05, 0x50, 0xC4, 0x20, 0xC4, + 0x2C, 0x09, 0x80, 0x07, 0x36, 0x07, 0x81, 0x07, + 0x40, 0x00, 0x40, 0x2C, 0xC0, 0x04, 0x84, 0x07, + 0xF2, 0x06, 0x06, 0xCD, 0x01, 0x02, 0x0E, 0xFC, + 0x31, 0xCD, 0x31, 0xCD, 0x31, 0xCD, 0x20, 0xC5, + 0x0A, 0x07, 0x00, 0xC0, 0x01, 0x13, 0x12, 0x2E, + 0xE0, 0x04, 0x6C, 0x01, 0x5B, 0x04, 0x60, 0x01, + 0x8A, 0x09, 0x00, 0x80, 0x12, 0x13, 0x0B, 0xC8, + 0x22, 0x09, 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, + 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x08, 0x02, + 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xC2, + 0x22, 0x09, 0x5B, 0x04, 0x20, 0x48, 0xAC, 0xE4, + 0x80, 0x01, 0x20, 0x48, 0x7E, 0xEB, 0x82, 0x01, + 0x20, 0x48, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0x48, + 0x22, 0xE0, 0x78, 0x09, 0x60, 0x43, 0x18, 0xE0, + 0xA0, 0x43, 0x08, 0xE0, 0x60, 0x01, 0x8A, 0x09, + 0x00, 0x80, 0xEB, 0x13, 0x0B, 0xC3, 0x08, 0x02, + 0x42, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 0x5C, 0x04, + 0x0B, 0xC3, 0x20, 0xE8, 0x0E, 0xE0, 0x82, 0x01, + 0x20, 0xE8, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0xE8, + 0x22, 0xE0, 0x78, 0x09, 0xA0, 0xE3, 0x08, 0xE0, + 0x60, 0xE3, 0x18, 0xE0, 0xA0, 0x43, 0x06, 0xE0, + 0x08, 0x02, 0x3C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x5C, 0x04, 0x0B, 0xC3, 0x83, 0x07, 0x00, 0x68, + 0xA0, 0x06, 0x2A, 0xD8, 0x83, 0x07, 0x10, 0x80, + 0xA0, 0x06, 0x2A, 0xD8, 0x5C, 0x04, 0x0B, 0xC3, + 0xA0, 0x06, 0x14, 0xD8, 0x02, 0xA2, 0x68, 0xC2, + 0x14, 0x00, 0x29, 0x02, 0xFC, 0xFF, 0x24, 0x13, + 0x28, 0x02, 0x18, 0x00, 0x87, 0x07, 0x0E, 0x00, + 0x81, 0x07, 0x0E, 0x07, 0xF1, 0x04, 0x47, 0x06, + 0xFD, 0x15, 0x58, 0xC0, 0xB0, 0x03, 0x01, 0x78, + 0x63, 0x06, 0x41, 0x02, 0x3F, 0x00, 0x0E, 0x13, + 0x81, 0x02, 0x1F, 0x00, 0x0B, 0x1B, 0x41, 0xA0, + 0x61, 0xC0, 0x86, 0xE4, 0xF8, 0xC1, 0xC7, 0x06, + 0xC7, 0x71, 0x47, 0x06, 0x78, 0xCC, 0x47, 0x06, + 0xFD, 0x15, 0x04, 0x10, 0x58, 0xC0, 0xC1, 0x06, + 0x41, 0x70, 0x01, 0xA2, 0x49, 0xC2, 0xE5, 0x15, + 0x5C, 0x04, 0xA0, 0x23, 0x1A, 0xE0, 0x02, 0x13, + 0xC8, 0x04, 0x5B, 0x04, 0x22, 0xC2, 0x14, 0x00, + 0x48, 0x02, 0x00, 0x1F, 0xC8, 0x06, 0x5B, 0x04, + 0x83, 0x02, 0x0F, 0x00, 0x17, 0x1B, 0xA0, 0xC1, + 0xD4, 0x06, 0x35, 0x13, 0x26, 0x02, 0x04, 0x00, + 0xA0, 0xCD, 0xCE, 0xED, 0x83, 0xC5, 0x04, 0x13, + 0x4A, 0xC2, 0x39, 0x0A, 0xC9, 0xE0, 0x83, 0xC5, + 0x86, 0x07, 0x36, 0x07, 0x87, 0x07, 0x10, 0x00, + 0x20, 0xC2, 0xD4, 0x06, 0xE0, 0x04, 0xD4, 0x06, + 0x46, 0x2C, 0x5B, 0x04, 0x60, 0xC0, 0xFE, 0x06, + 0x20, 0xC2, 0x6A, 0x09, 0x48, 0x02, 0x00, 0x60, + 0x20, 0x22, 0x06, 0xE0, 0x04, 0x16, 0x20, 0xE2, + 0x0A, 0xE0, 0x20, 0xE2, 0x18, 0xE0, 0x13, 0x0A, + 0x04, 0x18, 0x41, 0x05, 0x03, 0x48, 0xFE, 0x06, + 0x06, 0x10, 0x83, 0x02, 0x02, 0x00, 0x01, 0x16, + 0x13, 0x09, 0x03, 0xE8, 0xFE, 0x06, 0xC8, 0x40, + 0xC1, 0x40, 0x05, 0x13, 0x88, 0x07, 0x36, 0x07, + 0x89, 0x07, 0x00, 0x40, 0x48, 0x2C, 0x5B, 0x04, + 0xC9, 0x04, 0x24, 0xC1, 0x94, 0xEB, 0x84, 0xC1, + 0x86, 0x71, 0x86, 0xA1, 0x26, 0x02, 0x56, 0xEC, + 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xC2, 0xEB, + 0x14, 0xD2, 0xC8, 0x09, 0x08, 0xA2, 0xB0, 0x03, + 0x34, 0xD8, 0x5F, 0x06, 0x47, 0x02, 0x0F, 0x00, + 0xC7, 0xA1, 0x28, 0xC2, 0x82, 0xEB, 0x58, 0x04, + 0x76, 0xCD, 0x47, 0x06, 0xFD, 0x16, 0x32, 0x10, + 0x36, 0xC2, 0x26, 0x10, 0x17, 0x09, 0x47, 0xA1, + 0x2D, 0x10, 0x17, 0x09, 0x47, 0x61, 0x2A, 0x10, + 0xA0, 0x43, 0x16, 0xE0, 0x5B, 0x04, 0xA0, 0x43, + 0x16, 0xE0, 0x49, 0xC2, 0x03, 0x16, 0x44, 0xC2, + 0x06, 0xC8, 0x22, 0x09, 0x27, 0xC1, 0x8E, 0xED, + 0x84, 0xC1, 0x86, 0x71, 0x26, 0x02, 0xC4, 0xED, + 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xAA, 0xED, + 0xD3, 0x10, 0x09, 0xC1, 0xA0, 0xC1, 0x22, 0x09, + 0xC9, 0x04, 0x10, 0x10, 0x36, 0xC2, 0x78, 0xD5, + 0x60, 0x41, 0x22, 0xE0, 0xC5, 0x05, 0x0A, 0x10, + 0x78, 0xCD, 0x47, 0x06, 0xFD, 0x15, 0x06, 0x10, + 0xA0, 0x23, 0x16, 0xE0, 0xCD, 0x16, 0x49, 0xC2, + 0xEC, 0x16, 0xD6, 0x10, 0xA0, 0xE3, 0x16, 0xE0, + 0xBB, 0x10, 0x08, 0x02, 0x5A, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x44, 0x10, 0xA0, 0x92, 0x0C, 0xE0, + 0x15, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x14, 0x16, + 0x20, 0x48, 0xAC, 0xE4, 0x80, 0x01, 0xA0, 0x06, + 0x72, 0xD7, 0x20, 0xC8, 0x9E, 0x01, 0x9E, 0x01, + 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0x43, 0x18, 0xE0, + 0xA0, 0xD2, 0x26, 0xE0, 0x83, 0x07, 0x10, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xD2, 0xCE, + 0x84, 0x07, 0x08, 0x00, 0x60, 0x04, 0x94, 0xCE, + 0x85, 0x07, 0x03, 0x02, 0x05, 0xC8, 0xCE, 0x06, + 0xA0, 0x43, 0x12, 0xE0, 0xE0, 0x04, 0xFA, 0x06, + 0xA0, 0x06, 0xA4, 0xD7, 0x08, 0x02, 0x48, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x17, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x02, 0x16, 0x60, 0x04, + 0x9C, 0xD4, 0xA0, 0x27, 0x2C, 0xE0, 0x04, 0x16, + 0x08, 0x02, 0x54, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x83, 0x07, 0x00, 0xA8, 0x20, 0x88, 0x08, 0x07, + 0x20, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x00, 0xE8, + 0xA0, 0x06, 0x2A, 0xD8, 0x08, 0x02, 0x36, 0x00, + 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0xA0, 0x23, 0x18, 0xE0, 0x06, 0x13, + 0xA0, 0xE3, 0x18, 0xE0, 0xE0, 0x2E, 0x00, 0x00, + 0x41, 0xC0, 0xFA, 0x16, 0xA0, 0x06, 0xE6, 0xD5, + 0x82, 0xC0, 0x02, 0x13, 0x4F, 0x02, 0x80, 0xFF, + 0xC4, 0x04, 0x0F, 0xD1, 0xC4, 0x06, 0x60, 0x04, + 0x94, 0xCE, 0xA0, 0x06, 0x32, 0xDA, 0x08, 0x02, + 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 0x20, 0xDA, + 0xA0, 0x06, 0xDA, 0xD4, 0x10, 0x10, 0xA0, 0x06, + 0x32, 0xDA, 0x20, 0xD1, 0xCE, 0x06, 0xE6, 0x13, + 0x20, 0x78, 0x12, 0xE0, 0xCE, 0x06, 0xE2, 0x10, + 0x20, 0xC1, 0x16, 0x04, 0x14, 0x0A, 0xC4, 0x06, + 0x0A, 0x91, 0x01, 0x16, 0x5B, 0x04, 0x60, 0x04, + 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 0xAB, 0xE3, + 0x65, 0x06, 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, + 0x60, 0xC1, 0x94, 0x09, 0x02, 0x13, 0x60, 0x04, + 0x22, 0xDE, 0x60, 0xD1, 0x0E, 0xE0, 0x3D, 0x10, + 0x85, 0x07, 0xBE, 0xEA, 0x35, 0xC8, 0x8A, 0x09, + 0x15, 0xC8, 0x8C, 0x09, 0x0B, 0x10, 0xE0, 0x04, + 0xA0, 0x09, 0x20, 0xD8, 0x2E, 0x09, 0xA6, 0x09, + 0x20, 0xC8, 0xA8, 0x09, 0x8A, 0x09, 0x20, 0xC8, + 0xAA, 0x09, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, + 0xCA, 0x04, 0xCD, 0x04, 0xCE, 0x04, 0xCF, 0x04, + 0xE0, 0x04, 0xA8, 0x06, 0xE0, 0x04, 0xBA, 0x06, + 0x84, 0x07, 0xA0, 0x01, 0x85, 0x07, 0x10, 0x00, + 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, + 0xD8, 0x06, 0x85, 0x07, 0x34, 0x07, 0x44, 0x61, + 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, + 0xC8, 0x00, 0x04, 0xC8, 0x00, 0x07, 0x84, 0x07, + 0xFF, 0x7F, 0x04, 0xC8, 0xF0, 0x06, 0x84, 0x07, + 0x06, 0x00, 0x04, 0xC8, 0xEE, 0x06, 0x85, 0x07, + 0x02, 0x0C, 0x20, 0xC1, 0x8A, 0x09, 0x01, 0x11, + 0xC5, 0x06, 0xB0, 0x03, 0x05, 0xD8, 0x65, 0x06, + 0x60, 0x04, 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x79, 0x16, 0x60, 0xD1, + 0x10, 0xE0, 0xF3, 0x10, 0x60, 0xD1, 0xAB, 0xE3, + 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0xE0, 0x01, + 0x80, 0x01, 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, + 0x80, 0x01, 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, + 0x2E, 0x09, 0xE3, 0x10, 0x20, 0xF8, 0x19, 0xEE, + 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0xC6, 0x06, + 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x20, 0xC8, + 0xC2, 0xEA, 0x90, 0x09, 0xE0, 0x2E, 0x00, 0x00, + 0xA0, 0x06, 0xE6, 0xD5, 0x20, 0xC8, 0x6C, 0x09, + 0xA0, 0x01, 0x20, 0xC8, 0x6E, 0x09, 0xA2, 0x01, + 0x20, 0xC8, 0x70, 0x09, 0xA4, 0x01, 0x20, 0xC8, + 0x6E, 0x09, 0xB0, 0x01, 0x20, 0xC8, 0x70, 0x09, + 0xB2, 0x01, 0x20, 0xC8, 0x70, 0x09, 0xCC, 0x06, + 0x20, 0xF8, 0x18, 0xEE, 0x80, 0x01, 0xB0, 0x03, + 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x3A, 0x13, 0xE0, 0x01, + 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x56, 0xDF, + 0xE0, 0xC2, 0x8A, 0x09, 0x05, 0x11, 0xA0, 0x01, + 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x9A, 0xDF, + 0x98, 0x06, 0x08, 0x02, 0x12, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x84, 0x07, 0x0A, 0x00, 0x85, 0x07, + 0xF4, 0x03, 0x20, 0x88, 0xC6, 0x06, 0x20, 0xE0, + 0x08, 0x1B, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0xA5, 0x13, 0x84, 0x07, 0x1C, 0x00, 0x85, 0x07, + 0xF8, 0x03, 0xA0, 0x06, 0xA2, 0xD8, 0x85, 0x07, + 0x42, 0xDC, 0x05, 0xC8, 0xF8, 0x03, 0x20, 0xC8, + 0xA0, 0x09, 0xA0, 0x09, 0x6C, 0x16, 0x20, 0xE8, + 0x9C, 0x09, 0xFE, 0x03, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0x04, 0xA0, 0x23, 0x0C, 0xE0, 0x32, 0x13, + 0xA0, 0xE3, 0x0C, 0xE0, 0xA0, 0x2E, 0xF4, 0x03, + 0x2D, 0x10, 0xA0, 0x06, 0x56, 0xDF, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x40, 0x08, 0x13, 0x08, 0x02, + 0x6C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x22, 0x10, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x40, 0x08, 0x02, + 0x60, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x84, 0x07, + 0x2A, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xA0, 0x06, + 0xA2, 0xD8, 0xD5, 0x10, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x0F, 0x16, 0x20, 0x06, + 0x90, 0x09, 0x9A, 0x16, 0x60, 0x01, 0x8A, 0x09, + 0x00, 0x40, 0x39, 0x13, 0xE0, 0x04, 0x8A, 0x09, + 0xE0, 0x04, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, + 0x60, 0x04, 0x62, 0xDA, 0x60, 0x04, 0xB0, 0xCE, + 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, + 0xF9, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x04, 0x16, + 0x20, 0x06, 0xC6, 0x06, 0x9A, 0x16, 0x0A, 0x10, + 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, + 0xED, 0x16, 0x20, 0x06, 0xC8, 0x06, 0x02, 0x13, + 0x60, 0x04, 0x5A, 0xDB, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0x02, 0x16, 0xCE, 0x01, 0x03, 0x00, + 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0x83, 0x07, + 0x00, 0x82, 0x07, 0x10, 0x83, 0x07, 0x01, 0x00, + 0xE0, 0x04, 0x8E, 0x09, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x01, + 0x8A, 0x09, 0x00, 0x40, 0xC7, 0x16, 0x83, 0x07, + 0x0D, 0x00, 0xF2, 0x10, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0xC7, 0x16, 0x20, 0x88, + 0x98, 0x09, 0x20, 0xE0, 0xF0, 0x16, 0x22, 0xC8, + 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 0x10, 0x00, + 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, 0xE0, 0x06, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x08, 0x02, + 0x66, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB2, 0x10, + 0xA0, 0x07, 0x9A, 0x09, 0x5A, 0x00, 0xA0, 0x07, + 0xA2, 0x09, 0x19, 0x00, 0xA0, 0x07, 0xA4, 0x09, + 0x05, 0x00, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x20, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x08, 0x02, + 0x78, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB0, 0x03, + 0x20, 0x98, 0xAB, 0xE3, 0x65, 0x06, 0x9A, 0x16, + 0x08, 0x02, 0x72, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x06, + 0xD0, 0xD5, 0x20, 0x06, 0x9A, 0x09, 0xBF, 0x13, + 0x84, 0x07, 0x2C, 0x00, 0x85, 0x07, 0xF4, 0x03, + 0xA0, 0x06, 0xA2, 0xD8, 0x60, 0x04, 0xC0, 0xDB, + 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 0x82, 0x10, + 0x0E, 0x01, 0x03, 0x00, 0x0A, 0x13, 0x08, 0x02, + 0x0C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xE3, + 0x14, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, + 0x26, 0x10, 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, + 0xE0, 0x2E, 0x01, 0x00, 0x60, 0xC1, 0x1E, 0x09, + 0x35, 0x0A, 0x05, 0xE8, 0x82, 0x01, 0x20, 0xC1, + 0x6A, 0x09, 0x04, 0x01, 0x06, 0x00, 0x06, 0x13, + 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 0x20, 0xD8, + 0xD0, 0xE1, 0x83, 0x01, 0x20, 0x21, 0x22, 0xE0, + 0x03, 0x16, 0x20, 0xE8, 0x22, 0xE0, 0x80, 0x01, + 0x20, 0x21, 0x04, 0xE0, 0x04, 0x16, 0xA0, 0xE3, + 0x14, 0xE0, 0x60, 0x04, 0x0A, 0xD3, 0x08, 0x02, + 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, + 0x08, 0xE0, 0x82, 0x01, 0xE0, 0xC2, 0x8A, 0x09, + 0x02, 0x11, 0x60, 0x04, 0xB0, 0xCE, 0xA0, 0x01, + 0x8E, 0x09, 0x00, 0x04, 0x6B, 0x10, 0x20, 0xC8, + 0xAE, 0xE4, 0x86, 0x01, 0x08, 0x02, 0x00, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC2, 0x1E, 0x09, + 0x08, 0xA2, 0x08, 0x05, 0x28, 0xC8, 0x22, 0xE0, + 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xC6, 0x06, + 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x60, 0xE3, + 0x16, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x44, 0xC1, + 0x44, 0x02, 0x00, 0x5E, 0xF8, 0x16, 0x60, 0x25, + 0xA8, 0xE4, 0x0F, 0x16, 0x20, 0x06, 0xC6, 0x06, + 0xF2, 0x16, 0x20, 0x06, 0xCA, 0x06, 0x03, 0x13, + 0xA0, 0x05, 0xCC, 0x06, 0xE6, 0x10, 0xB0, 0x03, + 0x20, 0xD8, 0x0C, 0xE0, 0x65, 0x06, 0x60, 0x04, + 0xD2, 0xCE, 0x20, 0x06, 0xC8, 0x06, 0xE3, 0x16, + 0x20, 0x88, 0x70, 0x09, 0xCC, 0x06, 0x03, 0x16, + 0x83, 0x07, 0x08, 0x00, 0x02, 0x10, 0x83, 0x07, + 0x0C, 0x00, 0x60, 0x04, 0x8A, 0xDC, 0x60, 0x04, + 0xD2, 0xCE, 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x13, + 0x60, 0x23, 0x12, 0xE0, 0x06, 0x16, 0xB0, 0x03, + 0x20, 0xD8, 0xA9, 0xE3, 0x65, 0x06, 0x60, 0x04, + 0xD2, 0xCE, 0x08, 0x02, 0x00, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x60, 0x04, 0xB0, 0xCE, 0x08, 0x02, + 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC8, + 0x1E, 0xE0, 0xC6, 0x06, 0x20, 0xC8, 0x1E, 0xE0, + 0xC8, 0x06, 0x60, 0xE3, 0x10, 0xE0, 0x60, 0x04, + 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 0x30, 0x13, + 0x44, 0xC1, 0x44, 0x02, 0x00, 0x1E, 0xF5, 0x16, + 0x60, 0x25, 0xA8, 0xE4, 0x1D, 0x16, 0x20, 0x06, + 0xC8, 0x06, 0xEF, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x80, 0x13, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0x0C, 0x16, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0xA0, 0x01, 0x8E, 0x09, 0x80, 0x00, + 0xA0, 0x43, 0x04, 0xE0, 0x83, 0x07, 0x18, 0x68, + 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 0xAE, 0xE4, + 0x86, 0x01, 0xC2, 0x04, 0x60, 0x04, 0x2C, 0xE4, + 0x08, 0x02, 0x1E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x07, 0x10, 0x20, 0x06, 0xC6, 0x06, 0xCD, 0x16, + 0x83, 0x07, 0x09, 0x00, 0xA0, 0x06, 0x8A, 0xDC, + 0x60, 0x04, 0xB0, 0xCE, 0xCE, 0x04, 0xE0, 0x04, + 0x2A, 0x09, 0xE0, 0xD3, 0xAA, 0xE3, 0x8F, 0xC2, + 0x20, 0xC8, 0xB0, 0xE4, 0x86, 0x01, 0x20, 0x48, + 0x08, 0xE0, 0x82, 0x01, 0x86, 0x07, 0x05, 0x00, + 0x84, 0x07, 0x72, 0x06, 0x54, 0xC1, 0x01, 0x13, + 0xD4, 0x2C, 0x24, 0x02, 0x0A, 0x00, 0x06, 0x06, + 0xF9, 0x16, 0x08, 0x02, 0x2A, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0x2C, 0x1A, 0xE0, 0x60, 0x04, + 0x50, 0xCD, 0xA0, 0x06, 0x3E, 0xD7, 0xCD, 0x04, + 0xA0, 0x23, 0x1C, 0xE0, 0x0D, 0x13, 0x0E, 0x01, + 0x03, 0x00, 0x0A, 0x13, 0xA0, 0xE3, 0x1C, 0xE0, + 0xB0, 0x03, 0x20, 0xD8, 0x10, 0xE0, 0x65, 0x06, + 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 0x08, 0x10, + 0x20, 0x2D, 0x01, 0x00, 0xE0, 0xC0, 0x2A, 0x09, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0xD2, 0xAB, 0xE3, + 0x60, 0x04, 0xD2, 0xCE, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0x01, 0xE0, 0x01, 0x80, 0x01, 0x00, 0xAC, + 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 0xE0, 0x01, + 0x82, 0x01, 0x00, 0x08, 0x88, 0x07, 0xAE, 0x01, + 0x08, 0x06, 0xFE, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x02, 0x03, 0x16, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 0x80, 0x01, + 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 0x2E, 0x09, + 0xA0, 0x07, 0x9E, 0x09, 0x00, 0x10, 0x5B, 0x04, + 0x20, 0xD8, 0xA6, 0x09, 0x2E, 0x09, 0xE0, 0x01, + 0x80, 0x01, 0x00, 0x04, 0xE0, 0x01, 0x82, 0x01, + 0x00, 0x08, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, + 0x20, 0xC2, 0x30, 0x09, 0x03, 0x13, 0xE0, 0x01, + 0x82, 0x01, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0xA1, 0x20, 0xF8, 0x2E, 0x09, 0x80, 0x01, + 0x88, 0x07, 0xAE, 0x01, 0x08, 0x06, 0xFE, 0x16, + 0xA0, 0x01, 0x80, 0x01, 0x00, 0x0C, 0xE0, 0x04, + 0x9E, 0x01, 0xE0, 0x04, 0x9C, 0x09, 0xE0, 0x04, + 0x9E, 0x09, 0x5B, 0x04, 0x20, 0x01, 0xA8, 0x09, + 0x00, 0x80, 0x11, 0x13, 0xE0, 0x93, 0x26, 0xE0, + 0x0E, 0x16, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x0A, 0x13, 0x08, 0x02, 0x84, 0x80, 0x00, 0x00, + 0x00, 0xE0, 0xDC, 0x0F, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0x48, 0x08, 0xE0, 0x82, 0x01, 0x02, 0x10, + 0x60, 0x04, 0x70, 0xDA, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x19, 0x13, + 0x83, 0x07, 0x80, 0x80, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x13, 0x83, 0x07, 0x0A, 0x00, 0x60, 0x04, + 0xC6, 0xCE, 0x20, 0xC1, 0x06, 0x06, 0x0D, 0x13, + 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x09, 0x13, + 0x83, 0x07, 0x0B, 0x00, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x16, 0x83, 0x07, 0x01, 0x80, 0x60, 0x04, + 0xC6, 0xCE, 0x83, 0x07, 0x0A, 0x80, 0x60, 0x04, + 0xB4, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x06, 0x16, 0xA0, 0x06, 0xA8, 0xE5, 0x47, 0x10, + 0xD0, 0x03, 0x60, 0x04, 0xB0, 0xD3, 0xE0, 0x93, + 0x0E, 0xE0, 0x5E, 0x13, 0xE0, 0x93, 0x10, 0xE0, + 0x17, 0x13, 0xE0, 0x23, 0x14, 0xE0, 0x04, 0x13, + 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 0xC6, 0xCE, + 0x83, 0x07, 0x00, 0xA0, 0xA0, 0x06, 0x2A, 0xD8, + 0x83, 0x07, 0x00, 0x48, 0xA0, 0x06, 0x2A, 0xD8, + 0xA0, 0xD2, 0x10, 0xE0, 0x20, 0xC8, 0x1C, 0xE0, + 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, + 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 0x4E, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0xA0, 0x23, 0x1C, 0xE0, + 0x20, 0x13, 0x20, 0x88, 0x6C, 0x09, 0x0E, 0x07, + 0x1C, 0x16, 0x20, 0x88, 0x6E, 0x09, 0x10, 0x07, + 0x18, 0x16, 0x20, 0x88, 0x70, 0x09, 0x12, 0x07, + 0x14, 0x16, 0x20, 0x88, 0x0A, 0x07, 0x22, 0xE0, + 0x10, 0x13, 0x20, 0x06, 0xCA, 0x06, 0x38, 0x16, + 0xA0, 0xE3, 0x20, 0xE0, 0x06, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0xCA, 0x16, 0xA0, 0xE3, 0x22, 0xE0, + 0xC2, 0x04, 0xA0, 0xD2, 0xAA, 0xE3, 0x60, 0x04, + 0xBA, 0xCE, 0x20, 0xC8, 0x1C, 0xE0, 0xCA, 0x06, + 0xA0, 0x88, 0xDC, 0x06, 0x0E, 0x00, 0x10, 0x16, + 0xA0, 0x88, 0xDE, 0x06, 0x10, 0x00, 0x0C, 0x16, + 0xA0, 0x88, 0xE0, 0x06, 0x12, 0x00, 0x08, 0x16, + 0x20, 0x06, 0xCC, 0x06, 0x19, 0x16, 0x20, 0xE8, + 0x0E, 0xE0, 0x82, 0x01, 0xA0, 0xE3, 0x1E, 0xE0, + 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 0x10, 0x10, + 0xA0, 0x23, 0x10, 0xE0, 0x08, 0x16, 0x64, 0xC1, + 0x06, 0x00, 0x60, 0x21, 0x0C, 0xE0, 0x08, 0x13, + 0xA0, 0xD2, 0xA8, 0xE3, 0x05, 0x10, 0x20, 0x88, + 0x0A, 0x07, 0x08, 0x07, 0x96, 0x12, 0x00, 0x10, + 0x60, 0x04, 0xBA, 0xCE, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x80, 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, + 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, + 0xE0, 0x93, 0x0E, 0xE0, 0x50, 0x13, 0xE0, 0x93, + 0xA9, 0xE3, 0x4D, 0x13, 0xE0, 0x93, 0xA8, 0xE3, + 0x1C, 0x13, 0xA0, 0x06, 0xA4, 0xD7, 0xA0, 0x23, + 0x10, 0xE0, 0x45, 0x13, 0xA0, 0x23, 0x08, 0xE0, + 0x06, 0x16, 0x60, 0xE3, 0x1E, 0xE0, 0x20, 0xC8, + 0x22, 0xE0, 0x06, 0x07, 0x34, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0x31, 0x16, 0x60, 0xC1, 0x6A, 0x09, + 0x60, 0x21, 0x12, 0xE0, 0x2C, 0x16, 0xA0, 0x06, + 0x0E, 0xE2, 0x31, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, + 0x2E, 0x10, 0xA0, 0xE3, 0x12, 0xE0, 0xA0, 0x06, + 0x0E, 0xE2, 0x64, 0xC1, 0x06, 0x00, 0x60, 0x21, + 0x0C, 0xE0, 0x25, 0x13, 0x20, 0x88, 0x0E, 0x07, + 0xDC, 0x06, 0x14, 0x16, 0x20, 0x88, 0x10, 0x07, + 0xDE, 0x06, 0x10, 0x16, 0x20, 0x88, 0x12, 0x07, + 0xE0, 0x06, 0x0C, 0x16, 0x20, 0x98, 0xCE, 0x06, + 0xCF, 0x06, 0x15, 0x13, 0x20, 0x06, 0xCE, 0x06, + 0x12, 0x16, 0x60, 0xE3, 0x1A, 0xE0, 0xA0, 0xD2, + 0x0C, 0xE0, 0x0D, 0x10, 0x60, 0xE3, 0x1E, 0xE0, + 0x20, 0xC8, 0x32, 0xE0, 0x06, 0x07, 0xA0, 0x06, + 0x3E, 0xD7, 0x08, 0x02, 0x48, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0xA0, 0xD2, 0xA9, 0xE3, 0x60, 0x04, + 0xBA, 0xCE, 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, + 0xC9, 0x1A, 0x0B, 0x1B, 0x22, 0x88, 0x10, 0x00, + 0x6E, 0x09, 0xC4, 0x1A, 0x06, 0x1B, 0x22, 0x88, + 0x12, 0x00, 0x70, 0x09, 0xBF, 0x1A, 0x01, 0x1B, + 0x5B, 0x04, 0x60, 0xC1, 0x6C, 0x01, 0x85, 0x02, + 0x43, 0x00, 0xE1, 0x13, 0xE0, 0x93, 0xA8, 0xE3, + 0xDE, 0x16, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, + 0x84, 0x07, 0x0E, 0x00, 0x42, 0xC1, 0xA0, 0xC0, + 0x6C, 0x01, 0x02, 0xC0, 0x25, 0x02, 0x48, 0x00, + 0x81, 0x07, 0x60, 0xE2, 0x83, 0x07, 0x14, 0xAE, + 0x60, 0x04, 0x9E, 0xE5, 0x02, 0x02, 0x00, 0xFC, + 0xCA, 0x10, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 0xA0, 0x06, + 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 0x20, 0x98, + 0x0E, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, + 0xA8, 0xE3, 0x65, 0x06, 0xE0, 0x93, 0xA9, 0xE3, + 0x0D, 0x13, 0xA0, 0x23, 0x08, 0xE0, 0x19, 0x16, + 0xA0, 0x23, 0x10, 0xE0, 0x16, 0x13, 0x60, 0xE3, + 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, + 0xA0, 0x06, 0x3E, 0xD7, 0xA0, 0x43, 0x18, 0xE0, + 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0xD2, 0x26, 0xE0, + 0x83, 0x07, 0x10, 0x00, 0xA0, 0x06, 0x2A, 0xD8, + 0xE0, 0x23, 0x14, 0xE0, 0x02, 0x16, 0xA0, 0x06, + 0x18, 0xD7, 0xA0, 0x43, 0x2C, 0xE0, 0x20, 0xC8, + 0x20, 0xE0, 0x24, 0x09, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x06, 0xA8, 0xE5, 0x01, 0x10, 0x03, 0x10, + 0x20, 0x07, 0xA0, 0x09, 0x03, 0x10, 0xA0, 0x07, + 0xA2, 0x09, 0x19, 0x00, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x43, 0x0E, 0xE0, 0xA0, 0xC1, 0x24, 0x09, + 0x02, 0x13, 0x20, 0x06, 0x24, 0x09, 0xE0, 0x23, + 0x14, 0xE0, 0x03, 0x13, 0xA0, 0x23, 0x08, 0xE0, + 0x29, 0x16, 0x20, 0xC2, 0x8A, 0x09, 0xE4, 0x11, + 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0xA0, 0x23, 0x08, 0xE0, 0x1F, 0x16, 0xA0, 0x23, + 0x10, 0xE0, 0x0A, 0x16, 0x22, 0xC1, 0x02, 0x00, + 0x20, 0x25, 0xA8, 0xE4, 0x23, 0x16, 0x83, 0x07, + 0x20, 0x80, 0xA0, 0x06, 0x2A, 0xD8, 0x12, 0x10, + 0xA0, 0x06, 0x3E, 0xD7, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x16, 0xA0, 0x06, 0x18, 0xD7, 0x60, 0xE3, + 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, + 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x16, 0xA0, 0x23, + 0x06, 0xE0, 0x51, 0x13, 0x20, 0x98, 0x0E, 0xE0, + 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 0xA8, 0xE3, + 0x65, 0x06, 0x22, 0xC1, 0x02, 0x00, 0x20, 0x25, + 0xA8, 0xE4, 0x0E, 0x13, 0x83, 0x07, 0x20, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0x22, 0xC8, 0x0E, 0x00, + 0xE6, 0x06, 0x22, 0xC8, 0x10, 0x00, 0xE8, 0x06, + 0x22, 0xC8, 0x12, 0x00, 0xEA, 0x06, 0x37, 0x10, + 0x22, 0x88, 0x0E, 0x00, 0xDC, 0x06, 0x08, 0x16, + 0x22, 0x88, 0x10, 0x00, 0xDE, 0x06, 0x04, 0x16, + 0x22, 0x88, 0x12, 0x00, 0xE0, 0x06, 0x0B, 0x13, + 0x22, 0xC8, 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, + 0x10, 0x00, 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, + 0xE0, 0x06, 0x60, 0xE3, 0x14, 0xE0, 0xA0, 0x23, + 0x0E, 0xE0, 0x08, 0x16, 0xA0, 0xC1, 0x24, 0x09, + 0x1A, 0x16, 0x86, 0x07, 0x00, 0x10, 0x06, 0xE8, + 0xD2, 0x06, 0x15, 0x10, 0xA0, 0xE3, 0x0E, 0xE0, + 0xA0, 0x23, 0x08, 0xE0, 0x09, 0x16, 0xA0, 0xE3, + 0x06, 0xE0, 0xE0, 0x04, 0xE6, 0x06, 0xE0, 0x04, + 0xE8, 0x06, 0xE0, 0x04, 0xEA, 0x06, 0x07, 0x10, + 0x08, 0x02, 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, + 0x36, 0xD3, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, + 0xBA, 0xCE, 0x20, 0x98, 0x65, 0x06, 0x10, 0xE0, + 0x03, 0x16, 0x20, 0xD8, 0x0E, 0xE0, 0x65, 0x06, + 0x60, 0x04, 0xBA, 0xCE, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 0x2E, 0x10, + 0xB0, 0x03, 0x20, 0x98, 0xA9, 0xE3, 0x6F, 0x06, + 0x19, 0x16, 0x24, 0xC2, 0x08, 0x00, 0x16, 0x11, + 0xE0, 0xE3, 0x14, 0xE0, 0x83, 0x07, 0x00, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x23, 0x14, 0xE0, + 0x04, 0x13, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x08, 0x02, 0x1E, 0x00, 0xA0, 0x06, + 0xDA, 0xD4, 0xA0, 0x23, 0x08, 0xE0, 0x02, 0x13, + 0xA0, 0x06, 0x18, 0xD7, 0x82, 0xC0, 0x02, 0x16, + 0x60, 0x04, 0xD2, 0xCE, 0x20, 0xE8, 0x1C, 0xEE, + 0xF0, 0x06, 0x20, 0x99, 0x0E, 0xE0, 0x16, 0x00, + 0x05, 0x16, 0xE0, 0x04, 0xEC, 0x06, 0x20, 0x48, + 0x14, 0xE0, 0xF0, 0x06, 0x83, 0x07, 0x01, 0x00, + 0x60, 0x04, 0xB4, 0xCE, 0x64, 0xC2, 0x14, 0x00, + 0x24, 0x02, 0x18, 0x00, 0xC4, 0xC1, 0xC2, 0x61, + 0x27, 0x02, 0xFC, 0xFF, 0x74, 0xC1, 0x85, 0xC1, + 0x45, 0x71, 0x85, 0x02, 0x27, 0x00, 0x46, 0x16, + 0x54, 0xC1, 0x45, 0x02, 0xCF, 0xFF, 0x42, 0x16, + 0xC8, 0x04, 0x64, 0xC1, 0x08, 0x00, 0x06, 0x15, + 0x05, 0x13, 0x24, 0xC2, 0x0E, 0x00, 0x48, 0x02, + 0x00, 0x1F, 0xC8, 0x06, 0x28, 0x02, 0x11, 0x00, + 0x04, 0xA2, 0x18, 0x98, 0x21, 0xEE, 0x32, 0x16, + 0x42, 0xC1, 0x25, 0x02, 0x04, 0x00, 0x47, 0x65, + 0x35, 0xC2, 0x74, 0xCD, 0x48, 0x06, 0xFD, 0x15, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC1, 0x04, 0xC8, + 0x6C, 0x01, 0xA0, 0xC1, 0x00, 0xFC, 0x05, 0x13, + 0x20, 0xC8, 0x80, 0xEB, 0x02, 0xFC, 0x06, 0xC1, + 0xF6, 0x10, 0x20, 0xC8, 0x00, 0xEE, 0x02, 0xFC, + 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x07, 0x08, 0xE5, + 0x04, 0xC0, 0x83, 0x07, 0x10, 0x02, 0x84, 0x07, + 0x0E, 0x00, 0x3B, 0x10, 0x84, 0x07, 0x0C, 0x00, + 0xE2, 0xC0, 0x08, 0x00, 0x05, 0x02, 0x00, 0xFC, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x95, 0xC1, + 0x30, 0x13, 0xD5, 0x04, 0x16, 0x2E, 0x02, 0xC8, + 0x6C, 0x01, 0x2B, 0x10, 0xA0, 0xC8, 0x22, 0xEE, + 0x0E, 0x00, 0xA0, 0xC8, 0x24, 0xEE, 0x10, 0x00, + 0xA0, 0xC8, 0x26, 0xEE, 0x12, 0x00, 0x83, 0x07, + 0x06, 0x80, 0x60, 0x04, 0xB4, 0xCE, 0x60, 0x04, + 0xD2, 0xCE, 0x84, 0x07, 0x10, 0x00, 0x85, 0x07, + 0x34, 0x00, 0x09, 0x10, 0x84, 0x07, 0x12, 0x00, + 0x85, 0x07, 0x32, 0x00, 0x04, 0x10, 0x84, 0x07, + 0x14, 0x00, 0x85, 0x07, 0x38, 0x00, 0xA0, 0x06, + 0xC2, 0xD5, 0x85, 0xC8, 0x04, 0x00, 0xA0, 0x06, + 0x10, 0xD6, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x48, 0x06, + 0x48, 0xC1, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, + 0xA2, 0x06, 0x60, 0xC5, 0x02, 0xFC, 0x25, 0x02, + 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 0x20, 0xC2, + 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 0x60, 0x04, + 0xB0, 0xCE, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, + 0xB4, 0x06, 0xEF, 0x10, 0x22, 0x88, 0x12, 0x00, + 0x70, 0x09, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, + 0x6E, 0x09, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, + 0x6C, 0x09, 0x0E, 0x13, 0x22, 0x88, 0x12, 0x00, + 0xE0, 0x06, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, + 0xDE, 0x06, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, + 0xDC, 0x06, 0x01, 0x13, 0xCB, 0x05, 0xCB, 0x05, + 0x5B, 0x04, 0x0B, 0xC3, 0x00, 0x03, 0x02, 0x00, + 0x82, 0x07, 0xC0, 0x00, 0x20, 0xC8, 0x0C, 0x00, + 0xC0, 0x00, 0x20, 0xC8, 0x0E, 0x00, 0xC2, 0x00, + 0x20, 0xC8, 0x10, 0x00, 0xC4, 0x00, 0x20, 0xC8, + 0x12, 0x00, 0xC6, 0x00, 0x20, 0xC8, 0x14, 0x00, + 0xC8, 0x00, 0x20, 0xC8, 0x16, 0x00, 0xCA, 0x00, + 0x20, 0xC8, 0x04, 0x00, 0xCC, 0x00, 0x20, 0xC8, + 0x06, 0x00, 0xCE, 0x00, 0x02, 0xC8, 0x0C, 0x00, + 0xA0, 0x07, 0x0E, 0x00, 0x7E, 0xE6, 0x02, 0xC8, + 0x10, 0x00, 0xA0, 0x07, 0x12, 0x00, 0x88, 0xE6, + 0x02, 0xC8, 0x14, 0x00, 0xA0, 0x07, 0x16, 0x00, + 0xB8, 0xE6, 0x02, 0xC8, 0x04, 0x00, 0xA0, 0x07, + 0x06, 0x00, 0xCE, 0xE6, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x09, 0x16, 0xE0, 0x01, 0x40, 0x01, + 0x00, 0x08, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xA0, 0x06, + 0x8E, 0xE9, 0x05, 0x02, 0x00, 0x80, 0x05, 0xD8, + 0x80, 0x04, 0xC7, 0x04, 0x00, 0x03, 0x0F, 0x00, + 0x88, 0x07, 0x00, 0x10, 0x09, 0x02, 0x00, 0x20, + 0x8A, 0x07, 0xE6, 0xE6, 0x03, 0x02, 0x3E, 0xE6, + 0x5A, 0x04, 0x00, 0x03, 0x00, 0x00, 0x20, 0xD2, + 0x87, 0x01, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, + 0x20, 0xC2, 0x8A, 0x01, 0x08, 0x02, 0x00, 0x1A, + 0x60, 0xC2, 0xAE, 0x00, 0x48, 0xDA, 0x80, 0x04, + 0x89, 0x05, 0x89, 0x02, 0x06, 0x00, 0x07, 0x15, + 0x88, 0x07, 0x00, 0x80, 0x48, 0xDA, 0x80, 0x04, + 0x09, 0xC8, 0xAE, 0x00, 0x80, 0x03, 0xE0, 0x02, + 0xA0, 0x00, 0x5C, 0x04, 0x00, 0x03, 0x00, 0x00, + 0x60, 0x01, 0x9C, 0x01, 0x20, 0x00, 0xE2, 0x13, + 0x20, 0xC2, 0x8C, 0x01, 0x08, 0x02, 0x00, 0x1C, + 0xE3, 0x10, 0x00, 0x03, 0x00, 0x00, 0x60, 0x01, + 0x40, 0x01, 0x00, 0x40, 0xEC, 0x16, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x40, 0x08, 0x02, 0x00, 0x02, + 0xD7, 0x10, 0xB3, 0xC0, 0x92, 0x06, 0xFD, 0x10, + 0xB3, 0xC0, 0x48, 0xC0, 0x72, 0xCC, 0x72, 0xCC, + 0x32, 0xC1, 0x44, 0xCC, 0x72, 0xDC, 0x04, 0x06, + 0xFD, 0x16, 0x5B, 0x04, 0x48, 0xC0, 0x02, 0x02, + 0xD0, 0xE9, 0x84, 0x07, 0x06, 0x00, 0xF6, 0x10, + 0x02, 0x02, 0x1E, 0xE6, 0x49, 0xC0, 0x84, 0x07, + 0x06, 0x00, 0xF0, 0x10, 0xB3, 0xC0, 0x32, 0xC1, + 0x01, 0x02, 0x01, 0x00, 0x44, 0xD0, 0xC1, 0x06, + 0x44, 0x02, 0xFF, 0x00, 0xE7, 0x10, 0x33, 0xC1, + 0x73, 0xC0, 0x44, 0xD1, 0x44, 0x02, 0xFF, 0x00, + 0x45, 0xDC, 0x04, 0x06, 0xFD, 0x16, 0x5A, 0x04, + 0xA0, 0x06, 0x0E, 0xE9, 0x33, 0xC8, 0x9E, 0x01, + 0x5A, 0x04, 0xA0, 0x06, 0x0C, 0xE7, 0x89, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 0x66, 0x02, + 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 0xC2, 0x04, + 0xC7, 0xC1, 0x03, 0x16, 0x02, 0x06, 0xFC, 0x16, + 0x4D, 0x10, 0x5A, 0x04, 0xA0, 0x06, 0x58, 0xE8, + 0x89, 0xC1, 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, + 0x06, 0xC8, 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, + 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, + 0x33, 0xC8, 0x9E, 0x01, 0xE8, 0x10, 0x33, 0x8A, + 0x02, 0x00, 0x38, 0x16, 0x73, 0x8A, 0x02, 0x00, + 0x35, 0x16, 0x5A, 0x04, 0x20, 0x8A, 0xCA, 0xE9, + 0x02, 0x00, 0x30, 0x16, 0x60, 0x8A, 0xCE, 0xE9, + 0x02, 0x00, 0x2C, 0x16, 0x82, 0x07, 0x74, 0xEA, + 0x01, 0x10, 0xB3, 0xC0, 0x04, 0x02, 0x80, 0x04, + 0x52, 0xD1, 0x03, 0x13, 0x32, 0x9D, 0x22, 0x16, + 0xFB, 0x10, 0x85, 0x07, 0x00, 0x80, 0x05, 0xD8, + 0x80, 0x04, 0xC7, 0x04, 0x5A, 0x04, 0x20, 0xC8, + 0xC0, 0x00, 0x0C, 0x00, 0x20, 0xC8, 0xC2, 0x00, + 0x0E, 0x00, 0x20, 0xC8, 0xC4, 0x00, 0x10, 0x00, + 0x20, 0xC8, 0xC6, 0x00, 0x12, 0x00, 0x20, 0xC8, + 0xC8, 0x00, 0x14, 0x00, 0x20, 0xC8, 0xCA, 0x00, + 0x16, 0x00, 0x20, 0xC8, 0xCC, 0x00, 0x04, 0x00, + 0x20, 0xC8, 0xCE, 0x00, 0x06, 0x00, 0x00, 0x03, + 0x0F, 0x00, 0xCC, 0x05, 0x5C, 0x04, 0xE0, 0x04, + 0x82, 0x01, 0x02, 0x02, 0x18, 0xE6, 0x32, 0xC8, + 0x82, 0x01, 0x32, 0xC8, 0x80, 0x01, 0xA0, 0x06, + 0x24, 0xE8, 0x12, 0xC8, 0x82, 0x01, 0xCA, 0xC2, + 0x84, 0x07, 0xD0, 0x07, 0xE0, 0x04, 0x84, 0x01, + 0x04, 0x06, 0xFC, 0x16, 0x20, 0xC1, 0x84, 0x01, + 0xE9, 0x16, 0x04, 0x02, 0x32, 0x00, 0x85, 0x07, + 0x00, 0x80, 0x05, 0xD8, 0x80, 0x04, 0xC7, 0x04, + 0x60, 0xC1, 0x86, 0x01, 0x04, 0x06, 0xFC, 0x16, + 0x20, 0xC1, 0x84, 0x01, 0x5B, 0x04, 0xB3, 0xC0, + 0xB3, 0xC4, 0x5B, 0x04, 0x48, 0xC0, 0xB3, 0xC0, + 0x73, 0xA0, 0x42, 0xC4, 0x5B, 0x04, 0x33, 0x88, + 0x84, 0x01, 0xE6, 0x16, 0x5A, 0x04, 0x89, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0xC5, 0x04, 0xA0, 0x07, + 0x9C, 0x01, 0x40, 0x00, 0x60, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0x03, 0x13, 0x05, 0x06, 0xF7, 0x16, + 0x5C, 0x04, 0x5B, 0x04, 0xA0, 0x06, 0xAC, 0xE8, + 0x60, 0xC0, 0x40, 0x01, 0x05, 0xC8, 0x40, 0x01, + 0x02, 0xC5, 0x01, 0xC8, 0x40, 0x01, 0x5A, 0x04, + 0xA0, 0x06, 0xAC, 0xE8, 0x08, 0xA1, 0xF4, 0x10, + 0xB3, 0xC0, 0x33, 0xC1, 0x60, 0xC1, 0x40, 0x01, + 0x85, 0x01, 0x00, 0x04, 0xC5, 0x01, 0x00, 0x10, + 0x5B, 0x04, 0x08, 0xC1, 0x09, 0xC2, 0x44, 0xC2, + 0x5B, 0x04, 0x05, 0x02, 0xC8, 0x00, 0x05, 0x06, + 0xFE, 0x16, 0x5B, 0x04, 0x33, 0xC1, 0x03, 0xC0, + 0xC4, 0xC0, 0x5B, 0x04, 0xC0, 0xC0, 0x5B, 0x04, + 0xE0, 0x94, 0x9E, 0x01, 0xC2, 0x16, 0xC3, 0x05, + 0x5B, 0x04, 0x73, 0xC0, 0xA0, 0x06, 0x26, 0xE9, + 0x2D, 0x02, 0x08, 0x00, 0x85, 0x07, 0x08, 0x00, + 0x71, 0x9F, 0xB7, 0x16, 0x05, 0x06, 0xFC, 0x16, + 0x5A, 0x04, 0x02, 0x02, 0x24, 0xE6, 0x60, 0x04, + 0x10, 0xE7, 0xE9, 0x8C, 0x04, 0x00, 0xAD, 0x16, + 0x5B, 0x04, 0x20, 0xC1, 0x80, 0x01, 0x85, 0x07, + 0xD0, 0x07, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x04, + 0x45, 0x06, 0xFE, 0x16, 0x04, 0xC8, 0x80, 0x01, + 0x5B, 0x04, 0x33, 0xC1, 0x48, 0xC3, 0x04, 0xC1, + 0x04, 0x13, 0x2D, 0x02, 0x00, 0x04, 0x04, 0x06, + 0xFC, 0x16, 0x5B, 0x04, 0x8D, 0xC3, 0xA0, 0x06, + 0x26, 0xE9, 0x8D, 0xC1, 0xA6, 0x09, 0x66, 0x02, + 0x40, 0x00, 0x86, 0xC7, 0x5A, 0x04, 0x8D, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0x8D, 0xC1, 0xA6, 0x09, + 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, + 0x5B, 0x04, 0x4D, 0xC0, 0x04, 0x02, 0x28, 0x00, + 0x85, 0x07, 0x00, 0x55, 0x60, 0x04, 0x34, 0xE7, + 0x4D, 0xC0, 0xB3, 0xC0, 0x32, 0xC1, 0x60, 0x04, + 0xF8, 0xE6, 0x33, 0xC1, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x01, 0x16, 0x5B, 0x04, 0xC4, 0xC0, + 0x5B, 0x04, 0x89, 0x07, 0x66, 0xE5, 0x39, 0xC2, + 0x07, 0x13, 0x39, 0xC6, 0x39, 0x86, 0x25, 0x16, + 0x39, 0xC6, 0x39, 0x86, 0x22, 0x16, 0xF7, 0x10, + 0x02, 0x02, 0xAC, 0xE9, 0xC4, 0x04, 0xC5, 0x04, + 0x39, 0xC2, 0x02, 0x13, 0x60, 0x04, 0xE8, 0xE9, + 0x02, 0x02, 0xBA, 0xE9, 0xC4, 0x04, 0x39, 0xC2, + 0x03, 0x13, 0x79, 0xC1, 0x60, 0x04, 0xE8, 0xE9, + 0x02, 0x02, 0xCA, 0xE9, 0xC5, 0x04, 0x39, 0xC2, + 0x03, 0x13, 0x39, 0xC1, 0x60, 0x04, 0xE8, 0xE9, + 0x79, 0xC0, 0xB9, 0xC0, 0x81, 0x60, 0xC2, 0x05, + 0x12, 0x09, 0xF1, 0x04, 0x02, 0x06, 0xFD, 0x16, + 0x5B, 0x04, 0x5C, 0x04, 0x01, 0x02, 0xAA, 0xAA, + 0x01, 0xC6, 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, + 0xF8, 0x16, 0x01, 0x02, 0x14, 0x00, 0x01, 0x06, + 0xFE, 0x16, 0x01, 0x02, 0x55, 0x55, 0x01, 0xC6, + 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 0xED, 0x16, + 0x52, 0x04, 0xE0, 0x02, 0xA0, 0x00, 0x88, 0x07, + 0xC0, 0x00, 0x09, 0x02, 0x62, 0xEA, 0x84, 0x07, + 0x2A, 0xE6, 0x05, 0x02, 0x01, 0x00, 0x8B, 0xC2, + 0xCC, 0x04, 0xA0, 0x06, 0x6C, 0xEA, 0x60, 0x2C, + 0x01, 0x00, 0x99, 0x06, 0xA0, 0x2C, 0x02, 0x00, + 0x99, 0x06, 0x20, 0x2D, 0x04, 0x00, 0x99, 0x06, + 0x20, 0x2E, 0x08, 0x00, 0x99, 0x06, 0xA0, 0x2F, + 0x10, 0x00, 0x8C, 0x05, 0x09, 0x16, 0x80, 0xCC, + 0x81, 0xC4, 0x83, 0x07, 0xB0, 0xEA, 0x88, 0xC0, + 0x02, 0x04, 0x8C, 0x05, 0x01, 0x16, 0x33, 0x10, + 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x8C, 0x05, + 0xFB, 0x16, 0x80, 0xCC, 0x81, 0xC4, 0x15, 0x0A, + 0xB4, 0xC0, 0x12, 0xC0, 0x88, 0xCC, 0x52, 0xC0, + 0xB4, 0xC4, 0x42, 0x06, 0x5B, 0x04, 0x2D, 0x07, + 0x18, 0x00, 0x41, 0x8B, 0x0A, 0x00, 0xEC, 0x16, + 0xC1, 0x82, 0xEA, 0x16, 0xC2, 0x02, 0x42, 0x02, + 0x00, 0x02, 0xE6, 0x16, 0x80, 0x03, 0x81, 0x07, + 0x01, 0x00, 0xF1, 0x10, 0x01, 0x02, 0x02, 0x00, + 0xEE, 0x10, 0x01, 0x02, 0x04, 0x00, 0xEB, 0x10, + 0x01, 0x02, 0x08, 0x00, 0xE8, 0x10, 0x01, 0x02, + 0x10, 0x00, 0xE5, 0x10, 0xA1, 0x02, 0x41, 0x8B, + 0x10, 0x00, 0x02, 0x13, 0x60, 0x04, 0x5C, 0xEA, + 0x2D, 0x07, 0x18, 0x00, 0x80, 0x03, 0x09, 0x02, + 0x00, 0x08, 0x03, 0x02, 0x04, 0x00, 0xC7, 0x04, + 0xA0, 0x06, 0xDC, 0xEB, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x1C, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x08, 0xE0, 0x01, 0x40, 0x01, 0x00, 0x10, + 0x04, 0x02, 0x01, 0x00, 0x44, 0xCE, 0xC4, 0x06, + 0x44, 0xC6, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x10, + 0x49, 0x06, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x08, 0xA0, 0x06, 0x7A, 0xEC, + 0xA0, 0x06, 0x7A, 0xEC, 0xC7, 0x05, 0x04, 0x02, + 0xE4, 0xE4, 0xE0, 0x04, 0xD0, 0x03, 0x74, 0xC1, + 0xB4, 0xC1, 0x86, 0x05, 0x1C, 0x13, 0xE0, 0x02, + 0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0xC0, + 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0x40, 0xC1, + 0x80, 0xC1, 0xC0, 0xC1, 0x00, 0xC2, 0x40, 0xC2, + 0x80, 0xC2, 0xC0, 0xC2, 0x00, 0xC3, 0x40, 0xC3, + 0x80, 0xC3, 0xC0, 0xC3, 0xA0, 0x04, 0xAA, 0x00, + 0xD0, 0x03, 0xD0, 0x03, 0x3F, 0x10, 0x85, 0x05, + 0x85, 0x81, 0xE1, 0x13, 0xE4, 0x10, 0xC7, 0x05, + 0x05, 0x02, 0xFF, 0x7F, 0x45, 0xA1, 0xD0, 0x03, + 0xD0, 0x03, 0x34, 0x10, 0xC0, 0xCC, 0xC1, 0xC4, + 0x03, 0x02, 0x28, 0x00, 0xA0, 0x06, 0xDC, 0xEB, + 0xE0, 0x01, 0x42, 0x01, 0x00, 0x10, 0xC7, 0x05, + 0xD0, 0x03, 0xD0, 0x03, 0x27, 0x10, 0xC7, 0x05, + 0xA0, 0xC1, 0x4A, 0x01, 0xA0, 0x07, 0x4A, 0x01, + 0x00, 0x0E, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x02, + 0x20, 0x07, 0x44, 0x01, 0x60, 0xC1, 0x44, 0x01, + 0x85, 0x02, 0x00, 0xFF, 0x17, 0x16, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x22, 0x05, 0x02, 0xC0, 0x00, + 0x05, 0x06, 0xD0, 0x03, 0xFD, 0x16, 0x60, 0xC1, + 0x46, 0x01, 0x85, 0x02, 0x00, 0xFF, 0x0A, 0x13, + 0x05, 0x02, 0x93, 0x33, 0x05, 0x06, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0xD0, 0x03, 0xF8, 0x16, 0x51, 0x10, 0x06, 0xC8, + 0x4A, 0x01, 0xC0, 0xCC, 0xC1, 0xC4, 0x4B, 0x10, + 0x13, 0xC0, 0xC8, 0xCC, 0x53, 0xC0, 0x02, 0x02, + 0xEC, 0xEB, 0xC2, 0xC4, 0x43, 0x06, 0x5B, 0x04, + 0x60, 0xC0, 0xAE, 0x00, 0xC4, 0x02, 0x44, 0x02, + 0x0F, 0x00, 0x44, 0x88, 0xCA, 0xE4, 0x3C, 0x16, + 0x81, 0x02, 0x08, 0x00, 0x27, 0x13, 0x21, 0xC1, + 0xDC, 0xE4, 0x14, 0xC1, 0x21, 0x21, 0xBA, 0xE4, + 0x33, 0x16, 0x21, 0xC1, 0xC2, 0xE4, 0x81, 0x02, + 0x00, 0x00, 0x0B, 0x13, 0x0D, 0x02, 0xA0, 0x00, + 0x84, 0x83, 0x09, 0x13, 0xC4, 0x05, 0x84, 0x83, + 0x06, 0x13, 0xC4, 0x05, 0x84, 0x83, 0x03, 0x13, + 0x23, 0x10, 0x0E, 0x81, 0x21, 0x16, 0x21, 0xC1, + 0xDC, 0xE4, 0x21, 0x45, 0xBA, 0xE4, 0xE0, 0x01, + 0x42, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, + 0x00, 0x10, 0xA1, 0xC3, 0xD4, 0xE4, 0x0F, 0x02, + 0x2F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x02, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, + 0x6D, 0xC0, 0x0A, 0x00, 0x09, 0x13, 0x81, 0x02, + 0x5C, 0x12, 0x06, 0x1B, 0x0E, 0x02, 0xD2, 0xEB, + 0x0F, 0x02, 0x0F, 0x00, 0x80, 0x03, 0xCA, 0x05, + 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x59, 0xCE, + 0x20, 0x88, 0xE4, 0xE4, 0xE4, 0xE4, 0xF8, 0x10, + 0xC1, 0x04, 0x48, 0x62, 0x89, 0x05, 0xA0, 0xC0, + 0x6C, 0x01, 0x08, 0xC8, 0x6C, 0x01, 0x03, 0x02, + 0x00, 0xFC, 0x04, 0x02, 0x00, 0x02, 0x73, 0xA0, + 0x04, 0x06, 0xFD, 0x16, 0x88, 0x05, 0x09, 0x06, + 0xF4, 0x16, 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x86, + 0x02, 0x16, 0xD0, 0x03, 0xCB, 0x05, 0x5B, 0x04, + 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, + 0x38, 0x38, 0x42, 0x20, 0x20, 0x59, 0x49, 0x54, + 0x4B, 0xC2, 0xA8, 0x02, 0x98, 0x00, 0x83, 0x07, + 0x02, 0x00, 0x28, 0x02, 0x08, 0x00, 0x23, 0xC6, + 0x36, 0xE5, 0x48, 0x06, 0xC4, 0xC0, 0x73, 0x0A, + 0x65, 0x17, 0xA0, 0x06, 0xAA, 0xED, 0xC8, 0xC1, + 0xC7, 0x05, 0x03, 0x02, 0xA5, 0x00, 0xB0, 0x03, + 0xF8, 0xCD, 0xF8, 0xCD, 0xA6, 0x02, 0x06, 0x62, + 0x88, 0x02, 0x0A, 0x00, 0x57, 0x16, 0x03, 0x29, + 0x55, 0x16, 0x05, 0x29, 0xC4, 0x80, 0x52, 0x16, + 0x15, 0x09, 0x50, 0x17, 0x15, 0x09, 0x4E, 0x18, + 0x85, 0x02, 0x29, 0x00, 0x4B, 0x16, 0xC6, 0x05, + 0x96, 0x00, 0x03, 0x07, 0xC4, 0x04, 0x45, 0x06, + 0x95, 0x00, 0x44, 0x05, 0x43, 0x16, 0x44, 0x81, + 0x41, 0x16, 0x00, 0x03, 0x05, 0x00, 0xC4, 0x02, + 0x00, 0x03, 0x0A, 0x00, 0x44, 0x02, 0x0F, 0x00, + 0x84, 0x02, 0x05, 0x00, 0x37, 0x16, 0xC4, 0x02, + 0x00, 0x03, 0x0F, 0x00, 0x44, 0x02, 0x0F, 0x00, + 0x84, 0x02, 0x0A, 0x00, 0x2F, 0x16, 0x04, 0x02, + 0xFE, 0xFF, 0x2C, 0x13, 0x2B, 0x15, 0x2A, 0x1A, + 0x84, 0x05, 0x28, 0x12, 0x27, 0x15, 0x26, 0x1A, + 0x25, 0x18, 0x84, 0x05, 0x23, 0x16, 0x22, 0x1B, + 0x21, 0x17, 0x84, 0x05, 0x1F, 0x13, 0x1E, 0x1A, + 0x1D, 0x11, 0x04, 0x06, 0x1B, 0x16, 0xA5, 0x02, + 0xC5, 0xC1, 0x25, 0x02, 0x06, 0x00, 0x03, 0x02, + 0xA5, 0xA5, 0x83, 0xC1, 0x95, 0x00, 0x03, 0x38, + 0x94, 0x00, 0x83, 0x02, 0x2E, 0x6B, 0x0E, 0x16, + 0x84, 0x02, 0x59, 0x1C, 0x0B, 0x16, 0x24, 0x02, + 0x69, 0x00, 0x95, 0x00, 0x03, 0x3C, 0x94, 0x00, + 0x83, 0x81, 0x04, 0x16, 0x84, 0x02, 0x69, 0x00, + 0x01, 0x16, 0xC9, 0x05, 0x59, 0x04, 0xC3, 0xD0, + 0xFD, 0x13, 0x01, 0x1C, 0xFB, 0x10, 0xE0, 0x90, + 0x3D, 0xE5, 0xF8, 0x16, 0xC3, 0x06, 0xC3, 0xD0, + 0xF5, 0x1C, 0xF4, 0x16, 0xE0, 0x90, 0x3A, 0xE5, + 0xF1, 0x16, 0x5B, 0x04, 0x0B, 0xC3, 0x09, 0x02, + 0x3E, 0xE5, 0xA0, 0x06, 0x92, 0xE9, 0xCC, 0x05, + 0x5C, 0x04, 0x88, 0x07, 0x00, 0xA0, 0x89, 0x07, + 0xFE, 0xFF, 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, + 0x02, 0xE0, 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, + 0x88, 0x07, 0x00, 0x90, 0x89, 0x07, 0xFE, 0x9F, + 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 0x78, 0xE0, + 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 0xA0, 0x06, + 0xC4, 0xEC, 0x00, 0x00, 0xE6, 0x10, 0xE5, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x08, 0x11, 0xE3, 0x6C, 0xCC, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, + 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0xF0, 0xFF, 0x00, 0xF0, 0x0F, 0x00, + 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00, + 0xC3, 0x00, 0xE7, 0xE7, 0xF3, 0xE7, 0xF1, 0xF1, + 0x43, 0x28, 0x20, 0x29, 0x4F, 0x43, 0x59, 0x50, + 0x49, 0x52, 0x48, 0x47, 0x20, 0x54, 0x42, 0x49, + 0x20, 0x4D, 0x39, 0x31, 0x33, 0x38, 0x34, 0x2C, + 0x35, 0x2C, 0x36, 0x2C, 0x43, 0x28, 0x20, 0x29, + 0x4F, 0x43, 0x59, 0x50, 0x49, 0x52, 0x48, 0x47, + 0x20, 0x54, 0x49, 0x54, 0x31, 0x20, 0x38, 0x39, + 0x2D, 0x33, 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, + 0x38, 0x39, 0x00, 0x00, 0x61, 0x9B, 0xC4, 0xEC, + 0x0E, 0xEA, 0xDE, 0xE5, 0xC8, 0xED, 0x00, 0x00, + 0xC4, 0x00, 0xB8, 0xAF, 0x4A, 0x06, 0x50, 0x06, + 0x4C, 0x06, 0xDC, 0xCC, 0x4E, 0x06, 0x0F, 0x00, + 0x32, 0x06, 0x01, 0x00, 0x50, 0x07, 0x58, 0x07, + 0x52, 0x07, 0x70, 0xB5, 0x54, 0x07, 0x0F, 0x00, + 0x38, 0x07, 0x01, 0x00, 0xBA, 0x00, 0xA0, 0x00, + 0xBC, 0x00, 0xD6, 0xED, 0xBE, 0x00, 0x0F, 0x00, + 0x5E, 0x07, 0x3A, 0x07, 0x62, 0x07, 0x40, 0x80, + 0x64, 0x07, 0x54, 0xBA, 0x66, 0x07, 0x36, 0xBA, + 0x68, 0x07, 0x40, 0xB8, 0x98, 0x07, 0x00, 0x80, + 0x78, 0x07, 0x00, 0x80, 0xE2, 0x08, 0x04, 0x00, + 0xE4, 0x08, 0x01, 0x00, 0xEC, 0x08, 0x08, 0x00, + 0xF6, 0x08, 0x0A, 0x00, 0xF8, 0x08, 0x06, 0x00, + 0x00, 0x09, 0x0C, 0x00, 0x02, 0x09, 0x04, 0x00, + 0xAE, 0x01, 0x00, 0x00, 0x1E, 0x09, 0x00, 0x00, + 0x66, 0x09, 0x00, 0x00, 0x0C, 0x06, 0x13, 0x00, + 0x0A, 0x06, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0xE6, 0xA2, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x02, 0xA5, 0xE0, 0x00, + 0x5E, 0xA6, 0xE0, 0x00, 0x66, 0xA9, 0xE0, 0x00, + 0x12, 0xA4, 0xC0, 0x00, 0x22, 0xA4, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, + 0x74, 0xA4, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, + 0xDE, 0xAF, 0xC0, 0x00, 0x48, 0xB0, 0xC0, 0x00, + 0x84, 0xB0, 0xC0, 0x00, 0xF4, 0xB0, 0xC0, 0x00, + 0x76, 0xB1, 0xE0, 0x00, 0xE4, 0xB2, 0xE0, 0x00, + 0x8A, 0xB2, 0xE0, 0x00, 0xF4, 0xB3, 0xE0, 0x00, + 0x7C, 0xB3, 0xE0, 0x00, 0xC6, 0xAA, 0xC0, 0x00, + 0x36, 0xAB, 0xC0, 0x00, 0x90, 0xAB, 0xC0, 0x00, + 0xC2, 0xAB, 0xC0, 0x00, 0xEA, 0xAA, 0xC0, 0x00, + 0x80, 0xA3, 0xC0, 0x00, 0x80, 0xA3, 0x00, 0x3F, + 0x00, 0x7F, 0x00, 0x5E, 0x30, 0x00, 0x28, 0x00, + 0x43, 0x00, 0xB6, 0xA6, 0xB6, 0xA6, 0x1C, 0xA5, + 0x14, 0xA5, 0x46, 0xA5, 0x46, 0xA5, 0x62, 0xA5, + 0xB6, 0xA6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x0E, 0x10, 0x0C, 0x0C, 0x0A, 0x0A, + 0x0A, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x98, 0x07, 0x7E, 0xCA, 0x58, 0x07, + 0xF8, 0xB8, 0x58, 0x07, 0xFE, 0xB7, 0x58, 0x07, + 0x68, 0xB9, 0x58, 0x07, 0xD0, 0xB8, 0x98, 0x07, + 0x5A, 0xC7, 0x98, 0x07, 0x52, 0xC7, 0x78, 0x07, + 0xC2, 0xC1, 0x58, 0x07, 0x30, 0xB9, 0x98, 0x07, + 0x38, 0xCA, 0x78, 0x07, 0x96, 0xC2, 0x58, 0x07, + 0x6A, 0xC7, 0x58, 0x07, 0xE0, 0xB8, 0x58, 0x07, + 0x1E, 0xB9, 0x58, 0x07, 0xE2, 0xB9, 0x98, 0x07, + 0xAE, 0xCB, 0x98, 0x07, 0x8E, 0xC7, 0x78, 0x07, + 0x56, 0xC2, 0xB8, 0x07, 0x14, 0xCC, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xA2, 0xBA, 0x16, 0xC1, + 0xCA, 0xC1, 0xD6, 0xC6, 0x8A, 0xBD, 0xC2, 0xBD, + 0xE0, 0xBD, 0x6A, 0xBE, 0x8E, 0xBE, 0xAA, 0xBE, + 0x22, 0xBF, 0x22, 0xBF, 0x56, 0xBE, 0xC8, 0xBF, + 0x10, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, + 0x00, 0x0C, 0x01, 0x0F, 0xFF, 0xFE, 0x00, 0x58, + 0x00, 0x0E, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x70, + 0x40, 0x80, 0x00, 0x5E, 0xA0, 0xC0, 0xDF, 0xFF, + 0x00, 0x18, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x50, + 0x00, 0x60, 0x00, 0x70, 0x00, 0x0C, 0x06, 0x00, + 0x00, 0x00, 0x84, 0xE3, 0xE6, 0x07, 0xF4, 0x07, + 0x08, 0x00, 0x00, 0x00, 0x8A, 0xE3, 0xEA, 0x07, + 0xF4, 0x07, 0x06, 0x00, 0x40, 0x00, 0x00, 0x0A, + 0xE6, 0x07, 0xEE, 0x07, 0x08, 0x00, 0x40, 0x00, + 0x06, 0x0A, 0xEA, 0x07, 0xEE, 0x07, 0x00, 0x00, + 0xE2, 0xC1, 0x8B, 0xD4, 0xFF, 0xFF, 0xD7, 0xD1, + 0xD9, 0xC5, 0xD4, 0xC3, 0x3B, 0x59, 0x34, 0x09, + 0xFC, 0x05, 0x6C, 0x09, 0xD8, 0x06, 0x06, 0x04, + 0xBA, 0xEA, 0x30, 0x09, 0x48, 0x04, 0x80, 0x08, + 0x06, 0x00, 0x0A, 0x06, 0x0E, 0x0C, 0xBA, 0xCE, + 0x2E, 0xE0, 0x56, 0xE0, 0x50, 0xE1, 0x66, 0xE2, + 0xEC, 0xE2, 0x4C, 0xE3, 0xFE, 0xE3, 0xBA, 0xCE, + 0x80, 0xE4, 0x10, 0xE4, 0x14, 0xE0, 0x1C, 0xE4, + 0x1C, 0xE4, 0x46, 0xE5, 0x50, 0xE5, 0x5A, 0xE5, + 0xBA, 0xCE, 0xA6, 0xDC, 0xBA, 0xCE, 0x44, 0xDA, + 0xE6, 0xDF, 0x70, 0xDA, 0xDE, 0xDE, 0xB0, 0xCE, + 0x16, 0xDB, 0x3A, 0xDD, 0xB8, 0xDD, 0x34, 0xDE, + 0x58, 0xDE, 0x16, 0xDB, 0xDA, 0xDC, 0x08, 0xCF, + 0xB0, 0xCE, 0xA8, 0xD9, 0x8A, 0xD9, 0x44, 0xD9, + 0xB0, 0xCE, 0xEA, 0xDE, 0xB0, 0xCE, 0x72, 0x06, + 0xF6, 0xD2, 0x08, 0x07, 0x72, 0x06, 0x54, 0xD2, + 0xF4, 0x01, 0x72, 0x06, 0x34, 0xD2, 0x08, 0x07, + 0x7C, 0x06, 0x5A, 0xDC, 0x04, 0x00, 0x7C, 0x06, + 0x78, 0xD2, 0x00, 0x00, 0x7C, 0x06, 0xCC, 0xDE, + 0xFA, 0x00, 0x86, 0x06, 0xAC, 0xD1, 0x05, 0x00, + 0x90, 0x06, 0x1C, 0xDF, 0x28, 0x00, 0x90, 0x06, + 0x50, 0xD3, 0x04, 0x01, 0x90, 0x06, 0x00, 0x00, + 0x02, 0x00, 0x90, 0x06, 0x80, 0xD2, 0xBC, 0x02, + 0x9A, 0x06, 0x06, 0xD3, 0xDC, 0x05, 0x9A, 0x06, + 0xAA, 0xD2, 0x64, 0x00, 0x9A, 0x06, 0x0A, 0xD3, + 0x14, 0x00, 0x9A, 0x06, 0xE2, 0xE0, 0x40, 0x06, + 0x9A, 0x06, 0x12, 0xD3, 0x64, 0x00, 0x7C, 0x06, + 0x16, 0xDC, 0x04, 0x00, 0x7C, 0x06, 0xE6, 0xDA, + 0x16, 0x00, 0x7C, 0x06, 0xFA, 0xDB, 0x05, 0x00, + 0x7C, 0x06, 0x00, 0xDD, 0x14, 0x00, 0x9A, 0x06, + 0x7C, 0xD3, 0x14, 0x00, 0x9A, 0x06, 0x38, 0xD4, + 0x02, 0x00, 0x7C, 0x06, 0x0C, 0xE0, 0x19, 0x00, + 0x00, 0x00, 0x0A, 0x07, 0x0E, 0x07, 0x04, 0x07, + 0xD8, 0x06, 0x00, 0x07, 0xF0, 0x06, 0xEE, 0x06, + 0xEC, 0x06, 0x0C, 0x07, 0xE6, 0x06, 0x18, 0x07, + 0x92, 0x09, 0x94, 0x09, 0x96, 0x09, 0x98, 0x09, + 0x00, 0x50, 0xCC, 0x00, 0x03, 0x00, 0x00, 0x84, + 0x00, 0xA8, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x10, 0x82, 0xEC, 0x48, 0xEB, + 0x62, 0xEB, 0x7C, 0xEB, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0xEA, 0xEB, + 0x52, 0xEB, 0x68, 0xEB, 0x82, 0xEB, 0x40, 0x01, + 0x42, 0x01, 0x42, 0x01, 0x42, 0x01, 0x00, 0x00, + 0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x10, 0x02, + 0x1F, 0x02, 0x30, 0x02, 0x3F, 0x02, 0x50, 0x02, + 0x5F, 0x02, 0x70, 0x02, 0x7F, 0x02, 0x90, 0x02, + 0x9F, 0x02, 0xB0, 0x02, 0xBF, 0x02, 0xD0, 0x02, + 0xDF, 0x02, 0xE1, 0x02, 0xFF, 0x02, 0x01, 0x03, + 0x7F, 0x03, 0x81, 0x03, 0x8F, 0x03, 0x91, 0x03, + 0x9F, 0x03, 0xA1, 0x03, 0xAF, 0x03, 0xB1, 0x03, + 0xBF, 0x03, 0xC1, 0x03, 0xCF, 0x03, 0xE1, 0x03, + 0xFF, 0x03, 0xC0, 0x07, 0xFF, 0x07, 0x00, 0x0C, + 0xFF, 0x0F, 0x00, 0x30, 0xFF, 0x37, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBC, 0xFE, 0x07, 0x00, 0x5E, 0x02, + 0x00, 0x01, 0xFF, 0xBA, 0x80, 0xBA, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x0A, 0x01, + 0x0E, 0x01, 0x10, 0x01, 0x14, 0x01, 0x00, 0x00, + 0x12, 0x01, 0x00, 0xF8, 0x16, 0x01, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x1C, 0x01, + 0x82, 0x01, 0x66, 0x96, 0x66, 0x96, 0x55, 0x55, + 0x00, 0x00, 0x82, 0x01, 0x2A, 0x8A, 0x2A, 0x8A, + 0x18, 0xC9, 0x18, 0xC9, 0x86, 0x01, 0xAA, 0xA2, + 0x1E, 0xA0, 0x55, 0x55, 0x1E, 0x54, 0x8A, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x8C, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, + 0x00, 0x00, 0x8E, 0x01, 0x00, 0x50, 0x00, 0x00, + 0x00, 0xA8, 0x00, 0x00, 0x90, 0x01, 0x00, 0x50, + 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x92, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x94, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, + 0x00, 0x00, 0x96, 0x01, 0x00, 0x50, 0x00, 0x00, + 0x00, 0xA8, 0x00, 0x00, 0x98, 0x01, 0x00, 0x50, + 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x9A, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x9C, 0x01, 0x55, 0x55, 0xC0, 0x7F, 0xAA, 0xAA, + 0xC0, 0x7F, 0x00, 0x00, 0xA2, 0x01, 0xA4, 0x01, + 0xA8, 0x01, 0xAA, 0x01, 0xAE, 0x01, 0xB0, 0x01, + 0xB2, 0x01, 0x80, 0x01, 0x00, 0x00, 0x88, 0x01, + 0x00, 0xFF, 0x9E, 0x01, 0xFF, 0x00, 0xA0, 0x01, + 0x00, 0x80, 0xAC, 0x01, 0x00, 0x80, 0x00, 0x00, + 0xA6, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, + 0xBC, 0x01, 0x00, 0x88, 0x00, 0x06, 0x00, 0xC8, + 0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x02, 0x00, 0x44, 0x00, 0x92, 0xEA, + 0x48, 0x00, 0x98, 0xEA, 0x50, 0x00, 0x9E, 0xEA, + 0x60, 0x00, 0xA4, 0xEA, 0x78, 0x00, 0xAA, 0xEA, + 0x0A, 0xE8, 0x18, 0xE7, 0x3C, 0xEA, 0x2A, 0xE7, + 0x14, 0x55, 0xA0, 0x01, 0xEC, 0xE6, 0xD0, 0xE9, + 0x46, 0xE7, 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, + 0x00, 0x00, 0x1E, 0x00, 0x46, 0xE7, 0x92, 0xE7, + 0x00, 0x41, 0x01, 0x41, 0xB6, 0xE7, 0x73, 0xEA, + 0x18, 0xE7, 0x48, 0xEA, 0xEC, 0xE6, 0x04, 0xEA, + 0x56, 0xE7, 0x62, 0xE7, 0xB6, 0xE7, 0x6E, 0xEA, + 0x62, 0xE8, 0x00, 0x00, 0x36, 0xE8, 0xEC, 0xE6, + 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 0x36, 0xE8, + 0x62, 0xE8, 0x00, 0x00, 0xEC, 0xE6, 0xF0, 0xE9, + 0x0C, 0xE7, 0x4A, 0xE7, 0x62, 0xE7, 0x36, 0xE8, + 0xEC, 0xE6, 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, + 0x36, 0xE8, 0x62, 0xE8, 0x00, 0x20, 0x2A, 0xE7, + 0x14, 0x55, 0xA0, 0x01, 0x18, 0xE7, 0x50, 0xEA, + 0xEC, 0xE6, 0xD0, 0xE9, 0x58, 0xE8, 0x50, 0x55, + 0x0C, 0x00, 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, + 0x00, 0x00, 0xB6, 0xE7, 0x75, 0xEA, 0x00, 0xE7, + 0x58, 0xE8, 0x55, 0x55, 0x0C, 0x00, 0x56, 0xE7, + 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 0xFF, 0xFF, + 0x08, 0x00, 0x58, 0xE8, 0x02, 0x10, 0x06, 0x00, + 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, + 0xB6, 0xE7, 0x80, 0xEA, 0x00, 0xE7, 0x58, 0xE8, + 0x00, 0xC0, 0x08, 0x00, 0x58, 0xE8, 0xFF, 0xFF, + 0x0A, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 0x0C, 0x00, + 0x58, 0xE8, 0x0D, 0x10, 0x06, 0x00, 0x46, 0xE7, + 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 0xB6, 0xE7, + 0x74, 0xEA, 0x62, 0xE8, 0x08, 0x20, 0x00, 0xE7, + 0x52, 0xE8, 0x82, 0x01, 0x02, 0xC9, 0x46, 0xE7, + 0xB6, 0xE7, 0x80, 0xEA, 0x62, 0xE8, 0x34, 0x20, + 0x00, 0xE7, 0x58, 0xE8, 0x00, 0x10, 0x06, 0x00, + 0x46, 0xE7, 0xC6, 0xE8, 0xB6, 0xE7, 0x78, 0xEA, + 0x52, 0xE8, 0x9C, 0x01, 0x40, 0x00, 0x18, 0xE7, + 0x50, 0xEA, 0x2A, 0xE7, 0xFF, 0x00, 0x80, 0x07, + 0x26, 0xE9, 0x03, 0x00, 0x66, 0xE9, 0x74, 0xE9, + 0x12, 0xEA, 0x38, 0xE9, 0x00, 0x00, 0x74, 0xE9, + 0x1C, 0xEA, 0x38, 0xE9, 0x04, 0x00, 0x74, 0xE9, + 0x24, 0xEA, 0x38, 0xE9, 0x07, 0x00, 0x74, 0xE9, + 0x2C, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x02, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x06, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x05, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x4A, 0xE9, + 0x26, 0xE9, 0x03, 0x00, 0x58, 0xE9, 0x62, 0xE7, + 0xE6, 0xE8, 0xD8, 0xE9, 0x01, 0x00, 0xE6, 0xE8, + 0x25, 0xEA, 0x02, 0x00, 0xE6, 0xE8, 0x2F, 0xEA, + 0x06, 0x00, 0xE6, 0xE8, 0x3A, 0xEA, 0x05, 0x00, + 0xB6, 0xE7, 0x74, 0xEA, 0x36, 0xE8, 0xEC, 0xE6, + 0xD0, 0xE9, 0x56, 0xE7, 0xC6, 0xE8, 0x0C, 0xE7, + 0x92, 0xE7, 0x00, 0x01, 0x00, 0x80, 0xB6, 0xE7, + 0x78, 0xEA, 0x00, 0xE7, 0xFE, 0xE8, 0x52, 0xE8, + 0x80, 0x01, 0x41, 0x8E, 0x4A, 0xE7, 0x92, 0xE7, + 0x00, 0x01, 0x01, 0x1B, 0x06, 0xE9, 0xE4, 0xFF, + 0xB6, 0xE7, 0x7C, 0xEA, 0xBE, 0xE8, 0x18, 0xE7, + 0x56, 0xEA, 0x0C, 0xE7, 0x6A, 0xE8, 0x3C, 0xE7, + 0x00, 0xE0, 0xC6, 0xE8, 0xB6, 0xE7, 0x86, 0xEA, + 0x3C, 0xE7, 0x00, 0xE8, 0x62, 0xE7, 0xB6, 0xE7, + 0x85, 0xEA, 0x3C, 0xE7, 0x00, 0x08, 0xC6, 0xE8, + 0xB6, 0xE7, 0x86, 0xEA, 0x3C, 0xE7, 0x00, 0xF8, + 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, + 0x80, 0x01, 0x00, 0x02, 0x3C, 0xE7, 0x00, 0xE0, + 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, + 0x84, 0x01, 0x00, 0x00, 0x62, 0xE8, 0x34, 0x00, + 0x3C, 0xE7, 0x00, 0x00, 0xC6, 0xE8, 0x62, 0xE8, + 0x34, 0x60, 0x0E, 0xE9, 0x52, 0xE8, 0x84, 0x01, + 0x00, 0x00, 0xB6, 0xE7, 0x86, 0xEA, 0x52, 0xE8, + 0x82, 0x01, 0x00, 0xC8, 0x3C, 0xE7, 0x00, 0xE0, + 0xC6, 0xE8, 0x3C, 0xE7, 0x00, 0x10, 0xC6, 0xE8, + 0x62, 0xE8, 0x34, 0x60, 0x52, 0xE8, 0x80, 0x01, + 0x00, 0x06, 0x3C, 0xE7, 0x10, 0x00, 0x78, 0xE8, + 0x36, 0xE8, 0x52, 0xE8, 0x84, 0x01, 0x00, 0x00, + 0x62, 0xE8, 0x34, 0x00, 0xEC, 0xE6, 0xD0, 0xE9, + 0x18, 0xE7, 0x5C, 0xEA, 0xD0, 0xE8, 0x92, 0xE9, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xF0, + 0x06, 0x00, 0x00, 0xC7, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0xE0, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, + 0x40, 0xD0, 0x06, 0x00, 0x00, 0xE0, 0xA0, 0xE7, + 0xDC, 0xE8, 0x00, 0xC0, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x90, 0x06, 0x00, 0x00, 0xA0, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x80, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x50, 0x06, 0x00, + 0x00, 0x60, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x40, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x10, + 0x06, 0x00, 0x00, 0x20, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0x00, 0xD0, 0xE8, 0x92, 0xE9, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xD0, 0x06, 0x00, + 0x00, 0xA6, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0xC0, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x90, + 0x06, 0x00, 0x00, 0xC0, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0x80, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, + 0x40, 0x50, 0x06, 0x00, 0x00, 0x40, 0xA0, 0xE7, + 0xDC, 0xE8, 0x00, 0x40, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 0x00, 0x60, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 0x7E, 0xE9, + 0x90, 0xE9, 0x18, 0xE7, 0x62, 0xEA, 0xEC, 0xE6, + 0xD0, 0xE9, 0xA4, 0xE8, 0x55, 0x55, 0x16, 0x00, + 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x00, 0x00, 0x00, + 0xB6, 0xE7, 0x8B, 0xEA, 0x0A, 0xE8, 0x18, 0xE7, + 0x62, 0xEA, 0x58, 0xE8, 0x55, 0x55, 0x16, 0x00, + 0x00, 0xE7, 0x46, 0xE7, 0xA0, 0xE7, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x08, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x0C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x10, + 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x14, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x18, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x1C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x20, + 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x24, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x28, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x2C, 0xD2, 0xE7, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x30, 0x06, 0x00, 0x00, 0x01, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x20, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, + 0x00, 0x43, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xB0, + 0x06, 0x00, 0x00, 0x85, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0xA0, 0xD8, 0xE8, 0x00, 0x01, 0x03, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x1A, 0x00, + 0x40, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x72, 0x82, + 0x4A, 0xA9, 0xA5, 0x5A, 0xDA, 0xE7, 0x03, 0x09, + 0x11, 0x9D, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, + 0xD8, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81, + 0x04, 0x00, 0xD8, 0x90, 0xD8, 0xB4, 0x00, 0x00, + 0x00, 0x81, 0x08, 0x00, 0xD8, 0x90, 0x46, 0x16, + 0x00, 0x40, 0xD8, 0xB4, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x13, 0x00, 0x40, 0x10, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x81, 0x0F, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x0A, 0x80, + 0x40, 0x9E, 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, + 0x0F, 0x00, 0x06, 0x80, 0x40, 0xFE, 0x00, 0xCC, + 0x00, 0x00, 0x04, 0x80, 0x40, 0x8E, 0x00, 0xC9, + 0x04, 0x80, 0x00, 0x06, 0x00, 0xCC, 0x04, 0x80, + 0x40, 0x0A, 0x00, 0xC8, 0x0A, 0x80, 0x40, 0x8A, + 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 0x0F, 0x00, + 0x0A, 0x08, 0x80, 0x1C, 0x0A, 0x00, 0x1C, 0x1A, + 0x00, 0x80, 0x1C, 0x0C, 0x00, 0x80, 0x1C, 0x1A, + 0x00, 0x80, 0x1A, 0x0E, 0x80, 0x1C, 0x04, 0x00, + 0x00, 0x80, 0x80, 0x02, 0x02, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x58, 0x07, 0x0C, 0xB8, + 0x16, 0xE0, 0xE2, 0x08, 0xEC, 0x08, 0xF6, 0x08, + 0x16, 0xE0, 0x00, 0x09, 0x0A, 0x09, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0x08, 0x00, 0x00, 0xEC, 0x08, + 0xF6, 0x08, 0x00, 0x09, 0x00, 0x00, 0xB8, 0x07, + 0xCA, 0xCB, 0x80, 0x02, 0xB8, 0x07, 0xE8, 0xCB, + 0x84, 0xFF, 0xB8, 0x07, 0x0A, 0xCC, 0xB8, 0x07, + 0x84, 0xCC, 0x6E, 0xCD, 0x62, 0xCD, 0x88, 0xCD, + 0x90, 0xCE, 0x84, 0xCD, 0x92, 0xCE, 0x92, 0xCE, + 0x92, 0xCE, 0x8C, 0xCD, 0x96, 0xCD, 0x38, 0xCE, + 0x82, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 0x92, 0xCE, + 0x92, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x05, 0x08, + 0x08, 0x08, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0x04, + 0x0A, 0x08, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x00, + 0x04, 0x41, 0x06, 0x0B, 0x08, 0xC2, 0x00, 0xE6, + 0x00, 0xE7, 0x04, 0x06, 0x04, 0x07, 0x04, 0x03, + 0x06, 0x04, 0x04, 0x05, 0x04, 0x88, 0x04, 0xCF, + 0x04, 0xCD, 0x03, 0x00, 0x05, 0x00, 0x1C, 0x00, + 0x00, 0x0C, 0x00, 0x80, 0xD2, 0xD8, 0xDA, 0xD8, + 0x1E, 0xD9, 0xDE, 0xD8, 0xEA, 0xD8, 0xF0, 0xD8, + 0x14, 0xD9, 0xE4, 0xD8, 0x32, 0xD9, 0x00, 0x06, + 0x00, 0x00, 0x03, 0x07, 0x0A, 0x0E, 0x0F, 0x14, + 0x26, 0x2A, 0x52, 0x42, 0x50, 0x48, 0x5D, 0x4D, + 0x62, 0x62, 0x6D, 0x57, 0x46, 0x39, 0x1A, 0x1D, + 0x7C, 0x76, 0x1F, 0x23, 0x15, 0x1D, 0x74, 0x6F, + 0x84, 0x7C, 0x8B, 0x82, 0x92, 0x89, 0x00, 0x00, + 0x32, 0x2F, 0x3F, 0x34, 0x32, 0x01, 0x01, 0x57, + 0x32, 0x11, 0x81, 0x51, 0x02, 0x56, 0x03, 0x55, + 0x54, 0x11, 0x56, 0x81, 0x55, 0x02, 0x54, 0x02, + 0x56, 0x81, 0x01, 0x76, 0x02, 0x34, 0x02, 0x55, + 0x81, 0x54, 0x02, 0x58, 0x02, 0x55, 0x81, 0x54, + 0x02, 0x58, 0x11, 0x12, 0x02, 0x52, 0x58, 0x83, + 0x52, 0x05, 0x83, 0x04, 0x02, 0x58, 0x08, 0x55, + 0x58, 0x83, 0x55, 0x02, 0x81, 0x02, 0x05, 0x58, + 0x03, 0x52, 0x5C, 0x15, 0x53, 0x5B, 0x52, 0x87, + 0x11, 0x03, 0x41, 0x51, 0x78, 0x51, 0x34, 0x11, + 0x81, 0x11, 0x20, 0x31, 0x54, 0x57, 0x01, 0x53, + 0x5A, 0x12, 0x81, 0x51, 0x20, 0x31, 0x5B, 0x57, + 0x01, 0x5A, 0x01, 0x11, 0x51, 0x11, 0x31, 0x81, + 0x57, 0x20, 0x15, 0x01, 0x13, 0x01, 0x11, 0x01, + 0x11, 0x11, 0x81, 0x51, 0x05, 0x58, 0x02, 0x52, + 0x5B, 0x54, 0x5D, 0x81, 0x52, 0x05, 0x54, 0x02, + 0x58, 0x81, 0x50, 0x02, 0x13, 0x03, 0x58, 0x81, + 0x50, 0x02, 0x11, 0x03, 0x81, 0x54, 0x72, 0x5D, + 0x50, 0x03, 0x13, 0x03, 0x13, 0x01, 0x40, 0x54, + 0x0E, 0x00, 0x20, 0x06, 0x56, 0x06, 0x0C, 0xDA, + 0x24, 0x00, 0x02, 0x10, 0x16, 0x00, 0x02, 0x00, + 0x01, 0x04, 0x08, 0x07, 0x0C, 0xDA, 0x20, 0x00, + 0x03, 0x10, 0x12, 0x00, 0x03, 0x00, 0x4E, 0xD9, + 0x14, 0x8E, 0x20, 0x00, 0x04, 0x10, 0x12, 0x00, + 0x04, 0x00, 0xD2, 0xCE, 0x20, 0x00, 0x05, 0xE0, + 0x12, 0x00, 0x05, 0x00, 0xD2, 0xCE, 0x20, 0x00, + 0x06, 0xE0, 0x12, 0x00, 0x06, 0x00, 0xE8, 0xDD, + 0x12, 0x00, 0x01, 0xE0, 0x6C, 0x09, 0xCC, 0x06, + 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x30, 0x06, + 0x42, 0xDC, 0xF0, 0x05, 0x00, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE2, 0x05, 0x08, 0x00, + 0x26, 0xFF, 0xDC, 0x05, 0x00, 0x00, 0x30, 0x06, + 0xF8, 0xDB, 0x1E, 0x00, 0x01, 0xE0, 0x10, 0x00, + 0x11, 0x30, 0x0C, 0x04, 0x01, 0x00, 0x0E, 0x04, + 0x02, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x32, 0xDD, 0x12, 0x00, 0x01, 0xE0, + 0x04, 0x00, 0x13, 0x30, 0x74, 0xDE, 0x3E, 0x00, + 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, + 0x30, 0x00, 0x20, 0x50, 0x23, 0x0C, 0xFC, 0x05, + 0x52, 0x06, 0x56, 0x06, 0x00, 0x00, 0x00, 0x81, + 0x16, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x2A, 0x40, 0x2A, 0x04, + 0x56, 0x06, 0x26, 0x00, 0x19, 0xED, 0x2B, 0x06, + 0x72, 0x09, 0x22, 0x00, 0x24, 0x00, 0x2F, 0xED, + 0x23, 0x0C, 0xFC, 0x05, 0x28, 0x08, 0x34, 0x09, + 0x29, 0x08, 0x58, 0x07, 0x78, 0x07, 0x98, 0x07, + 0x23, 0x00, 0x2A, 0x00, 0x3D, 0xED, 0x06, 0x04, + 0xF0, 0x06, 0x07, 0x04, 0xEE, 0x06, 0x24, 0x00, + 0xD2, 0xCE, 0x34, 0x00, 0x00, 0xE0, 0x00, 0xC0, + 0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x25, 0x40, + 0xD2, 0xCE, 0x20, 0x00, 0x00, 0xE0, 0x00, 0xC0, + 0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x26, 0x40, + 0xD2, 0xCE, 0x1A, 0x00, 0x00, 0xE0, 0x0C, 0x00, + 0x27, 0x60, 0x0A, 0x08, 0xE6, 0x06, 0xD2, 0xCE, + 0x24, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x28, 0x60, + 0x30, 0x04, 0x06, 0x07, 0x52, 0xCF, 0x00, 0x81, + 0x30, 0x00, 0x00, 0xE0, 0x22, 0x00, 0x29, 0x60, + 0x2D, 0x08, 0x1C, 0x07, 0x2E, 0x08, 0x22, 0x07, + 0x00, 0x00, 0x08, 0x02, 0x06, 0x01, 0x14, 0x06, + 0x18, 0x08, 0x20, 0x0C, 0x26, 0x0E, 0x30, 0x0F, + 0x34, 0x11, 0x3E, 0x12, 0x42, 0x14, 0x46, 0x16, + 0x1C, 0x0A, 0x4A, 0x18, 0x13, 0x03, 0x11, 0x83, + 0x01, 0x11, 0x11, 0x81, 0x12, 0x81, 0x13, 0x01, + 0x52, 0x83, 0x81, 0x85, 0x85, 0x11, 0x12, 0x81, + 0x12, 0x81, 0x19, 0x81, 0x60, 0x85, 0x00, 0xC0, + 0x00, 0x00, 0x08, 0x00, 0x6C, 0x09, 0x00, 0x00, + 0x30, 0x06, 0x08, 0xE5, 0x54, 0x06, 0x50, 0x06, + 0x38, 0x02, 0x21, 0x04, 0x1E, 0x09, 0x0B, 0x06, + 0xD8, 0x06, 0x02, 0x08, 0xDC, 0x06, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x41, 0x00, + 0x14, 0xAE, 0x00, 0x00, 0x00, 0x81, 0x09, 0x04, + 0x0C, 0x07, 0x41, 0x00, 0x41, 0x00, 0x14, 0x02, + 0x00, 0x00, 0x00, 0x81, 0x0B, 0x06, 0xD8, 0x06, + 0x2C, 0x06, 0x76, 0x09, 0x22, 0x14, 0x3A, 0x09, + 0x41, 0x00, 0x41, 0x00, 0x54, 0x02, 0x00, 0x00, + 0x00, 0x81, 0xD8, 0x06, 0x00, 0x84, 0x00, 0x48, + 0xFC, 0xFF, 0x09, 0x00, 0x00, 0xC0, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x20, 0x00, + 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, + 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 0x38, 0x39, + 0x54, 0x20, 0x78, 0x65, 0x73, 0x61, 0x49, 0x20, + 0x73, 0x6E, 0x72, 0x74, 0x6D, 0x75, 0x6E, 0x65, + 0x73, 0x74, 0x28, 0x0A, 0x29, 0x43, 0x39, 0x31, + 0x33, 0x38, 0x34, 0x2C, 0x35, 0x2C, 0x36, 0x2C, + 0x49, 0x20, 0x4D, 0x42, 0x43, 0x20, 0x72, 0x6F, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x34, 0x90, + 0x00, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0xB8, 0xFF, + 0x00, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0x80, 0x00, + 0x3E, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif /* CONFIG_SKTR */ diff -u --recursive --new-file v2.1.106/linux/drivers/net/tlan.c linux/drivers/net/tlan.c --- v2.1.106/linux/drivers/net/tlan.c Sun Jun 7 11:16:32 1998 +++ linux/drivers/net/tlan.c Wed Jun 24 14:34:43 1998 @@ -1754,7 +1754,7 @@ * areg The AREG to set the address in (0 - 3). * mac A pointer to an array of chars. Each * element stores one byte of the address. - * IE, it isn't in ascii. + * That is, it isn't in ASCII. * * This function transfers a MAC address to one of the * TLAN AREGs (address registers). The TLAN chip locks @@ -2654,7 +2654,7 @@ * * Returns: * No error = 0, else, the stage at which the error - * occured. + * occurred. * Parms: * io_base The IO port base address for the * TLAN device with the EEPROM to diff -u --recursive --new-file v2.1.106/linux/drivers/sbus/audio/cs4215.h linux/drivers/sbus/audio/cs4215.h --- v2.1.106/linux/drivers/sbus/audio/cs4215.h Mon Jan 12 15:15:45 1998 +++ linux/drivers/sbus/audio/cs4215.h Wed Jun 24 14:30:09 1998 @@ -61,7 +61,7 @@ }; #define CS4215_HPF (1<<7) /* High Pass Filter, 1: Enabled */ -#define CS4215_12_MASK 0xfcbf /* Mask off reseved bits in slot 1 & 2 */ +#define CS4215_12_MASK 0xfcbf /* Mask off reserved bits in slot 1 & 2 */ /* Time Slot 3, Serial Port Control register */ #define CS4215_XEN (1<<0) /* 0: Enable serial output */ @@ -109,7 +109,7 @@ /* Time Slot 7, Input Setting */ #define CS4215_LG(v) v /* Left Gain Setting 0xf: 22.5 dB */ #define CS4215_IS (1<<4) /* Input Select: 1=Microphone, 0=Line */ -#define CS4215_OVR (1<<5) /* 1: Overrange condition occured */ +#define CS4215_OVR (1<<5) /* 1: Overrange condition occurred */ #define CS4215_PIO0 (1<<6) /* Parallel I/O 0 */ #define CS4215_PIO1 (1<<7) diff -u --recursive --new-file v2.1.106/linux/drivers/sbus/char/bpp.c linux/drivers/sbus/char/bpp.c --- v2.1.106/linux/drivers/sbus/char/bpp.c Wed Apr 23 19:01:21 1997 +++ linux/drivers/sbus/char/bpp.c Wed Jun 24 14:30:09 1998 @@ -45,7 +45,7 @@ static const unsigned BPP_MAJOR = LP_MAJOR; static const char* dev_name = "bpp"; -/* When switching from compatability to a mode where I can read, try +/* When switching from compatibility to a mode where I can read, try the following mode first. */ /* const unsigned char DEFAULT_ECP = 0x10; */ diff -u --recursive --new-file v2.1.106/linux/drivers/video/Config.in linux/drivers/video/Config.in --- v2.1.106/linux/drivers/video/Config.in Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/Config.in Wed Jun 24 14:44:01 1998 @@ -7,6 +7,9 @@ mainmenu_option next_comment comment 'Frame buffer devices' + if [ "$CONFIG_ARCH_ACORN" = "y" ]; then + define_bool CONFIG_FB_ACORN y + fi if [ "$CONFIG_APOLLO" = "y" ]; then define_bool CONFIG_FB_APOLLO y fi @@ -17,6 +20,8 @@ bool 'Amiga ECS chipset support' CONFIG_FB_AMIGA_ECS bool 'Amiga AGA chipset support' CONFIG_FB_AMIGA_AGA fi + fi + if [ "$CONFIG_ZORRO" = "y" ]; then tristate 'Amiga CyberVision support' CONFIG_FB_CYBER if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then bool 'Amiga CyberVision3D support (experimental)' CONFIG_FB_VIRGE @@ -43,9 +48,22 @@ if [ "$CONFIG_MAC" = "y" ]; then define_bool CONFIG_FB_MAC y fi + if [ "$CONFIG_HP300" = "y" ]; then + define_bool CONFIG_FB_HP300 y + fi if [ "$CONFIG_TGA_CONSOLE" = "y" ]; then define_bool CONFIG_FB_TGA y fi + if [ "$ARCH" = "i386" -o "$ARCH" = "alpha" -o "$ARCH" = "ppc" ]; then + bool 'VGA chipset support (text only)' CONFIG_FB_VGA + fi + if [ "$ARCH" = "i386" ]; then + bool 'VESA VGA graphics console' CONFIG_FB_VESA + define_bool CONFIG_VIDEO_SELECT y + fi + if [ "$ARCH" = "i386" ]; then + tristate 'MDA dual-headed support' CONFIG_FB_MDA + fi tristate 'Virtual Frame Buffer support (ONLY FOR TESTING!)' CONFIG_FB_VIRTUAL bool 'Advanced low level driver options' CONFIG_FBCON_ADVANCED @@ -63,6 +81,7 @@ bool 'Atari interleaved bitplanes (4 planes) support' CONFIG_FBCON_IPLAN2P4 bool 'Atari interleaved bitplanes (8 planes) support' CONFIG_FBCON_IPLAN2P8 bool 'Mac variable bpp packed pixels support' CONFIG_FBCON_MAC + bool 'VGA characters/attributes support' CONFIG_FBCON_VGA else if [ "$CONFIG_FB_AMIGA" = "y" -o "$CONFIG_FB_AMIGA" = "m" -o \ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATARI" = "m" -o \ @@ -92,12 +111,14 @@ "$CONFIG_FB_OF" = "y" -o "$CONFIG_FB_OF" = "m" -o \ "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_MAC" = "m" -o \ "$CONFIG_FB_TGA" = "y" -o "$CONFIG_FB_TGA" = "m" -o \ + "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VESA" = "m" -o \ "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then define_bool CONFIG_FBCON_CFB8 y fi if [ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATARI" = "m" -o \ "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_ATY" = "m" -o \ "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_MAC" = "m" -o \ + "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VESA" = "m" -o \ "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then define_bool CONFIG_FBCON_CFB16 y fi @@ -106,8 +127,19 @@ fi if [ "$CONFIG_FB_ATARI" = "y" -o "$CONFIG_FB_ATARI" = "m" -o \ "$CONFIG_FB_ATY" = "y" -o "$CONFIG_FB_ATY" = "m" -o \ + "$CONFIG_FB_VESA" = "y" -o "$CONFIG_FB_VESA" = "m" -o \ "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_VIRTUAL" = "m" ]; then define_bool CONFIG_FBCON_CFB32 y + fi + if [ "$CONFIG_FB_ACORN" != "n" ]; then + define_bool CONFIG_FBCON_MFB y + define_bool CONFIG_FBCON_CFB2 y + define_bool CONFIG_FBCON_CFB4 y + define_bool CONFIG_FBCON_CFB8 y + fi + if [ "$CONFIG_FB_VGA" = "y" -o "$CONFIG_FB_VGA" = "m" -o \ + "$CONFIG_FB_MDA" = "y" -o "$CONFIG_FB_MDA" = "m" ]; then + define_bool CONFIG_FBCON_VGA y fi fi diff -u --recursive --new-file v2.1.106/linux/drivers/video/Makefile linux/drivers/video/Makefile --- v2.1.106/linux/drivers/video/Makefile Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/Makefile Wed Jun 24 14:44:01 1998 @@ -64,6 +64,10 @@ L_OBJS += macfb.o endif +ifeq ($(CONFIG_FB_HP300),y) +L_OBJS += hpfb.o +endif + ifeq ($(CONFIG_FB_OF),y) L_OBJS += offb.o endif @@ -88,6 +92,22 @@ L_OBJS += tgafb.o endif +ifeq ($(CONFIG_FB_VGA),y) +L_OBJS += vgafb.o +endif + +ifeq ($(CONFIG_FB_VESA),y) +L_OBJS += vesafb.o +endif + +ifeq ($(CONFIG_FB_MDA),y) +L_OBJS += mdafb.o +else + ifeq ($(CONFIG_FB_MDA),m) + M_OBJS += mdafb.o + endif +endif + ifeq ($(CONFIG_FB_VIRGE),y) L_OBJS += virgefb.o else @@ -158,6 +178,10 @@ LX_OBJS += fbcon-mfb.o endif +ifdef CONFIG_FBCON_VGA +LX_OBJS += fbcon-vga.o +endif + # GSP Console ifdef CONFIG_AMIGA_GSP @@ -166,10 +190,16 @@ # VGA Text Console -ifdef CONFIG_ABSTRACT_CONSOLE ifdef CONFIG_VGA_CONSOLE +ifndef CONFIG_FB_VGA L_OBJS := $(L_OBJS) vgacon.o endif +endif + +# Console Wrapper + +ifdef CONFIG_ABSCON_COMPAT +L_OBJS := $(L_OBJS) compatcon.o endif include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.1.106/linux/drivers/video/S3triofb.c linux/drivers/video/S3triofb.c --- v2.1.106/linux/drivers/video/S3triofb.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/S3triofb.c Wed Jun 24 14:44:01 1998 @@ -23,9 +23,8 @@ */ -#include -#include #include +#include #include #include #include @@ -36,11 +35,18 @@ #include #include #include +#include #include #include +#include #include +#ifdef CONFIG_FB_COMPAT_XPMAC +#include +#endif +#include "fbcon.h" #include "fbcon-cfb8.h" +#include "s3blit.h" #define mem_in8(addr) in_8((void *)(addr)) @@ -60,7 +66,7 @@ static struct fb_info fb_info; static struct { u_char red, green, blue, pad; } palette[256]; static char s3trio_name[16] = "S3Trio "; - +static char *s3trio_base; static struct fb_fix_screeninfo fb_fix; static struct fb_var_screeninfo fb_var = { 0, }; @@ -70,8 +76,6 @@ * Interface used by the world */ -void of_video_setup(char *options, int *ints); - static int s3trio_open(struct fb_info *info); static int s3trio_release(struct fb_info *info); static int s3trio_get_fix(struct fb_fix_screeninfo *fix, int con, @@ -106,7 +110,9 @@ static int s3triofbcon_switch(int con, struct fb_info *info); static int s3triofbcon_updatevar(int con, struct fb_info *info); static void s3triofbcon_blank(int blank, struct fb_info *info); +#if 0 static int s3triofbcon_setcmap(struct fb_cmap *cmap, int con); +#endif /* * Text console acceleration @@ -138,12 +144,12 @@ u_int *transp, struct fb_info *info); static int s3trio_setcolreg(u_int regno, u_int red, u_int green, u_int blue, u_int transp, struct fb_info *info); -static void do_install_cmap(int con); +static void do_install_cmap(int con, struct fb_info *info); static struct fb_ops s3trio_ops = { s3trio_open, s3trio_release, s3trio_get_fix, s3trio_get_var, s3trio_set_var, - s3trio_get_cmap, s3trio_set_cmap, s3trio_pan_display, NULL, s3trio_ioctl + s3trio_get_cmap, s3trio_set_cmap, s3trio_pan_display, s3trio_ioctl }; @@ -200,11 +206,16 @@ struct fb_info *info) { if (var->xres > fb_var.xres || var->yres > fb_var.yres || - var->xres_virtual > fb_var.xres_virtual || - var->yres_virtual > fb_var.yres_virtual || - var->bits_per_pixel > fb_var.bits_per_pixel || - var->nonstd || var->vmode != FB_VMODE_NONINTERLACED) + var->bits_per_pixel > fb_var.bits_per_pixel ) + /* || var->nonstd || var->vmode != FB_VMODE_NONINTERLACED) */ return -EINVAL; + if (var->xres_virtual > fb_var.xres_virtual) { + outw(IO_OUT16VAL((var->xres_virtual /8) & 0xff, 0x13), 0x3d4); + outw(IO_OUT16VAL(((var->xres_virtual /8 ) & 0x300) >> 3, 0x51), 0x3d4); + fb_var.xres_virtual = var->xres_virtual; + fb_fix.line_length = var->xres_virtual; + } + fb_var.yres_virtual = var->yres_virtual; memcpy(var, &fb_var, sizeof(fb_var)); return 0; } @@ -219,12 +230,25 @@ static int s3trio_pan_display(struct fb_var_screeninfo *var, int con, struct fb_info *info) { - if (var->xoffset || var->yoffset) + unsigned int base; + + if (var->xoffset > (var->xres_virtual - var->xres)) return -EINVAL; - else - return 0; + if (var->yoffset > (var->yres_virtual - var->yres)) + return -EINVAL; + + fb_var.xoffset = var->xoffset; + fb_var.yoffset = var->yoffset; + + base = var->yoffset * fb_fix.line_length + var->xoffset; + + outw(IO_OUT16VAL((base >> 8) & 0xff, 0x0c),0x03D4); + outw(IO_OUT16VAL(base & 0xff, 0x0d),0x03D4); + outw(IO_OUT16VAL((base >> 16) & 0xf, 0x69),0x03D4); + return 0; } + /* * Get the Colormap */ @@ -238,7 +262,7 @@ 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(fb_display[con].var.bits_per_pixel), + fb_copy_cmap(fb_default_cmap(1 << fb_display[con].var.bits_per_pixel), cmap, kspc ? 0 : 2); return 0; } @@ -273,7 +297,18 @@ return -EINVAL; } -__initfunc(int s3trio_resetaccel(void)) { +__initfunc(unsigned long s3triofb_init(unsigned long mem_start)) +{ +#ifdef __powerpc__ + /* We don't want to be called like this. */ + /* We rely on Open Firmware (offb) instead. */ +#else /* !__powerpc__ */ + /* To be merged with cybervision */ +#endif /* !__powerpc__ */ + return mem_start; +} + +__initfunc(void s3trio_resetaccel(void)) { #define EC01_ENH_ENB 0x0005 @@ -314,18 +349,15 @@ outw(0xffff, 0xaae8); /* Enable all planes */ outw(0xffff, 0xaae8); /* Enable all planes */ outw( MF_PIX_CONTROL | MFA_SRC_FOREGR_MIX, 0xbee8); - } -__initfunc(int s3trio_init(void)) { +__initfunc(int s3trio_init(struct device_node *dp)) { u_char bus, dev; unsigned int t32; unsigned short cmd; - int i; - bus=0; - dev=(3<<3); + pci_device_loc(dp,&bus,&dev); pcibios_read_config_dword(bus, dev, PCI_VENDOR_ID, &t32); if(t32 == (PCI_DEVICE_ID_S3_TRIO << 16) + PCI_VENDOR_ID_S3) { pcibios_read_config_dword(bus, dev, PCI_BASE_ADDRESS_0, &t32); @@ -351,16 +383,16 @@ outw(IO_OUT16VAL(0x48, 0x38),0x03D4); outw(IO_OUT16VAL(0xA0, 0x39),0x03D4); outb(0x33,0x3d4); - outw(IO_OUT16VAL( inb(0x3d5) & ~(0x2 | - 0x10 | 0x40) , 0x33),0x3d4); + outw(IO_OUT16VAL((inb(0x3d5) & ~(0x2 | 0x10 | 0x40)) | + 0x20, 0x33), 0x3d4); - outw(IO_OUT16VAL(0x6,0x8), 0x3c4); + outw(IO_OUT16VAL(0x6, 0x8), 0x3c4); /* switch to MMIO only mode */ - outb(0x58,0x3d4); - outw(IO_OUT16VAL(inb(0x3d5) | 3 | 0x10,0x58),0x3d4); - outw(IO_OUT16VAL(8,0x53),0x3d4); + outb(0x58, 0x3d4); + outw(IO_OUT16VAL(inb(0x3d5) | 3 | 0x10, 0x58), 0x3d4); + outw(IO_OUT16VAL(8, 0x53), 0x3d4); /* switch off I/O accesses */ @@ -368,6 +400,7 @@ pcibios_write_config_word(bus, dev, PCI_COMMAND, PCI_COMMAND_IO | PCI_COMMAND_MEMORY); #endif + return 1; } return 0; @@ -379,18 +412,12 @@ * We heavily rely on OF for the moment. This needs fixing. */ -__initfunc(unsigned long s3trio_fb_init(unsigned long mem_start)) +__initfunc(void s3triofb_init_of(struct device_node *dp)) { - struct device_node *dp; int i, err, *pp, len; - unsigned *up, address; + unsigned long address; u_long *CursorBase; - if (!prom_display_paths[0]) - return mem_start; - if (!(dp = find_path_device(prom_display_paths[0]))) - return mem_start; - strncat(s3trio_name, dp->name, sizeof(s3trio_name)); s3trio_name[sizeof(s3trio_name)-1] = '\0'; strcpy(fb_fix.id, s3trio_name); @@ -398,19 +425,19 @@ if((pp = (int *)get_property(dp, "vendor-id", &len)) != NULL && *pp!=PCI_VENDOR_ID_S3) { printk("%s: can't find S3 Trio board\n", dp->full_name); - return mem_start; + return; } if((pp = (int *)get_property(dp, "device-id", &len)) != NULL && *pp!=PCI_DEVICE_ID_S3_TRIO) { printk("%s: can't find S3 Trio board\n", dp->full_name); - return mem_start; + return; } if ((pp = (int *)get_property(dp, "depth", &len)) != NULL && len == sizeof(int) && *pp != 8) { printk("%s: can't use depth = %d\n", dp->full_name, *pp); - return mem_start; + return; } if ((pp = (int *)get_property(dp, "width", &len)) != NULL && len == sizeof(int)) @@ -425,45 +452,51 @@ fb_fix.line_length = fb_var.xres_virtual; fb_fix.smem_len = fb_fix.line_length*fb_var.yres; - s3trio_init(); - address=0xc6000000; - fb_fix.smem_start = ioremap(address,64*1024*1024); + s3trio_init(dp); + address = 0xc6000000; + s3trio_base = ioremap(address,64*1024*1024); + fb_fix.smem_start = (char *)address; fb_fix.type = FB_TYPE_PACKED_PIXELS; fb_fix.type_aux = 0; + fb_fix.accel = FB_ACCEL_S3_TRIO64; + fb_fix.mmio_start = (char *)address+0x1000000; + fb_fix.mmio_len = 0x1000000; + fb_fix.xpanstep = 1; + fb_fix.ypanstep = 1; s3trio_resetaccel(); - mem_out8(0x30,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0x2d,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0x2e,fb_fix.smem_start+0x1008000 + 0x03D4); + mem_out8(0x30, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0x2d, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0x2e, s3trio_base+0x1008000 + 0x03D4); - mem_out8(0x50,fb_fix.smem_start+0x1008000 + 0x03D4); + mem_out8(0x50, s3trio_base+0x1008000 + 0x03D4); /* disable HW cursor */ - mem_out8(0x39,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0xa0,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x39, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0xa0, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x4e,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x4e, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x4f,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x4f, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0, s3trio_base+0x1008000 + 0x03D5); /* init HW cursor */ - CursorBase=(u_long *)(fb_fix.smem_start + 2*1024*1024 - 0x400); - for (i=0; i < 8; i++) { + CursorBase = (u_long *)(s3trio_base + 2*1024*1024 - 0x400); + for (i = 0; i < 8; i++) { *(CursorBase +(i*4)) = 0xffffff00; *(CursorBase+1+(i*4)) = 0xffff0000; *(CursorBase+2+(i*4)) = 0xffff0000; *(CursorBase+3+(i*4)) = 0xffff0000; } - for (i=8; i < 64; i++) { + for (i = 8; i < 64; i++) { *(CursorBase +(i*4)) = 0xffff0000; *(CursorBase+1+(i*4)) = 0xffff0000; *(CursorBase+2+(i*4)) = 0xffff0000; @@ -471,34 +504,43 @@ } - mem_out8(0x4c,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(((2*1024 - 1)&0xf00)>>8,fb_fix.smem_start+0x1008000 + 0x03D5); - - mem_out8(0x4d,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8((2*1024 - 1) & 0xff,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x4c, s3trio_base+0x1008000 + 0x03D4); + mem_out8(((2*1024 - 1)&0xf00)>>8, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_in8(fb_fix.smem_start+0x1008000 + 0x03D4); + mem_out8(0x4d, s3trio_base+0x1008000 + 0x03D4); + mem_out8((2*1024 - 1) & 0xff, s3trio_base+0x1008000 + 0x03D5); - mem_out8(0x4a,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5); - mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5); - mem_out8(0x80,fb_fix.smem_start+0x1008000 + 0x03D5); - - mem_out8(0x4b,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5); - mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5); - mem_out8(0x00,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4); + mem_in8(s3trio_base+0x1008000 + 0x03D4); - mem_out8(0x45,fb_fix.smem_start+0x1008000 + 0x03D4); - mem_out8(0,fb_fix.smem_start+0x1008000 + 0x03D5); + mem_out8(0x4a, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5); + mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5); + mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5); + + mem_out8(0x4b, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5); + mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5); + mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5); + + mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4); + mem_out8(0, s3trio_base+0x1008000 + 0x03D5); + + /* setup default color table */ + + for(i = 0; i < 16; i++) { + int j = color_table[i]; + palette[i].red=default_red[j]; + palette[i].green=default_grn[j]; + palette[i].blue=default_blu[j]; + } s3trio_setcolreg(255, 56, 100, 160, 0, NULL /* not used */); s3trio_setcolreg(254, 0, 0, 0, 0, NULL /* not used */); - memset((char *)fb_fix.smem_start,0,640*480); + memset((char *)s3trio_base, 0, 640*480); #if 0 - Trio_RectFill(0,0,90,90,7,1); + Trio_RectFill(0, 0, 90, 90, 7, 1); #endif fb_fix.visual = FB_VISUAL_PSEUDOCOLOR ; @@ -512,7 +554,8 @@ fb_var.nonstd = 0; fb_var.activate = 0; fb_var.height = fb_var.width = -1; - fb_var.accel = 5; + fb_var.accel_flags = FB_ACCELF_TEXT; +#warning FIXME: always obey fb_var.accel_flags fb_var.pixclock = 1; fb_var.left_margin = fb_var.right_margin = 0; fb_var.upper_margin = fb_var.lower_margin = 0; @@ -524,7 +567,7 @@ disp.cmap.start = 0; disp.cmap.len = 0; disp.cmap.red = disp.cmap.green = disp.cmap.blue = disp.cmap.transp = NULL; - disp.screen_base = fb_fix.smem_start; + disp.screen_base = s3trio_base; disp.visual = fb_fix.visual; disp.type = fb_fix.type; disp.type_aux = fb_fix.type_aux; @@ -534,7 +577,10 @@ disp.can_soft_blank = 1; disp.inverse = 0; #ifdef CONFIG_FBCON_CFB8 - disp.dispsw = &fbcon_trio8; + if (fb_var.accel_flags & FB_ACCELF_TEXT) + disp.dispsw = &fbcon_trio8; + else + disp.dispsw = &fbcon_cfb8; #else disp.dispsw = NULL; #endif @@ -577,12 +623,10 @@ err = register_framebuffer(&fb_info); if (err < 0) - return mem_start; + return; printk("fb%d: S3 Trio frame buffer device on %s\n", GET_FB_IDX(fb_info.node), dp->full_name); - - return mem_start; } @@ -595,7 +639,7 @@ currcon = con; /* Install new colormap */ - do_install_cmap(con); + do_install_cmap(con,info); return 0; } @@ -615,17 +659,23 @@ static void s3triofbcon_blank(int blank, struct fb_info *info) { - /* Nothing */ + unsigned char x; + + mem_out8(0x1, s3trio_base+0x1008000 + 0x03c4); + x = mem_in8(s3trio_base+0x1008000 + 0x03c5); + mem_out8((x & (~0x20)) | (blank << 5), s3trio_base+0x1008000 + 0x03c5); } /* * Set the colormap */ +#if 0 static int s3triofbcon_setcmap(struct fb_cmap *cmap, int con) { return(s3trio_set_cmap(cmap, 1, con, &fb_info)); } +#endif /* @@ -660,16 +710,16 @@ palette[regno].green = green; palette[regno].blue = blue; - mem_out8(regno,fb_fix.smem_start+0x1008000 + 0x3c8); - mem_out8((red & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9); - mem_out8((green & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9); - mem_out8((blue & 0xff) >> 2,fb_fix.smem_start+0x1008000 + 0x3c9); + mem_out8(regno,s3trio_base+0x1008000 + 0x3c8); + mem_out8((red & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9); + mem_out8((green & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9); + mem_out8((blue & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9); return 0; } -static void do_install_cmap(int con) +static void do_install_cmap(int con, struct fb_info *info) { if (con != currcon) return; @@ -689,6 +739,9 @@ static int s3trio_console_setmode(struct vc_mode *mode, int doit) { +#if 1 + return -EINVAL; +#else int err; struct fb_var_screeninfo var; struct s3trio_par par; @@ -718,11 +771,12 @@ if (doit) s3trio_set_var(&var, currcon, 0); return 0; +#endif } #endif /* CONFIG_FB_COMPAT_XPMAC */ -void s3trio_video_setup(char *options, int *ints) { +void s3triofb_setup(char *options, int *ints) { return; @@ -734,7 +788,7 @@ do { - status = mem_in16(fb_fix.smem_start + 0x1000000 + 0x9AE8); + status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8); } while (!(status & fifo)); } @@ -745,7 +799,7 @@ do { - status = mem_in16(fb_fix.smem_start + 0x1000000 + 0x9AE8); + status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8); } while (status & 0x200); } @@ -813,18 +867,18 @@ static void Trio_MoveCursor(u_short x, u_short y) { - mem_out8(0x39, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8(0xa0, fb_fix.smem_start + 0x1008000 + 0x3d5); + mem_out8(0x39, s3trio_base + 0x1008000 + 0x3d4); + mem_out8(0xa0, s3trio_base + 0x1008000 + 0x3d5); - mem_out8(0x46, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8((x & 0x0700) >> 8, fb_fix.smem_start + 0x1008000 + 0x3d5); - mem_out8(0x47, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8(x & 0x00ff, fb_fix.smem_start + 0x1008000 + 0x3d5); - - mem_out8(0x48, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8((y & 0x0700) >> 8, fb_fix.smem_start + 0x1008000 + 0x3d5); - mem_out8(0x49, fb_fix.smem_start + 0x1008000 + 0x3d4); - mem_out8(y & 0x00ff, fb_fix.smem_start + 0x1008000 + 0x3d5); + mem_out8(0x46, s3trio_base + 0x1008000 + 0x3d4); + mem_out8((x & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5); + mem_out8(0x47, s3trio_base + 0x1008000 + 0x3d4); + mem_out8(x & 0x00ff, s3trio_base + 0x1008000 + 0x3d5); + + mem_out8(0x48, s3trio_base + 0x1008000 + 0x3d4); + mem_out8((y & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5); + mem_out8(0x49, s3trio_base + 0x1008000 + 0x3d4); + mem_out8(y & 0x00ff, s3trio_base + 0x1008000 + 0x3d5); } @@ -880,6 +934,6 @@ static struct display_switch fbcon_trio8 = { fbcon_cfb8_setup, fbcon_trio8_bmove, fbcon_trio8_clear, fbcon_trio8_putc, - fbcon_trio8_putcs, fbcon_trio8_revc + fbcon_trio8_putcs, fbcon_trio8_revc, NULL }; #endif diff -u --recursive --new-file v2.1.106/linux/drivers/video/amifb.c linux/drivers/video/amifb.c --- v2.1.106/linux/drivers/video/amifb.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/amifb.c Wed Jun 24 14:44:01 1998 @@ -579,8 +579,14 @@ #define modx(x,v) ((v) & ((x)-1)) /* if x1 is not a constant, this macro won't make real sense :-) */ +#ifdef __mc68000__ #define DIVUL(x1, x2) ({int res; asm("divul %1,%2,%3": "=d" (res): \ "d" (x2), "d" ((long)((x1)/0x100000000ULL)), "0" ((long)(x1))); res;}) +#else +/* We know a bit about the numbers, so we can do it this way */ +#define DIVUL(x1, x2) ((((long)((unsigned long long)x1 >> 8) / x2) << 8) + \ + ((((long)((unsigned long long)x1 >> 8) % x2) << 8) / x2)) +#endif #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) @@ -1245,7 +1251,7 @@ static struct fb_ops amifb_ops = { amifb_open, amifb_release, amifb_get_fix, amifb_get_var, amifb_set_var, amifb_get_cmap, amifb_set_cmap, - amifb_pan_display, NULL, amifb_ioctl + amifb_pan_display, amifb_ioctl }; @@ -1803,9 +1809,13 @@ * Calculate the Pixel Clock Values for this Machine */ - pixclock[TAG_SHRES] = DIVUL(25E9, amiga_eclock); /* SHRES: 35 ns / 28 MHz */ - pixclock[TAG_HIRES] = DIVUL(50E9, amiga_eclock); /* HIRES: 70 ns / 14 MHz */ - pixclock[TAG_LORES] = DIVUL(100E9, amiga_eclock); /* LORES: 140 ns / 7 MHz */ + { + u_long tmp = DIVUL(200E9, amiga_eclock); + + pixclock[TAG_SHRES] = (tmp + 4) / 8; /* SHRES: 35 ns / 28 MHz */ + pixclock[TAG_HIRES] = (tmp + 2) / 4; /* HIRES: 70 ns / 14 MHz */ + pixclock[TAG_LORES] = (tmp + 1) / 2; /* LORES: 140 ns / 7 MHz */ + } /* * Replace the Tag Values with the Real Pixel Clock Values @@ -2543,7 +2553,8 @@ struct amifb_par *par) { u_short clk_shift, line_shift; - int i; + + memset(var, 0, sizeof(struct fb_var_screeninfo)); clk_shift = par->clk_shift; line_shift = par->line_shift; @@ -2626,9 +2637,6 @@ if (par->vmode & FB_VMODE_YWRAP) var->vmode |= FB_VMODE_YWRAP; - for (i = 0; i < arraysize(var->reserved); i++) - var->reserved[i] = 0; - return 0; } @@ -2927,20 +2935,20 @@ custom.dmacon = DMAF_RASTER | DMAF_SPRITE; red = green = blue = 0; if (!IS_OCS && do_blank > 1) { - switch (do_blank) { - case 2 : /* suspend vsync */ + switch (do_blank-1) { + case VESA_VSYNC_SUSPEND: custom.hsstrt = hsstrt2hw(par->hsstrt); custom.hsstop = hsstop2hw(par->hsstop); custom.vsstrt = vsstrt2hw(par->vtotal+4); custom.vsstop = vsstop2hw(par->vtotal+4); break; - case 3 : /* suspend hsync */ + case VESA_HSYNC_SUSPEND: custom.hsstrt = hsstrt2hw(par->htotal+16); custom.hsstop = hsstop2hw(par->htotal+16); custom.vsstrt = vsstrt2hw(par->vsstrt); custom.vsstop = vsstrt2hw(par->vsstop); break; - case 4 : /* powerdown */ + case VESA_POWERDOWN: custom.hsstrt = hsstrt2hw(par->htotal+16); custom.hsstop = hsstop2hw(par->htotal+16); custom.vsstrt = vsstrt2hw(par->vtotal+4); diff -u --recursive --new-file v2.1.106/linux/drivers/video/atafb.c linux/drivers/video/atafb.c --- v2.1.106/linux/drivers/video/atafb.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/atafb.c Wed Jun 24 14:44:01 1998 @@ -492,6 +492,7 @@ fix->ypanstep=1; fix->ywrapstep=0; fix->line_length = 0; + fix->accel = FB_ACCEL_ATARIBLITT; return 0; } @@ -580,7 +581,8 @@ static int tt_encode_var( struct fb_var_screeninfo *var, struct atafb_par *par ) { - int linelen, i; + int linelen; + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->red.offset=0; var->red.length=4; var->red.msb_right=0; @@ -668,8 +670,6 @@ var->nonstd=0; var->activate=0; var->vmode=FB_VMODE_NONINTERLACED; - for (i=0; ireserved); i++) - var->reserved[i]=0; return 0; } @@ -816,6 +816,7 @@ fix->xpanstep = 2; } fix->line_length = 0; + fix->accel = FB_ACCEL_ATARIBLITT; return 0; } @@ -1306,11 +1307,12 @@ struct atafb_par *par ) { /* !!! only for VGA !!! */ - int linelen, i; + int linelen; int prescale, plen; int hdb_off, hde_off, base_off; struct falcon_hw *hw = &par->hw.falcon; + memset(var, 0, sizeof(struct fb_var_screeninfo)); /* possible frequencies: 25.175 or 32MHz */ var->pixclock = hw->sync & 0x1 ? fext.t : hw->vid_control & VCO_CLOCK25 ? f25.t : f32.t; @@ -1461,8 +1463,6 @@ var->yoffset=0; var->nonstd=0; /* what is this for? */ var->activate=0; - for (i=0; ireserved); i++) - var->reserved[i]=0; return 0; } @@ -1773,6 +1773,7 @@ } fix->ywrapstep = 0; fix->line_length = 0; + fix->accel = FB_ACCEL_ATARIBLITT; return 0; } @@ -1838,7 +1839,8 @@ static int stste_encode_var( struct fb_var_screeninfo *var, struct atafb_par *par ) { - int linelen, i; + int linelen; + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->red.offset=0; var->red.length = ATARIHW_PRESENT(EXTD_SHIFTER) ? 4 : 3; var->red.msb_right=0; @@ -1908,8 +1910,6 @@ var->nonstd=0; var->activate=0; var->vmode=FB_VMODE_NONINTERLACED; - for (i=0; ireserved); i++) - var->reserved[i]=0; return 0; } @@ -2145,8 +2145,7 @@ static int ext_encode_var( struct fb_var_screeninfo *var, struct atafb_par *par ) { - int i; - + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->red.offset=0; var->red.length=(external_pmode == -1) ? external_depth/3 : (external_vgaiobase ? external_bitspercol : 0); @@ -2181,8 +2180,6 @@ var->nonstd=0; var->activate=0; var->vmode=FB_VMODE_NONINTERLACED; - for (i=0; ireserved); i++) - var->reserved[i]=0; return 0; } @@ -2470,7 +2467,7 @@ atafb_get_var(&var, con, info); if (con == -1) con=0; - display->screen_base = (u_char *)fix.smem_start; + display->screen_base = fix.smem_start; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -2642,7 +2639,7 @@ static struct fb_ops atafb_ops = { atafb_open, atafb_release, atafb_get_fix, atafb_get_var, atafb_set_var, atafb_get_cmap, atafb_set_cmap, - atafb_pan_display, NULL, atafb_ioctl + atafb_pan_display, atafb_ioctl }; static void diff -u --recursive --new-file v2.1.106/linux/drivers/video/aty.h linux/drivers/video/aty.h --- v2.1.106/linux/drivers/video/aty.h Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/aty.h Wed Jun 24 14:44:01 1998 @@ -223,8 +223,8 @@ #define DP_BKGD_CLR 0x02C0 /* Dword offset 0_B0 */ #define DP_FOG_CLR 0x02C4 /* Dword offset 0_B1 */ #define DP_FRGD_CLR 0x02C4 /* Dword offset 0_B1 */ -#define DP_WRITE_MSK 0x02C8 /* Dword offset 0_B2 */ -#define DP_CHAIN_MSK 0x02CC /* Dword offset 0_B3 */ +#define DP_WRITE_MASK 0x02C8 /* Dword offset 0_B2 */ +#define DP_CHAIN_MASK 0x02CC /* Dword offset 0_B3 */ #define DP_PIX_WIDTH 0x02D0 /* Dword offset 0_B4 */ #define DP_MIX 0x02D4 /* Dword offset 0_B5 */ #define DP_SRC 0x02D8 /* Dword offset 0_B6 */ @@ -238,7 +238,7 @@ #define DP_SET_GUI_ENGINE 0x02FC /* Dword offset 0_BF */ #define CLR_CMP_CLR 0x0300 /* Dword offset 0_C0 */ -#define CLR_CMP_MSK 0x0304 /* Dword offset 0_C1 */ +#define CLR_CMP_MASK 0x0304 /* Dword offset 0_C1 */ #define CLR_CMP_CNTL 0x0308 /* Dword offset 0_C2 */ #define FIFO_STAT 0x0310 /* Dword offset 0_C4 */ @@ -569,7 +569,8 @@ #define PLL_WR_EN 0x02 /* PLL registers */ -#define PLL_MACRO_CNTL 0x01 +#define MPLL_CNTL 0x00 +#define VPLL_CNTL 0x01 #define PLL_REF_DIV 0x02 #define PLL_GEN_CNTL 0x03 #define MCLK_FB_DIV 0x04 @@ -579,7 +580,9 @@ #define VCLK1_FB_DIV 0x08 #define VCLK2_FB_DIV 0x09 #define VCLK3_FB_DIV 0x0A -#define PLL_XCLK_CNTL 0x0B +#define PLL_EXT_CNTL 0x0B +#define DLL_CNTL 0x0C +#define VFC_CNTL 0x0D #define PLL_TEST_CTRL 0x0E #define PLL_TEST_COUNT 0x0F @@ -688,28 +691,88 @@ /* ATI PCI constants */ #define PCI_ATI_VENDOR_ID 0x1002 -#define PCI_MACH64_GX 0x4758 -#define PCI_MACH64_CX 0x4358 -#define PCI_MACH64_CT 0x4354 -#define PCI_MACH64_ET 0x4554 -#define PCI_MACH64_VT 0x5654 -#define PCI_MACH64_GT 0x4754 + +/* 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 #define CFG_CHIP_CLASS 0x00FF0000 #define CFG_CHIP_REV 0xFF000000 -#define CFG_CHIP_VERSION 0x07000000 -#define CFG_CHIP_FOUNDRY 0x38000000 -#define CFG_CHIP_REVISION 0xC0000000 +#define CFG_CHIP_MAJOR 0x07000000 +#define CFG_CHIP_FND_ID 0x38000000 +#define CFG_CHIP_MINOR 0xC0000000 + /* Chip IDs read from CONFIG_CHIP_ID */ -#define MACH64_GX_ID 0xD7 -#define MACH64_CX_ID 0x57 -#define MACH64_CT_ID 0x4354 -#define MACH64_ET_ID 0x4554 -#define MACH64_VT_ID 0x5654 -#define MACH64_GT_ID 0x4754 + +/* mach64GX family */ +#define MACH64_GX_ID 0xD7 /* mach64GX (ATI888GX00) */ +#define MACH64_CX_ID 0x57 /* mach64CX (ATI888CX00) */ + +/* mach64CT family */ +#define MACH64_CT_ID PCI_MACH64_CT +#define MACH64_ET_ID PCI_MACH64_ET + +/* 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 + +/* 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 + + +/* Mach64 major ASIC revisions */ +#define MACH64_ASIC_NEC_VT_A3 0x08 +#define MACH64_ASIC_NEC_VT_A4 0x48 +#define MACH64_ASIC_SGS_VT_A4 0x40 +#define MACH64_ASIC_SGS_VT_B1S1 0x01 +#define MACH64_ASIC_SGS_GT_B1S1 0x01 +#define MACH64_ASIC_SGS_GT_B1S2 0x41 +#define MACH64_ASIC_UMC_GT_B2U1 0x1a +#define MACH64_ASIC_UMC_GT_B2U2 0x5a +#define MACH64_ASIC_UMC_VT_B2U3 0x9a +#define MACH64_ASIC_UMC_GT_B2U3 0x9a +#define MACH64_ASIC_UMC_R3B_D_P_A1 0x1b +#define MACH64_ASIC_UMC_R3B_D_P_A2 0x5b +#define MACH64_ASIC_UMC_R3B_D_P_A3 0x1c +#define MACH64_ASIC_UMC_R3B_D_P_A4 0x5c + +/* Mach64 foundries */ +#define MACH64_FND_SGS 0 +#define MACH64_FND_NEC 1 +#define MACH64_FND_UMC 3 /* Mach64 chip types */ #define MACH64_UNKNOWN 0 @@ -900,24 +963,4 @@ #define MACH64_NUM_CLOCKS 16 #define MACH64_NUM_FREQS 50 -/* Wait until "v" queue entries are free */ -#define aty_WaitQueue(v) { while ((aty_ld_le32(FIFO_STAT) & 0xffff) > \ - ((unsigned short)(0x8000 >> (v)))); } - -/* Wait until GP is idle and queue is empty */ -#define aty_WaitIdleEmpty() { aty_WaitQueue(16); \ - while ((aty_ld_le32(GUI_STAT) & 1) != 0); } - -#define SKIP_2(_v) ((((_v)<<1)&0xfff8)|((_v)&0x3)|(((_v)&0x80)>>5)) - -#define MACH64_BIT_BLT(_srcx, _srcy, _dstx, _dsty, _w, _h, _dir) \ -{ \ - aty_WaitQueue(5); \ - aty_st_le32(SRC_Y_X, (((_srcx) << 16) | ((_srcy) & 0x0000ffff))); \ - aty_st_le32(SRC_WIDTH1, (_w)); \ - aty_st_le32(DST_CNTL, (_dir)); \ - aty_st_le32(DST_Y_X, (((_dstx) << 16) | ((_dsty) & 0x0000ffff))); \ - aty_st_le32(DST_HEIGHT_WIDTH, (((_w) << 16) | ((_h) & 0x0000ffff))); \ -} #endif /* REGMACH64_H */ - diff -u --recursive --new-file v2.1.106/linux/drivers/video/atyfb.c linux/drivers/video/atyfb.c --- v2.1.106/linux/drivers/video/atyfb.c Sun Jun 7 11:16:35 1998 +++ linux/drivers/video/atyfb.c Wed Jun 24 14:44:01 1998 @@ -1,7 +1,8 @@ /* - * linux/drivers/video/atyfb.c -- Frame buffer device for ATI/Open Firmware + * linux/drivers/video/atyfb.c -- Frame buffer device for ATI Mach64 * * Copyright (C) 1997 Geert Uytterhoeven + * Copyright (C) 1998 Bernd Harries * * This driver is partly based on the PowerMac console driver: * @@ -20,6 +21,14 @@ * more details. */ +/****************************************************************************** + + TODO: + + - support arbitrary video modes + +******************************************************************************/ + #include #include #include @@ -36,10 +45,14 @@ #include #include #include -#include +#ifdef CONFIG_FB_COMPAT_XPMAC +#include +#endif #include +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) #include #include +#endif #include "aty.h" #include "fbcon.h" @@ -48,20 +61,28 @@ #include "fbcon-cfb32.h" +#ifndef __powerpc__ +#define eieio() /* Enforce In-order Execution of I/O */ +#endif + static int currcon = 0; static struct display fb_disp; -static struct fb_info fb_info; -static struct { u_char red, green, blue, pad; } palette[256]; static char atyfb_name[16] = "ATY Mach64"; struct atyfb_par { - int vmode; - int cmode; + union { + /* this should contain chipset specific mode information */ + struct { + int vmode; + int cmode; + } gx, gt, vt; + } hw; u_int vxres; /* virtual screen size */ u_int vyres; int xoffset; /* virtual screen position */ int yoffset; + int accel; }; @@ -103,34 +124,27 @@ #define CMODE_32 2 /* 32 (actually 24) bits/pixel */ -static int default_video_mode = VMODE_NVRAM; -static int default_color_mode = CMODE_NVRAM; - -static struct atyfb_par default_par; -static struct atyfb_par current_par; - +static int default_vmode = VMODE_NVRAM; +static int default_cmode = CMODE_NVRAM; +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) /* * Addresses in NVRAM where video mode and pixel size are stored. */ #define NV_VMODE 0x140f #define NV_CMODE 0x1410 +#endif /* CONFIG_PMAC || CONFIG_CHRP */ + /* - * Horizontal and vertical resolution information. + * Horizontal and vertical resolution for each mode. */ -extern struct vmode_attr { +static struct vmode_attr { int hres; int vres; int vfreq; int interlaced; -} vmode_attrs[VMODE_MAX]; - - -/* - * Horizontal and vertical resolution for each mode. - */ -static struct vmode_attr vmode_attrs[VMODE_MAX] = { +} vmode_attrs[VMODE_MAX] = { {512, 384, 60, 1}, {512, 384, 60}, {640, 480, 50, 1}, @@ -182,6 +196,7 @@ {0x72d, VMODE_832_624_75}, /* 16" RGB (Goldfish) */ {0x730, VMODE_768_576_50I}, /* PAL (Alternate) */ {0x73a, VMODE_1152_870_75}, /* 3rd party 19" */ + {0x73f, VMODE_640_480_67}, /* no sense lines connected at all */ {-1, VMODE_640_480_60}, /* catch-all, must be last */ }; @@ -196,44 +211,59 @@ } struct aty_cmap_regs { - unsigned char windex; - unsigned char lut; - unsigned char mask; - unsigned char rindex; - unsigned char cntl; + u8 windex; + u8 lut; + u8 mask; + u8 rindex; + u8 cntl; }; typedef struct aty_regvals { - int offset[3]; /* first pixel address */ + u32 offset[3]; /* first pixel address */ - int crtc_h_sync_strt_wid[3]; /* depth dependent */ - int crtc_gen_cntl[3]; - int mem_cntl[3]; - - int crtc_h_tot_disp; /* mode dependent */ - int crtc_v_tot_disp; - int crtc_v_sync_strt_wid; - int crtc_off_pitch; + u32 crtc_h_sync_strt_wid[3]; /* depth dependent */ + u32 crtc_gen_cntl[3]; + u32 mem_cntl[3]; + + u32 crtc_h_tot_disp; /* mode dependent */ + u32 crtc_v_tot_disp; + u32 crtc_v_sync_strt_wid; + u32 crtc_off_pitch; - unsigned char clock_val[2]; /* vals for 20 and 21 */ + u8 clock_val[2]; /* vals for 20 and 21 */ } aty_regvals; struct rage_regvals { - int h_total, h_sync_start, h_sync_width; - int v_total, v_sync_start, v_sync_width; - int h_sync_neg, v_sync_neg; + u32 h_total, h_sync_start, h_sync_width; + u32 v_total, v_sync_start, v_sync_width; + u32 h_sync_neg, v_sync_neg; }; -static int aty_vram_reqd(const struct atyfb_par *par); -static struct aty_regvals *get_aty_struct(int vmode); - -static unsigned long frame_buffer; +struct fb_info_aty { + struct fb_info fb_info; + unsigned long ati_regbase_phys; + unsigned long ati_regbase; + unsigned long frame_buffer_phys; + unsigned long frame_buffer; + u8 chip_class; + u8 pixclock_lim_8; /* ps, <= 8 bpp */ + u8 pixclock_lim_hi; /* ps, > 8 bpp */ + u32 total_vram; + struct aty_cmap_regs *aty_cmap_regs; + struct { u8 red, green, blue, pad; } palette[256]; + struct atyfb_par default_par; + struct atyfb_par current_par; +}; -static int total_vram; /* total amount of video memory, bytes */ -static int chip_type; /* what chip type was detected */ +#ifdef CONFIG_ATARI +static unsigned int mach64_count __initdata = 0; +static unsigned long phys_vmembase[FB_MAX] __initdata = { 0, }; +static unsigned long phys_size[FB_MAX] __initdata = { 0, }; +static unsigned long phys_guiregbase[FB_MAX] __initdata = { 0, }; +#endif -static unsigned long ati_regbase; -static struct aty_cmap_regs *aty_cmap_regs; +static int aty_vram_reqd(const struct atyfb_par *par); +static struct aty_regvals *get_aty_struct(int vmode, struct fb_info_aty *info); #include "ati-gx.h" #include "ati-gt.h" @@ -291,11 +321,54 @@ &aty_vt_reg_init_20 }; + +#define CLASS_GX 1 +#define CLASS_CT 2 +#define CLASS_VT 3 +#define CLASS_GT 4 + +struct aty_features { + u16 pci_id; + u16 chip_type; + const char *name; + u8 chip_class; + u8 pixclock_lim_8; /* MHz, <= 8 bpp (not sure about these limits!) */ + u8 pixclock_lim_hi; /* MHz, > 8 bpp (not sure about these limits!) */ +} aty_features[] __initdata = { + /* mach64GX family */ + { 0x4758, 0x00d7, "mach64GX (ATI888GX00)", CLASS_GX, 135, 80 }, + { 0x4358, 0x0057, "mach64CX (ATI888CX00)", CLASS_GX, 135, 80 }, + + /* mach64CT family */ + { 0x4354, 0x4354, "mach64CT (ATI264CT)", CLASS_CT, 135, 80 }, + { 0x4554, 0x4554, "mach64ET (ATI264ET)", CLASS_CT, 135, 80 }, + + /* mach64CT family / mach64VT class */ + { 0x5654, 0x5654, "mach64VT (ATI264VT)", CLASS_VT, 160, 135 }, + { 0x5655, 0x5655, "mach64VTB (ATI264VTB)", CLASS_VT, 160, 135 }, + { 0x5656, 0x5656, "mach64VT4 (ATI264VT4)", CLASS_VT, 160, 135 }, + + /* mach64CT family / mach64GT (3D RAGE) class */ + { 0x4742, 0x4742, "3D RAGE PRO (BGA, AGP)", CLASS_GT, 240, 240 }, + { 0x4744, 0x4744, "3D RAGE PRO (BGA, AGP, 1x only)", CLASS_GT, 240, 240 }, + { 0x4749, 0x4749, "3D RAGE PRO (BGA, PCI)", CLASS_GT, 240, 240 }, + { 0x4750, 0x4750, "3D RAGE PRO (PQFP, PCI)", CLASS_GT, 240, 240 }, + { 0x4751, 0x4751, "3D RAGE PRO (PQFP, PCI, limited 3D)", CLASS_GT, 240, 240 }, + { 0x4754, 0x4754, "3D RAGE (GT)", CLASS_GT, 200, 200 }, + { 0x4755, 0x4755, "3D RAGE II+ (GTB)", CLASS_GT, 200, 200 }, + { 0x4756, 0x4756, "3D RAGE IIC", CLASS_GT, 200, 200 }, + { 0x4c47, 0x4c47, "3D RAGE LT", CLASS_GT, 200, 200 }, +}; + + /* * Interface used by the world */ unsigned long atyfb_init(unsigned long mem_start); +#ifdef CONFIG_FB_OF +void atyfb_of_init(struct device_node *dp); +#endif void atyfb_setup(char *options, int *ints); static int atyfb_open(struct fb_info *info); @@ -332,6 +405,12 @@ #ifdef CONFIG_FBCON_CFB8 static struct display_switch fbcon_aty8; #endif +#ifdef CONFIG_FBCON_CFB16 +static struct display_switch fbcon_aty16; +#endif +#ifdef CONFIG_FBCON_CFB32 +static struct display_switch fbcon_aty32; +#endif #ifdef CONFIG_FB_COMPAT_XPMAC @@ -341,13 +420,19 @@ extern int (*console_set_cmap_ptr)(struct fb_cmap *, int, int, struct fb_info *); static int atyfb_console_setmode(struct vc_mode *, int); -#endif +#endif /* CONFIG_FB_COMPAT_XPMAC */ /* * Internal routines */ +static int aty_init(struct fb_info_aty *info, const char *name); +#ifndef CONFIG_FB_OF +static int store_video_par(char *videopar, unsigned char m64_num); +static char *strtoke(char *s, const char *ct); +#endif + static int atyfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, u_int *transp, struct fb_info *info); static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, @@ -357,352 +442,542 @@ static struct fb_ops atyfb_ops = { atyfb_open, atyfb_release, atyfb_get_fix, atyfb_get_var, atyfb_set_var, - atyfb_get_cmap, atyfb_set_cmap, atyfb_pan_display, NULL, atyfb_ioctl + atyfb_get_cmap, atyfb_set_cmap, atyfb_pan_display, atyfb_ioctl }; static inline int aty_vram_reqd(const struct atyfb_par *par) { - return (par->vxres*par->vyres) << par->cmode; + return (par->vxres*par->vyres) << par->hw.gx.cmode; } -extern inline unsigned aty_ld_le32(volatile unsigned long addr) +static inline u32 aty_ld_le32(volatile unsigned int regindex, + struct fb_info_aty *info) { - register unsigned long temp = ati_regbase,val; + unsigned long temp; + u32 val; - asm("lwbrx %0,%1,%2": "=r"(val):"r"(addr), "r"(temp)); +#ifdef __powerpc__ + temp = info->ati_regbase; + asm("lwbrx %0,%1,%2": "=r"(val):"r"(regindex), "r"(temp)); +#else + temp = info->ati_regbase+regindex; + val = le32_to_cpu(*((volatile u32 *)(temp))); +#endif return val; } -extern inline void aty_st_le32(volatile unsigned long addr, unsigned val) +static inline void aty_st_le32(volatile unsigned int regindex, u32 val, + struct fb_info_aty *info) { - register unsigned long temp = ati_regbase; + unsigned long temp; - asm("stwbrx %0,%1,%2": : "r"(val), "r"(addr), "r"(temp):"memory"); +#ifdef __powerpc__ + temp = info->ati_regbase; + asm("stwbrx %0,%1,%2": : "r"(val), "r"(regindex), "r"(temp):"memory"); +#else + temp = info->ati_regbase+regindex; + *((volatile u32 *)(temp)) = cpu_to_le32(val); +#endif } -extern inline unsigned char aty_ld_8(volatile unsigned long addr) +static inline u8 aty_ld_8(volatile unsigned int regindex, + struct fb_info_aty *info) { - return *(char *) ((long) addr + (long) ati_regbase); + return *(volatile u8 *)(info->ati_regbase+regindex); } -extern inline void aty_st_8(volatile unsigned long addr, unsigned char val) +static inline void aty_st_8(volatile unsigned int regindex, u8 val, + struct fb_info_aty *info) { - *(unsigned char *) (addr + (unsigned long) ati_regbase) = val; + *(volatile u8 *)(info->ati_regbase+regindex) = val; } -static void aty_st_514(int offset, char val) + /* + * All writes to draw engine registers are automatically routed through a + * 32-bit-wide, 16-entry-deep command FIFO ... + * Register writes to registers with DWORD offsets less than 40h are not + * FIFOed. + * (from Chapter 5 of the Mach64 Programmer's Guide) + */ + +static inline void wait_for_fifo(u16 entries, struct fb_info_aty *info) +{ + while ((aty_ld_le32(FIFO_STAT, info) & 0xffff) > + ((u32)(0x8000 >> entries))); +} + +static inline void wait_for_idle(struct fb_info_aty *info) { - aty_WaitQueue(5); - aty_st_8(DAC_CNTL, 1); - aty_st_8(DAC_W_INDEX, offset & 0xff); /* right addr byte */ - aty_st_8(DAC_DATA, (offset >> 8) & 0xff); /* left addr byte */ + wait_for_fifo(16, info); + while ((aty_ld_le32(GUI_STAT, info) & 1)!= 0); +} + +static void reset_engine(struct fb_info_aty *info) +{ + /* reset engine */ + aty_st_le32(GEN_TEST_CNTL, + aty_ld_le32(GEN_TEST_CNTL, info) & ~GUI_ENGINE_ENABLE, info); + /* enable engine */ + aty_st_le32(GEN_TEST_CNTL, + aty_ld_le32(GEN_TEST_CNTL, info) | GUI_ENGINE_ENABLE, info); + /* ensure engine is not locked up by clearing any FIFO or */ + /* HOST errors */ + aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL, info) | BUS_HOST_ERR_ACK | + BUS_FIFO_ERR_ACK, info); +} + +static void init_engine(const struct atyfb_par *par, struct fb_info_aty *info) +{ + u32 pitch_value; + + /* determine modal information from global mode structure */ + pitch_value = par->vxres; + +#if 0 + if (par->hw.gx.cmode == CMODE_24) { + /* In 24 bpp, the engine is in 8 bpp - this requires that all */ + /* horizontal coordinates and widths must be adjusted */ + pitch_value = pitch_value * 3; + } +#endif + + /* Reset engine, enable, and clear any engine errors */ + reset_engine(info); + /* Ensure that vga page pointers are set to zero - the upper */ + /* page pointers are set to 1 to handle overflows in the */ + /* lower page */ + aty_st_le32(MEM_VGA_WP_SEL, 0x00010000, info); + aty_st_le32(MEM_VGA_RP_SEL, 0x00010000, info); + + /* ---- Setup standard engine context ---- */ + + /* All GUI registers here are FIFOed - therefore, wait for */ + /* the appropriate number of empty FIFO entries */ + wait_for_fifo(14, info); + + /* enable all registers to be loaded for context loads */ + aty_st_le32(CONTEXT_MASK, 0xFFFFFFFF, info); + + /* set destination pitch to modal pitch, set offset to zero */ + aty_st_le32(DST_OFF_PITCH, (pitch_value / 8) << 22, info); + + /* zero these registers (set them to a known state) */ + aty_st_le32(DST_Y_X, 0, info); + aty_st_le32(DST_HEIGHT, 0, info); + aty_st_le32(DST_BRES_ERR, 0, info); + aty_st_le32(DST_BRES_INC, 0, info); + aty_st_le32(DST_BRES_DEC, 0, info); + + /* set destination drawing attributes */ + aty_st_le32(DST_CNTL, DST_LAST_PEL | DST_Y_TOP_TO_BOTTOM | + DST_X_LEFT_TO_RIGHT, info); + + /* set source pitch to modal pitch, set offset to zero */ + aty_st_le32(SRC_OFF_PITCH, (pitch_value / 8) << 22, info); + + /* set these registers to a known state */ + aty_st_le32(SRC_Y_X, 0, info); + aty_st_le32(SRC_HEIGHT1_WIDTH1, 1, info); + aty_st_le32(SRC_Y_X_START, 0, info); + aty_st_le32(SRC_HEIGHT2_WIDTH2, 1, info); + + /* set source pixel retrieving attributes */ + aty_st_le32(SRC_CNTL, SRC_LINE_X_LEFT_TO_RIGHT, info); + + /* set host attributes */ + wait_for_fifo(13, info); + aty_st_le32(HOST_CNTL, 0, info); + + /* set pattern attributes */ + aty_st_le32(PAT_REG0, 0, info); + aty_st_le32(PAT_REG1, 0, info); + aty_st_le32(PAT_CNTL, 0, info); + + /* set scissors to modal size */ + aty_st_le32(SC_LEFT, 0, info); + aty_st_le32(SC_TOP, 0, info); + aty_st_le32(SC_BOTTOM, par->vyres-1, info); + aty_st_le32(SC_RIGHT, pitch_value-1, info); + + /* set background color to minimum value (usually BLACK) */ + aty_st_le32(DP_BKGD_CLR, 0, info); + + /* set foreground color to maximum value (usually WHITE) */ + aty_st_le32(DP_FRGD_CLR, 0xFFFFFFFF, info); + + /* set write mask to effect all pixel bits */ + aty_st_le32(DP_WRITE_MASK, 0xFFFFFFFF, info); + + /* set foreground mix to overpaint and background mix to */ + /* no-effect */ + aty_st_le32(DP_MIX, FRGD_MIX_S | BKGD_MIX_D, info); + + /* set primary source pixel channel to foreground color */ + /* register */ + aty_st_le32(DP_SRC, FRGD_SRC_FRGD_CLR, info); + + /* set compare functionality to false (no-effect on */ + /* destination) */ + wait_for_fifo(3, info); + aty_st_le32(CLR_CMP_CLR, 0, info); + aty_st_le32(CLR_CMP_MASK, 0xFFFFFFFF, info); + aty_st_le32(CLR_CMP_CNTL, 0, info); + + /* set pixel depth */ + wait_for_fifo(2, info); + switch(par->hw.gx.cmode) { +#ifdef CONFIG_FBCON_CFB8 + case CMODE_8: + aty_st_le32(DP_PIX_WIDTH, HOST_8BPP | SRC_8BPP | DST_8BPP | + BYTE_ORDER_LSB_TO_MSB, + info); + aty_st_le32(DP_CHAIN_MASK, 0x8080, info); + break; +#endif +#ifdef CONFIG_FBCON_CFB16 + case CMODE_16: + aty_st_le32(DP_PIX_WIDTH, HOST_15BPP | SRC_15BPP | DST_15BPP | + BYTE_ORDER_LSB_TO_MSB, + info); + aty_st_le32(DP_CHAIN_MASK, 0x4210, info); + break; +#endif +#if 0 + case CMODE_24: + aty_st_le32(DP_PIX_WIDTH, HOST_8BPP | SRC_8BPP | DST_8BPP | + BYTE_ORDER_LSB_TO_MSB, + info); + aty_st_le32(DP_CHAIN_MASK, 0x8080, info); + break; +#endif +#ifdef CONFIG_FBCON_CFB32 + case CMODE_32: + aty_st_le32(DP_PIX_WIDTH, HOST_32BPP | SRC_32BPP | DST_32BPP | + BYTE_ORDER_LSB_TO_MSB, info); + aty_st_le32(DP_CHAIN_MASK, 0x8080, info); + break; +#endif + } + /* insure engine is idle before leaving */ + wait_for_idle(info); +} + +static void aty_st_514(int offset, u8 val, struct fb_info_aty *info) +{ + aty_st_8(DAC_CNTL, 1, info); + /* right addr byte */ + aty_st_8(DAC_W_INDEX, offset & 0xff, info); + /* left addr byte */ + aty_st_8(DAC_DATA, (offset >> 8) & 0xff, info); eieio(); - aty_st_8(DAC_MASK, val); + aty_st_8(DAC_MASK, val, info); eieio(); - aty_st_8(DAC_CNTL, 0); + aty_st_8(DAC_CNTL, 0, info); } -static void aty_st_pll(int offset, char val) +static void aty_st_pll(int offset, u8 val, struct fb_info_aty *info) { - aty_WaitQueue(3); - aty_st_8(CLOCK_CNTL + 1, (offset << 2) | PLL_WR_EN); /* write addr byte */ + /* write addr byte */ + aty_st_8(CLOCK_CNTL + 1, (offset << 2) | PLL_WR_EN, info); eieio(); - aty_st_8(CLOCK_CNTL + 2, val); /* write the register value */ + /* write the register value */ + aty_st_8(CLOCK_CNTL + 2, val, info); eieio(); - aty_st_8(CLOCK_CNTL + 1, (offset << 2) & ~PLL_WR_EN); + aty_st_8(CLOCK_CNTL + 1, (offset << 2) & ~PLL_WR_EN, info); } -static struct aty_regvals *get_aty_struct(int vmode) +static struct aty_regvals *get_aty_struct(int vmode, struct fb_info_aty *info) { int v = vmode - 1; - switch (chip_type) { - case MACH64_GT_ID: - return aty_gt_reg_init[v]; + switch (info->chip_class) { + case CLASS_GX: + return aty_gx_reg_init[v]; break; - case MACH64_VT_ID: + case CLASS_CT: + case CLASS_VT: return aty_vt_reg_init[v]; break; - default: /* default to MACH64_GX_ID */ - return aty_gx_reg_init[v]; + case CLASS_GT: + return aty_gt_reg_init[v]; break; + default: + /* should NOT happen */ + return NULL; } } -static int read_aty_sense(void) +static int read_aty_sense(struct fb_info_aty *info) { int sense, i; - aty_st_le32(GP_IO, 0x31003100); /* drive outputs high */ + aty_st_le32(GP_IO, 0x31003100, info); /* drive outputs high */ __delay(200); - aty_st_le32(GP_IO, 0); /* turn off outputs */ + aty_st_le32(GP_IO, 0, info); /* turn off outputs */ __delay(2000); - i = aty_ld_le32(GP_IO); /* get primary sense value */ + i = aty_ld_le32(GP_IO, info); /* get primary sense value */ sense = ((i & 0x3000) >> 3) | (i & 0x100); /* drive each sense line low in turn and collect the other 2 */ - aty_st_le32(GP_IO, 0x20000000); /* drive A low */ + aty_st_le32(GP_IO, 0x20000000, info); /* drive A low */ __delay(2000); - i = aty_ld_le32(GP_IO); + i = aty_ld_le32(GP_IO, info); sense |= ((i & 0x1000) >> 7) | ((i & 0x100) >> 4); - aty_st_le32(GP_IO, 0x20002000); /* drive A high again */ + aty_st_le32(GP_IO, 0x20002000, info); /* drive A high again */ __delay(200); - aty_st_le32(GP_IO, 0x10000000); /* drive B low */ + aty_st_le32(GP_IO, 0x10000000, info); /* drive B low */ __delay(2000); - i = aty_ld_le32(GP_IO); + i = aty_ld_le32(GP_IO, info); sense |= ((i & 0x2000) >> 10) | ((i & 0x100) >> 6); - aty_st_le32(GP_IO, 0x10001000); /* drive B high again */ + aty_st_le32(GP_IO, 0x10001000, info); /* drive B high again */ __delay(200); - aty_st_le32(GP_IO, 0x01000000); /* drive C low */ + aty_st_le32(GP_IO, 0x01000000, info); /* drive C low */ __delay(2000); - sense |= (aty_ld_le32(GP_IO) & 0x3000) >> 12; - aty_st_le32(GP_IO, 0); /* turn off outputs */ + sense |= (aty_ld_le32(GP_IO, info) & 0x3000) >> 12; + aty_st_le32(GP_IO, 0, info); /* turn off outputs */ return sense; } -static void RGB514_Program(int cmode) +static void RGB514_Program(int cmode, struct fb_info_aty *info) { typedef struct { - char pixel_dly; - char misc2_cntl; - char pixel_rep; - char pixel_cntl_index; - char pixel_cntl_v1; + u8 pixel_dly; + u8 misc2_cntl; + u8 pixel_rep; + u8 pixel_cntl_index; + u8 pixel_cntl_v1; } RGB514_DAC_Table; static RGB514_DAC_Table RGB514DAC_Tab[8] = { - {0, 0x41, 0x03, 0x71, 0x45}, // 8bpp - {0, 0x45, 0x04, 0x0c, 0x01}, // 555 - {0, 0x45, 0x06, 0x0e, 0x00}, // XRGB + {0, 0x41, 0x03, 0x71, 0x45}, /* 8bpp */ + {0, 0x45, 0x04, 0x0c, 0x01}, /* 555 */ + {0, 0x45, 0x06, 0x0e, 0x00}, /* XRGB */ }; RGB514_DAC_Table *pDacProgTab; pDacProgTab = &RGB514DAC_Tab[cmode]; - aty_st_514(0x90, 0x00); - aty_st_514(0x04, pDacProgTab->pixel_dly); - aty_st_514(0x05, 0x00); + aty_st_514(0x90, 0x00, info); + aty_st_514(0x04, pDacProgTab->pixel_dly, info); + aty_st_514(0x05, 0x00, info); - aty_st_514(0x2, 0x1); - aty_st_514(0x71, pDacProgTab->misc2_cntl); - aty_st_514(0x0a, pDacProgTab->pixel_rep); + aty_st_514(0x2, 0x1, info); + aty_st_514(0x71, pDacProgTab->misc2_cntl, info); + aty_st_514(0x0a, pDacProgTab->pixel_rep, info); - aty_st_514(pDacProgTab->pixel_cntl_index, pDacProgTab->pixel_cntl_v1); + aty_st_514(pDacProgTab->pixel_cntl_index, pDacProgTab->pixel_cntl_v1, + info); } -static void set_off_pitch(const struct atyfb_par *par) +static void set_off_pitch(const struct atyfb_par *par, + struct fb_info_aty *info) { u32 pitch, offset; pitch = par->vxres>>3; - offset = ((par->yoffset*par->vxres+par->xoffset)>>3)<cmode; - aty_st_le32(CRTC_OFF_PITCH, pitch<<22 | offset); - if (chip_type == MACH64_GT_ID) { - /* Is this OK for other chips? */ - aty_st_le32(DST_OFF_PITCH, pitch<<22 | offset); - aty_st_le32(SRC_OFF_PITCH, pitch<<22 | offset); - } + offset = ((par->yoffset*par->vxres+par->xoffset)>>3)<hw.gx.cmode; + aty_st_le32(CRTC_OFF_PITCH, pitch<<22 | offset, info); } -static void atyfb_set_par(struct atyfb_par *par) +static void atyfb_set_par(struct atyfb_par *par, struct fb_info_aty *info) { - int i, hres; - struct aty_regvals *init = get_aty_struct(par->vmode); - int vram_type = aty_ld_le32(CONFIG_STAT0) & 7; + int i, j, hres; + struct aty_regvals *init = get_aty_struct(par->hw.gx.vmode, info); + int vram_type = aty_ld_le32(CONFIG_STAT0, info) & 7; if (init == 0) /* paranoia, shouldn't get here */ - panic("aty: display mode %d not supported", par->vmode); + panic("aty: display mode %d not supported", par->hw.gx.vmode); - current_par = *par; - hres = vmode_attrs[par->vmode-1].hres; + info->current_par = *par; + hres = vmode_attrs[par->hw.gx.vmode-1].hres; - /* clear FIFO errors */ - aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL) | BUS_HOST_ERR_ACK - | BUS_FIFO_ERR_ACK); - - /* Reset engine */ - i = aty_ld_le32(GEN_TEST_CNTL); - aty_st_le32(GEN_TEST_CNTL, i & ~GUI_ENGINE_ENABLE); - eieio(); - aty_WaitIdleEmpty(); - aty_st_le32(GEN_TEST_CNTL, i | GUI_ENGINE_ENABLE); - aty_WaitIdleEmpty(); - - if ( chip_type != MACH64_GT_ID ) { - i = aty_ld_le32(CRTC_GEN_CNTL); - aty_st_le32(CRTC_GEN_CNTL, i | CRTC_EXT_DISP_EN); - } - - if ( chip_type == MACH64_GX_ID ) { - i = aty_ld_le32(GEN_TEST_CNTL); - aty_st_le32(GEN_TEST_CNTL, i | GEN_OVR_OUTPUT_EN ); - } - - switch (chip_type) { - case MACH64_VT_ID: - aty_st_pll(PLL_MACRO_CNTL, 0xb5); - aty_st_pll(PLL_REF_DIV, 0x2d); - aty_st_pll(PLL_GEN_CNTL, 0x14); - aty_st_pll(MCLK_FB_DIV, 0xbd); - aty_st_pll(PLL_VCLK_CNTL, 0x0b); - aty_st_pll(VCLK_POST_DIV, init->clock_val[0]); - aty_st_pll(VCLK0_FB_DIV, init->clock_val[1]); - aty_st_pll(VCLK1_FB_DIV, 0xd6); - aty_st_pll(VCLK2_FB_DIV, 0xee); - aty_st_pll(VCLK3_FB_DIV, 0xf8); - aty_st_pll(PLL_XCLK_CNTL, 0x0); - aty_st_pll(PLL_TEST_CTRL, 0x0); - aty_st_pll(PLL_TEST_COUNT, 0x0); + if (info->chip_class != CLASS_GT) { + i = aty_ld_le32(CRTC_GEN_CNTL, info); + aty_st_le32(CRTC_GEN_CNTL, i | CRTC_EXT_DISP_EN, info); + } + + if (info->chip_class == CLASS_GX) { + i = aty_ld_le32(GEN_TEST_CNTL, info); + aty_st_le32(GEN_TEST_CNTL, i | GEN_OVR_OUTPUT_EN, info); + } + + switch (info->chip_class) { + case CLASS_GX: + RGB514_Program(par->hw.gx.cmode, info); + wait_for_idle(info); + aty_st_514(0x06, 0x02, info); + aty_st_514(0x10, 0x01, info); + aty_st_514(0x70, 0x01, info); + aty_st_514(0x8f, 0x1f, info); + aty_st_514(0x03, 0x00, info); + aty_st_514(0x05, 0x00, info); + aty_st_514(0x20, init->clock_val[0], info); + aty_st_514(0x21, init->clock_val[1], info); + break; + case CLASS_CT: + case CLASS_VT: + aty_st_pll(VPLL_CNTL, 0xb5, info); + aty_st_pll(PLL_REF_DIV, 0x2d, info); + aty_st_pll(PLL_GEN_CNTL, 0x14, info); + aty_st_pll(MCLK_FB_DIV, 0xbd, info); + aty_st_pll(PLL_VCLK_CNTL, 0x0b, info); + aty_st_pll(VCLK_POST_DIV, init->clock_val[0], info); + aty_st_pll(VCLK0_FB_DIV, init->clock_val[1], info); + aty_st_pll(VCLK1_FB_DIV, 0xd6, info); + aty_st_pll(VCLK2_FB_DIV, 0xee, info); + aty_st_pll(VCLK3_FB_DIV, 0xf8, info); + aty_st_pll(PLL_EXT_CNTL, 0x0, info); + aty_st_pll(PLL_TEST_CTRL, 0x0, info); + aty_st_pll(PLL_TEST_COUNT, 0x0, info); break; - case MACH64_GT_ID: + case CLASS_GT: if (vram_type == 5) { - aty_st_pll(0, 0xcd); - aty_st_pll(PLL_MACRO_CNTL, - par->vmode >= VMODE_1024_768_60 ? 0xd3: 0xd5); - aty_st_pll(PLL_REF_DIV, 0x21); - aty_st_pll(PLL_GEN_CNTL, 0x44); - aty_st_pll(MCLK_FB_DIV, 0xe8); - aty_st_pll(PLL_VCLK_CNTL, 0x03); - aty_st_pll(VCLK_POST_DIV, init->offset[0]); - aty_st_pll(VCLK0_FB_DIV, init->offset[1]); - aty_st_pll(VCLK1_FB_DIV, 0x8e); - aty_st_pll(VCLK2_FB_DIV, 0x9e); - aty_st_pll(VCLK3_FB_DIV, 0xc6); - aty_st_pll(PLL_XCLK_CNTL, init->offset[2]); - aty_st_pll(12, 0xa6); - aty_st_pll(13, 0x1b); + aty_st_pll(MPLL_CNTL, 0xcd, info); + aty_st_pll(VPLL_CNTL, + par->hw.gx.vmode >= VMODE_1024_768_60 ? 0xd3 + : 0xd5, + info); + aty_st_pll(PLL_REF_DIV, 0x21, info); + aty_st_pll(PLL_GEN_CNTL, 0x44, info); + aty_st_pll(MCLK_FB_DIV, 0xe8, info); + aty_st_pll(PLL_VCLK_CNTL, 0x03, info); + aty_st_pll(VCLK_POST_DIV, init->offset[0], info); + aty_st_pll(VCLK0_FB_DIV, init->offset[1], info); + aty_st_pll(VCLK1_FB_DIV, 0x8e, info); + aty_st_pll(VCLK2_FB_DIV, 0x9e, info); + aty_st_pll(VCLK3_FB_DIV, 0xc6, info); + aty_st_pll(PLL_EXT_CNTL, init->offset[2], info); + aty_st_pll(DLL_CNTL, 0xa6, info); + aty_st_pll(VFC_CNTL, 0x1b, info); } else { - aty_st_pll(PLL_MACRO_CNTL, 0xd5); - aty_st_pll(PLL_REF_DIV, 0x21); - aty_st_pll(PLL_GEN_CNTL, 0xc4); - aty_st_pll(MCLK_FB_DIV, 0xda); - aty_st_pll(PLL_VCLK_CNTL, 0x03); + aty_st_pll(VPLL_CNTL, 0xd5, info); + aty_st_pll(PLL_REF_DIV, 0x21, info); + aty_st_pll(PLL_GEN_CNTL, 0xc4, info); + aty_st_pll(MCLK_FB_DIV, 0xda, info); + aty_st_pll(PLL_VCLK_CNTL, 0x03, info); /* offset actually holds clock values */ - aty_st_pll(VCLK_POST_DIV, init->offset[0]); - aty_st_pll(VCLK0_FB_DIV, init->offset[1]); - aty_st_pll(VCLK1_FB_DIV, 0x8e); - aty_st_pll(VCLK2_FB_DIV, 0x9e); - aty_st_pll(VCLK3_FB_DIV, 0xc6); - aty_st_pll(PLL_TEST_CTRL, 0x0); - aty_st_pll(PLL_XCLK_CNTL, init->offset[2]); - aty_st_pll(12, 0xa0); - aty_st_pll(13, 0x1b); + aty_st_pll(VCLK_POST_DIV, init->offset[0], info); + aty_st_pll(VCLK0_FB_DIV, init->offset[1], info); + aty_st_pll(VCLK1_FB_DIV, 0x8e, info); + aty_st_pll(VCLK2_FB_DIV, 0x9e, info); + aty_st_pll(VCLK3_FB_DIV, 0xc6, info); + aty_st_pll(PLL_TEST_CTRL, 0x0, info); + aty_st_pll(PLL_EXT_CNTL, init->offset[2], info); + aty_st_pll(DLL_CNTL, 0xa0, info); + aty_st_pll(VFC_CNTL, 0x1b, info); } break; - default: - RGB514_Program(par->cmode); - aty_WaitIdleEmpty(); - aty_st_514(0x06, 0x02); - aty_st_514(0x10, 0x01); - aty_st_514(0x70, 0x01); - aty_st_514(0x8f, 0x1f); - aty_st_514(0x03, 0x00); - aty_st_514(0x05, 0x00); - aty_st_514(0x20, init->clock_val[0]); - aty_st_514(0x21, init->clock_val[1]); - break; } - aty_ld_8(DAC_REGS); /* clear counter */ - aty_WaitIdleEmpty(); - - aty_st_le32(CRTC_H_TOTAL_DISP, init->crtc_h_tot_disp); - aty_st_le32(CRTC_H_SYNC_STRT_WID, init->crtc_h_sync_strt_wid[par->cmode]); - aty_st_le32(CRTC_V_TOTAL_DISP, init->crtc_v_tot_disp); - aty_st_le32(CRTC_V_SYNC_STRT_WID, init->crtc_v_sync_strt_wid); - - aty_st_8(CLOCK_CNTL, 0); - aty_st_8(CLOCK_CNTL, CLOCK_STROBE); - - aty_st_le32(CRTC_VLINE_CRNT_VLINE, 0); - - set_off_pitch(par); - - if (chip_type == MACH64_GT_ID) { - aty_st_le32(BUS_CNTL, 0x7b23a040); - - /* need to set DSP values !! assume sdram */ - i = init->crtc_gen_cntl[0] - (0x100000 * par->cmode); - if ( vram_type == 5 ) - i = init->crtc_gen_cntl[1] - (0x100000 * par->cmode); - aty_st_le32(DSP_CONFIG, i); - - i = aty_ld_le32(MEM_CNTL) & MEM_SIZE_ALIAS; - if ( vram_type == 5 ) { - i |= ((1 * par->cmode) << 26) | 0x4215b0; - aty_st_le32(DSP_ON_OFF,sgram_dsp[par->vmode-1][par->cmode]); - - //aty_st_le32(CLOCK_CNTL,8192); - } else { - i |= ((1 * par->cmode) << 26) | 0x300090; - aty_st_le32(DSP_ON_OFF, init->mem_cntl[par->cmode]); - } - - aty_st_le32(MEM_CNTL, i); - aty_st_le32(EXT_MEM_CNTL, 0x5000001); + aty_ld_8(DAC_REGS, info); /* clear counter */ + wait_for_idle(info); - /* if (total_vram > 0x400000) - i |= 0x538; this not been verified on > 4Megs!! */ - } else { - -/* The magic constant below translates into: -* 5 = No RDY delay, 1 wait st for mem write, increment during burst transfer -* 9 = DAC access delayed, 1 wait state for DAC -* 0 = Disables interupts for FIFO errors -* e = Allows FIFO to generate 14 wait states before generating error -* 1 = DAC snooping disabled, ROM disabled -* 0 = ROM page at 0 (disabled so doesn't matter) -* f = 15 ROM wait states (disabled so doesn't matter) -* f = 15 BUS wait states (I'm not sure this applies to PCI bus types) -* at some point it would be good to experiment with bench marks to see if -* we can gain some speed by fooling with the wait states etc. -*/ - if (chip_type == MACH64_VT_ID) - aty_st_le32(BUS_CNTL, 0x680000f9); - else - aty_st_le32(BUS_CNTL, 0x590e10ff); - - switch (total_vram) { - case 0x00100000: - aty_st_le32(MEM_CNTL, vt_mem_cntl[0][par->cmode]); - break; - case 0x00200000: - aty_st_le32(MEM_CNTL, vt_mem_cntl[1][par->cmode]); - break; - case 0x00400000: - aty_st_le32(MEM_CNTL, vt_mem_cntl[2][par->cmode]); - break; - default: - i = aty_ld_le32(MEM_CNTL) & 0x000F; - aty_st_le32(MEM_CNTL, - (init->mem_cntl[par->cmode] & 0xFFFFFFF0) | i); - } - } -/* These magic constants are harder to figure out -* on the vt chipset bit 2 set makes the screen brighter -* and bit 15 makes the screen black! But nothing else -* seems to matter for the vt DAC_CNTL -*/ - switch (chip_type) { - case MACH64_GT_ID: - i = 0x86010102; + aty_st_le32(CRTC_H_TOTAL_DISP, init->crtc_h_tot_disp, info); + aty_st_le32(CRTC_H_SYNC_STRT_WID, + init->crtc_h_sync_strt_wid[par->hw.gx.cmode], info); + aty_st_le32(CRTC_V_TOTAL_DISP, init->crtc_v_tot_disp, info); + aty_st_le32(CRTC_V_SYNC_STRT_WID, init->crtc_v_sync_strt_wid, info); + + aty_st_8(CLOCK_CNTL, 0, info); + aty_st_8(CLOCK_CNTL, CLOCK_STROBE, info); + + aty_st_le32(CRTC_VLINE_CRNT_VLINE, 0, info); + + set_off_pitch(par, info); + + switch (info->chip_class) { + case CLASS_GX: + /* The magic constant below translates into: + * 5 = No RDY delay, 1 wait st for mem write, increment during + * burst transfer + * 9 = DAC access delayed, 1 wait state for DAC + * 0 = Disables interupts for FIFO errors + * e = Allows FIFO to generate 14 wait states before generating + * error + * 1 = DAC snooping disabled, ROM disabled + * 0 = ROM page at 0 (disabled so doesn't matter) + * f = 15 ROM wait states (disabled so doesn't matter) + * f = 15 BUS wait states (I'm not sure this applies to PCI bus + * types) + * at some point it would be good to experiment with bench marks to + * if we can gain some speed by fooling with the wait states etc. + */ + aty_st_le32(BUS_CNTL, 0x890e20f1 /* 0x590e10ff */, info); + j = 0x47012100; + j = 0x47052100; break; - case MACH64_VT_ID: - i = 0x87010184; + + case CLASS_CT: + case CLASS_VT: + aty_st_le32(BUS_CNTL, 0x680000f9, info); + switch (info->total_vram) { + case 0x00100000: + aty_st_le32(MEM_CNTL, vt_mem_cntl[0][par->hw.gx.cmode], + info); + break; + case 0x00200000: + aty_st_le32(MEM_CNTL, vt_mem_cntl[1][par->hw.gx.cmode], + info); + break; + case 0x00400000: + aty_st_le32(MEM_CNTL, vt_mem_cntl[2][par->hw.gx.cmode], + info); + break; + default: + i = aty_ld_le32(MEM_CNTL, info) & 0x000F; + aty_st_le32(MEM_CNTL, + (init->mem_cntl[par->hw.gx.cmode] & + 0xFFFFFFF0) | i, + info); + } + j = 0x87010184; break; - default: - i = 0x47012100; + + case CLASS_GT: + aty_st_le32(BUS_CNTL, 0x7b23a040, info); + + /* need to set DSP values !! assume sdram */ + i = init->crtc_gen_cntl[0] - (0x100000 * par->hw.gx.cmode); + if ( vram_type == 5 ) + i = init->crtc_gen_cntl[1] - (0x100000 * par->hw.gx.cmode); + aty_st_le32(DSP_CONFIG, i, info); + + i = aty_ld_le32(MEM_CNTL, info) & MEM_SIZE_ALIAS; + if ( vram_type == 5 ) { + i |= ((1 * par->hw.gx.cmode) << 26) | 0x4215b0; + aty_st_le32(DSP_ON_OFF, + sgram_dsp[par->hw.gx.vmode-1][par->hw.gx.cmode], + info); + + /* aty_st_le32(CLOCK_CNTL, 8192, info); */ + } else { + i |= ((1 * par->hw.gx.cmode) << 26) | 0x300090; + aty_st_le32(DSP_ON_OFF, init->mem_cntl[par->hw.gx.cmode], + info); + } + aty_st_le32(MEM_CNTL, i, info); + aty_st_le32(EXT_MEM_CNTL, 0x5000001, info); + + /* if (info->total_vram > 0x400000) + i |= 0x538; this not been verified on > 4Megs!! */ + + j = 0x86010102; break; } - aty_st_le32(DAC_CNTL, i); - aty_st_8(DAC_MASK, 0xff); + /* These magic constants (variable j) are harder to figure out + * on the vt chipset bit 2 set makes the screen brighter + * and bit 15 makes the screen black! But nothing else + * seems to matter for the vt DAC_CNTL + */ + aty_st_le32(DAC_CNTL, j, info); + aty_st_8(DAC_MASK, 0xff, info); - switch (par->cmode) { + switch (par->hw.gx.cmode) { case CMODE_16: i = CRTC_PIX_WIDTH_15BPP; break; /*case CMODE_24: */ @@ -713,28 +988,35 @@ i = CRTC_PIX_WIDTH_8BPP; break; } - if (chip_type != MACH64_GT_ID) { - aty_st_le32(CRTC_INT_CNTL, 0x00000002); - aty_st_le32(GEN_TEST_CNTL, GUI_ENGINE_ENABLE | BLOCK_WRITE_ENABLE); /* gui_en block_en */ - i |= init->crtc_gen_cntl[par->cmode]; + if (info->chip_class != CLASS_GT) { + aty_st_le32(CRTC_INT_CNTL, 0x00000002, info); + aty_st_le32(GEN_TEST_CNTL, GUI_ENGINE_ENABLE | BLOCK_WRITE_ENABLE, + info); /* gui_en block_en */ + i |= init->crtc_gen_cntl[par->hw.gx.cmode]; } /* Gentlemen, start your crtc engine */ - aty_st_le32(CRTC_GEN_CNTL, CRTC_EXT_DISP_EN | CRTC_ENABLE | i); + aty_st_le32(CRTC_GEN_CNTL, CRTC_EXT_DISP_EN | CRTC_ENABLE | i, info); + + /* Initialize the graphics engine */ + if (par->accel & FB_ACCELF_TEXT) + init_engine(par, info); #ifdef CONFIG_FB_COMPAT_XPMAC - display_info.height = vmode_attrs[par->vmode-1].vres; - display_info.width = vmode_attrs[par->vmode-1].hres; - display_info.depth = 8<cmode; - display_info.pitch = par->vxres<cmode; - display_info.mode = par->vmode; - strcpy(display_info.name, atyfb_name); - display_info.fb_address = - iopa(((chip_type != MACH64_GT_ID) ? - frame_buffer + init->offset[par->cmode] : frame_buffer)); - display_info.cmap_adr_address = iopa((unsigned long)&aty_cmap_regs->windex); - display_info.cmap_data_address = iopa((unsigned long)&aty_cmap_regs->lut); - display_info.disp_reg_address = iopa(ati_regbase); -#endif /* CONFIG_FB_COMPAT_XPMAC) */ + if (console_fb_info == &info->fb_info) { + display_info.height = vmode_attrs[par->hw.gx.vmode-1].vres; + display_info.width = vmode_attrs[par->hw.gx.vmode-1].hres; + display_info.depth = 8<hw.gx.cmode; + display_info.pitch = par->vxres<hw.gx.cmode; + display_info.mode = par->hw.gx.vmode; + strcpy(display_info.name, atyfb_name); + display_info.fb_address = info->frame_buffer_phys; + if (info->chip_class == CLASS_VT) + display_info.fb_address += init->offset[par->hw.gx.cmode]; + display_info.cmap_adr_address = info->ati_regbase_phys+0xc0; + display_info.cmap_data_address = info->ati_regbase_phys+0xc1; + display_info.disp_reg_address = info->ati_regbase_phys; + } +#endif /* CONFIG_FB_COMPAT_XPMAC */ } @@ -761,30 +1043,67 @@ static int encode_fix(struct fb_fix_screeninfo *fix, - const struct atyfb_par *par) + const struct atyfb_par *par, struct fb_info_aty *info) { struct aty_regvals *init; memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id, atyfb_name); - init = get_aty_struct(par->vmode); + init = get_aty_struct(par->hw.gx.vmode, info); /* * FIXME: This will cause problems on non-GT chips, because the frame * buffer must be aligned to a page */ - fix->smem_start = (char *)((chip_type != MACH64_GT_ID) - ? frame_buffer + init->offset[par->cmode] : frame_buffer); - fix->smem_len = (u32)total_vram; - if (fix->smem_len > 0x7ff000) - fix->smem_len = 0x7ff000; /* last page is MMIO */ - fix->mmio_start = (char *)(ati_regbase & ~0xfff); - fix->mmio_len = 4096; + fix->smem_start = (char *)info->frame_buffer_phys; + if (info->chip_class == CLASS_VT) + fix->smem_start += init->offset[par->hw.gx.cmode]; + fix->smem_len = (u32)info->total_vram; + +#ifdef __LITTLE_ENDIAN + /* + * Last page of 8 MB little-endian aperture is MMIO + * FIXME: we should use the auxillary aperture instead so we can acces the + * full 8 MB of video RAM on 8 MB boards + */ + if (fix->smem_len > 0x800000-PAGE_SIZE) + fix->smem_len = 0x800000-PAGE_SIZE; +#endif + /* + * Reg Block 0 (CT-compatible block) is at ati_regbase_phys + * Reg Block 1 (multimedia extensions) is at ati_regbase_phys-0x400 + */ + switch (info->chip_class) { + case CLASS_GX: + fix->mmio_start = (char *)info->ati_regbase_phys; + fix->mmio_len = 0x400; + fix->accel = FB_ACCEL_ATI_MACH64GX; + break; + case CLASS_CT: + fix->mmio_start = (char *)info->ati_regbase_phys; + fix->mmio_len = 0x400; + fix->accel = FB_ACCEL_ATI_MACH64CT; + break; + case CLASS_VT: + fix->mmio_start = (char *)(info->ati_regbase_phys-0x400); + fix->mmio_len = 0x800; + fix->accel = FB_ACCEL_ATI_MACH64VT; + break; + case CLASS_GT: + fix->mmio_start = (char *)(info->ati_regbase_phys-0x400); + fix->mmio_len = 0x800; + fix->accel = FB_ACCEL_ATI_MACH64GT; + break; + default: + fix->mmio_start = NULL; + fix->mmio_len = 0; + fix->accel = 0; + } fix->type = FB_TYPE_PACKED_PIXELS; fix->type_aux = 0; - fix->line_length = par->vxres<cmode; - fix->visual = par->cmode == CMODE_8 ? FB_VISUAL_PSEUDOCOLOR - : FB_VISUAL_TRUECOLOR; + fix->line_length = par->vxres<hw.gx.cmode; + fix->visual = par->hw.gx.cmode == CMODE_8 ? FB_VISUAL_PSEUDOCOLOR + : FB_VISUAL_TRUECOLOR; fix->ywrapstep = 0; fix->xpanstep = 8; fix->ypanstep = 1; @@ -794,7 +1113,7 @@ static int decode_var(struct fb_var_screeninfo *var, - struct atyfb_par *par) + struct atyfb_par *par, struct fb_info_aty *info) { int xres = var->xres; int yres = var->yres; @@ -804,30 +1123,30 @@ /* This should support more video modes */ if (xres <= 512 && yres <= 384) - par->vmode = VMODE_512_384_60; /* 512x384, 60Hz */ + par->hw.gx.vmode = VMODE_512_384_60; /* 512x384, 60Hz */ else if (xres <= 640 && yres <= 480) - par->vmode = VMODE_640_480_67; /* 640x480, 67Hz */ + par->hw.gx.vmode = VMODE_640_480_67; /* 640x480, 67Hz */ else if (xres <= 640 && yres <= 870) - par->vmode = VMODE_640_870_75P; /* 640x870, 75Hz (portrait) */ + par->hw.gx.vmode = VMODE_640_870_75P; /* 640x870, 75Hz (portrait) */ else if (xres <= 768 && yres <= 576) - par->vmode = VMODE_768_576_50I; /* 768x576, 50Hz (PAL full frame) */ + par->hw.gx.vmode = VMODE_768_576_50I; /* 768x576, 50Hz (PAL full frame) */ else if (xres <= 800 && yres <= 600) - par->vmode = VMODE_800_600_75; /* 800x600, 75Hz */ + par->hw.gx.vmode = VMODE_800_600_75; /* 800x600, 75Hz */ else if (xres <= 832 && yres <= 624) - par->vmode = VMODE_832_624_75; /* 832x624, 75Hz */ + par->hw.gx.vmode = VMODE_832_624_75; /* 832x624, 75Hz */ else if (xres <= 1024 && yres <= 768) - par->vmode = VMODE_1024_768_75; /* 1024x768, 75Hz */ + par->hw.gx.vmode = VMODE_1024_768_75; /* 1024x768, 75Hz */ else if (xres <= 1152 && yres <= 870) - par->vmode = VMODE_1152_870_75; /* 1152x870, 75Hz */ + par->hw.gx.vmode = VMODE_1152_870_75; /* 1152x870, 75Hz */ else if (xres <= 1280 && yres <= 960) - par->vmode = VMODE_1280_960_75; /* 1280x960, 75Hz */ + par->hw.gx.vmode = VMODE_1280_960_75; /* 1280x960, 75Hz */ else if (xres <= 1280 && yres <= 1024) - par->vmode = VMODE_1280_1024_75; /* 1280x1024, 75Hz */ + par->hw.gx.vmode = VMODE_1280_1024_75; /* 1280x1024, 75Hz */ else return -EINVAL; - xres = vmode_attrs[par->vmode-1].hres; - yres = vmode_attrs[par->vmode-1].vres; + xres = vmode_attrs[par->hw.gx.vmode-1].hres; + yres = vmode_attrs[par->hw.gx.vmode-1].vres; if (var->xres_virtual <= xres) par->vxres = xres; @@ -844,23 +1163,29 @@ return -EINVAL; if (bpp <= 8) - par->cmode = CMODE_8; + par->hw.gx.cmode = CMODE_8; else if (bpp <= 16) - par->cmode = CMODE_16; + par->hw.gx.cmode = CMODE_16; else if (bpp <= 32) - par->cmode = CMODE_32; + par->hw.gx.cmode = CMODE_32; else return -EINVAL; - if (aty_vram_reqd(par) > total_vram) + if (var->accel_flags & FB_ACCELF_TEXT) + par->accel = FB_ACCELF_TEXT; + else + par->accel = 0; + + if (aty_vram_reqd(par) > info->total_vram) return -EINVAL; /* Check if we know about the wanted video mode */ - init = get_aty_struct(par->vmode); - if (init == NULL || init->crtc_h_sync_strt_wid[par->cmode] == 0 || - (chip_type != MACH64_GT_ID && - init->crtc_gen_cntl[par->cmode] == 0) || - (chip_type == MACH64_GT_ID && (aty_ld_le32(CONFIG_STAT0) & 7) == 5 && + init = get_aty_struct(par->hw.gx.vmode, info); + if (init == NULL || init->crtc_h_sync_strt_wid[par->hw.gx.cmode] == 0 || + (info->chip_class != CLASS_GT && + init->crtc_gen_cntl[par->hw.gx.cmode] == 0) || + (info->chip_class == CLASS_GT && + (aty_ld_le32(CONFIG_STAT0, info) & 7) == 5 && init->crtc_gen_cntl[1] == 0)) return -EINVAL; @@ -873,18 +1198,31 @@ } static int encode_var(struct fb_var_screeninfo *var, - const struct atyfb_par *par) + const struct atyfb_par *par, + struct fb_info_aty *info) { + int vmode = par->hw.gx.vmode; + int cmode = par->hw.gx.cmode; + struct aty_regvals *init = get_aty_struct(vmode, info); + u_int h_total, h_disp; + u_int h_sync_strt, h_sync_dly, h_sync_wid, h_sync_pol; + u_int v_total, v_disp; + u_int v_sync_strt, v_sync_wid, v_sync_pol; + u_int xtalin, vclk; + u8 pll_ref_div, vclk_fb_div, vclk_post_div, pll_ext_cntl; + memset(var, 0, sizeof(struct fb_var_screeninfo)); + if (!init) + return -EINVAL; - var->xres = vmode_attrs[par->vmode-1].hres; - var->yres = vmode_attrs[par->vmode-1].vres; + var->xres = vmode_attrs[vmode-1].hres; + var->yres = vmode_attrs[vmode-1].vres; var->xres_virtual = par->vxres; var->yres_virtual = par->vyres; var->xoffset = par->xoffset; var->yoffset = par->yoffset; var->grayscale = 0; - switch (par->cmode) { + switch (cmode) { case CMODE_8: var->bits_per_pixel = 8; var->red.offset = 0; @@ -927,21 +1265,97 @@ var->activate = 0; var->height = -1; var->width = -1; - var->accel = /* FB_ACCEL_ATY */ 0; var->vmode = FB_VMODE_NONINTERLACED; - var->left_margin = var->right_margin = 64; /* guesses */ - var->upper_margin = var->lower_margin = 32; - var->hsync_len = 64; - var->vsync_len = 2; - - /* no long long support in the kernel :-( */ - /* this splittig trick will work if xres > 232 */ - var->pixclock = 1000000000/ - (var->left_margin+var->xres+var->right_margin+var->hsync_len); - var->pixclock *= 1000; - var->pixclock /= vmode_attrs[par->vmode-1].vfreq* - (var->upper_margin+var->yres+var->lower_margin+var->vsync_len); - var->sync = 0; + var->accel_flags = par->accel; + + h_total = (init->crtc_h_tot_disp<<3) & 0xff8; + h_disp = (init->crtc_h_tot_disp>>13) & 0x7f8; + h_sync_strt = ((init->crtc_h_sync_strt_wid[cmode]<<3) & 0x7f8) | + ((init->crtc_h_sync_strt_wid[cmode]>>1) & 0x800); + h_sync_dly = (init->crtc_h_sync_strt_wid[cmode]>>8) & 0x7; + h_sync_wid = (init->crtc_h_sync_strt_wid[cmode]>>13) & 0xf8; + h_sync_pol = (init->crtc_h_sync_strt_wid[cmode]>>21) & 0x1; + + v_total = init->crtc_v_tot_disp & 0x7ff; + v_disp = (init->crtc_v_tot_disp>>16) & 0x7ff; + v_sync_strt = init->crtc_v_sync_strt_wid & 0x7ff; + v_sync_wid = (init->crtc_v_sync_strt_wid>>16) & 0x1f; + v_sync_pol = (init->crtc_v_sync_strt_wid>>21) & 0x1; + + var->left_margin = (h_total+8)-h_sync_strt-h_sync_wid; + var->right_margin = h_sync_strt-(h_disp+8); + var->upper_margin = (v_total+1)-v_sync_strt-v_sync_wid; + var->lower_margin = v_sync_strt-(v_disp+1); + var->hsync_len = h_sync_wid; + var->vsync_len = v_sync_wid; + var->sync = (h_sync_pol ? 0 : FB_SYNC_HOR_HIGH_ACT) | + (v_sync_pol ? 0 : FB_SYNC_VERT_HIGH_ACT); + + xtalin = 69841; /* 14.31818 MHz */ + switch (info->chip_class) { + case CLASS_GX: + { + /* haven't read the IBM RGB514 PDF yet, so just guesses */ + static u32 gx_vclk[VMODE_MAX] = { + 0, /* vmode 1 */ + 0, /* vmode 2 */ + 0, /* vmode 3 */ + 0, /* vmode 4 */ + 39722, /* vmode 5 (25.175 MHz) */ + 33333, /* vmode 6 (30 MHz) */ + 0, /* vmode 7 */ + 0, /* vmode 8 */ + 27778, /* vmode 9 (36 MHz) */ + 25000, /* vmode 10 (40 MHz) */ + 20000, /* vmode 11 (50 MHz) */ + 20000, /* vmode 12 (50 MHz) */ + 17544, /* vmode 13 (57 MHz) */ + 15385, /* vmode 14 (65 MHz) */ + 13333, /* vmode 15 (75 MHz) */ + 0, /* vmode 16 */ + 12821, /* vmode 17 (78 MHz) */ + 10000, /* vmode 18 (100 MHz) */ + 7937, /* vmode 19 (126 MHz) */ + 7407 /* vmode 20 (135 MHz) */ + }; + vclk = gx_vclk[vmode-1]; + } + break; + case CLASS_CT: + case CLASS_GT: + case CLASS_VT: + if (info->chip_class == CLASS_GT) { + pll_ref_div = 0x21; + vclk_post_div = init->offset[0]; + vclk_fb_div = init->offset[1]; + pll_ext_cntl = init->offset[2]; + } else { + pll_ref_div = 0x2d; + vclk_post_div = init->clock_val[0]; + vclk_fb_div = init->clock_val[1]; + pll_ext_cntl = 0x0; + } + vclk = xtalin*pll_ref_div; + switch (vclk_post_div & 3) { + case 0: + vclk *= (pll_ext_cntl & 0x10) ? 3 : 1; + break; + case 1: + if (pll_ext_cntl & 0x10) + return -EINVAL; + vclk *= 2; + break; + case 2: + vclk *= (pll_ext_cntl & 0x10) ? 6 : 4; + break; + case 3: + vclk *= (pll_ext_cntl & 0x10) ? 12 : 8; + break; + } + vclk /= 2*vclk_fb_div; + break; + } + var->pixclock = vclk; return 0; } @@ -949,12 +1363,13 @@ static void init_par(struct atyfb_par *par, int vmode, int cmode) { - par->vmode = vmode; - par->cmode = cmode; + par->hw.gx.vmode = vmode; + par->hw.gx.cmode = cmode; par->vxres = vmode_attrs[vmode-1].hres; par->vyres = vmode_attrs[vmode-1].vres; par->xoffset = 0; par->yoffset = 0; + par->accel = FB_ACCELF_TEXT; } @@ -965,13 +1380,14 @@ static int atyfb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; struct atyfb_par par; if (con == -1) - par = default_par; + par = info2->default_par; else - decode_var(&fb_display[con].var, &par); - encode_fix(fix, &par); + decode_var(&fb_display[con].var, &par, info2); + encode_fix(fix, &par, info2); return 0; } @@ -983,10 +1399,12 @@ static int atyfb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; + if (con == -1) - encode_var(var, &default_par); + encode_var(var, &info2->default_par, (struct fb_info_aty *)info); else - *var=fb_display[con].var; + *var = fb_display[con].var; return 0; } @@ -998,10 +1416,10 @@ static int atyfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; struct atyfb_par par; struct display *display; - int oldxres, oldyres, oldvxres, oldvyres, oldbpp; - int err; + int oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel, accel, err; int activate = var->activate; if (con >= 0) @@ -1009,10 +1427,10 @@ else display = &fb_disp; /* used during initialization */ - if ((err = decode_var(var, &par))) + if ((err = decode_var(var, &par, info2))) return err; - encode_var(var, &par); + encode_var(var, &par, (struct fb_info_aty *)info); if ((activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { oldxres = display->var.xres; @@ -1020,14 +1438,15 @@ oldvxres = display->var.xres_virtual; oldvyres = display->var.yres_virtual; oldbpp = display->var.bits_per_pixel; + oldaccel = display->var.accel_flags; display->var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || - oldbpp != var->bits_per_pixel) { + oldbpp != var->bits_per_pixel || oldaccel != var->accel_flags) { struct fb_fix_screeninfo fix; - encode_fix(&fix, &par); - display->screen_base = (u_char *)fix.smem_start; + encode_fix(&fix, &par, info2); + display->screen_base = (char *)info2->frame_buffer; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -1036,29 +1455,32 @@ display->line_length = fix.line_length; display->can_soft_blank = 1; display->inverse = 0; - switch (par.cmode) { + accel = var->accel_flags & FB_ACCELF_TEXT; + switch (par.hw.gx.cmode) { +#ifdef CONFIG_FBCON_CFB8 case CMODE_8: -#if 1 - display->dispsw = &fbcon_cfb8; -#else - display->dispsw = &fbcon_aty8; -#endif + display->dispsw = accel ? &fbcon_aty8 : &fbcon_cfb8; break; +#endif +#ifdef CONFIG_FBCON_CFB16 case CMODE_16: - display->dispsw = &fbcon_cfb16; + display->dispsw = accel ? &fbcon_aty16 : &fbcon_cfb16; break; +#endif +#ifdef CONFIG_FBCON_CFB32 case CMODE_32: - display->dispsw = &fbcon_cfb32; + display->dispsw = accel ? &fbcon_aty32 : &fbcon_cfb32; break; +#endif default: display->dispsw = NULL; break; } - if (fb_info.changevar) - (*fb_info.changevar)(con); + if (info->changevar) + (*info->changevar)(con); } if (con == currcon) - atyfb_set_par(&par); + atyfb_set_par(&par, info2); if (oldbpp != var->bits_per_pixel) { if ((err = fb_alloc_cmap(&display->cmap, 0, 0))) return err; @@ -1079,18 +1501,19 @@ static int atyfb_pan_display(struct fb_var_screeninfo *var, int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; u32 xres, yres, xoffset, yoffset; - struct atyfb_par *par = ¤t_par; + struct atyfb_par *par = &info2->current_par; - xres = vmode_attrs[par->vmode-1].hres; - yres = vmode_attrs[par->vmode-1].vres; + xres = vmode_attrs[par->hw.gx.vmode-1].hres; + yres = vmode_attrs[par->hw.gx.vmode-1].vres; xoffset = (var->xoffset+7) & ~7; yoffset = var->yoffset; if (xoffset+xres > par->vxres || yoffset+yres > par->vyres) return -EINVAL; par->xoffset = xoffset; par->yoffset = yoffset; - set_off_pitch(par); + set_off_pitch(par, info2); return 0; } @@ -1146,225 +1569,328 @@ * Initialisation */ -__initfunc(unsigned long atyfb_init(unsigned long mem_start)) -{ -#ifdef __powerpc__ - /* We don't want to be called like this. */ - /* We rely on Open Firmware (offb) instead. */ - return mem_start; -#else /* !__powerpc__ */ - /* To be merged with Bernd's mach64fb */ - return mem_start; -#endif /* !__powerpc__ */ -} - - -unsigned long atyfb_of_init(unsigned long mem_start, struct device_node *dp) +__initfunc(static int aty_init(struct fb_info_aty *info, const char *name)) { - int i, err, sense; + u32 chip_id; + u32 i; + int j, k, err, sense; struct fb_var_screeninfo var; struct aty_regvals *init; - unsigned long addr; - unsigned char bus, devfn; - unsigned short cmd; + const char *chipname = NULL; + u8 rev; - if (dp->next) - printk("Warning: only using first ATI card detected\n"); - if (dp->n_addrs != 1 && dp->n_addrs != 3) - printk("Warning: expecting 1 or 3 addresses for ATY (got %d)", - dp->n_addrs); - - ati_regbase = (int)ioremap((0x7ffc00 + dp->addrs[0].address), 0x1000); - aty_cmap_regs = (struct aty_cmap_regs *)(ati_regbase + 0xC0); - - /* enable memory-space accesses using config-space command register */ - if (pci_device_loc(dp, &bus, &devfn) == 0) { - pcibios_read_config_word(bus, devfn, PCI_COMMAND, &cmd); - if (cmd != 0xffff) { - cmd |= PCI_COMMAND_MEMORY; - pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd); + info->aty_cmap_regs = (struct aty_cmap_regs *)(info->ati_regbase+0xc0); + chip_id = aty_ld_le32(CONFIG_CHIP_ID, info); + for (j = 0; j < (sizeof(aty_features)/sizeof(*aty_features)); j++) + if (aty_features[j].chip_type == (chip_id & CFG_CHIP_TYPE)) { + chipname = aty_features[j].name; + info->chip_class = aty_features[j].chip_class; + info->pixclock_lim_8 = 1000000/aty_features[j].pixclock_lim_8; + info->pixclock_lim_hi = 1000000/aty_features[j].pixclock_lim_hi; } + if (!chipname) { + printk("atyfb: Unknown Mach64 0x%04x\n", chip_id & CFG_CHIP_TYPE); + return 0; + } else + printk("atyfb: %s [", chipname); + rev = (chip_id & CFG_CHIP_REV)>>24; + switch ((rev>>3) & 7) { + case MACH64_FND_SGS: + printk("SGS"); + break; + case MACH64_FND_NEC: + printk("NEC"); + break; + case MACH64_FND_UMC: + printk("UMC"); + break; } - chip_type = (aty_ld_le32(CONFIG_CHIP_ID) & CFG_CHIP_TYPE); + printk(" %c%d]\n", 'A'+(rev & 7), rev>>6); - i = aty_ld_le32(MEM_CNTL); - if (chip_type != MACH64_GT_ID) + i = aty_ld_le32(MEM_CNTL, info); + if (info->chip_class != CLASS_GT) switch (i & MEM_SIZE_ALIAS) { case MEM_SIZE_512K: - total_vram = 0x80000; + info->total_vram = 0x80000; break; case MEM_SIZE_1M: - total_vram = 0x100000; + info->total_vram = 0x100000; break; case MEM_SIZE_2M: - total_vram = 0x200000; + info->total_vram = 0x200000; break; case MEM_SIZE_4M: - total_vram = 0x400000; + info->total_vram = 0x400000; break; case MEM_SIZE_6M: - total_vram = 0x600000; + info->total_vram = 0x600000; break; case MEM_SIZE_8M: - total_vram = 0x800000; + info->total_vram = 0x800000; break; default: - total_vram = 0x80000; + info->total_vram = 0x80000; } else switch (i & 0xF) { /* 0xF used instead of MEM_SIZE_ALIAS */ case MEM_SIZE_512K: - total_vram = 0x80000; + info->total_vram = 0x80000; break; case MEM_SIZE_1M: - total_vram = 0x100000; + info->total_vram = 0x100000; break; case MEM_SIZE_2M_GTB: - total_vram = 0x200000; + info->total_vram = 0x200000; break; case MEM_SIZE_4M_GTB: - total_vram = 0x400000; + info->total_vram = 0x400000; break; case MEM_SIZE_6M_GTB: - total_vram = 0x600000; + info->total_vram = 0x600000; break; case MEM_SIZE_8M_GTB: - total_vram = 0x800000; + info->total_vram = 0x800000; break; default: - total_vram = 0x80000; + info->total_vram = 0x80000; } +#ifdef CONFIG_ATARI /* this is definately not the wrong way to set this */ + if ((info->total_vram == 0x400000) || (info->total_vram == 0x800000)) { + /* protect GUI-regs if complete Aperture is VRAM */ + info->total_vram -= 0x00001000; + } +#endif -#if 1 - printk("aty_display_init: node = %p, addrs = ", dp->node); - printk(" %x(%x)", dp->addrs[0].address, dp->addrs[0].size); - printk(", intrs ="); - for (i = 0; i < dp->n_intrs; ++i) - printk(" %x", dp->intrs[i].line); - printk("\nregbase: %x pci loc: %x:%x total_vram: %x cregs: %p\n", - (int)ati_regbase, bus, devfn, total_vram, aty_cmap_regs); -#endif - - /* Map in frame buffer */ - addr = dp->addrs[0].address; - - /* use the big-endian aperture (??) */ - addr += 0x800000; - frame_buffer = (unsigned long)__ioremap(addr, 0x800000, _PAGE_WRITETHRU); - - if (default_video_mode != -1) { - sense = read_aty_sense(); - printk("monitor sense = %x\n", sense); - if (default_video_mode == VMODE_NVRAM) { - default_video_mode = nvram_read_byte(NV_VMODE); - init = get_aty_struct(default_video_mode); - if (default_video_mode <= 0 || - default_video_mode > VMODE_MAX || init == 0) - default_video_mode = VMODE_CHOOSE; - } - if (default_video_mode == VMODE_CHOOSE) - default_video_mode = map_monitor_sense(sense); +#if 0 + printk("aty_init: regbase = %lx, frame_buffer = %lx, total_vram = %x\n", + info->ati_regbase, info->frame_buffer, info->total_vram); +#endif - init = get_aty_struct(default_video_mode); - if (!init) - default_video_mode = VMODE_640_480_60; - } + sense = read_aty_sense(info); + printk("monitor sense = %x\n", sense); +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) + if (default_vmode == VMODE_NVRAM) { + default_vmode = nvram_read_byte(NV_VMODE); + init = get_aty_struct(default_vmode, info); + if (default_vmode <= 0 || default_vmode > VMODE_MAX || init == 0) + default_vmode = VMODE_CHOOSE; + } + if (default_vmode == VMODE_CHOOSE) + default_vmode = map_monitor_sense(sense); +#else /* !CONFIG_PMAC && !CONFIG_CHRP */ + if (default_vmode == VMODE_NVRAM) + default_vmode = map_monitor_sense(sense); +#endif /* !CONFIG_PMAC && !CONFIG_CHRP */ + + if (!(init = get_aty_struct(default_vmode, info))) + default_vmode = VMODE_640_480_60; /* * Reduce the pixel size if we don't have enough VRAM. */ - if (default_color_mode == CMODE_NVRAM) - default_color_mode = nvram_read_byte(NV_CMODE); - if (default_color_mode < CMODE_8 || - default_color_mode > CMODE_32) - default_color_mode = CMODE_8; - - init_par(&default_par, default_video_mode, default_color_mode); - while (aty_vram_reqd(&default_par) > total_vram) { - while (default_color_mode > CMODE_8 && - aty_vram_reqd(&default_par) > total_vram) { - --default_color_mode; - init_par(&default_par, default_video_mode, default_color_mode); + if (default_cmode == CMODE_NVRAM) +#if defined(CONFIG_PMAC) || defined(CONFIG_CHRP) + default_cmode = nvram_read_byte(NV_CMODE); +#else /* !CONFIG_PMAC && !CONFIG_CHRP */ + default_cmode = CMODE_8; +#endif /* !CONFIG_PMAC && !CONFIG_CHRP */ + if (default_cmode < CMODE_8 || default_cmode > CMODE_32) + default_cmode = CMODE_8; + + init_par(&info->default_par, default_vmode, default_cmode); + while (aty_vram_reqd(&info->default_par) > info->total_vram) { + while (default_cmode > CMODE_8 && + aty_vram_reqd(&info->default_par) > info->total_vram) { + --default_cmode; + init_par(&info->default_par, default_vmode, default_cmode); } /* - * adjust the video mode smaller if there still is not enough VRAM + * Adjust the video mode smaller if there still is not enough VRAM */ - if (aty_vram_reqd(&default_par) > total_vram) + if (aty_vram_reqd(&info->default_par) > info->total_vram) do { - default_video_mode--; - init_par(&default_par, default_video_mode, default_color_mode); - init = get_aty_struct(default_video_mode); + default_vmode--; + init_par(&info->default_par, default_vmode, default_cmode); + init = get_aty_struct(default_vmode, info); } while ((init == 0) && - (default_video_mode > VMODE_640_480_60)); + (default_vmode > VMODE_640_480_60)); } - if (chip_type == MACH64_GT_ID && (aty_ld_le32(CONFIG_STAT0) & 7) == 5 + if (info->chip_class == CLASS_GT && + (aty_ld_le32(CONFIG_STAT0, info) & 7) == 5 && init->crtc_gen_cntl[1] == 0) { - default_video_mode = VMODE_640_480_67; - default_color_mode = CMODE_8; - init_par(&default_par, default_video_mode, default_color_mode); + default_vmode = VMODE_640_480_67; + default_cmode = CMODE_8; + init_par(&info->default_par, default_vmode, default_cmode); } - switch (chip_type) { - case MACH64_GX_ID: + switch (info->chip_class) { + case CLASS_GX: strcat(atyfb_name, "GX"); break; - case MACH64_VT_ID: + case CLASS_CT: + strcat(atyfb_name, "CT"); + break; + case CLASS_VT: strcat(atyfb_name, "VT"); break; - case MACH64_GT_ID: + case CLASS_GT: strcat(atyfb_name, "GT"); break; - default: - break; } - strcpy(fb_info.modename, atyfb_name); - fb_info.node = -1; - fb_info.fbops = &atyfb_ops; - fb_info.disp = &fb_disp; - fb_info.fontname[0] = '\0'; - fb_info.changevar = NULL; - fb_info.switch_con = &atyfbcon_switch; - fb_info.updatevar = &atyfbcon_updatevar; - fb_info.blank = &atyfbcon_blank; + strcpy(info->fb_info.modename, atyfb_name); + info->fb_info.node = -1; + info->fb_info.fbops = &atyfb_ops; + info->fb_info.disp = &fb_disp; + info->fb_info.fontname[0] = '\0'; + info->fb_info.changevar = NULL; + info->fb_info.switch_con = &atyfbcon_switch; + info->fb_info.updatevar = &atyfbcon_updatevar; + info->fb_info.blank = &atyfbcon_blank; + + for (j = 0; j < 16; j++) { + k = color_table[j]; + info->palette[j].red = default_red[k]; + info->palette[j].green = default_grn[k]; + info->palette[j].blue = default_blu[k]; + } - err = register_framebuffer(&fb_info); + err = register_framebuffer(&info->fb_info); if (err < 0) - return mem_start; + return 0; + atyfb_set_par(&info->default_par, info); + encode_var(&var, &info->default_par, info); + atyfb_set_var(&var, -1, &info->fb_info); + + printk("fb%d: %s frame buffer device on %s\n", + GET_FB_IDX(info->fb_info.node), atyfb_name, name); + return 1; +} - for (i = 0; i < 16; i++) { - int j = color_table[i]; - palette[i].red = default_red[j]; - palette[i].green = default_grn[j]; - palette[i].blue = default_blu[j]; - } - atyfb_set_par(&default_par); - encode_var(&var, &default_par); - atyfb_set_var(&var, -1, &fb_info); +__initfunc(unsigned long atyfb_init(unsigned long mem_start)) +{ +#if defined(CONFIG_FB_OF) + /* We don't want to be called like this. */ + /* We rely on Open Firmware (offb) instead. */ +#elif defined(CONFIG_PCI) + /* Anyone who wants to do a PCI probe for an ATI chip? */ +#elif defined(CONFIG_ATARI) + int m64_num; + struct fb_info_aty *info; + + for (m64_num = 0; m64_num < mach64_count; m64_num++) { + if (!phys_vmembase[m64_num] || !phys_size[m64_num] || + !phys_guiregbase[m64_num]) { + printk(" phys_*[%d] parameters not set => returning early. \n", + m64_num); + continue; + } - printk("fb%d: %s frame buffer device on %s\n", GET_FB_IDX(fb_info.node), - atyfb_name, dp->full_name); + info = (struct fb_info_aty *)mem_start; + mem_start += sizeof(struct fb_info_aty); + mem_start = PAGE_ALIGN(mem_start); -#ifdef CONFIG_FB_COMPAT_XPMAC - if (!console_fb_info) { - console_fb_info = &fb_info; - console_setmode_ptr = atyfb_console_setmode; - console_set_cmap_ptr = atyfb_set_cmap; + /* + * Map the video memory (physical address given) to somewhere in the + * kernel address space. + */ + info->frame_buffer = kernel_map(phys_vmembase[m64_num], + phys_size[m64_num], + KERNELMAP_NOCACHE_SER, &mem_start); + info->frame_buffer_phys = info->frame_buffer; + info->ati_regbase = kernel_map(phys_guiregbase[m64_num], 0x10000, + KERNELMAP_NOCACHE_SER, &mem_start) + +0xFC00ul; + info->ati_regbase_phys = info->ati_regbase; + + if (!aty_init(info, "ISA bus")) { + /* This is insufficient! kernel_map has added two large chunks!! */ + return mem_start; + } } -#endif /* CONFIG_FB_COMPAT_XPMAC) */ - +#endif return mem_start; } +#ifdef CONFIG_FB_OF +__initfunc(void atyfb_of_init(struct device_node *dp)) +{ + unsigned long addr; + u8 bus, devfn; + u16 cmd; + struct fb_info_aty *info; + int i; + + for (; dp; dp = dp->next) { + switch (dp->n_addrs) { + case 1: + case 3: + addr = dp->addrs[0].address; + break; + case 4: + addr = dp->addrs[1].address; + break; + default: + printk("Warning: got %d adresses for ATY:\n", dp->n_addrs); + for (i = 0; i < dp->n_addrs; i++) + printk(" %08x-%08x", dp->addrs[i].address, + dp->addrs[i].address+dp->addrs[i].size-1); + if (dp->n_addrs) + printk("\n"); + continue; + } + + info = kmalloc(sizeof(struct fb_info_aty), GFP_ATOMIC); + + info->ati_regbase = (unsigned long)ioremap(0x7ff000+addr, + 0x1000)+0xc00; + info->ati_regbase_phys = 0x7ff000+addr; + info->ati_regbase = (unsigned long)ioremap(info->ati_regbase_phys, + 0x1000); + info->ati_regbase_phys += 0xc00; + info->ati_regbase += 0xc00; + + /* enable memory-space accesses using config-space command register */ + if (pci_device_loc(dp, &bus, &devfn) == 0) { + pcibios_read_config_word(bus, devfn, PCI_COMMAND, &cmd); + if (cmd != 0xffff) { + cmd |= PCI_COMMAND_MEMORY; + pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd); + } + } + +#ifdef __BIG_ENDIAN + /* Use the big-endian aperture */ + addr += 0x800000; +#endif + + /* Map in frame buffer */ + info->frame_buffer_phys = addr; + info->frame_buffer = (unsigned long)ioremap(addr, 0x800000); + + if (!aty_init(info, dp->full_name)) { + kfree(info); + return; + } + +#ifdef CONFIG_FB_COMPAT_XPMAC + 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 */ + } +} +#endif /* CONFIG_FB_OF */ + -/* XXX: doesn't work yet */ -void atyfb_setup(char *options, int *ints) +__initfunc(void atyfb_setup(char *options, int *ints)) { char *this_opt; int vmode; int depth; - if (!options || !*options) return; @@ -1373,29 +1899,94 @@ if (!strncmp(this_opt, "vmode:", 6)) { vmode = simple_strtoul(this_opt+6, NULL, 0); if (vmode > 0 && vmode <= VMODE_MAX) - default_video_mode = vmode; + default_vmode = vmode; } else if (!strncmp(this_opt, "cmode:", 6)) { depth = simple_strtoul(this_opt+6, NULL, 0); switch (depth) { case 8: - default_color_mode = CMODE_8; + default_cmode = CMODE_8; break; case 15: case 16: - default_color_mode = CMODE_16; + default_cmode = CMODE_16; break; case 24: case 32: - default_color_mode = CMODE_32; + default_cmode = CMODE_32; break; - }; + } } +#ifdef CONFIG_ATARI + /* + * Why do we need this silly Mach64 argument? + * We are already here because of mach64= so its redundant. + */ + else if (MACH_IS_ATARI && (!strncmp(this_opt, "Mach64:", 7))) { + static unsigned char m64_num; + static char mach64_str[80]; + strncpy(mach64_str, this_opt+7, 80); + if (!store_video_par(mach64_str, m64_num)) { + m64_num++; + mach64_count = m64_num; + } + } +#endif } } +#ifdef CONFIG_ATARI +__initfunc(static int store_video_par(char *video_str, unsigned char m64_num)) +{ + char *p; + unsigned long vmembase, size, guiregbase; + + printk("store_video_par() '%s' \n", video_str); + + if (!(p = strtoke(video_str, ";")) || !*p) + goto mach64_invalid; + vmembase = simple_strtoul(p, NULL, 0); + if (!(p = strtoke(NULL, ";")) || !*p) + goto mach64_invalid; + size = simple_strtoul(p, NULL, 0); + if (!(p = strtoke(NULL, ";")) || !*p) + goto mach64_invalid; + guiregbase = simple_strtoul(p, NULL, 0); + + phys_vmembase[m64_num] = vmembase; + phys_size[m64_num] = size; + phys_guiregbase[m64_num] = guiregbase; + printk(" stored them all: $%08lX $%08lX $%08lX \n", vmembase, size, + guiregbase); + return 0; + +mach64_invalid: + phys_vmembase[m64_num] = 0; + return -1; +} + +__initfunc(static char *strtoke(char *s, const char *ct)) +{ + static char *ssave = NULL; + char *sbegin, *send; + + sbegin = s ? s : ssave; + if (!sbegin) + return NULL; + if (*sbegin == '\0') { + ssave = NULL; + return NULL; + } + send = strpbrk(sbegin, ct); + if (send && *send != '\0') + *send++ = '\0'; + ssave = send; + return sbegin; +} +#endif /* !CONFIG_FB_OF */ static int atyfbcon_switch(int con, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; struct atyfb_par par; /* Do we have to save the colormap? */ @@ -1403,8 +1994,8 @@ fb_get_cmap(&fb_display[currcon].cmap, &fb_display[currcon].var, 1, atyfb_getcolreg, info); currcon = con; - decode_var(&fb_display[con].var, &par); - atyfb_set_par(&par); + decode_var(&fb_display[con].var, &par, info2); + atyfb_set_par(&par, info2); /* Install new colormap */ do_install_cmap(con, info); return 0; @@ -1416,8 +2007,10 @@ static int atyfbcon_updatevar(int con, struct fb_info *info) { - current_par.yoffset = fb_display[con].var.yoffset; - set_off_pitch(¤t_par); + struct fb_info_aty *info2 = (struct fb_info_aty *)info; + + info2->current_par.yoffset = fb_display[con].var.yoffset; + set_off_pitch(&info2->current_par, info2); return 0; } @@ -1427,9 +2020,10 @@ static void atyfbcon_blank(int blank, struct fb_info *info) { - char gen_cntl; + struct fb_info_aty *info2 = (struct fb_info_aty *)info; + u8 gen_cntl; - gen_cntl = aty_ld_8(CRTC_GEN_CNTL); + gen_cntl = aty_ld_8(CRTC_GEN_CNTL, info2); if (blank & VESA_VSYNC_SUSPEND) gen_cntl |= 0x8; if (blank & VESA_HSYNC_SUSPEND) @@ -1438,7 +2032,7 @@ gen_cntl |= 0x40; if (blank == VESA_NO_BLANKING) gen_cntl &= ~(0x4c); - aty_st_8(CRTC_GEN_CNTL, gen_cntl); + aty_st_8(CRTC_GEN_CNTL, gen_cntl, info2); } @@ -1448,13 +2042,15 @@ */ static int atyfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, - u_int *transp, struct fb_info *info) + u_int *transp, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; + if (regno > 255) return 1; - *red = palette[regno].red; - *green = palette[regno].green; - *blue = palette[regno].blue; + *red = info2->palette[regno].red; + *green = info2->palette[regno].green; + *blue = info2->palette[regno].blue; return 0; } @@ -1466,32 +2062,31 @@ */ static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, - u_int transp, struct fb_info *info) + u_int transp, struct fb_info *info) { + struct fb_info_aty *info2 = (struct fb_info_aty *)info; int i, scale; if (regno > 255) return 1; - palette[regno].red = red; - palette[regno].green = green; - palette[regno].blue = blue; - aty_WaitQueue(2); - i = aty_ld_8(DAC_CNTL) & 0xfc; - if (chip_type == MACH64_GT_ID) - i |= 0x2; /*DAC_CNTL|0x2 turns off the extra brightness for gt*/ - aty_st_8(DAC_CNTL, i); - aty_st_8(DAC_REGS + DAC_MASK, 0xff); + info2->palette[regno].red = red; + info2->palette[regno].green = green; + info2->palette[regno].blue = blue; + i = aty_ld_8(DAC_CNTL, info2) & 0xfc; + if (info2->chip_class == CLASS_GT) + i |= 0x2; /*DAC_CNTL|0x2 turns off the extra brightness for gt*/ + aty_st_8(DAC_CNTL, i, info2); + aty_st_8(DAC_REGS + DAC_MASK, 0xff, info2); eieio(); - scale = ((chip_type != MACH64_GX_ID) && - (current_par.cmode == CMODE_16)) ? 3 : 0; - aty_WaitQueue(4); - aty_cmap_regs->windex = regno << scale; + scale = ((info2->chip_class != CLASS_GX) && + (info2->current_par.hw.gx.cmode == CMODE_16)) ? 3 : 0; + info2->aty_cmap_regs->windex = regno << scale; eieio(); - aty_cmap_regs->lut = red << scale; + info2->aty_cmap_regs->lut = red << scale; eieio(); - aty_cmap_regs->lut = green << scale; + info2->aty_cmap_regs->lut = green << scale; eieio(); - aty_cmap_regs->lut = blue << scale; + info2->aty_cmap_regs->lut = blue << scale; eieio(); if (regno < 16) { #ifdef CONFIG_FBCON_CFB16 @@ -1524,15 +2119,33 @@ * Accelerated functions */ -void aty_waitblit(void) +static inline void draw_rect(s16 x, s16 y, u16 width, u16 height, + struct fb_info_aty *info) { - aty_WaitIdleEmpty(); /* Make sure that all commands have finished */ + /* perform rectangle fill */ + wait_for_fifo(2, info); + aty_st_le32(DST_Y_X, (x << 16) | y, info); + aty_st_le32(DST_HEIGHT_WIDTH, (width << 16) | height, info); } -void aty_rectcopy(int srcx, int srcy, int dstx, int dsty, u_int width, - u_int height) +static inline void aty_rectcopy(int srcx, int srcy, int dstx, int dsty, + u_int width, u_int height, + struct fb_info_aty *info) { - u_int direction = 0; + u32 direction = DST_LAST_PEL; + u32 pitch_value; + + if (!width || !height) + return; + + pitch_value = info->current_par.vxres; +#if 0 + if (par->hw.gx.cmode == CMODE_24) { + /* In 24 bpp, the engine is in 8 bpp - this requires that all */ + /* horizontal coordinates and widths must be adjusted */ + pitch_value = pitch_value * 3; + } +#endif if (srcy < dsty) { dsty += height - 1; @@ -1546,46 +2159,33 @@ } else direction |= DST_X_LEFT_TO_RIGHT; - aty_WaitQueue(4); - aty_st_le32(DP_WRITE_MSK, 0x000000FF /* pGC->planemask */ ); - aty_st_le32(DP_MIX, (MIX_SRC << 16) | MIX_DST); - aty_st_le32(DP_SRC, FRGD_SRC_BLIT); - - aty_WaitQueue(5); - aty_st_le32(SRC_Y_X, (srcx << 16) | (srcy & 0x0000ffff)); - aty_st_le32(SRC_WIDTH1, width); - aty_st_le32(DST_CNTL, direction); - aty_st_le32(DST_Y_X, (dstx << 16) | (dsty & 0x0000ffff)); - aty_st_le32(DST_HEIGHT_WIDTH, (width << 16) | (height & 0x0000ffff)); - - aty_WaitIdleEmpty(); /* Make sure that all commands have finished */ - + wait_for_fifo(5, info); + aty_st_le32(DP_SRC, FRGD_SRC_BLIT, info); /* - * Make sure that the destination trajectory is correctly set - * for subsequent calls. MACH64_BIT_BLT is the only function that - * currently changes the destination trajectory from L->R and T->B. - */ - aty_st_le32(DST_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM)); + * ++Geert: + * Warning: SRC_OFF_PITCH may be thrashed by writing to other registers + * (e.g. CRTC_H_TOTAL_DISP, DP_SRC, DP_FRGD_CLR) + */ + aty_st_le32(SRC_OFF_PITCH, (pitch_value / 8) << 22, info); + aty_st_le32(SRC_Y_X, (srcx << 16) | srcy, info); + aty_st_le32(SRC_HEIGHT1_WIDTH1, (width << 16) | height, info); + aty_st_le32(DST_CNTL, direction, info); + draw_rect(dstx, dsty, width, height, info); } -void aty_rectfill(int dstx, int dsty, u_int width, u_int height, u_int color) +static inline void aty_rectfill(int dstx, int dsty, u_int width, u_int height, + u_int color, struct fb_info_aty *info) { if (!width || !height) return; - aty_WaitQueue(5); - aty_st_le32(DP_FRGD_CLR, color /* pGC->fgPixel */ ); - aty_st_le32(DP_WRITE_MSK, 0x000000FF /* pGC->planemask */ ); - aty_st_le32(DP_MIX, (MIX_SRC << 16) | MIX_DST); - aty_st_le32(DP_SRC, FRGD_SRC_FRGD_CLR); - - aty_st_le32(DST_CNTL, DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM); - - aty_WaitQueue(2); - aty_st_le32(DST_Y_X, (((u_int)dstx << 16) | ((u_int)dsty & 0x0000ffff))); - aty_st_le32(DST_HEIGHT_WIDTH, (((u_int)width << 16) | height)); - - aty_WaitIdleEmpty(); /* Make sure that all commands have finished */ + wait_for_fifo(3, info); + aty_st_le32(DP_FRGD_CLR, color, info); + aty_st_le32(DP_SRC, BKGD_SRC_BKGD_CLR | FRGD_SRC_FRGD_CLR | MONO_SRC_ONE, + info); + aty_st_le32(DST_CNTL, DST_LAST_PEL | DST_Y_TOP_TO_BOTTOM | + DST_X_LEFT_TO_RIGHT, info); + draw_rect(dstx, dsty, width, height, info); } @@ -1593,8 +2193,8 @@ * Text console acceleration */ -static void fbcon_aty8_bmove(struct display *p, int sy, int sx, int dy, int dx, - int height, int width) +static void fbcon_aty_bmove(struct display *p, int sy, int sx, int dy, int dx, + int height, int width) { sx *= p->fontwidth; sy *= p->fontheight; @@ -1603,11 +2203,12 @@ width *= p->fontwidth; height *= p->fontheight; - aty_rectcopy(sx, sy, dx, dy, width, height); + aty_rectcopy(sx, sy, dx, dy, width, height, + (struct fb_info_aty *)p->fb_info); } -static void fbcon_aty8_clear(struct vc_data *conp, struct display *p, int sy, - int sx, int height, int width) +static void fbcon_aty_clear(struct vc_data *conp, struct display *p, int sy, + int sx, int height, int width) { u32 bgx = attr_bgcol_ec(p, conp); bgx |= (bgx << 8); @@ -1618,38 +2219,85 @@ width *= p->fontwidth; height *= p->fontheight; - aty_rectfill(sx, sy, width, height, bgx); + aty_rectfill(sx, sy, width, height, bgx, + (struct fb_info_aty *)p->fb_info); } +#ifdef CONFIG_FBCON_CFB8 static void fbcon_aty8_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx) { - aty_waitblit(); + wait_for_idle((struct fb_info_aty *)p->fb_info); fbcon_cfb8_putc(conp, p, c, yy, xx); } static void fbcon_aty8_putcs(struct vc_data *conp, struct display *p, const char *s, int count, int yy, int xx) { - aty_waitblit(); + wait_for_idle((struct fb_info_aty *)p->fb_info); fbcon_cfb8_putcs(conp, p, s, count, yy, xx); } static struct display_switch fbcon_aty8 = { - fbcon_cfb8_setup, fbcon_aty8_bmove, fbcon_aty8_clear, fbcon_aty8_putc, - fbcon_aty8_putcs, fbcon_cfb8_revc + fbcon_cfb8_setup, fbcon_aty_bmove, fbcon_aty_clear, fbcon_aty8_putc, + fbcon_aty8_putcs, fbcon_cfb8_revc, NULL +}; +#endif + +#ifdef CONFIG_FBCON_CFB16 +static void fbcon_aty16_putc(struct vc_data *conp, struct display *p, int c, + int yy, int xx) +{ + wait_for_idle((struct fb_info_aty *)p->fb_info); + fbcon_cfb16_putc(conp, p, c, yy, xx); +} + +static void fbcon_aty16_putcs(struct vc_data *conp, struct display *p, + const char *s, int count, int yy, int xx) +{ + wait_for_idle((struct fb_info_aty *)p->fb_info); + fbcon_cfb16_putcs(conp, p, s, count, yy, xx); +} + +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 +}; +#endif + +#ifdef CONFIG_FBCON_CFB32 +static void fbcon_aty32_putc(struct vc_data *conp, struct display *p, int c, + int yy, int xx) +{ + wait_for_idle((struct fb_info_aty *)p->fb_info); + fbcon_cfb32_putc(conp, p, c, yy, xx); +} + +static void fbcon_aty32_putcs(struct vc_data *conp, struct display *p, + const char *s, int count, int yy, int xx) +{ + wait_for_idle((struct fb_info_aty *)p->fb_info); + fbcon_cfb32_putcs(conp, p, s, count, yy, xx); +} + +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 }; +#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) { - int err; struct fb_var_screeninfo var; struct atyfb_par par; int vmode, cmode; @@ -1674,12 +2322,9 @@ return -EINVAL; } init_par(&par, vmode, cmode); - encode_var(&var, &par); - if ((err = decode_var(&var, &par))) - return err; - if (doit) - atyfb_set_var(&var, currcon, 0); - return 0; + 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.106/linux/drivers/video/compatcon.c linux/drivers/video/compatcon.c --- v2.1.106/linux/drivers/video/compatcon.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/video/compatcon.c Wed Jun 24 14:44:01 1998 @@ -0,0 +1,354 @@ +/* + * linux/drivers/video/compatcon.c -- Console wrapper + * + * Created 26 Apr 1998 by Geert Uytterhoeven + * + * This will be removed once there are frame buffer devices for all supported + * graphics hardware + * + * 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. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + + + /* + * Interface used by the world + */ + +static const char *compatcon_startup(void); +static void compatcon_init(struct vc_data *conp); +static void compatcon_deinit(struct vc_data *conp); +static void compatcon_clear(struct vc_data *conp, int sy, int sx, int height, + int width); +static void compatcon_putc(struct vc_data *conp, int c, int ypos, int xpos); +static void compatcon_putcs(struct vc_data *conp, const char *s, int count, + int ypos, int xpos); +static void compatcon_cursor(struct vc_data *conp, int mode); +static void compatcon_scroll(struct vc_data *conp, int t, int b, int dir, + int count); +static void compatcon_bmove(struct vc_data *conp, int sy, int sx, int dy, + int dx, int height, int width); +static int compatcon_switch(struct vc_data *conp); +static int compatcon_blank(int blank); +static int compatcon_get_font(struct vc_data *conp, int *w, int *h, char *data); +static int compatcon_set_font(struct vc_data *conp, int w, int h, char *data); +static int compatcon_set_palette(struct vc_data *conp, unsigned char *table); +static int compatcon_scrolldelta(struct vc_data *conp, int lines); + + + /* + * Internal routines + */ + +#if 0 +static int compatcon_show_logo(void); +#endif + +unsigned long video_num_columns; +unsigned long video_num_lines; +unsigned long video_size_row; +unsigned char video_type; +unsigned long video_mem_base; +unsigned long video_mem_term; +unsigned long video_screen_size; +int can_do_color; + +extern void set_cursor(int currcons); +extern void hide_cursor(void); +extern int set_get_cmap(unsigned char *arg, int set); +extern void set_palette(void); +extern int set_get_font(unsigned char *arg, int set, int ch512); +extern void set_vesa_blanking(unsigned long arg); +extern void vesa_blank(void); +extern void vesa_powerdown(void); +extern int con_adjust_height(unsigned long fontheight); +extern void con_type_init(const char **); +extern void con_type_init_finish(void); + +#define BLANK 0x0020 + + +__initfunc(static const char *compatcon_startup(void)) +{ + const char *display_desc = "????"; + + video_num_lines = ORIG_VIDEO_LINES; + video_num_columns = ORIG_VIDEO_COLS; + video_size_row = 2*video_num_columns; + video_screen_size = video_num_lines*video_size_row; + + con_type_init(&display_desc); +#if 0 + if (!console_show_logo) + console_show_logo = compatcon_show_logo; +#endif + return display_desc; +} + + +static void compatcon_init(struct vc_data *conp) +{ + static int first = 1; + + conp->vc_cols = video_num_columns; + conp->vc_rows = video_num_lines; + conp->vc_can_do_color = can_do_color; + if (first) { + con_type_init_finish(); + first = 0; + } +} + +static void compatcon_deinit(struct vc_data *conp) +{ +} + + +static void compatcon_clear(struct vc_data *conp, int sy, int sx, int height, + int width) +{ + int rows; + unsigned long dest; + + if (console_blanked) + return; + + dest = video_mem_base+sy*video_size_row+sx*2; + if (sx == 0 && width == video_num_columns) + memsetw((void *)dest, conp->vc_video_erase_char, height*video_size_row); + else + for (rows = height; rows-- ; dest += video_size_row) + memsetw((void *)dest, conp->vc_video_erase_char, width*2); +} + + +static void compatcon_putc(struct vc_data *conp, int c, int ypos, int xpos) +{ + u16 *p; + + if (console_blanked) + return; + + p = (u16 *)(video_mem_base+ypos*video_size_row+xpos*2); + scr_writew(conp->vc_attr << 8 | c, p); +} + + +static void compatcon_putcs(struct vc_data *conp, const char *s, int count, + int ypos, int xpos) +{ + u16 *p; + u16 sattr; + + if (console_blanked) + return; + + p = (u16 *)(video_mem_base+ypos*video_size_row+xpos*2); + sattr = conp->vc_attr << 8; + while (count--) + scr_writew(sattr | ((int) (*s++) & 0xff), p++); +} + + +static void compatcon_cursor(struct vc_data *conp, int mode) +{ + switch (mode) { + case CM_ERASE: + hide_cursor(); + break; + + case CM_MOVE: + case CM_DRAW: + set_cursor(conp->vc_num); + break; + } +} + + +static void compatcon_scroll(struct vc_data *conp, int t, int b, int dir, + int count) +{ + if (console_blanked) + return; + + compatcon_cursor(conp, CM_ERASE); + + switch (dir) { + case SM_UP: + if (count > conp->vc_rows) /* Maximum realistic size */ + count = conp->vc_rows; + compatcon_bmove(conp, t+count, 0, t, 0, b-t-count, conp->vc_cols); + compatcon_clear(conp, b-count, 0, count, conp->vc_cols); + break; + + case SM_DOWN: + if (count > conp->vc_rows) /* Maximum realistic size */ + count = conp->vc_rows; + /* + * Fixed bmove() should end Arno's frustration with copying? + * Confucius says: + * Man who copies in wrong direction, end up with trashed + * data + */ + compatcon_bmove(conp, t, 0, t+count, 0, b-t-count, conp->vc_cols); + compatcon_clear(conp, t, 0, count, conp->vc_cols); + break; + + case SM_LEFT: + compatcon_bmove(conp, 0, t+count, 0, t, conp->vc_rows, b-t-count); + compatcon_clear(conp, 0, b-count, conp->vc_rows, count); + break; + + case SM_RIGHT: + compatcon_bmove(conp, 0, t, 0, t+count, conp->vc_rows, b-t-count); + compatcon_clear(conp, 0, t, conp->vc_rows, count); + break; + } +} + + +static inline void memmovew(u16 *to, u16 *from, unsigned int count) +{ + if ((unsigned long)to < (unsigned long)from) + memcpyw(to, from, count); + else { + count /= 2; + to += count; + from += count; + while (count) { + count--; + scr_writew(scr_readw(--from), --to); + } + } +} + +static void compatcon_bmove(struct vc_data *conp, int sy, int sx, int dy, + int dx, int height, int width) +{ + unsigned long src, dst; + int rows; + + if (console_blanked) + return; + + if (sx == 0 && dx == 0 && width == video_num_columns) { + src = video_mem_base+sy*video_size_row; + dst = video_mem_base+dy*video_size_row; + memmovew((u16 *)dst, (u16 *)src, height*video_size_row); + } else if (dy < sy || (dy == sy && dx < sx)) { + src = video_mem_base+sy*video_size_row+sx*2; + dst = video_mem_base+dy*video_size_row+dx*2; + for (rows = height; rows-- ;) { + memmovew((u16 *)dst, (u16 *)src, width*2); + src += video_size_row; + dst += video_size_row; + } + } else { + src = video_mem_base+(sy+height-1)*video_size_row+sx*2; + dst = video_mem_base+(dy+height-1)*video_size_row+dx*2; + for (rows = height; rows-- ;) { + memmovew((u16 *)dst, (u16 *)src, width*2); + src -= video_size_row; + dst -= video_size_row; + } + } +} + + +static int compatcon_switch(struct vc_data *conp) +{ + return 0; +} + + +static int compatcon_blank(int blank) +{ + if (blank) { + set_vesa_blanking(blank-1); + if (blank-1 == 0) + vesa_blank(); + else + vesa_powerdown(); + return 0; + } else { + /* Tell console.c that it has to restore the screen itself */ + return 1; + } + return 0; +} + + +static int compatcon_get_font(struct vc_data *conp, int *w, int *h, char *data) +{ + /* this is not supported: data already points to a kernel space copy */ + return -ENOSYS; +} + + +static int compatcon_set_font(struct vc_data *conp, int w, int h, char *data) +{ + /* this is not supported: data already points to a kernel space copy */ + return -ENOSYS; +} + +static int compatcon_set_palette(struct vc_data *conp, unsigned char *table) +{ + if (console_blanked || vt_cons[fg_console]->vc_mode == KD_GRAPHICS) + return -EINVAL; + set_palette(); + return 0; +} + +static int compatcon_scrolldelta(struct vc_data *conp, int lines) +{ + /* TODO */ + return -ENOSYS; +} + +#if 0 +__initfunc(static int compatcon_show_logo( void )) +{ + int height = 0; + char *p; + + printk(linux_serial_image); + for (p = linux_serial_image; *p; p++) + if (*p == '\n') + height++; + return height; +} +#endif + + + /* + * The console `switch' structure for the console wrapper + */ + +struct consw compat_con = { + compatcon_startup, compatcon_init, compatcon_deinit, compatcon_clear, + compatcon_putc, compatcon_putcs, compatcon_cursor, compatcon_scroll, + compatcon_bmove, compatcon_switch, compatcon_blank, compatcon_get_font, + compatcon_set_font, compatcon_set_palette, compatcon_scrolldelta +}; diff -u --recursive --new-file v2.1.106/linux/drivers/video/cyberfb.c linux/drivers/video/cyberfb.c --- v2.1.106/linux/drivers/video/cyberfb.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/cyberfb.c Wed Jun 24 14:44:01 1998 @@ -20,6 +20,7 @@ * for more details. */ + #include #include #include @@ -61,6 +62,7 @@ int xres; int yres; int bpp; + int accel; }; static struct cyberfb_par current_par; @@ -133,49 +135,49 @@ "640x480-8", { /* Cybervision 8 bpp */ 640, 480, 640, 480, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "800x600-8", { /* Cybervision 8 bpp */ 800, 600, 800, 600, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "1024x768-8", { /* Cybervision 8 bpp */ 1024, 768, 1024, 768, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "1152x886-8", { /* Cybervision 8 bpp */ 1152, 886, 1152, 886, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "1280x1024-8", { /* Cybervision 8 bpp */ 1280, 1024, 1280, 1024, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "1600x1200-8", { /* Cybervision 8 bpp */ 1600, 1200, 1600, 1200, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "800x600-16", { /* Cybervision 16 bpp */ 800, 600, 800, 600, 0, 0, 16, 0, {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, CYBER16_PIXCLOCK, 64, 96, 35, 12, 112, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, CYBER16_PIXCLOCK, 64, 96, 35, 12, 112, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } } @@ -371,12 +373,11 @@ static int Cyber_encode_fix(struct fb_fix_screeninfo *fix, struct cyberfb_par *par) { - int i; - + memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id, cyberfb_name); - fix->smem_start = (caddr_t)CyberMem; + fix->smem_start = (char *)CyberMem; fix->smem_len = CyberSize; - fix->mmio_start = (unsigned char *)CyberRegs; + fix->mmio_start = (char *)CyberRegs; fix->mmio_len = 0x10000; fix->type = FB_TYPE_PACKED_PIXELS; @@ -390,9 +391,7 @@ fix->ypanstep = 0; fix->ywrapstep = 0; fix->line_length = 0; - - for (i = 0; i < arraysize(fix->reserved); i++) - fix->reserved[i] = 0; + fix->accel = FB_ACCEL_S3_TRIO64; return(0); } @@ -410,6 +409,10 @@ par->xres = var->xres; par->yres = var->yres; par->bpp = var->bits_per_pixel; + if (var->accel_flags & FB_ACCELF_TEXT) + par->accel = FB_ACCELF_TEXT; + else + par->accel = 0; #else if (Cyberfb_Cyber8) { par->xres = CYBER8_WIDTH; @@ -433,8 +436,6 @@ static int Cyber_encode_var(struct fb_var_screeninfo *var, struct cyberfb_par *par) { - int i; - var->xres = par->xres; var->yres = par->yres; var->xres_virtual = par->xres; @@ -471,8 +472,7 @@ var->height = -1; var->width = -1; - var->accel = FB_ACCEL_CYBERVISION; - DPRINTK("accel CV64\n"); + var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0; var->vmode = FB_VMODE_NONINTERLACED; @@ -490,9 +490,6 @@ var->hsync_len = 112; var->vsync_len = 2; - for (i = 0; i < arraysize(var->reserved); i++) - var->reserved[i] = 0; - return(0); } @@ -847,7 +844,7 @@ cyberfb_get_fix(&fix, con, info); if (con == -1) con = 0; - display->screen_base = (u_char *)fix.smem_start; + display->screen_base = fix.smem_start; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -858,7 +855,11 @@ switch (display->var.bits_per_pixel) { #ifdef CONFIG_FBCON_CFB8 case 8: - display->dispsw = &fbcon_cyber8; + if (display->var.accel_flags & FB_ACCELF_TEXT) { + display->dispsw = &fbcon_cyber8; +#warning FIXME: We should reinit the graphics engine here + } else + display->dispsw = &fbcon_cfb8; break; #endif #ifdef CONFIG_FBCON_CFB16 @@ -880,7 +881,7 @@ static int cyberfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { - int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp; + int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel; if ((err = do_fb_set_var(var, con == currcon))) return(err); @@ -890,11 +891,13 @@ oldvxres = fb_display[con].var.xres_virtual; oldvyres = fb_display[con].var.yres_virtual; oldbpp = fb_display[con].var.bits_per_pixel; + oldaccel = fb_display[con].var.accel_flags; fb_display[con].var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || - oldbpp != var->bits_per_pixel) { + oldbpp != var->bits_per_pixel || + oldaccel != var->accel_flags) { cyberfb_set_disp(con, info); (*fb_info.changevar)(con); fb_alloc_cmap(&fb_display[con].cmap, 0, 0); @@ -975,7 +978,7 @@ static struct fb_ops cyberfb_ops = { cyberfb_open, cyberfb_release, cyberfb_get_fix, cyberfb_get_var, cyberfb_set_var, cyberfb_get_cmap, cyberfb_set_cmap, - cyberfb_pan_display, NULL, cyberfb_ioctl + cyberfb_pan_display, cyberfb_ioctl }; @@ -1175,7 +1178,7 @@ static struct display_switch fbcon_cyber8 = { fbcon_cfb8_setup, fbcon_cyber8_bmove, fbcon_cyber8_clear, fbcon_cyber8_putc, - fbcon_cyber8_putcs, fbcon_cyber8_revc + fbcon_cyber8_putcs, fbcon_cyber8_revc, NULL }; #endif @@ -1183,7 +1186,7 @@ #ifdef MODULE int init_module(void) { - return(cyberfb_init(NULL)); + return cyberfb_init(NULL); } void cleanup_module(void) diff -u --recursive --new-file v2.1.106/linux/drivers/video/dnfb.c linux/drivers/video/dnfb.c --- v2.1.106/linux/drivers/video/dnfb.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/dnfb.c Wed Jun 24 14:44:01 1998 @@ -142,7 +142,7 @@ static struct fb_info fb_info; static struct fb_ops dnfb_ops = { dnfb_open,dnfb_release, dnfb_get_fix, dnfb_get_var, dnfb_set_var, - dnfb_get_cmap, dnfb_set_cmap, dnfb_pan_display, NULL, dnfb_ioctl + dnfb_get_cmap, dnfb_set_cmap, dnfb_pan_display, dnfb_ioctl }; static int currcon=0; @@ -187,6 +187,7 @@ static int dnfb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->xres=1280; var->yres=1024; var->xres_virtual=2048; @@ -206,7 +207,6 @@ var->vsync_len=0; var->sync=0; var->vmode=FB_VMODE_NONINTERLACED; - var->accel=FB_ACCEL_NONE; return 0; @@ -249,8 +249,6 @@ return -EINVAL; if(var->vmode!=FB_VMODE_NONINTERLACED) return -EINVAL; - if(var->accel!=FB_ACCEL_NONE) - return -EINVAL; return 0; @@ -297,7 +295,7 @@ if(con==-1) con=0; - disp[con].screen_base = (u_char *)fix.smem_start; + disp[con].screen_base = fix.smem_start; disp[con].visual = fix.visual; disp[con].type = fix.type; disp[con].type_aux = fix.type_aux; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-afb.c linux/drivers/video/fbcon-afb.c --- v2.1.106/linux/drivers/video/fbcon-afb.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/fbcon-afb.c Wed Jun 24 14:44:01 1998 @@ -414,7 +414,7 @@ struct display_switch fbcon_afb = { fbcon_afb_setup, fbcon_afb_bmove, fbcon_afb_clear, fbcon_afb_putc, - fbcon_afb_putcs, fbcon_afb_revc + fbcon_afb_putcs, fbcon_afb_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb16.c linux/drivers/video/fbcon-cfb16.c --- v2.1.106/linux/drivers/video/fbcon-cfb16.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/fbcon-cfb16.c Wed Jun 24 14:44:01 1998 @@ -37,7 +37,7 @@ void fbcon_cfb16_setup(struct display *p) { - p->next_line = p->var.xres_virtual<<1; + p->next_line = p->line_length ? p->line_length : p->var.xres_virtual<<1; p->next_plane = 0; } @@ -181,7 +181,7 @@ struct display_switch fbcon_cfb16 = { fbcon_cfb16_setup, fbcon_cfb16_bmove, fbcon_cfb16_clear, fbcon_cfb16_putc, - fbcon_cfb16_putcs, fbcon_cfb16_revc + fbcon_cfb16_putcs, fbcon_cfb16_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb2.c linux/drivers/video/fbcon-cfb2.c --- v2.1.106/linux/drivers/video/fbcon-cfb2.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/fbcon-cfb2.c Wed Jun 24 14:44:01 1998 @@ -187,7 +187,7 @@ struct display_switch fbcon_cfb2 = { fbcon_cfb2_setup, fbcon_cfb2_bmove, fbcon_cfb2_clear, fbcon_cfb2_putc, - fbcon_cfb2_putcs, fbcon_cfb2_revc + fbcon_cfb2_putcs, fbcon_cfb2_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb24.c linux/drivers/video/fbcon-cfb24.c --- v2.1.106/linux/drivers/video/fbcon-cfb24.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/fbcon-cfb24.c Wed Jun 24 14:44:01 1998 @@ -108,7 +108,9 @@ *dest++ = (d2<<16) | (d3>>8); *dest++ = (d3<<24) | d4; #elif defined(__LITTLE_ENDIAN) -#error Please add support for little endian byteorder + *dest++ = (d1<<8) | (d2>>16); + *dest++ = (d2<<16) | (d3>>8); + *dest++ = (d3<<24) | d4; #else #error FIXME: No endianness?? #endif @@ -202,7 +204,7 @@ struct display_switch fbcon_cfb24 = { fbcon_cfb24_setup, fbcon_cfb24_bmove, fbcon_cfb24_clear, fbcon_cfb24_putc, - fbcon_cfb24_putcs, fbcon_cfb24_revc + fbcon_cfb24_putcs, fbcon_cfb24_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb32.c linux/drivers/video/fbcon-cfb32.c --- v2.1.106/linux/drivers/video/fbcon-cfb32.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/fbcon-cfb32.c Wed Jun 24 14:44:01 1998 @@ -186,7 +186,7 @@ struct display_switch fbcon_cfb32 = { fbcon_cfb32_setup, fbcon_cfb32_bmove, fbcon_cfb32_clear, fbcon_cfb32_putc, - fbcon_cfb32_putcs, fbcon_cfb32_revc + fbcon_cfb32_putcs, fbcon_cfb32_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb4.c linux/drivers/video/fbcon-cfb4.c --- v2.1.106/linux/drivers/video/fbcon-cfb4.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/fbcon-cfb4.c Wed Jun 24 14:44:01 1998 @@ -190,7 +190,7 @@ struct display_switch fbcon_cfb4 = { fbcon_cfb4_setup, fbcon_cfb4_bmove, fbcon_cfb4_clear, fbcon_cfb4_putc, - fbcon_cfb4_putcs, fbcon_cfb4_revc + fbcon_cfb4_putcs, fbcon_cfb4_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-cfb8.c linux/drivers/video/fbcon-cfb8.c --- v2.1.106/linux/drivers/video/fbcon-cfb8.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/fbcon-cfb8.c Wed Jun 24 14:44:01 1998 @@ -41,7 +41,7 @@ void fbcon_cfb8_setup(struct display *p) { - p->next_line = p->var.xres_virtual; + p->next_line = p->line_length ? p->line_length : p->var.xres_virtual; p->next_plane = 0; } @@ -178,7 +178,7 @@ struct display_switch fbcon_cfb8 = { fbcon_cfb8_setup, fbcon_cfb8_bmove, fbcon_cfb8_clear, fbcon_cfb8_putc, - fbcon_cfb8_putcs, fbcon_cfb8_revc + fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-ilbm.c linux/drivers/video/fbcon-ilbm.c --- v2.1.106/linux/drivers/video/fbcon-ilbm.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/fbcon-ilbm.c Wed Jun 24 14:44:01 1998 @@ -262,7 +262,7 @@ struct display_switch fbcon_ilbm = { fbcon_ilbm_setup, fbcon_ilbm_bmove, fbcon_ilbm_clear, fbcon_ilbm_putc, - fbcon_ilbm_putcs, fbcon_ilbm_revc + fbcon_ilbm_putcs, fbcon_ilbm_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-iplan2p2.c linux/drivers/video/fbcon-iplan2p2.c --- v2.1.106/linux/drivers/video/fbcon-iplan2p2.c Sun Jun 7 11:16:35 1998 +++ linux/drivers/video/fbcon-iplan2p2.c Wed Jun 24 14:44:01 1998 @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -376,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 + fbcon_iplan2p2_putc, fbcon_iplan2p2_putcs, fbcon_iplan2p2_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-iplan2p4.c linux/drivers/video/fbcon-iplan2p4.c --- v2.1.106/linux/drivers/video/fbcon-iplan2p4.c Sun Jun 7 11:16:35 1998 +++ linux/drivers/video/fbcon-iplan2p4.c Wed Jun 24 14:44:01 1998 @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -396,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 + fbcon_iplan2p4_putc, fbcon_iplan2p4_putcs, fbcon_iplan2p4_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-iplan2p8.c linux/drivers/video/fbcon-iplan2p8.c --- v2.1.106/linux/drivers/video/fbcon-iplan2p8.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/fbcon-iplan2p8.c Wed Jun 24 14:44:01 1998 @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -433,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 + fbcon_iplan2p8_putc, fbcon_iplan2p8_putcs, fbcon_iplan2p8_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-mac.c linux/drivers/video/fbcon-mac.c --- v2.1.106/linux/drivers/video/fbcon-mac.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/fbcon-mac.c Wed Jun 24 14:44:01 1998 @@ -495,7 +495,7 @@ struct display_switch fbcon_mac = { fbcon_mac_setup, fbcon_mac_bmove, fbcon_mac_clear, fbcon_mac_putc, - fbcon_mac_putcs, fbcon_mac_revc + fbcon_mac_putcs, fbcon_mac_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-mfb.c linux/drivers/video/fbcon-mfb.c --- v2.1.106/linux/drivers/video/fbcon-mfb.c Wed Apr 8 19:36:28 1998 +++ linux/drivers/video/fbcon-mfb.c Wed Jun 24 14:44:01 1998 @@ -155,7 +155,7 @@ struct display_switch fbcon_mfb = { fbcon_mfb_setup, fbcon_mfb_bmove, fbcon_mfb_clear, fbcon_mfb_putc, - fbcon_mfb_putcs, fbcon_mfb_revc + fbcon_mfb_putcs, fbcon_mfb_revc, NULL }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-vga.c linux/drivers/video/fbcon-vga.c --- v2.1.106/linux/drivers/video/fbcon-vga.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/video/fbcon-vga.c Wed Jun 24 14:44:01 1998 @@ -0,0 +1,190 @@ +/* + * linux/drivers/video/fbcon-vga.c -- Low level frame buffer operations for + * VGA characters/attributes + * + * Created 28 Mar 1998 by Geert Uytterhoeven + * Monochrome attributes added May 1998 by Andrew Apted + * + * 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. + */ + +#include +#include +#include +#include +#include + +#include + +#include "fbcon.h" +#include "fbcon-vga.h" + + + /* + * VGA screen access + */ + +static inline void vga_writew(u16 val, u16 *addr) +{ +#ifdef __powerpc__ + st_le16(addr, val); +#else + writew(val, (unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static inline u16 vga_readw(u16 *addr) +{ +#ifdef __powerpc__ + return ld_le16(addr); +#else + return readw((unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static inline void vga_memsetw(void *s, u16 c, unsigned int count) +{ + u16 *addr = (u16 *)s; + + while (count) { + count--; + vga_writew(c, addr++); + } +} + +static inline void vga_memmovew(u16 *to, u16 *from, unsigned int count) +{ + if (to < from) { + while (count) { + count--; + vga_writew(vga_readw(from++), to++); + } + } else { + from += count; + to += count; + while (count) { + count--; + vga_writew(vga_readw(--from), --to); + } + } +} + + + /* + * VGA characters/attributes + */ + +static inline u16 fbcon_vga_attr(struct display *p, + struct vc_data *conp) +{ + if (conp->vc_can_do_color) { + return conp->vc_attr << 8; + } + + /* Underline and reverse-video are mutually exclusive on MDA. + * Since reverse-video is used for cursors and selected areas, + * it takes precedence. + */ + + return (attr_reverse(p, conp) ? 0x7000 : + (attr_underline(p, conp) ? 0x0100 : 0x0700)) | + (attr_bold(p, conp) ? 0x0800 : 0) | + (attr_blink(p, conp) ? 0x8000 : 0); +} + +void fbcon_vga_setup(struct display *p) +{ + p->next_line = p->line_length; + p->next_plane = 0; +} + +void fbcon_vga_bmove(struct display *p, int sy, int sx, int dy, int dx, + int height, int width) +{ + u16 *src, *dst; + int rows; + + if (sx == 0 && dx == 0 && width == p->next_line/2) { + src = (u16 *)(p->screen_base+sy*p->next_line); + dst = (u16 *)(p->screen_base+dy*p->next_line); + vga_memmovew(dst, src, height*width); + } else if (dy < sy || (dy == sy && dx < sx)) { + src = (u16 *)(p->screen_base+sy*p->next_line+sx*2); + dst = (u16 *)(p->screen_base+dy*p->next_line+dx*2); + for (rows = height; rows-- ;) { + vga_memmovew(dst, src, width); + src += p->next_line/2; + dst += p->next_line/2; + } + } else { + src = (u16 *)(p->screen_base+(sy+height-1)*p->next_line+sx*2); + dst = (u16 *)(p->screen_base+(dy+height-1)*p->next_line+dx*2); + for (rows = height; rows-- ;) { + vga_memmovew(dst, src, width); + src -= p->next_line/2; + dst -= p->next_line/2; + } + } +} + +void fbcon_vga_clear(struct vc_data *conp, struct display *p, int sy, int sx, + int height, int width) +{ + u16 *dest = (u16 *)(p->screen_base+sy*p->next_line+sx*2); + int rows; + + if (sx == 0 && width*2 == p->next_line) + vga_memsetw(dest, conp->vc_video_erase_char, height*width); + else + for (rows = height; rows-- ; dest += p->next_line/2) + vga_memsetw(dest, conp->vc_video_erase_char, width); +} + +void fbcon_vga_putc(struct vc_data *conp, struct display *p, int c, int y, + int x) +{ + u16 *dst = (u16 *)(p->screen_base+y*p->next_line+x*2); + vga_writew(fbcon_vga_attr(p, conp) | (c & 0xff), dst); +} + +void fbcon_vga_putcs(struct vc_data *conp, struct display *p, const char *s, + int count, int y, int x) +{ + u16 *dst = (u16 *)(p->screen_base+y*p->next_line+x*2); + u16 sattr = fbcon_vga_attr(p, conp); + while (count--) + vga_writew(sattr | ((int) (*s++) & 0xff), dst++); +} + +void fbcon_vga_revc(struct display *p, int x, int y) +{ + u16 *dst = (u16 *)(p->screen_base+y*p->next_line+x*2); + u16 val = vga_readw(dst); + val = (val & 0x88ff) | ((val<<4) & 0x7000) | ((val>>4) & 0x0700); + vga_writew(val, dst); +} + + + /* + * `switch' for the low level operations + */ + +struct display_switch fbcon_vga = { + fbcon_vga_setup, fbcon_vga_bmove, fbcon_vga_clear, fbcon_vga_putc, + fbcon_vga_putcs, fbcon_vga_revc, NULL +}; + + + /* + * Visible symbols for modules + */ + +EXPORT_SYMBOL(fbcon_vga); +EXPORT_SYMBOL(fbcon_vga_setup); +EXPORT_SYMBOL(fbcon_vga_bmove); +EXPORT_SYMBOL(fbcon_vga_clear); +EXPORT_SYMBOL(fbcon_vga_putc); +EXPORT_SYMBOL(fbcon_vga_putcs); +EXPORT_SYMBOL(fbcon_vga_revc); diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon-vga.h linux/drivers/video/fbcon-vga.h --- v2.1.106/linux/drivers/video/fbcon-vga.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/video/fbcon-vga.h Wed Jun 24 14:44:01 1998 @@ -0,0 +1,15 @@ + /* + * VGA characters/attributes + */ + +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, + int height, int width); +extern void fbcon_vga_clear(struct vc_data *conp, struct display *p, int sy, + int sx, int height, int width); +extern void fbcon_vga_putc(struct vc_data *conp, struct display *p, int c, + int yy, int xx); +extern void fbcon_vga_putcs(struct vc_data *conp, struct display *p, + const char *s, int count, int yy, int xx); +extern void fbcon_vga_revc(struct display *p, int xx, int yy); diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon.c linux/drivers/video/fbcon.c --- v2.1.106/linux/drivers/video/fbcon.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/fbcon.c Wed Jun 24 14:44:01 1998 @@ -24,6 +24,8 @@ * Martin Schaller * Andreas Schwab * + * Hardware cursor support added by Emmanuel Marty (core@ggi-project.org) + * * * The low level operations for the various display memory organizations are * now in separate source files. @@ -39,7 +41,6 @@ * To do: * * - Implement 16 plane mode (iplan2p16) - * - Hardware cursor * * * This file is subject to the terms and conditions of the GNU General Public @@ -82,7 +83,7 @@ #ifdef CONFIG_MAC #include #endif -#ifdef __mc68000__ +#if defined(__mc68000__) || defined(CONFIG_APUS) #include #include #endif @@ -101,8 +102,13 @@ struct display fb_display[MAX_NR_CONSOLES]; -/* ++Geert: Sorry, no hardware cursor support at the moment; - use Atari alike software cursor */ +/* + * Emmanuel: fbcon will now use a hardware cursor if the + * low-level driver provides a non-NULL dispsw->cursor pointer, + * in which case the hardware should do blinking, etc. + * + * if dispsw->cursor is NULL, use Atari alike software cursor + */ #if FLASHING_CURSOR static int cursor_drawn = 0; @@ -164,8 +170,7 @@ 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_set_palette(struct vc_data *conp, unsigned char *table); -static int fbcon_scrolldelta(int lines); -static int fbcon_set_mode(struct vc_data *conp, int mode); +static int fbcon_scrolldelta(struct vc_data *conp, int lines); /* @@ -527,26 +532,35 @@ int unit = conp->vc_num; struct display *p = &fb_display[unit]; + /* do we have a hardware cursor ? */ + if (p->dispsw->cursor) { + p->cursor_x = conp->vc_x; + p->cursor_y = conp->vc_y; + p->dispsw->cursor(p, mode, p->cursor_x, real_y(p, p->cursor_y)); + return; + } + /* Avoid flickering if there's no real change. */ if (p->cursor_x == conp->vc_x && p->cursor_y == conp->vc_y && (mode == CM_ERASE) == !cursor_on) return; - if (CURSOR_UNDRAWN ()) - p->dispsw->revc(p, p->cursor_x, real_y(p, p->cursor_y)); - p->cursor_x = conp->vc_x; - p->cursor_y = conp->vc_y; - - switch (mode) { - case CM_ERASE: - cursor_on = 0; - break; - case CM_MOVE: - case CM_DRAW: - vbl_cursor_cnt = CURSOR_DRAW_DELAY; - cursor_on = 1; - break; - } + if (CURSOR_UNDRAWN ()) + p->dispsw->revc(p, p->cursor_x, real_y(p, p->cursor_y)); + p->cursor_x = conp->vc_x; + p->cursor_y = conp->vc_y; + + switch (mode) { + case CM_ERASE: + cursor_on = 0; + break; + + case CM_MOVE: + case CM_DRAW: + vbl_cursor_cnt = CURSOR_DRAW_DELAY; + cursor_on = 1; + break; + } } @@ -642,9 +656,10 @@ { p->yscroll -= count; if (p->yscroll < 0) { - p->yscroll = p->vrows-conp->vc_rows; - p->dispsw->bmove(p, 0, 0, p->yscroll+count, 0, conp->vc_rows-count, - conp->vc_cols); + p->dispsw->bmove(p, p->yscroll + count, 0, + p->vrows - conp->vc_rows + count, 0, + conp->vc_rows - count, conp->vc_cols); + p->yscroll = p->vrows - conp->vc_rows; } p->var.xoffset = 0; p->var.yoffset = p->yscroll*p->fontheight; @@ -1051,13 +1066,14 @@ val = conp->vc_palette[j++]; palette_blue[k] = (val<<8)|val; } - palette_cmap.len = 1<var.bits_per_pixel; - if (palette_cmap.len > 16) + if (p->var.bits_per_pixel <= 4) + palette_cmap.len = 1<var.bits_per_pixel; + else palette_cmap.len = 16; return p->fb_info->fbops->fb_set_cmap(&palette_cmap, 1, unit, p->fb_info); } -static int fbcon_scrolldelta(int lines) +static int fbcon_scrolldelta(struct vc_data *conp, int lines) { #if SUPPORT_SCROLLBACK int unit = fg_console; /* xxx */ @@ -1092,20 +1108,6 @@ } - /* - * Switch between `text' (emulated and accelerated) and `graphics' - * (unaccelerated text) mode - */ - -static int fbcon_set_mode(struct vc_data *conp, int mode) -{ - struct display *p = &fb_display[conp->vc_num]; - struct fb_ops *ops = p->fb_info->fbops; - - return ops->fb_set_mode ? ops->fb_set_mode(mode, p->fb_info) : 0; -} - - #define LOGO_H 80 #define LOGO_W 80 #define LOGO_LINE (LOGO_W/8) @@ -1120,15 +1122,20 @@ unsigned char *dst, *src; int i, j, n, x1, y1; int logo_depth, done = 0; - - /* Set colors if visual is PSEUDOCOLOR and we have enough colors */ - if (p->visual == FB_VISUAL_PSEUDOCOLOR && depth >= 4) { - int first_col = depth >= 8 ? 32 : depth > 4 ? 16 : 0; - int num_cols = depth >= 8 ? LINUX_LOGO_COLORS : 16; + + /* Set colors if visual is PSEUDOCOLOR and we have enough colors, or for + * TRUECOLOR */ + if ((p->visual == FB_VISUAL_PSEUDOCOLOR && depth >= 4) || + p->visual == FB_VISUAL_TRUECOLOR) { + int is_truecolor = (p->visual == FB_VISUAL_TRUECOLOR); + int use_256 = (!is_truecolor && depth >= 8) || + (is_truecolor && depth >= 24); + 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 (depth >= 8) { + if (use_256) { red = linux_logo_red; green = linux_logo_green; blue = linux_logo_blue; @@ -1142,7 +1149,7 @@ /* 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; + fb_display[fg_console].cmap.len = 1 << (depth/(is_truecolor ? 3 : 1)); for( i = 0; i < num_cols; i += n ) { n = num_cols - i; @@ -1161,7 +1168,7 @@ } fb_display[fg_console].cmap.len = old_cmap_len; } - + if (depth >= 8) { logo = linux_logo; logo_depth = 8; @@ -1194,10 +1201,14 @@ for( y1 = 0; y1 < LOGO_H; y1++ ) { dst = fb + y1*line; for( x1 = 0; x1 < LOGO_W; x1++, src++ ) { - val = ((linux_logo_red[*src] & redmask) << redshift) | - ((linux_logo_green[*src] & greenmask) << greenshift) | - ((linux_logo_blue[*src] & bluemask) << blueshift); + val = (*src << redshift) | + (*src << greenshift) | + (*src << blueshift); +#ifdef __LITTLE_ENDIAN + for( i = 0; i < bdepth; ++i ) +#else for( i = bdepth-1; i >= 0; --i ) +#endif *dst++ = val >> (i*8); } } @@ -1251,10 +1262,14 @@ for( y1 = 0; y1 < LOGO_H; y1++ ) { dst = fb + y1*line; for( x1 = 0; x1 < LOGO_W; x1++, src++ ) { - val = ((linux_logo_red[*src] & redmask) << redshift) | - ((linux_logo_green[*src] & greenmask) << greenshift) | - ((linux_logo_blue[*src] & bluemask) << blueshift); + val = ((linux_logo_red[*src-32] & redmask) << redshift) | + ((linux_logo_green[*src-32] & greenmask) << greenshift) | + ((linux_logo_blue[*src-32] & bluemask) << blueshift); +#ifdef __LITTLE_ENDIAN for( i = 0; i < bdepth; ++i ) +#else + for( i = bdepth-1; i >= 0; --i ) +#endif *dst++ = val >> (i*8); } } @@ -1328,7 +1343,9 @@ #endif #if defined(CONFIG_FBCON_MFB) || defined(CONFIG_FBCON_AFB) || \ defined(CONFIG_FBCON_ILBM) - if (depth == 1) { + if (depth == 1 && (p->type == FB_TYPE_PACKED_PIXELS || + p->type == FB_TYPE_PLANES || + p->type == FB_TYPE_INTERLEAVED_PLANES)) { /* monochrome */ unsigned char inverse = p->inverse ? 0x00 : 0xff; @@ -1343,6 +1360,21 @@ done = 1; } #endif +#ifdef CONFIG_FBCON_VGA + if (depth == 1 && p->type == FB_TYPE_VGA_TEXT) { + + int height = 0; + char *p; + + printk(linux_mda_image); + + for (p = linux_mda_image; *p; p++) + if (*p == '\n') + height++; + + return height; + } +#endif /* Modes not yet supported: packed pixels with depth != 8 (does such a * thing exist in reality?) */ @@ -1359,7 +1391,7 @@ fbcon_startup, fbcon_init, fbcon_deinit, fbcon_clear, fbcon_putc, fbcon_putcs, fbcon_cursor, fbcon_scroll, fbcon_bmove, fbcon_switch, fbcon_blank, fbcon_get_font, fbcon_set_font, fbcon_set_palette, - fbcon_scrolldelta, fbcon_set_mode + fbcon_scrolldelta }; @@ -1376,6 +1408,7 @@ (void *)fbcon_dummy_op, /* fbcon_dummy_putc */ (void *)fbcon_dummy_op, /* fbcon_dummy_putcs */ (void *)fbcon_dummy_op, /* fbcon_dummy_revc */ + NULL, /* fbcon_dummy_cursor */ }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/fbcon.h linux/drivers/video/fbcon.h --- v2.1.106/linux/drivers/video/fbcon.h Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/fbcon.h Wed Jun 24 14:44:01 1998 @@ -29,6 +29,7 @@ void (*putcs)(struct vc_data *conp, struct display *p, const char *s, int count, int yy, int xx); void (*revc)(struct display *p, int xx, int yy); + void (*cursor)(struct display *p, int mode, int xx, int yy); }; @@ -45,12 +46,14 @@ (((conp)->vc_video_erase_char >> ((p)->inverse ? 8 : 12)) & 0x0f) /* Monochrome */ -#define attr_bold(p,conp) \ - (((conp)->vc_attr & 3) == 2) -#define attr_reverse(p,conp) \ +#define attr_bold(p,conp) \ + ((conp)->vc_attr & 2) +#define attr_reverse(p,conp) \ (((conp)->vc_attr & 8) ^ ((p)->inverse ? 8 : 0)) #define attr_underline(p,conp) \ - (((conp)->vc_attr) & 4) + ((conp)->vc_attr & 4) +#define attr_blink(p,conp) \ + ((conp)->vc_attr & 0x80) /* ================================================================= */ @@ -317,6 +320,54 @@ return(memset(s, 255, count)); } +#ifdef __i386__ +static __inline__ void fast_memmove(void *d, const void *s, size_t count) +{ + if (d < s) { +__asm__ __volatile__ ( + "cld\n\t" + "shrl $1,%%ecx\n\t" + "jnc 1f\n\t" + "movsb\n" + "1:\tshrl $1,%%ecx\n\t" + "jnc 2f\n\t" + "movsw\n" + "2:\trep\n\t" + "movsl" + : /* no output */ + :"c"(count),"D"((long)d),"S"((long)s) + :"cx","di","si","memory"); + } else { +__asm__ __volatile__ ( + "std\n\t" + "shrl $1,%%ecx\n\t" + "jnc 1f\n\t" + "movb 3(%%esi),%%al\n\t" + "movb %%al,3(%%edi)\n\t" + "decl %%esi\n\t" + "decl %%edi\n" + "1:\tshrl $1,%%ecx\n\t" + "jnc 2f\n\t" + "movw 2(%%esi),%%ax\n\t" + "movw %%ax,2(%%edi)\n\t" + "decl %%esi\n\t" + "decl %%edi\n\t" + "decl %%esi\n\t" + "decl %%edi\n" + "2:\trep\n\t" + "movsl" + : /* no output */ + :"c"(count),"D"(count-4+(long)d),"S"(count-4+(long)s) + :"ax","cx","di","si","memory"); + } +} + +static __inline__ void *mymemmove(char *dst, const char *src, size_t size) +{ + fast_memmove(dst, src, size); + return dst; +} +#else static __inline__ void *mymemmove(void *d, const void *s, size_t count) { return(memmove(d, s, count)); @@ -326,6 +377,7 @@ { memmove(dst, src, size); } +#endif /* !i386 */ #endif /* !m68k */ diff -u --recursive --new-file v2.1.106/linux/drivers/video/fonts.c linux/drivers/video/fonts.c --- v2.1.106/linux/drivers/video/fonts.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/fonts.c Wed Jun 24 14:44:02 1998 @@ -12,7 +12,7 @@ #include #include #include -#ifdef __mc68000__ +#if defined(__mc68000__) || defined(CONFIG_APUS) #include #endif #include "font.h" diff -u --recursive --new-file v2.1.106/linux/drivers/video/hpfb.c linux/drivers/video/hpfb.c --- v2.1.106/linux/drivers/video/hpfb.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/video/hpfb.c Wed Jun 24 14:44:02 1998 @@ -0,0 +1,431 @@ +/* + * HP300 Topcat framebuffer support (derived from macfb of all things) + * Phil Blundell 1998 + * + * Should this be moved to drivers/dio/video/ ? -- Peter Maydell + * No! -- Jes + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fbcon-mfb.h" +#include "fbcon-cfb2.h" +#include "fbcon-cfb4.h" +#include "fbcon-cfb8.h" + +#define arraysize(x) (sizeof(x)/sizeof(*(x))) + +static struct display disp; +static struct fb_info fb_info; + +unsigned long fb_start, fb_size = 1024*768, fb_line_length = 1024; +unsigned long fb_regs; +unsigned char fb_bitmask; + +#define TC_WEN 0x4088 +#define TC_REN 0x408c +#define TC_FBEN 0x4090 +#define TC_NBLANK 0x4080 + +/* blitter regs */ +#define BUSY 0x4044 +#define WMRR 0x40ef +#define SOURCE_X 0x40f2 +#define SOURCE_Y 0x40f6 +#define DEST_X 0x40fa +#define DEST_Y 0x40fe +#define WHEIGHT 0x4106 +#define WWIDTH 0x4102 +#define WMOVE 0x409c + +static struct fb_var_screeninfo hpfb_defined = { + 0,0,0,0, /* W,H, W, H (virtual) load xres,xres_virtual*/ + 0,0, /* virtual -> visible no offset */ + 0, /* depth -> load bits_per_pixel */ + 0, /* greyscale ? */ + {0,2,0}, /* R */ + {0,2,0}, /* G */ + {0,2,0}, /* B */ + {0,0,0}, /* transparency */ + 0, /* standard pixel format */ + FB_ACTIVATE_NOW, + 274,195, /* 14" monitor */ + FB_ACCEL_NONE, + 0L,0L,0L,0L,0L, + 0L,0L,0, /* No sync info */ + FB_VMODE_NONINTERLACED, + {0,0,0,0,0,0} +}; + +struct hpfb_par +{ +}; + +static int currcon = 0; +struct hpfb_par current_par; + +static void hpfb_encode_var(struct fb_var_screeninfo *var, + struct hpfb_par *par) +{ + int i=0; + var->xres=1024; + var->yres=768; + var->xres_virtual=1024; + var->yres_virtual=768; + var->xoffset=0; + var->yoffset=0; + var->bits_per_pixel = 1; + var->grayscale=0; + var->transp.offset=0; + var->transp.length=0; + var->transp.msb_right=0; + var->nonstd=0; + var->activate=0; + var->height= -1; + var->width= -1; + var->vmode=FB_VMODE_NONINTERLACED; + var->pixclock=0; + 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; + for(i=0;ireserved);i++) + var->reserved[i]=0; +} + +static void hpfb_get_par(struct hpfb_par *par) +{ + *par=current_par; +} + +static int fb_update_var(int con, struct fb_info *info) +{ + return 0; +} + +static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive) +{ + struct hpfb_par par; + + hpfb_get_par(&par); + hpfb_encode_var(var, &par); + return 0; +} + +static int hpfb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + return 0; +} + +/* + * Set the palette. This may not work on all boards but only experimentation will tell. + * XXX Doesn't work at all. + */ + +static int hpfb_set_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + unsigned int i; + for (i = 0; i < cmap->len; i++) + { + while (readw(fb_regs + 0x6002) & 0x4) udelay(1); + writew(0, fb_regs + 0x60f0); + writew(cmap->start + i, fb_regs + 0x60b8); + writew(cmap->red[i], fb_regs + 0x60b2); + writew(cmap->green[i], fb_regs + 0x60b4); + writew(cmap->blue[i], fb_regs + 0x60b6); + writew(0xff, fb_regs + 0x60f0); + udelay(100); + } + writew(0xffff, fb_regs + 0x60ba); + return 0; +} + +static int hpfb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + struct hpfb_par par; + if(con==-1) + { + hpfb_get_par(&par); + hpfb_encode_var(var, &par); + } + else + *var=fb_display[con].var; + return 0; +} + +static int hpfb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + int err; + + if ((err=do_fb_set_var(var, 1))) + return err; + return 0; +} + +static void hpfb_encode_fix(struct fb_fix_screeninfo *fix, + struct hpfb_par *par) +{ + memset(fix, 0, sizeof(struct fb_fix_screeninfo)); + strcpy(fix->id, "HP300 Topcat"); + + /* + * X works, but screen wraps ... + */ + fix->smem_start=(char *)fb_start; + fix->smem_len=fb_size; + fix->type = FB_TYPE_PACKED_PIXELS; + fix->visual = FB_VISUAL_PSEUDOCOLOR; + fix->xpanstep=0; + fix->ypanstep=0; + fix->ywrapstep=0; + fix->line_length=fb_line_length; +} + +static int hpfb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info) +{ + struct hpfb_par par; + hpfb_get_par(&par); + hpfb_encode_fix(fix, &par); + return 0; +} + +static void topcat_blit(int x0, int y0, int x1, int y1, int w, int h) +{ + while (readb(fb_regs + BUSY) & fb_bitmask); + writeb(0x3, fb_regs + WMRR); + writew(x0, fb_regs + SOURCE_X); + writew(y0, fb_regs + SOURCE_Y); + writew(x1, fb_regs + DEST_X); + writew(y1, fb_regs + DEST_Y); + writew(h, fb_regs + WHEIGHT); + writew(w, fb_regs + WWIDTH); + writeb(fb_bitmask, fb_regs + WMOVE); +} + +static int hpfb_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg, int con, + struct fb_info *info) +{ + return -EINVAL; +} + +static int hpfb_switch(int con, struct fb_info *info) +{ + do_fb_set_var(&fb_display[con].var,1); + currcon=con; + return 0; +} + +/* 0 unblank, 1 blank, 2 no vsync, 3 no hsync, 4 off */ + +static void hpfb_blank(int blank, struct fb_info *info) +{ + /* Not supported */ +} + +static int hpfb_open(struct fb_info *info) +{ + /* + * Nothing, only a usage count for the moment + */ + MOD_INC_USE_COUNT; + return(0); +} + +static void hpfb_set_disp(int con) +{ + struct fb_fix_screeninfo fix; + struct display *display; + + if (con >= 0) + display = &fb_display[con]; + else + display = &disp; /* used during initialization */ + + hpfb_get_fix(&fix, con, 0); + + 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->next_line = fix.line_length; + display->can_soft_blank = 0; + display->inverse = 0; + + display->dispsw = &fbcon_cfb8; +} + +static int hpfb_release(struct fb_info *info) +{ + MOD_DEC_USE_COUNT; + return(0); +} + +static struct fb_ops hpfb_ops = { + hpfb_open, + hpfb_release, + hpfb_get_fix, + hpfb_get_var, + hpfb_set_var, + hpfb_get_cmap, + hpfb_set_cmap, + NULL, + hpfb_ioctl +}; + +#define TOPCAT_FBOMSB 0x5d +#define TOPCAT_FBOLSB 0x5f + +__initfunc(int hpfb_init_one(unsigned long base)) +{ + unsigned long fboff; + int err; + + fboff = (readb(base + TOPCAT_FBOMSB) << 8) + | readb(base + TOPCAT_FBOLSB); + + fb_start = 0xf0000000 | (readb(base + fboff) << 16); + fb_regs = base; + +#if 0 + /* This is the magic incantation NetBSD uses to make Catseye boards work. */ + writeb(0, base+0x4800); + writeb(0, base+0x4510); + writeb(0, base+0x4512); + writeb(0, base+0x4514); + writeb(0, base+0x4516); + writeb(0x90, base+0x4206); +#endif + + /* + * Fill in the available video resolution + */ + + hpfb_defined.xres = 1024; + hpfb_defined.yres = 768; + hpfb_defined.xres_virtual = 1024; + hpfb_defined.yres_virtual = 768; + hpfb_defined.bits_per_pixel = 8; + + /* + * Give the hardware a bit of a prod and work out how many bits per + * pixel are supported. + */ + + writeb(0xff, base + TC_WEN); + writeb(0xff, base + TC_FBEN); + writeb(0xff, fb_start); + fb_bitmask = readb(fb_start); + + /* + * Enable reading/writing of all the planes. + */ + writeb(fb_bitmask, base + TC_WEN); + writeb(fb_bitmask, base + TC_REN); + writeb(fb_bitmask, base + TC_FBEN); + writeb(0x1, base + TC_NBLANK); + + /* + * Let there be consoles.. + */ + strcpy(fb_info.modename, "Topcat"); + fb_info.changevar = NULL; + fb_info.node = -1; + fb_info.fbops = &hpfb_ops; + fb_info.disp = &disp; + fb_info.switch_con = &hpfb_switch; + fb_info.updatevar = &fb_update_var; + fb_info.blank = &hpfb_blank; + do_fb_set_var(&hpfb_defined, 1); + + err = register_framebuffer(&fb_info); + if (err < 0) + return 1; + + hpfb_get_var(&disp.var, -1, &fb_info); + hpfb_set_disp(-1); + + return 0; +} + +/* + * Check that the secondary ID indicates that we have some hope of working with this + * framebuffer. The catseye boards are pretty much like topcats and we can muddle through. + */ + +#define topcat_sid_ok(x) (((x) == DIO_ID2_LRCATSEYE) || ((x) == DIO_ID2_HRCCATSEYE) \ + || ((x) == DIO_ID2_HRMCATSEYE) || ((x) == DIO_ID2_TOPCAT)) + +/* + * Initialise the framebuffer + */ + +__initfunc(unsigned long hpfb_init(unsigned long mem_start)) +{ + unsigned int sid; + + /* Topcats can be on the internal IO bus or real DIO devices. + * The internal variant sits at 0xf0560000; it has primary + * and secondary ID registers just like the DIO version. + * So we merge the two detection routines. + * + * Perhaps this #define should be in a global header file: + * I believe it's common to all internal fbs, not just topcat. + */ +#define INTFBADDR 0xf0560000 + + if (hwreg_present((void *)INTFBADDR) && (DIO_ID(INTFBADDR) == DIO_ID_FBUFFER) + && topcat_sid_ok(sid = DIO_SECID(INTFBADDR))) + { + printk("Internal Topcat found (secondary id %02x)\n", sid); + hpfb_init_one(INTFBADDR); + } + else + { + int sc = dio_find(DIO_ID_FBUFFER); + if (sc) + { + unsigned long addr = (unsigned long)dio_scodetoviraddr(sc); + unsigned int sid = DIO_SECID(addr); + + if (topcat_sid_ok(sid)) + { + printk("Topcat found at DIO select code %02x " + "(secondary id %02x)\n", sc, sid); + hpfb_init_one(addr); + } + } + } + + return mem_start; +} + +__initfunc(void hpfb_setup(char *options, int *ints)) +{ +} diff -u --recursive --new-file v2.1.106/linux/drivers/video/macfb.c linux/drivers/video/macfb.c --- v2.1.106/linux/drivers/video/macfb.c Sun Jun 7 11:16:35 1998 +++ linux/drivers/video/macfb.c Wed Jun 24 14:44:02 1998 @@ -44,7 +44,7 @@ 0, /* standard pixel format */ FB_ACTIVATE_NOW, 274,195, /* 14" monitor *Mikael Nykvist's anyway* */ - FB_ACCEL_NONE, /* The only way to accelerate a mac is .. */ + 0, /* The only way to accelerate a mac is .. */ 0L,0L,0L,0L,0L, 0L,0L,0, /* No sync info */ FB_VMODE_NONINTERLACED, @@ -94,7 +94,7 @@ static void macfb_encode_var(struct fb_var_screeninfo *var, struct macfb_par *par) { - int i=0; + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->xres=mac_xres; var->yres=mac_yres; var->xres_virtual=mac_vxres; @@ -110,7 +110,6 @@ var->activate=0; var->height= -1; var->width= -1; - var->accel=0; var->vmode=FB_VMODE_NONINTERLACED; var->pixclock=0; var->sync=0; @@ -120,8 +119,6 @@ var->lower_margin=0; var->hsync_len=0; var->vsync_len=0; - for(i=0;ireserved);i++) - var->reserved[i]=0; return; } @@ -155,8 +152,6 @@ static void macfb_encode_fix(struct fb_fix_screeninfo *fix, struct macfb_par *par) { - int i; - memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id,"Macintosh"); @@ -210,7 +205,7 @@ macfb_get_fix(&fix, con, 0); - display->screen_base = (u_char *)(fix.smem_start+fix.smem_offset); + display->screen_base = fix.smem_start+fix.smem_offset; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -323,14 +318,12 @@ macfb_get_cmap, macfb_set_cmap, macfb_pan_display, - NULL, macfb_ioctl }; void macfb_setup(char *options, int *ints) { char *this_opt; - int temp; fb_info.fontname[0] = '\0'; @@ -430,7 +423,7 @@ if(err<0) { mac_boom(6); - return NULL; + return mem_start; } macfb_get_var(&disp.var, -1, &fb_info); diff -u --recursive --new-file v2.1.106/linux/drivers/video/mdafb.c linux/drivers/video/mdafb.c --- v2.1.106/linux/drivers/video/mdafb.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/video/mdafb.c Wed Jun 24 14:44:02 1998 @@ -0,0 +1,485 @@ +/* + * linux/drivers/video/mdafb.c -- MDA frame buffer device + * + * Adapted from vgafb, May 1998 by Andrew Apted + * + * This file is based on vgacon.c and vgafb.c. Read about their + * contributors there. + * + * 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. + */ + + +/* KNOWN PROBLEMS/TO DO ==================================================== * + * + * - detecting amount of memory is not yet implemented + * + * ========================================================================= */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "fbcon.h" +#include "fbcon-vga.h" + + +#ifdef __powerpc__ +#define VGA_OFFSET _ISA_MEM_BASE; +#else +#define VGA_OFFSET 0x0 +#endif + + +static int mda_font_height = 16; /* !!! */ + + +static int currcon = 0; +static struct display disp; +static struct fb_info fb_info; + +static struct fb_fix_screeninfo fb_fix = { { 0, } }; +static struct fb_var_screeninfo fb_var = { 0, }; + + +/* Description of the hardware situation */ +static unsigned char mda_video_type; +static unsigned long mda_video_mem_base; /* Base of video memory */ +static unsigned long mda_video_mem_len; /* End of video memory */ +static u16 mda_video_port_reg; /* Video register select port */ +static u16 mda_video_port_val; /* Video register value port */ +static unsigned long mda_video_num_columns; /* Number of text columns */ +static unsigned long mda_video_num_lines; /* Number of text lines */ + + + /* + * MDA screen access + */ + +static inline void mda_writew(u16 val, u16 *addr) +{ +#ifdef __powerpc__ + st_le16(addr, val); +#else + writew(val, (unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static inline u16 mda_readw(u16 *addr) +{ +#ifdef __powerpc__ + return ld_le16(addr); +#else + return readw((unsigned long)addr); +#endif /* !__powerpc__ */ +} + + +static inline void write_mda(unsigned char reg, unsigned int val) +{ + unsigned long flags; + + save_flags(flags); cli(); + + outb(reg, mda_video_port_reg); + outb(val >> 8, mda_video_port_val); + outb(reg+1, mda_video_port_reg); + outb(val & 0xff, mda_video_port_val); + + restore_flags(flags); +} + +static inline void mda_set_origin(unsigned short offset) +{ + write_mda(12, offset); +} + + /* + * Move hardware mda cursor + */ + +static int mda_write_cursor (int location) +{ + write_mda(14, location >> 1); + return 0; +} + + +void fbcon_mdafb_cursor(struct display *p, int mode, int x, int y) +{ + switch (mode) { + case CM_ERASE: + mda_write_cursor(mda_video_mem_len - 1); + break; + + case CM_MOVE: + case CM_DRAW: + mda_write_cursor(y*p->next_line + (x << 1)); + break; + } +} + + + /* + * Interface to the low level console driver + */ + +void mdafb_setup(char *options, int *ints); +static int mdafbcon_switch(int con, struct fb_info *info); +static int mdafbcon_updatevar(int con, struct fb_info *info); +static void mdafbcon_blank(int blank, struct fb_info *info); + + + /* + * Open/Release the frame buffer device + */ + +static int mdafb_open(struct fb_info *info) +{ + MOD_INC_USE_COUNT; + return 0; +} + +static int mdafb_release(struct fb_info *info) +{ + MOD_DEC_USE_COUNT; + return 0; +} + + + /* + * Get the Fixed Part of the Display + */ + +static int mdafb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info) +{ + memcpy(fix, &fb_fix, sizeof(fb_fix)); + return 0; +} + + + /* + * Get the User Defined Part of the Display + */ + +static int mdafb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + memcpy(var, &fb_var, sizeof(fb_var)); + return 0; +} + + + /* + * Set the User Defined Part of the Display + */ + +static int mdafb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + struct display *display; + + if (con >= 0) + display = &fb_display[con]; + else + display = &disp; /* used during initialization */ + + if (var->xres > fb_var.xres || var->yres > fb_var.yres || + var->xres_virtual > fb_var.xres_virtual || + var->yres_virtual > fb_var.yres_virtual || + var->bits_per_pixel > fb_var.bits_per_pixel || + var->nonstd || !(var->accel_flags & FB_ACCELF_TEXT) || + (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED) + return -EINVAL; + + memcpy(var, &fb_var, sizeof(fb_var)); + + if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { + display->var = *var; + mda_set_origin(var->yoffset/mda_font_height*fb_fix.line_length/2); + } + + return 0; +} + + + /* + * Pan or Wrap the Display + * + * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag + */ + +static int mdafb_pan_display(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + if (var->xoffset || var->yoffset+var->yres > var->yres_virtual) + return -EINVAL; + + mda_set_origin(var->yoffset/mda_font_height*fb_fix.line_length/2); + return 0; +} + + + /* + * Get the Colormap + */ + +static int mdafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + /* MDA is simply black and white */ + + return 0; +} + + + /* + * Set the Colormap + */ + +static int mdafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + /* MDA is simply black and white */ + + return 0; +} + + +static int mdafb_ioctl(struct inode *inode, struct file *file, u_int cmd, + u_long arg, int con, struct fb_info *info) +{ + return -EINVAL; +} + + /* + * Interface used by the world + */ + +static struct fb_ops mdafb_ops = { + mdafb_open, mdafb_release, mdafb_get_fix, mdafb_get_var, + mdafb_set_var, mdafb_get_cmap, mdafb_set_cmap, mdafb_pan_display, + mdafb_ioctl +}; + + /* + * MDA text console with hardware cursor + */ + +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 +}; + + + /* + * Initialisation + */ + +__initfunc(unsigned long mdafb_init(unsigned long mem_start)) +{ + int err; + u16 saved; + u16 *p; + + mda_video_num_lines = 25; + mda_video_num_columns = 80; + mda_video_type = VIDEO_TYPE_MDA; + mda_video_mem_base = 0xb0000 + VGA_OFFSET; + mda_video_mem_len = 0x01000; + mda_video_port_reg = 0x3b4; + mda_video_port_val = 0x3b5; + + strcpy(fb_fix.id, "MDA-Dual-Head"); + request_region(0x3b0, 12, "mda-2"); + request_region(0x3bf, 1, "mda-2"); + + /* + * Find out if there is a graphics card present. + * Are there smarter methods around? + */ + p = (u16 *)mda_video_mem_base; + saved = mda_readw(p); + mda_writew(0xAA55, p); + if (mda_readw(p) != 0xAA55) { + mda_writew(saved, p); + return mem_start; + } + mda_writew(0x55AA, p); + if (mda_readw(p) != 0x55AA) { + mda_writew(saved, p); + return mem_start; + } + mda_writew(saved, p); + + fb_fix.smem_start = (char *) mda_video_mem_base; + fb_fix.smem_len = mda_video_mem_len; + fb_fix.type = FB_TYPE_VGA_TEXT; + fb_fix.type_aux = 0; + fb_fix.visual = FB_VISUAL_PSEUDOCOLOR; + fb_fix.ypanstep = mda_font_height; + fb_fix.xpanstep = 0; + fb_fix.ywrapstep = 0; + fb_fix.line_length = 2 * mda_video_num_columns; + fb_fix.mmio_start = NULL; + fb_fix.mmio_len = 0; + fb_fix.accel = FB_ACCEL_NONE; + + fb_var.xres = mda_video_num_columns*8; + fb_var.yres = mda_video_num_lines * mda_font_height; + fb_var.xres_virtual = fb_var.xres; + /* the cursor is put at the end of the video memory, hence the -2 */ + fb_var.yres_virtual = ((fb_fix.smem_len-2)/fb_fix.line_length)* + mda_font_height; + + fb_var.xoffset = fb_var.yoffset = 0; + fb_var.bits_per_pixel = 1; + fb_var.grayscale = 1; + fb_var.red.offset = 0; + fb_var.red.length = 0; + fb_var.red.msb_right = 0; + fb_var.green.offset = 0; + fb_var.green.length = 0; + fb_var.green.msb_right = 0; + fb_var.blue.offset = 0; + fb_var.blue.length = 0; + fb_var.blue.msb_right = 0; + fb_var.transp.offset = 0; + fb_var.transp.length = 0; + fb_var.transp.msb_right = 0; + fb_var.nonstd = 0; + fb_var.activate = 0; + fb_var.height = fb_var.width = -1; + fb_var.accel_flags = FB_ACCELF_TEXT; + fb_var.pixclock = 39722; /* 25.175 MHz */ + fb_var.left_margin = 40; + fb_var.right_margin = 24; + fb_var.upper_margin = 39; + fb_var.lower_margin = 9; + fb_var.hsync_len = 96; + fb_var.vsync_len = 2; + fb_var.sync = 0; + fb_var.vmode = FB_VMODE_NONINTERLACED; + + disp.var = fb_var; + disp.cmap.start = 0; + disp.cmap.len = 0; + disp.cmap.red = NULL; + disp.cmap.green = NULL; + disp.cmap.blue = NULL; + disp.cmap.transp = NULL; + +#ifdef __i386__ + disp.screen_base = ioremap((unsigned long) fb_fix.smem_start, + fb_fix.smem_len); +#else + disp.screen_base = bus_to_virt((unsigned long) fb_fix.smem_start); +#endif + disp.visual = fb_fix.visual; + disp.type = fb_fix.type; + disp.type_aux = fb_fix.type_aux; + disp.ypanstep = fb_fix.ypanstep; + disp.ywrapstep = fb_fix.ywrapstep; + disp.line_length = fb_fix.line_length; + disp.can_soft_blank = 1; + disp.inverse = 0; + disp.dispsw = &fbcon_mdafb; + + strcpy(fb_info.modename, fb_fix.id); + fb_info.node = -1; + fb_info.fbops = &mdafb_ops; + fb_info.disp = &disp; + fb_info.fontname[0] = '\0'; + fb_info.changevar = NULL; + fb_info.switch_con = &mdafbcon_switch; + fb_info.updatevar = &mdafbcon_updatevar; + fb_info.blank = &mdafbcon_blank; + + err = register_framebuffer(&fb_info); + + if (err < 0) + return mem_start; + + mdafb_set_var(&fb_var, -1, &fb_info); + + printk("fb%d: MDA frame buffer device, using %dK of video memory\n", + GET_FB_IDX(fb_info.node), fb_fix.smem_len>>10); + + return mem_start; +} + +__initfunc(void mdafb_setup(char *options, int *ints)) +{ + /* nothing yet */ +} + + /* + * Update the `var' structure (called by fbcon.c) + */ + +static int mdafbcon_updatevar(int con, struct fb_info *info) +{ + if (con == currcon) { + struct fb_var_screeninfo *var = &fb_display[currcon].var; + + /* hardware scrolling */ + + mda_set_origin(var->yoffset / mda_font_height * + fb_fix.line_length / 2); + } + + return 0; +} + +static int mdafbcon_switch(int con, struct fb_info *info) +{ + currcon = con; + mdafbcon_updatevar(con, info); + return 0; +} + + /* + * Blank the display. + */ + +static void mdafbcon_blank(int blank, struct fb_info *info) +{ + if (blank) { + outb_p(0x00, 0x3b8); /* disable video */ + } else { + outb_p(0x08, 0x3b8); /* enable video */ + } +} + + +#ifdef MODULE +int init_module(void) +{ + mdafb_init(); + return 0; +} + +void cleanup_module(void) +{ + unregister_framebuffer(&fb_info); +} +#endif /* MODULE */ diff -u --recursive --new-file v2.1.106/linux/drivers/video/offb.c linux/drivers/video/offb.c --- v2.1.106/linux/drivers/video/offb.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/offb.c Wed Jun 24 14:44:02 1998 @@ -27,7 +27,7 @@ #include #include #ifdef CONFIG_FB_COMPAT_XPMAC -#include +#include #endif #include #include @@ -47,8 +47,6 @@ volatile unsigned char *cmap_data; }; -static struct fb_info_offb fb_info[FB_MAX]; - #ifdef __powerpc__ #define mach_eieio() eieio() #else @@ -85,6 +83,7 @@ #ifdef CONFIG_FB_COMPAT_XPMAC int console_getmode(struct vc_mode *); int console_setmode(struct vc_mode *, int); +int console_setcmap(int, unsigned char *, unsigned char *, unsigned char *); int console_powermode(int); struct fb_info *console_fb_info = NULL; int (*console_setmode_ptr)(struct vc_mode *, int) = NULL; @@ -116,7 +115,7 @@ static struct fb_ops offb_ops = { offb_open, offb_release, offb_get_fix, offb_get_var, offb_set_var, - offb_get_cmap, offb_set_cmap, offb_pan_display, NULL, offb_ioctl + offb_get_cmap, offb_set_cmap, offb_pan_display, offb_ioctl }; @@ -282,9 +281,12 @@ static const char *aty_names[] = { "ATY,mach64", "ATY,XCLAIM", "ATY,264VT", "ATY,mach64ii", "ATY,264GT-B", "ATY,mach64_3D_pcc", "ATY,XCLAIM3D", "ATY,XCLAIMVR", "ATY,RAGEII_M", - "ATY,XCLAIMVRPro", "ATY,mach64_3DU" + "ATY,XCLAIMVRPro", "ATY,mach64_3DU", "ATY,XCLAIM3DPro" }; #endif /* CONFIG_FB_ATY */ +#ifdef CONFIG_FB_S3TRIO +extern void s3triofb_init_of(unsigned long mem_start, struct device_node *dp); +#endif /* CONFIG_FB_S3TRIO */ /* @@ -305,11 +307,6 @@ if (!(dp = find_path_device(prom_display_paths[dpy]))) continue; - info = &fb_info[dpy]; - fix = &info->fix; - var = &info->var; - disp = &info->disp; - if (!ofonly) { #ifdef CONFIG_FB_ATY for (i = 0; i < sizeof(aty_names)/sizeof(*aty_names); i++) @@ -320,8 +317,17 @@ continue; } #endif /* CONFIG_FB_ATY */ +#ifdef CONFIG_FB_S3TRIO + if (s3triofb_init_of(dp)) + continue; +#endif /* CONFIG_FB_S3TRIO */ } + info = kmalloc(sizeof(struct fb_info_offb), GFP_ATOMIC); + fix = &info->fix; + var = &info->var; + disp = &info->disp; + strcpy(fix->id, "OFfb "); strncat(fix->id, dp->name, sizeof(fix->id)); fix->id[sizeof(fix->id)-1] = '\0'; @@ -329,6 +335,7 @@ if ((pp = (int *)get_property(dp, "depth", &len)) != NULL && len == sizeof(int) && *pp != 8) { printk("%s: can't use depth = %d\n", dp->full_name, *pp); + kfree(info); continue; } if ((pp = (int *)get_property(dp, "width", &len)) != NULL @@ -352,11 +359,12 @@ break; if (i >= dp->n_addrs) { printk("no framebuffer address found for %s\n", dp->full_name); + kfree(info); continue; } address = (u_long)dp->addrs[i].address; } - fix->smem_start = ioremap(address, fix->smem_len); + fix->smem_start = (char *)address; fix->type = FB_TYPE_PACKED_PIXELS; fix->type_aux = 0; @@ -379,7 +387,6 @@ var->nonstd = 0; var->activate = 0; var->height = var->width = -1; - var->accel = FB_ACCEL_NONE; var->pixclock = 10000; var->left_margin = var->right_margin = 16; var->upper_margin = var->lower_margin = 16; @@ -390,8 +397,11 @@ disp->var = *var; disp->cmap.start = 0; disp->cmap.len = 0; - disp->cmap.red = disp->cmap.green = disp->cmap.blue = disp->cmap.transp = NULL; - disp->screen_base = fix->smem_start; + disp->cmap.red = NULL; + disp->cmap.green = NULL; + disp->cmap.blue = NULL; + disp->cmap.transp = NULL; + disp->screen_base = ioremap(address, fix->smem_len); disp->visual = fix->visual; disp->type = fix->type; disp->type_aux = fix->type_aux; @@ -419,8 +429,10 @@ info->info.blank = &offbcon_blank; err = register_framebuffer(&info->info); - if (err < 0) - continue; + if (err < 0) { + kfree(info); + return mem_start; + } for (i = 0; i < 16; i++) { int j = color_table[i]; @@ -441,15 +453,15 @@ display_info.pitch = fix->line_length; display_info.mode = 0; strncpy(display_info.name, dp->name, sizeof(display_info.name)); - display_info.fb_address = iopa((unsigned long)fix->smem_start); + display_info.fb_address = address; display_info.cmap_adr_address = 0; display_info.cmap_data_address = 0; display_info.disp_reg_address = 0; /* XXX kludge for ati */ if (strncmp(dp->name, "ATY,", 4) == 0) { - display_info.disp_reg_address = iopa(address + 0x7ffc00); - display_info.cmap_adr_address = iopa(address + 0x7ffcc0); - display_info.cmap_data_address = iopa(address + 0x7ffcc1); + display_info.disp_reg_address = address + 0x7ffc00; + display_info.cmap_adr_address = address + 0x7ffcc0; + display_info.cmap_data_address = address + 0x7ffcc1; } console_fb_info = &info->info; console_set_cmap_ptr = offb_set_cmap; @@ -593,6 +605,7 @@ * - console_setmode() should fill in a struct fb_var_screeninfo (using * the MacOS video mode database) and simply call a decode_var() * function, so console_setmode_ptr is no longer needed. + * console_getmode() should convert in the other direction. * * - instead of using the console_* stuff (filled in by the frame * buffer), we should use the correct struct fb_info for the diff -u --recursive --new-file v2.1.106/linux/drivers/video/retz3fb.c linux/drivers/video/retz3fb.c --- v2.1.106/linux/drivers/video/retz3fb.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/retz3fb.c Wed Jun 24 14:44:02 1998 @@ -81,6 +81,8 @@ int hsync_len; /* length of horizontal sync */ int vsync_len; /* length of vertical sync */ int vmode; + + int accel; }; struct display_data { @@ -196,7 +198,7 @@ "640x480", { /* 640x480, 8 bpp */ 640, 480, 640, 480, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 38461, 28, 32, 12, 10, 96, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, 38461, 28, 32, 12, 10, 96, 2, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, @@ -208,7 +210,7 @@ "800x600", { /* 800x600, 8 bpp */ 800, 600, 800, 600, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 27778, 64, 24, 22, 1, 120, 2, + 0, 0, -1, -1, FB_ACCELF_TEXT, 27778, 64, 24, 22, 1, 120, 2, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, @@ -220,21 +222,21 @@ "1024x768i", { /* 1024x768, 8 bpp, interlaced */ 1024, 768, 1024, 768, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 22222, 40, 40, 32, 9, 160, 8, + 0, 0, -1, -1, FB_ACCELF_TEXT, 22222, 40, 40, 32, 9, 160, 8, FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_INTERLACED } }, { "640x480-16", { /* 640x480, 16 bpp */ 640, 480, 640, 480, 0, 0, 16, 0, {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 38461/2, 28, 32, 12, 10, 96, 2, + 0, 0, -1, -1, 0, 38461/2, 28, 32, 12, 10, 96, 2, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, { "640x480-24", { /* 640x480, 24 bpp */ 640, 480, 640, 480, 0, 0, 24, 0, {8, 8, 8}, {8, 8, 8}, {8, 8, 8}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NCR77C32BLT, 38461/3, 28, 32, 12, 10, 96, 2, + 0, 0, -1, -1, 0, 38461/3, 28, 32, 12, 10, 96, 2, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED } }, @@ -834,12 +836,11 @@ static int retz3_encode_fix(struct fb_fix_screeninfo *fix, struct retz3fb_par *par) { - short i; - + memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id, retz3fb_name); fix->smem_start = (char *)z3_fbmem; fix->smem_len = z3_size; - fix->mmio_start = (unsigned char *)z3_regs; + fix->mmio_start = (char *)z3_regs; fix->mmio_len = 0x00c00000; fix->type = FB_TYPE_PACKED_PIXELS; @@ -854,10 +855,7 @@ fix->ywrapstep = 0; fix->line_length = 0; - fix->accel = FB_ACCEL_NCR77C32BLT; - - for (i = 0; i < arraysize(fix->reserved); i++) - fix->reserved[i] = 0; + fix->accel = FB_ACCEL_NCR_77C32BLT; return 0; } @@ -891,6 +889,11 @@ par->hsync_len = var->hsync_len; par->vsync_len = var->vsync_len; + if (var->accel_flags & FB_ACCELF_TEXT) + par->accel = FB_ACCELF_TEXT; + else + par->accel = 0; + return 0; } @@ -903,8 +906,7 @@ static int retz3_encode_var(struct fb_var_screeninfo *var, struct retz3fb_par *par) { - short i; - + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->xres = par->xres; var->yres = par->yres; var->xres_virtual = par->xres_vir; @@ -926,7 +928,7 @@ var->height = -1; var->width = -1; - var->accel = FB_ACCEL_NCR77C32BLT; + var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0; var->pixclock = par->pixclock; @@ -938,9 +940,6 @@ var->hsync_len = par->hsync_len; var->vsync_len = par->vsync_len; - for (i = 0; i < arraysize(var->reserved); i++) - var->reserved[i] = 0; - var->vmode = par->vmode; return 0; } @@ -1272,7 +1271,7 @@ if (con == -1) con = 0; - display->screen_base = (unsigned char *)fix.smem_start; + display->screen_base = fix.smem_start; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -1283,7 +1282,11 @@ switch (display->var.bits_per_pixel) { #ifdef CONFIG_FBCON_CFB8 case 8: - display->dispsw = &fbcon_retz3_8; + if (display->var.accel_flags & FB_ACCELF_TEXT) { + display->dispsw = &fbcon_retz3_8; +#warning FIXME: We should reinit the graphics engine here + } else + display->dispsw = &fbcon_cfb8; break; #endif #ifdef CONFIG_FBCON_CFB16 @@ -1305,7 +1308,7 @@ static int retz3fb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { - int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp; + int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel; struct display *display; if (con >= 0) @@ -1326,12 +1329,14 @@ oldvxres = display->var.xres_virtual; oldvyres = display->var.yres_virtual; oldbpp = display->var.bits_per_pixel; + oldaccel = display->var.accel_flags; display->var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || - oldbpp != var->bits_per_pixel) { + oldbpp != var->bits_per_pixel || + oldaccel != var->accel_flags) { struct fb_fix_screeninfo fix; retz3fb_get_fix(&fix, con, info); @@ -1348,7 +1353,11 @@ switch (display->var.bits_per_pixel) { #ifdef CONFIG_FBCON_CFB8 case 8: - display->dispsw = &fbcon_retz3_8; + if (var->accel_flags & FB_ACCELF_TEXT) { + display->dispsw = &fbcon_retz3_8; +#warning FIXME: We should reinit the graphics engine here + } else + display->dispsw = &fbcon_cfb8; break; #endif #ifdef CONFIG_FBCON_CFB16 @@ -1448,7 +1457,7 @@ static struct fb_ops retz3fb_ops = { retz3fb_open, retz3fb_release, retz3fb_get_fix, retz3fb_get_var, retz3fb_set_var, retz3fb_get_cmap, retz3fb_set_cmap, - retz3fb_pan_display, NULL, retz3fb_ioctl + retz3fb_pan_display, retz3fb_ioctl }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/skeletonfb.c linux/drivers/video/skeletonfb.c --- v2.1.106/linux/drivers/video/skeletonfb.c Sun Jun 7 11:16:35 1998 +++ linux/drivers/video/skeletonfb.c Wed Jun 24 14:44:02 1998 @@ -298,7 +298,7 @@ fbgen_do_set_var(var, 1, &fbinfo.gen); err = register_framebuffer(&fb_info.gen.info); if (err < 0) - return err; + return mem_start; fbgen_set_disp(-1, &fb_info.gen.info); fbgen_install_cmap(0, &fb_info.gen); printk("fb%d: %s frame buffer device\n", GET_FB_IDX(fb_info.node), @@ -365,7 +365,7 @@ static struct fb_ops xxxfb_ops = { xxxfb_open, xxxfb_release, fbgen_get_fix, fbgen_get_var, fbgen_set_var, - fbgen_get_cmap, fbgen_set_cmap, fbgen_pan_display, NULL, fbgen_ioctl + fbgen_get_cmap, fbgen_set_cmap, fbgen_pan_display, fbgen_ioctl }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/tgafb.c linux/drivers/video/tgafb.c --- v2.1.106/linux/drivers/video/tgafb.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/tgafb.c Wed Jun 24 14:44:02 1998 @@ -296,7 +296,7 @@ static struct fb_ops tgafb_ops = { tgafb_open, tgafb_release, tgafb_get_fix, tgafb_get_var, tgafb_set_var, - tgafb_get_cmap, tgafb_set_cmap, tgafb_pan_display, NULL, tgafb_ioctl + tgafb_get_cmap, tgafb_set_cmap, tgafb_pan_display, tgafb_ioctl }; @@ -689,12 +689,13 @@ fb_var.xres = fb_var.xres_virtual = 640; fb_var.yres = fb_var.yres_virtual = 480; fb_fix.line_length = 80*fb_var.bits_per_pixel; - fb_fix.smem_start = (char *)(tga_fb_base + LCA_DENSE_MEM); + fb_fix.smem_start = (char *)__pa(tga_fb_base + LCA_DENSE_MEM); fb_fix.smem_len = fb_fix.line_length*fb_var.yres; fb_fix.type = FB_TYPE_PACKED_PIXELS; fb_fix.type_aux = 0; - fb_fix.mmio_start = (unsigned char *)tga_regs_base; + fb_fix.mmio_start = (char *)__pa(tga_regs_base); fb_fix.mmio_len = 0x1000; /* Is this sufficient? */ + fb_fix.accel = FB_ACCEL_DEC_TGA; fb_var.xoffset = fb_var.yoffset = 0; fb_var.grayscale = 0; @@ -714,7 +715,7 @@ fb_var.nonstd = 0; fb_var.activate = 0; fb_var.height = fb_var.width = -1; - fb_var.accel = FB_ACCEL_TGA; + fb_var.accel_flags = 0; fb_var.pixclock = 39722; fb_var.left_margin = 40; fb_var.right_margin = 24; @@ -729,7 +730,7 @@ disp.cmap.start = 0; disp.cmap.len = 0; disp.cmap.red = disp.cmap.green = disp.cmap.blue = disp.cmap.transp = NULL; - disp.screen_base = fb_fix.smem_start; + disp.screen_base = (char *)tga_fb_base + LCA_DENSE_MEM; disp.visual = fb_fix.visual; disp.type = fb_fix.type; disp.type_aux = fb_fix.type_aux; diff -u --recursive --new-file v2.1.106/linux/drivers/video/txtcon.c linux/drivers/video/txtcon.c --- v2.1.106/linux/drivers/video/txtcon.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/txtcon.c Wed Jun 24 14:44:02 1998 @@ -18,6 +18,7 @@ #include #include #include +#include /* @@ -43,8 +44,7 @@ static int txtcon_get_font(struct vc_data *conp, int *w, int *h, char *data); static int txtcon_set_font(struct vc_data *conp, int w, int h, char *data); static int txtcon_set_palette(struct vc_data *conp, unsigned char *table); -static int txtcon_scrolldelta(int lines); -static int txtcon_set_mode(struct vc_data *conp, int mode); +static int txtcon_scrolldelta(struct vc_data *conp, int lines); static unsigned long txtcon_startup(unsigned long kmem_start, @@ -141,12 +141,7 @@ } -static int txtcon_scrolldelta(int lines) -{ - return -ENOSYS; -} - -static int txtcon_set_mode(struct vc_data *conp, int mode) +static int txtcon_scrolldelta(struct vc_data *conp, int lines) { return -ENOSYS; } @@ -173,6 +168,5 @@ txtcon_get_font, txtcon_set_font, txtcon_set_palette, - txtcon_scrolldelta, - txtcon_set_mode + txtcon_scrolldelta }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/vesafb.c linux/drivers/video/vesafb.c --- v2.1.106/linux/drivers/video/vesafb.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/video/vesafb.c Wed Jun 24 14:44:02 1998 @@ -0,0 +1,538 @@ +/* + * framebuffer driver for VBE 2.0 compliant graphic boards + * + * switching to graphics mode happens at boot time (while + * running in real mode, see arch/i386/video.S). + * + * (c) 1998 Gerd Knorr + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "fbcon.h" +#include "fbcon-cfb8.h" +#include "fbcon-cfb16.h" +#include "fbcon-cfb32.h" + +#define dac_reg (0x3c8) +#define dac_val (0x3c9) + +/* --------------------------------------------------------------------- */ + +/* + * card parameters + */ + +/* card */ +char *video_base; +int video_size; +char *video_vbase; /* mapped */ + +/* mode */ +int video_bpp; +int video_width; +int video_height; +int video_type = FB_TYPE_PACKED_PIXELS; +int video_visual; +int video_linelength; +int video_cmap_len; + +/* --------------------------------------------------------------------- */ + +static struct fb_var_screeninfo vesafb_defined = { + 0,0,0,0, /* W,H, W, H (virtual) load xres,xres_virtual*/ + 0,0, /* virtual -> visible no offset */ + 8, /* depth -> load bits_per_pixel */ + 0, /* greyscale ? */ + {0,0,0}, /* R */ + {0,0,0}, /* G */ + {0,0,0}, /* B */ + {0,0,0}, /* transparency */ + 0, /* standard pixel format */ + FB_ACTIVATE_NOW, + -1,-1, + 0, + 0L,0L,0L,0L,0L, + 0L,0L,0, /* No sync info */ + FB_VMODE_NONINTERLACED, + {0,0,0,0,0,0} +}; + +#define NUM_TOTAL_MODES 1 +#define NUM_PREDEF_MODES 1 + +static struct display disp; +static struct fb_info fb_info; +static struct { u_char red, green, blue, pad; } palette[256]; + +static int inverse = 0; + +struct vesafb_par +{ + void *unused; +}; + +static int currcon = 0; +static int current_par_valid = 0; +struct vesafb_par current_par; + +/* --------------------------------------------------------------------- */ +/* speed up scrolling */ + +#define USE_REDRAW 1 +#define USE_MEMMOVE 2 + +static vesafb_scroll = USE_REDRAW; +static struct display_switch vesafb_sw; + +void vesafb_bmove(struct display *p, int sy, int sx, int dy, int dx, + int height, int width) +{ + /* + * this is really faster than memmove (at least with my box) + * read access to video memory is slow... + */ + update_screen(currcon); +} + +/* --------------------------------------------------------------------- */ + + /* + * Open/Release the frame buffer device + */ + +static int vesafb_open(struct fb_info *info) +{ + /* + * Nothing, only a usage count for the moment + */ + MOD_INC_USE_COUNT; + return(0); +} + +static int vesafb_release(struct fb_info *info) +{ + MOD_DEC_USE_COUNT; + return(0); +} + +static void vesafb_encode_var(struct fb_var_screeninfo *var, + struct vesafb_par *par) +{ + memcpy(var, &vesafb_defined, sizeof(struct fb_var_screeninfo)); +} + +static void vesafb_get_par(struct vesafb_par *par) +{ + *par=current_par; +} + +static int fb_update_var(int con, struct fb_info *info) +{ + return 0; +} + +static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive) +{ + struct vesafb_par par; + + vesafb_get_par(&par); + vesafb_encode_var(var, &par); + return 0; +} + +static void vesafb_encode_fix(struct fb_fix_screeninfo *fix, + struct vesafb_par *par) +{ + memset(fix, 0, sizeof(struct fb_fix_screeninfo)); + strcpy(fix->id,"VESA VGA"); + + fix->smem_start=(char *) video_base; + fix->smem_len=video_size; + fix->type = video_type; + fix->visual = video_visual; + fix->xpanstep=0; + fix->ypanstep=0; + fix->ywrapstep=0; + fix->line_length=video_linelength; + return; +} + +static int vesafb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info) +{ + struct vesafb_par par; + vesafb_get_par(&par); + vesafb_encode_fix(fix, &par); + return 0; +} + +static int vesafb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + struct vesafb_par par; + if(con==-1) + { + vesafb_get_par(&par); + vesafb_encode_var(var, &par); + } + else + *var=fb_display[con].var; + return 0; +} + +static void vesafb_set_disp(int con) +{ + struct fb_fix_screeninfo fix; + struct display *display; + + if (con >= 0) + display = &fb_display[con]; + else + display = &disp; /* used during initialization */ + + vesafb_get_fix(&fix, con, 0); + + display->screen_base = video_vbase; + 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->next_line = fix.line_length; + display->can_soft_blank = 0; + display->inverse = inverse; + + switch (video_bpp) { +#ifdef CONFIG_FBCON_CFB8 + case 8: + display->dispsw = &fbcon_cfb8; + break; +#endif +#ifdef CONFIG_FBCON_CFB16 + case 15: + case 16: + display->dispsw = &fbcon_cfb16; + break; +#endif +#ifdef CONFIG_FBCON_CFB32 + case 32: + display->dispsw = &fbcon_cfb32; + break; +#endif + default: + display->dispsw = NULL; + break; + } + if (vesafb_scroll == USE_REDRAW) { + memcpy(&vesafb_sw,display->dispsw,sizeof(vesafb_sw)); + vesafb_sw.bmove = vesafb_bmove; + display->dispsw = &vesafb_sw; + } +} + +static int vesafb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + int err; + + if ((err=do_fb_set_var(var, 1))) + return err; + return 0; +} + +static int vesa_getcolreg(unsigned regno, unsigned *red, unsigned *green, + unsigned *blue, unsigned *transp, + struct fb_info *fb_info) +{ + /* + * Read a single color register and split it into colors/transparent. + * Return != 0 for invalid regno. + */ + + if (regno >= video_cmap_len) + return 1; + + *red = palette[regno].red; + *green = palette[regno].green; + *blue = palette[regno].blue; + return 0; +} + +static int vesa_setcolreg(unsigned regno, unsigned red, unsigned green, + unsigned blue, unsigned transp, + struct fb_info *fb_info) +{ + /* + * Set a single color register. The values supplied are + * already rounded down to the hardware's capabilities + * (according to the entries in the `var' structure). Return + * != 0 for invalid regno. + */ + + if (regno >= video_cmap_len) + return 1; + + palette[regno].red = red; + palette[regno].green = green; + palette[regno].blue = blue; + + switch (video_bpp) { +#ifdef CONFIG_FBCON_CFB8 + case 8: + /* Hmm, can we do it _allways_ this way ??? */ + outb_p(regno, dac_reg); + outb_p(red, dac_val); + outb_p(green, dac_val); + outb_p(blue, dac_val); + break; +#endif +#ifdef CONFIG_FBCON_CFB16 + case 15: + case 16: + fbcon_cfb16_cmap[regno] = + (red << vesafb_defined.red.offset) | (green << 5) | blue; + break; +#endif +#ifdef CONFIG_FBCON_CFB24 + case 24: + /* FIXME: todo */ + break; +#endif +#ifdef CONFIG_FBCON_CFB32 + case 32: + fbcon_cfb32_cmap[regno] = + (red << vesafb_defined.red.offset) | + (green << vesafb_defined.green.offset) | + (blue << vesafb_defined.blue.offset); + break; +#endif + } + return 0; +} + +static void do_install_cmap(int con, struct fb_info *info) +{ + if (con != currcon) + return; + if (fb_display[con].cmap.len) + fb_set_cmap(&fb_display[con].cmap, &fb_display[con].var, 1, + vesa_setcolreg, info); + else + fb_set_cmap(fb_default_cmap(video_cmap_len), + &fb_display[con].var, 1, vesa_setcolreg, + info); +} + +static int vesafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + if (con == currcon) /* current console? */ + return fb_get_cmap(cmap, &fb_display[con].var, kspc, vesa_getcolreg, 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(video_cmap_len), + cmap, kspc ? 0 : 2); + return 0; +} + +static int vesafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + int err; + + if (!fb_display[con].cmap.len) { /* no colormap allocated? */ + err = fb_alloc_cmap(&fb_display[con].cmap,video_cmap_len,0); + if (err) + return err; + } + if (con == currcon) /* current console? */ + return fb_set_cmap(cmap, &fb_display[con].var, kspc, vesa_setcolreg, info); + else + fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1); + return 0; +} + +static int vesafb_pan_display(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + /* no panning */ + return -EINVAL; +} + +static int vesafb_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg, int con, + struct fb_info *info) +{ + return -EINVAL; +} + +static struct fb_ops vesafb_ops = { + vesafb_open, + vesafb_release, + vesafb_get_fix, + vesafb_get_var, + vesafb_set_var, + vesafb_get_cmap, + vesafb_set_cmap, + vesafb_pan_display, + vesafb_ioctl +}; + +void vesafb_setup(char *options, int *ints) +{ + char *this_opt; + + fb_info.fontname[0] = '\0'; + + if (!options || !*options) + return; + + for(this_opt=strtok(options,","); this_opt; this_opt=strtok(NULL,",")) { + if (!*this_opt) continue; + + printk("vesafb_setup: option %s\n", this_opt); + + if (! strcmp(this_opt, "inverse")) + inverse=1; + else if (! strcmp(this_opt, "redraw")) + vesafb_scroll = USE_REDRAW; + else if (! strcmp(this_opt, "memmove")) + vesafb_scroll = USE_MEMMOVE; + else if (!strncmp(this_opt, "font:", 5)) + strcpy(fb_info.fontname, this_opt+5); + } +} + +static int vesafb_switch(int con, struct fb_info *info) +{ + /* 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, + vesa_getcolreg, info); + + currcon = con; + /* Install new colormap */ + do_install_cmap(con, info); + fb_update_var(con, info); + return 0; +} + +/* 0 unblank, 1 blank, 2 no vsync, 3 no hsync, 4 off */ + +static void vesafb_blank(int blank, struct fb_info *info) +{ + /* Not supported */ +} + +__initfunc(unsigned long vesafb_init(unsigned long mem_start)) +{ + int i,j; + + if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB) + return mem_start; + + video_base = (char*)screen_info.lfb_base; + video_bpp = screen_info.lfb_depth; + video_width = screen_info.lfb_width; + video_height = screen_info.lfb_height; + video_linelength = screen_info.lfb_linelength; + video_size = video_linelength * video_height /* screen_info.lfb_size */; + video_visual = (video_bpp == 8) ? + FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR; + video_vbase = ioremap((unsigned long)video_base, video_size); + + printk("vesafb: %dx%dx%d, linelength=%d\n", + video_width, video_height, video_bpp, video_linelength); + printk("vesafb: framebuffer at 0x%p, mapped to 0x%p, size %d\n", + video_base, video_vbase, video_size); + if (vesafb_scroll == USE_REDRAW) printk("vesafb: scrolling=redraw\n"); + if (vesafb_scroll == USE_MEMMOVE) printk("vesafb: scrolling=memmove\n"); + + vesafb_defined.xres=video_width; + vesafb_defined.yres=video_height; + vesafb_defined.xres_virtual=video_width; + vesafb_defined.yres_virtual=video_height; + vesafb_defined.bits_per_pixel=video_bpp; + + if (video_bpp > 8) { + vesafb_defined.red.offset = screen_info.red_pos; + vesafb_defined.red.length = screen_info.red_size; + vesafb_defined.green.offset = screen_info.green_pos; + vesafb_defined.green.length = screen_info.green_size; + vesafb_defined.blue.offset = screen_info.blue_pos; + vesafb_defined.blue.length = screen_info.blue_size; + vesafb_defined.transp.offset = screen_info.rsvd_pos; + vesafb_defined.transp.length = screen_info.rsvd_size; + printk("vesafb: directcolor: " + "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n", + screen_info.rsvd_size, + screen_info.red_size, + screen_info.green_size, + screen_info.blue_size, + screen_info.rsvd_pos, + screen_info.red_pos, + screen_info.green_pos, + screen_info.blue_pos); + video_cmap_len = 16; + } else { + vesafb_defined.red.length = 6; + vesafb_defined.green.length = 6; + vesafb_defined.blue.length = 6; + for(i = 0; i < 16; i++) { + j = color_table[i]; + palette[i].red = default_red[j]; + palette[i].green = default_grn[j]; + palette[i].blue = default_blu[j]; + } + video_cmap_len = 256; + } + request_region(0x3c0, 32, "vga+"); + + strcpy(fb_info.modename, "VESA VGA"); + fb_info.changevar = NULL; + fb_info.node = -1; + fb_info.fbops = &vesafb_ops; + fb_info.disp=&disp; + fb_info.switch_con=&vesafb_switch; + fb_info.updatevar=&fb_update_var; + fb_info.blank=&vesafb_blank; + do_fb_set_var(&vesafb_defined,1); + + if (register_framebuffer(&fb_info)<0) + return mem_start; + + vesafb_get_var(&disp.var, -1, &fb_info); + vesafb_set_disp(-1); + + printk("fb%d: %s frame buffer device\n", + GET_FB_IDX(fb_info.node), fb_info.modename); + + return mem_start; +} + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * --------------------------------------------------------------------------- + * Local variables: + * c-basic-offset: 8 + * End: + */ diff -u --recursive --new-file v2.1.106/linux/drivers/video/vfb.c linux/drivers/video/vfb.c --- v2.1.106/linux/drivers/video/vfb.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/vfb.c Wed Jun 24 14:44:02 1998 @@ -56,7 +56,7 @@ /* 640x480, 8 bpp */ 640, 480, 640, 480, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, - 0, 0, -1, -1, FB_ACCEL_NONE, 20000, 64, 64, 32, 32, 64, 2, + 0, 0, -1, -1, 0, 20000, 64, 64, 32, 32, 64, 2, 0, FB_VMODE_NONINTERLACED }; @@ -114,7 +114,7 @@ static struct fb_ops vfb_ops = { vfb_open, vfb_release, vfb_get_fix, vfb_get_var, vfb_set_var, vfb_get_cmap, - vfb_set_cmap, vfb_pan_display, NULL, vfb_ioctl + vfb_set_cmap, vfb_pan_display, vfb_ioctl }; @@ -250,7 +250,7 @@ struct fb_fix_screeninfo fix; vfb_encode_fix(&fix, var); - display->screen_base = (u_char *)fix.smem_start; + display->screen_base = (char *)videomemory; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -501,7 +501,7 @@ { memset(fix, 0, sizeof(struct fb_fix_screeninfo)); strcpy(fix->id, vfb_name); - fix->smem_start = (caddr_t)videomemory; + fix->smem_start = (char *)videomemory; fix->smem_len = videomemorysize; fix->type = FB_TYPE_PACKED_PIXELS; fix->type_aux = 0; diff -u --recursive --new-file v2.1.106/linux/drivers/video/vgacon.c linux/drivers/video/vgacon.c --- v2.1.106/linux/drivers/video/vgacon.c Thu Mar 26 15:57:04 1998 +++ linux/drivers/video/vgacon.c Wed Jun 24 14:44:02 1998 @@ -40,7 +40,7 @@ * * - speed up scrolling by changing the screen origin * - * - add support for palette, loadable fonts and VESA blanking + * - add support for loadable fonts and VESA blanking * * KNOWN PROBLEMS/TO DO ==================================================== */ @@ -103,8 +103,7 @@ static int vgacon_get_font(struct vc_data *conp, int *w, int *h, char *data); static int vgacon_set_font(struct vc_data *conp, int w, int h, char *data); static int vgacon_set_palette(struct vc_data *conp, unsigned char *table); -static int vgacon_scrolldelta(int lines); -static int vgacon_set_mode(struct vc_data *conp, int mode); +static int vgacon_scrolldelta(struct vc_data *conp, int lines); /* @@ -117,8 +116,8 @@ /* Description of the hardware situation */ static unsigned long vga_video_mem_base; /* Base of video memory */ static unsigned long vga_video_mem_term; /* End of video memory */ -static unsigned short vga_video_port_reg; /* Video register select port */ -static unsigned short vga_video_port_val; /* Video register value port */ +static u16 vga_video_port_reg; /* Video register select port */ +static u16 vga_video_port_val; /* Video register value port */ static unsigned long vga_video_num_columns; /* Number of text columns */ static unsigned long vga_video_num_lines; /* Number of text lines */ static unsigned long vga_video_size_row; @@ -138,7 +137,7 @@ * VGA screen access */ -static inline void vga_writew(unsigned short val, unsigned short * addr) +static inline void vga_writew(u16 val, u16 * addr) { #ifdef __powerpc__ st_le16(addr, val); @@ -147,7 +146,7 @@ #endif /* !__powerpc__ */ } -static inline unsigned short vga_readw(unsigned short * addr) +static inline u16 vga_readw(u16 * addr) { #ifdef __powerpc__ return ld_le16(addr); @@ -156,9 +155,9 @@ #endif /* !__powerpc__ */ } -static inline void vga_memsetw(void * s, unsigned short c, unsigned int count) +static inline void vga_memsetw(void * s, u16 c, unsigned int count) { - unsigned short * addr = (unsigned short *) s; + u16 * addr = (u16 *) s; while (count) { count--; @@ -166,8 +165,7 @@ } } -static inline void vga_memmovew(unsigned short *to, unsigned short *from, - unsigned int count) +static inline void vga_memmovew(u16 *to, u16 *from, unsigned int count) { if (to < from) { while (count) { @@ -213,8 +211,8 @@ __initfunc(static unsigned long vgacon_startup(unsigned long kmem_start, const char **display_desc)) { - unsigned short saved; - unsigned short *p; + u16 saved; + u16 *p; vga_video_num_lines = ORIG_VIDEO_LINES; vga_video_num_columns = ORIG_VIDEO_COLS; @@ -313,7 +311,7 @@ * Find out if there is a graphics card present. * Are there smarter methods around? */ - p = (unsigned short *)vga_video_mem_base; + p = (u16 *)vga_video_mem_base; saved = vga_readw(p); vga_writew(0xAA55, p); if (vga_readw(p) != 0xAA55) { @@ -407,7 +405,7 @@ p = (u16 *)(vga_video_mem_base+ypos*vga_video_size_row+xpos*2); sattr = conp->vc_attr << 8; while (count--) - vga_writew(sattr | *s++, p++); + vga_writew(sattr | ((int) (*s++) & 0xff), p++); } @@ -480,13 +478,12 @@ if (sx == 0 && dx == 0 && width == vga_video_num_columns) { src = vga_video_mem_base + sy * vga_video_size_row; dst = vga_video_mem_base + dy * vga_video_size_row; - vga_memmovew((unsigned short *)dst, (unsigned short *)src, - height * width); + vga_memmovew((u16 *)dst, (u16 *)src, height * width); } else if (dy < sy || (dy == sy && dx < sx)) { src = vga_video_mem_base + sy * vga_video_size_row + sx * 2; dst = vga_video_mem_base + dy * vga_video_size_row + dx * 2; for (rows = height; rows-- ;) { - vga_memmovew((unsigned short *)dst, (unsigned short *)src, width); + vga_memmovew((u16 *)dst, (u16 *)src, width); src += vga_video_size_row; dst += vga_video_size_row; } @@ -494,7 +491,7 @@ src = vga_video_mem_base + (sy+height-1) * vga_video_size_row + sx * 2; dst = vga_video_mem_base + (dy+height-1) * vga_video_size_row + dx * 2; for (rows = height; rows-- ;) { - vga_memmovew((unsigned short *)dst, (unsigned short *)src, width); + vga_memmovew((u16 *)dst, (u16 *)src, width); src -= vga_video_size_row; dst -= vga_video_size_row; } @@ -551,18 +548,12 @@ return 0; } -static int vgacon_scrolldelta(int lines) +static int vgacon_scrolldelta(struct vc_data *conp, int lines) { /* TODO */ return -ENOSYS; } -static int vgacon_set_mode(struct vc_data *conp, int mode) -{ - return -ENOSYS; -} - - __initfunc(static int vgacon_show_logo( void )) { int height = 0; @@ -585,5 +576,5 @@ vgacon_startup, vgacon_init, vgacon_deinit, vgacon_clear, vgacon_putc, vgacon_putcs, vgacon_cursor, vgacon_scroll, vgacon_bmove, vgacon_switch, vgacon_blank, vgacon_get_font, vgacon_set_font, vgacon_set_palette, - vgacon_scrolldelta, vgacon_set_mode + vgacon_scrolldelta }; diff -u --recursive --new-file v2.1.106/linux/drivers/video/vgafb.c linux/drivers/video/vgafb.c --- v2.1.106/linux/drivers/video/vgafb.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/video/vgafb.c Wed Jun 24 14:44:02 1998 @@ -0,0 +1,746 @@ +/* + * linux/drivers/video/vgafb.c -- VGA frame buffer device + * + * Created 28 Mar 1998 by Geert Uytterhoeven + * Hardware cursor support added on 14 Apr 1998 by Emmanuel Marty + * + * This file is heavily based on vgacon.c. Read about its contributors there. + * + * 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. + */ + + + + +/* KNOWN PROBLEMS/TO DO ===================================================== * + * + * - add support for loadable fonts and VESA blanking + * + * - for now only VGA _text_ mode is supported + * + * KNOWN PROBLEMS/TO DO ==================================================== */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "fbcon.h" +#include "fbcon-vga.h" + + +#define BLANK 0x0020 + +#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 */ + +#define dac_reg (0x3c8) +#define dac_val (0x3c9) + +#ifdef __powerpc__ +#define VGA_OFFSET _ISA_MEM_BASE; +#else +#define VGA_OFFSET 0x0 +#endif + + +static int currcon = 0; +static struct display disp; +static struct fb_info fb_info; +static struct { u_char red, green, blue, pad; } palette[16]; + +static struct fb_fix_screeninfo fb_fix = { { 0, } }; +static struct fb_var_screeninfo fb_var = { 0, }; + + +/* Description of the hardware situation */ +static unsigned char vga_video_type; +static unsigned long vga_video_mem_base; /* Base of video memory */ +static unsigned long vga_video_mem_term; /* End of video memory */ +static u16 vga_video_port_reg; /* Video register select port */ +static u16 vga_video_port_val; /* Video register value port */ +static unsigned long vga_video_num_columns; /* Number of text columns */ +static unsigned long vga_video_num_lines; /* Number of text lines */ +static int vga_can_do_color = 0; + + + /* + * VGA screen access + */ + +static inline void vga_writew(u16 val, u16 *addr) +{ +#ifdef __powerpc__ + st_le16(addr, val); +#else + writew(val, (unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static inline u16 vga_readw(u16 *addr) +{ +#ifdef __powerpc__ + return ld_le16(addr); +#else + return readw((unsigned long)addr); +#endif /* !__powerpc__ */ +} + +static void vga_set_split(unsigned short linenum) +{ + unsigned long flags; + unsigned char overflow, fontsize; + + if (vga_video_type != VIDEO_TYPE_VGAC) { + return; + } + + save_flags(flags); cli(); + + outb_p(0x07, vga_video_port_reg); + overflow = inb_p(vga_video_port_val); + + outb_p(0x09, vga_video_port_reg); + fontsize = inb_p(vga_video_port_val); + + overflow &= ~0x10; overflow |= (linenum & 0x100) ? 0x10 : 0; + fontsize &= ~0x40; fontsize |= (linenum & 0x200) ? 0x40 : 0; + linenum &= 0xff; + + outb_p(0x18, vga_video_port_reg); + outb_p(linenum, vga_video_port_val); + + outb_p(0x07, vga_video_port_reg); + outb_p(overflow, vga_video_port_val); + + outb_p(0x09, vga_video_port_reg); + outb_p(fontsize, vga_video_port_val); + + restore_flags(flags); +} + + +/* + * By replacing the four outb_p with two back to back outw, we can reduce + * the window of opportunity to see text mislocated to the RHS of the + * console during heavy scrolling activity. However there is the remote + * possibility that some pre-dinosaur hardware won't like the back to back + * I/O. Since the Xservers get away with it, we should be able to as well. + */ +static inline void write_vga(unsigned char reg, unsigned int val) +{ +#ifndef SLOW_VGA + unsigned int v1, v2; + + v1 = reg + (val & 0xff00); + v2 = reg + 1 + ((val << 8) & 0xff00); + outw(v1, vga_video_port_reg); + outw(v2, vga_video_port_reg); +#else + outb_p(reg, vga_video_port_reg); + outb_p(val >> 8, vga_video_port_val); + outb_p(reg+1, vga_video_port_reg); + outb_p(val & 0xff, vga_video_port_val); +#endif +} + +static inline void vga_set_origin(unsigned short offset) +{ + write_vga(12, offset); +} + + + /* + * Interface used by the world + */ + +static int vgafb_open(struct fb_info *info); +static int vgafb_release(struct fb_info *info); +static int vgafb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info); +static int vgafb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info); +static int vgafb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info); +static int vgafb_pan_display(struct fb_var_screeninfo *var, int con, + struct fb_info *info); +static int vgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info); +static int vgafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info); +static int vgafb_ioctl(struct inode *inode, struct file *file, u_int cmd, + u_long arg, int con, struct fb_info *info); + + + /* + * Interface to the low level console driver + */ + +unsigned long vgafb_init(unsigned long mem_start); +void vgafb_setup(char *options, int *ints); +static int vgafbcon_switch(int con, struct fb_info *info); +static int vgafbcon_updatevar(int con, struct fb_info *info); +static void vgafbcon_blank(int blank, struct fb_info *info); + + + /* + * VGA text console with hardware cursor + */ + +static struct display_switch fbcon_vgafb; + + + /* + * Internal routines + */ + +static int vgafb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, + u_int *transp, struct fb_info *info); +static int vgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, + u_int transp, struct fb_info *info); +static void do_install_cmap(int con, struct fb_info *info); + + +static struct fb_ops vgafb_ops = { + vgafb_open, vgafb_release, vgafb_get_fix, vgafb_get_var, vgafb_set_var, + vgafb_get_cmap, vgafb_set_cmap, vgafb_pan_display, vgafb_ioctl +}; + + + /* + * Open/Release the frame buffer device + */ + +static int vgafb_open(struct fb_info *info) + +{ + /* + * Nothing, only a usage count for the moment + */ + + MOD_INC_USE_COUNT; + return(0); +} + +static int vgafb_release(struct fb_info *info) +{ + MOD_DEC_USE_COUNT; + return(0); +} + + + /* + * Get the Fixed Part of the Display + */ + +static int vgafb_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info) +{ + memcpy(fix, &fb_fix, sizeof(fb_fix)); + return 0; +} + + + /* + * Get the User Defined Part of the Display + */ + +static int vgafb_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + memcpy(var, &fb_var, sizeof(fb_var)); + return 0; +} + + + /* + * Set the User Defined Part of the Display + */ + +static int vgafb_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + struct display *display; + int oldbpp = -1, err; + + if (con >= 0) + display = &fb_display[con]; + else + display = &disp; /* used during initialization */ + + if (var->xres > fb_var.xres || var->yres > fb_var.yres || + var->xres_virtual > fb_var.xres_virtual || + var->yres_virtual > fb_var.yres_virtual || + var->bits_per_pixel > fb_var.bits_per_pixel || + var->nonstd || !(var->accel_flags & FB_ACCELF_TEXT) || + (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED) + return -EINVAL; + memcpy(var, &fb_var, sizeof(fb_var)); + + if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { + oldbpp = display->var.bits_per_pixel; + display->var = *var; + vga_set_origin(var->yoffset/video_font_height*fb_fix.line_length/2); + } + if (oldbpp != var->bits_per_pixel) { + if ((err = fb_alloc_cmap(&display->cmap, 0, 0))) + return err; + do_install_cmap(con, info); + } + return 0; +} + + + /* + * Pan or Wrap the Display + * + * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag + */ + +static int vgafb_pan_display(struct fb_var_screeninfo *var, int con, + struct fb_info *info) +{ + if (var->xoffset || var->yoffset+var->yres > var->yres_virtual) + return -EINVAL; + + vga_set_origin(var->yoffset/video_font_height*fb_fix.line_length/2); + return 0; +} + + + /* + * Get the Colormap + */ + +static int vgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info) +{ + if (con == currcon) /* current console? */ + return fb_get_cmap(cmap, &fb_display[con].var, kspc, vgafb_getcolreg, + 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<> 1); +} + +static void fbcon_vgafb_cursor(struct display *p, int mode, int x, int y) +{ + switch (mode) { + case CM_ERASE: + vga_write_cursor(vga_video_mem_term - vga_video_mem_base - 1); + break; + + case CM_MOVE: + case CM_DRAW: + vga_write_cursor(y*p->next_line + (x << 1)); + break; + } +} + + + /* + * Initialisation + */ + +__initfunc(unsigned long vgafb_init(unsigned long mem_start)) +{ + int err; + u16 saved; + u16 *p; + + if (screen_info.orig_video_isVGA == VIDEO_TYPE_VLFB) + return mem_start; + + vga_video_num_lines = ORIG_VIDEO_LINES; + vga_video_num_columns = ORIG_VIDEO_COLS; + + if (ORIG_VIDEO_MODE == 7) { /* Is this a monochrome display? */ + vga_video_mem_base = 0xb0000 + VGA_OFFSET; + vga_video_port_reg = 0x3b4; + vga_video_port_val = 0x3b5; + if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) { + vga_video_type = VIDEO_TYPE_EGAM; + vga_video_mem_term = 0xb8000 + VGA_OFFSET; + strcpy(fb_fix.id, "EGA+"); + request_region(0x3b0, 16, "ega"); + } else { + vga_video_type = VIDEO_TYPE_MDA; + vga_video_mem_term = 0xb1000 + VGA_OFFSET; + strcpy(fb_fix.id, "*MDA"); + request_region(0x3b0, 12, "mda"); + request_region(0x3bf, 1, "mda"); + } + } else { /* If not, it is color. */ + vga_can_do_color = 1; + vga_video_mem_base = 0xb8000 + VGA_OFFSET; + vga_video_port_reg = 0x3d4; + vga_video_port_val = 0x3d5; + if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) { + int i; + + vga_video_mem_term = 0xc0000 + VGA_OFFSET; + + if (!ORIG_VIDEO_ISVGA) { + vga_video_type = VIDEO_TYPE_EGAC; + strcpy(fb_fix.id, "EGA"); + request_region(0x3c0, 32, "ega"); + } else { + vga_video_type = VIDEO_TYPE_VGAC; + strcpy(fb_fix.id, "VGA+"); + request_region(0x3c0, 32, "vga+"); + +#ifdef VGA_CAN_DO_64KB + /* + * get 64K rather than 32K of video RAM. + * This doesn't actually work on all "VGA" + * controllers (it seems like setting MM=01 + * and COE=1 isn't necessarily a good idea) + */ + vga_video_mem_base = 0xa0000 + VGA_OFFSET; + vga_video_mem_term = 0xb0000 + VGA_OFFSET; + outb_p(6, 0x3ce); + outb_p(6, 0x3cf); +#endif + + /* + * Normalise the palette registers, to point + * the 16 screen colours to the first 16 + * DAC entries. + */ + + for (i = 0; i < 16; i++) { + inb_p(0x3da); + outb_p(i, 0x3c0); + outb_p(i, 0x3c0); + } + outb_p(0x20, 0x3c0); + + /* now set the DAC registers back to their + * default values */ + + for (i = 0; i < 16; i++) { + outb_p(color_table[i], dac_reg); + outb_p(default_red[i], dac_val); + outb_p(default_grn[i], dac_val); + outb_p(default_blu[i], dac_val); + } + } + } else { + vga_video_type = VIDEO_TYPE_CGA; + vga_video_mem_term = 0xba000 + VGA_OFFSET; + strcpy(fb_fix.id, "*CGA"); + request_region(0x3d4, 2, "cga"); + } + } + + /* + * Find out if there is a graphics card present. + * Are there smarter methods around? + */ + p = (u16 *)vga_video_mem_base; + saved = vga_readw(p); + vga_writew(0xAA55, p); + if (vga_readw(p) != 0xAA55) { + vga_writew(saved, p); + return mem_start; + } + vga_writew(0x55AA, p); + if (vga_readw(p) != 0x55AA) { + vga_writew(saved, p); + return mem_start; + } + vga_writew(saved, p); + + if (vga_video_type == VIDEO_TYPE_VGAC + || vga_video_type == VIDEO_TYPE_EGAC + || vga_video_type == VIDEO_TYPE_EGAM) { + video_font_height = ORIG_VIDEO_POINTS; + } else { + video_font_height = 16; + } + + /* This may be suboptimal but is a safe bet - go with it */ + video_scan_lines = video_font_height * vga_video_num_lines; + + fb_fix.smem_start = (char *) vga_video_mem_base; + fb_fix.smem_len = vga_video_mem_term - vga_video_mem_base; + fb_fix.type = FB_TYPE_VGA_TEXT; + fb_fix.type_aux = 0; + fb_fix.visual = FB_VISUAL_PSEUDOCOLOR; + fb_fix.xpanstep = 0; + fb_fix.ypanstep = video_font_height; + fb_fix.ywrapstep = 0; + fb_fix.line_length = 2*vga_video_num_columns; + fb_fix.mmio_start = NULL; + fb_fix.mmio_len = 0; + fb_fix.accel = FB_ACCEL_NONE; + + fb_var.xres = vga_video_num_columns*8; + fb_var.yres = vga_video_num_lines*video_font_height; + fb_var.xres_virtual = fb_var.xres; + /* the cursor is put at the end of the video memory, hence the -2 */ + fb_var.yres_virtual = ((fb_fix.smem_len-2)/fb_fix.line_length)* + video_font_height; + + fb_var.xoffset = fb_var.yoffset = 0; + fb_var.bits_per_pixel = vga_can_do_color ? 4 : 1; + fb_var.grayscale = !vga_can_do_color; + fb_var.red.offset = 0; + fb_var.red.length = 6; + fb_var.red.msb_right = 0; + fb_var.green.offset = 0; + fb_var.green.length = 6; + fb_var.green.msb_right = 0; + fb_var.blue.offset = 0; + fb_var.blue.length = 6; + fb_var.blue.msb_right = 0; + fb_var.transp.offset = 0; + fb_var.transp.length = 0; + fb_var.transp.msb_right = 0; + fb_var.nonstd = 0; + fb_var.activate = 0; + fb_var.height = fb_var.width = -1; + fb_var.accel_flags = FB_ACCELF_TEXT; + fb_var.pixclock = 39722; /* 25.175 MHz */ + fb_var.left_margin = 40; + fb_var.right_margin = 24; + fb_var.upper_margin = 39; + fb_var.lower_margin = 9; + fb_var.hsync_len = 96; + fb_var.vsync_len = 2; + fb_var.sync = 0; + fb_var.vmode = FB_VMODE_NONINTERLACED; + + disp.var = fb_var; + disp.cmap.start = 0; + disp.cmap.len = 0; + disp.cmap.red = NULL; + disp.cmap.green = NULL; + disp.cmap.blue = NULL; + disp.cmap.transp = NULL; + +#ifdef __i386__ + disp.screen_base = ioremap((unsigned long) fb_fix.smem_start, + fb_fix.smem_len); +#else + disp.screen_base = bus_to_virt((unsigned long) fb_fix.smem_start); +#endif + disp.visual = fb_fix.visual; + disp.type = fb_fix.type; + disp.type_aux = fb_fix.type_aux; + disp.ypanstep = fb_fix.ypanstep; + disp.ywrapstep = fb_fix.ywrapstep; + disp.line_length = fb_fix.line_length; + disp.can_soft_blank = vga_can_do_color; + disp.inverse = 0; + disp.dispsw = &fbcon_vgafb; + + strcpy(fb_info.modename, fb_fix.id); + fb_info.node = -1; + fb_info.fbops = &vgafb_ops; + fb_info.disp = &disp; + fb_info.fontname[0] = '\0'; + fb_info.changevar = NULL; + fb_info.switch_con = &vgafbcon_switch; + fb_info.updatevar = &vgafbcon_updatevar; + fb_info.blank = &vgafbcon_blank; + + err = register_framebuffer(&fb_info); + if (err < 0) + return mem_start; + + vgafb_set_var(&fb_var, -1, &fb_info); + + printk("fb%d: VGA frame buffer device, using %dK of video memory\n", + GET_FB_IDX(fb_info.node), fb_fix.smem_len>>10); + + return mem_start; +} + +__initfunc(void vgafb_setup(char *options, int *ints)) +{ + /* nothing yet */ +} + + /* + * Update the `var' structure (called by fbcon.c) + */ + +static int vgafbcon_updatevar(int con, struct fb_info *info) +{ + if (con == currcon) { + struct fb_var_screeninfo *var = &fb_display[currcon].var; + + /* hardware scrolling */ + + vga_set_origin(var->yoffset / video_font_height * + fb_fix.line_length / 2); + + vga_set_split(var->yres - ((var->vmode & FB_VMODE_YWRAP) ? + var->yoffset+1 : 0)); + } + + return 0; +} + +static int vgafbcon_switch(int con, struct fb_info *info) +{ + /* 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, + vgafb_getcolreg, info); + + currcon = con; + /* Install new colormap */ + do_install_cmap(con, info); + vgafbcon_updatevar(con, info); + return 0; +} + + /* + * Blank the display. + */ + +static void vgafbcon_blank(int blank, struct fb_info *info) +{ + int i; + + outb_p(0, dac_reg); + if (blank) + for (i = 0; i < 16; i++) { + outb_p(0, dac_val); + outb_p(0, dac_val); + outb_p(0, dac_val); + } + else + for (i = 0; i < 16; i++) { + outb_p(palette[i].blue, dac_val); + outb_p(palette[i].green, dac_val); + outb_p(palette[i].blue, dac_val); + } +} + + + /* + * Read a single color register and split it into + * colors/transparent. Return != 0 for invalid regno. + */ + +static int vgafb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, + u_int *transp, struct fb_info *info) +{ + if (regno > 15) + return 1; + *red = palette[regno].red; + *green = palette[regno].green; + *blue = palette[regno].blue; + return 0; +} + + + /* + * Set a single color register. The values supplied are already + * rounded down to the hardware's capabilities (according to the + * entries in the var structure). Return != 0 for invalid regno. + */ + +static int vgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, + u_int transp, struct fb_info *info) +{ + if (regno > 15) + return 1; + palette[regno].red = red; + palette[regno].green = green; + palette[regno].blue = blue; + + outb_p(regno, dac_reg); + outb_p(red, dac_val); + outb_p(green, dac_val); + outb_p(blue, dac_val); + + return 0; +} + +static void do_install_cmap(int con, struct fb_info *info) +{ + if (con != currcon) + return; + if (fb_display[con].cmap.len) + fb_set_cmap(&fb_display[con].cmap, &fb_display[con].var, 1, + vgafb_setcolreg, info); + else + fb_set_cmap(fb_default_cmap(1<id, virgefb_name); - fix->smem_start = (caddr_t)CyberMem; + fix->smem_start = (char *)CyberMem; fix->smem_len = CyberSize; - fix->mmio_start = (unsigned char *)CyberRegs; + fix->mmio_start = (char *)CyberRegs; fix->mmio_len = 0x10000; /* TODO: verify this for the CV64/3D */ fix->type = FB_TYPE_PACKED_PIXELS; @@ -389,10 +389,7 @@ fix->ypanstep = 0; fix->ywrapstep = 0; fix->line_length = 0; - - for (i = 0; i < arraysize(fix->reserved); i++) - fix->reserved[i] = 0; - + fix->accel = FB_ACCEL_S3_VIRGE; return(0); } @@ -409,6 +406,10 @@ par->xres = var->xres; par->yres = var->yres; par->bpp = var->bits_per_pixel; + if (var->accel_flags & FB_ACCELF_TEXT) + par->accel = FB_ACCELF_TEXT; + else + par->accel = 0; #else if (Cyberfb_Cyber8) { par->xres = VIRGE8_WIDTH; @@ -432,8 +433,7 @@ static int Cyber_encode_var(struct fb_var_screeninfo *var, struct virgefb_par *par) { - int i; - + memset(var, 0, sizeof(struct fb_var_screeninfo)); var->xres = par->xres; var->yres = par->yres; var->xres_virtual = par->xres; @@ -470,7 +470,7 @@ var->height = -1; var->width = -1; - var->accel = FB_ACCEL_S3VIRGE; + var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0; DPRINTK("accel CV64/3D\n"); var->vmode = FB_VMODE_NONINTERLACED; @@ -489,9 +489,6 @@ var->hsync_len = 112; var->vsync_len = 2; - for (i = 0; i < arraysize(var->reserved); i++) - var->reserved[i] = 0; - return(0); } @@ -841,7 +838,7 @@ virgefb_get_fix(&fix, con, info); if (con == -1) con = 0; - display->screen_base = (u_char *)fix.smem_start; + display->screen_base = fix.smem_start; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; @@ -852,7 +849,11 @@ switch (display->var.bits_per_pixel) { #ifdef CONFIG_FBCON_CFB8 case 8: - display->dispsw = &fbcon_virge8; + if (display->var.accel_flags & FB_ACCELF_TEXT) { + display->dispsw = &fbcon_virge8; +#warning FIXME: We should reinit the graphics engine here + } else + display->dispsw = &fbcon_virge8; break; #endif #ifdef CONFIG_FBCON_CFB16 @@ -874,7 +875,7 @@ static int virgefb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { - int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp; + int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel; if ((err = do_fb_set_var(var, con == currcon))) return(err); @@ -884,11 +885,13 @@ oldvxres = fb_display[con].var.xres_virtual; oldvyres = fb_display[con].var.yres_virtual; oldbpp = fb_display[con].var.bits_per_pixel; + oldaccel = fb_display[con].var.accel_flags; fb_display[con].var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || - oldbpp != var->bits_per_pixel) { + oldbpp != var->bits_per_pixel || + oldaccel != var->accel_flags) { virgefb_set_disp(con, info); (*fb_info.changevar)(con); fb_alloc_cmap(&fb_display[con].cmap, 0, 0); @@ -969,7 +972,7 @@ static struct fb_ops virgefb_ops = { virgefb_open, virgefb_release, virgefb_get_fix, virgefb_get_var, virgefb_set_var, virgefb_get_cmap, virgefb_set_cmap, - virgefb_pan_display, NULL, virgefb_ioctl + virgefb_pan_display, virgefb_ioctl }; @@ -1030,7 +1033,7 @@ CyberMem = ZTWO_VADDR(board_addr); printk("CV3D detected running in Z2 mode ... not yet supported!\n"); - return -ENODEV; + return mem_start; } else { @@ -1169,7 +1172,7 @@ static struct display_switch fbcon_virge8 = { fbcon_cfb8_setup, fbcon_virge8_bmove, fbcon_virge8_clear, fbcon_cfb8_putc, - fbcon_cfb8_putcs, fbcon_cfb8_revc + fbcon_cfb8_putcs, fbcon_cfb8_revc, NULL }; #endif diff -u --recursive --new-file v2.1.106/linux/fs/Config.in linux/fs/Config.in --- v2.1.106/linux/fs/Config.in Mon Apr 6 17:41:00 1998 +++ linux/fs/Config.in Wed Jun 24 14:30:09 1998 @@ -9,15 +9,15 @@ tristate 'Minix fs support' CONFIG_MINIX_FS tristate 'Second extended fs support' CONFIG_EXT2_FS -tristate 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS +tristate 'ISO 9660 CDROM filesystem support' CONFIG_ISO9660_FS if [ "$CONFIG_ISO9660_FS" != "n" ]; then - bool 'Microsoft Joliet cdrom extensions' CONFIG_JOLIET + bool 'Microsoft Joliet CDROM extensions' CONFIG_JOLIET fi # msdos filesystems tristate 'DOS FAT fs support' CONFIG_FAT_FS dep_tristate 'MSDOS fs support' CONFIG_MSDOS_FS $CONFIG_FAT_FS -dep_tristate 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS +dep_tristate 'UMSDOS: Unix-like filesystem on top of standard MSDOS filesystem' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS dep_tristate 'VFAT (Windows-95) fs support' CONFIG_VFAT_FS $CONFIG_FAT_FS bool '/proc filesystem support' CONFIG_PROC_FS @@ -40,7 +40,7 @@ fi fi tristate 'Coda filesystem support (advanced network fs)' CONFIG_CODA_FS - tristate 'SMB filesystem support (to mount WfW shares etc..)' CONFIG_SMB_FS + tristate 'SMB filesystem support (to mount WfW shares etc.)' CONFIG_SMB_FS if [ "$CONFIG_SMB_FS" != "n" ]; then bool 'SMB Win95 bug work-around' CONFIG_SMB_WIN95 fi @@ -53,7 +53,7 @@ fi tristate 'OS/2 HPFS filesystem support (read only)' CONFIG_HPFS_FS -tristate 'NTFS filesystem support (read only)' CONFIG_NTFS_FS +tristate 'NTFS filesystem support (read only)' CONFIG_NTFS_FS if [ "$CONFIG_NTFS_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then bool ' NTFS read-write support (experimental)' CONFIG_NTFS_RW fi @@ -78,4 +78,3 @@ fi bool 'Macintosh partition map support' CONFIG_MAC_PARTITION endmenu - diff -u --recursive --new-file v2.1.106/linux/fs/Makefile linux/fs/Makefile --- v2.1.106/linux/fs/Makefile Fri May 8 23:14:50 1998 +++ linux/fs/Makefile Wed Jun 24 14:30:09 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux filesystem. +# Makefile for the Linux filesystems. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. L_TARGET := filesystems.a L_OBJS = $(join $(SUB_DIRS),$(SUB_DIRS:%=/%.o)) diff -u --recursive --new-file v2.1.106/linux/fs/adfs/Makefile linux/fs/adfs/Makefile --- v2.1.106/linux/fs/adfs/Makefile Tue Jan 20 16:44:58 1998 +++ linux/fs/adfs/Makefile Wed Jun 24 14:30:09 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux adfs-filesystem routines. +# Makefile for the linux adfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := adfs.o O_OBJS := dir.o file.o inode.o map.o namei.o super.o diff -u --recursive --new-file v2.1.106/linux/fs/adfs/file.c linux/fs/adfs/file.c --- v2.1.106/linux/fs/adfs/file.c Tue Jan 20 16:44:58 1998 +++ linux/fs/adfs/file.c Wed Jun 24 14:30:09 1998 @@ -28,7 +28,7 @@ #include /* - * We have mostly NULL's here: the current defaults are ok for + * We have mostly NULLs here: the current defaults are OK for * the adfs filesystem. */ static struct file_operations adfs_file_operations = { diff -u --recursive --new-file v2.1.106/linux/fs/affs/Changes linux/fs/affs/Changes --- v2.1.106/linux/fs/affs/Changes Sun Jun 7 11:16:35 1998 +++ linux/fs/affs/Changes Wed Jun 24 14:30:09 1998 @@ -37,7 +37,7 @@ - truncate() zeroes the unused remainder of a partially used last block when a file is truncated. It also marks the inode dirty now (which is not - really neccessary as notify_change() will do + really necessary as notify_change() will do it anyway). - Added a few comments, fixed some typos (and @@ -54,7 +54,7 @@ patches he did. They're marked (BH). Thanks, Bill! - Cleanup of error handling in read_super(). - Didn't release all ressources in case of an + Didn't release all resources in case of an error. (BH) - put_inode() releases the ext cache only if it's @@ -72,7 +72,7 @@ - getblock() did not invalidate the key cache when it allocated a new block. -- Removed some unneccessary locks as Bill +- Removed some unnecessary locks as Bill suggested. - Simplified match_name(), changed all hashing @@ -129,7 +129,7 @@ directory changes). - Handling of hard links rewritten. To the VFS - they appear now as normal unix links. They are + they appear now as normal Unix links. They are now resolved only once in lookup(). The backside is that unlink(), rename() and rmdir() have to be smart about them, but the result is worth the @@ -165,7 +165,7 @@ - Argument to volume option could overflow the name buffer. It is now silently truncated to - 30 characters. (Damnit! This kind of bug + 30 characters. (Damn it! This kind of bug is too embarrassing.) - Split inode.c into 2 files, the superblock diff -u --recursive --new-file v2.1.106/linux/fs/affs/Makefile linux/fs/affs/Makefile --- v2.1.106/linux/fs/affs/Makefile Tue Dec 2 22:25:07 1997 +++ linux/fs/affs/Makefile Wed Jun 24 14:30:09 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux affs-filesystem routines. +# Makefile for the Linux affs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := affs.o O_OBJS := super.o namei.o inode.o file.o dir.o amigaffs.o bitmap.o symlink.o diff -u --recursive --new-file v2.1.106/linux/fs/affs/amigaffs.c linux/fs/affs/amigaffs.c --- v2.1.106/linux/fs/affs/amigaffs.c Fri May 8 23:14:50 1998 +++ linux/fs/affs/amigaffs.c Wed Jun 24 14:30:09 1998 @@ -213,7 +213,7 @@ /* Mark directory as changed. We do this before anything else, * as it must be done anyway and doesn't hurt even if an - * error occures later. + * error occurs later. */ dir = iget(inode->i_sb,be32_to_cpu(FILE_END(bh->b_data,inode)->parent)); if (!dir) diff -u --recursive --new-file v2.1.106/linux/fs/affs/dir.c linux/fs/affs/dir.c --- v2.1.106/linux/fs/affs/dir.c Tue Dec 2 22:25:07 1997 +++ linux/fs/affs/dir.c Wed Jun 24 14:30:09 1998 @@ -5,7 +5,7 @@ * * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem * diff -u --recursive --new-file v2.1.106/linux/fs/affs/file.c linux/fs/affs/file.c --- v2.1.106/linux/fs/affs/file.c Fri May 8 23:14:50 1998 +++ linux/fs/affs/file.c Wed Jun 24 14:30:09 1998 @@ -5,7 +5,7 @@ * * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem * @@ -134,7 +134,7 @@ /* The keys of the extension blocks are stored in a 512-entry * deep cache. In order to save memory, not every key of later * extension blocks is stored - the larger the file gets, the - * bigger the holes inbetween. + * bigger the holes in between. */ static int @@ -349,8 +349,8 @@ /* With the affs, getting a random block from a file is not * a simple business. Since this fs does not allow holes, - * it may be neccessary to allocate all the missing blocks - * inbetween, as well as some new extension blocks. The OFS + * it may be necessary to allocate all the missing blocks + * in between, as well as some new extension blocks. The OFS * is even worse: All data blocks contain pointers to the * next ones, so you have to fix [n-1] after allocating [n]. * What a mess. diff -u --recursive --new-file v2.1.106/linux/fs/affs/super.c linux/fs/affs/super.c --- v2.1.106/linux/fs/affs/super.c Fri May 8 23:14:50 1998 +++ linux/fs/affs/super.c Wed Jun 24 14:30:09 1998 @@ -5,7 +5,7 @@ * * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem */ diff -u --recursive --new-file v2.1.106/linux/fs/binfmt_elf.c linux/fs/binfmt_elf.c --- v2.1.106/linux/fs/binfmt_elf.c Sun Jun 7 11:16:35 1998 +++ linux/fs/binfmt_elf.c Wed Jun 24 14:30:09 1998 @@ -324,8 +324,8 @@ /* * Now fill out the bss section. First pad the last page up * to the page boundary, and then perform a mmap to make sure - * that there are zeromapped pages up to and including the last - * bss page. + * that there are zero-mapped pages up to and including the + * last bss page. */ padzero(elf_bss); elf_bss = ELF_PAGESTART(elf_bss + ELF_EXEC_PAGESIZE - 1); /* What we have mapped so far */ @@ -1222,7 +1222,7 @@ notes[2].datasz = sizeof(*current); notes[2].data = current; - /* Try to dump the fpu. */ + /* Try to dump the FPU. */ prstatus.pr_fpvalid = dump_fpu (regs, &fpu); if (!prstatus.pr_fpvalid) { diff -u --recursive --new-file v2.1.106/linux/fs/buffer.c linux/fs/buffer.c --- v2.1.106/linux/fs/buffer.c Sun Jun 7 11:16:35 1998 +++ linux/fs/buffer.c Wed Jun 24 14:30:09 1998 @@ -1053,10 +1053,13 @@ wait_on_buffer(buf); mark_buffer_clean(buf); clear_bit(BH_Protected, &buf->b_state); - buf->b_count--; remove_from_hash_queue(buf); buf->b_dev = NODEV; refile_buffer(buf); + if (!--buf->b_count) + return; + printk("VFS: forgot an in-use buffer! (count=%d)\n", + buf->b_count); } /* @@ -1065,19 +1068,19 @@ */ struct buffer_head * bread(kdev_t dev, int block, int size) { - struct buffer_head * bh; + struct buffer_head * bh = getblk(dev, block, size); - if (!(bh = getblk(dev, block, size))) { - printk("VFS: bread: impossible error\n"); + if (bh) { + if (buffer_uptodate(bh)) + return bh; + ll_rw_block(READ, 1, &bh); + wait_on_buffer(bh); + if (buffer_uptodate(bh)) + return bh; + brelse(bh); return NULL; } - if (buffer_uptodate(bh)) - return bh; - ll_rw_block(READ, 1, &bh); - wait_on_buffer(bh); - if (buffer_uptodate(bh)) - return bh; - brelse(bh); + printk("VFS: bread: impossible error\n"); return NULL; } @@ -1308,7 +1311,7 @@ if (!async) return NULL; - /* Uhhuh. We're _really_ low on memory. Now we just + /* We're _really_ low on memory. Now we just * wait for old buffer heads to become free due to * finishing IO. Since this is an async request and * the reserve list is empty, we're sure there are diff -u --recursive --new-file v2.1.106/linux/fs/coda/Makefile linux/fs/coda/Makefile --- v2.1.106/linux/fs/coda/Makefile Thu May 7 22:51:52 1998 +++ linux/fs/coda/Makefile Wed Jun 24 14:30:09 1998 @@ -1,5 +1,5 @@ # -# Makefile for the linux Coda-filesystem routines. +# Makefile for the Linux Coda filesystem routines. # O_TARGET := coda.o @@ -7,7 +7,7 @@ symlink.o pioctl.o sysctl.o stats.o M_OBJS := $(O_TARGET) -# If you want debugging output, please uncomment the following line +# If you want debugging output, please uncomment the following line. # EXTRA_CFLAGS += -DDEBUG -DDEBUG_SMB_MALLOC=1 diff -u --recursive --new-file v2.1.106/linux/fs/coda/dir.c linux/fs/coda/dir.c --- v2.1.106/linux/fs/coda/dir.c Sun Jun 7 11:16:36 1998 +++ linux/fs/coda/dir.c Wed Jun 24 14:30:09 1998 @@ -100,7 +100,7 @@ /* inode operations for directories */ -/* acces routines: lookup, readlink, permission */ +/* access routines: lookup, readlink, permission */ static int coda_lookup(struct inode *dir, struct dentry *entry) { struct coda_inode_info *dircnp; diff -u --recursive --new-file v2.1.106/linux/fs/coda/psdev.c linux/fs/coda/psdev.c --- v2.1.106/linux/fs/coda/psdev.c Sun Jun 7 11:16:36 1998 +++ linux/fs/coda/psdev.c Wed Jun 17 05:10:33 1998 @@ -401,15 +401,7 @@ #ifdef CONFIG_PROC_FS -struct proc_dir_entry proc_sys_root = { - PROC_SYS, 3, "sys", /* inode, name */ - S_IFDIR | S_IRUGO | S_IXUGO, 2, 0, 0, /* mode, nlink, uid, gid */ - 0, &proc_dir_inode_operations, /* size, ops */ - NULL, NULL, /* get_info, fill_inode */ - NULL, /* next */ - NULL, NULL /* parent, subdir */ -}; - +extern struct proc_dir_entry proc_sys_root; struct proc_dir_entry proc_sys_coda = { 0, 4, "coda", diff -u --recursive --new-file v2.1.106/linux/fs/devpts/Makefile linux/fs/devpts/Makefile --- v2.1.106/linux/fs/devpts/Makefile Mon Apr 6 17:41:00 1998 +++ linux/fs/devpts/Makefile Wed Jun 24 14:30:09 1998 @@ -1,5 +1,5 @@ # -# Makefile for the linux /dev/pts virtual filesystem. +# Makefile for the Linux /dev/pts virtual filesystem. # O_TARGET := devpts.o diff -u --recursive --new-file v2.1.106/linux/fs/dquot.c linux/fs/dquot.c --- v2.1.106/linux/fs/dquot.c Sun Jun 7 11:16:36 1998 +++ linux/fs/dquot.c Wed Jun 24 14:30:09 1998 @@ -1,9 +1,9 @@ /* * Implementation of the diskquota system for the LINUX operating - * system. QUOTA is implemented using the BSD systemcall interface as + * system. QUOTA is implemented using the BSD system call interface as * the means of communication with the user level. Currently only the - * ext2-filesystem has support for diskquotas. Other filesystems may - * be added in future time. This file contains the generic routines + * ext2 filesystem has support for disk quotas. Other filesystems may + * be added in the future. This file contains the generic routines * called by the different filesystems on allocation of an inode or * block. These routines take care of the administration needed to * have a consistent diskquota tracking system. The ideas of both @@ -713,7 +713,7 @@ /* * Initialize a dquot-struct with new quota info. This is used by the - * systemcall interface functions. + * system call interface functions. */ static int set_dqblk(kdev_t dev, int id, short type, int flags, struct dqblk *dqblk) { @@ -970,7 +970,7 @@ short cnt, disc; /* - * Find out if this filesystems uses i_blocks. + * Find out if this filesystem uses i_blocks. */ if (inode->i_blksize == 0) blocks = isize_to_blocks(inode->i_size, BLOCK_SIZE); @@ -1214,10 +1214,10 @@ } /* - * Ok this is the systemcall interface, this communicates with - * the userlevel programs. Currently this only supports diskquota - * calls. Maybe we need to add the process quotas etc in the future. - * But we probably better use rlimits for that. + * This is the system call interface. This communicates with + * the user-level programs. Currently this only supports diskquota + * calls. Maybe we need to add the process quotas etc. in the future, + * but we probably should use rlimits for that. */ asmlinkage int sys_quotactl(int cmd, const char *special, int id, caddr_t addr) { diff -u --recursive --new-file v2.1.106/linux/fs/ext2/truncate.c linux/fs/ext2/truncate.c --- v2.1.106/linux/fs/ext2/truncate.c Thu Mar 26 15:57:04 1998 +++ linux/fs/ext2/truncate.c Tue Jun 23 09:23:49 1998 @@ -14,6 +14,8 @@ * * Big-endian to little-endian byte-swapping/bitmaps by * David S. Miller (davem@caip.rutgers.edu), 1995 + * + * General cleanup and race fixes, wsh, 1998 */ /* @@ -47,6 +49,22 @@ #endif /* + * Macros to return the block number for the inode size and offset. + * Currently we always hold the inode semaphore during truncate, so + * there's no need to test for changes during the operation. + */ +#define DIRECT_BLOCK(inode) \ + ((inode->i_size + inode->i_sb->s_blocksize - 1) / \ + inode->i_sb->s_blocksize) +#define INDIRECT_BLOCK(inode,offset) ((int)DIRECT_BLOCK(inode) - offset) +#define DINDIRECT_BLOCK(inode,offset) \ + (INDIRECT_BLOCK(inode,offset) / addr_per_block) +#define TINDIRECT_BLOCK(inode,offset) \ + (INDIRECT_BLOCK(inode,offset) / (addr_per_block*addr_per_block)) + +static u32 le32_zero = cpu_to_le32(0); + +/* * Truncate has the most races in the whole filesystem: coding it is * a pain in the a**. Especially as I don't do any locking... * @@ -57,53 +75,136 @@ * * The new code handles normal truncates (size = 0) as well as the more * general case (size = XXX). I hope. + * + * + * Truncate operations have been rewritten to avoid various races. The + * previous code was allowing blocking operations to precede a call to + * bforget(), possible allowing the buffer to be used again. + * + * We now ensure that b_count == 1 before calling bforget() and that the + * parent buffer (if any) is unlocked before clearing the block pointer. + * The operations are always performed in this order: + * (1) Make sure that the parent buffer is unlocked. + * (2) Use find_buffer() to find the block buffer without blocking, + * and set 'retry' if the buffer is locked or b_count > 1. + * (3) Clear the block pointer in the parent (buffer or inode). + * (4) Update the inode block count and mark the inode dirty. + * (5) Forget the block buffer, if any. This call won't block, as + * we know the buffer is unlocked from (2). + * (6) If the block pointer is in a (parent) buffer, mark the buffer + * dirty. (Note that this can block on a loop device.) + * (7) Accumulate the blocks to free and/or update the block bitmap. + * (This operation will frequently block.) + * + * The requirement that parent buffers be unlocked follows from the general + * principle of not modifying a buffer that may be undergoing I/O. With the + * the present kernels there's no problem with modifying a locked inode, as + * the I_DIRTY bit is cleared before setting I_LOCK. + * -- WSH, 1998 + */ + +/* + * Check whether any of the slots in an indirect block are + * still in use, and if not free the block. */ +static int check_block_empty(struct inode *inode, struct buffer_head *bh, + u32 *p, struct buffer_head *ind_bh) +{ + int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); + u32 * ind = (u32 *) bh->b_data; + int i, retry; + + /* Make sure both buffers are unlocked */ + do { + retry = 0; + if (buffer_locked(bh)) { + __wait_on_buffer(bh); + retry = 1; + } + if (ind_bh && buffer_locked(ind_bh)) { + __wait_on_buffer(ind_bh); + retry = 1; + } + } while (retry); + + for (i = 0; i < addr_per_block; i++) + if (le32_to_cpu(*(ind++))) + goto in_use; + + if (bh->b_count == 1) { + int tmp; + if (ind_bh) { + tmp = le32_to_cpu(*p); + *p = le32_zero; + } else { + tmp = *p; + *p = 0; + } + inode->i_blocks -= (inode->i_sb->s_blocksize / 512); + mark_inode_dirty(inode); + /* + * Forget the buffer, then mark the parent buffer dirty. + */ + bforget(bh); + if (ind_bh) + mark_buffer_dirty(ind_bh, 1); + ext2_free_blocks (inode, tmp, 1); + goto out; + } + retry = 1; + +in_use: + if (IS_SYNC(inode) && buffer_dirty(bh)) { + ll_rw_block (WRITE, 1, &bh); + wait_on_buffer (bh); + } + brelse (bh); + +out: + return retry; +} static int trunc_direct (struct inode * inode) { - u32 * p; - int i, tmp; struct buffer_head * bh; - unsigned long block_to_free = 0; - unsigned long free_count = 0; - int retry = 0; + int i, retry = 0; + unsigned long block_to_free = 0, free_count = 0; int blocks = inode->i_sb->s_blocksize / 512; -#define DIRECT_BLOCK ((inode->i_size + inode->i_sb->s_blocksize - 1) / \ - inode->i_sb->s_blocksize) - int direct_block = DIRECT_BLOCK; + int direct_block = DIRECT_BLOCK(inode); -repeat: for (i = direct_block ; i < EXT2_NDIR_BLOCKS ; i++) { - p = inode->u.ext2_i.i_data + i; - tmp = *p; + u32 * p = inode->u.ext2_i.i_data + i; + int tmp = *p; + if (!tmp) continue; - bh = get_hash_table (inode->i_dev, tmp, - inode->i_sb->s_blocksize); - if (i < direct_block) { - brelse (bh); - goto repeat; - } - if ((bh && bh->b_count != 1) || tmp != *p) { - retry = 1; - brelse (bh); - continue; + + bh = find_buffer(inode->i_dev, tmp, inode->i_sb->s_blocksize); + if (bh) { + bh->b_count++; + if(bh->b_count != 1 || buffer_locked(bh)) { + brelse(bh); + retry = 1; + continue; + } } + *p = 0; inode->i_blocks -= blocks; mark_inode_dirty(inode); bforget(bh); - if (free_count == 0) { - block_to_free = tmp; - free_count++; - } else if (free_count > 0 && block_to_free == tmp - free_count) + + /* accumulate blocks to free if they're contiguous */ + if (free_count == 0) + goto free_this; + else if (block_to_free == tmp - free_count) free_count++; else { ext2_free_blocks (inode, block_to_free, free_count); + free_this: block_to_free = tmp; free_count = 1; } -/* ext2_free_blocks (inode, tmp, 1); */ } if (free_count > 0) ext2_free_blocks (inode, block_to_free, free_count); @@ -111,174 +212,146 @@ } static int trunc_indirect (struct inode * inode, int offset, u32 * p, - int in_inode) + struct buffer_head *dind_bh) { - int i, tmp; - struct buffer_head * bh; struct buffer_head * ind_bh; - u32 * ind; - unsigned long block_to_free = 0; - unsigned long free_count = 0; - int retry = 0; - int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); - int blocks = inode->i_sb->s_blocksize / 512; -#define INDIRECT_BLOCK ((int)DIRECT_BLOCK - offset) - int indirect_block = INDIRECT_BLOCK; + int i, tmp, retry = 0; + unsigned long block_to_free = 0, free_count = 0; + int indirect_block, addr_per_block, blocks; - tmp = in_inode ? *p : le32_to_cpu(*p); + tmp = dind_bh ? le32_to_cpu(*p) : *p; if (!tmp) return 0; ind_bh = bread (inode->i_dev, tmp, inode->i_sb->s_blocksize); - if (tmp != (in_inode ? *p : le32_to_cpu(*p))) { + if (tmp != (dind_bh ? le32_to_cpu(*p) : *p)) { brelse (ind_bh); return 1; } + /* A read failure? Report error and clear slot (should be rare). */ if (!ind_bh) { - *p = in_inode ? 0 : cpu_to_le32(0); + ext2_error(inode->i_sb, "trunc_indirect", + "Read failure, inode=%ld, block=%d", + inode->i_ino, tmp); + if (dind_bh) { + *p = le32_zero; + mark_buffer_dirty(dind_bh, 1); + } else { + *p = 0; + mark_inode_dirty(inode); + } return 0; } -repeat: + + blocks = inode->i_sb->s_blocksize / 512; + addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); + indirect_block = INDIRECT_BLOCK(inode, offset); + if (indirect_block < 0) + indirect_block = 0; for (i = indirect_block ; i < addr_per_block ; i++) { - if (i < 0) - i = 0; - if (i < indirect_block) - goto repeat; - ind = i + (u32 *) ind_bh->b_data; + u32 * ind = i + (u32 *) ind_bh->b_data; + struct buffer_head * bh; + + wait_on_buffer(ind_bh); tmp = le32_to_cpu(*ind); if (!tmp) continue; - bh = get_hash_table (inode->i_dev, tmp, - inode->i_sb->s_blocksize); - if (i < indirect_block) { - brelse (bh); - goto repeat; + /* + * Use find_buffer so we don't block here. + */ + bh = find_buffer(inode->i_dev, tmp, inode->i_sb->s_blocksize); + if (bh) { + bh->b_count++; + if (bh->b_count != 1 || buffer_locked(bh)) { + brelse (bh); + retry = 1; + continue; + } } - if ((bh && bh->b_count != 1) || tmp != le32_to_cpu(*ind)) { - retry = 1; - brelse (bh); - continue; - } - *ind = cpu_to_le32(0); - mark_buffer_dirty(ind_bh, 1); + + *ind = le32_zero; + inode->i_blocks -= blocks; + mark_inode_dirty(inode); bforget(bh); - if (free_count == 0) { - block_to_free = tmp; - free_count++; - } else if (free_count > 0 && block_to_free == tmp - free_count) + mark_buffer_dirty(ind_bh, 1); + + /* accumulate blocks to free if they're contiguous */ + if (free_count == 0) + goto free_this; + else if (block_to_free == tmp - free_count) free_count++; else { ext2_free_blocks (inode, block_to_free, free_count); + free_this: block_to_free = tmp; free_count = 1; } -/* ext2_free_blocks (inode, tmp, 1); */ - inode->i_blocks -= blocks; - mark_inode_dirty(inode); } if (free_count > 0) ext2_free_blocks (inode, block_to_free, free_count); - ind = (u32 *) ind_bh->b_data; - for (i = 0; i < addr_per_block; i++) - if (le32_to_cpu(*(ind++))) - break; - if (i >= addr_per_block) { - if (ind_bh->b_count != 1) - retry = 1; - else { - tmp = in_inode ? *p : le32_to_cpu(*p); - *p = in_inode ? 0 : cpu_to_le32(0); - inode->i_blocks -= blocks; - mark_inode_dirty(inode); - ext2_free_blocks (inode, tmp, 1); - bforget(ind_bh); - ind_bh = NULL; - } - } - if (IS_SYNC(inode) && ind_bh && buffer_dirty(ind_bh)) { - ll_rw_block (WRITE, 1, &ind_bh); - wait_on_buffer (ind_bh); - } - brelse (ind_bh); + /* + * Check the block and dispose of the ind_bh buffer. + */ + retry |= check_block_empty(inode, ind_bh, p, dind_bh); + return retry; } -static int trunc_dindirect (struct inode * inode, int offset, - u32 * p, int in_inode) +static int trunc_dindirect (struct inode * inode, int offset, u32 * p, + struct buffer_head * tind_bh) { - int i, tmp; struct buffer_head * dind_bh; - u32 * dind; - int retry = 0; - int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); - int blocks = inode->i_sb->s_blocksize / 512; -#define DINDIRECT_BLOCK (((int)DIRECT_BLOCK - offset) / addr_per_block) - int dindirect_block = DINDIRECT_BLOCK; + int i, tmp, retry = 0; + int dindirect_block, addr_per_block; - tmp = in_inode ? *p : le32_to_cpu(*p); + tmp = tind_bh ? le32_to_cpu(*p) : *p; if (!tmp) return 0; dind_bh = bread (inode->i_dev, tmp, inode->i_sb->s_blocksize); - if (tmp != (in_inode ? *p : le32_to_cpu(*p))) { + if (tmp != (tind_bh ? le32_to_cpu(*p) : *p)) { brelse (dind_bh); return 1; } + /* A read failure? Report error and clear slot (should be rare). */ if (!dind_bh) { - *p = in_inode ? 0 : cpu_to_le32(0); - return 0; - } -repeat: - for (i = dindirect_block ; i < addr_per_block ; i++) { - if (i < 0) - i = 0; - if (i < dindirect_block) - goto repeat; - dind = i + (u32 *) dind_bh->b_data; - tmp = le32_to_cpu(*dind); - if (!tmp) - continue; - retry |= trunc_indirect(inode, offset + (i * addr_per_block), - dind, 0); - mark_buffer_dirty(dind_bh, 1); - } - dind = (u32 *) dind_bh->b_data; - for (i = 0; i < addr_per_block; i++) - if (le32_to_cpu(*(dind++))) - break; - if (i >= addr_per_block) { - if (dind_bh->b_count != 1) - retry = 1; - else { - tmp = in_inode ? *p : le32_to_cpu(*p); - *p = in_inode ? 0 : cpu_to_le32(0); - inode->i_blocks -= blocks; + ext2_error(inode->i_sb, "trunc_dindirect", + "Read failure, inode=%ld, block=%d", + inode->i_ino, tmp); + if (tind_bh) { + *p = le32_zero; + mark_buffer_dirty(tind_bh, 1); + } else { + *p = 0; mark_inode_dirty(inode); - ext2_free_blocks (inode, tmp, 1); - bforget(dind_bh); - dind_bh = 0; } + return 0; } - if (IS_SYNC(inode) && dind_bh && buffer_dirty(dind_bh)) { - ll_rw_block (WRITE, 1, &dind_bh); - wait_on_buffer (dind_bh); + + addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); + dindirect_block = DINDIRECT_BLOCK(inode, offset); + if (dindirect_block < 0) + dindirect_block = 0; + for (i = dindirect_block ; i < addr_per_block ; i++) { + u32 * dind = i + (u32 *) dind_bh->b_data; + + retry |= trunc_indirect(inode, + offset + (i * addr_per_block), + dind, dind_bh); } - brelse (dind_bh); + /* + * Check the block and dispose of the dind_bh buffer. + */ + retry |= check_block_empty(inode, dind_bh, p, tind_bh); + return retry; } static int trunc_tindirect (struct inode * inode) { - int i, tmp; + u32 * p = inode->u.ext2_i.i_data + EXT2_TIND_BLOCK; struct buffer_head * tind_bh; - u32 * tind, * p; - int retry = 0; - int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); - int blocks = inode->i_sb->s_blocksize / 512; -#define TINDIRECT_BLOCK (((int)DIRECT_BLOCK - (addr_per_block * addr_per_block + \ - addr_per_block + EXT2_NDIR_BLOCKS)) / \ - (addr_per_block * addr_per_block)) - int tindirect_block = TINDIRECT_BLOCK; + int i, tmp, retry = 0; + int tindirect_block, addr_per_block, offset; - p = inode->u.ext2_i.i_data + EXT2_TIND_BLOCK; if (!(tmp = *p)) return 0; tind_bh = bread (inode->i_dev, tmp, inode->i_sb->s_blocksize); @@ -286,53 +359,40 @@ brelse (tind_bh); return 1; } + /* A read failure? Report error and clear slot (should be rare). */ if (!tind_bh) { + ext2_error(inode->i_sb, "trunc_tindirect", + "Read failure, inode=%ld, block=%d", + inode->i_ino, tmp); *p = 0; + mark_inode_dirty(inode); return 0; } -repeat: + + addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); + offset = EXT2_NDIR_BLOCKS + addr_per_block + + (addr_per_block * addr_per_block); + tindirect_block = TINDIRECT_BLOCK(inode, offset); + if (tindirect_block < 0) + tindirect_block = 0; for (i = tindirect_block ; i < addr_per_block ; i++) { - if (i < 0) - i = 0; - if (i < tindirect_block) - goto repeat; - tind = i + (u32 *) tind_bh->b_data; - retry |= trunc_dindirect(inode, EXT2_NDIR_BLOCKS + - addr_per_block + (i + 1) * addr_per_block * addr_per_block, - tind, 0); - mark_buffer_dirty(tind_bh, 1); - } - tind = (u32 *) tind_bh->b_data; - for (i = 0; i < addr_per_block; i++) - if (le32_to_cpu(*(tind++))) - break; - if (i >= addr_per_block) { - if (tind_bh->b_count != 1) - retry = 1; - else { - tmp = *p; - *p = 0; - inode->i_blocks -= blocks; - mark_inode_dirty(inode); - ext2_free_blocks (inode, tmp, 1); - bforget(tind_bh); - tind_bh = 0; - } - } - if (IS_SYNC(inode) && tind_bh && buffer_dirty(tind_bh)) { - ll_rw_block (WRITE, 1, &tind_bh); - wait_on_buffer (tind_bh); + u32 * tind = i + (u32 *) tind_bh->b_data; + + retry |= trunc_dindirect(inode, + offset + (i * addr_per_block * addr_per_block), + tind, tind_bh); } - brelse (tind_bh); + /* + * Check the block and dispose of the tind_bh buffer. + */ + retry |= check_block_empty(inode, tind_bh, p, NULL); + return retry; } void ext2_truncate (struct inode * inode) { - int retry; - struct buffer_head * bh; - int err; - int offset; + int err, offset, retry; if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) @@ -342,11 +402,14 @@ ext2_discard_prealloc(inode); while (1) { retry = trunc_direct(inode); - retry |= trunc_indirect (inode, EXT2_IND_BLOCK, - (u32 *) &inode->u.ext2_i.i_data[EXT2_IND_BLOCK], 1); - retry |= trunc_dindirect (inode, EXT2_IND_BLOCK + - EXT2_ADDR_PER_BLOCK(inode->i_sb), - (u32 *) &inode->u.ext2_i.i_data[EXT2_DIND_BLOCK], 1); + retry |= trunc_indirect (inode, + EXT2_IND_BLOCK, + (u32 *) &inode->u.ext2_i.i_data[EXT2_IND_BLOCK], + NULL); + retry |= trunc_dindirect (inode, + EXT2_IND_BLOCK+EXT2_ADDR_PER_BLOCK(inode->i_sb), + (u32 *)&inode->u.ext2_i.i_data[EXT2_DIND_BLOCK], + NULL); retry |= trunc_tindirect (inode); if (!retry) break; @@ -357,12 +420,13 @@ } /* * If the file is not being truncated to a block boundary, the - * contents of the partial block following the end of the file must be - * zeroed in case it ever becomes accessible again because of - * subsequent file growth. + * contents of the partial block following the end of the file + * must be zeroed in case it ever becomes accessible again due + * to subsequent file growth. */ offset = inode->i_size & (inode->i_sb->s_blocksize - 1); if (offset) { + struct buffer_head * bh; bh = ext2_bread (inode, inode->i_size >> EXT2_BLOCK_SIZE_BITS(inode->i_sb), 0, &err); diff -u --recursive --new-file v2.1.106/linux/fs/fat/Makefile linux/fs/fat/Makefile --- v2.1.106/linux/fs/fat/Makefile Thu Jan 8 14:02:41 1998 +++ linux/fs/fat/Makefile Wed Jun 24 14:30:09 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux fat-filesystem support. +# Makefile for the Linux fat filesystem support. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := fat.o O_OBJS := buffer.o cache.o dir.o file.o inode.o misc.o mmap.o tables.o cvf.o diff -u --recursive --new-file v2.1.106/linux/fs/fat/buffer.c linux/fs/fat/buffer.c --- v2.1.106/linux/fs/fat/buffer.c Fri Jan 23 18:10:32 1998 +++ linux/fs/fat/buffer.c Wed Jun 24 14:30:09 1998 @@ -53,7 +53,7 @@ * larger hardware sector size. This allows for higher * capacity. - * Most of the time, the MsDOS file system that sit + * Most of the time, the MS-DOS filesystem that sits * on this device is totally unaligned. It use logically * 512 bytes sector size, with logical sector starting * in the middle of a hardware block. The bad news is diff -u --recursive --new-file v2.1.106/linux/fs/fat/dir.c linux/fs/fat/dir.c --- v2.1.106/linux/fs/fat/dir.c Fri Jan 23 18:10:32 1998 +++ linux/fs/fat/dir.c Wed Jun 24 14:30:09 1998 @@ -51,7 +51,7 @@ }; /* - * Convert Unicode 16 to UTF8, translated unicode, or ascii. + * Convert Unicode 16 to UTF8, translated Unicode, or ASCII. * If uni_xlate is enabled and we * can't get a 1:1 conversion, use a colon as an escape character since * it is normally invalid on the vfat filesystem. The following three diff -u --recursive --new-file v2.1.106/linux/fs/fat/file.c linux/fs/fat/file.c --- v2.1.106/linux/fs/fat/file.c Tue Mar 10 10:03:33 1998 +++ linux/fs/fat/file.c Wed Jun 24 14:30:09 1998 @@ -86,7 +86,7 @@ /* #Specification: msdos / special devices / swap file Swap file can't work on special devices with a large sector size (1024 bytes hard sector). Those devices have a weird - MsDOS filesystem layout. Generally a single hardware sector + MS-DOS filesystem layout. Generally a single hardware sector may contain 2 unrelated logical sector. This mean that there is no easy way to do a mapping between disk sector of a file and virtual memory. So swap file is difficult (not available right now) @@ -236,8 +236,8 @@ to_reada = count_max / SECTOR_SIZE; if (count_max & (SECTOR_SIZE-1)) to_reada++; if (filp->f_reada || !MSDOS_I(inode)->i_binary){ - /* Doing a read ahead on ascii file make sure we always */ - /* pre read enough, since we don't know how many blocks */ + /* Doing a read ahead on ASCII file make sure we always */ + /* read enough, since we don't know how many blocks */ /* we really need */ int ahead = read_ahead[MAJOR(inode->i_dev)]; PRINTK (("to_reada %d ahead %d\n",to_reada,ahead)); diff -u --recursive --new-file v2.1.106/linux/fs/filesystems.c linux/fs/filesystems.c --- v2.1.106/linux/fs/filesystems.c Tue Jun 23 10:01:24 1998 +++ linux/fs/filesystems.c Mon Jun 15 00:18:19 1998 @@ -144,10 +144,6 @@ init_adfs_fs(); #endif -#ifdef CONFIG_ADFS_FS - init_adfs_fs(); -#endif - #ifdef CONFIG_DEVPTS_FS init_devpts_fs(); #endif diff -u --recursive --new-file v2.1.106/linux/fs/hfs/ChangeLog linux/fs/hfs/ChangeLog --- v2.1.106/linux/fs/hfs/ChangeLog Sun Jun 7 11:16:36 1998 +++ linux/fs/hfs/ChangeLog Wed Jun 24 14:30:10 1998 @@ -376,7 +376,7 @@ dir.c, brec.c, btree.c, bitmap.c, bnode.c, bdelete.c, bins_del.c, binsert.c, Makefile, TODO, balloc.c: First shot at portability to the DEC Alpha and non-gcc compilers. - This invloved a significant overhaul of the type system. + This involved a significant overhaul of the type system. Tue Feb 4 04:26:54 1997 Paul H. Hargrove @@ -2346,7 +2346,7 @@ More code reorganization to abstract the btree operations. Added the fork= mount option. Added AppleDouble support. Executor, from ARDI, can now run programs - from HFS filesystems mounted w/ the HFS module. + from HFS filesystems mounted with the HFS module. Jan 28, 1995: version 0.3 hargrove@sccm.stanford.edu (Paul H. Hargrove) Major code reorganization. diff -u --recursive --new-file v2.1.106/linux/fs/hfs/FAQ.txt linux/fs/hfs/FAQ.txt --- v2.1.106/linux/fs/hfs/FAQ.txt Sun Jan 4 10:40:17 1998 +++ linux/fs/hfs/FAQ.txt Wed Jun 24 14:30:10 1998 @@ -42,7 +42,7 @@ 14. In what ways can I write to HFS filesystems? - 15. Does the HFS filesystem work with 400k or 800k Macintosh + 15. Does the HFS filesystem work with 400 kB or 800 kB Macintosh diskettes? 16. How can I format an HFS filesystem? diff -u --recursive --new-file v2.1.106/linux/fs/hfs/Makefile linux/fs/hfs/Makefile --- v2.1.106/linux/fs/hfs/Makefile Tue Mar 17 22:18:15 1998 +++ linux/fs/hfs/Makefile Wed Jun 24 14:30:10 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux hfs-filesystem routines. +# Makefile for the Linux hfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := hfs.o O_OBJS := balloc.o bdelete.o bfind.o bins_del.o binsert.o bitmap.o bitops.o \ diff -u --recursive --new-file v2.1.106/linux/fs/hpfs/Makefile linux/fs/hpfs/Makefile --- v2.1.106/linux/fs/hpfs/Makefile Tue Aug 15 05:07:02 1995 +++ linux/fs/hpfs/Makefile Wed Jun 24 14:30:10 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux HPFS filesystem routines. +# Makefile for the Linux HPFS filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := hpfs.o O_OBJS := hpfs_fs.o hpfs_caps.o diff -u --recursive --new-file v2.1.106/linux/fs/hpfs/hpfs.h linux/fs/hpfs/hpfs.h --- v2.1.106/linux/fs/hpfs/hpfs.h Wed Apr 5 02:59:50 1995 +++ linux/fs/hpfs/hpfs.h Wed Jun 24 14:30:10 1998 @@ -348,11 +348,11 @@ } u; }; -/* fnode: root of allocation b+ tree, and EA's */ +/* fnode: root of allocation b+ tree, and EAs */ /* Every file and every directory has one fnode, pointed to by the directory - entry and pointing to the file's sectors or directory's root dnode. EA's - are also stored here, and there are said to be ACL's somewhere here too. */ + entry and pointing to the file's sectors or directory's root dnode. EAs + are also stored here, and there are said to be ACLs somewhere here too. */ #define FNODE_MAGIC 0xf7e40aae @@ -392,12 +392,12 @@ } u; unsigned file_size; /* file length, bytes */ - unsigned n_needea; /* number of EA's with NEEDEA set */ + unsigned n_needea; /* number of EAs with NEEDEA set */ unsigned zero4[4]; unsigned ea_offs; /* offset from start of fnode to first fnode-resident ea */ unsigned zero5[2]; - unsigned char ea[316]; /* zero or more EA's, packed together + unsigned char ea[316]; /* zero or more EAs, packed together with no alignment padding. (Do not use this name, get here via fnode + ea_offs. I think.) */ @@ -454,7 +454,7 @@ unsigned char namelen; /* length of name, bytes */ unsigned short valuelen; /* length of value, bytes */ /* - unsigned char name[namelen]; ascii attrib name + unsigned char name[namelen]; ASCII attrib name unsigned char nul; terminating '\0', not counted unsigned char value[valuelen]; value, arbitrary if this.indirect, valuelen is 8 and the value is diff -u --recursive --new-file v2.1.106/linux/fs/inode.c linux/fs/inode.c --- v2.1.106/linux/fs/inode.c Fri May 8 23:14:53 1998 +++ linux/fs/inode.c Wed Jun 24 14:30:10 1998 @@ -596,9 +596,9 @@ } /* - * Uhhuh.. We need to expand. Note that "grow_inodes()" will - * release the spinlock, but will return with the lock held - * again if the allocation succeeded. + * We need to expand. Note that "grow_inodes()" will + * release the spinlock, but will return with the lock + * held again if the allocation succeeded. */ inode = grow_inodes(); if (inode) { diff -u --recursive --new-file v2.1.106/linux/fs/ioctl.c linux/fs/ioctl.c --- v2.1.106/linux/fs/ioctl.c Tue Mar 10 10:03:34 1998 +++ linux/fs/ioctl.c Wed Jun 24 14:30:10 1998 @@ -71,7 +71,7 @@ break; flag = O_NONBLOCK; #ifdef __sparc__ - /* SunOS compatability item. */ + /* SunOS compatibility item. */ if(O_NONBLOCK != O_NDELAY) flag |= O_NDELAY; #endif diff -u --recursive --new-file v2.1.106/linux/fs/isofs/Makefile linux/fs/isofs/Makefile --- v2.1.106/linux/fs/isofs/Makefile Thu Oct 23 14:00:15 1997 +++ linux/fs/isofs/Makefile Wed Jun 24 14:30:10 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux isofs-filesystem routines. +# Makefile for the Linux isofs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := isofs.o O_OBJS := namei.o inode.o file.o dir.o util.o rock.o symlink.o diff -u --recursive --new-file v2.1.106/linux/fs/isofs/dir.c linux/fs/isofs/dir.c --- v2.1.106/linux/fs/isofs/dir.c Tue Jun 23 10:01:25 1998 +++ linux/fs/isofs/dir.c Wed Jun 24 14:30:10 1998 @@ -1,7 +1,7 @@ /* * linux/fs/isofs/dir.c * - * (C) 1992, 1993, 1994 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992, 1993, 1994 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem * @@ -74,7 +74,7 @@ if (c >= 'A' && c <= 'Z') c |= 0x20; /* lower case */ - /* Drop trailing '.;1' (ISO9660:1988 7.5.1 requires period) */ + /* Drop trailing '.;1' (ISO 9660:1988 7.5.1 requires period) */ if (c == '.' && i == len - 3 && old[i + 1] == ';' && old[i + 2] == '1') break; diff -u --recursive --new-file v2.1.106/linux/fs/isofs/file.c linux/fs/isofs/file.c --- v2.1.106/linux/fs/isofs/file.c Tue Jul 8 19:36:45 1997 +++ linux/fs/isofs/file.c Wed Jun 24 14:30:10 1998 @@ -1,7 +1,7 @@ /* * linux/fs/isofs/file.c * - * (C) 1992, 1993, 1994 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992, 1993, 1994 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem * @@ -19,7 +19,7 @@ #include /* - * We have mostly NULL's here: the current defaults are ok for + * We have mostly NULLs here: the current defaults are OK for * the isofs filesystem. */ static struct file_operations isofs_file_operations = { diff -u --recursive --new-file v2.1.106/linux/fs/isofs/inode.c linux/fs/isofs/inode.c --- v2.1.106/linux/fs/isofs/inode.c Tue Jun 23 10:01:25 1998 +++ linux/fs/isofs/inode.c Wed Jun 24 14:30:10 1998 @@ -2,11 +2,11 @@ * linux/fs/isofs/inode.c * * (C) 1991 Linus Torvalds - minix filesystem - * 1992, 1993, 1994 Eric Youngdale Modified for ISO9660 filesystem. + * 1992, 1993, 1994 Eric Youngdale Modified for ISO 9660 filesystem. * 1994 Eberhard Moenkeberg - multi session handling. * 1995 Mark Dobie - allow mounting of some weird VideoCDs and PhotoCDs. * 1997 Gordon Chaffee - Joliet CDs - * 1998 Eric Lammerts - ISO9660 Level 3 + * 1998 Eric Lammerts - ISO 9660 Level 3 */ #include @@ -374,7 +374,7 @@ } else if (sec->escape[2] == 0x45) { joliet_level = 3; } - printk("ISO9660 Extensions: Microsoft Joliet Level %d\n", + printk("ISO 9660 Extensions: Microsoft Joliet Level %d\n", joliet_level); } goto root_found; @@ -993,7 +993,7 @@ enough error checking on the drive itself, but an open ended search makes me a little nervous. - The bsd iso filesystem uses the extent number for an inode, and this + The BSD iso filesystem uses the extent number for an inode, and this would work really nicely for us except that the read_inode function would not have any clean way of finding the actual directory record that goes with the file. If we had such info, then it would pay diff -u --recursive --new-file v2.1.106/linux/fs/isofs/joliet.c linux/fs/isofs/joliet.c --- v2.1.106/linux/fs/isofs/joliet.c Thu Oct 23 14:08:03 1997 +++ linux/fs/isofs/joliet.c Wed Jun 24 14:30:10 1998 @@ -12,7 +12,7 @@ #include /* - * Convert Unicode 16 to UTF8 or ascii. + * Convert Unicode 16 to UTF8 or ASCII. */ static int uni16_to_x8(unsigned char *ascii, unsigned char *uni, int len, diff -u --recursive --new-file v2.1.106/linux/fs/isofs/namei.c linux/fs/isofs/namei.c --- v2.1.106/linux/fs/isofs/namei.c Tue Jun 23 10:01:25 1998 +++ linux/fs/isofs/namei.c Wed Jun 24 14:30:10 1998 @@ -1,7 +1,7 @@ /* * linux/fs/isofs/namei.c * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * (C) 1991 Linus Torvalds - minix filesystem */ diff -u --recursive --new-file v2.1.106/linux/fs/isofs/rock.c linux/fs/isofs/rock.c --- v2.1.106/linux/fs/isofs/rock.c Thu Dec 18 16:37:02 1997 +++ linux/fs/isofs/rock.c Wed Jun 24 14:30:10 1998 @@ -266,7 +266,7 @@ break; case SIG('E','R'): inode->i_sb->u.isofs_sb.s_rock = 1; - printk(KERN_DEBUG"ISO9660 Extensions: "); + printk(KERN_DEBUG"ISO 9660 Extensions: "); { int p; for(p=0;pu.ER.len_id;p++) printk("%c",rr->u.ER.data[p]); }; diff -u --recursive --new-file v2.1.106/linux/fs/isofs/symlink.c linux/fs/isofs/symlink.c --- v2.1.106/linux/fs/isofs/symlink.c Sun Jan 4 00:53:41 1998 +++ linux/fs/isofs/symlink.c Wed Jun 24 14:30:10 1998 @@ -1,7 +1,7 @@ /* * linux/fs/isofs/symlink.c * - * (C) 1992 Eric Youngdale Modified for ISO9660 filesystem. + * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. * * Copyright (C) 1991, 1992 Linus Torvalds * diff -u --recursive --new-file v2.1.106/linux/fs/isofs/util.c linux/fs/isofs/util.c --- v2.1.106/linux/fs/isofs/util.c Thu Oct 23 14:00:15 1997 +++ linux/fs/isofs/util.c Wed Jun 24 14:30:10 1998 @@ -6,7 +6,7 @@ * convert numbers according to section 7.3.3, etc. * * isofs special functions. This file was lifted in its entirety from - * the 386bsd iso9660 filesystem, by Pace Willisson . + * the 386BSD iso9660 filesystem, by Pace Willisson . */ #include @@ -87,7 +87,7 @@ } /* - * We have to convert from a MM/DD/YY format to the unix ctime format. + * We have to convert from a MM/DD/YY format to the Unix ctime format. * We have to take into account leap years and all of that good stuff. * Unfortunately, the kernel does not have the information on hand to * take into account daylight savings time, but it shouldn't matter. diff -u --recursive --new-file v2.1.106/linux/fs/minix/Makefile linux/fs/minix/Makefile --- v2.1.106/linux/fs/minix/Makefile Tue Aug 15 05:07:02 1995 +++ linux/fs/minix/Makefile Wed Jun 24 14:30:10 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux minix-filesystem routines. +# Makefile for the Linux minix filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := minix.o O_OBJS := bitmap.o truncate.o namei.o inode.o file.o dir.o symlink.o fsync.o diff -u --recursive --new-file v2.1.106/linux/fs/minix/file.c linux/fs/minix/file.c --- v2.1.106/linux/fs/minix/file.c Tue Oct 21 08:57:29 1997 +++ linux/fs/minix/file.c Wed Jun 24 14:30:10 1998 @@ -30,7 +30,7 @@ static ssize_t minix_file_write(struct file *, const char *, size_t, loff_t *); /* - * We have mostly NULL's here: the current defaults are ok for + * We have mostly NULLs here: the current defaults are OK for * the minix filesystem. */ static struct file_operations minix_file_operations = { diff -u --recursive --new-file v2.1.106/linux/fs/minix/inode.c linux/fs/minix/inode.c --- v2.1.106/linux/fs/minix/inode.c Tue Jun 23 10:01:25 1998 +++ linux/fs/minix/inode.c Wed Jun 24 14:30:10 1998 @@ -122,7 +122,7 @@ /* * Check the root directory of the filesystem to make sure - * it really _is_ a minix filesystem, and to check the size + * it really _is_ a Minix filesystem, and to check the size * of the directory entry. */ static const char * minix_checkroot(struct super_block *s, struct inode *dir) @@ -311,7 +311,7 @@ out_no_fs: if (!silent) - printk("VFS: Can't find a minix or minix V2 filesystem on dev " + printk("VFS: Can't find a Minix or Minix V2 filesystem on device " "%s.\n", kdevname(dev)); out_release: brelse(bh); diff -u --recursive --new-file v2.1.106/linux/fs/minix/truncate.c linux/fs/minix/truncate.c --- v2.1.106/linux/fs/minix/truncate.c Thu Mar 26 15:57:05 1998 +++ linux/fs/minix/truncate.c Wed Jun 24 14:30:10 1998 @@ -21,7 +21,7 @@ /* * Truncate has the most races in the whole filesystem: coding it is - * a pain in the a**. Especially as I don't do any locking... + * a pain in the a**, especially as I don't do any locking. * * The code may look a bit weird, but that's just because I've tried to * handle things like file-size changes in a somewhat graceful manner. diff -u --recursive --new-file v2.1.106/linux/fs/msdos/Makefile linux/fs/msdos/Makefile --- v2.1.106/linux/fs/msdos/Makefile Tue Feb 6 23:39:28 1996 +++ linux/fs/msdos/Makefile Wed Jun 24 14:30:10 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux msdos-filesystem routines. +# Makefile for the Linux msdos filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here # unless it's something special (ie not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := msdos.o O_OBJS := namei.o diff -u --recursive --new-file v2.1.106/linux/fs/namei.c linux/fs/namei.c --- v2.1.106/linux/fs/namei.c Fri May 8 23:14:53 1998 +++ linux/fs/namei.c Wed Jun 24 14:30:10 1998 @@ -70,7 +70,7 @@ * and the name already exists in form of a symlink, try to create the new * name indicated by the symlink. The old code always complained that the * name already exists, due to not following the symlink even if its target - * is non-existant. The new semantics affects also mknod() and link() when + * is nonexistent. The new semantics affects also mknod() and link() when * the name is a symlink pointing to a non-existant name. * * I don't know which semantics is the right one, since I have no access diff -u --recursive --new-file v2.1.106/linux/fs/nfs/Makefile linux/fs/nfs/Makefile --- v2.1.106/linux/fs/nfs/Makefile Mon Apr 14 16:28:17 1997 +++ linux/fs/nfs/Makefile Wed Jun 24 14:30:10 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux nfs-filesystem routines. +# Makefile for the Linux nfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := nfs.o O_OBJS := inode.o file.o read.o write.o dir.o symlink.o proc.o \ diff -u --recursive --new-file v2.1.106/linux/fs/nfs/dir.c linux/fs/nfs/dir.c --- v2.1.106/linux/fs/nfs/dir.c Fri Jan 30 11:28:08 1998 +++ linux/fs/nfs/dir.c Wed Jun 24 14:30:10 1998 @@ -1106,7 +1106,7 @@ /* * Drop the dentry in advance to force a new lookup. - * Since nfs_proc_link doesn't return a filehandle, + * Since nfs_proc_link doesn't return a file handle, * we can't use the existing dentry. */ d_drop(dentry); diff -u --recursive --new-file v2.1.106/linux/fs/nfs/inode.c linux/fs/nfs/inode.c --- v2.1.106/linux/fs/nfs/inode.c Mon Apr 6 17:41:01 1998 +++ linux/fs/nfs/inode.c Wed Jun 24 14:30:10 1998 @@ -448,7 +448,7 @@ dentry->d_parent->d_name.name, dentry->d_name.name, fattr->fileid); - /* Install the filehandle in the dentry */ + /* Install the file handle in the dentry */ *((struct nfs_fh *) dentry->d_fsdata) = *fhandle; #ifdef CONFIG_NFS_SNAPSHOT diff -u --recursive --new-file v2.1.106/linux/fs/nfs/write.c linux/fs/nfs/write.c --- v2.1.106/linux/fs/nfs/write.c Tue Mar 10 10:03:34 1998 +++ linux/fs/nfs/write.c Wed Jun 24 14:30:10 1998 @@ -19,10 +19,10 @@ * from the writeback list to the writelock list. * * Note: we must make sure never to confuse the inode passed in the - * write_page request with the one in page->inode. As far as I understant + * write_page request with the one in page->inode. As far as I understand * it, these are different when doing a swap-out. * - * To understand everything that goes one here and in the nfs read code, + * To understand everything that goes on here and in the NFS read code, * one should be aware that a page is locked in exactly one of the following * cases: * diff -u --recursive --new-file v2.1.106/linux/fs/nfsd/Makefile linux/fs/nfsd/Makefile --- v2.1.106/linux/fs/nfsd/Makefile Mon Apr 7 11:35:31 1997 +++ linux/fs/nfsd/Makefile Wed Jun 24 14:30:10 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux nfs-filesystem routines. +# Makefile for the Linux nfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := nfsd.o O_OBJS := nfssvc.o nfsctl.o nfsproc.o nfsfh.o vfs.o \ diff -u --recursive --new-file v2.1.106/linux/fs/nfsd/nfsfh.c linux/fs/nfsd/nfsfh.c --- v2.1.106/linux/fs/nfsd/nfsfh.c Sun Jun 7 11:16:36 1998 +++ linux/fs/nfsd/nfsfh.c Wed Jun 24 14:30:10 1998 @@ -1,7 +1,7 @@ /* * linux/fs/nfsd/nfsfh.c * - * NFS server filehandle treatment. + * NFS server file handle treatment. * * Copyright (C) 1995, 1996 Olaf Kirch */ @@ -182,7 +182,7 @@ int len, result = 0; #ifdef NFSD_DEBUG_VERBOSE -printk("add_to_path_cache: cacheing %s/%s\n", +printk("add_to_path_cache: caching %s/%s\n", dentry->d_parent->d_name.name, dentry->d_name.name); #endif /* @@ -222,7 +222,7 @@ return result; /* - * If the dentry's path length changed, just try again ... + * If the dentry's path length changed, just try again. */ retry: kfree(new); @@ -374,7 +374,7 @@ /* * Look up a dentry given inode and parent inode numbers. * - * This relies on the ability of a unix-like filesystem to return + * This relies on the ability of a Unix-like filesystem to return * the parent inode of a directory as the ".." (second) entry. * * This could be further optimized if we had an efficient way of @@ -610,7 +610,7 @@ /* * Add a dentry to the file or dir cache. * - * Note: As NFS filehandles must have an inode, we don't accept + * Note: As NFS file handles must have an inode, we don't accept * negative dentries. */ static int add_to_fhcache(struct dentry *dentry, int cache) @@ -846,18 +846,18 @@ } /* - * The is the basic lookup mechanism for turning an NFS filehandle + * The is the basic lookup mechanism for turning an NFS file handle * into a dentry. There are several levels to the search: * (1) Look for the dentry pointer the short-term fhcache, * and verify that it has the correct inode number. * - * (2) Try to validate the dentry pointer in the filehandle, + * (2) Try to validate the dentry pointer in the file handle, * and verify that it has the correct inode number. If this * fails, check for a cached lookup in the fix-up list and * repeat step (2) using the new dentry pointer. * * (3) Look up the dentry by using the inode and parent inode numbers - * to build the name string. This should succeed for any unix-like + * to build the name string. This should succeed for any Unix-like * filesystem. * * (4) Search for the parent dentry in the dir cache, and then @@ -886,7 +886,7 @@ } /* - * Stage 2: Attempt to validate the dentry in the filehandle. + * Stage 2: Attempt to validate the dentry in the file handle. */ dentry = fh->fh_dcookie; recheck: @@ -896,7 +896,7 @@ if (dir->i_ino == fh->fh_dirino && dir->i_dev == fh->fh_dev) { struct inode * inode = dentry->d_inode; /* - * NFS filehandles must always have an 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) { @@ -929,7 +929,7 @@ /* * Stage 3: Look up the dentry based on the inode and parent inode - * numbers. This should work for all unix-like filesystems ... + * numbers. This should work for all Unix-like filesystems. */ looked_up = 1; dentry = lookup_inode(fh->fh_dev, fh->fh_dirino, fh->fh_ino); @@ -994,7 +994,7 @@ /* * Perform sanity checks on the dentry in a client's file handle. * - * Note that the filehandle dentry may need to be freed even after + * Note that the file handle dentry may need to be freed even after * an error return. */ u32 @@ -1033,17 +1033,17 @@ nfsd_setuser(rqstp, exp); /* - * Look up the dentry using the NFS fh. + * Look up the dentry using the NFS file handle. */ error = nfserr_stale; dentry = find_fh_dentry(fh); if (!dentry) goto out; /* - * Note: it's possible that the returned dentry won't be the - * one in the filehandle. We can correct the FH for our use, - * but unfortunately the client will keep sending the broken - * one. Hopefully the lookup will keep patching things up.. + * Note: it's possible the returned dentry won't be the one in the + * file handle. We can correct the file handle for our use, but + * unfortunately the client will keep sending the broken one. Let's + * hope the lookup will keep patching things up. */ fhp->fh_dentry = dentry; fhp->fh_export = exp; @@ -1081,7 +1081,7 @@ } /* - * Compose a filehandle for an NFS reply. + * Compose a file handle for an NFS reply. * * Note that when first composed, the dentry may not yet have * an inode. In this case a call to fh_update should be made @@ -1121,7 +1121,7 @@ } /* - * Update filehandle information after changing a dentry. + * Update file handle information after changing a dentry. */ void fh_update(struct svc_fh *fhp) @@ -1147,7 +1147,7 @@ } /* - * Release a filehandle. If the filehandle carries a dentry count, + * Release a file handle. If the file handle carries a dentry count, * we add the dentry to the short-term cache rather than release it. */ void diff -u --recursive --new-file v2.1.106/linux/fs/nfsd/nfsproc.c linux/fs/nfsd/nfsproc.c --- v2.1.106/linux/fs/nfsd/nfsproc.c Tue Jun 23 10:01:25 1998 +++ linux/fs/nfsd/nfsproc.c Wed Jun 24 14:30:10 1998 @@ -198,7 +198,7 @@ dprintk("nfsd: CREATE %d/%ld %s\n", SVCFH_DEV(dirfhp), SVCFH_INO(dirfhp), argp->name); - /* First verify the parent filehandle */ + /* First verify the parent file handle */ nfserr = fh_verify(rqstp, dirfhp, S_IFDIR, MAY_EXEC); if (nfserr) goto done; /* must fh_put dirfhp even on error */ @@ -212,20 +212,20 @@ goto done; /* - * Do a lookup to verify the new filehandle. + * Do a lookup to verify the new file handle. */ nfserr = nfsd_lookup(rqstp, dirfhp, argp->name, argp->len, newfhp); if (nfserr) { if (nfserr != nfserr_noent) goto done; /* - * If the new filehandle wasn't verified, we can't tell + * If the new file handle wasn't verified, we can't tell * whether the file exists or not. Time to bail ... */ nfserr = nfserr_acces; if (!newfhp->fh_dverified) { printk(KERN_WARNING - "nfsd_proc_create: filehandle not verified\n"); + "nfsd_proc_create: file handle not verified\n"); goto done; } } diff -u --recursive --new-file v2.1.106/linux/fs/nfsd/vfs.c linux/fs/nfsd/vfs.c --- v2.1.106/linux/fs/nfsd/vfs.c Tue Jun 23 10:01:25 1998 +++ linux/fs/nfsd/vfs.c Wed Jun 24 14:30:10 1998 @@ -121,7 +121,7 @@ } /* - * Check whether directory is a mount point, but it is alright if + * Check whether directory is a mount point, but it is all right if * this is precisely the local mount point being exported. */ static inline int @@ -178,7 +178,7 @@ } /* - * Note: we compose the filehandle now, but as the + * Note: we compose the file handle now, but as the * dentry may be negative, it may need to be updated. */ fh_compose(resfh, exp, dchild); @@ -611,7 +611,7 @@ if(!dirp->i_op || !dirp->i_op->lookup) goto out; /* - * Check whether the response filehandle has been verified yet. + * Check whether the response file handle has been verified yet. * If it has, the parent directory should already be locked. */ if (!resfhp->fh_dverified) { @@ -679,7 +679,7 @@ write_inode_now(dirp); /* - * Update the filehandle to get the new inode info. + * Update the file handle to get the new inode info. */ fh_update(resfhp); diff -u --recursive --new-file v2.1.106/linux/fs/ntfs/attr.c linux/fs/ntfs/attr.c --- v2.1.106/linux/fs/ntfs/attr.c Fri Dec 19 15:24:21 1997 +++ linux/fs/ntfs/attr.c Wed Jun 24 14:30:10 1998 @@ -399,7 +399,7 @@ clustersize=ino->vol->clustersize; /* starting cluster of potential chunk there are three situations: - a) in a large uncompressable or sparse chunk, + a) in a large uncompressible or sparse chunk, s_vcn is in the middle of a run b) s_vcn is right on a run border c) when several runs make a chunk, s_vcn is before the chunks diff -u --recursive --new-file v2.1.106/linux/fs/ntfs/dir.c linux/fs/ntfs/dir.c --- v2.1.106/linux/fs/ntfs/dir.c Fri Jan 2 01:42:58 1998 +++ linux/fs/ntfs/dir.c Wed Jun 24 14:30:10 1998 @@ -419,7 +419,7 @@ error=ntfs_getdir_record(walk,nextblock); if(!error && walk->type==DIR_INSERT && (walk->u.flags & ITERATE_SPLIT_DONE)){ - /* split has occured. adjust entry, insert new_entry */ + /* split has occurred. adjust entry, insert new_entry */ NTFS_PUTU32(entry+length-8,walk->newblock); /* reset flags, as the current block might be split again */ walk->u.flags &= ~ITERATE_SPLIT_DONE; diff -u --recursive --new-file v2.1.106/linux/fs/ntfs/inode.c linux/fs/ntfs/inode.c --- v2.1.106/linux/fs/ntfs/inode.c Wed May 20 19:10:40 1998 +++ linux/fs/ntfs/inode.c Wed Jun 24 14:30:10 1998 @@ -733,7 +733,7 @@ /* Try to layout ino into store. Return 0 on success, E2BIG if it does not fit, ENOMEM if memory allocation problem, - EOPNOTSUP if beyound our capabilities + EOPNOTSUP if beyond our capabilities */ int layout_inode(ntfs_inode *ino,ntfs_disk_inode *store) diff -u --recursive --new-file v2.1.106/linux/fs/ntfs/support.c linux/fs/ntfs/support.c --- v2.1.106/linux/fs/ntfs/support.c Mon Feb 23 18:12:10 1998 +++ linux/fs/ntfs/support.c Wed Jun 24 14:30:10 1998 @@ -96,7 +96,7 @@ return memmove(dest, src, n); } -/* Warn that an error occured */ +/* Warn that an error occurred. */ void ntfs_error(const char *fmt,...) { va_list ap; diff -u --recursive --new-file v2.1.106/linux/fs/pipe.c linux/fs/pipe.c --- v2.1.106/linux/fs/pipe.c Thu May 7 22:51:53 1998 +++ linux/fs/pipe.c Wed Jun 24 14:30:10 1998 @@ -188,8 +188,8 @@ #ifdef FIFO_SUNOS_BRAINDAMAGE /* - * Arggh. Why does SunOS have to have different select() behaviour - * for pipes and fifos? Hate-Hate-Hate. SunOS lacks POLLHUP.. + * Argh! Why does SunOS have to have different select() behaviour + * for pipes and FIFOs? Hate, hate, hate! SunOS lacks POLLHUP. */ static unsigned int fifo_poll(struct file * filp, poll_table * wait) { @@ -293,7 +293,7 @@ /* * The file_operations structs are not static because they - * are also used in linux/fs/fifo.c to do operations on fifo's. + * are also used in linux/fs/fifo.c to do operations on FIFOs. */ struct file_operations connecting_fifo_fops = { pipe_lseek, diff -u --recursive --new-file v2.1.106/linux/fs/proc/Makefile linux/fs/proc/Makefile --- v2.1.106/linux/fs/proc/Makefile Sat Aug 16 09:53:08 1997 +++ linux/fs/proc/Makefile Wed Jun 24 14:30:10 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux proc-filesystem routines. +# Makefile for the Linux proc filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := proc.o O_OBJS := inode.o root.o base.o generic.o mem.o link.o fd.o array.o \ diff -u --recursive --new-file v2.1.106/linux/fs/proc/array.c linux/fs/proc/array.c --- v2.1.106/linux/fs/proc/array.c Tue Jun 23 10:01:25 1998 +++ linux/fs/proc/array.c Wed Jun 24 14:30:10 1998 @@ -29,7 +29,7 @@ * Yves Arrouye : remove removal of trailing spaces in get_array. * - * Jerome Forissier : added per-cpu time information to /proc/stat + * Jerome Forissier : added per-CPU time information to /proc/stat * and /proc//cpu extension * * - Incorporation and non-SMP safe operation @@ -232,7 +232,7 @@ #ifdef __SMP__ len = sprintf(buffer, - "cpu %u %u %u %lu\n", + "CPU %u %u %u %lu\n", kstat.cpu_user, kstat.cpu_nice, kstat.cpu_system, @@ -842,7 +842,7 @@ tty_pgrp = -1; /* scale priority and nice values from timeslices to -20..20 */ - /* to make it look like a "normal" unix priority/nice value */ + /* to make it look like a "normal" Unix priority/nice value */ priority = tsk->counter; priority = 20 - (priority * 10 + DEF_PRIORITY / 2) / DEF_PRIORITY; nice = tsk->priority; diff -u --recursive --new-file v2.1.106/linux/fs/proc/base.c linux/fs/proc/base.c --- v2.1.106/linux/fs/proc/base.c Tue Mar 17 22:18:15 1998 +++ linux/fs/proc/base.c Mon Jun 15 12:56:36 1998 @@ -62,10 +62,14 @@ read_lock(&tasklist_lock); if (fill && (p = find_task_by_pid(pid)) != NULL) { + uid_t uid = 0; + gid_t gid = 0; if (p->dumpable || ino == PROC_PID_INO) { - inode->i_uid = p->euid; - inode->i_gid = p->gid; + uid = p->euid; + gid = p->egid; } + inode->i_uid = uid; + inode->i_gid = gid; } read_unlock(&tasklist_lock); } diff -u --recursive --new-file v2.1.106/linux/fs/proc/net.c linux/fs/proc/net.c --- v2.1.106/linux/fs/proc/net.c Sat Jul 5 20:53:22 1997 +++ linux/fs/proc/net.c Wed Jun 24 14:30:10 1998 @@ -20,7 +20,7 @@ * Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de) * /proc/net/snmp. * Alan Cox (gw4pts@gw4pts.ampr.org) 1/95 - * Added Appletalk slots + * Added AppleTalk slots * * proc net directory handling functions */ diff -u --recursive --new-file v2.1.106/linux/fs/proc/procfs_syms.c linux/fs/proc/procfs_syms.c --- v2.1.106/linux/fs/proc/procfs_syms.c Sun Jun 7 11:16:36 1998 +++ linux/fs/proc/procfs_syms.c Wed Jun 17 05:10:33 1998 @@ -11,7 +11,9 @@ extern int (* dispatch_scsi_info_ptr) (int ino, char *buffer, char **start, off_t offset, int length, int inout); extern struct inode_operations proc_scsi_inode_operations; +extern struct proc_dir_entry proc_sys_root; +EXPORT_SYMBOL(proc_sys_root); EXPORT_SYMBOL(proc_register); EXPORT_SYMBOL(proc_unregister); EXPORT_SYMBOL(create_proc_entry); diff -u --recursive --new-file v2.1.106/linux/fs/romfs/Makefile linux/fs/romfs/Makefile --- v2.1.106/linux/fs/romfs/Makefile Fri Jan 3 03:03:42 1997 +++ linux/fs/romfs/Makefile Wed Jun 24 14:30:10 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux romfs-filesystem routines. +# Makefile for the linux romfs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := romfs.o O_OBJS := inode.o diff -u --recursive --new-file v2.1.106/linux/fs/romfs/inode.c linux/fs/romfs/inode.c --- v2.1.106/linux/fs/romfs/inode.c Tue Jun 23 10:01:25 1998 +++ linux/fs/romfs/inode.c Wed Jun 24 14:30:10 1998 @@ -334,7 +334,7 @@ maxoff = dir->i_sb->u.romfs_sb.s_maxsize; offset = ntohl(ri.spec) & ROMFH_MASK; - /* ok, now find the file, whose name is in "dentry", in the + /* OK, now find the file whose name is in "dentry" in the * directory specified by "dir". */ name = dentry->d_name.name; diff -u --recursive --new-file v2.1.106/linux/fs/stat.c linux/fs/stat.c --- v2.1.106/linux/fs/stat.c Sun Jun 7 11:16:36 1998 +++ linux/fs/stat.c Wed Jun 24 14:30:10 1998 @@ -92,7 +92,7 @@ /* * Use minix fs values for the number of direct and indirect blocks. The * count is now exact for the minix fs except that it counts zero blocks. - * Everything is in BLOCK_SIZE'd units until the assignment to + * Everything is in units of BLOCK_SIZE until the assignment to * tmp.st_blksize. */ #define D_B 7 diff -u --recursive --new-file v2.1.106/linux/fs/super.c linux/fs/super.c --- v2.1.106/linux/fs/super.c Thu May 14 19:47:43 1998 +++ linux/fs/super.c Wed Jun 24 14:30:11 1998 @@ -5,8 +5,8 @@ * * super.c contains code to handle: - mount structures * - super-block tables. - * - mount systemcall - * - umount systemcall + * - mount system call + * - umount system call * * Added options to /proc/mounts * Torbjörn Lindh (torbjorn.lindh@gopta.se), April 14, 1996. @@ -645,9 +645,9 @@ /* * Before checking whether the filesystem is still busy, - * make sure the kernel doesn't hold any quotafiles open + * make sure the kernel doesn't hold any quota files open * on the device. If the umount fails, too bad -- there - * are no quotas running anymore. Just turn them on again. + * are no quotas running any more. Just turn them on again. */ DQUOT_OFF(dev); @@ -810,12 +810,12 @@ * [21-Mar-97] T.Schoebel-Theuer: Now this can be overridden when * supplying a leading "!" before the dir_name, allowing "stacks" of * mounted filesystems. The stacking will only influence any pathname lookups - * _after_ the mount, but open filedescriptors or working directories that + * _after_ the mount, but open file descriptors or working directories that * are now covered remain valid. For example, when you overmount /home, any * process with old cwd /home/joe will continue to use the old versions, * as long as relative paths are used, but absolute paths like /home/joe/xxx * will go to the new "top of stack" version. In general, crossing a - * mountpoint will always go to the top of stack element. + * mount point will always go to the top of stack element. * Anyone using this new feature must know what he/she is doing. */ diff -u --recursive --new-file v2.1.106/linux/fs/ufs/Makefile linux/fs/ufs/Makefile --- v2.1.106/linux/fs/ufs/Makefile Tue Oct 21 05:26:13 1997 +++ linux/fs/ufs/Makefile Wed Jun 24 14:30:11 1998 @@ -1,11 +1,11 @@ # -# Makefile for the linux ufs-filesystem routines. +# Makefile for the Linux ufs filesystem routines. # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here -# unless it's something special (ie not a .c file). +# unless it's something special (not a .c file). # -# Note 2! The CFLAGS definitions are now in the main makefile... +# Note 2! The CFLAGS definitions are now in the main makefile. O_TARGET := ufs.o O_OBJS := ufs_dir.o ufs_file.o ufs_inode.o ufs_namei.o \ diff -u --recursive --new-file v2.1.106/linux/fs/ufs/ufs_inode.c linux/fs/ufs/ufs_inode.c --- v2.1.106/linux/fs/ufs/ufs_inode.c Tue Feb 17 13:12:48 1998 +++ linux/fs/ufs/ufs_inode.c Wed Jun 24 14:22:58 1998 @@ -249,6 +249,8 @@ inode->i_op = &blkdev_inode_operations; } else if (S_ISFIFO(inode->i_mode)) { init_fifo(inode); + } else if (S_ISSOCK(inode->i_mode)) { + /* nothing */ } else { printk("ufs_read_inode: unknown file type 0%o ino %lu dev %d/%d\n", inode->i_mode, inode->i_ino, MAJOR(inode->i_dev), diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/apecs.h linux/include/asm-alpha/apecs.h --- v2.1.106/linux/include/asm-alpha/apecs.h Tue Jun 9 11:57:31 1998 +++ linux/include/asm-alpha/apecs.h Wed Jun 24 14:30:11 1998 @@ -42,7 +42,7 @@ we can't just use that here, because of header file looping... :-( Window 1 will be used for all DMA from the ISA bus; yes, that does - limit what memory an ISA floppy or soundcard or Ethernet can touch, but + limit what memory an ISA floppy or sound card or Ethernet can touch, but it's also a known limitation on other platforms as well. We use the same technique that is used on INTEL platforms with similar limitation: set MAX_DMA_ADDRESS and clear some pages' DMAable flags during mem_init(). diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/elf.h linux/include/asm-alpha/elf.h --- v2.1.106/linux/include/asm-alpha/elf.h Thu Feb 12 20:56:12 1998 +++ linux/include/asm-alpha/elf.h Wed Jun 24 14:30:11 1998 @@ -99,7 +99,7 @@ } /* This yields a mask that user programs can use to figure out what - instruction set this cpu supports. This is trivial on Alpha, + instruction set this CPU supports. This is trivial on Alpha, but not so on other machines. */ #define ELF_HWCAP \ diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/io.h linux/include/asm-alpha/io.h --- v2.1.106/linux/include/asm-alpha/io.h Tue Jun 9 11:57:31 1998 +++ linux/include/asm-alpha/io.h Wed Jun 24 14:30:11 1998 @@ -5,7 +5,7 @@ #include -/* We don't use IO slowdowns on the alpha, but.. */ +/* We don't use IO slowdowns on the Alpha, but.. */ #define __SLOW_DOWN_IO do { } while (0) #define SLOW_DOWN_IO do { } while (0) @@ -242,7 +242,7 @@ /* * XXX - We don't have csum_partial_copy_fromio() yet, so we cheat here and * just copy it. The net code will then do the checksum later. Presently - * only used by some shared memory 8390 ethernet cards anyway. + * only used by some shared memory 8390 Ethernet cards anyway. */ #define eth_io_copy_and_sum(skb,src,len,unused) memcpy_fromio((skb)->data,(src),(len)) diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/linux_logo.h linux/include/asm-alpha/linux_logo.h --- v2.1.106/linux/include/asm-alpha/linux_logo.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-alpha/linux_logo.h Wed Jun 24 14:44:02 1998 @@ -0,0 +1,69 @@ +/* $Id: linux_logo.h,v 1.2 1998/05/04 14:20:47 jj Exp $ + * include/asm-alpha/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#include +#include + +#define linux_logo_banner "Linux/AXP version " UTS_RELEASE + +#define LINUX_LOGO_COLORS 221 + +#ifdef INCLUDE_LINUX_LOGO_DATA + +#define INCLUDE_LINUX_LOGO16 +#include + +/* Painted by Johnny Stenback */ + +unsigned char *linux_serial_image __initdata = "\n" +" .u$e.\n" +" .$$$$$:S\n" +" $\"*$/\"*$$\n" +" $.`$ . ^F\n" +" 4k+#+T.$F\n" +" 4P+++\"$\"$\n" +" :R\"+ t$$B\n" +" ___# $$$\n" +" | | R$$k\n" +" dd. | Linux $!$\n" +" ddd | AXP $9$F\n" +" '!!!!!$ !!#!`\n" +" !!!!!* .!!!!!`\n" +"'!!!!!!!W..e$$!!!!!!` %s\n" +" \"~^^~ ^~~^\n" +"\n"; + +#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[]; +extern unsigned char *linux_serial_image; + +extern int (*console_show_logo)(void); + +#endif diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/pgtable.h linux/include/asm-alpha/pgtable.h --- v2.1.106/linux/include/asm-alpha/pgtable.h Tue Jun 23 10:01:25 1998 +++ linux/include/asm-alpha/pgtable.h Wed Jun 24 14:30:11 1998 @@ -3,9 +3,9 @@ /* * This file contains the functions and defines necessary to modify and use - * the alpha page table tree. + * the Alpha page table tree. * - * This hopefully works with any standard alpha page-size, as defined + * This hopefully works with any standard Alpha page-size, as defined * in (currently 8192). */ #include @@ -14,7 +14,7 @@ #include /* For TASK_SIZE */ #include -/* Caches aren't brain-dead on the alpha. */ +/* Caches aren't brain-dead on the Alpha. */ #define flush_cache_all() do { } while (0) #define flush_cache_mm(mm) do { } while (0) #define flush_cache_range(mm, start, end) do { } while (0) @@ -42,7 +42,7 @@ /* * Use a few helper functions to hide the ugly broken ASN - * numbers on early alpha's (ev4 and ev45) + * numbers on early Alphas (ev4 and ev45) */ #ifdef BROKEN_ASN @@ -126,8 +126,8 @@ } /* - * Flush a specified range of user mapping: on the - * alpha we flush the whole user tlb + * Flush a specified range of user mapping: on the + * Alpha we flush the whole user tlb. */ static inline void flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end) @@ -157,7 +157,7 @@ #endif /* __SMP__ */ -/* Certain architectures need to do special things when pte's +/* Certain architectures need to do special things when PTEs * within a page table are directly modified. Thus, the following * hook is made available. */ @@ -174,17 +174,17 @@ #define PGDIR_MASK (~(PGDIR_SIZE-1)) /* - * entries per page directory level: the alpha is three-level, with + * Entries per page directory level: the Alpha is three-level, with * all levels having a one-page page table. * - * The PGD is special: the last entry is reserved for self-mapping. + * The PGD is special: the last entry is reserved for self-mapping. */ #define PTRS_PER_PTE (1UL << (PAGE_SHIFT-3)) #define PTRS_PER_PMD (1UL << (PAGE_SHIFT-3)) #define PTRS_PER_PGD ((1UL << (PAGE_SHIFT-3))-1) #define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) -/* the no. of pointers that fit on a page: this will go away */ +/* Number of pointers that fit on a page: this will go away. */ #define PTRS_PER_PAGE (1UL << (PAGE_SHIFT-3)) #define VMALLOC_START 0xFFFFFE0000000000 @@ -208,7 +208,7 @@ #define _PAGE_ACCESSED 0x40000 /* - * NOTE! The "accessed" bit isn't necessarily exact: it can be kept exactly + * NOTE! The "accessed" bit isn't necessarily exact: it can be kept exactly * by software (use the KRE/URE/KWE/UWE bits appropriately), but I'll fake it. * Under Linux/AXP, the "accessed" bit just means "read", and I'll just use * the KRE/URE bits to watch for it. That way we don't need to overload the @@ -242,7 +242,7 @@ #define _PAGE_S(x) _PAGE_NORMAL(x) /* - * The hardware can handle write-only mappings, but as the alpha + * The hardware can handle write-only mappings, but as the Alpha * architecture does byte-wide writes with a read-modify-write * sequence, it's not practical to have write-without-read privs. * Thus the "-w- -> rw-" and "-wx -> rwx" mapping here (and in @@ -271,7 +271,7 @@ * BAD_PAGETABLE is used when we need a bogus page-table, while * BAD_PAGE is used for a bogus page. * - * ZERO_PAGE is a global shared page that is always zero: used + * ZERO_PAGE is a global shared page that is always zero: used * for zero-mapped memory areas etc.. */ extern pte_t __bad_page(void); @@ -297,7 +297,7 @@ ((unsigned long)(address)>>(PAGE_SHIFT-SIZEOF_PTR_LOG2)&PTR_MASK&~PAGE_MASK) /* - * Conversion functions: convert a page and protection to a page entry, + * Conversion functions: convert a page and protection to a page entry, * and a page entry and page directory to the page they refer to. */ extern inline pte_t mk_pte(unsigned long page, pgprot_t pgprot) @@ -576,7 +576,7 @@ extern pgd_t swapper_pg_dir[1024]; /* - * The alpha doesn't have any external MMU info: the kernel page + * The Alpha doesn't have any external MMU info: the kernel page * tables contain all the necessary information. */ extern inline void update_mmu_cache(struct vm_area_struct * vma, @@ -585,8 +585,8 @@ } /* - * Non-present pages: high 24 bits are offset, next 8 bits type, - * low 32 bits zero.. + * Non-present pages: high 24 bits are offset, next 8 bits type, + * low 32 bits zero. */ extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) { pte_t pte; pte_val(pte) = (type << 32) | (offset << 40); return pte; } diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/signal.h linux/include/asm-alpha/signal.h --- v2.1.106/linux/include/asm-alpha/signal.h Tue Jun 23 10:01:25 1998 +++ linux/include/asm-alpha/signal.h Wed Jun 24 14:30:11 1998 @@ -176,7 +176,7 @@ /* sigstack(2) is deprecated, and will be withdrawn in a future version of the X/Open CAE Specification. Use sigaltstack instead. It is only - implemented here for OSF/1 compatability. */ + implemented here for OSF/1 compatibility. */ struct sigstack { void *ss_sp; diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/t2.h linux/include/asm-alpha/t2.h --- v2.1.106/linux/include/asm-alpha/t2.h Tue Jun 9 11:57:31 1998 +++ linux/include/asm-alpha/t2.h Wed Jun 24 14:30:11 1998 @@ -554,7 +554,7 @@ /* - * Sable other cpu error frame - sable pfms section 3.43 + * Sable other CPU error frame - sable pfms section 3.43 */ struct el_t2_data_other_cpu { short elco_cpuid; /* CPU ID */ @@ -578,7 +578,7 @@ }; /* - * Sable other cpu error frame - sable pfms section 3.44 + * Sable other CPU error frame - sable pfms section 3.44 */ struct el_t2_data_t2{ struct el_t2_frame_header elct_hdr; /* ID$T2-FRAME */ diff -u --recursive --new-file v2.1.106/linux/include/asm-alpha/uaccess.h linux/include/asm-alpha/uaccess.h --- v2.1.106/linux/include/asm-alpha/uaccess.h Mon Dec 1 10:34:12 1997 +++ linux/include/asm-alpha/uaccess.h Wed Jun 24 14:30:11 1998 @@ -161,7 +161,7 @@ : "m"(__m(addr)), "1"(__gu_err)) #ifdef __HAVE_CPU_BWX -/* Those lucky bastards with ev56 and later cpus can do byte/word moves. */ +/* Those lucky bastards with ev56 and later CPUs can do byte/word moves. */ #define __get_user_16(addr) \ __asm__("1: ldwu %0,%2\n" \ @@ -275,7 +275,7 @@ : "m"(__m(addr)), "rJ"(x), "0"(__pu_err)) #ifdef __HAVE_CPU_BWX -/* Those lucky bastards with ev56 and later cpus can do byte/word moves. */ +/* Those lucky bastards with ev56 and later CPUs can do byte/word moves. */ #define __put_user_16(x,addr) \ __asm__ __volatile__("1: stw %r2,%1\n" \ diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/bugs.h linux/include/asm-i386/bugs.h --- v2.1.106/linux/include/asm-i386/bugs.h Sat May 2 14:19:54 1998 +++ linux/include/asm-i386/bugs.h Wed Jun 24 15:51:17 1998 @@ -83,7 +83,7 @@ if (fpu_error) return; if (!ignore_irq13) { - printk("Ok, fpu using old IRQ13 error reporting\n"); + printk("OK, FPU using old IRQ 13 error reporting\n"); return; } __asm__("fninit\n\t" @@ -98,9 +98,9 @@ : "=m" (*&boot_cpu_data.fdiv_bug) : "m" (*&x), "m" (*&y)); if (!boot_cpu_data.fdiv_bug) - printk("Ok, fpu using exception 16 error reporting.\n"); + printk("OK, FPU using exception 16 error reporting.\n"); else - printk("Hmm, fpu using exception 16 error reporting with FDIV bug.\n"); + printk("Hmm, FPU using exception 16 error reporting with FDIV bug.\n"); } __initfunc(static void check_hlt(void)) @@ -111,7 +111,7 @@ return; } __asm__ __volatile__("hlt ; hlt ; hlt ; hlt"); - printk("Ok.\n"); + printk("OK.\n"); } __initfunc(static void check_tlb(void)) @@ -145,9 +145,9 @@ : "=eax" (res) : "edx" (inp) : "eax", "ecx", "edx", "edi" ); - /* If this fails, it means that any user program may lock CPU hard. Too bad. */ + /* If this fails, it means that any user program may lock the CPU hard. Too bad. */ if (res != 12345678) printk( "Buggy.\n" ); - else printk( "Ok.\n" ); + else printk( "OK.\n" ); #endif } diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/elf.h linux/include/asm-i386/elf.h --- v2.1.106/linux/include/asm-i386/elf.h Thu Feb 12 20:56:12 1998 +++ linux/include/asm-i386/elf.h Wed Jun 24 14:30:11 1998 @@ -71,7 +71,7 @@ pr_reg[16] = regs->xss; /* This yields a mask that user programs can use to figure out what - instruction set this cpu supports. This could be done in userspace, + instruction set this CPU supports. This could be done in user space, but it's not easy, and we've already done it here. */ #define ELF_HWCAP (boot_cpu_data.x86_capability) diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/linux_logo.h linux/include/asm-i386/linux_logo.h --- v2.1.106/linux/include/asm-i386/linux_logo.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-i386/linux_logo.h Wed Jun 24 15:51:48 1998 @@ -0,0 +1,92 @@ +/* $Id: linux_logo.h,v 1.3 1998/06/07 21:49:54 geert Exp $ + * include/asm-i386/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#include +#include + +#define linux_logo_banner "Linux/ia32 version " UTS_RELEASE + +#define LINUX_LOGO_COLORS 221 + +#ifdef INCLUDE_LINUX_LOGO_DATA + +#define INCLUDE_LINUX_LOGO16 +#include + +/* Painted by Johnny Stenback */ + +unsigned char *linux_serial_image __initdata = "\n" +" .u$e.\n" +" .$$$$$:S\n" +" $\"*$/\"*$$\n" +" $.`$ . ^F\n" +" 4k+#+T.$F\n" +" 4P+++\"$\"$\n" +" :R\"+ t$$B\n" +" ___# $$$\n" +" | | R$$k\n" +" dd. | Linux $!$\n" +" ddd | ia32 $9$F\n" +" '!!!!!$ !!#!`\n" +" !!!!!* .!!!!!`\n" +"'!!!!!!!W..e$$!!!!!!`\n" +" \"~^^~ ^~~^\n" +"\n"; + +/* The following created by Andrew Apted, May 1998 */ + +unsigned char *linux_mda_image __initdata = "\n" +"LINUX/IA32..........................\n" +":::::::::::::: ::::::::::::::\n" +":::::::::::: :::::::::::\n" +":::::::::::: ## ## :::::::::::\n" +":::::::::::: # xxxx ## :::::::::::\n" +":::::::::::: xxxxxxxxx ::::::::::\n" +":::::::::::: ##xxx#### :::::::::\n" +"::::::::::: ########### ::::::::\n" +"::::::::: ############# ::::::\n" +":::::::: ############### :::::\n" +":::::: ################# ::::\n" +":::::: ################## ::::\n" +":::::xxx################## ::::\n" +":::xxxxxx #############xxx xxx:::\n" +"xxxxxxxxxxx ##########xxxxxxxxxx::\n" +"xxxxxxxxxxxx ########## xxxxxxxxxxxx\n" +"xxxxxxxxxxxxx####### xxxxxxxxxxx:\n" +":::::xxxxxxxx:::::::::::xxxxxx::::::\n\n"; + +#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[]; +extern unsigned char *linux_serial_image; +extern unsigned char *linux_mda_image; + +extern int (*console_show_logo)(void); + +#endif diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/pgtable.h linux/include/asm-i386/pgtable.h --- v2.1.106/linux/include/asm-i386/pgtable.h Tue Jun 23 10:01:26 1998 +++ linux/include/asm-i386/pgtable.h Wed Jun 24 15:51:17 1998 @@ -161,7 +161,7 @@ #endif /* !__ASSEMBLY__ */ -/* Certain architectures need to do special things when pte's +/* Certain architectures need to do special things when PTEs * within a page table are directly modified. Thus, the following * hook is made available. */ diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/smp.h linux/include/asm-i386/smp.h --- v2.1.106/linux/include/asm-i386/smp.h Fri May 8 23:14:54 1998 +++ linux/include/asm-i386/smp.h Wed Jun 24 14:30:11 1998 @@ -183,7 +183,7 @@ extern void smp_callin(void); extern void smp_boot_cpus(void); -extern void smp_store_cpu_info(int id); /* Store per cpu info (like the initial udelay numbers */ +extern void smp_store_cpu_info(int id); /* Store per CPU info (like the initial udelay numbers */ extern void smp_message_pass(int target, int msg, unsigned long data, int wait); extern volatile unsigned long smp_proc_in_lock[NR_CPUS]; /* for computing process time */ diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/softirq.h linux/include/asm-i386/softirq.h --- v2.1.106/linux/include/asm-i386/softirq.h Fri Jan 30 15:50:57 1998 +++ linux/include/asm-i386/softirq.h Wed Jun 24 14:30:11 1998 @@ -50,7 +50,7 @@ atomic_dec(&global_bh_lock); } -/* These are for the irq's testing the lock */ +/* These are for the IRQs testing the lock */ static inline int softirq_trylock(int cpu) { if (!test_and_set_bit(0,&global_bh_count)) { diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/string.h linux/include/asm-i386/string.h --- v2.1.106/linux/include/asm-i386/string.h Mon Apr 6 17:41:01 1998 +++ linux/include/asm-i386/string.h Wed Jun 24 14:30:11 1998 @@ -403,7 +403,7 @@ case 4: *(unsigned long *)to = *(const unsigned long *)from; return to; - case 6: /* for ethernet addresses */ + case 6: /* for Ethernet addresses */ *(unsigned long *)to = *(const unsigned long *)from; *(2+(unsigned short *)to) = *(2+(const unsigned short *)from); return to; diff -u --recursive --new-file v2.1.106/linux/include/asm-i386/vm86.h linux/include/asm-i386/vm86.h --- v2.1.106/linux/include/asm-i386/vm86.h Sun Jun 7 11:16:37 1998 +++ linux/include/asm-i386/vm86.h Wed Jun 24 14:30:11 1998 @@ -60,7 +60,7 @@ #define VM86_GET_AND_RESET_IRQ 6 /* - * This is the stack-layout seen by the user space programm when we have + * This is the stack-layout seen by the user space program when we have * done a translation of "SAVE_ALL" from vm86 mode. The real kernel layout * is 'kernel_vm86_regs' (see below). */ diff -u --recursive --new-file v2.1.106/linux/include/linux/atalk.h linux/include/linux/atalk.h --- v2.1.106/linux/include/linux/atalk.h Fri Feb 6 15:33:34 1998 +++ linux/include/linux/atalk.h Wed Jun 24 15:52:10 1998 @@ -1,5 +1,5 @@ /* - * Appletalk networking structures + * AppleTalk networking structures * * The following are directly referenced from the University Of Michigan * netatalk for compatibility reasons. @@ -108,7 +108,7 @@ /* And netatalk apps expect to stick the type in themselves */ }; -/* Appletalk AARP headers */ +/* AppleTalk AARP headers */ struct elapaarp { diff -u --recursive --new-file v2.1.106/linux/include/linux/blk.h linux/include/linux/blk.h --- v2.1.106/linux/include/linux/blk.h Tue Jun 23 10:01:29 1998 +++ linux/include/linux/blk.h Wed Jun 24 15:51:31 1998 @@ -137,8 +137,8 @@ #elif (MAJOR_NR == HD_MAJOR) -/* harddisk: timeout is 6 seconds.. */ -#define DEVICE_NAME "harddisk" +/* Hard disk: timeout is 6 seconds. */ +#define DEVICE_NAME "hard disk" #define DEVICE_INTR do_hd #define DEVICE_TIMEOUT HD_TIMER #define TIMEOUT_VALUE (6*HZ) @@ -292,7 +292,7 @@ #define DEVICE_OFF(device) #elif (MAJOR_NR == CM206_CDROM_MAJOR) -#define DEVICE_NAME "Philips/LMS cd-rom cm206" +#define DEVICE_NAME "Philips/LMS CD-ROM cm206" #define DEVICE_REQUEST do_cm206_request #define DEVICE_NR(device) (MINOR(device)) #define DEVICE_ON(device) diff -u --recursive --new-file v2.1.106/linux/include/linux/bpqether.h linux/include/linux/bpqether.h --- v2.1.106/linux/include/linux/bpqether.h Sun Nov 10 09:12:57 1996 +++ linux/include/linux/bpqether.h Wed Jun 24 14:30:11 1998 @@ -20,7 +20,7 @@ /* * For SIOCSBPQETHOPT - this is compatible with PI2/PacketTwin card drivers, * currently not implemented, though. If someone wants to hook a radio - * to his ethernet card he may find this useful... ;-) + * to his Ethernet card he may find this useful. ;-) */ #define SIOCGBPQETHPARAM 0x5000 /* get Level 1 parameters */ diff -u --recursive --new-file v2.1.106/linux/include/linux/byteorder/generic.h linux/include/linux/byteorder/generic.h --- v2.1.106/linux/include/linux/byteorder/generic.h Fri Dec 5 11:01:37 1997 +++ linux/include/linux/byteorder/generic.h Wed Jun 24 14:30:11 1998 @@ -55,7 +55,7 @@ * __constant_htons(__u16 x) * * Conversion of XX-bit integers (16- 32- or 64-) - * between native cpu format and little/big endian format + * between native CPU format and little/big endian format * 64-bit stuff only defined for proper architectures * cpu_to_[bl]eXX(__uXX x) * [bl]eXX_to_cpu(__uXX x) diff -u --recursive --new-file v2.1.106/linux/include/linux/byteorder/swab.h linux/include/linux/byteorder/swab.h --- v2.1.106/linux/include/linux/byteorder/swab.h Fri Dec 5 05:52:57 1997 +++ linux/include/linux/byteorder/swab.h Wed Jun 24 14:30:11 1998 @@ -3,7 +3,7 @@ /* * linux/byteorder/swab.h - * Byteswapping, independently from cpu endianness + * Byte-swapping, independently from CPU endianness * swabXX[ps]?(foo) * * Francois-Rene Rideau 19971205 diff -u --recursive --new-file v2.1.106/linux/include/linux/coda.h linux/include/linux/coda.h --- v2.1.106/linux/include/linux/coda.h Sun Jun 7 11:16:39 1998 +++ linux/include/linux/coda.h Wed Jun 24 14:30:11 1998 @@ -1,4 +1,3 @@ - /* * * Based on cfs.h from Mach, but revamped for increased simplicity. diff -u --recursive --new-file v2.1.106/linux/include/linux/console.h linux/include/linux/console.h --- v2.1.106/linux/include/linux/console.h Wed Apr 1 20:11:54 1998 +++ linux/include/linux/console.h Wed Jun 24 14:44:02 1998 @@ -27,24 +27,29 @@ /* DPC: 1994-04-13 !!! con_putcs is new entry !!! */ struct consw { - unsigned long (*con_startup)(unsigned long, const char **); - void (*con_init)(struct vc_data *); - int (*con_deinit)(struct vc_data *); - int (*con_clear)(struct vc_data *, int, int, int, int); - int (*con_putc)(struct vc_data *, int, int, int); - int (*con_putcs)(struct vc_data *, const char *, int, int, int); - int (*con_cursor)(struct vc_data *, int); - int (*con_scroll)(struct vc_data *, int, int, int, int); - int (*con_bmove)(struct vc_data *, int, int, int, int, int, int); - int (*con_switch)(struct vc_data *); - int (*con_blank)(int); - int (*con_get_font)(struct vc_data *, int *, int *, char *); - int (*con_set_font)(struct vc_data *, int, int, char *); - int (*con_set_palette)(struct vc_data *, unsigned char *); + unsigned long (*con_startup)(unsigned long, const char **); + void (*con_init)(struct vc_data *); + void (*con_deinit)(struct vc_data *); + void (*con_clear)(struct vc_data *, int, int, int, int); + void (*con_putc)(struct vc_data *, int, int, int); + void (*con_putcs)(struct vc_data *, const char *, int, int, int); + void (*con_cursor)(struct vc_data *, int); + void (*con_scroll)(struct vc_data *, int, int, int, int); + void (*con_bmove)(struct vc_data *, int, int, int, int, int, int); + int (*con_switch)(struct vc_data *); + int (*con_blank)(int); + int (*con_get_font)(struct vc_data *, int *, int *, char *); + int (*con_set_font)(struct vc_data *, int, int, char *); + int (*con_set_palette)(struct vc_data *, unsigned char *); + int (*con_scrolldelta)(struct vc_data *, int); }; extern struct consw *conswitchp; +extern struct consw fb_con; /* frame buffer based console */ +extern struct consw vga_con; /* VGA text console */ +extern struct consw compat_con; /* console wrapper */ + /* flag bits */ #define CON_INITED (1) @@ -101,5 +106,11 @@ extern void register_console(struct console *); extern int unregister_console(struct console *); extern struct console *console_drivers; + +/* VEA 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 */ diff -u --recursive --new-file v2.1.106/linux/include/linux/console_compat.h linux/include/linux/console_compat.h --- v2.1.106/linux/include/linux/console_compat.h Wed Dec 31 16:00:00 1969 +++ linux/include/linux/console_compat.h Wed Jun 24 14:44:02 1998 @@ -0,0 +1,163 @@ +/* + * linux/include/linux/console_compat.h -- Abstract console wrapper + * + * 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. + */ + +#ifndef _LINUX_CONSOLE_COMPAT_H_ +#define _LINUX_CONSOLE_COMPAT_H_ + +#undef video_num_columns +#undef video_num_lines +#undef video_size_row +#undef video_type +#undef video_mem_base +#undef video_mem_term +#undef video_screen_size +#undef can_do_color +#undef scr_writew +#undef scr_readw +#undef memsetw +#undef memcpyw +#undef set_cursor +#undef hide_cursor +#undef set_get_cmap +#undef set_palette +#undef set_get_font +#undef set_vesa_blanking +#undef vesa_blank +#undef vesa_powerdown +#undef con_adjust_height +#undef con_type_init +#undef con_type_init_finish + +#define video_num_columns compat_video_num_columns +#define video_num_lines compat_video_num_lines +#define video_size_row compat_video_size_row +#define video_type compat_video_type +#define video_mem_base compat_video_mem_base +#define video_mem_term compat_video_mem_term +#define video_screen_size compat_video_screen_size +#define can_do_color compat_can_do_color +#define scr_writew compat_scr_writew +#define scr_readw compat_scr_readw +#define memsetw compat_memsetw +#define memcpyw compat_memcpyw +#define set_cursor compat_set_cursor +#define hide_cursor compat_hide_cursor +#define set_get_cmap compat_set_get_cmap +#define set_palette compat_set_palette +#define set_get_font compat_set_get_font +#define set_vesa_blanking compat_set_vesa_blanking +#define vesa_blank compat_vesa_blank +#define vesa_powerdown compat_vesa_powerdown +#define con_adjust_height compat_con_adjust_height +#define con_type_init compat_con_type_init +#define con_type_init_finish compat_con_type_init_finish + +extern unsigned long compat_video_num_columns; +extern unsigned long compat_video_num_lines; +extern unsigned long compat_video_size_row; +extern unsigned char compat_video_type; +extern unsigned long compat_video_mem_base; +extern unsigned long compat_video_mem_term; +extern unsigned long compat_video_screen_size; +extern int compat_can_do_color; +extern void compat_set_cursor(int currcons); +extern void compat_hide_cursor(void); +extern int compat_set_get_cmap(unsigned char *arg, int set); +extern void compat_set_palette(void); +extern int compat_set_get_font(unsigned char * arg, int set, int ch512); +extern void compat_set_vesa_blanking(unsigned long arg); +extern void compat_vesa_blank(void); +extern void compat_vesa_powerdown(void); +extern int compat_con_adjust_height(unsigned long fontheight); +extern void compat_con_type_init(const char **); +extern void compat_con_type_init_finish(void); + +#if defined(CONFIG_SUN_CONSOLE) + void (*memsetw)(void *, unsigned short, unsigned int); + void (*memcpyw)(unsigned short *, unsigned short *, unsigned int); + void (*scr_writew)(unsigned short, unsigned short *); + unsigned short (*scr_readw)(unsigned short *); + void (*get_scrmem)(int); + void (*set_scrmem)(int, long); + void (*set_origin)(unsigned short); + void (*hide_cursor)(void); + void (*set_cursor)(int); + int (*set_get_font)(char *, int, int); + int (*con_adjust_height)(unsigned long); + int (*set_get_cmap)(unsigned char *, int); + void (*set_palette)(void); + void (*set_other_palette)(int); + void (*console_restore_palette)(void); + void (*con_type_init)(const char **); + void (*con_type_init_finish)(void); + + /* VESA powerdown methods */ + void (*vesa_blank)(void); + void (*vesa_unblank)(void); + void (*set_vesa_blanking)(const unsigned long); + void (*vesa_powerdown)(void); + + void (*clear_screen)(void); + void (*render_screen)(void); + void (*clear_margin)(void); +}; + +#define compat_memsetw(s,c,count) suncons_ops.memsetw((s),(c),(count)) +#define compat_memcpyw(to,from,count) suncons_ops.memcpyw((to),(from),(count)) +#define compat_scr_writew(val,addr) suncons_ops.scr_writew((val),(addr)) +#define compat_scr_readw(addr) suncons_ops.scr_readw((addr)) + +#elif defined(CONFIG_PMAC_CONSOLE) +extern void pmac_blitc(unsigned, unsigned long); +extern void compat_memsetw(unsigned short *p, unsigned short c, unsigned count); +extern void compat_memcpyw(unsigned short *to, unsigned short *from, unsigned count); + +static inline void compat_scr_writew(unsigned short val, unsigned short * addr) +{ + if ((unsigned long)addr < video_mem_term && + (unsigned long)addr >= video_mem_base) { + if (*addr != val) { + *addr = val; + pmac_blitc(val, (unsigned long) addr); + } + } else + *addr = val; +} + +static inline unsigned short compat_scr_readw(unsigned short * addr) +{ + return *addr; +} +#endif + +#if !defined(CONFIG_SUN_CONSOLE) && !defined(CONFIG_PMAC_CONSOLE) +static inline void compat_memsetw(void * s, unsigned short c, unsigned int count) +{ + unsigned short * addr = (unsigned short *) s; + + count /= 2; + while (count) { + count--; + scr_writew(c, addr++); + } +} + +static inline void compat_memcpyw(unsigned short *to, unsigned short *from, + unsigned int count) +{ + count /= 2; + while (count) { + count--; + scr_writew(scr_readw(from++), to++); + } +} +#endif + +#endif /* _LINUX_CONSOLE_COMPAT_H_ */ diff -u --recursive --new-file v2.1.106/linux/include/linux/console_struct.h linux/include/linux/console_struct.h --- v2.1.106/linux/include/linux/console_struct.h Mon Jan 5 00:23:17 1998 +++ linux/include/linux/console_struct.h Wed Jun 24 14:44:02 1998 @@ -4,11 +4,22 @@ * Data structure and defines shared between console.c, vga.c and tga.c */ +/* + * You can set here how should the cursor look by default. + * In case you set CONFIG_SOFTCURSOR, this might be really interesting. + */ +#define CUR_DEFAULT CUR_UNDERLINE + #include #define NPAR 16 struct vc_data { + unsigned short vc_num; /* Console number */ + unsigned long vc_cols; + unsigned long vc_rows; + unsigned long vc_size_row; + struct consw *vc_sw; unsigned long vc_screenbuf_size; unsigned short vc_video_erase_char; /* Background erase character */ unsigned char vc_attr; /* Current attributes */ @@ -23,13 +34,8 @@ unsigned long vc_top,vc_bottom; unsigned long vc_state; unsigned long vc_npar,vc_par[NPAR]; -#ifdef CONFIG_FB_CONSOLE - unsigned short *vc_video_mem_start; /* Start of video RAM */ - unsigned short *vc_pos; -#else unsigned long vc_pos; unsigned long vc_video_mem_start; /* Start of video RAM */ -#endif unsigned long vc_video_mem_end; /* End of video RAM (sort of) */ unsigned long vc_saved_x; unsigned long vc_saved_y; @@ -72,6 +78,7 @@ unsigned char vc_saved_G1; unsigned int vc_bell_pitch; /* Console bell pitch */ unsigned int vc_bell_duration; /* Console bell duration */ + unsigned int vc_cursor_type; /* additional information is in vt_kern.h */ }; @@ -85,65 +92,12 @@ extern struct vc vc_cons [MAX_NR_CONSOLES]; -#define screenbuf_size (vc_cons[currcons].d->vc_screenbuf_size) -#define origin (vc_cons[currcons].d->vc_origin) -#define scr_end (vc_cons[currcons].d->vc_scr_end) -#define pos (vc_cons[currcons].d->vc_pos) -#define top (vc_cons[currcons].d->vc_top) -#define bottom (vc_cons[currcons].d->vc_bottom) -#define x (vc_cons[currcons].d->vc_x) -#define y (vc_cons[currcons].d->vc_y) -#define vc_state (vc_cons[currcons].d->vc_state) -#define npar (vc_cons[currcons].d->vc_npar) -#define par (vc_cons[currcons].d->vc_par) -#define ques (vc_cons[currcons].d->vc_ques) -#define attr (vc_cons[currcons].d->vc_attr) -#define saved_x (vc_cons[currcons].d->vc_saved_x) -#define saved_y (vc_cons[currcons].d->vc_saved_y) -#define translate (vc_cons[currcons].d->vc_translate) -#define G0_charset (vc_cons[currcons].d->vc_G0_charset) -#define G1_charset (vc_cons[currcons].d->vc_G1_charset) -#define saved_G0 (vc_cons[currcons].d->vc_saved_G0) -#define saved_G1 (vc_cons[currcons].d->vc_saved_G1) -#define utf (vc_cons[currcons].d->vc_utf) -#define utf_count (vc_cons[currcons].d->vc_utf_count) -#define utf_char (vc_cons[currcons].d->vc_utf_char) -#define video_mem_start (vc_cons[currcons].d->vc_video_mem_start) -#define video_mem_end (vc_cons[currcons].d->vc_video_mem_end) -#define video_erase_char (vc_cons[currcons].d->vc_video_erase_char) -#define disp_ctrl (vc_cons[currcons].d->vc_disp_ctrl) -#define toggle_meta (vc_cons[currcons].d->vc_toggle_meta) -#define decscnm (vc_cons[currcons].d->vc_decscnm) -#define decom (vc_cons[currcons].d->vc_decom) -#define decawm (vc_cons[currcons].d->vc_decawm) -#define deccm (vc_cons[currcons].d->vc_deccm) -#define decim (vc_cons[currcons].d->vc_decim) -#define deccolm (vc_cons[currcons].d->vc_deccolm) -#define need_wrap (vc_cons[currcons].d->vc_need_wrap) -#define has_scrolled (vc_cons[currcons].d->vc_has_scrolled) -#define kmalloced (vc_cons[currcons].d->vc_kmalloced) -#define report_mouse (vc_cons[currcons].d->vc_report_mouse) -#define color (vc_cons[currcons].d->vc_color) -#define s_color (vc_cons[currcons].d->vc_s_color) -#define def_color (vc_cons[currcons].d->vc_def_color) -#define foreground (color & 0x0f) -#define background (color & 0xf0) -#define charset (vc_cons[currcons].d->vc_charset) -#define s_charset (vc_cons[currcons].d->vc_s_charset) -#define intensity (vc_cons[currcons].d->vc_intensity) -#define underline (vc_cons[currcons].d->vc_underline) -#define blink (vc_cons[currcons].d->vc_blink) -#define reverse (vc_cons[currcons].d->vc_reverse) -#define s_intensity (vc_cons[currcons].d->vc_s_intensity) -#define s_underline (vc_cons[currcons].d->vc_s_underline) -#define s_blink (vc_cons[currcons].d->vc_s_blink) -#define s_reverse (vc_cons[currcons].d->vc_s_reverse) -#define ulcolor (vc_cons[currcons].d->vc_ulcolor) -#define halfcolor (vc_cons[currcons].d->vc_halfcolor) -#define tab_stop (vc_cons[currcons].d->vc_tab_stop) -#define palette (vc_cons[currcons].d->vc_palette) -#define bell_pitch (vc_cons[currcons].d->vc_bell_pitch) -#define bell_duration (vc_cons[currcons].d->vc_bell_duration) - -#define vcmode (vt_cons[currcons]->vc_mode) -#define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct)) +#define CUR_DEF 0 +#define CUR_NONE 1 +#define CUR_UNDERLINE 2 +#define CUR_LOWER_THIRD 3 +#define CUR_LOWER_HALF 4 +#define CUR_TWO_THIRDS 5 +#define CUR_BLOCK 6 +#define CUR_HWMASK 0x0f +#define CUR_SWMASK 0xfff0 diff -u --recursive --new-file v2.1.106/linux/include/linux/elf.h linux/include/linux/elf.h --- v2.1.106/linux/include/linux/elf.h Fri May 8 23:14:56 1998 +++ linux/include/linux/elf.h Wed Jun 24 14:30:11 1998 @@ -127,8 +127,8 @@ #define AT_EUID 12 /* effective uid */ #define AT_GID 13 /* real gid */ #define AT_EGID 14 /* effective gid */ -#define AT_PLATFORM 15 /* string identifying cpu for optimizations */ -#define AT_HWCAP 16 /* arch dependent hints at cpu capabilities */ +#define AT_PLATFORM 15 /* string identifying CPU for optimizations */ +#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ typedef struct dynamic{ Elf32_Sword d_tag; @@ -206,7 +206,7 @@ /* Bits present in AT_HWCAP, primarily for Sparc32. */ -#define HWCAP_SPARC_FLUSH 1 /* The cpu supports flush insn. */ +#define HWCAP_SPARC_FLUSH 1 /* CPU supports flush instruction. */ #define HWCAP_SPARC_STBAR 2 #define HWCAP_SPARC_SWAP 4 #define HWCAP_SPARC_MULDIV 8 diff -u --recursive --new-file v2.1.106/linux/include/linux/fb.h linux/include/linux/fb.h --- v2.1.106/linux/include/linux/fb.h Thu Mar 26 15:57:05 1998 +++ linux/include/linux/fb.h Wed Jun 24 14:44:02 1998 @@ -30,6 +30,8 @@ #define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */ #define FB_TYPE_PLANES 1 /* Non interleaved planes */ #define FB_TYPE_INTERLEAVED_PLANES 2 /* Interleaved planes */ +#define FB_TYPE_VGA_TEXT 3 /* VGA text/attributes */ +#define FB_TYPE_S3_MMIO_TEXT 4 /* S3 MMIO text */ #define FB_VISUAL_MONO01 0 /* Monochr. 1=Black 0=White */ #define FB_VISUAL_MONO10 1 /* Monochr. 1=White 0=Black */ @@ -37,11 +39,23 @@ #define FB_VISUAL_PSEUDOCOLOR 3 /* Pseudo color (like atari) */ #define FB_VISUAL_DIRECTCOLOR 4 /* Direct color */ #define FB_VISUAL_STATIC_PSEUDOCOLOR 5 /* Pseudo color readonly */ -#define FB_VISUAL_STATIC_DIRECTCOLOR 6 /* Direct color readonly */ + +#define FB_ACCEL_NONE 0 /* no hardware accelerator */ +#define FB_ACCEL_ATARIBLITT 1 /* Atari Blitter */ +#define FB_ACCEL_AMIGABLITT 2 /* Amiga Blitter */ +#define FB_ACCEL_S3_TRIO64 3 /* Cybervision64 (S3 Trio64) */ +#define FB_ACCEL_NCR_77C32BLT 4 /* RetinaZ3 (NCR 77C32BLT) */ +#define FB_ACCEL_S3_VIRGE 5 /* Cybervision64/3D (S3 ViRGE) */ +#define FB_ACCEL_ATI_MACH64GX 6 /* ATI Mach 64GX family */ +#define FB_ACCEL_DEC_TGA 7 /* DEC 21030 TGA */ +#define FB_ACCEL_ATI_MACH64CT 8 /* ATI Mach 64CT family */ +#define FB_ACCEL_ATI_MACH64VT 9 /* ATI Mach 64CT family VT class */ +#define FB_ACCEL_ATI_MACH64GT 10 /* ATI Mach 64CT family GT class */ struct fb_fix_screeninfo { char id[16]; /* identification string eg "TT Builtin" */ char *smem_start; /* Start of frame buffer mem */ + /* (physical address) */ __u32 smem_len; /* Length of frame buffer mem */ __u32 type; /* see FB_TYPE_* */ __u32 type_aux; /* Interleave for interleaved Planes */ @@ -50,12 +64,19 @@ __u16 ypanstep; /* zero if no hardware panning */ __u16 ywrapstep; /* zero if no hardware ywrap */ __u32 line_length; /* length of a line in bytes */ - unsigned char *mmio_start; /* Start of Memory Mapped I/O */ + char *mmio_start; /* Start of Memory Mapped I/O */ + /* (physical address) */ __u32 mmio_len; /* Length of Memory Mapped I/O */ __u32 accel; /* Type of acceleration available */ __u16 reserved[3]; /* Reserved for future compatibility */ }; +/* Interpretation of offset for color fields: All offsets are from the right, + * inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you + * can use the offset as right argument to <<). A pixel afterwards is a bit + * stream and is written to video memory as that unmodified. This implies + * big-endian byte order if bits_per_pixel is greater than 8. + */ struct fb_bitfield { __u32 offset; /* beginning of bitfield */ __u32 length; /* length of bitfield */ @@ -73,15 +94,7 @@ #define FB_ACTIVATE_VBL 16 /* activate values on next vbl */ #define FB_CHANGE_CMAP_VBL 32 /* change colormap on vbl */ -#define FB_ACCEL_NONE 0 /* no hardware accelerator */ -#define FB_ACCEL_ATARIBLITT 1 /* Atari Blitter */ -#define FB_ACCEL_AMIGABLITT 2 /* Amiga Blitter */ -#define FB_ACCEL_S3TRIO64 3 /* Cybervision64 (S3 Trio64) */ -#define FB_ACCEL_NCR77C32BLT 4 /* RetinaZ3 (NCR77C32BLT) */ -#define FB_ACCEL_S3VIRGE 5 /* Cybervision64/3D (S3 ViRGE) */ -#define FB_ACCEL_MACH64 6 /* ATI Mach 64 */ -#define FB_ACCEL_TGA 7 /* DEC 21030 TGA */ -#define FB_ACCEL_ATY 8 /* atyfb (ATI Mach64) */ +#define FB_ACCELF_TEXT 1 /* text mode acceleration */ #define FB_SYNC_HOR_HIGH_ACT 1 /* horizontal sync high active */ #define FB_SYNC_VERT_HIGH_ACT 2 /* vertical sync high active */ @@ -124,7 +137,7 @@ __u32 height; /* height of picture in mm */ __u32 width; /* width of picture in mm */ - __u32 accel; /* see FB_ACCEL_* */ + __u32 accel_flags; /* acceleration flags (hints) */ /* Timing: All values in pixclocks, except pixclock (of course) */ __u32 pixclock; /* pixel clock in ps (pico seconds) */ @@ -154,10 +167,10 @@ }; struct fb_monspecs { - unsigned hfmin : 20; /* hfreq lower limit (Hz) */ - unsigned hfmax : 20; /* hfreq upper limit (Hz) */ - unsigned vfmin : 10; /* vfreq lower limit (Hz) */ - unsigned vfmax : 10; /* vfreq upper limit (Hz) */ + __u32 hfmin; /* hfreq lower limit (Hz) */ + __u32 hfmax; /* hfreq upper limit (Hz) */ + __u16 vfmin; /* vfreq lower limit (Hz) */ + __u16 vfmax; /* vfreq upper limit (Hz) */ unsigned dpms : 1; /* supports DPMS */ }; @@ -196,8 +209,6 @@ /* pan display */ int (*fb_pan_display)(struct fb_var_screeninfo *var, int con, struct fb_info *info); - /* switch between text and graphics mode */ - int (*fb_set_mode)(int mode, struct fb_info *info); /* perform fb specific ioctl */ int (*fb_ioctl)(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg, int con, struct fb_info *info); @@ -216,6 +227,7 @@ /* are updated by fbcon.c */ struct fb_cmap cmap; /* colormap */ char *screen_base; /* pointer to top of virtual screen */ + /* (virtual address) */ int visual; int type; /* see FB_TYPE_* */ int type_aux; /* Interleave for interleaved Planes */ @@ -265,6 +277,8 @@ int (*updatevar)(int, struct fb_info*); /* tell fb to update the vars */ void (*blank)(int, struct fb_info*); /* tell fb to (un)blank the screen */ + /* arg = 0: unblank */ + /* arg > 0: VESA level (arg-1) */ /* From here on everything is device dependent */ }; @@ -349,6 +363,12 @@ struct fb_info *fb_info); extern struct fb_cmap *fb_default_cmap(int len); extern void fb_invert_cmaps(void); + +/* VESA Blanking Levels */ +#define VESA_NO_BLANKING 0 +#define VESA_VSYNC_SUSPEND 1 +#define VESA_HSYNC_SUSPEND 2 +#define VESA_POWERDOWN 3 #endif /* __KERNEL__ */ diff -u --recursive --new-file v2.1.106/linux/include/linux/fd.h linux/include/linux/fd.h --- v2.1.106/linux/include/linux/fd.h Fri May 8 23:14:56 1998 +++ linux/include/linux/fd.h Wed Jun 24 14:30:11 1998 @@ -116,7 +116,7 @@ * Drive parameters (user modifiable) */ struct floppy_drive_params { - signed char cmos; /* cmos type */ + signed char cmos; /* CMOS type */ /* Spec2 is (HLD<<1 | ND), where HLD is head load time (1=2ms, 2=4 ms * etc) and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA). diff -u --recursive --new-file v2.1.106/linux/include/linux/kernel_stat.h linux/include/linux/kernel_stat.h --- v2.1.106/linux/include/linux/kernel_stat.h Fri Jan 23 18:10:32 1998 +++ linux/include/linux/kernel_stat.h Wed Jun 24 14:51:52 1998 @@ -8,7 +8,7 @@ /* * 'kernel_stat.h' contains the definitions needed for doing - * some kernel statistics (cpu usage, context switches ...), + * some kernel statistics (CPU usage, context switches ...), * used by rstatd/perfmeter */ diff -u --recursive --new-file v2.1.106/linux/include/linux/linux_logo.h linux/include/linux/linux_logo.h --- v2.1.106/linux/include/linux/linux_logo.h Wed Dec 31 16:00:00 1969 +++ linux/include/linux/linux_logo.h Wed Jun 24 14:44:02 1998 @@ -0,0 +1,1444 @@ +/* $Id: linux_logo.h,v 1.1 1998/05/04 14:21:03 jj Exp $ + * include/linux/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#if LINUX_LOGO_COLORS == 221 + +unsigned char linux_logo_red[] __initdata = { + 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, + 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xE5, + 0xF1, 0xED, 0xEE, 0xE6, 0xC6, 0xDA, 0xDD, 0xE5, + 0xD9, 0xC6, 0xE3, 0xD0, 0xC6, 0xBA, 0xB0, 0xB6, + 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xB0, 0xAD, + 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x9D, + 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, + 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, + 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x0D, 0x03, + 0x66, 0x44, 0x24, 0x08, 0xD6, 0xE6, 0xE9, 0xE6, + 0xE7, 0xCA, 0xDC, 0xDB, 0xD5, 0xD0, 0xC9, 0xE2, + 0xD5, 0xC6, 0xC4, 0xB3, 0xB2, 0xB9, 0xA9, 0x9A, + 0xB2, 0x9D, 0xE8, 0xEC, 0xF5, 0xF5, 0xF4, 0xF4, + 0xEC, 0xEE, 0xF0, 0xF5, 0xE0, 0xD6, 0xC5, 0xC2, + 0xD9, 0xD5, 0xD8, 0xD6, 0xF6, 0xF4, 0xED, 0xEC, + 0xEB, 0xF1, 0xF6, 0xF5, 0xF5, 0xEE, 0xEF, 0xEC, + 0xE7, 0xE3, 0xE6, 0xD6, 0xDD, 0xC3, 0xD6, 0xD7, + 0xCD, 0xCA, 0xC3, 0xAC, 0x95, 0x99, 0xB7, 0xA3, + 0x8B, 0x88, 0x95, 0x8A, 0x94, 0xD2, 0xCC, 0xC4, + 0xA8, 0x8E, 0x8F, 0xAE, 0xB8, 0xAC, 0xB6, 0xB4, + 0xAD, 0xA5, 0xA0, 0x9B, 0x8B, 0xA3, 0x94, 0x87, + 0x85, 0x89, 0x53, 0x80, 0x7D, 0x7C, 0x7A, 0x78, + 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, + 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, + 0x42, 0x0F, 0x75, 0x78, 0x7D, 0x72, 0x5F, 0x6E, + 0x7A, 0x75, 0x6A, 0x58, 0x48, 0x4F, 0x00, 0x2B, + 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x3B, 0x11, + 0x1D, 0x14, 0x06, 0x02, 0x00 +}; + +unsigned char linux_logo_green[] __initdata = { + 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, + 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xD3, + 0xDA, 0xD4, 0xD7, 0xCC, 0xC1, 0xCC, 0xCB, 0xC9, + 0xC5, 0xBC, 0xBC, 0xBB, 0xB7, 0xA5, 0xB0, 0xB6, + 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xAD, 0xAD, + 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x95, + 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, + 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, + 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x08, 0x02, + 0x53, 0x2E, 0x19, 0x06, 0xC6, 0xC8, 0xCF, 0xBD, + 0xB3, 0xB6, 0xB4, 0xAB, 0xA5, 0xA3, 0x9B, 0xB6, + 0xA7, 0x99, 0x92, 0xA4, 0x9E, 0x9D, 0x98, 0x8C, + 0x8A, 0x86, 0xCD, 0xCC, 0xC9, 0xD7, 0xCA, 0xC4, + 0xCA, 0xC3, 0xC7, 0xC3, 0xC8, 0xB4, 0x91, 0x8E, + 0x8A, 0x82, 0x87, 0x85, 0xBD, 0xBF, 0xB6, 0xBC, + 0xAE, 0xB7, 0xBC, 0xB8, 0xBF, 0xB6, 0xBC, 0xB5, + 0xAB, 0xA6, 0xAD, 0xB2, 0xA5, 0x87, 0x9C, 0x96, + 0x95, 0x8E, 0x87, 0x8F, 0x86, 0x86, 0x8E, 0x80, + 0x7A, 0x70, 0x7B, 0x78, 0x78, 0x7F, 0x77, 0x6F, + 0x70, 0x76, 0x59, 0x77, 0x68, 0x64, 0x7B, 0x7C, + 0x75, 0x6D, 0x77, 0x69, 0x65, 0x5F, 0x5B, 0x54, + 0x4F, 0x5B, 0x39, 0x80, 0x7D, 0x7C, 0x7A, 0x78, + 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, + 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, + 0x42, 0x0B, 0x69, 0x66, 0x64, 0x57, 0x4A, 0x4E, + 0x55, 0x4B, 0x46, 0x3B, 0x30, 0x33, 0x00, 0x2B, + 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x29, 0x0D, + 0x1D, 0x14, 0x06, 0x02, 0x00 +}; + +unsigned char linux_logo_blue[] __initdata = { + 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xEE, 0xE5, 0xDE, + 0xD7, 0xD3, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xB5, + 0xB0, 0xA6, 0xAC, 0x9B, 0xB5, 0xB5, 0xAE, 0x84, + 0x90, 0xA9, 0x81, 0x8D, 0x96, 0x86, 0xB0, 0xB6, + 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xA7, 0xAD, + 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA5, 0x87, + 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x9A, 0x9A, 0x99, + 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, + 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0xC8, 0xD7, + 0x9B, 0x8E, 0x8C, 0xB2, 0x77, 0x77, 0x4E, 0x77, + 0x69, 0x71, 0x78, 0x6B, 0x65, 0x66, 0x64, 0x59, + 0x5C, 0x5A, 0x48, 0x72, 0x7B, 0x6B, 0x67, 0x6E, + 0x42, 0x5B, 0x29, 0x36, 0x25, 0x10, 0x17, 0x14, + 0x19, 0x16, 0x13, 0x0E, 0x08, 0x2E, 0x2E, 0x3D, + 0x24, 0x24, 0x24, 0x24, 0x13, 0x12, 0x14, 0x14, + 0x0E, 0x08, 0x0D, 0x0F, 0x08, 0x0D, 0x0E, 0x08, + 0x08, 0x0C, 0x06, 0x06, 0x07, 0x16, 0x07, 0x0E, + 0x08, 0x0A, 0x07, 0x0D, 0x2D, 0x3E, 0x09, 0x4E, + 0x68, 0x52, 0x56, 0x58, 0x4B, 0x22, 0x20, 0x20, + 0x27, 0x39, 0x28, 0x19, 0x1E, 0x1E, 0x08, 0x06, + 0x07, 0x09, 0x08, 0x08, 0x05, 0x1D, 0x1F, 0x17, + 0x18, 0x06, 0x79, 0x80, 0x7D, 0x7C, 0x7A, 0x78, + 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x68, 0x65, 0x62, + 0x4B, 0x5B, 0x5F, 0x55, 0x56, 0x52, 0x4F, 0x46, + 0x42, 0x5A, 0x14, 0x23, 0x3D, 0x2B, 0x21, 0x14, + 0x06, 0x04, 0x03, 0x07, 0x09, 0x13, 0x2A, 0x3A, + 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x07, 0x09, + 0x1D, 0x14, 0x06, 0x02, 0x00 +}; + +unsigned char linux_logo[] __initdata = { + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, + 0x58, 0x58, 0x59, 0x5C, 0x5D, 0x5F, 0x60, 0x61, + 0x62, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, + 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x5E, 0x5E, + 0x5E, 0x5D, 0x5D, 0x5C, 0x5D, 0x5B, 0x58, 0x58, + 0x58, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, + 0x54, 0x56, 0x57, 0x67, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x67, 0x4C, + 0x4A, 0x49, 0x4A, 0x49, 0x4A, 0x49, 0x49, 0x4A, + 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x50, 0x51, 0x52, + 0x54, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, 0x58, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x58, 0x56, 0x56, 0x53, + 0x52, 0x53, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, + 0x4B, 0x4B, 0x4B, 0x4A, 0x49, 0x4A, 0x4A, 0x49, + 0x49, 0x49, 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4B, + 0x4C, 0x4D, 0x52, 0x54, 0x56, 0x55, 0x57, 0x58, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, + 0x50, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF0, 0xF4, 0xFB, + 0xFC, 0x67, 0x53, 0x50, 0x4D, 0x4C, 0x4C, 0x4C, + 0x4B, 0x4A, 0x4A, 0x48, 0x49, 0x48, 0x48, 0x49, + 0x49, 0x49, 0x4B, 0x4C, 0x50, 0x52, 0x53, 0x56, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x55, 0x54, 0x53, 0x51, 0x51, 0x50, 0x4C, 0x4D, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xD2, 0xD7, 0xF5, + 0xFC, 0xFC, 0x5D, 0x5D, 0x5C, 0x5C, 0x59, 0x58, + 0x58, 0x56, 0x52, 0x4C, 0x4B, 0x4A, 0x4A, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x49, 0x4B, 0x4D, 0x51, + 0x54, 0x56, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x55, 0x54, + 0x53, 0x52, 0x51, 0x4D, 0x4D, 0x4D, 0x50, 0x50, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0x64, 0xD9, 0xF5, + 0xF9, 0xFC, 0xFC, 0x64, 0x63, 0x62, 0x61, 0x61, + 0x61, 0x60, 0x5E, 0x5B, 0x5A, 0x54, 0x52, 0x4C, + 0x4B, 0x49, 0x49, 0x47, 0x47, 0x48, 0x49, 0x4B, + 0x4C, 0x51, 0x53, 0x56, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x55, 0x53, 0x53, + 0x51, 0x50, 0x50, 0x50, 0x50, 0x50, 0x53, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xF5, 0xF9, 0xFC, + 0xFC, 0xFC, 0xFC, 0x64, 0x64, 0x64, 0x64, 0x64, + 0x64, 0x64, 0x64, 0x63, 0x61, 0x61, 0x5E, 0x59, + 0x55, 0x52, 0x4C, 0x4A, 0x49, 0x47, 0x48, 0x48, + 0x49, 0x4B, 0x4D, 0x51, 0x54, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x55, 0x54, 0x54, 0x52, 0x51, + 0x51, 0x51, 0x51, 0x51, 0x53, 0x54, 0x59, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0x60, 0x60, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x64, 0x65, 0x65, 0x64, 0x63, + 0x61, 0x5E, 0x59, 0x56, 0x4D, 0x4B, 0x48, 0x48, + 0x48, 0x48, 0x49, 0x4B, 0x50, 0x53, 0x56, 0x56, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x56, 0x54, 0x53, 0x52, 0x51, 0x51, + 0x51, 0x52, 0x53, 0x55, 0x59, 0x5D, 0x5E, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0x4C, 0x4E, 0x51, 0x52, + 0x57, 0x5A, 0x5E, 0x60, 0x61, 0x63, 0x65, 0xCB, + 0x64, 0x64, 0x63, 0x60, 0x5C, 0x57, 0x50, 0x4B, + 0x48, 0x47, 0x47, 0x47, 0x4A, 0x4C, 0x52, 0x53, + 0x54, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x55, 0x54, 0x53, 0x53, 0x51, 0x52, 0x52, 0x53, + 0x53, 0x57, 0x5A, 0x5D, 0x5E, 0x5E, 0x60, 0xFC, + 0xFC, 0xFC, 0xFB, 0xF9, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFA, 0xF9, 0xF5, 0xFB, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x45, 0x3F, 0x3F, + 0x45, 0x48, 0x4B, 0x4D, 0x54, 0x5A, 0x5E, 0x61, + 0x63, 0xCB, 0xCB, 0x65, 0x64, 0x62, 0x5E, 0x57, + 0x50, 0x4B, 0x48, 0x47, 0x47, 0x48, 0x4B, 0x4D, + 0x51, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, + 0x54, 0x54, 0x53, 0x53, 0x52, 0x53, 0x54, 0x57, + 0x59, 0x5C, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0xFC, + 0xFC, 0xFA, 0xFC, 0xFA, 0xE0, 0xFC, 0xFC, 0xFC, + 0xFB, 0xFB, 0xFB, 0xDF, 0xD8, 0xF9, 0xE0, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x4C, 0x4A, 0x48, + 0x48, 0x3E, 0x44, 0x43, 0x3F, 0x47, 0x4B, 0x52, + 0x5A, 0x5E, 0x62, 0x64, 0xCB, 0xCB, 0x64, 0x61, + 0x5E, 0x57, 0x4D, 0x49, 0x47, 0x47, 0x48, 0x4A, + 0x4C, 0x52, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, + 0x54, 0x53, 0x53, 0x54, 0x54, 0x55, 0x58, 0x5B, + 0x5C, 0x5D, 0x5E, 0x5D, 0x5D, 0x5B, 0x58, 0xFC, + 0xFC, 0xD8, 0x4C, 0x60, 0xFC, 0xF5, 0xFC, 0xFC, + 0xFC, 0xF7, 0x5F, 0x48, 0x48, 0x2C, 0xF8, 0xF9, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x4A, 0x49, + 0x49, 0x49, 0x49, 0x47, 0x3E, 0x44, 0x42, 0x3F, + 0x3E, 0x4B, 0x54, 0x5C, 0x61, 0x64, 0xCB, 0xCB, + 0x64, 0x61, 0x5D, 0x53, 0x4B, 0x49, 0x47, 0x47, + 0x49, 0x4B, 0x50, 0x53, 0x56, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x55, 0x54, + 0x53, 0x53, 0x54, 0x56, 0x58, 0x5A, 0x5B, 0x5D, + 0x5D, 0x5D, 0x5C, 0x5A, 0x54, 0x52, 0x4C, 0xFC, + 0xF7, 0x4E, 0x2D, 0x29, 0x4E, 0xFC, 0xFC, 0xFC, + 0xFB, 0x5F, 0x26, 0x24, 0x20, 0x2E, 0x65, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x45, 0x3F, 0x45, + 0x3E, 0x47, 0x47, 0x47, 0x47, 0x47, 0x3E, 0x44, + 0x43, 0x40, 0x44, 0x49, 0x51, 0x5C, 0x62, 0x64, + 0xCB, 0xCB, 0x63, 0x60, 0x58, 0x50, 0x49, 0x48, + 0x48, 0x48, 0x4A, 0x4D, 0x53, 0x54, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x5C, 0x5D, + 0x5C, 0x5A, 0x54, 0x51, 0x4C, 0x4C, 0x54, 0xFC, + 0xF9, 0x23, 0xDB, 0x2D, 0x23, 0xFA, 0xFB, 0xFA, + 0xF5, 0x27, 0x21, 0xD9, 0xF8, 0x20, 0x21, 0xFB, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x5D, 0x58, 0x55, + 0x50, 0x48, 0x45, 0x43, 0x44, 0x44, 0x45, 0x45, + 0x3E, 0x3F, 0x43, 0x41, 0x3F, 0x48, 0x52, 0x5D, + 0x63, 0x65, 0xCB, 0x65, 0x61, 0x5D, 0x52, 0x4B, + 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, + 0x54, 0x58, 0x5A, 0x59, 0x5B, 0x5B, 0x5B, 0x5A, + 0x55, 0x52, 0x4D, 0x4D, 0x55, 0x5B, 0x5D, 0xFC, + 0xF1, 0xF9, 0xFC, 0xD4, 0x21, 0xCC, 0xF7, 0xF8, + 0xF2, 0x21, 0xD9, 0xFC, 0xF2, 0xFB, 0x21, 0x45, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xD1, 0xD0, 0xCD, + 0xCC, 0x63, 0x5E, 0x58, 0x50, 0x47, 0x43, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x40, 0x41, 0x3F, 0x4A, + 0x56, 0x5E, 0x64, 0xCB, 0x65, 0x63, 0x5E, 0x56, + 0x4C, 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, + 0x58, 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, + 0x57, 0x5A, 0x5A, 0x5C, 0x5B, 0x5A, 0x58, 0x54, + 0x51, 0x4C, 0x55, 0x5D, 0x5D, 0x5B, 0x54, 0xFC, + 0xF0, 0xF9, 0xFC, 0x65, 0x45, 0xCD, 0xFB, 0xFB, + 0xF8, 0x26, 0xFB, 0xFC, 0xFC, 0xFC, 0x21, 0x27, + 0xFB, 0xFC, 0xFC, 0xFC, 0xFB, 0xD7, 0x35, 0x34, + 0x2F, 0x35, 0x36, 0x2F, 0x2F, 0x36, 0x2F, 0x2F, + 0x36, 0x36, 0x35, 0x35, 0x43, 0x42, 0x41, 0x2E, + 0x45, 0x4C, 0x5B, 0x62, 0x65, 0xCC, 0x64, 0x60, + 0x58, 0x4D, 0x49, 0x47, 0x47, 0x49, 0x4C, 0x51, + 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x57, + 0x58, 0x5A, 0x5A, 0x5B, 0x5A, 0x55, 0x54, 0x51, + 0x53, 0x5C, 0x5D, 0x5D, 0x54, 0x4B, 0x4D, 0xFC, + 0xFC, 0x44, 0xFC, 0xFB, 0x7B, 0xAB, 0xA8, 0xAE, + 0xAB, 0x7F, 0xFC, 0xFC, 0xFB, 0xFB, 0x22, 0x2A, + 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x2F, 0x30, 0x30, + 0x32, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x2F, 0x2F, 0x40, 0x41, + 0x2E, 0x40, 0x48, 0x56, 0x5F, 0x64, 0xCC, 0x65, + 0x61, 0x59, 0x50, 0x49, 0x47, 0x47, 0x49, 0x4C, + 0x5A, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, + 0x5A, 0x5A, 0x5A, 0x58, 0x55, 0x52, 0x51, 0x5A, + 0x5D, 0x5D, 0x57, 0x4C, 0x51, 0x54, 0x5D, 0xFC, + 0xFC, 0x2A, 0xFC, 0xC9, 0xAA, 0x8B, 0x8A, 0x8C, + 0xAB, 0x8C, 0x8C, 0xFB, 0xFB, 0x23, 0x20, 0xF1, + 0xFC, 0xFC, 0xFC, 0x3B, 0x33, 0x33, 0x32, 0x32, + 0x31, 0x32, 0x30, 0x32, 0x32, 0x32, 0x32, 0x30, + 0x31, 0x31, 0x31, 0x32, 0x33, 0x33, 0x3C, 0x41, + 0x41, 0x2E, 0x2D, 0x45, 0x4D, 0x5D, 0x63, 0xCC, + 0x65, 0x62, 0x5D, 0x51, 0x49, 0x47, 0x47, 0x4A, + 0x59, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, + 0x5A, 0x5A, 0x58, 0x55, 0x53, 0x53, 0x5C, 0x5E, + 0x59, 0x51, 0x4E, 0x54, 0x59, 0x5E, 0x62, 0xFC, + 0xFC, 0xDB, 0xAA, 0xA1, 0x95, 0x9C, 0x8C, 0x88, + 0x82, 0x83, 0x83, 0x8C, 0x88, 0xAE, 0xB9, 0xFB, + 0xFC, 0xFC, 0xFC, 0x3C, 0x3B, 0x72, 0x38, 0x33, + 0x33, 0x33, 0x31, 0x33, 0x31, 0x31, 0x31, 0x31, + 0x33, 0x33, 0x38, 0x33, 0x72, 0x3B, 0x44, 0x2E, + 0x41, 0x2E, 0x2E, 0x2D, 0x43, 0x4B, 0x5B, 0x63, + 0xCB, 0xCC, 0x63, 0x5D, 0x51, 0x49, 0x47, 0x49, + 0x5C, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, + 0x58, 0x58, 0x57, 0x53, 0x58, 0x5D, 0x5E, 0x55, + 0x51, 0x53, 0x58, 0x5E, 0x60, 0x63, 0x64, 0xFC, + 0xFC, 0xC0, 0xA6, 0x9D, 0x8B, 0x9C, 0x8C, 0x8C, + 0x6E, 0x83, 0x88, 0x8C, 0x8C, 0x8C, 0x83, 0xE8, + 0xFB, 0xFC, 0xFC, 0xFC, 0x33, 0x70, 0x70, 0x6F, + 0x6F, 0x6F, 0x6F, 0x3A, 0x6F, 0x6D, 0x6F, 0x6F, + 0x70, 0x6F, 0x6F, 0x70, 0x6F, 0x32, 0x5A, 0x48, + 0x41, 0x2D, 0x2D, 0x2D, 0x2C, 0x41, 0x49, 0x5A, + 0x62, 0xCB, 0xCB, 0x63, 0x5D, 0x50, 0x49, 0x4A, + 0x5C, 0x58, 0x58, 0x57, 0x55, 0x57, 0x57, 0x57, + 0x57, 0x55, 0x56, 0x59, 0x5E, 0x5C, 0x52, 0x53, + 0x55, 0x5B, 0x5E, 0x61, 0x63, 0x64, 0x63, 0xFC, + 0xE8, 0xBF, 0xA4, 0x99, 0x9C, 0x8C, 0x88, 0x88, + 0x6E, 0x88, 0x8C, 0x8C, 0x8C, 0xC2, 0xA6, 0xC4, + 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x3A, 0x6F, 0x70, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0x70, 0x70, 0x70, 0x70, 0x37, 0x32, 0xCD, 0x5E, + 0x4C, 0x43, 0x2C, 0x2D, 0x2D, 0x2C, 0x2E, 0x47, + 0x57, 0x61, 0x65, 0xCC, 0x63, 0x5C, 0x50, 0x4D, + 0x5C, 0x5A, 0x57, 0x55, 0x55, 0x55, 0x58, 0x58, + 0x55, 0x54, 0x5B, 0x5E, 0x5D, 0x53, 0x53, 0x55, + 0x5D, 0x5E, 0x61, 0x61, 0x61, 0x61, 0x5E, 0xFC, + 0xEA, 0xBE, 0xA4, 0x9B, 0x8B, 0x85, 0x8C, 0x6E, + 0x8C, 0x8C, 0x8C, 0xA3, 0xAA, 0xA4, 0xA4, 0xE9, + 0xFB, 0xFC, 0xFC, 0xFC, 0x36, 0x6D, 0x70, 0x73, + 0x70, 0x70, 0x70, 0x73, 0x73, 0x73, 0x73, 0x70, + 0x70, 0x70, 0x73, 0x70, 0x37, 0x38, 0xD1, 0xCF, + 0x61, 0x4D, 0x44, 0x2C, 0x2D, 0x2E, 0x2C, 0x2E, + 0x3E, 0x56, 0x61, 0xCB, 0xCC, 0x62, 0x5B, 0x57, + 0x59, 0x58, 0x55, 0x54, 0x54, 0x55, 0x58, 0x58, + 0x58, 0x5B, 0x5E, 0x5B, 0x53, 0x55, 0x55, 0x5C, + 0x5E, 0x61, 0x61, 0x60, 0x5D, 0x5A, 0x4E, 0xFC, + 0xFC, 0xEA, 0xAA, 0x9C, 0x8A, 0x85, 0x82, 0x8C, + 0x8C, 0xA8, 0xEB, 0xA8, 0xA4, 0xA4, 0xAA, 0xFC, + 0xFC, 0xFC, 0x64, 0xFB, 0x39, 0x31, 0x72, 0x78, + 0x73, 0x78, 0x73, 0x74, 0x74, 0x74, 0x74, 0x73, + 0x78, 0x70, 0x73, 0x73, 0x33, 0xCC, 0xD2, 0xD1, + 0xCE, 0x62, 0x53, 0x3F, 0x2D, 0x2D, 0x41, 0x2C, + 0x2E, 0x3E, 0x56, 0x62, 0xCB, 0xCB, 0x61, 0x5D, + 0x54, 0x54, 0x54, 0x54, 0x56, 0x58, 0x58, 0x58, + 0x5C, 0x5E, 0x5A, 0x55, 0x58, 0x58, 0x5B, 0x5E, + 0x61, 0x5E, 0x5D, 0x5A, 0x52, 0x55, 0xCD, 0xFC, + 0xFC, 0x34, 0xC9, 0xE8, 0xA8, 0xAE, 0xC2, 0xE8, + 0xC3, 0xA6, 0xA7, 0xA6, 0xAA, 0x78, 0x2E, 0x42, + 0xFC, 0xFC, 0xD2, 0x64, 0xF8, 0x31, 0x72, 0x73, + 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x74, 0x73, + 0x73, 0x73, 0x73, 0x72, 0x33, 0x5C, 0x64, 0xD2, + 0xD1, 0xCF, 0x63, 0x54, 0x3F, 0x2C, 0x41, 0x41, + 0x2C, 0x2E, 0x47, 0x58, 0x63, 0xCB, 0xCB, 0x62, + 0x52, 0x53, 0x53, 0x56, 0x58, 0x58, 0x5A, 0x5B, + 0x5E, 0x5A, 0x57, 0x58, 0x58, 0x58, 0x60, 0x60, + 0x5D, 0x5A, 0x55, 0x4E, 0x64, 0xD2, 0xD1, 0xFC, + 0xFC, 0x41, 0x3E, 0xC1, 0xC0, 0xA3, 0xA6, 0xA7, + 0xA7, 0xA9, 0xAA, 0xB8, 0x2E, 0x3F, 0x2C, 0x41, + 0xFC, 0xFC, 0xF7, 0xCE, 0xCD, 0x36, 0x72, 0x73, + 0x74, 0x75, 0x78, 0x75, 0x75, 0x75, 0x74, 0x74, + 0x74, 0x74, 0x78, 0x72, 0x6D, 0x49, 0x59, 0xCB, + 0xD1, 0xD1, 0xD2, 0xCB, 0x56, 0x3F, 0x2C, 0x41, + 0x40, 0x2D, 0x2E, 0x49, 0x5B, 0x64, 0xCC, 0x64, + 0x51, 0x53, 0x53, 0x55, 0x58, 0x59, 0x5B, 0x5E, + 0x59, 0x58, 0x58, 0x58, 0x55, 0x60, 0x60, 0x5C, + 0x5A, 0x53, 0x5B, 0xD0, 0xD3, 0xD3, 0xD3, 0xFB, + 0xFC, 0x40, 0x41, 0x45, 0xC4, 0xC0, 0xBE, 0xBE, + 0xC1, 0xC0, 0x3C, 0x47, 0x2E, 0x21, 0x22, 0x20, + 0x65, 0xFC, 0xFC, 0xFC, 0xFC, 0x6D, 0x72, 0x75, + 0x78, 0x76, 0x75, 0x79, 0x76, 0x76, 0x76, 0x76, + 0x75, 0x75, 0x75, 0x72, 0x6D, 0x2E, 0x48, 0x5D, + 0xCE, 0xD1, 0xD4, 0xD3, 0xCB, 0x56, 0x43, 0x2C, + 0x42, 0x43, 0x2E, 0x2E, 0x4A, 0x5D, 0x64, 0x64, + 0x50, 0x52, 0x56, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, + 0x5A, 0x58, 0x58, 0x55, 0x61, 0x60, 0x58, 0x58, + 0x4E, 0x61, 0xD1, 0xD4, 0xD4, 0xD1, 0xEE, 0xFC, + 0xFC, 0x2B, 0x29, 0x2E, 0x3F, 0xB0, 0xAD, 0x81, + 0x46, 0x2D, 0x46, 0x2C, 0x24, 0x22, 0x22, 0x23, + 0x25, 0xFC, 0xFC, 0xFC, 0xFC, 0x6E, 0x73, 0x76, + 0x76, 0x79, 0x79, 0x79, 0x76, 0x76, 0x79, 0x76, + 0x79, 0x79, 0x79, 0x74, 0x3F, 0x41, 0x2C, 0x48, + 0x5F, 0xCF, 0xD5, 0xD7, 0xD6, 0xCD, 0x57, 0x40, + 0x2E, 0x3F, 0x44, 0x2E, 0x41, 0x4C, 0x60, 0x61, + 0x51, 0x53, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, 0x5C, + 0x58, 0x57, 0x54, 0x5F, 0x5E, 0x55, 0x55, 0x52, + 0x64, 0xD4, 0xD5, 0xD4, 0xD1, 0x5D, 0xFA, 0xFB, + 0xF4, 0x21, 0x24, 0x41, 0x40, 0x44, 0x2E, 0x2E, + 0x42, 0x41, 0x2A, 0x24, 0x22, 0x22, 0x22, 0x22, + 0x23, 0xD9, 0xFC, 0xFC, 0xFC, 0xFC, 0xE5, 0xB8, + 0x8F, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, + 0x8F, 0x8F, 0xB8, 0xE5, 0x3F, 0x3E, 0x43, 0x2C, + 0x48, 0x61, 0xD1, 0xD7, 0xD9, 0xD7, 0xD0, 0x57, + 0x41, 0x2E, 0x3E, 0x44, 0x2D, 0x40, 0x52, 0x5D, + 0x53, 0x55, 0x59, 0x5D, 0x5E, 0x5E, 0x5D, 0x5A, + 0x57, 0x53, 0x5E, 0x5E, 0x54, 0x53, 0x54, 0x65, + 0xD5, 0xD6, 0xD4, 0xCE, 0x53, 0xFB, 0xF9, 0xFC, + 0x24, 0x22, 0x23, 0x23, 0x41, 0x42, 0x2E, 0x40, + 0x2B, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x23, 0x23, 0xFC, 0xFC, 0xFC, 0xFC, 0xE7, 0xBD, + 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0xB5, 0xC6, 0xEB, 0x2D, 0x47, 0x4A, 0x47, + 0x2C, 0x3E, 0x61, 0xD4, 0xDC, 0xDC, 0xDA, 0xCF, + 0x54, 0x41, 0x41, 0x3E, 0x45, 0x2C, 0x3F, 0x4A, + 0x58, 0x5A, 0x5C, 0x5F, 0x60, 0x5E, 0x5D, 0x57, + 0x51, 0x5D, 0x5D, 0x51, 0x53, 0x53, 0xCB, 0xD5, + 0xD6, 0xD5, 0x63, 0x55, 0xFC, 0xFC, 0xFC, 0x2C, + 0x23, 0x22, 0x23, 0x22, 0x20, 0x2D, 0x2C, 0x26, + 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xF0, 0xFC, 0xFC, 0xFC, 0xE2, 0xC6, + 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0xC7, 0xE3, 0x3E, 0x2E, 0x49, 0x52, + 0x4C, 0x41, 0x44, 0x62, 0xD6, 0xDE, 0xDE, 0xD9, + 0xD0, 0x51, 0x2E, 0x40, 0x47, 0x44, 0x2C, 0x42, + 0x5D, 0x5D, 0x5F, 0x60, 0x60, 0x5D, 0x57, 0x51, + 0x58, 0x5D, 0x4E, 0x52, 0x55, 0x64, 0xD5, 0xD6, + 0xD4, 0x61, 0x59, 0x6B, 0xFC, 0xFC, 0xFC, 0x21, + 0x23, 0x22, 0x23, 0x22, 0x23, 0x21, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0x24, 0xFC, 0xFC, 0xFC, 0xE2, 0xC7, + 0xB5, 0x90, 0x93, 0x93, 0x93, 0x90, 0x93, 0x93, + 0x90, 0xB5, 0xC8, 0xE4, 0x5F, 0x45, 0x2E, 0x4D, + 0x57, 0x57, 0x44, 0x43, 0x63, 0xDA, 0xDF, 0xDF, + 0xD9, 0xCE, 0x4C, 0x2C, 0x3F, 0x3E, 0x40, 0x40, + 0x60, 0x5E, 0x61, 0x61, 0x5E, 0x5B, 0x53, 0x52, + 0x5C, 0x52, 0x52, 0x55, 0x61, 0xD4, 0xD5, 0xD1, + 0x5E, 0x5B, 0x5C, 0xFB, 0xFC, 0xFC, 0x2A, 0x21, + 0x23, 0x22, 0x23, 0x22, 0x22, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0xFB, 0xFC, 0xFC, 0xB3, 0xC8, + 0xB5, 0x90, 0x92, 0xB5, 0x93, 0x93, 0xB5, 0x93, + 0x92, 0xB5, 0xC8, 0xB9, 0xD0, 0x5E, 0x44, 0x40, + 0x52, 0x58, 0x57, 0x48, 0x40, 0x63, 0xD9, 0xE0, + 0xE0, 0xD9, 0xCB, 0x49, 0x2D, 0x3F, 0x45, 0x3F, + 0x63, 0x61, 0x62, 0x60, 0x5E, 0x55, 0x4D, 0x59, + 0x53, 0x4E, 0x54, 0x5D, 0xD2, 0xD4, 0xD2, 0x5E, + 0x5C, 0x5D, 0xFC, 0xFC, 0xFC, 0xF8, 0x29, 0x23, + 0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x23, 0x22, 0x22, 0x23, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x22, 0x22, 0xF0, 0xFC, 0xFC, 0xB3, 0xC7, + 0xB5, 0x93, 0xB5, 0x93, 0x93, 0x91, 0x93, 0x93, + 0x91, 0xB5, 0xC7, 0xAD, 0xD6, 0xD2, 0x5E, 0x3F, + 0x3F, 0x57, 0x57, 0x58, 0x4A, 0x41, 0x64, 0xDC, + 0xF1, 0xDF, 0xDA, 0x61, 0x45, 0x2E, 0x43, 0x47, + 0xCB, 0x63, 0x62, 0x5F, 0x58, 0x51, 0x53, 0x54, + 0x4C, 0x52, 0x5C, 0xCD, 0xD3, 0xD2, 0x60, 0x5D, + 0x5D, 0xFB, 0xFC, 0xFC, 0xFC, 0xDB, 0x49, 0x24, + 0x21, 0x23, 0x23, 0x22, 0x26, 0x26, 0x2A, 0x24, + 0x22, 0x23, 0x22, 0x21, 0x24, 0x26, 0x26, 0x2A, + 0x29, 0x2B, 0x24, 0x25, 0xFC, 0xFC, 0xB3, 0xC5, + 0x91, 0x91, 0x92, 0x91, 0x92, 0x92, 0x93, 0x93, + 0x91, 0x93, 0xC6, 0xAD, 0xDC, 0xD9, 0xD4, 0x60, + 0x43, 0x45, 0x58, 0x58, 0x57, 0x4B, 0x43, 0xCC, + 0xDD, 0xF1, 0xD8, 0xD5, 0x5D, 0x43, 0x41, 0x47, + 0xCD, 0x63, 0x62, 0x5D, 0x54, 0x4C, 0x55, 0x4B, + 0x51, 0x58, 0x62, 0xD0, 0xD0, 0x62, 0x5D, 0x5D, + 0x67, 0xFC, 0xFC, 0xFC, 0xFC, 0x58, 0x4E, 0x28, + 0x2A, 0x20, 0x23, 0x22, 0x23, 0x2A, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x23, 0x25, 0x2A, 0x2E, 0x2D, + 0x2E, 0x2E, 0x2E, 0x23, 0xFA, 0xFC, 0xB2, 0xBD, + 0xB5, 0x90, 0x91, 0x93, 0x92, 0x90, 0x91, 0x93, + 0x92, 0x91, 0xBD, 0xAD, 0xDE, 0xE0, 0xD8, 0xD7, + 0x61, 0x40, 0x48, 0x58, 0x58, 0x58, 0x48, 0x44, + 0xCF, 0xDE, 0xE0, 0xDD, 0xD0, 0x52, 0x41, 0x45, + 0xCD, 0x63, 0x61, 0x58, 0x4D, 0x51, 0x4C, 0x4B, + 0x54, 0x5D, 0xCC, 0xCE, 0x63, 0x61, 0x5D, 0x5D, + 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x27, 0x21, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x24, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x20, + 0x27, 0x2B, 0x41, 0x2B, 0x23, 0xFC, 0xB2, 0xB6, + 0x93, 0x90, 0x92, 0xB5, 0x92, 0x90, 0xB5, 0x90, + 0x92, 0x93, 0xBC, 0xAD, 0xDC, 0xF1, 0xF3, 0xF0, + 0xD9, 0x61, 0x41, 0x4A, 0x58, 0x57, 0x57, 0x44, + 0x49, 0xD2, 0xDD, 0xD8, 0xDA, 0x63, 0x4A, 0x45, + 0xCC, 0x63, 0x5E, 0x52, 0x4B, 0x4C, 0x49, 0x51, + 0x5C, 0x61, 0xCD, 0x65, 0x63, 0x5E, 0x4E, 0xCF, + 0xFB, 0xFB, 0xF0, 0xFC, 0xD2, 0x2A, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x26, 0x41, 0x27, 0xF9, 0x81, 0xB7, + 0xB5, 0x91, 0x92, 0xB5, 0x91, 0xB5, 0x93, 0xB5, + 0x93, 0xB6, 0xB7, 0xB9, 0xCB, 0xD8, 0xF3, 0xF2, + 0xF2, 0xDB, 0x61, 0x2D, 0x51, 0x58, 0x57, 0x58, + 0x41, 0x51, 0xD4, 0xDB, 0xDC, 0xD1, 0x5B, 0x4C, + 0xCB, 0x62, 0x59, 0x4C, 0x4A, 0x49, 0x4B, 0x55, + 0x60, 0x64, 0xCC, 0x64, 0x5E, 0x55, 0x60, 0xE1, + 0xFB, 0xF8, 0xFC, 0xFC, 0x21, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x21, 0x24, 0x2D, 0x21, 0xB4, 0xBB, + 0xB6, 0xB5, 0xB6, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6, + 0xB6, 0xB6, 0xBB, 0xB9, 0x45, 0xCB, 0xDF, 0xF3, + 0xF3, 0xF3, 0xDB, 0x5E, 0x2C, 0x51, 0x58, 0x58, + 0x52, 0x2D, 0x5C, 0xD4, 0xD9, 0xD5, 0x63, 0x58, + 0x64, 0x60, 0x53, 0x49, 0x4A, 0x49, 0x52, 0x5C, + 0x63, 0xCD, 0xCD, 0x63, 0x5C, 0x4E, 0x65, 0xFC, + 0xFC, 0xF5, 0xFC, 0xD2, 0x23, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x21, 0x22, 0x25, 0x29, 0xB3, 0xC7, + 0xB5, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, + 0xB6, 0xB5, 0xC7, 0xAD, 0x57, 0x3F, 0xCB, 0xF0, + 0xF3, 0xF3, 0xF2, 0xD9, 0x58, 0x41, 0x4C, 0x58, + 0x57, 0x47, 0x42, 0x62, 0xD4, 0xD4, 0xCC, 0x60, + 0x63, 0x5D, 0x50, 0x47, 0x48, 0x4B, 0x58, 0x60, + 0xCC, 0xCE, 0xCD, 0x60, 0x53, 0x5C, 0x62, 0xFB, + 0xF9, 0xFC, 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x23, 0x23, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0x81, 0xC7, + 0xB7, 0xB7, 0xBC, 0xB7, 0xBC, 0xBC, 0xBC, 0xB7, + 0xB7, 0xB7, 0xC8, 0x80, 0x58, 0x57, 0x40, 0xCE, + 0xF3, 0xF2, 0xF2, 0xF0, 0xD5, 0x4C, 0x3F, 0x4B, + 0x52, 0x50, 0x2D, 0x4B, 0x64, 0xD2, 0xCC, 0x61, + 0x60, 0x58, 0x4A, 0x47, 0x47, 0x4C, 0x59, 0x64, + 0xD0, 0xD0, 0x64, 0x59, 0x49, 0x5D, 0xFB, 0xFC, + 0xD9, 0xFC, 0xD6, 0x23, 0x22, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x23, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0xB4, 0xC8, + 0xBD, 0xB7, 0xBD, 0xBC, 0xBD, 0xC5, 0xBC, 0xC5, + 0xBC, 0xBD, 0xC7, 0xAC, 0x58, 0x57, 0x58, 0x2C, + 0xD1, 0xF0, 0xF3, 0xF3, 0xE0, 0xCD, 0x45, 0x3E, + 0x48, 0x4B, 0x3F, 0x41, 0x56, 0x64, 0x65, 0x62, + 0x5D, 0x52, 0x47, 0x48, 0x48, 0x53, 0x60, 0xCC, + 0xD2, 0xD0, 0x63, 0x52, 0x4E, 0x53, 0xFB, 0xFB, + 0xFC, 0xFC, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x23, 0x20, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, 0xB4, 0xC7, + 0xC5, 0xBC, 0xC5, 0xBD, 0xC5, 0xC5, 0xBD, 0xC5, + 0xBC, 0xC6, 0xC7, 0xB9, 0x58, 0x57, 0x58, 0x57, + 0x2D, 0xD4, 0xF1, 0xF2, 0xF0, 0xD9, 0x5D, 0x47, + 0x48, 0x3F, 0x42, 0x2C, 0x48, 0x5C, 0x5F, 0x60, + 0x58, 0x50, 0x47, 0x4A, 0x49, 0x55, 0x63, 0xD0, + 0xD2, 0xCD, 0x5D, 0x49, 0x4E, 0xE1, 0xFC, 0xF0, + 0xFC, 0xF8, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x20, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, 0xC4, 0xC8, + 0xBD, 0xBD, 0xC6, 0xBD, 0xC6, 0xC6, 0xC5, 0xC6, + 0xBD, 0xC6, 0xC7, 0xE4, 0x54, 0x57, 0x58, 0x57, + 0x57, 0x43, 0xD7, 0xE0, 0xF1, 0xD8, 0xCD, 0x4B, + 0x4A, 0x47, 0x42, 0x2C, 0x3F, 0x4D, 0x58, 0x5C, + 0x52, 0x4B, 0x48, 0x4B, 0x4A, 0x58, 0xCB, 0xD3, + 0xD2, 0xCD, 0x58, 0x47, 0x4A, 0xFC, 0xFC, 0xFB, + 0xFC, 0x2B, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x26, 0x21, 0x21, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0xE5, 0xC8, + 0xBA, 0xC5, 0xC6, 0xC6, 0xC6, 0xC7, 0xC6, 0xC7, + 0xC5, 0xC6, 0xC8, 0xE5, 0x2E, 0x54, 0x58, 0x57, + 0x57, 0x4C, 0x4D, 0xDA, 0xD8, 0xD8, 0xD4, 0x5C, + 0x4B, 0x4B, 0x3F, 0x42, 0x44, 0x4A, 0x51, 0x58, + 0x4B, 0x48, 0x4B, 0x51, 0x4D, 0x5F, 0xD0, 0xD1, + 0xD0, 0x64, 0x51, 0x44, 0x6B, 0xFC, 0xFB, 0xFC, + 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x26, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0xE5, 0xED, + 0xE7, 0xBA, 0xC8, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7, + 0xC7, 0xE5, 0xED, 0xE6, 0x61, 0x41, 0x52, 0x58, + 0x58, 0x57, 0x45, 0x5E, 0xD7, 0xDD, 0xD5, 0x60, + 0x4B, 0x4C, 0x48, 0x4D, 0x4D, 0x50, 0x4D, 0x56, + 0x4A, 0x3E, 0x53, 0x53, 0x52, 0x63, 0xD3, 0xD0, + 0xCE, 0x60, 0x4A, 0x45, 0xFC, 0xFC, 0xF7, 0xFC, + 0xFC, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x21, 0x2A, 0x20, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x21, 0x23, 0xEB, 0xF6, + 0xF6, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, + 0xF6, 0xF6, 0xF6, 0xE6, 0xDB, 0x58, 0x45, 0x4B, + 0x58, 0x57, 0x4D, 0x4B, 0x64, 0xD4, 0xD0, 0x5C, + 0x48, 0x51, 0x4C, 0x5D, 0x5E, 0x5C, 0x56, 0x59, + 0x3E, 0x4A, 0x58, 0x54, 0x52, 0x65, 0xD3, 0xD0, + 0xCF, 0x5D, 0x48, 0xFC, 0xFC, 0xFC, 0xFA, 0xFC, + 0xFC, 0x21, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x21, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x21, 0x4F, 0xE6, 0xC6, + 0xC6, 0xBD, 0xC6, 0xBD, 0xBD, 0xBD, 0xBD, 0xC6, + 0xC5, 0xBA, 0xC7, 0xE6, 0xF2, 0xD4, 0x49, 0x4B, + 0x3E, 0x4D, 0x52, 0x3E, 0x52, 0x63, 0x64, 0x56, + 0x48, 0x54, 0x4D, 0x61, 0xCC, 0xCC, 0x60, 0x60, + 0x47, 0x4D, 0x5C, 0x53, 0x58, 0xCF, 0xD1, 0xCF, + 0xD0, 0x59, 0x45, 0xFC, 0xFC, 0xFC, 0xEF, 0xF9, + 0xFC, 0x21, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x23, 0x4F, 0xE4, 0xB9, + 0xAF, 0x80, 0x80, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, + 0x80, 0xB4, 0xB9, 0xE4, 0x7F, 0xDE, 0x61, 0x52, + 0x54, 0x48, 0x3F, 0x43, 0x4D, 0x56, 0x59, 0x4B, + 0x3E, 0x58, 0x53, 0x61, 0xD3, 0xD4, 0xCF, 0xCD, + 0x4C, 0x58, 0x5F, 0x53, 0x5E, 0xD3, 0xD0, 0xCE, + 0xCE, 0x52, 0x3F, 0xFC, 0xFC, 0xFC, 0xF7, 0x65, + 0xFA, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x21, 0x2A, 0x23, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x21, 0xB1, 0xE4, 0xE6, + 0x7C, 0xB1, 0x7C, 0xB1, 0xB2, 0xB2, 0xB3, 0x3D, + 0xB3, 0x3C, 0xE5, 0xB3, 0xB0, 0xF1, 0xD0, 0x58, + 0x5D, 0x4D, 0x40, 0x41, 0x48, 0x51, 0x4C, 0x3F, + 0x3F, 0x4D, 0x5A, 0x5A, 0xD5, 0xD9, 0xD7, 0xD4, + 0x57, 0x5E, 0x61, 0x4C, 0x63, 0xD4, 0xCF, 0xCE, + 0xCB, 0x4D, 0x4A, 0xFC, 0xFC, 0xFC, 0xFC, 0xF0, + 0xFB, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x23, 0x22, 0x23, 0x23, 0xB1, 0x81, 0x7D, + 0x39, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x7C, 0xB2, 0xB0, 0xDF, 0xD2, 0x57, + 0x60, 0x59, 0x5B, 0x59, 0x52, 0x4C, 0x4A, 0x40, + 0x42, 0x4A, 0x53, 0x4D, 0xD2, 0xDE, 0xDE, 0xD9, + 0x5E, 0x5E, 0x60, 0x4A, 0xCD, 0xD1, 0xCF, 0xCE, + 0x63, 0x49, 0x5C, 0xFB, 0xE8, 0x89, 0x9F, 0xFC, + 0xD6, 0x21, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x21, 0x2A, 0x22, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x7F, 0xB9, + 0x71, 0x6C, 0x38, 0x38, 0x33, 0x33, 0x33, 0x38, + 0x38, 0x71, 0xAD, 0xE4, 0xD3, 0xDA, 0xCC, 0x52, + 0x63, 0x60, 0xCE, 0xD4, 0xCF, 0x60, 0x4C, 0x40, + 0x3F, 0x45, 0x4B, 0x5A, 0xCB, 0xD8, 0xDE, 0xDC, + 0x5E, 0x5E, 0x5F, 0x4C, 0xD2, 0xD2, 0xCF, 0xCF, + 0x61, 0x45, 0x5E, 0xA7, 0x9D, 0x95, 0x8B, 0x99, + 0xFC, 0x41, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x2A, 0x23, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x77, 0x77, 0xF6, + 0xFC, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, + 0x7D, 0xFC, 0x47, 0x64, 0xD0, 0xD0, 0x5D, 0x4B, + 0x62, 0xCC, 0xD1, 0xDE, 0xDE, 0xD4, 0x5E, 0x43, + 0x3F, 0x3E, 0x48, 0x53, 0x58, 0xDB, 0xD8, 0xDC, + 0x5E, 0x5E, 0x5E, 0x53, 0xD4, 0xD2, 0xD0, 0xD0, + 0x5E, 0x49, 0xA7, 0xA6, 0x89, 0x95, 0x8B, 0x9C, + 0x9C, 0xFB, 0xD4, 0x22, 0x22, 0x22, 0x22, 0x23, + 0x22, 0x23, 0x23, 0x2A, 0x22, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x23, 0x22, 0x23, 0x23, 0x98, 0x8C, 0x8C, 0x88, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, + 0xE9, 0x9C, 0x48, 0x5C, 0xD0, 0xCB, 0x48, 0x49, + 0x5B, 0xCB, 0xCD, 0xE0, 0xF1, 0xDD, 0xD0, 0x4A, + 0x41, 0x47, 0x45, 0x4C, 0x48, 0xD7, 0xDE, 0xDC, + 0x5E, 0x5E, 0x5A, 0x58, 0xD1, 0xD0, 0xD0, 0xD2, + 0x5C, 0x55, 0xA7, 0xA6, 0x87, 0x86, 0x89, 0x94, + 0x9C, 0xA9, 0xFC, 0xF4, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x23, 0xA4, 0x89, 0x8C, 0xAA, + 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, + 0x85, 0x88, 0x8D, 0x59, 0x64, 0x63, 0x47, 0x3E, + 0x4C, 0x60, 0x61, 0xE0, 0xF0, 0xDF, 0xD9, 0x5D, + 0x2E, 0x3E, 0x3E, 0x47, 0x4D, 0xCD, 0xDE, 0xDC, + 0x5D, 0x5C, 0x51, 0x5D, 0xD1, 0xD2, 0xD2, 0xD4, + 0x5A, 0xBE, 0xA7, 0x98, 0x8A, 0x8A, 0xA0, 0x8B, + 0x86, 0x86, 0xF7, 0xFC, 0xF7, 0x26, 0x23, 0x23, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x21, 0x21, 0x21, 0xA1, 0x98, 0x9F, 0xBF, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xA7, + 0x8C, 0x86, 0x8D, 0x59, 0x5E, 0x5D, 0x3F, 0x3E, + 0x47, 0x53, 0x63, 0xD9, 0xF0, 0xF1, 0xDE, 0xD0, + 0x43, 0x3E, 0x47, 0x45, 0x4A, 0x5B, 0xDC, 0xDA, + 0x5D, 0x59, 0x49, 0x5F, 0xD1, 0xD2, 0xD3, 0xB9, + 0xA5, 0xA7, 0x98, 0x9B, 0x96, 0x9D, 0x89, 0x89, + 0x8B, 0x9C, 0x9D, 0xFC, 0xFC, 0xFC, 0x26, 0x22, + 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x29, 0x2D, 0x99, 0x99, 0xA2, 0xAA, + 0xC4, 0xFB, 0xFC, 0xFC, 0xFC, 0xF6, 0xBF, 0xA2, + 0x9C, 0x9C, 0x8E, 0xDC, 0xCD, 0x51, 0x41, 0x3E, + 0x45, 0x49, 0x58, 0xCD, 0xE0, 0xE0, 0xD8, 0xDA, + 0x4C, 0x4A, 0x45, 0x45, 0x48, 0x47, 0xDA, 0xDA, + 0x5C, 0x58, 0x44, 0x69, 0xA9, 0x98, 0xA4, 0xA6, + 0xA1, 0xA4, 0x99, 0x9E, 0x9D, 0x8B, 0x8A, 0x97, + 0x87, 0x9A, 0x8A, 0xC2, 0xFC, 0xFC, 0xFC, 0x4D, + 0x21, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, + 0x21, 0x22, 0x2D, 0x34, 0xA4, 0xA2, 0xA2, 0xA9, + 0xBF, 0xC0, 0xC3, 0xC1, 0xC0, 0xBE, 0xA6, 0x9D, + 0x99, 0x87, 0xA2, 0xF1, 0xDC, 0x64, 0x42, 0x45, + 0x47, 0x3E, 0x49, 0x4C, 0xDD, 0xDF, 0xD8, 0xDB, + 0x5E, 0x4C, 0x48, 0x45, 0x45, 0x41, 0xD1, 0xD6, + 0x5A, 0x55, 0x3F, 0xA7, 0xA1, 0x98, 0x9F, 0x99, + 0x9F, 0x9D, 0x9A, 0x95, 0x8B, 0x97, 0x89, 0x8A, + 0x88, 0x94, 0x9C, 0x8C, 0xFC, 0xFC, 0xFC, 0xFC, + 0xF4, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x23, 0x23, 0x2C, 0x2C, 0xA8, 0xA2, 0xA4, 0xA4, + 0xA9, 0xAA, 0xAA, 0xAA, 0xA9, 0xA6, 0x98, 0x9C, + 0x8B, 0x88, 0x98, 0x8D, 0xD8, 0xD6, 0x4E, 0x47, + 0x47, 0x49, 0x47, 0x3F, 0xDA, 0xDD, 0xDE, 0xDD, + 0xCC, 0x4A, 0x4B, 0x3E, 0x45, 0x43, 0x61, 0xD4, + 0x56, 0x51, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0x9A, + 0xA0, 0xA2, 0x98, 0x98, 0x8B, 0x8B, 0x98, 0x98, + 0x84, 0x8B, 0x94, 0x8A, 0xA4, 0xFC, 0xFC, 0xFC, + 0xFC, 0xF2, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x22, 0x2C, 0x2D, 0xC0, 0xA4, 0xA2, 0xA4, + 0xA4, 0xA6, 0xA6, 0xA6, 0xA4, 0xA2, 0x9F, 0x89, + 0x8B, 0x9C, 0x9C, 0x8B, 0x68, 0xDB, 0x5F, 0x4B, + 0x3E, 0x49, 0x4B, 0x3E, 0xCC, 0xDA, 0xDC, 0xDD, + 0xD3, 0x49, 0x52, 0x48, 0x45, 0x45, 0x53, 0xD0, + 0x51, 0x4A, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0xA0, + 0x9B, 0x86, 0x89, 0x98, 0x89, 0x8A, 0x96, 0x8A, + 0x9C, 0x89, 0x89, 0x9C, 0x8C, 0xF6, 0xFC, 0xFC, + 0xFC, 0xFC, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, + 0x22, 0x21, 0x2B, 0x34, 0xC0, 0xA8, 0xA4, 0xA2, + 0xA2, 0x98, 0xA1, 0xA0, 0x98, 0x9F, 0x95, 0x8A, + 0x94, 0xA1, 0x8A, 0x84, 0x9B, 0x68, 0xCC, 0x49, + 0x4A, 0x47, 0x4C, 0x4B, 0x51, 0xD3, 0xDA, 0xDC, + 0xD5, 0x56, 0x56, 0x4A, 0x3E, 0x45, 0x48, 0x63, + 0x4A, 0x47, 0x3E, 0xA7, 0x98, 0x9D, 0x9E, 0x8B, + 0x95, 0x9B, 0x89, 0x86, 0x9B, 0x8B, 0x89, 0x84, + 0x9A, 0xA1, 0x95, 0x9A, 0x8C, 0xA4, 0xFC, 0xFC, + 0xFC, 0xFA, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, + 0x21, 0x23, 0x2C, 0xF6, 0xBF, 0xA9, 0xA2, 0x99, + 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9B, 0x87, 0x8B, + 0x9C, 0x86, 0x9C, 0x8A, 0x87, 0x87, 0x89, 0x51, + 0x54, 0x47, 0x4B, 0x50, 0x4B, 0xCF, 0xD6, 0xDC, + 0xD5, 0x60, 0x54, 0x52, 0x48, 0x45, 0x40, 0x5A, + 0x45, 0x43, 0x47, 0xA7, 0x98, 0x9B, 0x95, 0x95, + 0x9A, 0x87, 0x98, 0x98, 0x8A, 0x86, 0x87, 0x9E, + 0x9B, 0x95, 0x9D, 0x9D, 0x99, 0x85, 0xA6, 0xFA, + 0xF2, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x22, + 0x21, 0x24, 0xFB, 0xF7, 0xBF, 0xA6, 0xA2, 0x99, + 0x97, 0x89, 0x86, 0x89, 0x9C, 0x96, 0x9E, 0x94, + 0x89, 0x99, 0x98, 0x89, 0x9E, 0x9B, 0x89, 0x8B, + 0x58, 0x4B, 0x4A, 0x52, 0x48, 0xCC, 0xD3, 0xDA, + 0xD3, 0x65, 0x4C, 0x58, 0x49, 0x3E, 0x2E, 0x4D, + 0x40, 0x41, 0x45, 0xA9, 0xA1, 0x9B, 0x9E, 0x9C, + 0x95, 0x8A, 0x94, 0x89, 0x96, 0x87, 0x9C, 0x9A, + 0x84, 0x9D, 0x9C, 0x9E, 0x9A, 0x9C, 0x9D, 0xBB, + 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x23, 0x23, + 0x24, 0xFC, 0xFC, 0xF6, 0xBF, 0xA6, 0x9F, 0x99, + 0x89, 0x95, 0x87, 0x94, 0x9D, 0x9E, 0x97, 0x9E, + 0x95, 0x9B, 0x89, 0x95, 0x95, 0x9B, 0x89, 0x87, + 0x5D, 0x56, 0x3E, 0x51, 0x3E, 0x60, 0xCF, 0xD3, + 0xD2, 0xCD, 0x5C, 0x49, 0x4B, 0x3E, 0x2C, 0x48, + 0x3E, 0x43, 0x3E, 0xA9, 0xA1, 0x9B, 0x97, 0x94, + 0x95, 0x9A, 0x9C, 0x87, 0x87, 0x9B, 0x9C, 0x95, + 0x9D, 0x89, 0x9A, 0x89, 0x9E, 0x9E, 0x8C, 0xA6, + 0x20, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x20, 0x40, + 0xFC, 0xFC, 0xFC, 0xEC, 0xBE, 0xA4, 0x9F, 0x99, + 0x95, 0x9F, 0xA0, 0x88, 0x9D, 0x8B, 0x97, 0x95, + 0x87, 0x95, 0x96, 0x95, 0x97, 0x94, 0x94, 0x98, + 0xD3, 0x4C, 0x47, 0x4D, 0x42, 0x4C, 0x60, 0xCC, + 0xCE, 0xD0, 0x65, 0x4B, 0x47, 0x44, 0x2B, 0x45, + 0x4B, 0x47, 0x49, 0xA7, 0xA1, 0x9A, 0x97, 0x89, + 0x95, 0x97, 0x97, 0x9E, 0x89, 0x95, 0x89, 0x9C, + 0x87, 0x95, 0x97, 0x99, 0x95, 0x99, 0x9F, 0xA4, + 0xC4, 0x21, 0x21, 0x23, 0x21, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x21, 0x20, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEA, 0xAA, 0xA6, 0xA2, 0x99, + 0x8B, 0x9A, 0x95, 0x9E, 0x9E, 0x9A, 0x94, 0x87, + 0x94, 0x94, 0x89, 0x94, 0x9B, 0x9B, 0xA7, 0xDC, + 0xDB, 0x65, 0x2E, 0x3E, 0x43, 0x44, 0x49, 0x58, + 0x63, 0xD3, 0xD3, 0x5E, 0x42, 0x42, 0x2D, 0x40, + 0x54, 0x4C, 0x4A, 0xA7, 0xA0, 0x99, 0x9B, 0x94, + 0xA0, 0x8A, 0x9B, 0x9D, 0x87, 0x95, 0x94, 0x8B, + 0x8A, 0x98, 0x9C, 0x8A, 0x9B, 0x99, 0xA2, 0xA6, + 0xBF, 0xEC, 0x2A, 0x20, 0x21, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x4C, 0xF9, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEB, 0xAA, 0xA4, 0x9F, 0x9C, + 0x8B, 0x9B, 0x88, 0x84, 0x9E, 0x9D, 0x96, 0x94, + 0x94, 0x9A, 0x9B, 0x9B, 0xA4, 0xD5, 0xCD, 0xDE, + 0xF1, 0xDA, 0x4C, 0x2D, 0x41, 0x2B, 0x42, 0x4C, + 0x5E, 0xD4, 0xD7, 0xCD, 0x49, 0x2E, 0x2E, 0x41, + 0x5E, 0x57, 0xA7, 0xA6, 0xA7, 0xA4, 0xA2, 0x98, + 0x9D, 0x9C, 0xA1, 0x99, 0x9D, 0x88, 0x8B, 0x9C, + 0x8A, 0x9C, 0x9C, 0x94, 0x9C, 0x89, 0xA0, 0xA6, + 0xAA, 0xEB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFB, 0xE9, 0xAA, 0xA6, 0xA2, 0x8B, + 0x8B, 0x8A, 0x86, 0x9B, 0x9C, 0x98, 0xA0, 0x9B, + 0x9B, 0x84, 0xA7, 0xB4, 0x61, 0xD1, 0xD2, 0xE0, + 0xF1, 0xDC, 0x61, 0x2D, 0x2E, 0x3F, 0x56, 0x62, + 0x5D, 0xD4, 0xD9, 0xD3, 0x54, 0x41, 0x41, 0x44, + 0xCB, 0x60, 0x52, 0xA9, 0xA9, 0xA9, 0xA7, 0xA6, + 0xA6, 0xA4, 0xA4, 0xA2, 0xA2, 0x9D, 0x95, 0x89, + 0x9C, 0x8A, 0x9E, 0x9C, 0x8A, 0x9E, 0xA0, 0xA8, + 0xC0, 0xE9, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xE9, 0xAA, 0xA6, 0xA0, 0x99, + 0x9C, 0x8B, 0x9A, 0x84, 0x9B, 0x9B, 0x98, 0x98, + 0xA9, 0xB9, 0x49, 0x57, 0xCB, 0xD4, 0xD3, 0xF1, + 0xD8, 0xDA, 0xCE, 0x3F, 0x41, 0x4B, 0x5D, 0xCB, + 0x5E, 0xD6, 0xDB, 0xD6, 0x5D, 0x43, 0x3F, 0x49, + 0xD1, 0xCC, 0x4F, 0xDD, 0xC3, 0xBB, 0xBF, 0xAA, + 0xAA, 0xA9, 0xAA, 0xA8, 0xA8, 0xA6, 0xA6, 0xA2, + 0x9C, 0x9F, 0x9B, 0x9A, 0x9D, 0xA2, 0xA8, 0xAA, + 0xC1, 0xEA, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEA, 0xC0, 0xAA, 0xA6, 0xA2, + 0xA2, 0x99, 0xA0, 0xA0, 0xA4, 0xA7, 0xA9, 0xC0, + 0x67, 0x49, 0x54, 0x60, 0xD0, 0xD4, 0xCC, 0xDF, + 0xD9, 0xD5, 0xD2, 0x3E, 0x47, 0x56, 0x60, 0xCD, + 0x5D, 0xD9, 0xD9, 0xD6, 0x61, 0x3F, 0x47, 0x52, + 0xD6, 0xD3, 0x62, 0x4D, 0x40, 0x4A, 0x57, 0xCA, + 0xC3, 0xC1, 0xC1, 0xC0, 0xBF, 0xBF, 0xAA, 0xAA, + 0xA6, 0xA4, 0xA4, 0xA4, 0xA6, 0xA8, 0xBE, 0xC1, + 0xC9, 0xEB, 0xFB, 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEB, 0xC3, 0xC0, 0xAA, 0xA8, + 0xA6, 0xA6, 0xA6, 0xA9, 0xAA, 0xC0, 0xE8, 0xD0, + 0xD2, 0x4C, 0x5E, 0x64, 0xD0, 0xD1, 0x5F, 0xD9, + 0xD5, 0xD1, 0xD0, 0x48, 0x52, 0x5C, 0x64, 0xCD, + 0x5C, 0xDC, 0xD7, 0xD5, 0x62, 0x3F, 0x4C, 0x53, + 0xDA, 0xD7, 0xCE, 0x56, 0x40, 0x4B, 0x52, 0x56, + 0xCE, 0xDF, 0x6A, 0xEB, 0xE9, 0xC9, 0xC3, 0xC0, + 0xC0, 0xBF, 0xBE, 0xAA, 0xBF, 0xC0, 0xC3, 0xC9, + 0xEA, 0xF6, 0xEE, 0x58, 0x57, 0x5E, 0xD6, 0xD0, + 0xD2, 0x61, 0xCB, 0xD6, 0xD6, 0xD4, 0xDF, 0xF3, + 0xF2, 0xDD, 0xD7, 0xEB, 0xC9, 0xC1, 0xC0, 0xBF, + 0xAA, 0xAA, 0xAA, 0xBE, 0xC3, 0xF0, 0xD2, 0xD2, + 0xD2, 0x51, 0x62, 0xCC, 0xD0, 0xCC, 0x61, 0xD3, + 0xCF, 0xCE, 0xD2, 0x48, 0x5A, 0x61, 0xCC, 0xCE, + 0x5F, 0xD9, 0xD5, 0xD1, 0x63, 0x44, 0x56, 0x56, + 0xDC, 0xD9, 0xD4, 0x5E, 0x42, 0x4A, 0x4C, 0x57, + 0x5D, 0xD8, 0xE0, 0xD8, 0xDC, 0xCB, 0x66, 0xEC, + 0xE8, 0xC3, 0xC3, 0xC3, 0xC3, 0xC9, 0xE8, 0xEA, + 0xF6, 0x50, 0x3E, 0x58, 0x57, 0x5A, 0xD6, 0xD4, + 0xCC, 0x4B, 0x53, 0x5C, 0x64, 0xD1, 0xDF, 0xF3, + 0xF1, 0xDE, 0xD9, 0xF6, 0xEB, 0xC9, 0xC1, 0xC1, + 0xC0, 0xC0, 0xC1, 0xC9, 0xF0, 0xD6, 0xCD, 0xD6, + 0xD3, 0x53, 0xCB, 0xCF, 0xCD, 0x5F, 0x5F, 0xCE, + 0xCF, 0xCD, 0xD0, 0x47, 0x5F, 0xCB, 0xCE, 0xCD, + 0x63, 0xD6, 0xD3, 0xD1, 0x63, 0x3F, 0x58, 0x58, + 0xDB, 0xDC, 0xDA, 0x65, 0x3E, 0x49, 0x49, 0x4D, + 0x49, 0xDC, 0xDF, 0xE0, 0xDE, 0xD5, 0x47, 0x47, + 0x46, 0x6B, 0xEB, 0xEA, 0xE9, 0xEA, 0xEB, 0xF6, + 0xD0, 0x57, 0x57, 0x47, 0x47, 0x5B, 0xD4, 0xD4, + 0xCD, 0x44, 0x3E, 0x4B, 0x50, 0x4B, 0x51, 0xD5, + 0xDB, 0xD8, 0xDE, 0x4B, 0xF6, 0xF6, 0xEA, 0xE9, + 0xE8, 0xEA, 0xEB, 0x67, 0x5E, 0xCC, 0xD6, 0xDC, + 0xD5, 0x58, 0xCE, 0xCE, 0x62, 0x50, 0xCC, 0xD3, + 0xD2, 0xCD, 0xCD, 0x4B, 0x64, 0xCE, 0xCE, 0x64, + 0xCC, 0xD3, 0xD2, 0xD2, 0x61, 0x47, 0x5D, 0x5C, + 0xDD, 0xDD, 0xD9, 0xD1, 0x4C, 0x47, 0x49, 0x4A, + 0x4B, 0xD1, 0xD8, 0xE0, 0xDF, 0xDD, 0x5D, 0x4A, + 0x48, 0x52, 0x51, 0x3F, 0xF6, 0xEC, 0xE0, 0xE0, + 0xD3, 0x5E, 0x5F, 0x50, 0x4B, 0x50, 0xCB, 0xCE, + 0x64, 0x45, 0x4C, 0x57, 0x57, 0x58, 0x52, 0xD6, + 0xD3, 0xDE, 0xDF, 0xD1, 0x3E, 0x4B, 0xF6, 0xF6, + 0xEC, 0x66, 0x53, 0x43, 0x56, 0xD1, 0xD9, 0xDE, + 0xD4, 0x5E, 0xCE, 0xCC, 0x5B, 0x2C, 0xD4, 0xD5, + 0xD2, 0xD0, 0x63, 0x5D, 0xCD, 0xD0, 0xCD, 0x5E, + 0xD0, 0xCF, 0xCE, 0xD2, 0x5E, 0x50, 0x60, 0x5D, + 0xDE, 0xDD, 0xDC, 0xD7, 0x5D, 0x45, 0x47, 0x3E, + 0x4B, 0x5E, 0xDE, 0xDF, 0xE0, 0xD8, 0xCF, 0x3E, + 0x45, 0x51, 0x58, 0x42, 0xCB, 0xDA, 0xDE, 0xD8, + 0xD2, 0x61, 0xCC, 0xCF, 0xD6, 0xDA, 0xDA, 0xD5, + 0xD0, 0x50, 0x44, 0x57, 0x57, 0x58, 0x45, 0xD1, + 0xD1, 0xD7, 0xDF, 0xDF, 0xD7, 0xCF, 0x64, 0x60, + 0xCE, 0xCE, 0xCE, 0x63, 0xCF, 0xDA, 0xDE, 0xD9, + 0xCF, 0x63, 0xCD, 0x63, 0x4D, 0x4B, 0xD6, 0xD5, + 0xCE, 0xD3, 0x60, 0xCB, 0xD0, 0xD0, 0x65, 0x47, + 0xD0, 0xCC, 0xCC, 0xD1, 0x59, 0x5D, 0x63, 0x5E, + 0xDD, 0xDD, 0xDE, 0xDC, 0xCB, 0x40, 0x48, 0x45, + 0x3E, 0x3E, 0xD9, 0xDF, 0xE0, 0xDF, 0xDA, 0x51, + 0x4C, 0x48, 0x56, 0x4C, 0x5B, 0xD2, 0xDA, 0xDB, + 0xCB, 0x5F, 0xD0, 0xCC, 0xDC, 0xF0, 0xF3, 0xE0, + 0xDD, 0xCC, 0x41, 0x50, 0x57, 0x57, 0x4B, 0x5D, + 0xD3, 0xD1, 0xDE, 0xDF, 0xDE, 0xD7, 0xD0, 0xD0, + 0xD5, 0xD6, 0xD6, 0xCE, 0xD7, 0xDC, 0xDA, 0xD5, + 0x60, 0x63, 0x64, 0x5E, 0x47, 0x61, 0xD5, 0xD2, + 0xCF, 0xD0, 0x59, 0xCD, 0xD1, 0xCF, 0x61, 0x4D, + 0xCC, 0xCE, 0xCD, 0xD0, 0x52, 0x61, 0x64, 0x60, + 0xDA, 0xDE, 0xDE, 0xDD, 0xD1, 0x4B, 0x4A, 0x45, + 0x3E, 0x41, 0xCD, 0xDE, 0xE0, 0xF1, 0xDE, 0x63, + 0x4A, 0x4A, 0x4A, 0x4B, 0x50, 0xCB, 0xD4, 0xD7, + 0x5E, 0x54, 0x62, 0xD3, 0xD4, 0xF0, 0xF3, 0xF3, + 0xF2, 0xDE, 0x61, 0x40, 0x49, 0x56, 0x4D, 0x3E, + 0x4B, 0xCE, 0xD9, 0xD8, 0xD9, 0xD5, 0xCF, 0xD2, + 0xD6, 0xD6, 0xD1, 0xD1, 0xD7, 0xD5, 0xCF, 0xD0, + 0x54, 0x64, 0x63, 0x56, 0x2C, 0xCB, 0xD1, 0xCC, + 0xD3, 0xCD, 0x54, 0xCF, 0xD1, 0xCE, 0x5E, 0x5C, + 0xCE, 0xCE, 0xCE, 0xCB, 0x4B, 0x63, 0xCC, 0x61, + 0xD4, 0xDC, 0xDE, 0xDE, 0xDA, 0x5D, 0x45, 0x45, + 0x48, 0x3F, 0x52, 0xD9, 0xD8, 0xDF, 0xDF, 0xD2, + 0x52, 0x4B, 0x3E, 0x2E, 0x47, 0x60, 0xCF, 0xD3, + 0x59, 0x48, 0x50, 0x5E, 0xCC, 0xDE, 0xF2, 0xF2, + 0xF3, 0xF3, 0xDD, 0x5D, 0x3E, 0x48, 0x47, 0x47, + 0x58, 0xD1, 0xDA, 0xDA, 0xD5, 0xD1, 0xCD, 0xD2, + 0xD3, 0xCF, 0xD3, 0xD1, 0xCD, 0xD3, 0xD2, 0x5E, + 0x52, 0x64, 0x60, 0x4B, 0x45, 0x61, 0xCD, 0xD3, + 0xD3, 0x64, 0x61, 0xD0, 0xD0, 0x64, 0x45, 0x63, + 0xD0, 0xCE, 0xD0, 0x60, 0x56, 0xCB, 0xCC, 0x62, + 0xCE, 0xDA, 0xDE, 0xD8, 0xDD, 0xCC, 0x45, 0x49, + 0x3E, 0x47, 0x42, 0xD1, 0xDC, 0xD8, 0xD8, 0xD3, + 0x5D, 0x4C, 0x49, 0x3F, 0x47, 0x59, 0xCD, 0xCF, + 0x59, 0x2E, 0x48, 0x47, 0x52, 0x63, 0xF0, 0xF2, + 0xF3, 0xF3, 0xF2, 0xDA, 0x52, 0x4B, 0x52, 0x58, + 0x5E, 0x63, 0xD0, 0xD0, 0xD0, 0xCF, 0xCE, 0xCE, + 0xCF, 0x65, 0x61, 0xD6, 0xD6, 0xD6, 0xCB, 0x4B, + 0x61, 0x62, 0x5D, 0x43, 0x4B, 0x61, 0xD0, 0xD4, + 0xD1, 0x61, 0xCE, 0xD2, 0xCD, 0x5E, 0x4A, 0xCE, + 0xD0, 0xCC, 0xD0, 0x59, 0x61, 0xCC, 0xCC, 0x62, + 0xD1, 0xD5, 0xDE, 0xD8, 0xDD, 0xCF, 0x4B, 0x4A, + 0x45, 0x3E, 0x2D, 0xCB, 0xDC, 0xDE, 0xD8, 0xD5, + 0x60, 0x54, 0x51, 0x4C, 0x4D, 0x5C, 0xCC, 0xCE, + 0x5A, 0x2C, 0x50, 0x53, 0x3E, 0x59, 0xD8, 0xF3, + 0xF2, 0xF3, 0xF3, 0xE0, 0x5E, 0x4A, 0x4C, 0x53, + 0x5E, 0x63, 0xCC, 0xCC, 0xCC, 0xCD, 0xCF, 0xD3, + 0x62, 0x53, 0xD6, 0xD6, 0xD6, 0xD6, 0x5B, 0x48, + 0x64, 0x63, 0x59, 0x44, 0x57, 0x63, 0xD2, 0xD3, + 0xD0, 0x5E, 0xD0, 0xD1, 0xCB, 0x58, 0x4C, 0xCF, + 0xCF, 0xCE, 0xCE, 0x57, 0x63, 0xCC, 0xCD, 0x57, +}; + +unsigned char linux_logo_bw[] __initdata = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC3, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFB, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFD, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xCF, 0xC3, 0xF8, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x81, 0xF9, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7, + 0x99, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xF3, 0xBC, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, + 0x19, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, + 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xC0, 0x21, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0xC0, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, + 0xC0, 0x7C, 0x04, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE3, 0x80, 0x00, 0x7C, 0x40, 0x11, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0xD2, 0x29, + 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F, + 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, + 0x00, 0x3F, 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, + 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x19, 0xFF, 0xFF, + 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1E, 0x80, 0x19, + 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1E, + 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, 0x7C, 0x00, + 0x00, 0x0F, 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, + 0xF8, 0x00, 0x00, 0x0E, 0x80, 0x11, 0xFF, 0xFF, + 0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x06, 0x00, 0x11, + 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x06, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00, + 0x00, 0x02, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF1, + 0xF0, 0x00, 0x00, 0x02, 0x80, 0x10, 0xFF, 0xFF, + 0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x97, 0x10, + 0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x00, 0x00, + 0xDF, 0xF0, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00, + 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xC7, + 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, + 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x00, 0x01, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, + 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F, + 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0x18, + 0xFF, 0xFF, 0xFF, 0x9E, 0x80, 0x00, 0x00, 0x03, + 0xA8, 0x11, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00, + 0x00, 0x02, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x99, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, + 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x01, + 0xFF, 0xFF, 0xFE, 0x20, 0x60, 0x00, 0x00, 0x00, + 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00, + 0x00, 0x00, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, 0x40, + 0x38, 0x00, 0x00, 0x00, 0xFE, 0x47, 0xFF, 0xFF, + 0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x23, + 0xFF, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00, + 0x78, 0x11, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, + 0x07, 0xC0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, + 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x04, + 0x7F, 0xFF, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x10, + 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01, 0x80, + 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x01, 0x4F, 0xFF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x03, 0xF0, + 0x00, 0x00, 0x8F, 0xFF, 0x80, 0x00, 0x00, 0x40, + 0x0F, 0xF0, 0x00, 0x04, 0x1F, 0xFF, 0x80, 0x00, + 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x10, 0x1F, 0xFF, + 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x40, + 0xFF, 0xFF, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xF0, + 0x00, 0x83, 0xFF, 0xFF, 0x81, 0xE0, 0x01, 0xFF, + 0xFF, 0xF8, 0x02, 0x07, 0xFF, 0xFF, 0x80, 0x3F, + 0x07, 0xE0, 0x00, 0x1C, 0x0C, 0x1F, 0xFF, 0xFF, + 0xF8, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0x78, 0x1F, + 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0x00, 0x07, 0x0F, + 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x0C, 0x07, + 0xFF, 0x83, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +#endif + +#ifdef INCLUDE_LINUX_LOGO16 + +unsigned char linux_logo16_red[] __initdata = { + 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x35, 0x83, 0xa5, + 0x65, 0x8f, 0x98, 0xc9, 0xdb, 0xe1, 0xe7, 0xf8 +}; + +unsigned char linux_logo16_green[] __initdata = { + 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x2e, 0x83, 0xa5, + 0x65, 0x6e, 0x98, 0x89, 0xbf, 0xac, 0xda, 0xf8 +}; + +unsigned char linux_logo16_blue[] __initdata = { + 0x00, 0x90, 0xaf, 0x9c, 0xf7, 0x2b, 0x82, 0xa5, + 0x65, 0x41, 0x97, 0x1e, 0x60, 0x29, 0xa5, 0xf8 +}; + +unsigned char linux_logo16[] __initdata = { + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa1, 0x11, 0x11, + 0x61, 0x16, 0x66, 0x66, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0xa8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x87, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x73, 0x33, 0x33, 0x3a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x27, 0x77, 0x77, 0x77, 0x33, 0x3a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa3, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x50, 0x08, 0x33, 0x77, 0x77, + 0x77, 0x72, 0x72, 0x27, 0x77, 0x77, 0x33, 0x33, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa3, 0x33, 0x33, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x85, 0x00, 0x11, 0x11, 0xaa, + 0xa3, 0x37, 0x77, 0x72, 0x22, 0x22, 0x77, 0x73, + 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, + 0x33, 0x37, 0x77, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x85, 0x00, 0x06, 0x66, 0x11, + 0x11, 0x1a, 0xa3, 0x37, 0x77, 0x72, 0x22, 0x77, + 0x73, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, + 0x33, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x00, 0x00, 0x06, 0x66, 0x66, + 0x66, 0x66, 0x11, 0x1a, 0xa3, 0x77, 0x72, 0x22, + 0x77, 0x73, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, + 0x33, 0x33, 0x33, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, + 0x66, 0x66, 0x66, 0x66, 0x11, 0xa3, 0x77, 0x22, + 0x22, 0x77, 0x33, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, + 0x33, 0x3a, 0xa1, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x33, + 0xaa, 0x11, 0x16, 0x66, 0x66, 0x61, 0x1a, 0x37, + 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x33, + 0x3a, 0xa1, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x22, + 0x22, 0x77, 0x3a, 0x11, 0x66, 0x66, 0x66, 0x1a, + 0x37, 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, 0x3a, + 0xa1, 0x11, 0x11, 0x10, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x05, 0x80, 0x50, 0x00, 0x00, 0x07, 0x72, + 0x22, 0x22, 0x22, 0x73, 0xa1, 0x66, 0x66, 0x61, + 0x1a, 0x77, 0x22, 0x27, 0x73, 0x33, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x3a, 0xaa, + 0x11, 0x11, 0x1a, 0xa0, 0x08, 0x71, 0x05, 0x00, + 0x00, 0x12, 0x22, 0x50, 0x00, 0x00, 0x07, 0x77, + 0x77, 0x72, 0x22, 0x22, 0x27, 0x31, 0x16, 0x66, + 0x61, 0x13, 0x77, 0x22, 0x77, 0x33, 0x3a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xa1, + 0x11, 0x1a, 0x33, 0x70, 0x07, 0x2e, 0x70, 0x00, + 0x01, 0x44, 0x42, 0x60, 0x00, 0x00, 0x02, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x27, 0x31, 0x66, + 0x66, 0x61, 0xa3, 0x72, 0x22, 0x77, 0x33, 0xaa, + 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xaa, 0x11, + 0x1a, 0x33, 0x77, 0x30, 0x04, 0x82, 0x40, 0x00, + 0x54, 0x48, 0x54, 0x40, 0x00, 0x00, 0x01, 0xaa, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x31, + 0x66, 0x66, 0x11, 0x37, 0x22, 0x27, 0x73, 0x3a, + 0xaa, 0xaa, 0xa3, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, + 0xa3, 0x77, 0xaa, 0x10, 0x50, 0x08, 0x46, 0x05, + 0x54, 0x80, 0x50, 0x42, 0x00, 0x00, 0x08, 0x66, + 0x66, 0x1a, 0x32, 0x22, 0x22, 0x22, 0x22, 0x27, + 0x31, 0x66, 0x66, 0x13, 0x72, 0x22, 0x77, 0x33, + 0xaa, 0xaa, 0xaa, 0x33, 0xaa, 0xa1, 0xaa, 0xa3, + 0x37, 0xa1, 0x1a, 0x30, 0x50, 0x06, 0x26, 0x00, + 0x54, 0x00, 0x00, 0x44, 0x00, 0x00, 0x08, 0xe2, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, 0x22, + 0x27, 0xa6, 0x66, 0x61, 0xa7, 0x72, 0x27, 0x73, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, + 0x31, 0x11, 0x37, 0x70, 0x02, 0x00, 0xab, 0xbb, + 0xb6, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, + 0x22, 0x23, 0x16, 0x66, 0x1a, 0x37, 0x22, 0x77, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x3a, + 0x11, 0xa7, 0x33, 0x10, 0x04, 0x09, 0xbd, 0xdd, + 0xbd, 0xd0, 0x04, 0x45, 0x00, 0x0e, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, + 0x22, 0x22, 0x71, 0x66, 0x66, 0x13, 0x72, 0x27, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x11, + 0xa3, 0x73, 0xa1, 0x60, 0x08, 0xbd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdb, 0x90, 0x00, 0x02, 0xec, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xce, 0x22, + 0x22, 0x22, 0x27, 0xa6, 0x66, 0x61, 0x37, 0x27, + 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x1a, + 0x33, 0xa1, 0x16, 0x60, 0x0b, 0xbd, 0xdd, 0xdd, + 0xcd, 0xdd, 0xdd, 0xd9, 0x00, 0x00, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xa2, + 0x22, 0x22, 0x22, 0x7a, 0x66, 0x66, 0x13, 0x77, + 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0x3a, 0x11, 0x33, + 0xaa, 0x11, 0x66, 0x60, 0x9b, 0xdd, 0xdd, 0xdd, + 0xcd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x61, + 0x72, 0x22, 0x22, 0x22, 0xa1, 0x66, 0x61, 0x37, + 0x1a, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x13, 0x3a, + 0x11, 0x11, 0x11, 0x10, 0x5b, 0xdd, 0xdd, 0xdc, + 0xdd, 0xdd, 0xbd, 0xd9, 0x00, 0x00, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x86, + 0x17, 0x22, 0x22, 0x22, 0x23, 0x16, 0x66, 0xaa, + 0xaa, 0xa3, 0x3a, 0xaa, 0xaa, 0x1a, 0x3a, 0xa1, + 0x11, 0x11, 0x1a, 0x70, 0x05, 0xbd, 0xdd, 0xdd, + 0xdb, 0x5b, 0xdd, 0xb0, 0x00, 0x60, 0x2e, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe6, 0x88, + 0x66, 0x32, 0x22, 0x22, 0x22, 0x36, 0x66, 0x11, + 0x33, 0x33, 0x3a, 0xaa, 0x11, 0xaa, 0xaa, 0xa1, + 0x11, 0x1a, 0x3a, 0x60, 0x02, 0x99, 0xbb, 0xb9, + 0x9b, 0xbb, 0xbc, 0x22, 0x00, 0x86, 0x5e, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe1, 0x68, + 0x86, 0x63, 0x22, 0x22, 0x22, 0x2a, 0x66, 0x66, + 0x33, 0x33, 0xaa, 0xaa, 0x1a, 0xaa, 0xaa, 0x11, + 0x1a, 0xa7, 0x68, 0x80, 0x02, 0x2b, 0xbd, 0xbb, + 0xbb, 0xb9, 0x22, 0x22, 0x00, 0x06, 0x6e, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0xa6, + 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, 0xa6, 0x66, + 0x33, 0x3a, 0xaa, 0xa1, 0xaa, 0xaa, 0xa1, 0x11, + 0xa3, 0xa6, 0x88, 0x80, 0x02, 0x22, 0x9b, 0xbb, + 0xbb, 0x22, 0x24, 0xf4, 0x60, 0x00, 0x0c, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x21, + 0x68, 0x88, 0x63, 0x22, 0x22, 0x22, 0x71, 0x66, + 0x33, 0x3a, 0x11, 0x11, 0xaa, 0xaa, 0x11, 0xaa, + 0x71, 0x88, 0x88, 0x00, 0x02, 0xe2, 0x26, 0x99, + 0x22, 0x22, 0x4f, 0xf4, 0x40, 0x00, 0x0c, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x22, 0x22, + 0x16, 0x88, 0x86, 0xa2, 0x22, 0x22, 0x27, 0x11, + 0x33, 0xa1, 0x11, 0x11, 0xaa, 0x31, 0x1a, 0xa3, + 0x68, 0x88, 0x81, 0x00, 0x54, 0x42, 0x22, 0x22, + 0x22, 0x44, 0xff, 0xff, 0x48, 0x00, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x22, + 0x21, 0x88, 0x88, 0x6a, 0x22, 0x22, 0x22, 0x31, + 0x3a, 0xa1, 0x11, 0x1a, 0xa3, 0x11, 0x33, 0x36, + 0x88, 0x86, 0x30, 0x00, 0x4f, 0x44, 0x22, 0x22, + 0x24, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x95, 0x22, 0x72, + 0x22, 0x18, 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, + 0xaa, 0x11, 0x11, 0x1a, 0x31, 0x13, 0x33, 0x68, + 0x88, 0x6a, 0x00, 0x02, 0x4f, 0x4f, 0x42, 0x24, + 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x50, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x73, + 0x72, 0x26, 0x88, 0x88, 0x63, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0xa3, 0xa1, 0x73, 0xa6, 0x88, + 0x81, 0xa5, 0x00, 0x04, 0x4f, 0x4f, 0x44, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x40, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x12, 0x27, + 0xaa, 0x22, 0x68, 0x55, 0x86, 0x72, 0x22, 0x22, + 0x11, 0x11, 0x1a, 0x33, 0x13, 0x3a, 0x18, 0x88, + 0x1a, 0x10, 0x00, 0x44, 0x4f, 0x4f, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x61, 0x22, + 0x3a, 0xa2, 0x26, 0x85, 0x58, 0x67, 0x22, 0x22, + 0x61, 0x61, 0x1a, 0x7a, 0x37, 0x31, 0x88, 0x81, + 0x11, 0x00, 0x05, 0xe4, 0x44, 0xff, 0xff, 0xff, + 0x4f, 0xf4, 0x44, 0xff, 0xff, 0xf5, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x12, + 0x2a, 0xaa, 0x72, 0x68, 0x55, 0x81, 0x22, 0x22, + 0x66, 0x61, 0xa3, 0x33, 0x73, 0x16, 0x88, 0x11, + 0x10, 0x00, 0x08, 0x74, 0x44, 0x4f, 0x44, 0x44, + 0xf4, 0xf4, 0x44, 0x44, 0xe2, 0x44, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x81, + 0x22, 0xaa, 0xa7, 0x26, 0x85, 0x88, 0x12, 0x22, + 0x66, 0x61, 0x37, 0xa7, 0x3a, 0x66, 0x66, 0x11, + 0x80, 0x00, 0x0a, 0x72, 0x44, 0x4f, 0x44, 0x4f, + 0xff, 0x44, 0x44, 0x22, 0x22, 0x24, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x85, 0x88, + 0x12, 0x2a, 0xaa, 0x22, 0x68, 0x58, 0x63, 0x22, + 0x66, 0x1a, 0x73, 0x77, 0x31, 0x66, 0x61, 0x11, + 0x00, 0x00, 0x07, 0x44, 0xff, 0x4f, 0xf4, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0x42, 0x22, 0x40, 0x9b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x85, 0x55, + 0x81, 0x27, 0xaa, 0xa2, 0x78, 0x88, 0x86, 0x72, + 0x66, 0x13, 0x77, 0x73, 0x11, 0x66, 0x61, 0x76, + 0x00, 0x50, 0x84, 0xf4, 0xff, 0x4f, 0xf4, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x42, 0x40, 0x9b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x68, 0x55, + 0x58, 0x12, 0x3a, 0xaa, 0x23, 0x88, 0x88, 0xa7, + 0x66, 0xa7, 0x77, 0x7a, 0x16, 0x66, 0x1a, 0x15, + 0x05, 0x00, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0x24, 0x9b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x26, 0x55, + 0x55, 0x81, 0x23, 0xaa, 0x32, 0x18, 0x88, 0x6a, + 0x61, 0x37, 0x77, 0x31, 0x66, 0x66, 0x17, 0x60, + 0x05, 0x08, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4e, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0xa2, 0x65, + 0x55, 0x58, 0xa2, 0x7a, 0xa2, 0x26, 0x88, 0x61, + 0x61, 0x32, 0x27, 0xa1, 0x66, 0x61, 0x31, 0x60, + 0x00, 0x04, 0x4f, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x9b, 0xaa, 0x26, + 0x55, 0x55, 0x87, 0x27, 0x33, 0x27, 0x68, 0x61, + 0x1a, 0x72, 0x27, 0xa6, 0x66, 0x6a, 0x71, 0x00, + 0x80, 0x84, 0xff, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, + 0x9b, 0x9b, 0x99, 0xb9, 0xb9, 0x99, 0xaa, 0xa2, + 0x85, 0x55, 0x56, 0x22, 0x27, 0x22, 0x36, 0x66, + 0x13, 0x22, 0x23, 0x16, 0x86, 0x63, 0x73, 0x00, + 0x00, 0x44, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4f, 0x99, + 0x9b, 0x99, 0x99, 0x99, 0xb9, 0x99, 0xaa, 0xaa, + 0x28, 0x55, 0x58, 0x12, 0x22, 0x22, 0x21, 0x11, + 0xa3, 0x27, 0x7a, 0x66, 0x86, 0x17, 0x75, 0x05, + 0x05, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x44, 0x4f, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x3a, 0xaa, + 0xa2, 0x85, 0x58, 0x67, 0x72, 0x22, 0x27, 0xa1, + 0x37, 0x27, 0x7a, 0x68, 0x86, 0xa2, 0x70, 0x00, + 0x02, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xf4, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x23, 0xaa, + 0xa7, 0x78, 0x88, 0x81, 0x77, 0x22, 0x27, 0x3a, + 0x72, 0x73, 0x71, 0x68, 0x66, 0x32, 0x50, 0x00, + 0x04, 0x4f, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x95, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x55, 0x12, 0x3a, + 0xaa, 0x21, 0x88, 0x81, 0x77, 0x27, 0x73, 0x73, + 0x72, 0x33, 0x36, 0x86, 0x61, 0x72, 0x00, 0x00, + 0x04, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x8a, 0x27, + 0xaa, 0x77, 0x68, 0x61, 0x23, 0x71, 0x11, 0x3a, + 0x27, 0xa3, 0x36, 0x86, 0x61, 0x20, 0x00, 0x00, + 0x04, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x59, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x58, 0x77, + 0x27, 0x32, 0x36, 0x63, 0x23, 0x71, 0x66, 0x11, + 0x27, 0x13, 0xa6, 0x86, 0x6a, 0x20, 0x00, 0x50, + 0x04, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x99, + 0x9b, 0xbb, 0xbb, 0xbb, 0xb9, 0x99, 0x68, 0x13, + 0x32, 0x22, 0x73, 0xa7, 0x2a, 0x31, 0x88, 0x66, + 0x7a, 0x13, 0x18, 0x66, 0x63, 0x20, 0x00, 0x06, + 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x49, 0x95, + 0xa9, 0xa9, 0x99, 0x97, 0x92, 0x99, 0x65, 0x6a, + 0x17, 0x22, 0x23, 0x72, 0x27, 0xaa, 0x88, 0x88, + 0xa1, 0x17, 0x68, 0x66, 0x67, 0x70, 0x00, 0x05, + 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x49, 0x9c, + 0x2e, 0xee, 0xee, 0xee, 0xee, 0xa9, 0x65, 0x8a, + 0x1a, 0xaa, 0x37, 0x72, 0x27, 0x37, 0x88, 0x88, + 0x11, 0x17, 0x68, 0x66, 0x67, 0x10, 0x9d, 0xd0, + 0x84, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0xf4, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x4f, 0x69, + 0xcc, 0xee, 0xee, 0xee, 0xec, 0x99, 0x88, 0x63, + 0x61, 0x68, 0x61, 0x72, 0x22, 0x7a, 0x68, 0x88, + 0x11, 0x17, 0x88, 0x66, 0x12, 0x1b, 0xdd, 0xdd, + 0x02, 0x44, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0xff, 0x4f, 0x4c, 0xc5, + 0x0c, 0xc1, 0x11, 0x1c, 0xc0, 0x26, 0x66, 0x17, + 0x66, 0x88, 0x88, 0x12, 0x22, 0x23, 0xa8, 0x88, + 0x11, 0x13, 0x88, 0x66, 0x17, 0xbb, 0xdd, 0xdd, + 0xd0, 0x8f, 0xff, 0xf4, 0xf4, 0x44, 0xf4, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0x4f, 0x44, 0xdd, 0xdd, + 0x00, 0x00, 0x00, 0x05, 0x9d, 0x21, 0x66, 0x27, + 0xa6, 0x65, 0x58, 0x67, 0x22, 0x27, 0x28, 0x88, + 0x11, 0xaa, 0x86, 0x68, 0x1a, 0xbb, 0xdd, 0xdd, + 0xdb, 0x05, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xdd, 0xdb, + 0x00, 0x00, 0x00, 0x00, 0xdd, 0xda, 0x66, 0x22, + 0x71, 0x15, 0x55, 0x81, 0x22, 0x22, 0x76, 0x88, + 0x11, 0x31, 0x88, 0x88, 0xab, 0xbd, 0xdd, 0xdd, + 0xdd, 0x00, 0x04, 0x44, 0xff, 0xff, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0x44, 0xdd, 0xdb, + 0x00, 0x00, 0x00, 0x0b, 0xdd, 0xda, 0x11, 0x22, + 0x23, 0x68, 0x55, 0x86, 0x22, 0x22, 0x7a, 0x88, + 0x1a, 0x71, 0x88, 0x89, 0xbb, 0xdd, 0xdd, 0xdd, + 0xdd, 0xd0, 0x00, 0x4f, 0x44, 0xff, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xff, 0xe2, 0xdd, 0xdb, + 0x90, 0x00, 0x05, 0xbd, 0xdd, 0xb8, 0x63, 0x22, + 0x27, 0xa6, 0x55, 0x88, 0x77, 0x22, 0x22, 0x88, + 0x1a, 0x28, 0xbd, 0xdb, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdb, 0x00, 0x07, 0x44, 0x4f, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x22, 0xdd, 0xdb, + 0xbb, 0x9b, 0xbb, 0xbd, 0xdd, 0xd5, 0x86, 0x22, + 0x22, 0x77, 0x85, 0x88, 0x17, 0x22, 0x22, 0x88, + 0xaa, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0x00, 0x00, 0x54, 0x4f, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0x44, 0x22, 0xbd, 0xdd, + 0xbb, 0xbb, 0xbb, 0xdd, 0xdd, 0xdd, 0x88, 0x72, + 0x27, 0x22, 0x88, 0x88, 0x67, 0x72, 0x22, 0x18, + 0x33, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd0, 0x00, 0x05, 0x4f, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0x44, 0x4f, 0x22, 0xbd, 0xdd, + 0xdb, 0xbb, 0xdd, 0xdd, 0xdd, 0xdd, 0x88, 0x17, + 0x27, 0x72, 0x68, 0x88, 0x87, 0x32, 0x22, 0x36, + 0x37, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd5, 0x00, 0x00, 0x4f, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0xf4, 0xf4, 0x22, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x67, + 0x72, 0x77, 0x38, 0x88, 0x83, 0x37, 0x22, 0x26, + 0x72, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0x00, 0x00, 0x4f, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0xf4, 0x44, 0x25, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3, + 0x32, 0x73, 0x76, 0x88, 0x81, 0x33, 0x22, 0x2a, + 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xb0, 0x54, 0x4f, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x00, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xa7, 0x73, 0x26, 0x88, 0x86, 0x7a, 0x72, 0x27, + 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0xff, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0x44, 0x40, 0x05, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x13, 0x23, 0x21, 0x68, 0x86, 0x17, 0x72, 0x22, + 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0x4f, 0x4f, 0x4f, + 0xff, 0xff, 0x44, 0x42, 0x00, 0x05, 0xbd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x87, 0x27, 0x27, 0x16, 0x66, 0x67, 0x22, 0x22, + 0x72, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0x94, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x00, 0x00, 0x05, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb8, + 0x86, 0x22, 0x22, 0x7a, 0x68, 0x81, 0x22, 0x22, + 0x37, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x44, 0x44, 0x44, + 0x44, 0x47, 0x00, 0x00, 0x00, 0x05, 0xbd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x68, + 0x58, 0x72, 0x22, 0x27, 0x18, 0x86, 0x72, 0x22, + 0x1a, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x18, 0x85, + 0x58, 0x12, 0x22, 0x36, 0x18, 0x88, 0x32, 0x22, + 0x61, 0x3b, 0xbb, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x7a, 0x68, 0x85, + 0x88, 0x62, 0x27, 0x16, 0x18, 0x88, 0x12, 0x27, + 0x86, 0x18, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, + 0xdd, 0xdd, 0xdd, 0xbb, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbb, 0xbd, + 0xdd, 0xdd, 0xdb, 0xbb, 0x87, 0x31, 0x68, 0x65, + 0x88, 0x82, 0x23, 0x16, 0x18, 0x88, 0x12, 0x23, + 0x88, 0x67, 0x27, 0xa8, 0x9b, 0xbb, 0xbb, 0xbb, + 0xbd, 0xdd, 0xbb, 0xbb, 0x95, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0x96, 0x87, 0x16, 0x68, 0x18, + 0x88, 0x62, 0x31, 0x66, 0x18, 0x88, 0x62, 0x73, + 0x88, 0x63, 0x27, 0x33, 0x65, 0x55, 0x99, 0x9b, + 0xbb, 0xbb, 0xbb, 0x99, 0x55, 0x0a, 0xa1, 0x86, + 0x81, 0x68, 0x88, 0x55, 0x58, 0x85, 0x9b, 0xbb, + 0xbb, 0xbb, 0x95, 0x88, 0x83, 0x66, 0x66, 0x18, + 0x66, 0x82, 0xa1, 0x66, 0x18, 0x88, 0x62, 0x33, + 0x88, 0x81, 0x27, 0x7a, 0x18, 0x58, 0x86, 0x85, + 0x99, 0x99, 0x99, 0x95, 0x53, 0x2a, 0xaa, 0x88, + 0x67, 0x31, 0x68, 0x55, 0x58, 0x85, 0x59, 0xbb, + 0xbb, 0xb9, 0x58, 0x68, 0x83, 0x66, 0x61, 0x16, + 0x66, 0x62, 0x16, 0x66, 0x68, 0x88, 0x62, 0xaa, + 0x88, 0x86, 0x27, 0x77, 0x78, 0x55, 0x88, 0x22, + 0x25, 0x55, 0x95, 0x55, 0x6a, 0xa2, 0x2a, 0x88, + 0x62, 0x27, 0x37, 0x38, 0x88, 0x87, 0x55, 0x59, + 0x95, 0x58, 0x16, 0x88, 0x8a, 0x66, 0x63, 0x68, + 0x86, 0x67, 0x66, 0x66, 0x68, 0x88, 0x12, 0x11, + 0x88, 0x88, 0x72, 0x77, 0x78, 0x85, 0x58, 0x17, + 0x23, 0x32, 0x55, 0x55, 0x81, 0x13, 0x73, 0x66, + 0x62, 0x7a, 0xaa, 0x38, 0x88, 0x58, 0x27, 0x55, + 0x58, 0x32, 0x38, 0x88, 0x81, 0x66, 0xa2, 0x88, + 0x86, 0x61, 0x66, 0x61, 0x66, 0x68, 0x13, 0x11, + 0x88, 0x88, 0x12, 0x22, 0x71, 0x85, 0x58, 0x62, + 0x23, 0xa2, 0x68, 0x88, 0x81, 0x66, 0x88, 0x88, + 0x63, 0x2a, 0xaa, 0x28, 0x88, 0x55, 0x86, 0x61, + 0x66, 0x66, 0x68, 0x88, 0x66, 0x66, 0x77, 0x88, + 0x68, 0x16, 0x66, 0x62, 0x66, 0x68, 0xa1, 0x61, + 0x88, 0x88, 0x62, 0x22, 0x22, 0x85, 0x55, 0x83, + 0x72, 0x37, 0xa8, 0x88, 0x61, 0x66, 0x85, 0x55, + 0x86, 0x23, 0xaa, 0x71, 0x88, 0x85, 0x88, 0x66, + 0x88, 0x86, 0x88, 0x88, 0x16, 0x61, 0x21, 0x88, + 0x66, 0xa6, 0x86, 0x17, 0x66, 0x66, 0x31, 0x61, + 0x88, 0x88, 0x87, 0x72, 0x22, 0x68, 0x55, 0x86, + 0x77, 0x77, 0x36, 0x88, 0x13, 0x68, 0x85, 0x55, + 0x58, 0x12, 0x73, 0x72, 0x76, 0x88, 0x88, 0x68, + 0x88, 0x88, 0x88, 0x66, 0x36, 0x63, 0x26, 0x86, + 0x86, 0x36, 0x86, 0x11, 0x66, 0x66, 0x76, 0x61, + 0x88, 0x88, 0x81, 0x22, 0x22, 0x38, 0x85, 0x58, + 0x37, 0x22, 0x21, 0x68, 0xa2, 0x31, 0x68, 0x55, + 0x55, 0x81, 0x22, 0x22, 0xa8, 0x88, 0x88, 0x68, + 0x86, 0x88, 0x68, 0x81, 0x36, 0x17, 0x21, 0x68, + 0x86, 0x16, 0x66, 0x26, 0x66, 0x61, 0x36, 0x66, + 0x68, 0x88, 0x86, 0x27, 0x22, 0x28, 0x88, 0x88, + 0x17, 0x72, 0x2a, 0x66, 0xa2, 0x22, 0x36, 0x55, + 0x55, 0x58, 0x37, 0x3a, 0x16, 0x66, 0x66, 0x66, + 0x66, 0x18, 0x88, 0x67, 0x16, 0x12, 0x71, 0x68, + 0x81, 0x68, 0x61, 0x76, 0x66, 0x6a, 0x16, 0x66, + 0x88, 0x88, 0x86, 0x77, 0x22, 0x26, 0x88, 0x88, + 0x13, 0x37, 0x71, 0x66, 0xa2, 0x33, 0x2a, 0x85, + 0x55, 0x55, 0x17, 0x73, 0x16, 0x66, 0x66, 0x68, + 0x63, 0x88, 0x88, 0xa2, 0x66, 0xa2, 0xa6, 0x88, + 0x61, 0x68, 0x6a, 0x76, 0x66, 0x6a, 0x66, 0x6a +}; + +#endif diff -u --recursive --new-file v2.1.106/linux/include/linux/loop.h linux/include/linux/loop.h --- v2.1.106/linux/include/linux/loop.h Mon Jul 1 10:06:05 1996 +++ linux/include/linux/loop.h Wed Jun 24 11:06:22 1998 @@ -17,7 +17,7 @@ struct loop_device { int lo_number; - struct inode *lo_inode; + struct dentry *lo_dentry; int lo_refcnt; kdev_t lo_device; int lo_offset; diff -u --recursive --new-file v2.1.106/linux/include/linux/mm.h linux/include/linux/mm.h --- v2.1.106/linux/include/linux/mm.h Tue Jun 23 10:01:29 1998 +++ linux/include/linux/mm.h Wed Jun 24 15:51:17 1998 @@ -310,7 +310,7 @@ extern int do_munmap(unsigned long, size_t); /* filemap.c */ -extern unsigned long page_unuse(unsigned long); +extern unsigned long page_unuse(struct page *); extern int shrink_mmap(int, int); extern void truncate_inode_pages(struct inode *, unsigned long); extern unsigned long get_cached_page(struct inode *, unsigned long, int); diff -u --recursive --new-file v2.1.106/linux/include/linux/msdos_fs_i.h linux/include/linux/msdos_fs_i.h --- v2.1.106/linux/include/linux/msdos_fs_i.h Fri Jan 23 18:10:32 1998 +++ linux/include/linux/msdos_fs_i.h Wed Jun 24 14:30:11 1998 @@ -21,7 +21,7 @@ I have not put it conditional. With the advent of loadable file system drivers, it would be very easy to compile - a MsDOS FS driver unaware of UMSDOS and then later to + a MS-DOS FS driver unaware of UMSDOS and then later to load a (then incompatible) UMSDOS FS driver. */ struct pipe_inode_info reserved; diff -u --recursive --new-file v2.1.106/linux/include/linux/netdevice.h linux/include/linux/netdevice.h --- v2.1.106/linux/include/linux/netdevice.h Tue Jun 23 10:01:29 1998 +++ linux/include/linux/netdevice.h Wed Jun 24 15:52:09 1998 @@ -251,7 +251,7 @@ /* Protocol specific pointers */ - void *atalk_ptr; /* Appletalk link */ + void *atalk_ptr; /* AppleTalk link */ void *ip_ptr; /* IPv4 specific data */ void *dn_ptr; /* DECnet specific data */ diff -u --recursive --new-file v2.1.106/linux/include/linux/pci.h linux/include/linux/pci.h --- v2.1.106/linux/include/linux/pci.h Wed May 20 19:10:41 1998 +++ linux/include/linux/pci.h Wed Jun 24 14:26:13 1998 @@ -764,6 +764,11 @@ #define PCI_DEVICE_ID_ALLIANCE_AT24 0x6424 #define PCI_DEVICE_ID_ALLIANCE_AT3D 0x643d +#define PCI_VENDOR_ID_SK 0x1148 +#define PCI_DEVICE_ID_SK_FP 0x4000 +#define PCI_DEVICE_ID_SK_TR 0x4200 +#define PCI_DEVICE_ID_SK_GE 0x4300 + #define PCI_VENDOR_ID_VMIC 0x114a #define PCI_DEVICE_ID_VMIC_VME 0x7587 diff -u --recursive --new-file v2.1.106/linux/include/linux/sched.h linux/include/linux/sched.h --- v2.1.106/linux/include/linux/sched.h Tue Jun 23 10:01:29 1998 +++ linux/include/linux/sched.h Wed Jun 24 15:51:17 1998 @@ -32,6 +32,7 @@ #define CLONE_FILES 0x00000400 /* set if open files shared between processes */ #define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */ #define CLONE_PID 0x00001000 /* set if pid shared */ +#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */ /* * These are the constant used to fake the fixed-point load-average @@ -350,7 +351,7 @@ /* timeout */ 0,SCHED_OTHER,0,0,0,0,0,0,0, \ /* timer */ { NULL, NULL, 0, 0, it_real_fn }, \ /* utime */ {0,0,0,0},0, \ -/* per cpu times */ {0, }, {0, }, \ +/* per CPU times */ {0, }, {0, }, \ /* flt */ 0,0,0,0,0,0, \ /* swp */ 0,0,0,0,0, \ /* process credentials */ \ diff -u --recursive --new-file v2.1.106/linux/include/linux/sdla_x25.h linux/include/linux/sdla_x25.h --- v2.1.106/linux/include/linux/sdla_x25.h Tue Mar 10 10:03:35 1998 +++ linux/include/linux/sdla_x25.h Wed Jun 24 14:34:44 1998 @@ -18,7 +18,7 @@ /*---------------------------------------------------------------------------- * Notes: * ------ - * 1. All structures defined in this file are byte-alined. To ensure + * 1. All structures defined in this file are byte-aligned. To ensure * portability of this code between different platforms and compilers, one * of the following defines must be defined before including this file: * @@ -104,7 +104,7 @@ #define X25_READ 0x22 /* read X.25 packet */ #define X25_WRITE 0x23 /* send X.25 packet */ #define X25_PLACE_CALL 0x30 /* place a call on SVC */ -#define X25_ACCEPT_CALL 0x31 /* accept incomming call */ +#define X25_ACCEPT_CALL 0x31 /* accept incoming call */ #define X25_CLEAR_CALL 0x32 /* clear call */ #define X25_CLEAR_CONFRM 0x33 /* send clear confirmation packet */ #define X25_RESET 0x34 /* send reset request packet */ @@ -116,14 +116,14 @@ #define X25_REGISTRATION_RQST 0x3A /* send registration request packet */ #define X25_REGISTRATION_CONFRM 0x3B /* send registration confirmation */ #define X25_IS_DATA_AVAILABLE 0x40 /* querry receive queue */ -#define X25_INCOMMING_CALL_CTL 0x41 /* select incomming call options */ +#define X25_INCOMING_CALL_CTL 0x41 /* select incoming call options */ #define X25_CONFIGURE_PVC 0x42 /* configure PVC */ #define X25_GET_ACTIVE_CHANNELS 0x43 /* get a list of active circuits */ #define X25_READ_CHANNEL_CONFIG 0x44 /* read virt. circuit configuration */ #define X25_FLUSH_DATA_BUFFERS 0x45 /* flush X.25-level data buffers */ #define X25_READ_HISTORY_TABLE 0x46 /* read asynchronous event log */ #define X25_HISTORY_TABLE_CTL 0x47 /* control asynchronous event log */ -#define X25_GET_TX_D_BIT_STATUS 0x48 /* is packet with D-bit acknowleged */ +#define X25_GET_TX_D_BIT_STATUS 0x48 /* is packet with D-bit acknowledged */ #define X25_READ_STATISTICS 0x49 /* read X.25-level statistics */ #define X25_FLUSH_STATISTICS 0x4A /* flush X.25-level statistics */ #define X25_READ_CONFIGURATION 0x50 /* read HDLC & X.25 configuration */ @@ -139,7 +139,7 @@ #define X25RES_LINK_CLOSED 0x03 #define X25RES_INVAL_LENGTH 0x04 #define X25RES_INVAL_CMD 0x05 -#define X25RES_UNNUMBERED_FRAME 0x06 /* unnunbered frame received */ +#define X25RES_UNNUMBERED_FRAME 0x06 /* unnumbered frame received */ #define X25RES_FRM_REJECT_MODE 0x07 /* link is in Frame Reject mode */ #define X25RES_MODEM_FAILURE 0x08 /* DCD and/or CTS dropped */ #define X25RES_N2_RETRY_LIMIT 0x09 /* N2 retry limit has been exceeded */ @@ -153,10 +153,10 @@ #define X25RES_INVAL_FORMAT 0x37 /* invalid packet format */ #define X25RES_D_BIT_NOT_SUPPRT 0x38 /* D-bit pragmatics not supported */ #define X25RES_FACIL_NOT_SUPPRT 0x39 /* Call facility not supported */ -#define X25RES_INVAL_CALL_ARG 0x3A /* errorneous call arguments */ -#define X25RES_INVAL_CALL_DATA 0x3B /* errorneous call user data */ +#define X25RES_INVAL_CALL_ARG 0x3A /* erroneous call arguments */ +#define X25RES_INVAL_CALL_DATA 0x3B /* erroneous call user data */ #define X25RES_ASYNC_PACKET 0x40 /* asynchronous packet received */ -#define X25RES_PROTO_VIOLATION 0x41 /* protocol violation occured */ +#define X25RES_PROTO_VIOLATION 0x41 /* protocol violation occurred */ #define X25RES_PKT_TIMEOUT 0x42 /* X.25 packet time out */ #define X25RES_PKT_RETRY_LIMIT 0x43 /* X.25 packet retry limit exceeded */ /*----- Command-dependent results -----*/ @@ -167,7 +167,7 @@ #define X25RES_LINK_IS_OPEN 0x01 /* HDLC_LINK_OPEN */ #define X25RES_LINK_IS_DISC 0x02 /* HDLC_LINK_DISC */ #define X25RES_LINK_IS_CLOSED 0x03 /* HDLC_LINK_CLOSE */ -#define X25RES_INVAL_PARAM 0x31 /* INCOMMING_CALL_CTL */ +#define X25RES_INVAL_PARAM 0x31 /* INCOMING_CALL_CTL */ #define X25RES_INVAL_CONFIG 0x35 /* REGISTR_RQST/CONFRM */ /* @@ -239,7 +239,7 @@ typedef struct X25Status { unsigned short pvc_map PACKED; /* 00h: PVC map */ - unsigned short icc_map PACKED; /* 02h: Incomming Chan. map */ + unsigned short icc_map PACKED; /* 02h: Incoming Chan. map */ unsigned short twc_map PACKED; /* 04h: Two-way Cnan. map */ unsigned short ogc_map PACKED; /* 06h: Outgoing Chan. map */ TX25TimeStamp tstamp PACKED; /* 08h: timestamp (BCD) */ @@ -256,7 +256,7 @@ #define X25_RX_INTR 0x01 /* receive interrupt */ #define X25_TX_INTR 0x02 /* transmit interrupt */ #define X25_MODEM_INTR 0x04 /* modem status interrupt (CTS/DCD) */ -#define X25_EVENT_INTR 0x10 /* asyncronous event encountered */ +#define X25_EVENT_INTR 0x10 /* asynchronous event encountered */ #define X25_CMD_INTR 0x08 /* interface command complete */ /* @@ -390,8 +390,8 @@ unsigned short pktMTU PACKED; /* 0Fh: */ unsigned short loPVC PACKED; /* 11h: */ unsigned short hiPVC PACKED; /* 13h: */ - unsigned short loIncommingSVC PACKED; /* 15h: */ - unsigned short hiIncommingSVC PACKED; /* 17h: */ + unsigned short loIncomingSVC PACKED; /* 15h: */ + unsigned short hiIncomingSVC PACKED; /* 17h: */ unsigned short loTwoWaySVC PACKED; /* 19h: */ unsigned short hiTwoWaySVC PACKED; /* 1Bh: */ unsigned short loOutgoingSVC PACKED; /* 1Dh: */ @@ -421,8 +421,8 @@ { unsigned short loPVC PACKED; /* 00h: lowest PVC number */ unsigned short hiPVC PACKED; /* 02h: highest PVC number */ - unsigned short loIncommingSVC PACKED; /* 04h: lowest incoming SVC */ - unsigned short hiIncommingSVC PACKED; /* 06h: highest incoming SVC */ + unsigned short loIncomingSVC PACKED; /* 04h: lowest incoming SVC */ + unsigned short hiIncomingSVC PACKED; /* 06h: highest incoming SVC */ unsigned short loTwoWaySVC PACKED; /* 08h: lowest two-way SVC */ unsigned short hiTwoWaySVC PACKED; /* 0Ah: highest two-way SVC */ unsigned short loOutgoingSVC PACKED; /* 0Ch: lowest outgoing SVC */ @@ -499,7 +499,7 @@ /* * Defines for the 'type' field. */ -#define X25LOG_INCOMMING 0x00 +#define X25LOG_INCOMING 0x00 #define X25LOG_APPLICATION 0x01 #define X25LOG_AUTOMATIC 0x02 #define X25LOG_ERROR 0x04 @@ -568,7 +568,7 @@ #define X25_TRCERR_RX_BADCRC 0x20 /* receive CRC error */ #define X25_TRCERR_RX_OVERRUN 0x30 /* receiver overrun error */ #define X25_TRCERR_RX_TOO_LONG 0x40 /* excessive frame length error */ -#define X25_TRCERR_TX_ABORT 0x70 /* aborted frame transmittion error */ +#define X25_TRCERR_TX_ABORT 0x70 /* aborted frame transmission error */ #define X25_TRCERR_TX_UNDERRUN 0x80 /* transmit underrun error */ /***************************************************************************** @@ -582,7 +582,7 @@ unsigned char data[0] PACKED; } THDLCFrame; -typedef struct X25Pkt /*----- X.25 Paket Format ----------*/ +typedef struct X25Pkt /*----- X.25 Packet Format ----------*/ { unsigned char lcn_hi PACKED; /* 4 MSB of Logical Channel Number */ unsigned char lcn_lo PACKED; /* 8 LSB of Logical Channel Number */ diff -u --recursive --new-file v2.1.106/linux/include/linux/selection.h linux/include/linux/selection.h --- v2.1.106/linux/include/linux/selection.h Fri Feb 6 15:33:21 1998 +++ linux/include/linux/selection.h Wed Jun 24 14:44:02 1998 @@ -15,28 +15,13 @@ extern int mouse_reporting(void); extern void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry); -#ifdef CONFIG_FB_CONSOLE -extern unsigned long get_video_num_columns(unsigned int console); -extern unsigned long get_video_num_lines(unsigned int console); -extern unsigned long get_video_size_row(unsigned int console); -#else -#define get_video_num_columns(dummy) video_num_columns -#define get_video_num_lines(dummy) video_num_lines -#define get_video_size_row(dummy) video_size_row -#endif - -extern unsigned long video_num_columns; -extern unsigned long video_num_lines; -extern unsigned long video_size_row; -extern unsigned char video_type; -extern unsigned long video_mem_base; -extern unsigned long video_mem_term; -extern unsigned long video_screen_size; -extern unsigned short video_port_reg; -extern unsigned short video_port_val; +#define video_num_columns (vc_cons[currcons].d->vc_cols) +#define video_num_lines (vc_cons[currcons].d->vc_rows) +#define video_size_row (vc_cons[currcons].d->vc_size_row) +#define video_screen_size (vc_cons[currcons].d->vc_screenbuf_size) +#define can_do_color (vc_cons[currcons].d->vc_can_do_color) extern int console_blanked; -extern int can_do_color; extern unsigned long video_font_height; extern unsigned long video_scan_lines; @@ -66,6 +51,8 @@ (((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)) extern void getconsxy(int currcons, char *p); extern void putconsxy(int currcons, char *p); @@ -73,35 +60,12 @@ /* how to access screen memory */ -#if defined(CONFIG_TGA_CONSOLE) +#include -extern int tga_blitc(unsigned int, unsigned long); -extern unsigned long video_mem_term; - -/* - * TGA console screen memory access - * - * TGA is *not* a character/attribute cell device; font bitmaps must be rendered - * to the screen pixels. - * - * We must test for an Alpha kernel virtual address that falls within - * the "shadow screen" memory. This condition indicates we really want - * to write to the screen, so, we do... :-) - * - * NOTE also: there's only *TWO* operations: to put/get a character/attribute. - * All the others needed by VGA support go away, as Not Applicable for TGA. - */ -static inline void scr_writew(unsigned short val, unsigned short * addr) +static inline void scr_writew(unsigned short val, unsigned short *addr) { - /* - * always deposit the char/attr, then see if it was to "screen" mem. - * if so, then render the char/attr onto the real screen. - */ - *addr = val; - if ((unsigned long)addr < video_mem_term && - (unsigned long)addr >= video_mem_base) { - tga_blitc(val, (unsigned long) addr); - } + /* simply store the value in the "shadow screen" memory */ + *addr = val; } static inline unsigned short scr_readw(unsigned short * addr) @@ -109,90 +73,6 @@ return *addr; } -#elif defined(CONFIG_SUN_CONSOLE) -#include -#include -extern int sun_blitc(unsigned int, unsigned long); -extern void memsetw(void * s, unsigned short c, unsigned int count); -extern void memcpyw(unsigned short *to, unsigned short *from, unsigned int count); -extern unsigned long video_mem_term; - -/* Basically the same as the TGA stuff. */ -static inline void scr_writew(unsigned short val, unsigned short * addr) -{ - /* - * always deposit the char/attr, then see if it was to "screen" mem. - * if so, then render the char/attr onto the real screen. - */ - if (*addr != val) { - *addr = val; - if ((unsigned long)addr < video_mem_term && - (unsigned long)addr >= video_mem_base && - vt_cons [fg_console]->vc_mode == KD_TEXT) - sun_blitc(val, (unsigned long) addr); - } -} - -static inline unsigned short scr_readw(unsigned short * addr) -{ - return *addr; -} - -#else /* CONFIG_TGA_CONSOLE || CONFIG_SUN_CONSOLE */ - -/* - * normal VGA console access - * - */ - -#include - -/* - * NOTE: "(long) addr < 0" tests for an Alpha kernel virtual address; this - * indicates a VC's backing store; otherwise, it's a bus memory address, for - * the VGA's screen memory, so we do the Alpha "swizzle"... :-) - */ -static inline void scr_writeb(unsigned char val, unsigned char * addr) -{ - if ((long) addr < 0) - *addr = val; - else - writeb(val, (unsigned long) addr); -} - -static inline unsigned char scr_readb(unsigned char * addr) -{ - if ((long) addr < 0) - return *addr; - return readb((unsigned long) addr); -} - -static inline void scr_writew(unsigned short val, unsigned short * addr) -{ -#ifdef __powerpc__ - st_le16(addr, val); -#else - if ((long) addr < 0) - *addr = val; - else - writew(val, (unsigned long) addr); -#endif /* !__powerpc__ */ -} - -static inline unsigned short scr_readw(unsigned short * addr) -{ -#ifdef __powerpc__ - return ld_le16(addr); -#else - if ((long) addr < 0) - return *addr; - return readw((unsigned long) addr); -#endif /* !__powerpc__ */ -} - -#endif /* CONFIG_TGA_CONSOLE */ - -#ifndef CONFIG_SUN_CONSOLE static inline void memsetw(void * s, unsigned short c, unsigned int count) { unsigned short * addr = (unsigned short *) s; @@ -213,4 +93,3 @@ scr_writew(scr_readw(from++), to++); } } -#endif /* CONFIG_SUN_CONSOLE */ diff -u --recursive --new-file v2.1.106/linux/include/linux/socket.h linux/include/linux/socket.h --- v2.1.106/linux/include/linux/socket.h Sun Jun 7 11:16:39 1998 +++ linux/include/linux/socket.h Wed Jun 24 14:30:11 1998 @@ -141,7 +141,7 @@ #define AF_INET 2 /* Internet IP Protocol */ #define AF_AX25 3 /* Amateur Radio AX.25 */ #define AF_IPX 4 /* Novell IPX */ -#define AF_APPLETALK 5 /* Appletalk DDP */ +#define AF_APPLETALK 5 /* AppleTalk DDP */ #define AF_NETROM 6 /* Amateur Radio NET/ROM */ #define AF_BRIDGE 7 /* Multiprotocol bridge */ #define AF_ATMPVC 8 /* ATM PVCs */ diff -u --recursive --new-file v2.1.106/linux/include/linux/tty.h linux/include/linux/tty.h --- v2.1.106/linux/include/linux/tty.h Tue Mar 17 22:18:15 1998 +++ linux/include/linux/tty.h Wed Jun 24 15:51:17 1998 @@ -40,18 +40,36 @@ */ struct screen_info { - unsigned char orig_x; - unsigned char orig_y; - unsigned char unused1[2]; - unsigned short orig_video_page; - unsigned char orig_video_mode; - unsigned char orig_video_cols; - unsigned short unused2; - unsigned short orig_video_ega_bx; - unsigned short unused3; - unsigned char orig_video_lines; - unsigned char orig_video_isVGA; - unsigned short orig_video_points; + unsigned char orig_x; /* 0x00 */ + unsigned char orig_y; /* 0x01 */ + unsigned short dontuse1; /* 0x02 -- EXT_MEM_K sits here */ + unsigned short orig_video_page; /* 0x04 */ + unsigned char orig_video_mode; /* 0x06 */ + unsigned char orig_video_cols; /* 0x07 */ + unsigned short unused2; /* 0x08 */ + unsigned short orig_video_ega_bx; /* 0x0a */ + unsigned short unused3; /* 0x0c */ + unsigned char orig_video_lines; /* 0x0e */ + unsigned char orig_video_isVGA; /* 0x0f */ + unsigned short orig_video_points; /* 0x10 */ + + /* VESA graphic mode -- linear frame buffer */ + unsigned short lfb_width; /* 0x12 */ + unsigned short lfb_height; /* 0x14 */ + unsigned short lfb_depth; /* 0x16 */ + unsigned long lfb_base; /* 0x18 */ + unsigned long lfb_size; /* 0x1c */ + unsigned short dontuse2, dontuse3; /* 0x20 -- CL_MAGIC and CL_OFFSET here */ + unsigned short lfb_linelength; /* 0x24 */ + unsigned char red_size; /* 0x26 */ + unsigned char red_pos; /* 0x27 */ + unsigned char green_size; /* 0x28 */ + unsigned char green_pos; /* 0x29 */ + unsigned char blue_size; /* 0x2a */ + unsigned char blue_pos; /* 0x2b */ + unsigned char rsvd_size; /* 0x2c */ + unsigned char rsvd_pos; /* 0x2d */ + /* 0x2e -- 0x3f reserved for future expansion */ }; extern struct screen_info screen_info; @@ -70,6 +88,7 @@ #define VIDEO_TYPE_EGAM 0x20 /* EGA/VGA in Monochrome Mode */ #define VIDEO_TYPE_EGAC 0x21 /* EGA in Color Mode */ #define VIDEO_TYPE_VGAC 0x22 /* VGA+ in Color Mode */ +#define VIDEO_TYPE_VLFB 0x23 /* VESA VGA in graphic mode */ #define VIDEO_TYPE_TGAC 0x40 /* DEC TGA */ diff -u --recursive --new-file v2.1.106/linux/include/linux/vt_kern.h linux/include/linux/vt_kern.h --- v2.1.106/linux/include/linux/vt_kern.h Mon Jun 16 16:36:00 1997 +++ linux/include/linux/vt_kern.h Wed Jun 24 14:44:02 1998 @@ -34,6 +34,8 @@ int vc_allocate(unsigned int console); int vc_cons_allocated(unsigned int console); int vc_resize(unsigned long lines, unsigned long cols); +void vc_resize_con(unsigned long lines, unsigned long cols, + unsigned int currcons); void vc_disallocate(unsigned int console); #endif /* _VT_KERN_H */ diff -u --recursive --new-file v2.1.106/linux/init/main.c linux/init/main.c --- v2.1.106/linux/init/main.c Tue Jun 23 10:01:30 1998 +++ linux/init/main.c Wed Jun 24 14:44:02 1998 @@ -530,7 +530,7 @@ { "noinitrd", no_initrd }, #endif #endif -#if defined (CONFIG_AMIGA) || defined (CONFIG_ATARI) +#ifdef CONFIG_FB { "video=", video_setup }, #endif { "panic=", panic_setup }, diff -u --recursive --new-file v2.1.106/linux/kernel/acct.c linux/kernel/acct.c --- v2.1.106/linux/kernel/acct.c Thu May 7 22:51:55 1998 +++ linux/kernel/acct.c Wed Jun 24 14:30:11 1998 @@ -257,7 +257,7 @@ /* * First check to see if there is enough free_space to continue the process - * accounting system. Check_free_space toggle's the acct_active flag so we + * accounting system. Check_free_space toggles the acct_active flag so we * need to check that after check_free_space. */ check_free_space(); diff -u --recursive --new-file v2.1.106/linux/kernel/fork.c linux/kernel/fork.c --- v2.1.106/linux/kernel/fork.c Tue Jun 23 10:01:30 1998 +++ linux/kernel/fork.c Tue Jun 23 09:57:00 1998 @@ -453,6 +453,17 @@ return 0; } +static inline void copy_flags(unsigned long clone_flags, struct task_struct *p) +{ + unsigned long new_flags = p->flags; + + new_flags &= ~PF_SUPERPRIV; + new_flags |= PF_FORKNOEXEC; + if (!(clone_flags & CLONE_PTRACE)) + new_flags &= ~(PF_PTRACED|PF_TRACESYS); + p->flags = new_flags; +} + /* * Ok, this is the main fork-routine. It copies the system process * information (task[nr]) and sets up the necessary registers. It @@ -485,22 +496,26 @@ p->did_exec = 0; p->swappable = 0; p->state = TASK_UNINTERRUPTIBLE; - p->flags &= ~(PF_PTRACED|PF_TRACESYS|PF_SUPERPRIV); - p->sigpending = 0; - p->flags |= PF_FORKNOEXEC; + + copy_flags(clone_flags, p); p->pid = get_pid(clone_flags); + p->next_run = NULL; p->prev_run = NULL; p->p_pptr = p->p_opptr = current; p->p_cptr = NULL; init_waitqueue(&p->wait_chldexit); + + p->sigpending = 0; sigemptyset(&p->signal); p->sigqueue = NULL; p->sigqueue_tail = &p->sigqueue; + p->it_real_value = p->it_virt_value = p->it_prof_value = 0; p->it_real_incr = p->it_virt_incr = p->it_prof_incr = 0; init_timer(&p->real_timer); p->real_timer.data = (unsigned long) p; + p->leader = 0; /* session leadership doesn't inherit */ p->tty_old_pgrp = 0; p->times.tms_utime = p->times.tms_stime = 0; diff -u --recursive --new-file v2.1.106/linux/kernel/kmod.c linux/kernel/kmod.c --- v2.1.106/linux/kernel/kmod.c Tue Jun 23 10:01:30 1998 +++ linux/kernel/kmod.c Wed Jun 24 16:00:16 1998 @@ -33,7 +33,8 @@ #define task_init task[smp_num_cpus] static inline void -use_init_file_context(void) { +use_init_file_context(void) +{ lock_kernel(); /* don't use the user's root, use init's root instead */ @@ -63,7 +64,7 @@ spin_unlock_irq(¤t->sigmask_lock); for (i = 0; i < current->files->max_fds; i++ ) { - if (current->files->fd[i]) close(i); + if (current->files->fd[i]) close(i); } /* Give kmod all privileges.. */ diff -u --recursive --new-file v2.1.106/linux/kernel/resource.c linux/kernel/resource.c --- v2.1.106/linux/kernel/resource.c Tue May 13 22:41:20 1997 +++ linux/kernel/resource.c Wed Jun 24 14:30:11 1998 @@ -143,7 +143,7 @@ if (iotable[i].num == 0) break; if (i == IOTABLE_SIZE) { - /* Driver prints a warning typicaly. */ + /* Driver prints a warning typically. */ return 0; } diff -u --recursive --new-file v2.1.106/linux/kernel/sched.c linux/kernel/sched.c --- v2.1.106/linux/kernel/sched.c Tue Jun 23 10:01:30 1998 +++ linux/kernel/sched.c Wed Jun 24 14:30:11 1998 @@ -169,7 +169,7 @@ * The run-queue lock locks the parts that actually access * and change the run-queues, and have to be interrupt-safe. */ -spinlock_t scheduler_lock = SPIN_LOCK_UNLOCKED; /* should be aquired first */ +spinlock_t scheduler_lock = SPIN_LOCK_UNLOCKED; /* should be acquired first */ spinlock_t runqueue_lock = SPIN_LOCK_UNLOCKED; /* second */ rwlock_t tasklist_lock = RW_LOCK_UNLOCKED; /* third */ @@ -1249,9 +1249,9 @@ newprio = 40; /* * do a "normalization" of the priority (traditionally - * unix nice values are -20..20, linux doesn't really + * Unix nice values are -20 to 20; Linux doesn't really * use that kind of thing, but uses the length of the - * timeslice instead (default 150 msec). The rounding is + * timeslice instead (default 150 ms). The rounding is * why we want to avoid negative values. */ newprio = (newprio * DEF_PRIORITY + 10) / 20; diff -u --recursive --new-file v2.1.106/linux/kernel/signal.c linux/kernel/signal.c --- v2.1.106/linux/kernel/signal.c Tue Jun 23 10:01:30 1998 +++ linux/kernel/signal.c Wed Jun 24 14:30:11 1998 @@ -255,7 +255,7 @@ t->exit_code = 0; sigdelsetmask(&t->signal, (sigmask(SIGSTOP)|sigmask(SIGTSTP)| sigmask(SIGTTOU)|sigmask(SIGTTIN))); - /* Inflict this corner case with recalculaions, not mainline */ + /* Inflict this corner case with recalculations, not mainline */ recalc_sigpending(t); break; @@ -263,7 +263,7 @@ case SIGTTIN: case SIGTTOU: /* If we're stopping again, cancel SIGCONT */ sigdelset(&t->signal, SIGCONT); - /* Inflict this corner case with recalculaions, not mainline */ + /* Inflict this corner case with recalculations, not mainline */ recalc_sigpending(t); break; } diff -u --recursive --new-file v2.1.106/linux/kernel/sys.c linux/kernel/sys.c --- v2.1.106/linux/kernel/sys.c Sun Jun 7 11:16:40 1998 +++ linux/kernel/sys.c Wed Jun 24 14:30:11 1998 @@ -259,9 +259,9 @@ * * The general idea is that a program which uses just setregid() will be * 100% compatible with BSD. A program which uses just setgid() will be - * 100% compatible with POSIX w/ Saved ID's. + * 100% compatible with POSIX with saved IDs. * - * SMP: There are not races, the gid's are checked only by filesystem + * SMP: There are not races, the GIDs are checked only by filesystem * operations (as far as semantic preservation is concerned). */ asmlinkage int sys_setregid(gid_t rgid, gid_t egid) @@ -366,7 +366,7 @@ * * The general idea is that a program which uses just setreuid() will be * 100% compatible with BSD. A program which uses just setuid() will be - * 100% compatible with POSIX w/ Saved ID's. + * 100% compatible with POSIX with saved IDs. */ asmlinkage int sys_setreuid(uid_t ruid, uid_t euid) { @@ -421,7 +421,7 @@ /* - * setuid() is implemented like SysV w/ SAVED_IDS + * setuid() is implemented like SysV with SAVED_IDS * * Note that SAVED_ID's is deficient in that a setuid root program * like sendmail, for example, cannot set its uid to be a normal @@ -465,7 +465,7 @@ /* - * This function implementes a generic ability to update ruid, euid, + * This function implements a generic ability to update ruid, euid, * and suid. This allows you to implement the 4.4 compatible seteuid(). */ asmlinkage int sys_setresuid(uid_t ruid, uid_t euid, uid_t suid) @@ -763,7 +763,7 @@ } /* - * Supplementary group ID's + * Supplementary group IDs */ asmlinkage int sys_getgroups(int gidsetsize, gid_t *grouplist) { diff -u --recursive --new-file v2.1.106/linux/lib/inflate.c linux/lib/inflate.c --- v2.1.106/linux/lib/inflate.c Thu Apr 11 23:49:48 1996 +++ linux/lib/inflate.c Wed Jun 24 14:30:11 1998 @@ -11,7 +11,7 @@ /* Inflate deflated (PKZIP's method 8 compressed) data. The compression method searches for as much of the current string of bytes (up to a - length of 258) in the previous 32K bytes. If it doesn't find any + length of 258) in the previous 32 K bytes. If it doesn't find any matches (of at least length 3), it codes the next byte. Otherwise, it codes the length of the matched string and its distance backwards from the current position. There is a single Huffman code that codes both @@ -28,7 +28,7 @@ There are (currently) three kinds of inflate blocks: stored, fixed, and dynamic. The compressor deals with some chunk of data at a time, and decides which method to use on a chunk-by-chunk basis. A chunk might - typically be 32K or 64K. If the chunk is uncompressible, then the + typically be 32 K or 64 K. If the chunk is incompressible, then the "stored" method is used. In this case, the bytes are simply stored as is, eight bits per byte, with none of the above coding. The bytes are preceded by a count, since there is no longer an EOB code. @@ -143,11 +143,11 @@ STATIC int inflate OF((void)); -/* The inflate algorithm uses a sliding 32K byte window on the uncompressed +/* The inflate algorithm uses a sliding 32 K byte window on the uncompressed stream to find repeated byte strings. This is implemented here as a circular buffer. The index is updated simply by incrementing and then - and'ing with 0x7fff (32K-1). */ -/* It is left to other modules to supply the 32K area. It is assumed + ANDing with 0x7fff (32K-1). */ +/* It is left to other modules to supply the 32 K area. It is assumed to be usable as if it were declared "uch slide[32768];" or as just "uch *slide;" and then malloc'ed in the latter case. The definition must be in unzip.h, included above. */ @@ -1044,7 +1044,7 @@ } /* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ diff -u --recursive --new-file v2.1.106/linux/mm/filemap.c linux/mm/filemap.c --- v2.1.106/linux/mm/filemap.c Tue Jun 23 10:01:30 1998 +++ linux/mm/filemap.c Wed Jun 24 14:30:11 1998 @@ -216,20 +216,19 @@ * free it from the page hash-queues etc, as we don't want to keep it * in-core unnecessarily. */ -unsigned long page_unuse(unsigned long page) +unsigned long page_unuse(struct page * page) { - struct page * p = mem_map + MAP_NR(page); - int count = atomic_read(&p->count); + int count = atomic_read(&page->count); if (count != 2) return count; - if (!p->inode) + if (!page->inode) return count; - if (PageSwapCache(p)) + if (PageSwapCache(page)) panic ("Doing a normal page_unuse of a swap cache page"); - remove_page_from_hash_queue(p); - remove_page_from_inode_queue(p); - free_page(page); + remove_page_from_hash_queue(page); + remove_page_from_inode_queue(page); + __free_page(page); return 1; } @@ -902,7 +901,7 @@ goto success; /* - * Uhhuh.. Things didn't work out. Return zero to tell the + * Things didn't work out. Return zero to tell the * mm layer so, possibly freeing the page cache page first. */ failure: @@ -1413,7 +1412,7 @@ set_bit(PG_uptodate, &page->flags); do_update_page: - /* Alright, the page is there. Now update it. */ + /* All right, the page is there. Now update it. */ status = inode->i_op->updatepage(file, page, buf, offset, bytes, sync); done_with_page: diff -u --recursive --new-file v2.1.106/linux/mm/page_alloc.c linux/mm/page_alloc.c --- v2.1.106/linux/mm/page_alloc.c Fri May 8 23:14:57 1998 +++ linux/mm/page_alloc.c Wed Jun 24 14:30:11 1998 @@ -101,7 +101,7 @@ spinlock_t page_alloc_lock = SPIN_LOCK_UNLOCKED; /* - * This routine is used by the kernel swap deamon to determine + * This routine is used by the kernel swap daemon to determine * whether we have "enough" free pages. It is fairly arbitrary, * but this had better return false if any reasonable "get_free_page()" * allocation could currently fail.. @@ -182,9 +182,11 @@ if (PageSwapCache(page)) panic ("Freeing swap cache page"); free_pages_ok(page->map_nr, 0); + return; } if (PageSwapCache(page) && atomic_read(&page->count) == 1) - panic ("Releasing swap cache page"); + printk(KERN_WARNING "VM: Releasing swap cache page at %p", + __builtin_return_address(0)); } void free_pages(unsigned long addr, unsigned long order) @@ -202,8 +204,9 @@ return; } if (PageSwapCache(map) && atomic_read(&map->count) == 1) - panic ("Releasing swap cache pages at %p", - __builtin_return_address(0)); + printk(KERN_WARNING + "VM: Releasing swap cache pages at %p", + __builtin_return_address(0)); } } diff -u --recursive --new-file v2.1.106/linux/mm/page_io.c linux/mm/page_io.c --- v2.1.106/linux/mm/page_io.c Wed Apr 8 19:36:29 1998 +++ linux/mm/page_io.c Wed Jun 24 14:30:11 1998 @@ -142,7 +142,7 @@ if (swapf->i_op->bmap == NULL && swapf->i_op->smap != NULL){ /* - With MsDOS, we use msdos_smap which return + With MS-DOS, we use msdos_smap which return a sector number (not a cluster or block number). It is a patch to enable the UMSDOS project. Other people are working on better solution. diff -u --recursive --new-file v2.1.106/linux/mm/slab.c linux/mm/slab.c --- v2.1.106/linux/mm/slab.c Tue Mar 17 22:18:15 1998 +++ linux/mm/slab.c Wed Jun 24 14:30:11 1998 @@ -70,7 +70,7 @@ * * Calls to printk() are not 100% safe (the function is not threaded). However, * printk() is only used under an error condition, and the risk is v. small (not - * sure if the console write functions 'enjoy' executing multiple contextes in + * sure if the console write functions 'enjoy' executing multiple contexts in * parallel. I guess they don't...). * Note, for most calls to printk() any held cache-lock is dropped. This is not * always done for text size reasons - having *_unlock() everywhere is bloat. @@ -92,11 +92,11 @@ * index to hold the bufctls. This allows the bufctl structure to * be small (one word), but limits the number of objects a slab (not * a cache) can contain when off-slab bufctls are used. The limit is the - * size of the largest general-cache that does not use off-slab bufctls, + * size of the largest general cache that does not use off-slab bufctls, * divided by the size of a bufctl. For 32bit archs, is this 256/4 = 64. * This is not serious, as it is only for large objects, when it is unwise * to have too many per slab. - * Note: This limit can be raised by introducing a general-cache whose size + * Note: This limit can be raised by introducing a general cache whose size * is less than 512 (PAGE_SIZE<<3), but greater than 256. */ @@ -124,12 +124,12 @@ * * SLAB_DEBUG_SUPPORT - 1 for kmem_cache_create() to honour; SLAB_DEBUG_FREE, * SLAB_DEBUG_INITIAL, SLAB_RED_ZONE & SLAB_POISON. - * 0 for faster, smaller, code (espically in the critical paths). + * 0 for faster, smaller, code (especially in the critical paths). * * SLAB_STATS - 1 to collect stats for /proc/slabinfo. - * 0 for faster, smaller, code (espically in the critical paths). + * 0 for faster, smaller, code (especially in the critical paths). * - * SLAB_SELFTEST - 1 to perform a few tests, mainly for developement. + * SLAB_SELFTEST - 1 to perform a few tests, mainly for development. */ #define SLAB_MGMT_CHECKS 1 #define SLAB_DEBUG_SUPPORT 0 @@ -180,7 +180,7 @@ s_dma:1; } kmem_slab_t; -/* When the slab mgmt is on-slab, this gives the size to use. */ +/* When the slab management is on-slab, this gives the size to use. */ #define slab_align_size (L1_CACHE_ALIGN(sizeof(kmem_slab_t))) /* Test for end of slab chain. */ @@ -188,7 +188,7 @@ /* s_magic */ #define SLAB_MAGIC_ALLOC 0xA5C32F2BUL /* slab is alive */ -#define SLAB_MAGIC_DESTROYED 0xB2F23C5AUL /* slab has been destoryed */ +#define SLAB_MAGIC_DESTROYED 0xB2F23C5AUL /* slab has been destroyed */ /* Bufctl's are used for linking objs within a slab, identifying what slab an obj * is in, and the address of the associated obj (for sanity checking with off-slab @@ -260,9 +260,9 @@ }; /* internal c_flags */ -#define SLAB_CFLGS_OFF_SLAB 0x010000UL /* slab mgmt in own cache */ +#define SLAB_CFLGS_OFF_SLAB 0x010000UL /* slab management in own cache */ #define SLAB_CFLGS_BUFCTL 0x020000UL /* bufctls in own cache */ -#define SLAB_CFLGS_GENERAL 0x080000UL /* a general-cache */ +#define SLAB_CFLGS_GENERAL 0x080000UL /* a general cache */ /* c_dflags (dynamic flags). Need to hold the spinlock to access this member */ #define SLAB_CFLGS_GROWN 0x000002UL /* don't reap a recently grown */ @@ -307,7 +307,7 @@ /* maximum num of pages for a slab (prevents large requests to the VM layer) */ #define SLAB_MAX_GFP_ORDER 5 /* 32 pages */ -/* the 'prefered' minimum num of objs per slab - maybe less for large objs */ +/* the 'preferred' minimum num of objs per slab - maybe less for large objs */ #define SLAB_MIN_OBJS_PER_SLAB 4 /* If the num of objs per slab is <= SLAB_MIN_OBJS_PER_SLAB, @@ -325,7 +325,7 @@ #define SLAB_SET_PAGE_SLAB(pg, x) ((pg)->prev = (struct page *)(x)) #define SLAB_GET_PAGE_SLAB(pg) ((kmem_slab_t *)(pg)->prev) -/* Size description struct for general-caches. */ +/* Size description struct for general caches. */ typedef struct cache_sizes { size_t cs_size; kmem_cache_t *cs_cachep; @@ -350,7 +350,7 @@ {0, NULL} }; -/* Names for the general-caches. Not placed into the sizes struct for +/* Names for the general caches. Not placed into the sizes struct for * a good reason; the string ptr is not needed while searching in kmalloc(), * and would 'get-in-the-way' in the h/w cache. */ @@ -396,7 +396,7 @@ /* Place maintainer for reaping. */ static kmem_cache_t *clock_searchp = &cache_cache; -/* Internal slab mgmt cache, for when slab mgmt is off-slab. */ +/* Internal slab management cache, for when slab management is off-slab. */ static kmem_cache_t *cache_slabp = NULL; /* Max number of objs-per-slab for caches which use bufctl's. @@ -463,9 +463,9 @@ char **names = cache_sizes_name; cache_sizes_t *sizes = cache_sizes; do { - /* For performance, all the general-caches are L1 aligned. + /* For performance, all the general caches are L1 aligned. * This should be particularly beneficial on SMP boxes, as it - * elimantes "false sharing". + * eliminates "false sharing". * Note for systems short on memory removing the alignment will * allow tighter packing of the smaller caches. */ if (!(sizes->cs_cachep = @@ -562,7 +562,7 @@ } #endif /* SLAB_DEBUG_SUPPORT */ -/* Three slab chain funcs - all called with ints disabled and the appropiate +/* Three slab chain funcs - all called with ints disabled and the appropriate * cache-lock held. */ static inline void @@ -630,7 +630,7 @@ #if SLAB_DEBUG_SUPPORT else if (cachep->c_flags & SLAB_POISON) { if (kmem_check_poison_obj(cachep, objp)) - printk(KERN_ERR "kmem_slab_destory: " + printk(KERN_ERR "kmem_slab_destroy: " "Bad poison - %s\n", cachep->c_name); } if (cachep->c_flags & SLAB_RED_ZONE) @@ -714,7 +714,7 @@ } if (offset < 0 || offset > size) { - printk("%sOffset weired %d - %s\n", func_nm, (int) offset, name); + printk("%sOffset weird %d - %s\n", func_nm, (int) offset, name); offset = 0; } @@ -781,11 +781,11 @@ if (flags & SLAB_HWCACHE_ALIGN) align = L1_CACHE_BYTES; - /* Determine if the slab mgmt and/or bufclts are 'on' or 'off' slab. */ + /* Determine if the slab management and/or bufclts are 'on' or 'off' slab. */ extra = sizeof(kmem_bufctl_t); if (size < (PAGE_SIZE>>3)) { /* Size is small(ish). Use packing where bufctl size per - * obj is low, and slab mngmnt is on-slab. + * obj is low, and slab management is on-slab. */ #if 0 if ((flags & SLAB_HIGH_PACK)) { @@ -802,7 +802,7 @@ } #endif } else { - /* Size is large, assume best to place the slab mngmnt obj + /* Size is large, assume best to place the slab management obj * off-slab (should allow better packing of objs). */ flags |= SLAB_CFLGS_OFF_SLAB; @@ -811,7 +811,7 @@ /* To avoid waste the bufctls are off-slab... */ flags |= SLAB_CFLGS_BUFCTL; extra = 0; - } /* else slab mngmnt is off-slab, but freelist ptrs are on. */ + } /* else slab management is off-slab, but freelist pointers are on. */ } size += extra; @@ -1018,8 +1018,8 @@ printk(KERN_ERR "kmem_shrink: Invalid cache addr %p\n", cachep); return 2; found: - /* Relase the sempahore before getting the cache-lock. This could - * mean multiple engines are shrinking the cache, but so what... + /* Release the semaphore before getting the cache-lock. This could + * mean multiple engines are shrinking the cache, but so what. */ up(&cache_chain_sem); spin_lock_irq(&cachep->c_spinlock); @@ -1041,17 +1041,17 @@ return ret; } -/* Get the mem for a slab mgmt obj. */ +/* Get the memory for a slab management obj. */ static inline kmem_slab_t * kmem_cache_slabmgmt(kmem_cache_t *cachep, void *objp, int local_flags) { kmem_slab_t *slabp; if (SLAB_OFF_SLAB(cachep->c_flags)) { - /* Slab mgmt obj is off-slab. */ + /* Slab management obj is off-slab. */ slabp = kmem_cache_alloc(cache_slabp, local_flags); } else { - /* Slab mgmnt at end of slab mem, placed so that + /* Slab management at end of slab memory, placed so that * the position is 'coloured'. */ void *end; @@ -1199,7 +1199,7 @@ if (!(objp = kmem_getpages(cachep, flags, &dma))) goto failed; - /* Get slab mgmt. */ + /* Get slab management. */ if (!(slabp = kmem_cache_slabmgmt(cachep, objp+offset, local_flags))) goto opps1; if (dma) @@ -1253,7 +1253,7 @@ if (local_flags != SLAB_ATOMIC && cachep->c_gfporder) { /* For large order (>0) slabs, we try again. * Needed because the gfp() functions are not good at giving - * out contigious pages unless pushed (but do not push too hard). + * out contiguous pages unless pushed (but do not push too hard). */ if (cachep->c_failures++ < 4 && cachep->c_freep == kmem_slab_end(cachep)) goto re_try; @@ -1632,19 +1632,19 @@ goto bad_ptr; /* Assume we own the page structure - hence no locking. - * If someone is misbehaving (eg. someone calling us with a bad + * If someone is misbehaving (for example, calling us with a bad * address), then access to the page structure can race with the - * kmem_slab_destory() code. Need to add a spin_lock to each page + * kmem_slab_destroy() code. Need to add a spin_lock to each page * structure, which would be useful in threading the gfp() functions.... */ page = &mem_map[nr]; if (PageSlab(page)) { kmem_cache_t *cachep; - /* Here, we (again) assume the obj address is good. + /* Here, we again assume the obj address is good. * If it isn't, and happens to map onto another - * general-cache page which has no active objs, then - * we race.... + * general cache page which has no active objs, then + * we race. */ cachep = SLAB_GET_PAGE_CACHE(page); if (cachep && (cachep->c_flags & SLAB_CFLGS_GENERAL)) { @@ -1698,9 +1698,9 @@ { cache_sizes_t *csizep = cache_sizes; - /* This function could be moved to the header-file, and + /* This function could be moved to the header file, and * made inline so consumers can quickly determine what - * cache-ptr they require. + * cache pointer they require. */ for (; csizep->cs_size; csizep++) { if (size > csizep->cs_size) @@ -1729,7 +1729,7 @@ return; } - /* We really need a test semphore op so we can avoid sleeping when + /* We really need a test semaphore op so we can avoid sleeping when * !wait is true. */ down(&cache_chain_sem); @@ -1762,8 +1762,8 @@ dma_flag = 0; full_free = 0; - /* Count num of fully free slabs. Hopefully there are not many, - * we are holding the cache lock.... + /* Count the fully free slabs. There should not be not many, + * since we are holding the cache lock. */ slabp = searchp->c_lastp; while (!slabp->s_inuse && slabp != kmem_slab_end(searchp)) { @@ -1803,7 +1803,7 @@ up(&cache_chain_sem); if (!best_cachep) { - /* couldn't find anthying to reap */ + /* couldn't find anything to reap */ return; } diff -u --recursive --new-file v2.1.106/linux/mm/swap.c linux/mm/swap.c --- v2.1.106/linux/mm/swap.c Thu May 7 22:51:55 1998 +++ linux/mm/swap.c Wed Jun 24 14:30:11 1998 @@ -6,7 +6,7 @@ /* * This file contains the default values for the opereation of the - * Linux VM subsystem. Finetuning documentation can be found in + * Linux VM subsystem. Fine-tuning documentation can be found in * linux/Documentation/sysctl/vm.txt. * Started 18.12.91 * Swap aging added 23.2.95, Stephen Tweedie. diff -u --recursive --new-file v2.1.106/linux/mm/swapfile.c linux/mm/swapfile.c --- v2.1.106/linux/mm/swapfile.c Tue Jun 23 10:01:30 1998 +++ linux/mm/swapfile.c Wed Jun 24 14:30:11 1998 @@ -177,7 +177,7 @@ * that the page has been used or is no longer needed. * * Always set the resulting pte to be nowrite (the same as COW pages - * after one process has exited). We don't know just how many ptes will + * after one process has exited). We don't know just how many PTEs will * share this swap entry, so be cautious and let do_wp_page work out * what to do if a write is requested later. */ diff -u --recursive --new-file v2.1.106/linux/mm/vmscan.c linux/mm/vmscan.c --- v2.1.106/linux/mm/vmscan.c Thu May 7 22:51:55 1998 +++ linux/mm/vmscan.c Wed Jun 24 14:30:11 1998 @@ -88,7 +88,7 @@ * pages, then delete the swap cache. We can only do this if * the swap page's reference count is one: ie. there are no * other references to it beyond the swap cache (as there must - * still be pte's pointing to it if count > 1). + * still be PTEs pointing to it if count > 1). * * If the page has NOT been touched, and its age reaches zero, * then we are swapping it out: @@ -107,7 +107,17 @@ if (PageSwapCache(page_map)) { if (pte_write(pte)) { + struct page *found; printk ("VM: Found a writable swap-cached page!\n"); + /* Try to diagnose the problem ... */ + found = find_page(&swapper_inode, page_map->offset); + if (found) { + printk("page=%p@%08lx, found=%p, count=%d\n", + page_map, page_map->offset, + found, atomic_read(&found->count)); + __free_page(found); + } else + printk ("Spurious, page not in cache\n"); return 0; } } @@ -144,9 +154,8 @@ * we have the swap cache set up to associate the * page with that swap entry. */ - if (PageSwapCache(page_map)) { - entry = page_map->offset; - } else { + entry = in_swap_cache(page_map); + if (!entry) { entry = get_swap_page(); if (!entry) return 0; /* No swap space left */ @@ -219,8 +228,8 @@ flush_cache_page(vma, address); pte_clear(page_table); flush_tlb_page(vma, address); - entry = page_unuse(page); - free_page(page); + entry = page_unuse(page_map); + __free_page(page_map); return entry; } @@ -584,6 +593,7 @@ } /* As if we could ever get here - maybe we want to make this killable */ remove_wait_queue(&kswapd_wait, &wait); + unlock_kernel(); return 0; } diff -u --recursive --new-file v2.1.106/linux/net/appletalk/aarp.c linux/net/appletalk/aarp.c --- v2.1.106/linux/net/appletalk/aarp.c Thu Feb 12 20:56:14 1998 +++ linux/net/appletalk/aarp.c Wed Jun 24 14:33:10 1998 @@ -1,6 +1,6 @@ /* - * AARP: An implementation of the Appletalk aarp protocol for - * ethernet 'ELAP'. + * AARP: An implementation of the AppleTalk AARP protocol for + * Ethernet 'ELAP'. * * Alan Cox * @@ -20,7 +20,7 @@ * * * References: - * Inside Appletalk (2nd Ed). + * Inside AppleTalk (2nd Ed). */ #include @@ -430,7 +430,7 @@ skb->nh.raw=skb->data; /* - * Check for localtalk first + * Check for LocalTalk first */ @@ -645,7 +645,7 @@ /* * This is called by the SNAP driver whenever we see an AARP SNAP - * frame. We currently only support ethernet. + * frame. We currently only support Ethernet. */ static int aarp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt) { @@ -658,7 +658,7 @@ /* - * We only do ethernet SNAP AARP + * We only do Ethernet SNAP AARP */ if(dev->type!=ARPHRD_ETHER) diff -u --recursive --new-file v2.1.106/linux/net/appletalk/ddp.c linux/net/appletalk/ddp.c --- v2.1.106/linux/net/appletalk/ddp.c Sun Jun 7 11:16:40 1998 +++ linux/net/appletalk/ddp.c Wed Jun 24 14:33:10 1998 @@ -1,6 +1,6 @@ /* - * DDP: An implementation of the Appletalk DDP protocol for - * ethernet 'ELAP'. + * DDP: An implementation of the AppleTalk DDP protocol for + * Ethernet 'ELAP'. * * Alan Cox * @@ -18,17 +18,17 @@ * Alan Cox : Added firewall hooks. * Alan Cox : Supports new ARPHRD_LOOPBACK * Christer Weinigel : Routing and /proc fixes. - * Bradford Johnson : Localtalk. + * Bradford Johnson : LocalTalk. * Tom Dyas : Module support. * Alan Cox : Hooks for PPP (based on the - * localtalk hook). + * LocalTalk hook). * Alan Cox : Posix bits * Alan Cox/Mike Freeman : Possible fix to NBP problems * Bradford Johnson : IP-over-DDP (experimental) * Jay Schulist : Moved IP-over-DDP to its own * driver file. (ipddp.c & ipddp.h) * Jay Schulist : Made work as module with - * Appletalk drivers, cleaned it. + * AppleTalk drivers, cleaned it. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -197,7 +197,7 @@ off_t begin=0; /* - * Output the appletalk data for the /proc virtual fs. + * Output the AppleTalk data for the /proc filesystem. */ len += sprintf(buffer,"Type local_addr remote_addr tx_queue rx_queue st uid\n"); @@ -241,7 +241,7 @@ /**************************************************************************\ * * -* Routing tables for the Appletalk socket layer. * +* Routing tables for the AppleTalk socket layer. * * * \**************************************************************************/ @@ -250,7 +250,7 @@ static struct atalk_route atrtr_default; /* For probing devices or in a routerless network */ /* - * Appletalk interface control + * AppleTalk interface control */ /* @@ -476,7 +476,7 @@ /* - * Find a route for an appletalk packet. This ought to get cached in + * Find a route for an AppleTalk packet. This ought to get cached in * the socket (later on...). We know about host routes and the fact * that a route must be direct to broadcast. */ @@ -504,7 +504,7 @@ /* - * Given an appletalk network find the device to use. This can be + * Given an AppleTalk network, find the device to use. This can be * a simple lookup. */ struct device *atrtr_get_dev(struct at_addr *sa) @@ -732,8 +732,8 @@ nr=(struct netrange *)&sa->sat_zero[0]; /* - * Phase 1 is fine on Localtalk but we don't do - * Ethertalk phase 1. Anyone wanting to add it go ahead. + * Phase 1 is fine on LocalTalk but we don't do + * EtherTalk phase 1. Anyone wanting to add it go ahead. */ if(dev->type == ARPHRD_ETHER && nr->nr_phase != 2) return (-EPROTONOSUPPORT); @@ -947,7 +947,7 @@ /**************************************************************************\ * * * Handling for system calls applied via the various interfaces to an * -* Appletalk socket object. * +* AppleTalk socket object. * * * \**************************************************************************/ @@ -1201,7 +1201,7 @@ } /* - * Find the name of an appletalk socket. Just copy the right + * Find the name of an AppleTalk socket. Just copy the right * fields into the sockaddr. */ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr, @@ -1299,7 +1299,7 @@ */ if(ddp->deh_sum && atalk_checksum(ddp, ddp->deh_len) != ddp->deh_sum) { - /* Not a valid appletalk frame - dustbin time */ + /* Not a valid AppleTalk frame - dustbin time */ kfree_skb(skb); return (0); } @@ -1318,7 +1318,7 @@ atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode); /* - * Not ours, so we route the packet via the correct Appletalk interface. + * Not ours, so we route the packet via the correct AppleTalk interface. */ if(atif == NULL) { @@ -1377,7 +1377,7 @@ * Send the buffer onwards * * Now we must always be careful. If it's come from - * localtalk to ethertalk it might not fit + * LocalTalk to EtherTalk it might not fit * * Order matters here: If a packet has to be copied * to make a new headroom (rare hopefully) then it @@ -1458,7 +1458,7 @@ } /* - * Receive a localtalk frame. We make some demands on the caller here. + * Receive a LocalTalk frame. We make some demands on the caller here. * Caller must provide enough headroom on the packet to pull the short * header and append a long one. */ @@ -1765,7 +1765,7 @@ } /* - * Appletalk ioctl calls. + * AppleTalk ioctl calls. */ static int atalk_ioctl(struct socket *sock,unsigned int cmd, unsigned long arg) { @@ -1910,7 +1910,7 @@ static char ddp_snap_id[] = {0x08, 0x00, 0x07, 0x80, 0x9B}; /* - * Export symbols for use by drivers when Appletalk is a module. + * Export symbols for use by drivers when AppleTalk is a module. */ EXPORT_SYMBOL(aarp_send_ddp); EXPORT_SYMBOL(atrtr_get_dev); @@ -1969,7 +1969,7 @@ atalk_register_sysctl(); #endif /* CONFIG_SYSCTL */ - printk(KERN_INFO "Appletalk 0.18 for Linux NET3.037\n"); + printk(KERN_INFO "AppleTalk 0.18 for Linux NET3.037\n"); } #ifdef MODULE @@ -1986,10 +1986,10 @@ * Use counts are incremented/decremented when * sockets are created/deleted. * - * Appletalk interfaces are not incremented untill atalkd is run + * AppleTalk interfaces are not incremented untill atalkd is run * and are only decremented when they are downed. * - * Ergo, before the appletalk module can be removed, all Appletalk + * Ergo, before the AppleTalk module can be removed, all AppleTalk * sockets be closed from user space. */ diff -u --recursive --new-file v2.1.106/linux/net/appletalk/sysctl_net_atalk.c linux/net/appletalk/sysctl_net_atalk.c --- v2.1.106/linux/net/appletalk/sysctl_net_atalk.c Sat Sep 13 11:07:29 1997 +++ linux/net/appletalk/sysctl_net_atalk.c Wed Jun 24 14:33:10 1998 @@ -1,5 +1,5 @@ /* -*- linux-c -*- - * sysctl_net_atalk.c: sysctl interface to net Appletalk subsystem. + * sysctl_net_atalk.c: sysctl interface to net AppleTalk subsystem. * * Begun April 1, 1996, Mike Shaver. * Added /proc/sys/net/atalk directory entry (empty =) ). [MS] diff -u --recursive --new-file v2.1.106/linux/net/wanrouter/wanmain.c linux/net/wanrouter/wanmain.c --- v2.1.106/linux/net/wanrouter/wanmain.c Sun Jun 7 11:16:40 1998 +++ linux/net/wanrouter/wanmain.c Wed Jun 24 14:34:44 1998 @@ -5,7 +5,7 @@ * the following common services for the WAN Link Drivers: * o WAN device managenment (registering, unregistering) * o Network interface management -* o Physical connection management (dial-up, incomming calls) +* o Physical connection management (dial-up, incoming calls) * o Logical connection management (switched virtual circuits) * o Protocol encapsulation/decapsulation * diff -u --recursive --new-file v2.1.106/linux/scripts/Configure linux/scripts/Configure --- v2.1.106/linux/scripts/Configure Thu May 7 22:51:56 1998 +++ linux/scripts/Configure Wed Jun 24 14:30:11 1998 @@ -1,7 +1,7 @@ #! /bin/sh # -# This script is used to configure the linux kernel. +# This script is used to configure the Linux kernel. # # It was inspired by the challenge in the original Configure script # to ``do something better'', combined with the actual need to ``do @@ -525,7 +525,7 @@ mv .tmpconfig.h include/linux/autoconf.h echo -echo "The linux kernel is now hopefully configured for your setup." +echo "The Linux kernel should now be configured for your setup." echo "Check the top-level Makefile for additional configuration," echo "and do a 'make dep ; make clean' if you want to be sure all" echo "the files are correctly re-made" diff -u --recursive --new-file v2.1.106/linux/scripts/header.tk linux/scripts/header.tk --- v2.1.106/linux/scripts/header.tk Wed Apr 1 20:11:55 1998 +++ linux/scripts/header.tk Wed Jun 24 14:30:11 1998 @@ -431,7 +431,7 @@ catch {destroy $w} toplevel $w -class Dialog message $w.m -width 400 -aspect 300 -text \ - "The linux kernel is now hopefully configured for your setup. Check the top-level Makefile for additional configuration, and do a 'make dep ; make clean' if you want to be sure all the files are correctly re-made." -relief raised + "The Linux kernel should now be configured for your setup. Check the top-level Makefile for additional configuration, and do a 'make dep ; make clean' if you want to be sure all the files are correctly re-made." -relief raised label $w.bm -bitmap info pack $w.bm $w.m -pady 10 -side top -padx 10 wm title $w "Kernel build instructions"