Linux Kernel Patch v2.2, patch-2.2.7 (00/22)

39 views
Skip to first unread message

Thomas...@ciw.uni-karlsruhe.de

unread,
May 1, 1999, 3:00:00 AM5/1/99
to
Archive-name: v2.2/patch-2.2.7/part00

lines added deleted
linux/CREDITS : 27 7 6
linux/Documentation/Configure.help : 52 39 0
linux/Documentation/fb/matroxfb.txt : 25 3 3
linux/Documentation/filesystems/vfs.txt : 17 2 2
linux/Documentation/scsi-generic.txt : 636 636 0
linux/MAINTAINERS : 54 23 4
linux/Makefile : 16 2 2
linux/arch/alpha/kernel/setup.c : 22 7 2
linux/arch/alpha/kernel/time.c : 85 33 11
linux/arch/alpha/lib/clear_user.S : 7 1 0
linux/arch/alpha/lib/copy_user.S : 8 2 0
linux/arch/alpha/lib/strlen_user.S : 9 2 1
linux/arch/alpha/lib/strncpy_from_user.S : 15 2 0
linux/arch/i386/config.in : 8 2 0
linux/arch/i386/kernel/bios32.c : 16 3 0
linux/arch/i386/kernel/smp.c : 26 2 3
linux/arch/m68k/atari/atakeyb.c : 17 2 2
linux/arch/m68k/hp300/hil.c : 17 5 4
linux/arch/m68k/mac/mackeyb.c : 26 3 3
linux/arch/sparc/defconfig : 8 2 0
linux/arch/sparc/kernel/entry.S : 32 4 4
linux/arch/sparc/kernel/head.S : 53 7 9
linux/arch/sparc/kernel/irq.c : 344 79 122
linux/arch/sparc/kernel/process.c : 102 34 23
linux/arch/sparc/kernel/setup.c : 63 16 8
linux/arch/sparc/kernel/sun4d_irq.c : 14 2 2
linux/arch/sparc/kernel/sun4m_irq.c : 17 2 2
linux/arch/sparc/kernel/sun4m_smp.c : 26 2 2
linux/arch/sparc/kernel/systbls.S : 32 4 4
linux/arch/sparc/kernel/unaligned.c : 21 1 3
linux/arch/sparc/lib/atomic.S : 15 2 0
linux/arch/sparc/lib/bitops.S : 177 25 60
linux/arch/sparc/lib/debuglocks.c : 75 12 18
linux/arch/sparc/lib/irqlock.S : 75 1 64
linux/arch/sparc/mm/init.c : 5 1 1
linux/arch/sparc/mm/nosrmmu.c : 22 11 1
linux/arch/sparc/mm/srmmu.c : 47 16 2
linux/arch/sparc64/config.in : 13 2 1
linux/arch/sparc64/defconfig : 16 3 0
linux/arch/sparc64/kernel/cpu.c : 8 1 1
linux/arch/sparc64/kernel/entry.S : 52 35 2
linux/arch/sparc64/kernel/head.S : 26 4 4
linux/arch/sparc64/kernel/irq.c : 14 2 2
linux/arch/sparc64/kernel/psycho.c : 143 65 15
linux/arch/sparc64/kernel/setup.c : 61 10 12
linux/arch/sparc64/kernel/smp.c : 132 62 38
linux/arch/sparc64/kernel/systbls.S : 50 6 6
linux/arch/sparc64/kernel/traps.c : 31 2 5
linux/arch/sparc64/kernel/ttable.S : 16 3 3
linux/arch/sparc64/kernel/unaligned.c : 21 1 3
linux/arch/sparc64/mm/init.c : 27 9 1
linux/drivers/Makefile : 20 6 1
linux/drivers/acorn/char/keyb_ps2.c : 20 1 6
linux/drivers/block/ide-cd.h : 37 10 10
linux/drivers/block/rd.c : 8 2 0
linux/drivers/cdrom/optcd.c : 19 6 0
linux/drivers/char/Makefile : 17 3 2
linux/drivers/char/amikeyb.c : 28 4 4
linux/drivers/char/bttv.c : 31 18 0
linux/drivers/char/bttv.h : 37 10 1
linux/drivers/char/dn_keyb.c : 27 4 4
linux/drivers/char/keyboard.c : 101 18 20
linux/drivers/char/mem.c : 25 12 0
linux/drivers/char/n_tty.c : 16 8 2
linux/drivers/char/pc_keyb.c : 72 14 29
linux/drivers/char/radio-sf16fmi.c : 49 8 5
linux/drivers/char/radio-typhoon.c : 8 1 1
linux/drivers/char/softdog.c : 7 0 1
linux/drivers/macintosh/mac_keyb.c : 40 4 9
linux/drivers/net/3c523.c : 243 87 53
linux/drivers/net/ibmtr.c : 207 46 11
linux/drivers/net/irda/actisys.c : 19 3 3
linux/drivers/net/irda/esi.c : 47 6 6
linux/drivers/net/irda/girbil.c : 17 2 2
linux/drivers/net/irda/irport.c : 224 29 51
linux/drivers/net/irda/irtty.c : 667 165 150
linux/drivers/net/irda/pc87108.c : 218 44 56
linux/drivers/net/irda/tekram.c : 228 51 42
linux/drivers/net/irda/uircc.c : 88 14 11
linux/drivers/net/irda/w83977af_ir.c : 274 51 62
linux/drivers/net/net_init.c : 22 16 0
linux/drivers/net/pcnet32.c : 1801 889 616
linux/drivers/net/ppp.c : 402 239 34
linux/drivers/net/rrunner.c : 1295 371 313
linux/drivers/net/rrunner.h : 148 69 22
linux/drivers/net/z85230.c : 7 1 0
linux/drivers/pci/oldproc.c : 15 2 0
linux/drivers/sbus/audio/audio.c : 93 20 11
linux/drivers/sbus/audio/cs4231.c : 1126 330 367
linux/drivers/sbus/audio/cs4231.h : 27 21 0
linux/drivers/sbus/char/pcikbd.c : 61 10 19
linux/drivers/sbus/char/sunkbd.c : 8 1 1
linux/drivers/sbus/char/sunmouse.c : 81 20 12
linux/drivers/sbus/char/zs.c : 26 2 7
linux/drivers/scsi/ide-scsi.c : 21 4 4
linux/drivers/scsi/qlogicisp.c : 257 66 53
linux/drivers/scsi/qlogicisp_asm.c : 3313 2009 1279
linux/drivers/usb/CREDITS : 23 23 0
linux/drivers/usb/Config.in : 26 26 0
linux/drivers/usb/Makefile : 75 75 0
linux/drivers/usb/README.kbd : 65 65 0
linux/drivers/usb/README.ohci : 8 8 0
linux/drivers/usb/audio.c : 126 126 0
linux/drivers/usb/hub.c : 409 409 0
linux/drivers/usb/hub.h : 80 80 0
linux/drivers/usb/inits.h : 4 4 0
linux/drivers/usb/keyboard.c : 226 226 0
linux/drivers/usb/keymap.c : 50 50 0
linux/drivers/usb/maps/fixup.map : 31 31 0
linux/drivers/usb/maps/serial.map : 370 370 0
linux/drivers/usb/maps/usb.map : 233 233 0
linux/drivers/usb/mkmap : 83 83 0
linux/drivers/usb/mouse.c : 299 299 0
linux/drivers/usb/ohci-debug.c : 139 139 0
linux/drivers/usb/ohci.c : 1040 1040 0
linux/drivers/usb/ohci.h : 301 301 0
linux/drivers/usb/restart : 35 35 0
linux/drivers/usb/stopusb : 8 8 0
linux/drivers/usb/uhci-debug.c : 168 168 0
linux/drivers/usb/uhci.c : 1202 1202 0
linux/drivers/usb/uhci.h : 229 229 0
linux/drivers/usb/usb-debug.c : 127 127 0
linux/drivers/usb/usb.c : 616 616 0
linux/drivers/usb/usb.h : 371 371 0
linux/drivers/video/atyfb.c : 357 90 49
linux/drivers/video/creatorfb.c : 17 6 1
linux/drivers/video/fbcon-cfb2.c : 8 1 1
linux/drivers/video/fbcon-cfb4.c : 8 1 1
linux/drivers/video/fbcon.c : 80 26 7
linux/drivers/video/fbmem.c : 126 23 16
linux/drivers/video/leofb.c : 414 142 83
linux/drivers/video/matroxfb.c : 116 35 11
linux/drivers/video/promcon.c : 5 1 1
linux/drivers/video/sbusfb.c : 34 9 4
linux/fs/adfs/dir.c : 8 0 2
linux/fs/adfs/namei.c : 26 4 4
linux/fs/affs/dir.c : 9 0 3
linux/fs/affs/namei.c : 22 3 3
linux/fs/autofs/dir.c : 12 2 2
linux/fs/autofs/root.c : 51 6 9
linux/fs/buffer.c : 106 20 35
linux/fs/coda/dir.c : 117 6 37
linux/fs/dcache.c : 14 6 2
linux/fs/devpts/root.c : 74 8 14
linux/fs/ext2/dir.c : 8 0 2
linux/fs/ext2/namei.c : 29 4 4
linux/fs/fat/dir.c : 57 18 5
linux/fs/fat/fatfs_syms.c : 7 1 0
linux/fs/fat/inode.c : 26 3 3
linux/fs/fat/misc.c : 14 3 3
linux/fs/hfs/dir_cap.c : 37 3 7
linux/fs/hfs/dir_dbl.c : 36 3 7
linux/fs/hfs/dir_nat.c : 37 3 7
linux/fs/hpfs/hpfs_fs.c : 53 3 16
linux/fs/inode.c : 20 2 4
linux/fs/isofs/dir.c : 9 0 3
linux/fs/isofs/namei.c : 32 3 9
linux/fs/minix/dir.c : 8 0 2
linux/fs/minix/inode.c : 34 4 5
linux/fs/minix/namei.c : 48 3 9
linux/fs/msdos/namei.c : 26 3 3
linux/fs/namei.c : 16 4 5
linux/fs/ncpfs/Config.in : 10 5 0
linux/fs/ncpfs/Makefile : 8 1 1
linux/fs/ncpfs/dir.c : 697 183 211
linux/fs/ncpfs/inode.c : 312 148 19
linux/fs/ncpfs/ioctl.c : 85 65 0
linux/fs/ncpfs/ncplib_kernel.c : 90 49 5
linux/fs/ncpfs/ncplib_kernel.h : 123 92 1
linux/fs/ncpfs/symlink.c : 212 212 0
linux/fs/nfs/dir.c : 169 31 37
linux/fs/nfs/inode.c : 231 77 48
linux/fs/nls/Config.in : 8 1 1
linux/fs/ntfs/fs.c : 47 5 6
linux/fs/ntfs/inode.c : 8 2 0
linux/fs/proc/fd.c : 56 5 11
linux/fs/proc/openpromfs.c : 54 6 7
linux/fs/proc/root.c : 112 12 19
linux/fs/qnx4/dir.c : 9 0 3
linux/fs/qnx4/namei.c : 44 7 13
linux/fs/romfs/inode.c : 38 2 9
linux/fs/smbfs/dir.c : 26 3 3
linux/fs/sysv/dir.c : 15 1 3
linux/fs/sysv/namei.c : 58 3 14
linux/fs/ufs/dir.c : 13 0 7
linux/fs/ufs/namei.c : 31 4 4
linux/fs/umsdos/dir.c : 130 20 25
linux/fs/umsdos/namei.c : 165 13 68
linux/fs/umsdos/rdir.c : 40 7 6
linux/fs/vfat/namei.c : 161 31 60
linux/include/asm-alpha/keyboard.h : 15 0 2
linux/include/asm-alpha/semaphore.h : 117 38 27
linux/include/asm-alpha/siginfo.h : 8 1 1
linux/include/asm-alpha/uaccess.h : 108 34 18
linux/include/asm-arm/arch-arc/keyboard.h : 11 0 5
linux/include/asm-arm/arch-ebsa285/keyboard.h : 27 0 7
linux/include/asm-arm/arch-rpc/keyboard.h : 19 0 6
linux/include/asm-arm/arch-vnc/keyboard.h : 15 0 2
linux/include/asm-arm/siginfo.h : 8 1 1
linux/include/asm-i386/bitops.h : 62 7 7
linux/include/asm-i386/keyboard.h : 15 0 2
linux/include/asm-i386/siginfo.h : 8 1 1
linux/include/asm-i386/string.h : 8 1 1
linux/include/asm-m68k/keyboard.h : 11 0 5
linux/include/asm-mips/keyboard.h : 15 0 2
linux/include/asm-mips/siginfo.h : 8 1 1
linux/include/asm-ppc/keyboard.h : 39 0 19
linux/include/asm-ppc/siginfo.h : 8 1 1
linux/include/asm-sparc/asmmacro.h : 17 2 2
linux/include/asm-sparc/atomic.h : 19 6 5
linux/include/asm-sparc/floppy.h : 24 9 2
linux/include/asm-sparc/hardirq.h : 66 17 10
linux/include/asm-sparc/head.h : 14 1 3
linux/include/asm-sparc/irq.h : 81 13 40
linux/include/asm-sparc/keyboard.h : 21 1 3
linux/include/asm-sparc/namei.h : 17 1 4
linux/include/asm-sparc/siginfo.h : 8 1 1
linux/include/asm-sparc/softirq.h : 94 14 10
linux/include/asm-sparc/spinlock.h : 35 6 2
linux/include/asm-sparc/system.h : 14 3 1
linux/include/asm-sparc/timer.h : 23 3 3
linux/include/asm-sparc/uaccess.h : 16 2 3
linux/include/asm-sparc/unistd.h : 14 2 2
linux/include/asm-sparc/vaddrs.h : 14 2 2
linux/include/asm-sparc64/ide.h : 23 3 3
linux/include/asm-sparc64/keyboard.h : 21 1 3
linux/include/asm-sparc64/namei.h : 17 1 4
linux/include/asm-sparc64/psycho.h : 14 2 2
linux/include/asm-sparc64/siginfo.h : 8 1 1
linux/include/asm-sparc64/ttable.h : 28 12 2
linux/include/asm-sparc64/unistd.h : 14 2 2
linux/include/asm-sparc64/visasm.h : 14 2 2
linux/include/linux/adfs_fs.h : 8 1 1
linux/include/linux/affs_fs.h : 8 1 1
linux/include/linux/ext2_fs.h : 8 1 1
linux/include/linux/fb.h : 25 4 1
linux/include/linux/fs.h : 38 4 14
linux/include/linux/if_ppp.h : 45 5 10
linux/include/linux/if_pppvar.h : 16 2 1
linux/include/linux/in6.h : 65 36 2
linux/include/linux/irda.h : 120 120 0
linux/include/linux/iso_fs.h : 8 1 1
linux/include/linux/kbd_ll.h : 7 1 1
linux/include/linux/minix_fs.h : 8 1 1
linux/include/linux/msdos_fs.h : 26 3 3
linux/include/linux/ncp.h : 31 13 2
linux/include/linux/ncp_fs.h : 67 28 2
linux/include/linux/ncp_fs_sb.h : 10 4 0
linux/include/linux/ncp_mount.h : 18 7 5
linux/include/linux/pagemap.h : 8 0 2
linux/include/linux/pci.h : 9 3 0
linux/include/linux/proc_fs.h : 17 2 2
linux/include/linux/qnx4_fs.h : 8 1 1
linux/include/linux/sysctl.h : 35 16 2
linux/include/linux/sysv_fs.h : 8 1 1
linux/include/linux/ufs_fs.h : 8 1 1
linux/include/linux/umsdos_fs.p : 21 4 4
linux/include/linux/wireless.h : 52 15 3
linux/include/net/dst.h : 11 0 4
linux/include/net/flow.h : 12 2 0
linux/include/net/ipv6.h : 52 38 1
linux/include/net/irda/discovery.h : 16 2 1
linux/include/net/irda/ircomm_common.h : 54 16 3
linux/include/net/irda/irda.h : 49 13 4
linux/include/net/irda/irda_device.h : 121 43 21
linux/include/net/irda/iriap.h : 21 4 3
linux/include/net/irda/irkbd.h : 91 0 91
linux/include/net/irda/irlan_client.h : 27 5 4
linux/include/net/irda/irlan_common.h : 36 6 3
linux/include/net/irda/irlan_eth.h : 18 4 1
linux/include/net/irda/irlan_provider.h : 24 4 4
linux/include/net/irda/irlap.h : 28 8 8
linux/include/net/irda/irlap_frame.h : 17 1 3
linux/include/net/irda/irlmp.h : 52 14 14
linux/include/net/irda/irlpt_cli.h : 17 2 2
linux/include/net/irda/irmod.h : 32 17 2
linux/include/net/irda/irobex.h : 114 0 114
linux/include/net/irda/irttp.h : 17 2 2
linux/include/net/pkt_sched.h : 8 2 0
linux/include/net/route.h : 7 1 0
linux/include/net/sock.h : 34 4 3
linux/include/net/tcp.h : 49 17 4
linux/include/net/transp_v6.h : 18 3 2
linux/init/main.c : 26 5 1
linux/ipc/shm.c : 11 1 1
linux/mm/page_alloc.c : 8 1 1
linux/mm/vmalloc.c : 12 1 1
linux/mm/vmscan.c : 36 7 8
linux/net/802/tr.c : 85 17 5
linux/net/core/neighbour.c : 40 9 7
linux/net/core/scm.c : 16 9 1
linux/net/ipv4/af_inet.c : 44 12 12
linux/net/ipv4/ip_fw.c : 19 6 0
linux/net/ipv4/ip_input.c : 29 14 2
linux/net/ipv4/ip_sockglue.c : 18 3 2
linux/net/ipv4/route.c : 66 19 4
linux/net/ipv4/tcp.c : 43 8 5
linux/net/ipv4/tcp_input.c : 125 27 13
linux/net/ipv4/tcp_ipv4.c : 98 25 8
linux/net/ipv4/tcp_output.c : 107 12 12
linux/net/ipv4/tcp_timer.c : 26 3 3
linux/net/ipv6/Makefile : 9 2 1
linux/net/ipv6/af_inet6.c : 86 16 8
linux/net/ipv6/datagram.c : 113 34 13
linux/net/ipv6/ip6_fib.c : 28 4 4
linux/net/ipv6/ip6_flowlabel.c : 620 620 0
linux/net/ipv6/ip6_output.c : 95 13 24
linux/net/ipv6/ipv6_sockglue.c : 65 19 4
linux/net/ipv6/ndisc.c : 17 2 2
linux/net/ipv6/raw.c : 112 39 7
linux/net/ipv6/tcp_ipv6.c : 205 51 10
linux/net/ipv6/udp.c : 225 69 21
linux/net/irda/af_irda.c : 78 21 5
linux/net/irda/discovery.c : 35 4 4
linux/net/irda/ircomm/ircomm_common.c : 853 385 282
linux/net/irda/ircomm/irvtd_driver.c : 358 70 58
linux/net/irda/irda_device.c : 118 15 36
linux/net/irda/iriap.c : 272 60 46
linux/net/irda/irlan/irlan_client.c : 181 17 49
linux/net/irda/irlan/irlan_client_event.c : 56 5 10
linux/net/irda/irlan/irlan_common.c : 314 57 148
linux/net/irda/irlan/irlan_eth.c : 190 160 1
linux/net/irda/irlan/irlan_provider.c : 106 15 21
linux/net/irda/irlan/irlan_provider_event.c : 43 11 4
linux/net/irda/irlap.c : 147 25 40
linux/net/irda/irlap_event.c : 900 305 297
linux/net/irda/irlap_frame.c : 345 55 106
linux/net/irda/irlmp.c : 50 7 12
linux/net/irda/irlmp_event.c : 230 64 68
linux/net/irda/irlmp_frame.c : 177 39 46
linux/net/irda/irlpt/irlpt_cli.c : 19 3 3
linux/net/irda/irmod.c : 46 3 19
linux/net/irda/irsysctl.c : 29 7 2
linux/net/irda/irttp.c : 163 47 28
linux/net/irda/qos.c : 17 2 2
linux/net/irda/wrapper.c : 304 63 69
linux/net/netsyms.c : 34 14 0
linux/net/sched/cls_fw.c : 28 6 2
linux/net/sched/cls_rsvp.h : 30 7 7
linux/net/sched/sch_cbq.c : 7 0 1
linux/net/sched/sch_sfq.c : 7 0 1
linux/net/socket.c : 31 8 3
linux/scripts/ksymoops/oops.c : 8 1 1
--
Thomas Koenig, Thomas...@ciw.uni-karlsruhe.de, ig...@dkauni2.bitnet.
The joy of engineering is to find a straight line on a double
logarithmic diagram.

Thomas...@ciw.uni-karlsruhe.de

unread,
May 1, 1999, 3:00:00 AM5/1/99
to
Archive-name: v2.2/patch-2.2.7/part01

#!/bin/sh
# This is a shell archive
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
# existing files will NOT be overwritten unless -c is specified
#
# This is part 01 of a 22 - part archive
# do not concatenate these parts, unpack them in order with /bin/sh
#
if test -r _shar_seq_.tmp; then
echo 'Must unpack archives in sequence!'
echo Please unpack part `cat _shar_seq_.tmp` next
exit 1
fi
# ============= patch-2.2.7 ==============
if test -f 'patch-2.2.7' -a X"$1" != X"-c"; then
echo 'x - skipping patch-2.2.7 (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting patch-2.2.7 (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'patch-2.2.7' &&
diff -u --recursive --new-file v2.2.6/linux/CREDITS linux/CREDITS
--- v2.2.6/linux/CREDITS Tue Mar 23 14:35:46 1999
+++ linux/CREDITS Fri Apr 23 08:42:03 1999
@@ -810,12 +810,13 @@
X D: Transmeta BOFH in my copius free time
X
X N: Dirk Hohndel
-E: hoh...@aib.com
+E: hoh...@suse.de
X D: The XFree86[tm] Project
-S: AIB Software Corporation
-S: 46030 Manekin Plaza, Suite 160
-S: Dulles, Virginia 20166
-S: USA
+D: USB mouse maintainer
+S: SuSE Rhein/Main AG
+S: Mergenthalerallee 45-47
+S: 65760 Eschborn
+S: Germany
X
X N: Kenji Tsutomu Hollis
X E: kho...@bitgate.com
@@ -1874,7 +1875,7 @@
X
X N: Linus Torvalds
X E: torv...@transmeta.com
-W: http://www.cs.helsinki.fi/~torvalds/
+W: http://www.cs.helsinki.fi/Linus.Torvalds
X P: 1024/A86B35C5 96 54 50 29 EC 11 44 7A BE 67 3C 24 03 13 62 C8
X D: Original kernel hacker
X S: 1050 Woodduck Avenue
diff -u --recursive --new-file v2.2.6/linux/Documentation/Configure.help linux/Documentation/Configure.help
--- v2.2.6/linux/Documentation/Configure.help Fri Apr 16 14:47:30 1999
+++ linux/Documentation/Configure.help Tue Apr 20 15:17:20 1999
@@ -7443,6 +7443,26 @@
X case insensitive, and case in names is preserved. Say Y. You can
X disable it at mount time with the -N os2 parameter of ncpmount.
X
+Lowercase DOS filenames on LONG namespace volume
+CONFIG_NCPFS_SMALLDOS
+ Saying Y here will convert every filename with creator/owner DOS
+ namespace on NetWare servers to lowercase characters as silently
+ kernel does when you mount NetWare file server volumes with DOS
+ namespace without OS2/LONG namespace support. Saying N here will
+ give you these filenames with uppercase characters.
+
+ This is only cosmetic option because of OS2/LONG namespace is
+ case insensitive. The only major reason for this option is
+ backward compatibility when you want to do step from DOS to
+ OS2/LONG namespace support. Long filenames (created by Win95)
+ will not be affected.
+
+ This option does not solve a problem that filenames appear
+ differently in Linux box and in MS environment because of MS
+ does an additional conversions on client side. You can achieve
+ simillar effects enabling ncpfs option "Allow using of Native
+ Language Support" below.
+
X Allow mounting of volume subdirectories
X CONFIG_NCPFS_MOUNT_SUBDIR
X Allows you to mount not only whole servers or whole volumes, but
@@ -7461,6 +7481,25 @@
X servers. Do not say Y if security is primary for you because root
X can read your session key (from /proc/kcore).
X
+Allow using of Native Language Support
+CONFIG_NCPFS_NLS
+ Allows you to use codepages and I/O charsets for file name translation
+ between file system on server and input/output. This may be useful,
+ if you want to access to the server with other operating systems,
+ e.g. Windows 95. See also NLS for more Information.
+
+ To select codepages and I/O charsets use ncpfs-2.2.0.13 or newer.
+
+Symbolic links and mode permission bits
+CONFIG_NCPFS_EXTRAS
+ This enables the use of symbolic links and an execute permission
+ bit on NCPFS. The file server need not have long name space or NFS
+ name space loaded for these to work, they are stored using rarely
+ found combinations of Hidden, System and Shared flags.
+
+ To use the new attributes, you are recommended to use the flags
+ '-f 600 -d 755' on the ncpmount commandline.
+
X nls codepage 437
X CONFIG_NLS_CODEPAGE_437
X The Microsoft fat filesystem family can deal with filenames in
diff -u --recursive --new-file v2.2.6/linux/Documentation/fb/matroxfb.txt linux/Documentation/fb/matroxfb.txt
--- v2.2.6/linux/Documentation/fb/matroxfb.txt Tue Jan 19 11:32:50 1999
+++ linux/Documentation/fb/matroxfb.txt Tue Apr 20 15:13:00 1999
@@ -1,6 +1,6 @@
X [This file is cloned from VesaFB. Thanks go to Gerd Knorr]
X
-what is matroxfb?
+What is matroxfb?
X =================
X
X This is a driver for a graphic framebuffer for Matrox devices on
@@ -221,6 +221,8 @@
X sync:X - sync. pulse - bit 0 inverts HSYNC polarity, bit 1 VSYNC polarity.
X If bit 3 (value 0x08) is set, composite sync instead of HSYNC is
X generated. If bit 5 (value 0x20) is set, sync on green is turned on.
+ Do not forget that if you want sync on green, you also probably
+ want composite sync.
X Default depends on `vesa'.
X depth:X - Bits per pixel: 0=text, 4,8,15,16,24 or 32. Default depends on
X `vesa'.
@@ -284,8 +286,6 @@
X + current fbset is not able to set 15bpp videomode: you must specify
X depth==16 and green.length==5. fbset does not allow you to set
X green.length.
- + hardware cursor is available only in accelerated videomodes. Maybe that
- this is misfeature and not feature.
X + text mode uses 6 bit VGA palette instead of 8 bit (one of 262144 colors
X instead of one of 16M colors). It is due to hardware limitation of
X MilleniumI/II and SVGALib compatibility.
diff -u --recursive --new-file v2.2.6/linux/Documentation/filesystems/vfs.txt linux/Documentation/filesystems/vfs.txt
--- v2.2.6/linux/Documentation/filesystems/vfs.txt Wed Jul 1 19:38:51 1998
+++ linux/Documentation/filesystems/vfs.txt Tue Apr 27 09:24:34 1999
@@ -4,7 +4,7 @@
X
X Richard Gooch <rgo...@atnf.csiro.au>
X
- 27-JUN-1998
+ 23-APR-1999
X
X
X Conventions used in this document <section>
@@ -129,7 +129,7 @@
X name: the name of the filesystem type, such as "ext2", "iso9660",
X "msdos" and so on
X
- fs_flags: various flags (i.e. if it is a read-only FS)
+ fs_flags: various flags (i.e. FS_REQUIRES_DEV, FS_NO_DCACHE, etc.)
X
X read_super: the method to call when a new instance of this
X filesystem should be mounted
diff -u --recursive --new-file v2.2.6/linux/Documentation/scsi-generic.txt linux/Documentation/scsi-generic.txt
--- v2.2.6/linux/Documentation/scsi-generic.txt Wed Dec 31 16:00:00 1969
+++ linux/Documentation/scsi-generic.txt Sat Apr 24 17:49:37 1999
@@ -0,0 +1,636 @@
+ Notes on Linux's SG driver version 2.1.30
+ -----------------------------------------
+ 990328
+
+Introduction
+============
+These are notes on the Linux SCSI generic packet device driver (sg)
+describing version 2.1.30 . The original driver was written by Lawrence
+Foard and has remained in place with minimal changes since circa 1992.
+Version 2 of this driver remains backward compatible (binary and
+source **) with the original. It adds scatter gather, command queuing,
+per file descriptor sequencing, asynchronous notification and better
+error reporting.
+
+Sg is one of the four "high level" SCSI device drivers along with
+sd, st and sr (disk, tape and CDROM respectively). Sg is more generalized
+(but lower level) than its sibling and tends to be used on SCSI devices
+that don't fit into the already serviced categories. Thus sg is used for
+scanners, cd writers and reading audio cds amongst other things.
+
+The interface and usage of the original sg driver has been documented
+by Heiko Eissfeldt in a HOWTO called SCSI-Programming-HOWTO. My copy
+of the document is version 1.5 dated 7th May 1996. It can found at
+ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/SCSI-Programming-HOWTO .
+Amongst other things it has a lot of tables from the SCSI-2 standard
+that are very useful for programming this interface.
+
+** It is possible to write applications that perform differently
+depending on whether they are using the original or this version of
+the sg device driver. The author is not aware of any useful applications
+that have problems with version 2 (yet).
+
+
+Architecture
+============
+The SCSI generic packet device driver (sg) is a character based device.
+It is one of the four high level device driver in the SCSI sub-system;
+the others are sd (for direct-access devices - disks), st (for tapes)
+and sr (for data cdroms). The other three devices are block devices.
+
+The unifying layer of the SCSI sub-system in the so-called mid-level.
+Below that are all the drivers for the various adapters supported by
+Linux.
+
+Since sg is a character device it supports the traditional Unix
+system calls of open(), close(), read(), write() and ioctl(). Two other
+related system calls: poll() and fcntl() are added to this list and
+how they interact with the sg device driver is documented later.
+
+An SG device is accessed by write()ing SCSI commands plus any associated
+outgoing data to it; the resulting status codes and any incoming data are
+then obtained by a read() call. The device can be opened O_NONBLOCK
+(non-blocking) and poll() used to monitor its progress. The device may be
+opened O_EXCL which excludes other "sg" users from this device (but not
+"sd", "st" or "sr" users). The buffer given to the write() call is made
+up as follows:
+ - struct sg_header image (see below)
+ - scsi command (6, 10 or 12 bytes long)
+ - data to be written to the device (if any)
+
+The buffer received from the corresponding read() call contains:
+ - struct sg_header image (check status/errors + sense_buffer)
+ - data read back from device (if any)
+
+The given SCSI command has its LUN field overwritten by the LUN value of
+the associated sg device that has been open()ed.
+
+
+sg_header
+=========
+This is the name of the control structure that conveys information
+about the length of data to be read/written by the associated SCSI
+command. It also conveys error and status information from the
+read() call. An instance of this structure is the first thing that
+is placed in the data buffers of both write() and read().
+
+In its original form it looked like this:
+struct sg_header {
+ int pack_len;
+ int reply_len;
+ int pack_id;
+ int result;
+ unsigned int twelve_byte:1;
+ unsigned int other_flags:31;
+ unsigned char sense_buffer[16];
+}; /* this structure is 36 bytes long */
+
+The 'pack_len' is bizzare and ends up having the 'reply_len' put in it
+(perhaps it had a use at some stage).
+
+The 'reply_len' is the length of the data the corresponding read()
+will/should request (including the sg_header).
+
+The 'pack_id' is not acted upon by the sg device driver but is conveyed
+back to the corresponding read() so it can be used for sequencing by an
+application.
+
+The 'result' is also bizzare, turning certain types of host codes it 0 (no
+error), EBUSY or EIO. With better error reporting now available, the
+'result' is best ignored.
+
+The 'twelve_byte' field overrides the internal SCSI command length "guessing"
+algorithm for group 6 and 7 commands (ie when 1st byte >= 0xc0) and forces
+a command lenth of 12 bytes.
+The command length "guessing" algorithm is as follows:
+Group: 0 1 2 3 4 5 6 7
+Length: 6 10 10 12 12 12 10 10
+
+'other_flags' was originally documented as "not used" but some current
+applications assume it has 0 placed in it.
+
+The 'sense_buffer' is the first 16 bytes of SCSI sense buffer that is
+returned when the target returns a SCSI status code of CHECK_CONDITION
+or COMMAND_TERMINATED [or (driver_status & DRIVER_SENSE) is true]. This
+buffer should be at least 18 bytes long and arguably 32 bytes; unfortunately
+this is unlikely to happen in the 2.2.x series of kernels.
+
+The new sg_header offered in this driver is:
+#define SG_MAX_SENSE 16
+struct sg_header
+{
+ int pack_len; /* [o] reply_len (ie useless) ignored as input */
+ int reply_len; /* [i] max length of expected reply (inc. sg_header) */
+ int pack_id; /* [io] id number of packet (use ints >= 0) */
+ int result; /* [o] 0==ok, else (+ve) Unix errno code (e.g. EIO) */
+ unsigned int twelve_byte:1;
+ /* [i] Force 12 byte command length for group 6 & 7 commands */
+ unsigned int target_status:5; /* [o] scsi status from target */
+ unsigned int host_status:8; /* [o] host status (see "DID" codes) */
+ unsigned int driver_status:8; /* [o] driver status+suggestion */
+ unsigned int other_flags:10; /* unused */
+ unsigned char sense_buffer[SG_MAX_SENSE]; /* [o] when target_status is
+ CHECK_CONDITION or COMMAND_TERMINATED this is output. */
+}; /* This structure is 36 bytes long on i386 */
+
+Firstly the new header is binary compatible with the original. This is
+important for keeping existing apps working without recompilation.
+
+Only those elements (or fields) that are new or in some way different
+from the original are documented below.
+
+'pack_id' becomes input to a read() when ioctl(sg_fd, SG_SET_FORCE_PACK_ID,
+&one) is active. A 'pack_id' of -1 is interpreted as fetch the oldest
+waiting packet; any other value will cause the read() to wait (or yield
+EAGAIN) until a packet with that 'pack_id' becomes available. In all cases
+the value of 'pack_id' available after a read() is the value given to that
+variable in the prior, corresponding write().
+
+The 'target_status' field is always output and is the (masked and shifted
+1 bit right) SCSI status code from the target device. The allowable
+values are (found in <scsi/scsi.h>):
+/* N.B. 1 bit offset from usual SCSI status values */
+#define GOOD 0x00
+#define CHECK_CONDITION 0x01
+#define CONDITION_GOOD 0x02
+#define BUSY 0x04
+#define INTERMEDIATE_GOOD 0x08
+#define INTERMEDIATE_C_GOOD 0x0a
+#define RESERVATION_CONFLICT 0x0c
+#define COMMAND_TERMINATED 0x11
+#define QUEUE_FULL 0x14
+When the 'target_status' is CHECK_CONDITION or COMMAND_TERMINATED the
+'sense_buffer' is output. Note that when (driver_status & DRIVER_SENSE)
+is true then the 'sense_buffer' is also output (this seems to occur when
+the scsi ide emulation is used). When the 'sense_buffer' is output the
+SCSI Sense Key can be found at (sense_buffer[2] & 0x0f) .
+
+The 'host_status' field is always output and has the following values
+whose "defines" are not visible outside the kernel (unfortunately):
+#define DID_OK 0x00 /* NO error */
+#define DID_NO_CONNECT 0x01 /* Couldn't connect before timeout period */
+#define DID_BUS_BUSY 0x02 /* BUS stayed busy through time out period */
+#define DID_TIME_OUT 0x03 /* TIMED OUT for other reason */
+#define DID_BAD_TARGET 0x04 /* BAD target. */
+#define DID_ABORT 0x05 /* Told to abort for some other reason */
+#define DID_PARITY 0x06 /* Parity error */
+#define DID_ERROR 0x07 /* Internal error */
+#define DID_RESET 0x08 /* Reset by somebody. */
+#define DID_BAD_INTR 0x09 /* Got an interrupt we weren't expecting. */
+#define DID_PASSTHROUGH 0x0a /* Force command past mid-layer */
+#define DID_SOFT_ERROR 0x0b /* The low level driver just wish a retry */
+
+The 'driver_status' field is always output. When ('driver_status' &
+DRIVER_SENSE) is true the 'sense_buffer' is also output. The following
+values whose "defines" are not visible outside the kernel (unfortunately)
+can occur:
+#define DRIVER_OK 0x00 /* Typically no suggestion */
+#define DRIVER_BUSY 0x01
+#define DRIVER_SOFT 0x02
+#define DRIVER_MEDIA 0x03
+#define DRIVER_ERROR 0x04
+#define DRIVER_INVALID 0x05
+#define DRIVER_TIMEOUT 0x06
+#define DRIVER_HARD 0x07
+#define DRIVER_SENSE 0x08
+/* above status 'or'ed with one of the following suggestions */
+#define SUGGEST_RETRY 0x10
+#define SUGGEST_ABORT 0x20
+#define SUGGEST_REMAP 0x30
+#define SUGGEST_DIE 0x40
+#define SUGGEST_SENSE 0x80
+
+'other_flags' still remains as a 10 bit field, so code that places 0 in it
+will still be happy. It is not used.
+
+
+memory
+======
+Memory is a scarce resource in any computer. Sg needs to reserve memory
+suitable for DMA roughly equal in size to the maximum of the write and
+read data buffers for each packet. This DMA memory is obtained at the time
+of a write() and released when the corresponding read() is called (although
+if memory is tight it may be using the buffer reserved by the open() ).
+
+Linux obtaining memory a challenge for several reasons. The memory pool
+that sg uses is in common with all other device drivers and all user
+processes. In this environment the only way to 99.9% guarantee a driver
+will have memory in Linux is to build it into the kernel (ie not as a
+module) and then reserve it on initialization before user processes get
+a chance. [Of course, another driver initialized before sg could take
+all available memory ...] Another problem is the biggest contiguous
+chunk of memory that can be obtained from the kernel is 32 * PAGE_SIZE
+(which is 128KBytes on i386). As memory gets "splintered" there is a good
+chance that buffers won't be available (my machine has 64 MBytes of RAM
+and has 3 available at the moment).
+
+The original sg driver used the following technique: grab a SG_BIG_BUFF
+sized buffer at driver initialization and use it for all requests greater
+than PAGE_SIZE (4096 bytes on i386). By default SG_BIG_BUFF is set to
+32 KBytes in the origianl driver but many applications suggest that the
+user increases this number. Linux limits the biggest single buffer of
+this type to 32 * PAGE_SIZE (128KBytes on i386). Unfortunately if the
+sg driver is a module then there is a high chance a contiguous block of
+that large size will not be available at module initialization.
+
+The author has found no "silver bullet" solution but uses multiple
+techniques hoping that at least one is able provide memory at the critical
+time. Listed below are some of these techniques:
+ - use scatter gather: then instead of one large buffer needing to
+ be found, multiple smaller buffer can be used
+ - use memory above the 16MByte level: the original driver limited
+ itself to obtaining memory below the 16MByte level (on the i386)
+ due to the shortcomings of DMA on ISA adapters. Yet more and more
+ people use PCI adapters that don't have this problem. So make
+ the decision based on the capabilities of the host adpater
+ associated with the current SCSI device
+ - reserve some memory at open() for emergencies but otherwise
+ fetch and release it on a per packet basis
+ - if the kernel is short of memory then dip into the SCSI DMA
+ pool (maintained by the mid-level driver) to a limited amount
+
+
+
+System Calls
+============
+What follows are descriptions of the characteristics of the standard
+Unix operating system calls when applied to a SCSI generic device
+using this version of the device driver.
+
+open
+----
+The filename should be an 'sg' device such as
+/dev/sg[a-z]
+/dev/sg[0,1,2,...]
+or a symbolic link to one of these. [Devfs has its own sub-directory for
+sg devices.] It seems as though SCSI devices are allocated to sg minor
+numbers in the same order as they appear in 'cat /proc/scsi/scsi'.
+Sg is a "character" based Linux device driver. This means it has an
+open/close/read/write/ioctl type interface.
+
+Flags can be either O_RDONLY or O_RDWR or-ed with either
+O_EXCL waits for other opens on sg device to be closed before
+ proceeding. If O_NONBLOCK is set then yields EBUSY when
+ someone else has the sg device open. The combination of
+ O_RDONLY and O_EXCL is disallowed.
+O_NONBLOCK Sets non-blocking mode. Calls that would otherwise block
+ yield EAGAIN (eg read() ) or EBUSY (eg open() ).
+
+The original version of sg did not allow the O_RDONLY (yielding a EACCES
+error). This version allows it for accessing ioctls (e.g. doing an sg
+device scan with the SG_GET_SCSI_ID ioctl) but write()s will not be
+allowed.
+
+By default, sequencing is per file descriptor in this version of sg. This
+means, for example that 2 processes can independently manipulate the same
+sg device at the same time. This may or may not make sense depending on
+the application: 2 processes (logically) reading from the same direct access
+device (ie a disk) is ok while running 2 instances of cd writing software
+on the same device at the same time probably wouldn't be a good idea. The
+previous version of sg supported only per device sequencing and this can
+still be selected with the SG_SET_MERGE_FD,1 ioctl().
+
+The driver will attempt to reserve SG_SCATTER_SZ bytes (32KBytes in the
+current sg.h) on open() for "emergency" situations. If this is unavailable
+it will halve its request and try again. It gives up if PAGE_SIZE bytes
+(4096 bytes on i386) cannot be obtained so no memory is reserved. In this
+case open() will still return successfully. The actual amount of memory
+reserved can be found with the SG_GET_RESERVED_SIZE ioctl().
+
+Returns a file descriptor if >= 0 , otherwise -1 implies an error.
+
+Error codes (value in 'errno' after -1 returned):
+ENODEV sg not compiled into kernel or the kernel cannot find the
+ sg module (or it can't initialize itself (low memory??))
+ENXIO either scsi sub-system is currently processing some error
+ (eg doing a device reset) or the sg driver/module removed
+ or corrupted
+EBUSY O_NONBLOCK set and some user of this sg device has O_EXCL
+ set while someone is already using this device
+EINTR while waiting for an "exclusive" lock to clear, a signal
+ is received, just try again ...
+ENOMEM An attempt to get memory to store this open's context
+ failed (this was _not_ a request to reserve DMA memory)
+EACCES An attempt to use both O_RDONLY and O_EXCL
+
+
+write
+-----
+Even though sg is a character-based device driver it sends and receives
+packets to/from the associated scsi device. Write() is used to send a
+packet containing 2 mandatory parts and 1 optional part. The mandatory
+parts are:
+ - a control block (an instance of struct sg_header)
+ - a SCSI command (6, 10 or 12 bytes long)
+The optional part is:
+ - outgoing data (eg if a SCSI write command is being sent)
+These should appear as one contiguous string in the buffer given to
+write() in the above order with no pad characters.
+
+If a write() accepts this packet then at some later time the user should
+call a read() to get the result of the SCSI command. The previous sg
+driver enforced a strict write()/read()/write()/read() regime so that a
+second write() would block until first read() was finished. This sg
+driver relaxes that condition and thereby allows command queuing
+(limit is SG_MAX_QUEUE (16) outstanding packets per file descriptor).
+However, for backward compatibility, command queuing is turned off
+by default (#define SG_DEF_COMMAND_Q 0 in sg.h). This can be changed
+via the the SG_SET_COMMAND_Q ioctl() [or by recompiling after changing
+the above define to 1].
+
+In this sg driver a write() should return more or less immediately.
+
+Returns number of bytes written if > 0 , otherwise -1 implies an error.
+
+Error codes (value in 'errno' after -1 returned):
+ENXIO either scsi sub-system is currently processing some error
+ (eg doing a device reset) or the sg driver/module removed
+ or corrupted
+EACCES opened with RD_ONLY flag
+EIO incoming buffer too short. It should be at least (6 +
+ sizeof(struct sg_header))==42 bytes long
+EDOM a) command queuing off: a packet is already queued
+ b) command queuing on: too many packets queued
+ (SG_MAX_QUEUE exceeded)
+EAGAIN SCSI mid-level out of command blocks (rare), try again.
+ This is more likely to happen when queuing commands,
+ so wait a bit (eg usleep(10000) ) before trying again
+ENOMEM can't get memory for DMA. Take evasive action ...
+ (see section on memory)
+
+
+read
+----
+Read() is used to receive a packet containing 1 mandatory part and 1
+optional part. The mandatory part is:
+ - a control block (an instance of struct sg_header)
+The optional part is:
+ - incoming data (eg if a SCSI read command was sent by earlier write() )
+The buffer given to a read() and its corresponding count should be
+sufficient to accommodate this packet to avoid truncation. Truncation has
+occurred if count < sg_header::replylen .
+
+By default, read() will return the oldest packet queued up. If the
+SG_SET_FORCE_PACK_ID,1 ioctl() is active then read() will attempt to
+fetch the packet whose pack_id (given earlier to write()) matches the
+sg_header::pack_id given to this read(). If not available it will either
+wait or yield EAGAIN. As a special case, -1 in sg_header::pack_id given
+to read() will match the oldest packet.
+
+
+Returns number of bytes read if > 0 , otherwise -1 implies an error.
+Unfortunately the return value in the non-error case is simply the
+same as the count argument. It is not the actual number of bytes
+DMA-ed by the SCSI device. This driver is currently unable to provide
+such an underrun indication.
+
+Error codes (value in 'errno' after -1 returned):
+ENXIO either scsi sub-system is currently processing some error
+ (eg doing a device reset) or the sg driver/module removed
+ or corrupted
+EAGAIN either no waiting packet or requested packet is not
+ available while O_NONBLOCK flag was set
+EINTR while waiting for a packet, a signal is received, just
+ try again ...
+EIO if the 'count' given to read() is < sizeof(struct sg_header)
+ and the 'result' element in sg_header is non-zero. Not a
+ recommended error reporting technique
+
+
+close
+-----
+Preferably a close() should be done after all issued write()s have had
+their corresponding read() calls completed. Unfortunately this is not
+always possible. The semantics of close() in Unix are to return more
+or less immediately (ie not wait on any event) so the driver needs to
+arrange to an orderly cleanup of those packets that are still "in
+flight".
+
+A process that has an open file descriptor to an sg device may be aborted
+(eg by a kill signal). In this case, the kernel automatically calls close
+(which is called 'sg_release()' in the version 2 driver) to facilitate
+the cleanup mentioned above.
+
+A problem persists in version 2.1.8 if the sg driver is a module and is
+removed while packets are still "in flight". Hopefully this will be soon
+fixed.
+
+Returns 0 if successful, otherwise -1 implies an error.
+
+Error codes (value in 'errno' after -1 returned):
+ENXIO sg driver/module removed or corrupted
+
+ioctl (sg specific)
+-------------------
+Ken Thompson (or perhaps some other Unix luminary) described ioctl() as
+the "garbage bin of Unix". This driver compounds the situation by adding
+around 18 more commands. These commands either yield state information (10
+of them), change the driver's characteristics (8 of them) or allow direct
+communication with the common SCSI mid-level driver.
+
+Those commands with an appended "+" are new in version 2.
+
+Those commands with an appended "W" are only accessible from file
+descriptors opened with O_RDWR. They will yield EACCES otherwise.
+
+SG_GET_TIMEOUT:
+Ignores its 3rd argument and _returns_ the timeout value (which will be
+>= 0 ). The unit of this timeout is "jiffies" which are currently 10
+millisecond intervals on i386 (less on an alpha). Linux supplies
+a manifest constant HZ which is the number of "jiffies" in 1 second.
+
+SG_SET_TIMEOUT:
+Assumes 3rd argument points to an int containing the new timeout value
+for this file descriptor. The unit is a "jiffy". Packets that are
+already "in flight" will not be effected. The default value is set
+on open() and is SG_DEFAULT_TIMEOUT (defined in sg.h).
+
+SG_EMULATED_HOST:
+Assumes 3rd argument points to an int and outputs a flag indicating
+whether the host (adapter) is connected to a real SCSI bus or is
+emulated one (eg ide-scsi device driver). A value of 1 means emulated
+while 0 is not.
+
+SG_SET_FORCE_LOW_DMA +:
+Assumes 3rd argument points to an int containing 0 or 1. 0 (default)
+means sg decides whether to use memory above 16 Mbyte level (on i386)
+based on the host adapter being used by this SCSI device. Typically
+PCI SCSI adapters will indicate they can DMA to the whole 32 bit address
+space.
+If 1 is given then the host adapter is overridden and only memory below
+the 16MB level is used for DMA. A requirement for this should be
+extremely rare. If the "reserve" buffer allocated on open() is not in
+use then it will be de-allocated and re-allocated under the 16MB level
+(and the latter operation could fail yielding ENOMEM).
+Only the current file descriptor is effected.
+
+SG_GET_LOW_DMA +:
+Assumes 3rd argument points to an int and places 0 or 1 in it. 0
+indicates the whole 32 bit address space is being used for DMA transfers
+on this file descriptor. 1 indicates the memory below the 16MB level
+(on i386) is being used (and this may be the case because the host
+adapters setting has been overridden by SG_SET_FORCE_LOW_DMA,1 .
+
+SG_GET_SCSI_ID +:
+Assumes 3rd argument is pointing to an object of type Sg_scsi_id and
+populates it. That structure contains ints for host_no, channel,
+scsi_id, lun and scsi_type. Most of this information is available from
+other sources (eg SCSI_IOCTL_GET_IDLUN and SCSI_IOCTL_GET_BUS_NUMBER)
+but tends to be awkward to collect.
+
+SG_SET_FORCE_PACK_ID +:
+Assumes 3rd argument is pointing to an int. 0 (default) instructs read()
+to return the oldest (written) packet if multiple packets are
+waiting to be read (when command queuing is being used).
+1 instructs read() to view the sg_header::pack_id as input and return the
+oldest packet matching that pack_id or wait until it arrives (or yield
+EAGAIN if O_NONBLOCK is in force). As a special case the pack_id of -1
+given to read() in the mode will match the oldest packet.
+Only the current file descriptor is effected by this command.
+
+SG_GET_LOW_DMA +:
+Assumes 3rd argument points to an int and places the pack_id of the
+oldest (written) packet in it. If no packet is waiting to be read then
+yields -1.
+
+SG_GET_NUM_WAITING +:
+Assumes 3rd argument points to an int and places the number of packets
+waiting to be read in it.
+
+SG_GET_SG_TABLESIZE +:
+Assumes 3rd argument points to an int and places the maximum number of
+scatter gather elements supported by the host adapter. 0 indicates that
+the adapter does support scatter gather.
+
+SG_SET_RESERVED_SIZE +W:
+This is not currently implemented. It is intended for reserving either a
+large buffer or scatter gather list that will be available until the
+current file descriptor is closed. The requested amount of memory may
+not be available so SG_GET_RESERVED_SIZE should be used after this call
+to see how much was reserved. (EBUSY error possible)
+
+SG_GET_RESERVED_SIZE +:
+Assumes 3rd argument points to an int and places the size in bytes of
+the DMA buffer reserved on open() for emergencies. If this is 0 then it
+is probably not wise to attempt on operation like burning a CD on this
+file descriptor.
+
+SG_SET_MERGE_FD +W:
+Assumes 3rd argument is pointing to an int. 0 (the default) causes all
+subsequent sequencing to be per file descriptor. 1 causes all subsequent
+sequencing to be per device. If this command tries to change the current
+state and the is one or more _other_ file descriptors using this sg
+device then an EBUSY error occurs. Also if this file descriptor was not
+open()ed with the O_RDWR flag then an EACCES error occurs.
+Per device sequencing was the original semantics and allowed, for example
+different processes to "share" the device, one perhaps write()ing with
+the other one read()ing. This command is supplied if anyone needs those
+semantics. Per file descriptor sequencing, perhaps with the usage of
+the O_EXCL flag, seems more sensible.
+
+SG_GET_MERGE_FD +:
+Assumes 3rd argument points to an int and places 0 or 1 in it. 0 implies
+sequencing is per file descriptor. 1 implies sequencing is per device
+(original sg driver's semantics).
+
+SG_SET_COMMAND_Q +:
+Assumes 3rd argument is pointing to an int. 0 (current default, set by
+SG_DEF_COMMAND_Q in sg.h) disables command queuing. Attempts to write()
+a packet while one is already queued will result in a EDOM error.
+1 turns command queuing on.
+Changing the queuing state only effects write()s done after the change.
+Only the current file descriptor is effected by this command.
+
+SG_GET_COMMAND_Q +:
+Assumes 3rd argument points to an int and places 0 or 1 in it. 0 implies
+that command queuing is off on this file descriptor. 1 implies command
+queuing is on.
+
+SG_SET_DEBUG +:
+Assumes 3rd argument is pointing to an int. 0 (default) turns debugging
+off. Values > 0 cause the SCSI sense buffer to be decoded and output
+to the console/log when a SCSI device error occurs. Values > 8 cause
+the current sg device driver's state to be output to the console/log
+(this is a "one off" effect).
+If you need a _lot_ of the SCSI sub-system debug information (mainly from
+the mid-level) then try 'echo "scsi dump 0" > /proc/scsi/scsi' and lots of
+debug will appear in your console/log.
+
+ioctl (in common with sd, st + sr)
+----------------------------------
+The following ioctl()s can be called from any high-level scsi device
+driver (ie sd, st, sr + sg). Access permissions may differ a bit from
+one device to another, the access information given below is specific to
+the sg device driver.
+
+SCSI_IOCTL_GET_IDLUN:
+SCSI_IOCTL_GET_BUS_NUMBER:
+
+SCSI_IOCTL_SEND_COMMAND: W
+If open()ed O_RDONLY yields an EACCESS error. Otherwise is forwarded onto
+the SCSI mid-level driver for processing.
+Don't know much about this one but it looks pretty powerful and
+dangerous. Some comments says it is also deprecated.
+
+<any_command_not matching_above>: W
+If open()ed O_RDONLY yields an EACCESS error. Otherwise is forwarded onto
+the SCSI mid-level driver for processing.
+
+
+poll
+----
+This is a native call in Linux 2.2 but most of its capabilities are available
+through the older select() call. Given a choice poll() should probably be
+used. Typically poll() is used when a sg scsi device is open()ed O_NONBLOCK
+for polling; or alternatively with asynchronous notification using the
+fcntl() system call (below) and the SIGPOLL (aka SIGIO) signal.
+Only if something drastically is wrong (eg file handle gone stale) will
+POLLERR ever be set. POLLPRI, POLLHUP and POLLNVAL are never set.
+POLLIN is set when there is one or more packets waiting to be read.
+When POLLIN is set it implies that a read() will not block (or yield
+EAGAIN in non-blocking mode) but return a packet immediately.
+POLLOUT (aka POLLWRNORM) is set when write() is able to accept a packet
+(ie will _not_ yield an EDOM error). The setting of POLLOUT is effected
+by the SG_SET_COMMAND_Q state: if the state is on then POLLOUT will remain
+set until the number of queued packets reaches SG_MAX_QUEUE, if the
+state is off then POLLOUT is only set when no packets are queued.
+Note that a packet can be queued after write()ing but not available to be
+read(); this typically happens when a SCSI read command is issued while
+the data is being retreaved.
+Poll() is per file descriptor unless SG_SET_MERGE_FD is set in which case
+it is per device.
+
+
+fcntl
+-----
+There are several uses for this system call in association with a sg
+file descriptor. The first pseudo code shows code that is useful for
+scanning the sg devices, taking care not to be caught in a wait for
+an O_EXCL lock by another process, and when the appropriate device is
+found switching to normal blocked io. A working example of this logic
+is in the sg_scan.c utility program.
+
+open("/dev/sga", O_RDONLY | O_NONBLOCK)
+/* check device, EBUSY means some other process has O_EXCL lock on it */
+/* one the device you want is found then ... */
+flags = fcntl(sg_fd, F_GETFL)
+fcntl(sg_fd, F_SETFL, flags & (~ O_NONBLOCK))
+/* for simple apps is is easier to use normal blocked io */
+
+
+Some work has to be done in Linux to set up for asynchronous notification.
+This is a non-blocking mode of operation in which when the driver receives
+data back from a device so that a read() can be done, it sends a SIGPOLL
+(aka SIGIO) signal to the owning process. A working example of this logic
+is in the sg_poll.c test program.
+
+sigemptyset(&sig_set)
+sigaddset(&sig_set, SIGPOLL)
+sigaction(SIGPOLL, &s_action, 0)
+fcntl(sg_fd, F_SETOWN, getpid())
+flags = fcntl(sg_fd, F_GETFL);
+fcntl(sg_fd, F_SETFL, flags | O_ASYNC)
+
+
+Utility and Test Programs
+=========================
diff -u --recursive --new-file v2.2.6/linux/MAINTAINERS linux/MAINTAINERS
--- v2.2.6/linux/MAINTAINERS Fri Apr 16 14:47:30 1999
+++ linux/MAINTAINERS Sat Apr 24 18:23:38 1999
@@ -650,6 +650,11 @@
X W: http://www.torque.net/sg
X S: Maintained
X
+SCSI GENERIC
+L: linux...@vger.rutgers.edu
+M: douglas...@rbcds.com
+S: Maintained
+
X SCSI SUBSYSTEM
X L: linux...@vger.rutgers.edu
X S: Unmaintained
@@ -698,7 +703,7 @@
X P: Jakub Jelinek
X M: j...@sunsite.ms.mff.cuni.cz
X P: Anton Blanchard
-M: an...@jubilex.progsoc.uts.edu.au
+M: an...@progsoc.uts.edu.au
X L: sparc...@vger.rutgers.edu
X L: ultra...@vger.rutgers.edu
X W: http://ultra.linux.cz
@@ -771,6 +776,20 @@
X L: linux-...@vger.rutgers.edu
X S: Maintained
X
+USB HUB AND UHCI DRIVERS
+P: Johannes Erdfelt
+M: jerd...@sventech.com
+L: linu...@peloncho.fis.ucm.es
+S: Maintained
+
+USB OHCI DRIVER
+P: Gregory P. Smith
+M: gr...@electricrain.com
+M: gr...@suitenine.com
+L: linu...@peloncho.fis.ucm.es
+S: Maintained (not yet usable)
+W: http://suitenine.com/usb/
+
X VFAT FILESYSTEM:
X P: Gordon Chaffee
X M: cha...@cs.berkeley.edu
@@ -784,9 +803,9 @@
X W: http://roadrunner.swansea.linux.org.uk/v4l.shtml
X S: Maintained
X
-WAN ROUTER AND SANGOMA WANPIPE DRIVERS (X.25, FRAME RELAY, PPP)
-P: Gene Kozin
-M: ge...@compuserve.com
+WAN ROUTER & SANGOMA WANPIPE DRIVERS & API (X.25, FRAME RELAY, PPP, CISCO HDLC)
+P: Jaspreet Singh
+M: jasp...@sangoma.com
X M: d...@sangoma.com
X W: http://www.sangoma.com
X S: Supported
diff -u --recursive --new-file v2.2.6/linux/Makefile linux/Makefile
--- v2.2.6/linux/Makefile Fri Apr 16 14:47:30 1999
+++ linux/Makefile Mon Apr 26 12:24:24 1999
@@ -1,6 +1,6 @@
X VERSION = 2
X PATCHLEVEL = 2
-SUBLEVEL = 6
+SUBLEVEL = 7
X EXTRAVERSION =
X
X ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
@@ -175,7 +175,7 @@
X endif
X
X ifeq ($(CONFIG_USB),y)
-DRIVERS := $(DRIVERS) drivers/uusbd/usb.a
+DRIVERS := $(DRIVERS) drivers/usb/usb.a
X endif
X
X ifeq ($(CONFIG_I2O),y)
diff -u --recursive --new-file v2.2.6/linux/arch/alpha/kernel/setup.c linux/arch/alpha/kernel/setup.c
--- v2.2.6/linux/arch/alpha/kernel/setup.c Tue Jan 19 11:32:50 1999
+++ linux/arch/alpha/kernel/setup.c Sat Apr 24 17:54:08 1999
@@ -183,6 +183,11 @@
X vec = get_sysvec_byname(p+9);
X continue;
X }
+
+ if (strncmp(p, "cycle=", 6) == 0) {
+ est_cycle_freq = simple_strtol(p+6, NULL, 0);
+ continue;
+ }
X }
X
X /* Replace the command line, not that we've killed it with strtok. */
@@ -721,8 +726,8 @@
X (char*)cpu->serial_no,
X systype_name, sysvariation_name, hwrpb->sys_revision,
X (char*)hwrpb->ssn,
- hwrpb->cycle_freq ? : est_cycle_freq,
- hwrpb->cycle_freq ? "" : "est.",
+ est_cycle_freq ? : hwrpb->cycle_freq,
+ est_cycle_freq ? "est." : "",
X hwrpb->intr_freq / 4096,
X (100 * hwrpb->intr_freq / 4096) % 100,
X hwrpb->pagesize,
diff -u --recursive --new-file v2.2.6/linux/arch/alpha/kernel/time.c linux/arch/alpha/kernel/time.c
--- v2.2.6/linux/arch/alpha/kernel/time.c Tue Mar 23 14:35:46 1999
+++ linux/arch/alpha/kernel/time.c Sat Apr 24 17:54:08 1999
@@ -18,6 +18,9 @@
X * fixed tick loss calculation in timer_interrupt
X * (round system clock to nearest tick instead of truncating)
X * fixed algorithm in time_init for getting time from CMOS clock
+ * 1999-04-16 Thorsten Kranzkowski (dl8...@gmx.net)
+ * fixed algorithm in do_gettimeofday() for calculating the precise time
+ * from processor cycle counter (now taking lost_ticks into account)
X */
X #include <linux/config.h>
X #include <linux/errno.h>
@@ -223,7 +226,7 @@
X {
X void (*irq_handler)(int, void *, struct pt_regs *);
X unsigned int year, mon, day, hour, min, sec, cc1, cc2;
- unsigned long cycle_freq;
+ unsigned long cycle_freq, diff, one_percent;
X
X /*
X * The Linux interpretation of the CMOS clock register contents:
@@ -237,19 +240,30 @@
X /* Read cycle counter exactly on falling edge of update flag */
X cc1 = rpcc();
X
- /* If our cycle frequency isn't valid, go another round and give
- a guess at what it should be. */
- cycle_freq = hwrpb->cycle_freq;
- if (cycle_freq == 0) {
- printk("HWRPB cycle frequency bogus. Estimating... ");
-
+ if (!est_cycle_freq) {
+ /* Sometimes the hwrpb->cycle_freq value is bogus.
+ Go another round to check up on it and see. */
X do { } while (!(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP));
X do { } while (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP);
X cc2 = rpcc();
- est_cycle_freq = cycle_freq = cc2 - cc1;
+ est_cycle_freq = cc2 - cc1;
X cc1 = cc2;
+ }
X
- printk("%lu Hz\n", cycle_freq);
+ /* If the given value is within 1% of what we calculated,
+ accept it. Otherwise, use what we found. */
+ cycle_freq = hwrpb->cycle_freq;
+ one_percent = cycle_freq / 100;
+ diff = cycle_freq - est_cycle_freq;
+ if (diff < 0)
+ diff = -diff;
+ if (diff > one_percent) {
+ cycle_freq = est_cycle_freq;
+ printk("HWRPB cycle frequency bogus. Estimated %lu Hz\n",
+ cycle_freq);
+ }
+ else {
+ est_cycle_freq = 0;
X }
X
X /* From John Bowman <bow...@math.ualberta.ca>: allow the values
@@ -314,8 +328,10 @@
X void
X do_gettimeofday(struct timeval *tv)
X {
- unsigned long flags, now, delta_cycles, delta_usec;
+ unsigned long flags, delta_cycles, delta_usec;
X unsigned long sec, usec;
+ __u32 now;
+ extern volatile unsigned long lost_ticks; /*kernel/sched.c*/
X
X now = rpcc();
X save_and_cli(flags);
@@ -337,8 +353,14 @@
X * with no clear gain.
X */
X
- delta_usec = delta_cycles * state.scaled_ticks_per_cycle * 15625;
+ delta_usec = (delta_cycles * state.scaled_ticks_per_cycle
+ + state.partial_tick
+ + (lost_ticks << FIX_SHIFT) ) * 15625;
X delta_usec = ((delta_usec / ((1UL << (FIX_SHIFT-6-1)) * HZ)) + 1) / 2;
+
+ /* the 'lost_tics' term above implements this:
+ * delta_usec += lost_ticks * (1000000 / HZ);
+ */
X
X usec += delta_usec;
X if (usec >= 1000000) {
diff -u --recursive --new-file v2.2.6/linux/arch/alpha/lib/clear_user.S linux/arch/alpha/lib/clear_user.S
--- v2.2.6/linux/arch/alpha/lib/clear_user.S Sun Nov 30 10:59:02 1997
+++ linux/arch/alpha/lib/clear_user.S Sat Apr 24 17:54:08 1999
@@ -80,6 +80,7 @@
X ret $31, ($28), 1 # .. e1 :
X
X __do_clear_user:
+ ldgp $29,0($27) # we do exceptions -- we need the gp.
X and $6, 7, $4 # e0 : find dest misalignment
X beq $0, $zerolength # .. e1 :
X addq $0, $4, $1 # e0 : bias counter
diff -u --recursive --new-file v2.2.6/linux/arch/alpha/lib/copy_user.S linux/arch/alpha/lib/copy_user.S
--- v2.2.6/linux/arch/alpha/lib/copy_user.S Sat May 2 14:19:52 1998
+++ linux/arch/alpha/lib/copy_user.S Sat Apr 24 17:54:08 1999
@@ -46,6 +46,8 @@
X .globl __copy_user
X .ent __copy_user
X __copy_user:
+ ldgp $29,0($27) # we do exceptions -- we need the gp.
+ .prologue 1
X and $6,7,$3
X beq $0,$35
X beq $3,$36
diff -u --recursive --new-file v2.2.6/linux/arch/alpha/lib/strlen_user.S linux/arch/alpha/lib/strlen_user.S
--- v2.2.6/linux/arch/alpha/lib/strlen_user.S Wed Jun 24 22:54:03 1998
+++ linux/arch/alpha/lib/strlen_user.S Sat Apr 24 17:54:08 1999
@@ -27,7 +27,8 @@
X
X .align 3
X __strlen_user:
- .prologue 0
+ ldgp $29,0($27) # we do exceptions -- we need the gp.
+ .prologue 1
X
X EX( ldq_u t0, 0(a0) ) # load first quadword (a0 may be misaligned)
X lda t1, -1(zero)
diff -u --recursive --new-file v2.2.6/linux/arch/alpha/lib/strncpy_from_user.S linux/arch/alpha/lib/strncpy_from_user.S
--- v2.2.6/linux/arch/alpha/lib/strncpy_from_user.S Thu Feb 6 04:48:45 1997
+++ linux/arch/alpha/lib/strncpy_from_user.S Sat Apr 24 17:54:08 1999
@@ -31,6 +31,7 @@
X .globl __strncpy_from_user
X .ent __strncpy_from_user
X .frame $30, 0, $26
+ .prologue 1
X
X .align 3
X $aligned:
@@ -99,6 +100,7 @@
X /*** The Function Entry Point ***/
X .align 3
X __strncpy_from_user:
+ ldgp $29, 0($27) # we do exceptions -- we need the gp.
X
X mov a0, v0 # save the string start
X beq a2, $zerolength
diff -u --recursive --new-file v2.2.6/linux/arch/i386/config.in linux/arch/i386/config.in
--- v2.2.6/linux/arch/i386/config.in Tue Feb 23 15:21:32 1999
+++ linux/arch/i386/config.in Mon Apr 26 13:49:17 1999
@@ -168,6 +168,8 @@
X
X source drivers/char/Config.in
X
+# source drivers/usb/Config.in
+
X source fs/Config.in
X
X if [ "$CONFIG_VT" = "y" ]; then
diff -u --recursive --new-file v2.2.6/linux/arch/i386/kernel/bios32.c linux/arch/i386/kernel/bios32.c
--- v2.2.6/linux/arch/i386/kernel/bios32.c Tue Mar 23 14:35:46 1999
+++ linux/arch/i386/kernel/bios32.c Sat Apr 24 17:49:37 1999
@@ -1095,6 +1095,8 @@
X * for buggy PCI BIOS'es :-[).
X */
X
+extern int skip_ioapic_setup;
+
X static void __init pcibios_fixup_devices(void)
X {
X struct pci_dev *dev;
@@ -1147,6 +1149,7 @@
X /*
X * Recalculate IRQ numbers if we use the I/O APIC
X */
+ if(!skip_ioapic_setup)
X {
X int irq;
X unsigned char pin;
diff -u --recursive --new-file v2.2.6/linux/arch/i386/kernel/smp.c linux/arch/i386/kernel/smp.c
--- v2.2.6/linux/arch/i386/kernel/smp.c Fri Apr 16 14:47:30 1999
+++ linux/arch/i386/kernel/smp.c Thu Apr 22 19:24:50 1999
@@ -29,6 +29,7 @@
X * from Jose Renau
X * Alan Cox : Added EBDA scanning
X * Ingo Molnar : various cleanups and rewrites
+ * Tigran Aivazian : fixed "0.00 in /proc/uptime on SMP" bug.
X */
X
X #include <linux/config.h>
@@ -1707,9 +1708,8 @@
X system=1;
X
X irq_enter(cpu, 0);
+ update_one_process(p, 1, user, system, cpu);
X if (p->pid) {
- update_one_process(p, 1, user, system, cpu);
-
X p->counter -= 1;
X if (p->counter < 0) {
X p->counter = 0;
@@ -1722,7 +1722,6 @@
X kstat.cpu_user += user;
X kstat.per_cpu_user[cpu] += user;
X }
-
X kstat.cpu_system += system;
X kstat.per_cpu_system[cpu] += system;
X
diff -u --recursive --new-file v2.2.6/linux/arch/m68k/atari/atakeyb.c linux/arch/m68k/atari/atakeyb.c
--- v2.2.6/linux/arch/m68k/atari/atakeyb.c Wed Jan 20 23:14:04 1999
+++ linux/arch/m68k/atari/atakeyb.c Mon Apr 26 13:35:34 1999
@@ -291,7 +291,7 @@
X atakeyb_rep_timer.prev = atakeyb_rep_timer.next = NULL;
X add_timer( &atakeyb_rep_timer );
X
- handle_scancode(rep_scancode);
+ handle_scancode(rep_scancode, 1);
X }
X
X atari_enable_irq( IRQ_MFP_ACIA );
@@ -448,7 +448,7 @@
X add_timer( &atakeyb_rep_timer );
X }
X
- handle_scancode(break_flag | scancode);
+ handle_scancode(scancode, !break_flag);
X break;
X }
X break;
diff -u --recursive --new-file v2.2.6/linux/arch/m68k/hp300/hil.c linux/arch/m68k/hp300/hil.c
--- v2.2.6/linux/arch/m68k/hp300/hil.c Sat Sep 5 16:46:40 1998
+++ linux/arch/m68k/hp300/hil.c Mon Apr 26 13:37:14 1999
@@ -223,12 +223,13 @@
X {
X case 0x40:
X {
- unsigned char scode = (poll.data[1] >> 1) | ((poll.data[1] & 1)?0x80:0);
+ int down = (poll.data[1] & 1) == 0;
+ unsigned char scode = poll.data[1] >> 1;
X #if 0
- if (scode & 0x80)
- printk("[%02x]", scode & 0x7f);
+ if (down)
+ printk("[%02x]", scode);
X #endif
- handle_scancode(scode);
+ handle_scancode(scode, down);
X }
X break;
X }
diff -u --recursive --new-file v2.2.6/linux/arch/m68k/mac/mackeyb.c linux/arch/m68k/mac/mackeyb.c
--- v2.2.6/linux/arch/m68k/mac/mackeyb.c Wed Jan 20 23:14:04 1999
+++ linux/arch/m68k/mac/mackeyb.c Mon Apr 26 13:38:03 1999
@@ -60,7 +60,7 @@
X extern struct kbd_struct kbd_table[];
X
X extern void adb_bus_init(void);
-extern void handle_scancode(unsigned char);
+extern void handle_scancode(unsigned char, int);
X extern void put_queue(int);
X
X /* keyb */
@@ -387,7 +387,7 @@
X */
X switch (keycode) {
X case 0x39:
- handle_scancode(keycode); /* down */
+ handle_scancode(keycode, 1); /* down */
X up_flag = 0x80; /* see below ... */
X mark_bh(KEYBOARD_BH);
X break;
@@ -397,7 +397,7 @@
X }
X }
X
- handle_scancode(keycode + up_flag);
+ handle_scancode(keycode, !up_flag);
X }
X
X static void
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/defconfig linux/arch/sparc/defconfig
--- v2.2.6/linux/arch/sparc/defconfig Tue Mar 23 14:35:46 1999
+++ linux/arch/sparc/defconfig Thu Apr 22 19:24:51 1999
@@ -261,6 +261,8 @@
X # CONFIG_NCPFS_NFS_NS is not set
X # CONFIG_NCPFS_OS2_NS is not set
X # CONFIG_NCPFS_MOUNT_SUBDIR is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
X
X #
X # Partition Types
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/entry.S linux/arch/sparc/kernel/entry.S
--- v2.2.6/linux/arch/sparc/kernel/entry.S Tue Mar 23 14:35:46 1999
+++ linux/arch/sparc/kernel/entry.S Wed Apr 28 08:47:39 1999
@@ -1,4 +1,4 @@
-/* $Id: entry.S,v 1.157 1999/01/19 07:54:32 davem Exp $
+/* $Id: entry.S,v 1.158 1999/04/27 14:35:07 davem Exp $
X * arch/sparc/kernel/entry.S: Sparc trap low-level entry points.
X *
X * Copyright (C) 1995 David S. Miller (da...@caip.rutgers.edu)
@@ -874,7 +874,7 @@
X ! We want error in %l5, vaddr in %l6
X sun4c_fault:
X #ifdef CONFIG_SUN4
- sethi C_LABEL(sun4c_memerr_reg), %l4
+ sethi %hi(C_LABEL(sun4c_memerr_reg)), %l4
X ld [%l4+%lo(C_LABEL(sun4c_memerr_reg))], %l4 ! memerr ctrl reg addr
X ld [%l4], %l6 ! memerr ctrl reg
X ld [%l4 + 4], %l5 ! memerr vaddr reg
@@ -956,7 +956,7 @@
X sll %l6, 2, %l6
X ld [%l4 + %l6], %l4
X #ifdef CONFIG_SUN4
- sethi PAGE_MASK, %l6
+ sethi %hi(PAGE_MASK), %l6
X andcc %l4, %l6, %g0
X #else
X andcc %l4, PAGE_MASK, %g0
@@ -1117,7 +1117,7 @@
X #ifndef CONFIG_SUN4
X and %l4, PAGE_MASK, %l4
X #else
- sethi PAGE_MASK, %l6
+ sethi %hi(PAGE_MASK), %l6
X and %l4, %l6, %l4
X #endif
X
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/head.S linux/arch/sparc/kernel/head.S
--- v2.2.6/linux/arch/sparc/kernel/head.S Tue Mar 23 14:35:46 1999
+++ linux/arch/sparc/kernel/head.S Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: head.S,v 1.93 1999/01/10 06:03:14 jj Exp $
+/* $Id: head.S,v 1.95 1999/04/13 07:40:34 anton Exp $
X * head.S: The initial boot code for the Sparc port of Linux.
X *
X * Copyright (C) 1995 David S. Miller (da...@caip.rutgers.edu)
@@ -408,13 +408,11 @@
X /* This was the only reasonable way I could think of to properly align
X * these page-table data structures.
X */
- .globl C_LABEL(bootup_user_stack)
X .globl C_LABEL(pg0), C_LABEL(pg1), C_LABEL(pg2), C_LABEL(pg3)
X .globl C_LABEL(empty_bad_page)
X .globl C_LABEL(empty_bad_page_table)
X .globl C_LABEL(empty_zero_page)
X .globl C_LABEL(swapper_pg_dir)
-C_LABEL(bootup_user_stack): .skip 0x2000
X C_LABEL(swapper_pg_dir): .skip PAGE_SIZE
X C_LABEL(pg0): .skip PAGE_SIZE
X C_LABEL(pg1): .skip PAGE_SIZE
@@ -427,8 +425,8 @@
X .global C_LABEL(root_flags)
X .global C_LABEL(ram_flags)
X .global C_LABEL(root_dev)
- .global C_LABEL(ramdisk_image)
- .global C_LABEL(ramdisk_size)
+ .global C_LABEL(sparc_ramdisk_image)
+ .global C_LABEL(sparc_ramdisk_size)
X
X /* This stuff has to be in sync with SILO and other potential boot loaders
X * Fields should be kept upward compatible and whenever any change is made,
@@ -443,9 +441,9 @@
X .half 0
X C_LABEL(ram_flags):
X .half 0
-C_LABEL(ramdisk_image):
+C_LABEL(sparc_ramdisk_image):
X .word 0
-C_LABEL(ramdisk_size):
+C_LABEL(sparc_ramdisk_size):
X .word 0
X .word C_LABEL(reboot_command)
X
@@ -1005,8 +1003,8 @@
X WRITE_PAUSE
X
X /* I want a kernel stack NOW! */
- set C_LABEL(bootup_user_stack), %g1
- set (0x2000 - REGWIN_SZ), %g2
+ set C_LABEL(init_task_union), %g1
+ set (TASK_UNION_SIZE - REGWIN_SZ), %g2
X add %g1, %g2, %sp
X mov 0, %fp /* And for good luck */
X
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/irq.c linux/arch/sparc/kernel/irq.c
--- v2.2.6/linux/arch/sparc/kernel/irq.c Sun Nov 8 14:02:45 1998
+++ linux/arch/sparc/kernel/irq.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: irq.c,v 1.91 1998/10/14 07:04:17 jj Exp $
+/* $Id: irq.c,v 1.93 1999/04/21 06:15:45 anton Exp $
X * arch/sparc/kernel/irq.c: Interrupt request handling routines. On the
X * Sparc the IRQ's are basically 'cast in stone'
X * and you are supposed to probe the prom's device
@@ -8,7 +8,7 @@
X * Copyright (C) 1995 Miguel de Icaza (mig...@nuclecu.unam.mx)
X * Copyright (C) 1995 Pete A. Zaitcev (zai...@metabyte.com)
X * Copyright (C) 1996 Dave Redman (dj...@tadpole.co.uk)
- * Copyright (C) 1998 Anton Blanchard (an...@progsoc.uts.edu.au)
+ * Copyright (C) 1998-99 Anton Blanchard (an...@progsoc.uts.edu.au)
X */
X
X #include <linux/config.h>
@@ -24,6 +24,8 @@
X #include <linux/init.h>
X #include <linux/smp.h>
X #include <linux/smp_lock.h>
+#include <linux/delay.h>
+#include <linux/tasks.h>
X
X #include <asm/ptrace.h>
X #include <asm/processor.h>
@@ -192,12 +194,18 @@
X restore_flags(flags);
X }
X
-/* Per-processor IRQ and bh locking depth, both SMP and non-SMP code use this. */
+#ifndef __SMP__
+unsigned int local_bh_count;
+unsigned int local_irq_count;
+
+#else
+/* SMP interrupt locking on Sparc. */
+
X unsigned int local_bh_count[NR_CPUS];
X unsigned int local_irq_count[NR_CPUS];
X
-#ifdef __SMP__
-/* SMP interrupt locking on Sparc. */
+atomic_t global_bh_lock = ATOMIC_INIT(0);
+spinlock_t global_bh_count = SPIN_LOCK_UNLOCKED;
X
X /* Who has global_irq_lock. */
X unsigned char global_irq_holder = NO_PROC_ID;
@@ -208,58 +216,71 @@
X /* Global IRQ locking depth. */
X atomic_t global_irq_count = ATOMIC_INIT(0);
X
-atomic_t global_bh_count = ATOMIC_INIT(0);
-atomic_t global_bh_lock = ATOMIC_INIT(0);
-
X /* This protects BH software state (masks, things like that). */
X spinlock_t sparc_bh_lock = SPIN_LOCK_UNLOCKED;
X
-#ifdef DEBUG_IRQLOCK
+void smp_show_backtrace_all_cpus(void);
+void show_backtrace(void);
X
-#undef INIT_STUCK
-#define INIT_STUCK 100000000
+#define MAXCOUNT 100000000
+#define VERBOSE_DEBUG_IRQLOCK
X
-#undef STUCK
-#define STUCK \
-if (!--stuck) {printk("wait_on_bh CPU#%d stuck at %08lx\n", cpu, where); stuck = INIT_STUCK; }
-
-static inline void wait_on_bh(int cpu, unsigned long where)
+static void show(char * str)
X {
- int stuck = INIT_STUCK;
- do {
- STUCK;
- /* nothing .. wait for the other bh's to go away */
- } while (atomic_read(&global_bh_count) != 0);
-}
+ int i;
+ int cpu = smp_processor_id();
+
+ printk("\n%s, CPU %d:\n", str, cpu);
+ printk("irq: %d [ ", atomic_read(&global_irq_count));
X
-static unsigned long previous_irqholder;
+ for (i = 0; i < NR_CPUS; i++) {
+ printk("%d ", local_irq_count[i]);
+ }
+ printk("]\n");
X
-#undef INIT_STUCK
-#define INIT_STUCK 100000000
+ printk("bh: %d [ ", (spin_is_locked(&global_bh_count) ? 1 : 0));
X
-#undef STUCK
-#define STUCK \
-if (!--stuck) {printk("wait_on_irq CPU#%d stuck at %08lx, waiting for %08lx (local=%d, global=%d)\n", cpu, where, previous_irqholder, local_count, atomic_read(&global_irq_count)); stuck = INIT_STUCK; }
+ for (i = 0; i < NR_CPUS; i++) {
+ printk("%d ", local_bh_count[cpu]);
+ }
+ printk("]\n");
+
+#ifdef VERBOSE_DEBUG_IRQLOCK
+ smp_show_backtrace_all_cpus();
+#else
+ show_backtrace();
+#endif
+}
+
+static inline void wait_on_bh(void)
+{
+ int count = MAXCOUNT;
+ do {
+ if(!--count) {
+ show("wait_on_bh");
+ count = 0;
+ }
+ barrier();
+ } while(spin_is_locked(&global_bh_count));
+}
X
X /*
X * We have to allow irqs to arrive between __sti and __cli
X */
-#define SYNC_OTHER_CORES(x) __asm__ __volatile__ ("nop")
+#define SYNC_OTHER_CORES(x) udelay(x+1)
X
-static inline void wait_on_irq(int cpu, unsigned long where)
+static inline void wait_on_irq(int cpu)
X {
- int stuck = INIT_STUCK;
- int local_count = local_irq_count[cpu];
+ int count = MAXCOUNT;
X
X for (;;) {
-
X /*
X * Wait until all interrupts are gone. Wait
X * for bottom half handlers unless we're
X * already executing in one..
X */
X if (!atomic_read(&global_irq_count)) {
- if (local_bh_count[cpu] || !atomic_read(&global_bh_count))
+ if (local_bh_count[cpu] || !spin_is_locked(&global_bh_count))
X break;
X }
X
@@ -267,17 +288,18 @@
X spin_unlock(&global_irq_lock);
X
X for (;;) {
- STUCK;
-
+ if (!--count) {
+ show("wait_on_irq");
+ count = ~0;
+ }
X __sti();
X SYNC_OTHER_CORES(cpu);
X __cli();
-
X if (atomic_read(&global_irq_count))
X continue;
- if (*((unsigned char *)&global_irq_lock))
+ if (spin_is_locked (&global_irq_lock))
X continue;
- if (!local_bh_count[cpu] && atomic_read(&global_bh_count))
+ if (!local_bh_count[cpu] && spin_is_locked(&global_bh_count))
X continue;
X if (spin_trylock(&global_irq_lock))
X break;
@@ -295,14 +317,8 @@
X */
X void synchronize_bh(void)
X {
- unsigned long where;
-
- __asm__("mov %%i7, %0" : "=r" (where));
-
- if (atomic_read(&global_bh_count) && !in_interrupt()) {
- int cpu = smp_processor_id();
- wait_on_bh(cpu, where);
- }
+ if (spin_is_locked (&global_bh_count) && !in_interrupt())
+ wait_on_bh();
X }
X
X /*
@@ -321,16 +337,9 @@
X }
X }
X
-#undef INIT_STUCK
-#define INIT_STUCK 10000000
SHAR_EOF
true || echo 'restore of patch-2.2.7 failed'
fi
echo 'End of part 01'
echo 'File patch-2.2.7 is continued in part 02'
echo 02 > _shar_seq_.tmp
exit 0

Thomas...@ciw.uni-karlsruhe.de

unread,
May 1, 1999, 3:00:00 AM5/1/99
to
Archive-name: v2.2/patch-2.2.7/part02

#!/bin/sh
# this is part 02 of a 22 - part archive


# do not concatenate these parts, unpack them in order with /bin/sh

# file patch-2.2.7 continued
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck
if test "$Scheck" != 02; then
echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping patch-2.2.7'
else
echo 'x - continuing with patch-2.2.7'


sed 's/^X//' << 'SHAR_EOF' >> 'patch-2.2.7' &&

-
-#undef STUCK
-#define STUCK \
-if (!--stuck) {printk("get_irqlock stuck at %08lx, waiting for %08lx\n", where, previous_irqholder); stuck = INIT_STUCK;}
-
-static inline void get_irqlock(int cpu, unsigned long where)
+static inline void get_irqlock(int cpu)


X {
- int stuck = INIT_STUCK;

+ int count = MAXCOUNT;
X

X if (!spin_trylock(&global_irq_lock)) {
X /* do we already hold the lock? */
@@ -338,23 +347,25 @@
X return;
X /* Uhhuh.. Somebody else got it. Wait.. */
X do {
- do {
- STUCK;
+ while (spin_is_locked(&global_irq_lock)) {
+ if (!--count) {
+ show("get_irqlock");


+ count = ~0;
+ }

X barrier();
- } while (*((volatile unsigned char *)&global_irq_lock));
+ }
X } while (!spin_trylock(&global_irq_lock));
X }
X /*
X * We also to make sure that nobody else is running
X * in an interrupt context.
X */
- wait_on_irq(cpu, where);
+ wait_on_irq(cpu);
X
X /*
X * Ok, finally..
X */
X global_irq_holder = cpu;
- previous_irqholder = where;
X }
X
X /*
@@ -372,9 +383,6 @@
X void __global_cli(void)
X {
X unsigned int flags;


- unsigned long where;
-
- __asm__("mov %%i7, %0" : "=r" (where));

X
X __save_flags(flags);
X
@@ -382,7 +390,7 @@
X int cpu = smp_processor_id();
X __cli();
X if (!local_irq_count[cpu])
- get_irqlock(cpu, where);
+ get_irqlock(cpu);
X }
X }
X
@@ -442,65 +450,14 @@
X __sti();
X break;
X default:
- printk("global_restore_flags: %08lx (%08lx)\n",
- flags, (&flags)[-1]);
+ {
+ unsigned long pc;
+ __asm__ __volatile__("mov %%i7, %0" : "=r" (pc));
+ printk("global_restore_flags: Bogon flags(%08lx) caller %08lx\n", flags, pc);
X }
-}
-
-#undef INIT_STUCK
-#define INIT_STUCK 200000000
-
-#undef STUCK
-#define STUCK \
-if (!--stuck) {printk("irq_enter stuck (irq=%d, cpu=%d, global=%d)\n",irq,cpu,global_irq_holder); stuck = INIT_STUCK;}
-
-#define VERBOSE_IRQLOCK_DEBUGGING
-
-void irq_enter(int cpu, int irq, void *_opaque)
-{
-#ifdef VERBOSE_IRQLOCK_DEBUGGING
- extern void smp_show_backtrace_all_cpus(void);
-#endif


- int stuck = INIT_STUCK;
-

- hardirq_enter(cpu);
- barrier();
- while (*((volatile unsigned char *)&global_irq_lock)) {
- if ((unsigned char) cpu == global_irq_holder) {
- struct pt_regs *regs = _opaque;
- int sbh_cnt = atomic_read(&global_bh_count);
- int globl_locked = *((unsigned char *)&global_irq_lock);
- int globl_icount = atomic_read(&global_irq_count);


- int local_count = local_irq_count[cpu];

- unsigned long pc = regs->pc;
-
- /* It is very important that we load the state variables
- * before we do the first call to printk() as printk()
- * could end up changing them...
- */
-
- printk("CPU[%d]: BAD! Local IRQ's enabled, global disabled "
- "interrupt at PC[%08lx]\n", cpu, pc);
- printk("CPU[%d]: bhcnt[%d] glocked[%d] gicnt[%d] licnt[%d]\n",
- cpu, sbh_cnt, globl_locked, globl_icount, local_count);
-#ifdef VERBOSE_IRQLOCK_DEBUGGING
- printk("Performing backtrace on all cpus, write this down!\n");
- smp_show_backtrace_all_cpus();
-#endif
- break;
- }
- STUCK;
- barrier();
X }
X }
X
-void irq_exit(int cpu, int irq)
-{
- hardirq_exit(cpu);
- release_irqlock(cpu);
-}
-
-#endif /* DEBUG_IRQLOCK */
X #endif /* __SMP__ */
X
X void unexpected_irq(int irq, void *dev_id, struct pt_regs * regs)
@@ -542,7 +499,7 @@
X smp4m_irq_rotate(cpu);
X #endif
X #endif
- irq_enter(cpu, irq, regs);
+ irq_enter(cpu, irq);
X action = *(irq + irq_action);
X kstat.irqs[cpu][irq]++;
X do {
@@ -563,7 +520,7 @@
X int cpu = smp_processor_id();
X
X disable_pil_irq(irq);
- irq_enter(cpu, irq, regs);
+ irq_enter(cpu, irq);
X kstat.irqs[cpu][irq]++;
X floppy_interrupt(irq, dev_id, regs);
X irq_exit(cpu, irq);
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/process.c linux/arch/sparc/kernel/process.c
--- v2.2.6/linux/arch/sparc/kernel/process.c Mon Mar 29 11:09:11 1999
+++ linux/arch/sparc/kernel/process.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: process.c,v 1.133 1999/03/24 11:42:30 davem Exp $
+/* $Id: process.c,v 1.136 1999/04/16 01:20:33 anton Exp $
X * linux/arch/sparc/kernel/process.c


X *
X * Copyright (C) 1995 David S. Miller (da...@caip.rutgers.edu)

@@ -205,8 +205,10 @@
X int cpu = smp_processor_id();
X
X spin_lock_irqsave(&sparc_backtrace_lock, flags);
- rw = (struct reg_window *) fp;
- while(rw) {
+
+ rw = (struct reg_window *)fp;
+ while(rw && (((unsigned long) rw) >= PAGE_OFFSET) &&
+ !(((unsigned long) rw) & 0x7)) {
X printk("CPU[%d]: ARGS[%08lx,%08lx,%08lx,%08lx,%08lx,%08lx] "
X "FP[%08lx] CALLER[%08lx]\n", cpu,
X rw->ins[0], rw->ins[1], rw->ins[2], rw->ins[3],
@@ -218,28 +220,21 @@
X spin_unlock_irqrestore(&sparc_backtrace_lock, flags);
X }
X
+#define __SAVE __asm__ __volatile__("save %sp, -0x40, %sp\n\t")
+#define __RESTORE __asm__ __volatile__("restore %g0, %g0, %g0\n\t")
+#define __GET_FP(fp) __asm__ __volatile__("mov %%i6, %0" : "=r" (fp))
+
X void show_backtrace(void)
X {
X unsigned long fp;
X
- __asm__ __volatile__(
- "save %%sp, -64, %%sp\n\t"
- "save %%sp, -64, %%sp\n\t"
- "save %%sp, -64, %%sp\n\t"
- "save %%sp, -64, %%sp\n\t"
- "save %%sp, -64, %%sp\n\t"
- "save %%sp, -64, %%sp\n\t"
- "save %%sp, -64, %%sp\n\t"
- "save %%sp, -64, %%sp\n\t"
- "restore\n\t"
- "restore\n\t"
- "restore\n\t"
- "restore\n\t"
- "restore\n\t"
- "restore\n\t"
- "restore\n\t"
- "restore\n\t"
- "mov %%i6, %0" : "=r" (fp));
+ __SAVE; __SAVE; __SAVE; __SAVE;
+ __SAVE; __SAVE; __SAVE; __SAVE;
+ __RESTORE; __RESTORE; __RESTORE; __RESTORE;
+ __RESTORE; __RESTORE; __RESTORE; __RESTORE;
+
+ __GET_FP(fp);
+
X __show_backtrace(fp);
X }
X
@@ -381,8 +376,21 @@
X current->tss.current_ds = USER_DS;
X if (current->tss.flags & SPARC_FLAG_KTHREAD) {
X current->tss.flags &= ~SPARC_FLAG_KTHREAD;
- switch_to_context(current);
+
+ /* We must fixup kregs as well. */
+ current->tss.kregs = (struct pt_regs *)
+ (((unsigned long)current) +
+ (TASK_UNION_SIZE - TRACEREG_SZ));
X }
+
+ /* Exec'ing out of a vfork() shared address space is
+ * tricky on sparc32. exec_mmap will not set the mmu
+ * context because it sets the new current->mm after
+ * calling init_new_context and activate_context is
+ * a nop on sparc32, so we gotta catch it here. And
+ * clone()'s had the same problem. -DaveM
+ */
+ switch_to_context(current);
X }
X
X static __inline__ void copy_regs(struct pt_regs *dst, struct pt_regs *src)
@@ -514,9 +522,11 @@
X p->tss.kpsr = current->tss.fork_kpsr;
X #endif
X p->tss.kwim = current->tss.fork_kwim;
- p->tss.kregs = childregs;
X
X if(regs->psr & PSR_PS) {
+ extern struct pt_regs fake_swapper_regs;
+
+ p->tss.kregs = &fake_swapper_regs;
X new_stack = (struct reg_window *)
X ((((unsigned long)p) +
X (TASK_UNION_SIZE)) -
@@ -529,6 +539,7 @@
X sizeof(struct reg_window));
X childregs->u_regs[UREG_G6] = (unsigned long) p;
X } else {
+ p->tss.kregs = childregs;
X childregs->u_regs[UREG_FP] = sp;
X p->tss.flags &= ~SPARC_FLAG_KTHREAD;
X p->tss.current_ds = USER_DS;
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/setup.c linux/arch/sparc/kernel/setup.c
--- v2.2.6/linux/arch/sparc/kernel/setup.c Mon Oct 5 13:13:37 1998
+++ linux/arch/sparc/kernel/setup.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: setup.c,v 1.103 1998/09/21 05:05:23 jj Exp $
+/* $Id: setup.c,v 1.105 1999/04/13 14:17:08 jj Exp $
X * linux/arch/sparc/kernel/setup.c


X *
X * Copyright (C) 1995 David S. Miller (da...@caip.rutgers.edu)

@@ -271,8 +271,8 @@
X extern unsigned short root_flags;
X extern unsigned short root_dev;
X extern unsigned short ram_flags;
-extern unsigned ramdisk_image;
-extern unsigned ramdisk_size;
+extern unsigned sparc_ramdisk_image;
+extern unsigned sparc_ramdisk_size;
X #define RAMDISK_IMAGE_START_MASK 0x07FF
X #define RAMDISK_PROMPT_FLAG 0x8000
X #define RAMDISK_LOAD_FLAG 0x4000


@@ -285,7 +285,7 @@
X

X struct tt_entry *sparc_ttable;
X
-static struct pt_regs fake_swapper_regs = { 0, 0, 0, 0, { 0, } };
+struct pt_regs fake_swapper_regs = { 0, 0, 0, 0, { 0, } };
X
X static void prom_cons_write(struct console *con, const char *str, unsigned count)
X {
@@ -375,7 +375,7 @@
X sun4c_probe_vac();
X load_mmu();
X total = prom_probe_memory();
- *memory_start_p = (((unsigned long) &end));
+ *memory_start_p = PAGE_ALIGN(((unsigned long) &end));
X
X if(!packed) {
X for(i=0; sp_banks[i].num_bytes != 0; i++) {
@@ -404,10 +404,10 @@
X rd_doload = ((ram_flags & RAMDISK_LOAD_FLAG) != 0);
X #endif
X #ifdef CONFIG_BLK_DEV_INITRD
- if (ramdisk_image) {
- initrd_start = ramdisk_image;
+ if (sparc_ramdisk_image) {
+ initrd_start = sparc_ramdisk_image;
X if (initrd_start < KERNBASE) initrd_start += KERNBASE;
- initrd_end = initrd_start + ramdisk_size;
+ initrd_end = initrd_start + sparc_ramdisk_size;
X if (initrd_end > *memory_end_p) {
X printk(KERN_CRIT "initrd extends beyond end of memory "
X "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
@@ -417,6 +417,14 @@
X if (initrd_start >= *memory_start_p && initrd_start < *memory_start_p + 2 * PAGE_SIZE) {
X initrd_below_start_ok = 1;
X *memory_start_p = PAGE_ALIGN (initrd_end);
+ } else if (initrd_start && sparc_ramdisk_image < KERNBASE) {
+ switch (sparc_cpu_model) {
+ case sun4m:
+ case sun4d:
+ initrd_start -= KERNBASE;
+ initrd_end -= KERNBASE;
+ break;
+ }
X }
X }
X #endif
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/sun4d_irq.c linux/arch/sparc/kernel/sun4d_irq.c
--- v2.2.6/linux/arch/sparc/kernel/sun4d_irq.c Sun Nov 8 14:02:45 1998
+++ linux/arch/sparc/kernel/sun4d_irq.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: sun4d_irq.c,v 1.17 1998/10/18 03:31:03 davem Exp $
+/* $Id: sun4d_irq.c,v 1.18 1999/04/20 13:22:30 anton Exp $
X * arch/sparc/kernel/sun4d_irq.c:
X * SS1000/SC2000 interrupt handling.
X *


@@ -193,7 +193,7 @@
X

X cc_set_iclr(1 << irq);
X
- irq_enter(cpu, irq, regs);
+ irq_enter(cpu, irq);
X kstat.irqs[cpu][irq]++;
X if (!sbusl) {
X action = *(irq + irq_action);
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/sun4m_irq.c linux/arch/sparc/kernel/sun4m_irq.c
--- v2.2.6/linux/arch/sparc/kernel/sun4m_irq.c Mon Oct 5 13:13:37 1998
+++ linux/arch/sparc/kernel/sun4m_irq.c Thu Apr 22 19:24:51 1999
@@ -253,7 +253,7 @@
X
X /* Map the per-cpu Counter registers. */
X sun4m_timers = sparc_alloc_io(cnt_regs[0].phys_addr, 0,
- PAGE_SIZE*NCPUS, "counters_percpu",
+ PAGE_SIZE*SUN4M_NCPUS, "counters_percpu",
X cnt_regs[0].which_io, 0x0);
X
X /* Map the system Counter register. */
@@ -334,7 +334,7 @@
X
X /* Map the interrupt registers for all possible cpus. */
X sun4m_interrupts = sparc_alloc_io(int_regs[0].phys_addr, 0,
- PAGE_SIZE*NCPUS, "interrupts_percpu",
+ PAGE_SIZE*SUN4M_NCPUS, "interrupts_percpu",
X int_regs[0].which_io, 0x0);
X
X /* Map the system interrupt control registers. */
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/sun4m_smp.c linux/arch/sparc/kernel/sun4m_smp.c
--- v2.2.6/linux/arch/sparc/kernel/sun4m_smp.c Thu Nov 19 09:56:27 1998
+++ linux/arch/sparc/kernel/sun4m_smp.c Thu Apr 22 19:24:51 1999
@@ -448,6 +448,7 @@
X if(!--prof_counter[cpu]) {
X int user = user_mode(regs);
X
+ irq_enter(cpu, 0);
X if(current->pid) {
X update_one_process(current, 1, user, !user, cpu);
X
@@ -456,7 +457,6 @@
X current->need_resched = 1;
X }
X
- spin_lock(&ticker_lock);
X if(user) {
X if(current->priority < DEF_PRIORITY) {
X kstat.cpu_nice++;
@@ -469,9 +469,9 @@
X kstat.cpu_system++;
X kstat.per_cpu_system[cpu]++;
X }
- spin_unlock(&ticker_lock);
X }
X prof_counter[cpu] = prof_multiplier[cpu];
+ irq_exit(cpu, 0);
X }
X }
X
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/systbls.S linux/arch/sparc/kernel/systbls.S
--- v2.2.6/linux/arch/sparc/kernel/systbls.S Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc/kernel/systbls.S Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: systbls.S,v 1.82 1999/03/20 22:01:59 davem Exp $
+/* $Id: systbls.S,v 1.83 1999/04/07 17:14:06 davem Exp $
X * systbls.S: System call entry point tables for OS compatibility.
X * The native Linux system call table lives here also.
X *
@@ -25,7 +25,7 @@
X /*30*/ .long sys_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice
X /*35*/ .long sys_nis_syscall, sys_sync, sys_kill, sys_newstat, sys_sendfile
X /*40*/ .long sys_newlstat, sys_dup, sys_pipe, sys_times, sys_nis_syscall
-/*45*/ .long sys_nis_syscall, sys_setgid, sys_getgid, sys_signal, sys_geteuid
+/*45*/ .long sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid
X /*50*/ .long sys_getegid, sys_acct, sys_nis_syscall, sys_nis_syscall, sys_ioctl
X /*55*/ .long sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve
X /*60*/ .long sys_umask, sys_chroot, sys_newfstat, sys_nis_syscall, sys_getpagesize
@@ -47,7 +47,7 @@
X /*140*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getrlimit
X /*145*/ .long sys_setrlimit, sys_nis_syscall, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
X /*150*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_nis_syscall
-/*155*/ .long sys_nis_syscall, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_umount
+/*155*/ .long sys_nis_syscall, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_oldumount
X /*160*/ .long sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_nis_syscall
X /*165*/ .long sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_nis_syscall
X /*170*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getdents
@@ -129,7 +129,7 @@
X /*150*/ .long sys_getsockname, sunos_nosys, sunos_nosys
X .long sys_poll, sunos_nosys, sunos_nosys
X .long sunos_getdirentries, sys_statfs, sys_fstatfs
- .long sys_umount, sunos_nosys, sunos_nosys
+ .long sys_oldumount, sunos_nosys, sunos_nosys
X .long sys_getdomainname, sys_setdomainname
X .long sunos_nosys, sys_quotactl, sunos_nosys
X .long sunos_mount, sys_ustat, sunos_semsys
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/kernel/unaligned.c linux/arch/sparc/kernel/unaligned.c
--- v2.2.6/linux/arch/sparc/kernel/unaligned.c Mon Apr 14 16:28:07 1997
+++ linux/arch/sparc/kernel/unaligned.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: unaligned.c,v 1.17 1997/04/11 00:42:08 davem Exp $
+/* $Id: unaligned.c,v 1.18 1999/04/03 11:36:17 anton Exp $
X * unaligned.c: Unaligned load/store trap handling with special
X * cases for the kernel to do them more quickly.
X *
@@ -332,7 +332,6 @@
X enum direction dir = decode_direction(insn);
X int size = decode_access_size(insn);
X
- lock_kernel();
X if(!ok_for_kernel(insn) || dir == both) {
X printk("Unsupported unaligned load/store trap for kernel at <%08lx>.\n",
X regs->pc);
@@ -380,7 +379,6 @@
X }
X advance(regs);
X }
- unlock_kernel();
X }
X
X static inline int ok_for_user(struct pt_regs *regs, unsigned int insn,
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/lib/atomic.S linux/arch/sparc/lib/atomic.S
--- v2.2.6/linux/arch/sparc/lib/atomic.S Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc/lib/atomic.S Thu Apr 22 19:24:51 1999
@@ -44,6 +44,7 @@
X .globl ___atomic_add
X ___atomic_add:
X rd %psr, %g3 ! Keep the code small, old way was stupid
+ nop; nop; nop; ! Let the bits set
X or %g3, PSR_PIL, %g7 ! Disable interrupts
X wr %g7, 0x0, %psr ! Set %psr
X nop; nop; nop; ! Let the bits set
@@ -69,6 +70,7 @@
X .globl ___atomic_sub
X ___atomic_sub:
X rd %psr, %g3 ! Keep the code small, old way was stupid
+ nop; nop; nop; ! Let the bits set
X or %g3, PSR_PIL, %g7 ! Disable interrupts
X wr %g7, 0x0, %psr ! Set %psr
X nop; nop; nop; ! Let the bits set
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/lib/bitops.S linux/arch/sparc/lib/bitops.S
--- v2.2.6/linux/arch/sparc/lib/bitops.S Sun Nov 8 14:02:45 1998
+++ linux/arch/sparc/lib/bitops.S Thu Apr 22 19:24:51 1999
@@ -20,12 +20,10 @@
X .globl ___set_bit
X ___set_bit:
X rd %psr, %g3
- andcc %g3, PSR_PIL, %g0
- bne 1f
- nop
- wr %g3, PSR_PIL, %psr
+ nop; nop; nop;
+ or %g3, PSR_PIL, %g5
+ wr %g5, 0x0, %psr
X nop; nop; nop
-1:
X #ifdef __SMP__
X set C_LABEL(bitops_spinlock), %g5
X 2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
@@ -38,17 +36,12 @@
X #ifdef __SMP__
X st %g5, [%g1]
X set C_LABEL(bitops_spinlock), %g5
- andcc %g3, PSR_PIL, %g0
- bne 1f
- stb %g0, [%g5]
+ stb %g0, [%g5]
X #else
- andcc %g3, PSR_PIL, %g0
- bne 1f
- st %g5, [%g1]
+ st %g5, [%g1]
X #endif
X wr %g3, 0x0, %psr
X nop; nop; nop
-1:
X jmpl %o7, %g0
X mov %g4, %o7
X
@@ -56,12 +49,10 @@
X .globl ___clear_bit
X ___clear_bit:
X rd %psr, %g3
- andcc %g3, PSR_PIL, %g0
- bne 1f
- nop
- wr %g3, PSR_PIL, %psr
X nop; nop; nop
-1:
+ or %g3, PSR_PIL, %g5
+ wr %g5, 0x0, %psr
+ nop; nop; nop
X #ifdef __SMP__
X set C_LABEL(bitops_spinlock), %g5
X 2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
@@ -74,17 +65,12 @@
X #ifdef __SMP__
X st %g5, [%g1]
X set C_LABEL(bitops_spinlock), %g5
- andcc %g3, PSR_PIL, %g0
- bne 1f
- stb %g0, [%g5]
+ stb %g0, [%g5]
X #else
- andcc %g3, PSR_PIL, %g0
- bne 1f
- st %g5, [%g1]
+ st %g5, [%g1]
X #endif
X wr %g3, 0x0, %psr
X nop; nop; nop
-1:
X jmpl %o7, %g0
X mov %g4, %o7
X
@@ -92,12 +78,10 @@
X .globl ___change_bit
X ___change_bit:
X rd %psr, %g3
- andcc %g3, PSR_PIL, %g0
- bne 1f
- nop
- wr %g3, PSR_PIL, %psr
X nop; nop; nop
-1:
+ or %g3, PSR_PIL, %g5
+ wr %g5, 0x0, %psr
+ nop; nop; nop
X #ifdef __SMP__
X set C_LABEL(bitops_spinlock), %g5
X 2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
@@ -110,17 +94,12 @@
X #ifdef __SMP__
X st %g5, [%g1]
X set C_LABEL(bitops_spinlock), %g5
- andcc %g3, PSR_PIL, %g0
- bne 1f
- stb %g0, [%g5]
+ stb %g0, [%g5]
X #else
- andcc %g3, PSR_PIL, %g0
- bne 1f
- st %g5, [%g1]
+ st %g5, [%g1]
X #endif
X wr %g3, 0x0, %psr
X nop; nop; nop
-1:
X jmpl %o7, %g0
X mov %g4, %o7
X
@@ -128,12 +107,10 @@
X .globl ___set_le_bit
X ___set_le_bit:
X rd %psr, %g3
- andcc %g3, PSR_PIL, %g0
- bne 1f
- nop
- wr %g3, PSR_PIL, %psr
X nop; nop; nop
-1:
+ or %g3, PSR_PIL, %g5
+ wr %g5, 0x0, %psr
+ nop; nop; nop
X #ifdef __SMP__
X set C_LABEL(bitops_spinlock), %g5
X 2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
@@ -146,29 +123,22 @@
X #ifdef __SMP__
X stb %g5, [%g1]
X set C_LABEL(bitops_spinlock), %g5
- andcc %g3, PSR_PIL, %g0
- bne 1f
- stb %g0, [%g5]
+ stb %g0, [%g5]
X #else
- andcc %g3, PSR_PIL, %g0
- bne 1f
- stb %g5, [%g1]
+ stb %g5, [%g1]
X #endif
X wr %g3, 0x0, %psr
X nop; nop; nop
-1:
X jmpl %o7, %g0
X mov %g4, %o7
X
X .globl ___clear_le_bit
X ___clear_le_bit:
X rd %psr, %g3
- andcc %g3, PSR_PIL, %g0
- bne 1f
- nop
- wr %g3, PSR_PIL, %psr
X nop; nop; nop
-1:
+ or %g3, PSR_PIL, %g5
+ wr %g5, 0x0, %psr
+ nop; nop; nop
X #ifdef __SMP__
X set C_LABEL(bitops_spinlock), %g5
X 2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
@@ -181,16 +151,11 @@
X #ifdef __SMP__
X stb %g5, [%g1]
X set C_LABEL(bitops_spinlock), %g5
- andcc %g3, PSR_PIL, %g0
- bne 1f
- stb %g0, [%g5]
+ stb %g0, [%g5]
X #else
- andcc %g3, PSR_PIL, %g0
- bne 1f
- stb %g5, [%g1]
+ stb %g5, [%g1]
X #endif
X wr %g3, 0x0, %psr
X nop; nop; nop
-1:
X jmpl %o7, %g0
X mov %g4, %o7
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/lib/debuglocks.c linux/arch/sparc/lib/debuglocks.c
--- v2.2.6/linux/arch/sparc/lib/debuglocks.c Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc/lib/debuglocks.c Thu Apr 22 19:24:51 1999
@@ -1,12 +1,13 @@
-/* $Id: debuglocks.c,v 1.6 1999/02/23 13:23:55 jj Exp $
+/* $Id: debuglocks.c,v 1.7 1999/04/21 02:26:58 anton Exp $
X * debuglocks.c: Debugging versions of SMP locking primitives.
X *
X * Copyright (C) 1997 David S. Miller (da...@caip.rutgers.edu)


- * Copyright (C) 1998 Anton Blanchard (an...@progsoc.uts.edu.au)
+ * Copyright (C) 1998-99 Anton Blanchard (an...@progsoc.uts.edu.au)
X */
X

X #include <linux/kernel.h>
X #include <linux/sched.h>
+#include <linux/tasks.h> /* For NR_CPUS */
X #include <asm/psr.h>
X #include <asm/system.h>
X #include <asm/spinlock.h>
@@ -39,20 +40,22 @@
X {
X int cpu = smp_processor_id();
X
- printk("%s(%p) CPU#%d stuck at %08lx, owner PC(%08lx):CPU(%lx)\n",str,
+ printk("%s(%p) CPU#%d stuck at %08lx, owner PC(%08lx):CPU(%lx)\n", str,
X lock, cpu, caller, lock->owner_pc & ~3, lock->owner_pc & 3);
X }
X
X static inline void show_write(char *str, rwlock_t *lock, unsigned long caller)
X {
X int cpu = smp_processor_id();
+ int i;
X
- printk("%s(%p) CPU#%d stuck at %08lx, owner PC(%08lx):CPU(%lx) reader[0]=%08lx reader[1]=%08lx reader[2]=%08lx reader[3]=%08lx\n",
- str, lock, cpu, caller, lock->owner_pc & ~3, lock->owner_pc & 3,
- lock->reader_pc[0],
- lock->reader_pc[1],
- lock->reader_pc[2],
- lock->reader_pc[3]);
+ printk("%s(%p) CPU#%d stuck at %08lx, owner PC(%08lx):CPU(%lx)", str,
+ lock, cpu, caller, lock->owner_pc & ~3, lock->owner_pc & 3);
+
+ for(i = 0; i < NR_CPUS; i++)
+ printk(" reader[i]=%08lx", lock->reader_pc[i]);


+
+ printk("\n");
X }

X
X #undef INIT_STUCK
@@ -105,9 +108,6 @@
X lock->lock = 0;
X }
X
-#undef INIT_STUCK
-#define INIT_STUCK 100000000
-
X void _do_read_lock(rwlock_t *rw, char *str)
X {
X unsigned long caller;
@@ -135,9 +135,6 @@
X rw->lock++;
X }
X
-#undef INIT_STUCK
-#define INIT_STUCK 100000000
-
X void _do_read_unlock(rwlock_t *rw, char *str)
X {
X unsigned long caller;
@@ -164,9 +161,6 @@
X barrier();
X rw->lock -= 0x1ff;
X }
-


-#undef INIT_STUCK
-#define INIT_STUCK 100000000

X
X void _do_write_lock(rwlock_t *rw, char *str)
X {
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/lib/irqlock.S linux/arch/sparc/lib/irqlock.S
--- v2.2.6/linux/arch/sparc/lib/irqlock.S Tue May 13 22:41:03 1997
+++ linux/arch/sparc/lib/irqlock.S Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: irqlock.S,v 1.4 1997/05/01 02:26:54 davem Exp $
+/* $Id: irqlock.S,v 1.5 1999/04/20 13:22:37 anton Exp $
X * irqlock.S: High performance IRQ global locking and interrupt entry.
X *
X * Copyright (C) 1997 David S. Miller (da...@caip.rutgers.edu)
@@ -9,69 +9,6 @@
X
X .text
X .align 4
-
- /* This is incredibly insane... */
- .globl ___irq_enter
-___irq_enter:
- sethi %hi(local_irq_count), %g2
- sll %g1, 2, %g1
- or %g2, %lo(local_irq_count), %g2
- ld [%g2 + %g1], %g3
- sethi %hi(global_irq_count), %g5
- add %g3, 1, %g3
- or %g5, %lo(global_irq_count), %g5
- st %g3, [%g2 + %g1]
-1:
- ldstub [%g5 + 3], %g2
- orcc %g2, 0x0, %g0
- bne 1b
- ld [%g5], %g3
- sra %g3, 8, %g3
- add %g3, 1, %g3
- sll %g3, 8, %g3
- st %g3, [%g5]
- sethi %hi(global_irq_lock), %g1
- ldub [%g1 + %lo(global_irq_lock)], %g2
-1:
- orcc %g2, 0x0, %g0
- bne,a 1b
- ldub [%g1 + %lo(global_irq_lock)], %g2
-___irq_enter_out:
- jmpl %o7, %g0
- mov %g4, %o7
-
- .globl ___irq_exit
-___irq_exit:
- rd %psr, %g3
- sethi %hi(global_irq_count), %g1
- or %g3, PSR_PIL, %g3
- or %g1, %lo(global_irq_count), %g1
- wr %g3, 0x0, %psr
- sethi %hi(local_irq_count), %g2
- sll %g7, 2, %g7
- or %g2, %lo(local_irq_count), %g2
- ld [%g2 + %g7], %g3
-1:
- ldstub [%g1 + 3], %g5
- orcc %g5, 0x0, %g0
- bne 1b
- ld [%g1], %g5
- sra %g5, 8, %g5
- sub %g5, 1, %g5
- sll %g5, 8, %g5
- st %g5, [%g1]
- sub %g3, 1, %g3
- sethi %hi(global_irq_holder), %g1
- st %g3, [%g2 + %g7]
- srl %g7, 2, %g7
- ldub [%g1 + %lo(global_irq_holder)], %g5
- cmp %g5, %g7
- bne ___irq_enter_out
- mov NO_PROC_ID, %g2
- stb %g2, [%g1 + %lo(global_irq_holder)]
- sethi %hi(global_irq_lock), %g5
- b ___irq_enter_out
- stb %g0, [%g5 + %lo(global_irq_lock)]
X
X /* Weird calling conventions... %g7=flags, %g4=%prev_o7
X * Very clever for the __global_sti case, the inline which
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/mm/init.c linux/arch/sparc/mm/init.c
--- v2.2.6/linux/arch/sparc/mm/init.c Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc/mm/init.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: init.c,v 1.63 1999/03/20 22:02:01 davem Exp $
+/* $Id: init.c,v 1.65 1999/04/09 16:28:03 davem Exp $
X * linux/arch/sparc/mm/init.c


X *
X * Copyright (C) 1995 David S. Miller (da...@caip.rutgers.edu)

diff -u --recursive --new-file v2.2.6/linux/arch/sparc/mm/nosrmmu.c linux/arch/sparc/mm/nosrmmu.c
--- v2.2.6/linux/arch/sparc/mm/nosrmmu.c Thu Apr 23 20:21:31 1998
+++ linux/arch/sparc/mm/nosrmmu.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: nosrmmu.c,v 1.1 1998/03/09 14:04:15 jj Exp $
+/* $Id: nosrmmu.c,v 1.2 1999/03/30 10:17:39 jj Exp $
X * nosrmmu.c: This file is a bunch of dummies for sun4 compiles,
X * so that it does not need srmmu and avoid ifdefs.
X *
@@ -45,6 +45,16 @@
X }
X
X __initfunc(void srmmu_end_memory(unsigned long memory_size, unsigned long *mem_end_p))
+{
+ return 0;
+}
+
+__u32 iounit_map_dma_init(struct linux_sbus *sbus, int size)
+{
+ return 0;
+}
+
+__u32 iounit_map_dma_page(__u32 vaddr, void *addr, struct linux_sbus *sbus)
X {
X return 0;
X }
diff -u --recursive --new-file v2.2.6/linux/arch/sparc/mm/srmmu.c linux/arch/sparc/mm/srmmu.c
--- v2.2.6/linux/arch/sparc/mm/srmmu.c Mon Mar 29 11:09:11 1999
+++ linux/arch/sparc/mm/srmmu.c Wed Apr 28 10:58:10 1999
@@ -1,4 +1,4 @@
-/* $Id: srmmu.c,v 1.185 1999/03/24 11:42:35 davem Exp $
+/* $Id: srmmu.c,v 1.187 1999/04/28 17:00:45 davem Exp $
X * srmmu.c: SRMMU specific routines for memory management.


X *
X * Copyright (C) 1995 David S. Miller (da...@caip.rutgers.edu)

@@ -14,6 +14,7 @@
X #include <linux/vmalloc.h>
X #include <linux/pagemap.h>
X #include <linux/init.h>
+#include <linux/blk.h>
X
X #include <asm/page.h>
X #include <asm/pgtable.h>
@@ -1948,12 +1949,13 @@
X /* Find the number of contexts on the srmmu. */
X cpunode = prom_getchild(prom_root_node);
X num_contexts = 0;
- while((cpunode = prom_getsibling(cpunode)) != 0) {
+ while(cpunode != 0) {
X prom_getstring(cpunode, "device_type", node_str, sizeof(node_str));
X if(!strcmp(node_str, "cpu")) {
X num_contexts = prom_getintdefault(cpunode, "mmu-nctx", 0x8);
X break;
X }
+ cpunode = prom_getsibling(cpunode);
X }
X }
X
@@ -2000,6 +2002,18 @@
X
X start_mem = sparc_context_init(start_mem, num_contexts);
X start_mem = free_area_init(start_mem, end_mem);
+
+#ifdef CONFIG_BLK_DEV_INITRD
+ /* If initial ramdisk was specified with physical address,
+ translate it here, as the p2v translation in srmmu
+ is not straightforward. */
+ if (initrd_start && initrd_start < KERNBASE) {
+ initrd_start = srmmu_p2v(initrd_start);
+ initrd_end = srmmu_p2v(initrd_end);
+ if (initrd_end <= initrd_start)
+ initrd_start = 0;
+ }
+#endif
X
X return PAGE_ALIGN(start_mem);
X }
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/config.in linux/arch/sparc64/config.in
--- v2.2.6/linux/arch/sparc64/config.in Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/config.in Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-# $Id: config.in,v 1.65 1999/03/14 03:12:48 anton Exp $
+# $Id: config.in,v 1.66 1999/03/29 05:08:42 davem Exp $
X # For a description of the syntax of this configuration file,
X # see the Configure script.
X #
@@ -185,6 +185,7 @@
X bool ' assume boards are SYMBIOS compatible' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
X fi
X fi
+ dep_tristate 'Qlogic ISP SCSI support' CONFIG_SCSI_QLOGIC_ISP $CONFIG_SCSI
X fi
X
X endmenu
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/defconfig linux/arch/sparc64/defconfig
--- v2.2.6/linux/arch/sparc64/defconfig Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/defconfig Thu Apr 22 19:24:51 1999
@@ -208,6 +208,7 @@
X CONFIG_SCSI_NCR53C8XX_SYNC=10
X # CONFIG_SCSI_NCR53C8XX_PROFILE is not set
X # CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT is not set
+CONFIG_SCSI_QLOGIC_ISP=y
X
X #
X # Fibre Channel support
@@ -298,6 +299,8 @@


X # CONFIG_NCPFS_NFS_NS is not set
X # CONFIG_NCPFS_OS2_NS is not set
X # CONFIG_NCPFS_MOUNT_SUBDIR is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
X
X #
X # Partition Types

diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/cpu.c linux/arch/sparc64/kernel/cpu.c
--- v2.2.6/linux/arch/sparc64/kernel/cpu.c Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/kernel/cpu.c Wed Apr 28 08:47:39 1999
@@ -69,7 +69,7 @@
X
X fprs = fprs_read ();
X fprs_write (FPRS_FEF);
- __asm__ __volatile__ ("rdpr %%ver, %0; stx %%fsr, [%1]" : "=r" (ver) : "r" (&fpu_vers));
+ __asm__ __volatile__ ("rdpr %%ver, %0; stx %%fsr, [%1]" : "=&r" (ver) : "r" (&fpu_vers));
X fprs_write (fprs);
X
X manuf = ((ver >> 48)&0xffff);
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/entry.S linux/arch/sparc64/kernel/entry.S
--- v2.2.6/linux/arch/sparc64/kernel/entry.S Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/kernel/entry.S Thu Apr 22 19:24:51 1999
@@ -1,10 +1,10 @@
-/* $Id: entry.S,v 1.101 1999/01/19 07:54:38 davem Exp $
+/* $Id: entry.S,v 1.102 1999/03/29 12:38:09 jj Exp $
X * arch/sparc64/kernel/entry.S: Sparc64 trap low-level entry points.
X *
X * Copyright (C) 1995,1997 David S. Miller (da...@caip.rutgers.edu)
X * Copyright (C) 1996 Eddie C. Dost (e...@skynet.be)
X * Copyright (C) 1996 Miguel de Icaza (mig...@nuclecu.unam.mx)
- * Copyright (C) 1996,1998 Jakub Jelinek (j...@sunsite.mff.cuni.cz)
+ * Copyright (C) 1996,98,99 Jakub Jelinek (j...@sunsite.mff.cuni.cz)


X */
X
X #include <linux/config.h>

@@ -163,6 +163,39 @@
X wrpr %g3, %tstate
X wr %g0, FPRS_FEF, %fprs ! clean DU/DL bits
X retry
+
+ .globl do_fptrap
+ .align 32
+do_fptrap:
+ ldub [%g6 + AOFF_task_tss + AOFF_thread_fpsaved], %g3
+ stx %fsr, [%g6 + AOFF_task_tss + AOFF_thread_xfsr]
+ rd %fprs, %g1
+ or %g3, %g1, %g3
+ stb %g3, [%g6 + AOFF_task_tss + AOFF_thread_fpsaved]
+ rd %gsr, %g3
+ stb %g3, [%g6 + AOFF_task_tss + AOFF_thread_gsr]
+ mov SECONDARY_CONTEXT, %g3
+ add %g6, AOFF_task_fpregs, %g2
+ ldxa [%g3] ASI_DMMU, %g5
+ stxa %g0, [%g3] ASI_DMMU
+ flush %g6
+ membar #StoreStore | #LoadStore
+ andcc %g1, FPRS_DL, %g0
+ be,pn %icc, 4f
+ mov 0x40, %g3
+ stda %f0, [%g2] ASI_BLK_S
+ stda %f16, [%g2 + %g3] ASI_BLK_S
+ andcc %g1, FPRS_DU, %g0
+ be,pn %icc, 5f
+4: add %g2, 128, %g2
+ stda %f32, [%g2] ASI_BLK_S
+ stda %f48, [%g2 + %g3] ASI_BLK_S
+5: mov SECONDARY_CONTEXT, %g1
+ membar #Sync
+ stxa %g5, [%g1] ASI_DMMU
+ flush %g6
+ ba,pt %xcc, etrap
+ wr %g0, 0, %fprs
X
X /* The registers for cross calls will be:
X *
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/head.S linux/arch/sparc64/kernel/head.S
--- v2.2.6/linux/arch/sparc64/kernel/head.S Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/kernel/head.S Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: head.S,v 1.59 1999/01/06 01:37:35 davem Exp $
+/* $Id: head.S,v 1.60 1999/04/12 08:08:21 davem Exp $
X * head.S: Initial boot code for the Sparc64 port of Linux.
X *
X * Copyright (C) 1996,1997 David S. Miller (da...@caip.rutgers.edu)
@@ -47,7 +47,7 @@
X * HdrS version should be incremented.
X */
X .global root_flags, ram_flags, root_dev
- .global ramdisk_image, ramdisk_size
+ .global sparc_ramdisk_image, sparc_ramdisk_size
X .globl silo_args
X
X .ascii "HdrS"
@@ -59,9 +59,9 @@
X .half 0
X ram_flags:
X .half 0
-ramdisk_image:
+sparc_ramdisk_image:
X .word 0
-ramdisk_size:
+sparc_ramdisk_size:
X .word 0
X .xword reboot_command
X .xword bootstr_len
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/irq.c linux/arch/sparc64/kernel/irq.c
--- v2.2.6/linux/arch/sparc64/kernel/irq.c Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/kernel/irq.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: irq.c,v 1.75 1999/01/28 12:37:56 jj Exp $
+/* $Id: irq.c,v 1.76 1999/04/02 14:54:30 davem Exp $
X * irq.c: UltraSparc IRQ handling/init/registry.
X *
X * Copyright (C) 1997 David S. Miller (da...@caip.rutgers.edu)
@@ -309,7 +309,7 @@
X unsigned int build_irq(int pil, int inofixup, unsigned int *iclr, unsigned int *imap)
X {
X struct ino_bucket *bucket;
- unsigned short ino;
+ int ino;
X
X if(pil == 0) {
X if(iclr != NULL || imap != NULL) {
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/psycho.c linux/arch/sparc64/kernel/psycho.c
--- v2.2.6/linux/arch/sparc64/kernel/psycho.c Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/kernel/psycho.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: psycho.c,v 1.79 1999/03/19 05:38:46 davem Exp $
+/* $Id: psycho.c,v 1.85 1999/04/02 14:54:28 davem Exp $
X * psycho.c: Ultra/AX U2P PCI controller support.
X *
X * Copyright (C) 1997 David S. Miller (da...@caipfs.rutgers.edu)
@@ -680,20 +680,23 @@
X {
X unsigned int devfn, l, class;
X unsigned char hdr_type = 0;
+ int is_multi = 0;
X
X for (devfn = 0; devfn < 0xff; ++devfn) {
- if (PCI_FUNC(devfn) == 0) {
- pbm_read_config_byte(pbm, bus, devfn,
- PCI_HEADER_TYPE, &hdr_type);
- } else if (!(hdr_type & 0x80)) {
+ if (PCI_FUNC(devfn) != 0 && is_multi == 0) {
X /* not a multi-function device */
X continue;
X }
+ pbm_read_config_byte(pbm, bus, devfn,
+ PCI_HEADER_TYPE, &hdr_type);
+ if (PCI_FUNC(devfn) == 0)
+ is_multi = hdr_type & 0x80;
X
X /* Check if there is anything here. */
X pbm_read_config_dword(pbm, bus, devfn, PCI_VENDOR_ID, &l);
- if (l == 0xffffffff || l == 0x00000000) {
- hdr_type = 0;
+ if (l == 0xffffffff || l == 0x00000000 ||
+ l == 0x0000ffff || l == 0xffff0000) {
+ is_multi = 0;
X continue;
X }
X
@@ -1234,12 +1237,13 @@
X }
X if (bsreg == PCI_ROM_ADDRESS) {
X pdev->rom_address = (unsigned long)__va(pci_addr);
- pdev->rom_address |= 1;
+ pdev->rom_address &= ~1UL;
+
X /*
- * Enable access to the ROM.
+ * Disable access to the ROM.
X */
X pci_read_config_dword(pdev, PCI_ROM_ADDRESS, &rtmp);
- pci_write_config_dword(pdev, PCI_ROM_ADDRESS, rtmp | 1);
+ pci_write_config_dword(pdev, PCI_ROM_ADDRESS, rtmp & ~1);
X } else
X pdev->base_address[brindex] = (unsigned long)__va(pci_addr);
X
@@ -1408,7 +1412,7 @@
X
X rtmp = new_base;
X pci_read_config_dword(pdev, breg, &base);
- rtmp |= (base & ~PCI_ROM_ADDRESS_MASK);
+ rtmp &= ~(base & ~PCI_ROM_ADDRESS_MASK);
X pci_write_config_dword(pdev, breg, rtmp);
X
X /* Apply PBM ranges and update pci_dev. */
@@ -1431,8 +1435,7 @@
X "PBM ranges\n");
X }
X pdev->rom_address = (unsigned long)__va(pci_addr);
-
- pdev->rom_address |= (base & ~PCI_ROM_ADDRESS_MASK);
+ pdev->rom_address &= ~(base & ~PCI_ROM_ADDRESS_MASK);
X MEM_seen = 1;
X }
X rom_address_done:
@@ -1588,6 +1591,36 @@
X imap_off = imap_offset(imap_ser);
X break;
X
+ case 0x2c:
+ /* Onboard Timer 0 */
+ imap_off = imap_offset(imap_tim0);
+ break;
+
+ case 0x2d:
+ /* Onboard Timer 1 */
+ imap_off = imap_offset(imap_tim1);
+ break;
+
+ case 0x2e:
+ /* Psycho UE Interrupt */
+ imap_off = imap_offset(imap_ue);
+ break;
+
+ case 0x2f:
+ /* Psycho CE Interrupt */
+ imap_off = imap_offset(imap_ce);
+ break;
+
+ case 0x30:
+ /* Psycho PCI A Error Interrupt */
+ imap_off = imap_offset(imap_a_err);
+ break;
+
+ case 0x31:
+ /* Psycho PCI B Error Interrupt */
+ imap_off = imap_offset(imap_b_err);
+ break;
+
X case 0x32:
X /* Power Management */
X imap_off = imap_offset(imap_pmgmt);
@@ -1720,7 +1753,6 @@
X int node)
X {
X unsigned int prom_irq, portid = pbm->parent->upa_portid;
- unsigned char pci_irq_line = pdev->irq;
X int err;
X
X #ifdef FIXUP_IRQ_DEBUG
@@ -1764,7 +1796,25 @@
X unsigned int bus, slot, line;
X
X bus = (pbm == &pbm->parent->pbm_B) ? (1 << 4) : 0;
- line = (pci_irq_line) & 3;
+
+ /* Use the given interrupt property value as the line if it
+ * is non-zero and legal. Legal encodings are INTA=1, INTB=2,
+ * INTC=3, INTD=4 as per PCI OBP binding spec version 2.1 -DaveM
+ */
+ if(prom_irq > 0 && prom_irq < 5) {
+ line = ((prom_irq - 1) & 3);
+ } else {
+ unsigned char pci_irq_line;
+
+ /* The generic PCI probing layer will read the
+ * interrupt line into pdev->irq if the interrupt
+ * pin is non-zero, so we have to explicitly fetch
+ * the pin here to be certain (the interrupt line is
+ * typically left at zero by OBP).
+ */
+ pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pci_irq_line);
+ line = ((pci_irq_line - 1) & 3);
+ }
X
X /* Slot determination is only slightly complex. Handle
X * the easy case first.
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/setup.c linux/arch/sparc64/kernel/setup.c
--- v2.2.6/linux/arch/sparc64/kernel/setup.c Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/kernel/setup.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: setup.c,v 1.41 1999/01/04 20:12:25 davem Exp $
+/* $Id: setup.c,v 1.43 1999/04/12 08:08:24 davem Exp $
X * linux/arch/sparc64/kernel/setup.c
X *
X * Copyright (C) 1995,1996 David S. Miller (da...@caip.rutgers.edu)
@@ -413,13 +413,12 @@
X extern int prom_probe_memory(void);
X extern unsigned long start, end;
X extern void panic_setup(char *, int *);
-extern unsigned long sun_serial_setup(unsigned long);
X
X extern unsigned short root_flags;
X extern unsigned short root_dev;
X extern unsigned short ram_flags;
-extern unsigned int ramdisk_image;
-extern unsigned int ramdisk_size;
+extern unsigned int sparc_ramdisk_image;
+extern unsigned int sparc_ramdisk_size;
X #define RAMDISK_IMAGE_START_MASK 0x07FF
X #define RAMDISK_PROMPT_FLAG 0x8000
X #define RAMDISK_LOAD_FLAG 0x4000
@@ -509,13 +508,13 @@
X rd_doload = ((ram_flags & RAMDISK_LOAD_FLAG) != 0);
X #endif
X #ifdef CONFIG_BLK_DEV_INITRD
- if (ramdisk_image) {
+ if (sparc_ramdisk_image) {
X unsigned long start = 0;
X
- if (ramdisk_image >= (unsigned long)&end - 2 * PAGE_SIZE)
- ramdisk_image -= KERNBASE;
- initrd_start = ramdisk_image + phys_base + PAGE_OFFSET;
- initrd_end = initrd_start + ramdisk_size;
+ if (sparc_ramdisk_image >= (unsigned long)&end - 2 * PAGE_SIZE)
+ sparc_ramdisk_image -= KERNBASE;
+ initrd_start = sparc_ramdisk_image + phys_base + PAGE_OFFSET;
+ initrd_end = initrd_start + sparc_ramdisk_size;
X if (initrd_end > *memory_end_p) {
X printk(KERN_CRIT "initrd extends beyond end of memory "
X "(0x%016lx > 0x%016lx)\ndisabling initrd\n",
@@ -523,10 +522,10 @@
X initrd_start = 0;
X }
X if (initrd_start)
- start = ramdisk_image + KERNBASE;
+ start = sparc_ramdisk_image + KERNBASE;
X if (start >= *memory_start_p && start < *memory_start_p + 2 * PAGE_SIZE) {
X initrd_below_start_ok = 1;
- *memory_start_p = PAGE_ALIGN (start + ramdisk_size);
+ *memory_start_p = PAGE_ALIGN (start + sparc_ramdisk_size);
X }
X }
X #endif
@@ -586,7 +585,6 @@
X serial_console = 2;
X break;
X }
- *memory_start_p = sun_serial_setup(*memory_start_p); /* set this up ASAP */
X #else
X serial_console = 0;
X #endif
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/smp.c linux/arch/sparc64/kernel/smp.c
--- v2.2.6/linux/arch/sparc64/kernel/smp.c Mon Mar 29 11:09:11 1999
+++ linux/arch/sparc64/kernel/smp.c Thu Apr 22 19:24:51 1999
@@ -380,37 +380,51 @@
X * to the stack before we get here because all callers of us
X * are flush_tlb_*() routines, and these run after flush_cache_*()
X * which performs the flushw.
+ *
+ * The SMP TLB coherency scheme we use works as follows:
+ *
+ * 1) mm->cpu_vm_mask is a bit mask of which cpus an address
+ * space has (potentially) executed on, this is the heuristic
+ * we use to avoid doing cross calls.
+ *
+ * 2) TLB context numbers are shared globally across all processors
+ * in the system, this allows us to play several games to avoid
+ * cross calls.
+ *
+ * One invariant is that when a cpu switches to a process, and
+ * that processes tsk->mm->cpu_vm_mask does not have the current
+ * cpu's bit set, that tlb context is flushed locally.
+ *
+ * If the address space is non-shared (ie. mm->count == 1) we avoid
+ * cross calls when we want to flush the currently running process's
+ * tlb state. This is done by clearing all cpu bits except the current
+ * processor's in current->mm->cpu_vm_mask and performing the flush
+ * locally only. This will force any subsequent cpus which run this
+ * task to flush the context from the local tlb if the process migrates
+ * to another cpu (again).
+ *
+ * 3) For shared address spaces (threads) and swapping we bite the
+ * bullet for most cases and perform the cross call.
+ *
+ * The performance gain from "optimizing" away the cross call for threads is
+ * questionable (in theory the big win for threads is the massive sharing of
+ * address space state across processors).
+ *
+ * For the swapping case the locking is difficult to get right, we'd have to
+ * enforce strict ordered access to mm->cpu_vm_mask via a spinlock for example.
+ * Then again one could argue that when you are swapping, the cost of a cross
+ * call won't even show up on the performance radar. But in any case we do get
+ * rid of the cross-call when the task has a dead context or the task has only
+ * ever run on the local cpu.
X */
-static void smp_cross_call_avoidance(struct mm_struct *mm)
-{
- u32 ctx;
-
- spin_lock(&scheduler_lock);
- get_new_mmu_context(mm);
- mm->cpu_vm_mask = (1UL << smp_processor_id());
- current->tss.ctx = ctx = mm->context & 0x3ff;
- spitfire_set_secondary_context(ctx);
- __asm__ __volatile__("flush %g6");
- spitfire_flush_dtlb_secondary_context();
- spitfire_flush_itlb_secondary_context();
- __asm__ __volatile__("flush %g6");
- if(!segment_eq(current->tss.current_ds,USER_DS)) {
- /* Rarely happens. */
- current->tss.ctx = 0;
- spitfire_set_secondary_context(0);
- __asm__ __volatile__("flush %g6");
- }
- spin_unlock(&scheduler_lock);
-}
-
X void smp_flush_tlb_mm(struct mm_struct *mm)
X {
X u32 ctx = mm->context & 0x3ff;
X
X if(mm == current->mm && atomic_read(&mm->count) == 1) {
- if(mm->cpu_vm_mask == (1UL << smp_processor_id()))
- goto local_flush_and_out;
- return smp_cross_call_avoidance(mm);
+ if(mm->cpu_vm_mask != (1UL << smp_processor_id()))
+ mm->cpu_vm_mask = (1UL << smp_processor_id());
+ goto local_flush_and_out;
X }
X smp_cross_call(&xcall_flush_tlb_mm, ctx, 0, 0);
X
@@ -426,9 +440,9 @@
X start &= PAGE_MASK;
X end &= PAGE_MASK;
X if(mm == current->mm && atomic_read(&mm->count) == 1) {
- if(mm->cpu_vm_mask == (1UL << smp_processor_id()))
- goto local_flush_and_out;
- return smp_cross_call_avoidance(mm);
+ if(mm->cpu_vm_mask != (1UL << smp_processor_id()))
+ mm->cpu_vm_mask = (1UL << smp_processor_id());
+ goto local_flush_and_out;
X }
X smp_cross_call(&xcall_flush_tlb_range, ctx, start, end);
X
@@ -442,22 +456,32 @@
X
X page &= PAGE_MASK;
X if(mm == current->mm && atomic_read(&mm->count) == 1) {
- if(mm->cpu_vm_mask == (1UL << smp_processor_id()))
- goto local_flush_and_out;
- return smp_cross_call_avoidance(mm);
- }
-#if 0 /* XXX Disabled until further notice... */
- else if(atomic_read(&mm->count) == 1) {
+ if(mm->cpu_vm_mask != (1UL << smp_processor_id()))
+ mm->cpu_vm_mask = (1UL << smp_processor_id());
+ goto local_flush_and_out;
+ } else {
+ spin_lock(&scheduler_lock);
+
X /* Try to handle two special cases to avoid cross calls
X * in common scenerios where we are swapping process
X * pages out.
X */
- if((mm->context ^ tlb_context_cache) & CTX_VERSION_MASK)
+ if(((mm->context ^ tlb_context_cache) & CTX_VERSION_MASK) ||
+ (mm->cpu_vm_mask == 0)) {
+ /* A dead context cannot ever become "alive" until
+ * a task switch is done to it.
+ */
+ spin_unlock(&scheduler_lock);
X return; /* It's dead, nothing to do. */
- if(mm->cpu_vm_mask == (1UL << smp_processor_id()))
- goto local_flush_and_out;
+ }
+ if(mm->cpu_vm_mask == (1UL << smp_processor_id())) {
+ spin_unlock(&scheduler_lock);
+ __flush_tlb_page(ctx, page, SECONDARY_CONTEXT);
+ return; /* Only local flush is necessary. */
+ }
+
+ spin_unlock(&scheduler_lock);
X }
-#endif
X smp_cross_call(&xcall_flush_tlb_page, ctx, page, 0);
X
X local_flush_and_out:
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/systbls.S linux/arch/sparc64/kernel/systbls.S
--- v2.2.6/linux/arch/sparc64/kernel/systbls.S Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/kernel/systbls.S Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: systbls.S,v 1.52 1999/03/20 22:02:05 davem Exp $
+/* $Id: systbls.S,v 1.53 1999/04/07 17:14:11 davem Exp $
X * systbls.S: System call entry point tables for OS compatibility.
X * The native Linux system call table lives here also.
X *
@@ -26,7 +26,7 @@
X /*30*/ .word sys32_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice
X .word sys_nis_syscall, sys_sync, sys_kill, sys32_newstat, sys32_sendfile
X /*40*/ .word sys32_newlstat, sys_dup, sys_pipe, sys32_times, sys_nis_syscall
- .word sys_nis_syscall, sys_setgid, sys_getgid, sys_signal, sys_geteuid
+ .word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid
X /*50*/ .word sys_getegid, sys_acct, sys_nis_syscall, sys_nis_syscall, sys32_ioctl
X .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys32_execve
X /*60*/ .word sys_umask, sys_chroot, sys32_newfstat, sys_nis_syscall, sys_getpagesize
@@ -48,7 +48,7 @@
X /*140*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_getrlimit
X .word sys32_setrlimit, sys_nis_syscall, sys32_prctl, sys32_pciconfig_read, sys32_pciconfig_write
X /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_nis_syscall
- .word sys_nis_syscall, sys_nis_syscall, sys32_statfs, sys32_fstatfs, sys_umount
+ .word sys_nis_syscall, sys_nis_syscall, sys32_statfs, sys32_fstatfs, sys_oldumount
X /*160*/ .word sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_nis_syscall
X .word sys32_quotactl, sys_nis_syscall, sys32_mount, sys_ustat, sys_nis_syscall
X /*170*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_getdents
@@ -85,7 +85,7 @@
X /*30*/ .word sys_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice
X .word sys_nis_syscall, sys_sync, sys_kill, sys_newstat, sys_sendfile
X /*40*/ .word sys_newlstat, sys_dup, sys_pipe, sys_times, sys_nis_syscall
- .word sys_nis_syscall, sys_setgid, sys_getgid, sys_signal, sys_geteuid
+ .word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid
X /*50*/ .word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl
X .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve
X /*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_nis_syscall, sys_getpagesize
@@ -107,7 +107,7 @@
X /*140*/ .word sys_nis_syscall, sys_getpeername, sys_nis_syscall, sys_nis_syscall, sys_getrlimit
X .word sys_setrlimit, sys_nis_syscall, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
X /*150*/ .word sys_getsockname, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_nis_syscall
- .word sys_nis_syscall, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_umount
+ .word sys_nis_syscall, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_oldumount
X /*160*/ .word sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_utrap_install
X .word sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_nis_syscall
X /*170*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getdents
@@ -188,7 +188,7 @@
X /*150*/ .word sys_getsockname, sunos_nosys, sunos_nosys
X .word sys_poll, sunos_nosys, sunos_nosys
X .word sunos_getdirentries, sys32_statfs, sys32_fstatfs
- .word sys_umount, sunos_nosys, sunos_nosys
+ .word sys_oldumount, sunos_nosys, sunos_nosys
X .word sys_getdomainname, sys_setdomainname
X .word sunos_nosys, sys32_quotactl, sunos_nosys
X .word sunos_mount, sys_ustat, sunos_semsys
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/traps.c linux/arch/sparc64/kernel/traps.c
--- v2.2.6/linux/arch/sparc64/kernel/traps.c Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/kernel/traps.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: traps.c,v 1.57 1999/03/02 15:42:18 jj Exp $
+/* $Id: traps.c,v 1.58 1999/03/29 12:38:10 jj Exp $
X * arch/sparc64/kernel/traps.c
X *
X * Copyright (C) 1995,1997 David S. Miller (da...@caip.rutgers.edu)
@@ -406,8 +406,6 @@
X void do_fpieee(struct pt_regs *regs)
X {
X #ifdef DEBUG_FPU
- save_and_clear_fpu();
-
X printk("fpieee %016lx\n", current->tss.xfsr[0]);
X #endif
X do_fpe_common(regs);
@@ -420,7 +418,6 @@
X struct fpustate *f = FPUSTATE;
X int ret = 0;
X
- save_and_clear_fpu();
X switch ((current->tss.xfsr[0] & 0x1c000)) {
X case (2 << 14): /* unfinished_FPop */
X case (3 << 14): /* unimplemented_FPop */
@@ -428,7 +425,7 @@
X break;
X }
X if (ret) return;
-#ifdef DEBUG_FPU
+#ifdef DEBUG_FPU
X printk("fpother %016lx\n", current->tss.xfsr[0]);
X #endif
X do_fpe_common(regs);
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/ttable.S linux/arch/sparc64/kernel/ttable.S
--- v2.2.6/linux/arch/sparc64/kernel/ttable.S Mon Oct 5 13:13:38 1998
+++ linux/arch/sparc64/kernel/ttable.S Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: ttable.S,v 1.27 1998/09/25 01:09:10 davem Exp $
+/* $Id: ttable.S,v 1.28 1999/03/29 12:38:10 jj Exp $
X * ttable.S: Sparc V9 Trap Table(s) with SpitFire extensions.
X *
X * Copyright (C) 1996 David S. Miller (da...@caip.rutgers.edu)
@@ -21,8 +21,8 @@
X tl0_resv018: BTRAP(0x18) BTRAP(0x19) BTRAP(0x1a) BTRAP(0x1b) BTRAP(0x1c) BTRAP(0x1d)
X tl0_resv01e: BTRAP(0x1e) BTRAP(0x1f)
X tl0_fpdis: TRAP_NOSAVE(do_fpdis)
-tl0_fpieee: TRAP(do_fpieee)
-tl0_fpother: TRAP(do_fpother)
+tl0_fpieee: TRAP_SAVEFPU(do_fpieee)
+tl0_fpother: TRAP_SAVEFPU(do_fpother)
X tl0_tof: TRAP(do_tof)
X tl0_cwin: CLEAN_WINDOW
X tl0_div0: TRAP(do_div0)
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/kernel/unaligned.c linux/arch/sparc64/kernel/unaligned.c
--- v2.2.6/linux/arch/sparc64/kernel/unaligned.c Tue Mar 23 14:35:47 1999
+++ linux/arch/sparc64/kernel/unaligned.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: unaligned.c,v 1.14 1999/03/02 15:42:16 jj Exp $
+/* $Id: unaligned.c,v 1.15 1999/04/03 11:36:21 anton Exp $
X * unaligned.c: Unaligned load/store trap handling with special
X * cases for the kernel to do them more quickly.
X *
@@ -374,7 +374,6 @@
X enum direction dir = decode_direction(insn);
X int size = decode_access_size(insn);
X
- lock_kernel();
X if(!ok_for_kernel(insn) || dir == both) {
X printk("Unsupported unaligned load/store trap for kernel at <%016lx>.\n",
X regs->tpc);
@@ -423,7 +422,6 @@
X }
X advance(regs);
X }
- unlock_kernel();
X }
X
X static char popc_helper[] = {
diff -u --recursive --new-file v2.2.6/linux/arch/sparc64/mm/init.c linux/arch/sparc64/mm/init.c
--- v2.2.6/linux/arch/sparc64/mm/init.c Mon Mar 29 11:09:11 1999
+++ linux/arch/sparc64/mm/init.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: init.c,v 1.125 1999/03/28 08:39:33 davem Exp $
+/* $Id: init.c,v 1.126 1999/04/09 16:16:41 jj Exp $
X * arch/sparc64/mm/init.c
X *
X * Copyright (C) 1996-1999 David S. Miller (da...@caip.rutgers.edu)
@@ -1127,6 +1127,7 @@
X /* paging_init() sets up the page tables */
X
X extern unsigned long free_area_init(unsigned long, unsigned long);
+extern unsigned long sun_serial_setup(unsigned long);
X
X __initfunc(unsigned long
X paging_init(unsigned long start_mem, unsigned long end_mem))
@@ -1195,6 +1196,13 @@
X * such that __pa() macros etc. work.
X */
X mempool = PAGE_ALIGN(start_mem) + shift;
+
+#ifdef CONFIG_SUN_SERIAL
+ /* This does not logically belong here, but is the first place
+ we can initialize it at, so that we work in the PAGE_OFFSET+
+ address space. */
+ mempool = sun_serial_setup(mempool);
+#endif
X
X /* Allocate 64M for dynamic DVMA mapping area. */
X allocate_ptable_skeleton(DVMA_VADDR, DVMA_VADDR + 0x4000000);
diff -u --recursive --new-file v2.2.6/linux/drivers/Makefile linux/drivers/Makefile
--- v2.2.6/linux/drivers/Makefile Fri Nov 27 13:09:22 1998
+++ linux/drivers/Makefile Sat Apr 24 18:45:18 1999
@@ -10,7 +10,7 @@
X SUB_DIRS := block char net misc sound
X MOD_SUB_DIRS := $(SUB_DIRS)
X ALL_SUB_DIRS := $(SUB_DIRS) pci scsi sbus cdrom isdn pnp \
- macintosh video dio zorro fc4
+ macintosh video dio zorro fc4 usb
X
X ifdef CONFIG_DIO
X SUB_DIRS += dio
@@ -42,6 +42,11 @@
X ifdef CONFIG_PPC
X SUB_DIRS += macintosh
X MOD_SUB_DIRS += macintosh
+endif
+
+ifeq ($(CONFIG_USB),y)
+SUB_DIRS += usb
+MOD_SUB_DIRS += usb
X endif
X
X # If CONFIG_SCSI is set, the core of SCSI support will be added to the kernel,
diff -u --recursive --new-file v2.2.6/linux/drivers/acorn/char/keyb_ps2.c linux/drivers/acorn/char/keyb_ps2.c
--- v2.2.6/linux/drivers/acorn/char/keyb_ps2.c Tue Dec 22 14:16:54 1998
+++ linux/drivers/acorn/char/keyb_ps2.c Mon Apr 26 13:31:49 1999
@@ -221,11 +221,6 @@
X };
X #endif
X
-int ps2kbd_pretranslate(unsigned char scancode)
-{
- return 1;
-}
-
X int ps2kbd_translate(unsigned char scancode, unsigned char *keycode_p, char *uf_p)
X {
X *uf_p = scancode & 0200;
@@ -235,7 +230,7 @@
X
X static void ps2kbd_key(unsigned int keycode, unsigned int up_flag)
X {
- handle_scancode(keycode + (up_flag ? 0x80 : 0));


+ handle_scancode(keycode, !up_flag);
X }
X

X static inline void ps2kbd_sendbyte(unsigned char val)
diff -u --recursive --new-file v2.2.6/linux/drivers/block/ide-cd.h linux/drivers/block/ide-cd.h
--- v2.2.6/linux/drivers/block/ide-cd.h Tue Mar 23 14:35:47 1999
+++ linux/drivers/block/ide-cd.h Tue Apr 27 09:56:22 1999
@@ -334,13 +334,13 @@
X
X #if defined(__BIG_ENDIAN_BITFIELD)
X __u8 reserved3 : 2;
- /* Drive can fake writes */
- __u8 test_write : 1;
- __u8 reserved3a : 1;
- /* Drive can write DVD-R discs */
- __u8 dvd_r_write : 1;
X /* Drive can write DVD-RAM discs */
X __u8 dvd_ram_write : 1;
+ /* Drive can write DVD-R discs */
+ __u8 dvd_r_write : 1;
+ __u8 reserved3a : 1;
+ /* Drive can fake writes */
+ __u8 test_write : 1;
X /* Drive can write to CD-R/W (CD-E) discs (orange book, part III) */
X __u8 cd_rw_write : 1; /* reserved in 1.2 */
X /* Drive supports write to CD-R discs (orange book, part II) */
@@ -350,13 +350,13 @@
X __u8 cd_r_write : 1; /* reserved in 1.2 */
X /* Drive can write to CD-R/W (CD-E) discs (orange book, part III) */
X __u8 cd_rw_write : 1; /* reserved in 1.2 */
- /* Drive can write DVD-RAM discs */
- __u8 dvd_ram_write : 1;
- /* Drive can write DVD-R discs */
- __u8 dvd_r_write : 1;
- __u8 reserved3a : 1;
X /* Drive can fake writes */
X __u8 test_write : 1;
+ __u8 reserved3a : 1;
+ /* Drive can write DVD-R discs */
+ __u8 dvd_r_write : 1;
+ /* Drive can write DVD-RAM discs */
+ __u8 dvd_ram_write : 1;
X __u8 reserved3 : 2;
X #else
X #error "Please fix <asm/byteorder.h>"
diff -u --recursive --new-file v2.2.6/linux/drivers/block/rd.c linux/drivers/block/rd.c
--- v2.2.6/linux/drivers/block/rd.c Mon Mar 29 11:09:11 1999
+++ linux/drivers/block/rd.c Tue Apr 27 09:24:34 1999
@@ -295,6 +295,8 @@
X
X #ifdef MODULE
X
+MODULE_PARM (rd_size, "1i");
+
X int init_module(void)
X {
X int error = rd_init();
diff -u --recursive --new-file v2.2.6/linux/drivers/cdrom/optcd.c linux/drivers/cdrom/optcd.c
--- v2.2.6/linux/drivers/cdrom/optcd.c Wed Aug 26 11:37:36 1998
+++ linux/drivers/cdrom/optcd.c Sat Apr 24 17:49:37 1999
@@ -100,6 +100,10 @@
X #else
X #define DEBUG(x)
X #endif
+
+static int blksize = 2048;
+static int hsecsize = 2048;
+
X
X /* Drive hardware/firmware characteristics
X Identifiers in accordance with Optics Storage documentation */
@@ -2061,6 +2065,8 @@
X return -EIO;
X }
X
+ hardsect_size[MAJOR_NR] = &hsecsize;
+ blksize_size[MAJOR_NR] = &blksize;
X blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;
X read_ahead[MAJOR_NR] = 4;
X request_region(optcd_port, 4, "optcd");
diff -u --recursive --new-file v2.2.6/linux/drivers/char/Makefile linux/drivers/char/Makefile
--- v2.2.6/linux/drivers/char/Makefile Fri Apr 16 14:47:30 1999
+++ linux/drivers/char/Makefile Mon Apr 26 11:08:17 1999
@@ -42,14 +42,15 @@
X
X ifndef CONFIG_SUN_KEYBOARD
X ifdef CONFIG_VT
-L_OBJS += keyboard.o
+LX_OBJS += keyboard.o
X endif
X ifneq ($(ARCH),m68k)
X L_OBJS += pc_keyb.o defkeymap.o
X endif
X else
X ifdef CONFIG_PCI
-L_OBJS += defkeymap.o keyboard.o
+L_OBJS += defkeymap.o
+LX_OBJS += keyboard.o
X endif
X endif
X
diff -u --recursive --new-file v2.2.6/linux/drivers/char/amikeyb.c linux/drivers/char/amikeyb.c
--- v2.2.6/linux/drivers/char/amikeyb.c Mon Aug 3 12:45:45 1998
+++ linux/drivers/char/amikeyb.c Mon Apr 26 13:25:54 1999
@@ -188,7 +188,7 @@
X amikeyb_rep_timer.expires = jiffies + key_repeat_rate;
X amikeyb_rep_timer.prev = amikeyb_rep_timer.next = NULL;
X add_timer(&amikeyb_rep_timer);


- handle_scancode(rep_scancode);
+ handle_scancode(rep_scancode, 1);
X

X restore_flags(flags);
X }
@@ -243,8 +243,8 @@
X
X if (keycode == AMIKEY_CAPS) {
X /* if the key is CAPS, fake a press/release. */
- handle_scancode(AMIKEY_CAPS);
- handle_scancode(BREAK_MASK | AMIKEY_CAPS);
+ handle_scancode(AMIKEY_CAPS, 1);
+ handle_scancode(AMIKEY_CAPS, 0);
X } else if (keycode < 0x78) {
X /* handle repeat */
X if (break_flag) {
@@ -257,7 +257,7 @@
X amikeyb_rep_timer.prev = amikeyb_rep_timer.next = NULL;
X add_timer(&amikeyb_rep_timer);
X }
- handle_scancode(scancode);
+ handle_scancode(scancode, !break_flag);
X } else
X switch (keycode) {
X case 0x78:
diff -u --recursive --new-file v2.2.6/linux/drivers/char/bttv.c linux/drivers/char/bttv.c
--- v2.2.6/linux/drivers/char/bttv.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/char/bttv.c Sat Apr 24 17:49:37 1999
@@ -2853,6 +2853,16 @@
X }
X #endif
X
+static void init_tea6300(struct i2c_bus *bus)
+{
+ I2CWrite(bus, I2C_TEA6300, TEA6300_VL, 0x35, 1); /* volume left 0dB */
+ I2CWrite(bus, I2C_TEA6300, TEA6300_VR, 0x35, 1); /* volume right 0dB */


SHAR_EOF
true || echo 'restore of patch-2.2.7 failed'
fi

echo 'End of part 02'
echo 'File patch-2.2.7 is continued in part 03'
echo 03 > _shar_seq_.tmp

Thomas...@ciw.uni-karlsruhe.de

unread,
May 1, 1999, 3:00:00 AM5/1/99
to
Archive-name: v2.2/patch-2.2.7/part04

#!/bin/sh
# this is part 04 of a 22 - part archive


# do not concatenate these parts, unpack them in order with /bin/sh
# file patch-2.2.7 continued
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck

if test "$Scheck" != 04; then


echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping patch-2.2.7'
else
echo 'x - continuing with patch-2.2.7'
sed 's/^X//' << 'SHAR_EOF' >> 'patch-2.2.7' &&

- idev->rx_buff.head = idev->rx_buff.data;
- idev->rx_buff.offset = 0;
+ idev->rx_buff.data = idev->rx_buff.head;
X
X /* Reset Rx FIFO. This will also flush the ST_FIFO */
X outb(FCR_RXTH|FCR_TXTH|FCR_RXSR|FCR_FIFO_EN, iobase+FCR);
@@ -1024,42 +1021,41 @@
X /* Skip frame */
X idev->stats.rx_errors++;
X
- idev->rx_buff.offset += len;
- idev->rx_buff.head += len;
+ idev->rx_buff.data += len;
X
- if ( status & FRM_ST_MAX_LEN)
+ if (status & FRM_ST_MAX_LEN)
X idev->stats.rx_length_errors++;
X
- if ( status & FRM_ST_PHY_ERR)
+ if (status & FRM_ST_PHY_ERR)
X idev->stats.rx_frame_errors++;
X
- if ( status & FRM_ST_BAD_CRC)
+ if (status & FRM_ST_BAD_CRC)
X idev->stats.rx_crc_errors++;
X }
X /* The errors below can be reported in both cases */
- if ( status & FRM_ST_OVR1)
+ if (status & FRM_ST_OVR1)
X idev->stats.rx_fifo_errors++;
X
- if ( status & FRM_ST_OVR2)
+ if (status & FRM_ST_OVR2)
X idev->stats.rx_fifo_errors++;
X
X } else {
X /* Check if we have transfered all data to memory */
- if ( inb( iobase+LSR) & LSR_RXDA) {
+ if (inb(iobase+LSR) & LSR_RXDA) {
X /* Put this entry back in fifo */
X st_fifo->head--;
X st_fifo->len++;
X st_fifo->entries[st_fifo->head].status = status;
- st_fifo->entries[ st_fifo->head].len = len;
+ st_fifo->entries[st_fifo->head].len = len;
X
X /* Restore bank register */
- outb( bank, iobase+BSR);
+ outb(bank, iobase+BSR);
X
X return FALSE; /* I'll be back! */
X }
X
X /* Should be OK then */
- skb = dev_alloc_skb( len+1);
+ skb = dev_alloc_skb(len+1);
X if (skb == NULL) {
X printk( KERN_INFO __FUNCTION__
X "(), memory squeeze, dropping frame.\n");
@@ -1070,20 +1066,19 @@
X }
X
X /* Make sure IP header gets aligned */
- skb_reserve( skb, 1);
+ skb_reserve(skb, 1);
X
X /* Copy frame without CRC */
- if ( idev->io.baudrate < 4000000) {
- skb_put( skb, len-2);
- memcpy( skb->data, idev->rx_buff.head, len-2);
+ if (idev->io.baudrate < 4000000) {
+ skb_put(skb, len-2);
+ memcpy(skb->data, idev->rx_buff.data, len-2);
X } else {
- skb_put( skb, len-4);
- memcpy( skb->data, idev->rx_buff.head, len-4);
+ skb_put(skb, len-4);
+ memcpy(skb->data, idev->rx_buff.data, len-4);
X }
X
X /* Move to next frame */
- idev->rx_buff.offset += len;
- idev->rx_buff.head += len;
+ idev->rx_buff.data += len;
X idev->stats.rx_packets++;
X
X skb->dev = &idev->netdev;
@@ -1093,7 +1088,7 @@
X }
X }
X /* Restore bank register */
- outb( bank, iobase+BSR);
+ outb(bank, iobase+BSR);
X
X return TRUE;
X }
@@ -1109,23 +1104,19 @@
X __u8 byte = 0x00;
X int iobase;
X
- DEBUG( 4, __FUNCTION__ "()\n");
+ DEBUG(4, __FUNCTION__ "()\n");
X
- ASSERT( idev != NULL, return;);
- ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+ ASSERT(idev != NULL, return;);
+ ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
X
X iobase = idev->io.iobase;
X
- if ( idev->rx_buff.len == 0) {
- idev->rx_buff.head = idev->rx_buff.data;
- }
-
X /* Receive all characters in Rx FIFO */
X do {
- byte = inb( iobase+RXD);
- async_unwrap_char( idev, byte);
+ byte = inb(iobase+RXD);
+ async_unwrap_char(idev, byte);
X
- } while ( inb( iobase+LSR) & LSR_RXDA); /* Data available */
+ } while (inb(iobase+LSR) & LSR_RXDA); /* Data available */
X }
X
X /*
@@ -1134,38 +1125,35 @@
X * Handle SIR interrupt
X *
X */
-static __u8 pc87108_sir_interrupt( struct irda_device *idev, int eir)
+static __u8 pc87108_sir_interrupt(struct irda_device *idev, int eir)
X {
- int len;
X int actual;
X __u8 new_ier = 0;
X
X /* Transmit FIFO low on data */
X if ( eir & EIR_TXLDL_EV) {
X /* Write data left in transmit buffer */
- len = idev->tx_buff.len - idev->tx_buff.offset;
-
- ASSERT( len > 0, return 0;);
- actual = pc87108_pio_write( idev->io.iobase,
- idev->tx_buff.head,
- len, idev->io.fifo_size);
- idev->tx_buff.offset += actual;
- idev->tx_buff.head += actual;
+ actual = pc87108_pio_write(idev->io.iobase,
+ idev->tx_buff.data,
+ idev->tx_buff.len,
+ idev->io.fifo_size);
+ idev->tx_buff.data += actual;
+ idev->tx_buff.len -= actual;
X
X idev->io.direction = IO_XMIT;
- ASSERT( actual <= len, return 0;);
X
X /* Check if finished */
- if ( actual == len) {
- DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
+ if (idev->tx_buff.len > 0)
+ new_ier |= IER_TXLDL_IE;
+ else {
X idev->netdev.tbusy = 0; /* Unlock */
X idev->stats.tx_packets++;
-
+
X mark_bh(NET_BH);
X
X new_ier |= IER_TXEMP_IE;
- } else
- new_ier |= IER_TXLDL_IE;
+ }
+
X }
X /* Check if transmission has completed */
X if ( eir & EIR_TXEMP_EV) {
diff -u --recursive --new-file v2.2.6/linux/drivers/net/irda/tekram.c linux/drivers/net/irda/tekram.c
--- v2.2.6/linux/drivers/net/irda/tekram.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/net/irda/tekram.c Sat Apr 24 17:49:37 1999
@@ -1,12 +1,12 @@
X /*********************************************************************
X *
X * Filename: tekram.c
- * Version: 0.5
+ * Version: 1.0
X * Description: Implementation of the Tekram IrMate IR-210B dongle
X * Status: Experimental.
X * Author: Dag Brattli <da...@cs.uit.no>
X * Created at: Wed Oct 21 20:02:35 1998
- * Modified at: Mon Feb 15 14:13:17 1999
+ * Modified at: Tue Apr 13 16:33:54 1999
X * Modified by: Dag Brattli <da...@cs.uit.no>
X *
X * Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -33,16 +33,23 @@
X #include <asm/uaccess.h>
X
X #include <net/irda/irda.h>
-#include <net/irda/irmod.h>
X #include <net/irda/irda_device.h>
X #include <net/irda/irtty.h>
X #include <net/irda/dongle.h>
X
-static void tekram_reset( struct irda_device *dev, int unused);
-static void tekram_open( struct irda_device *dev, int type);
-static void tekram_close( struct irda_device *dev);
-static void tekram_change_speed( struct irda_device *dev, int baud);
-static void tekram_init_qos( struct irda_device *idev, struct qos_info *qos);
+static void tekram_reset(struct irda_device *dev, int unused);
+static void tekram_open(struct irda_device *dev, int type);
+static void tekram_close(struct irda_device *dev);
+static void tekram_change_speed(struct irda_device *dev, int baud);
+static void tekram_init_qos(struct irda_device *idev, struct qos_info *qos);
+
+#define TEKRAM_115200 0x00
+#define TEKRAM_57600 0x01
+#define TEKRAM_38400 0x02
+#define TEKRAM_19200 0x03
+#define TEKRAM_9600 0x04
+
+#define TEKRAM_PW 0x10 /* Pulse select bit */
X
X static struct dongle dongle = {
X TEKRAM_DONGLE,
@@ -53,9 +60,9 @@
X tekram_init_qos,
X };
X
-__initfunc(void tekram_init(void))
+__initfunc(int tekram_init(void))
X {
- irtty_register_dongle( &dongle);
+ return irtty_register_dongle(&dongle);
X }
X
X void tekram_cleanup(void)
@@ -102,17 +109,17 @@
X int cflag;
X __u8 byte;
X
- DEBUG( 4, __FUNCTION__ "()\n");
+ DEBUG(4, __FUNCTION__ "()\n");
X
- ASSERT( dev != NULL, return;);
- ASSERT( dev->magic == IRDA_DEVICE_MAGIC, return;);
+ ASSERT(dev != NULL, return;);
+ ASSERT(dev->magic == IRDA_DEVICE_MAGIC, return;);
X
X self = (struct irtty_cb *) dev->priv;
X
- ASSERT( self != NULL, return;);
- ASSERT( self->magic == IRTTY_MAGIC, return;);
+ ASSERT(self != NULL, return;);
+ ASSERT(self->magic == IRTTY_MAGIC, return;);
X
- if ( !self->tty)
+ if (!self->tty)
X return;
X
X tty = self->tty;
@@ -123,26 +130,27 @@
X cflag &= ~CBAUD;
X
X switch (baud) {
- case 9600:
X default:
+ /* FALLTHROUGH */
+ case 9600:
X cflag |= B9600;
- byte = 4;
+ byte = TEKRAM_PW|TEKRAM_9600;
X break;
X case 19200:
X cflag |= B19200;
- byte = 3;
+ byte = TEKRAM_PW|TEKRAM_19200;
X break;
X case 34800:
X cflag |= B38400;
- byte = 2;
+ byte = TEKRAM_PW|TEKRAM_38400;
X break;
X case 57600:
X cflag |= B57600;
- byte = 1;
+ byte = TEKRAM_PW|TEKRAM_57600;
X break;
X case 115200:
X cflag |= B115200;
- byte = 0;
+ byte = TEKRAM_PW|TEKRAM_115200;
X break;
X }
X
@@ -150,22 +158,22 @@
X irtty_set_dtr_rts(tty, TRUE, FALSE);
X
X /* Wait at least 7us */
- udelay( 7);
+ udelay(7);
X
X /* Write control byte */
- if ( tty->driver.write)
- tty->driver.write( self->tty, 0, &byte, 1);
+ if (tty->driver.write)
+ tty->driver.write(self->tty, 0, &byte, 1);
X
X /* Wait at least 100 ms */
X current->state = TASK_INTERRUPTIBLE;
- schedule_timeout( 10);
+ schedule_timeout(MSECS_TO_JIFFIES(100));
X
X /* Set DTR, Set RTS */
X irtty_set_dtr_rts(tty, TRUE, TRUE);
X
X /* Now change the speed of the serial port */
X tty->termios->c_cflag = cflag;
- tty->driver.set_termios( tty, &old_termios);
+ tty->driver.set_termios(tty, &old_termios);
X }
X
X /*
@@ -175,30 +183,29 @@
X * must be called with a process context!!
X *
X * Algorithm:
- * 0. set RTS and DTR, and wait 50 ms
- * ( power off the IR-210 )
+ * 0. Clear RTS and DTR, and wait 50 ms (power off the IR-210 )
X * 1. clear RTS
X * 2. set DTR, and wait at least 1 ms
X * 3. clear DTR to SPACE state, wait at least 50 us for further
X * operation
X */
-void tekram_reset( struct irda_device *dev, int unused)
+void tekram_reset(struct irda_device *dev, int unused)
X {
X struct irtty_cb *self;
X struct tty_struct *tty;
X
- DEBUG( 4, __FUNCTION__ "()\n");
+ DEBUG(4, __FUNCTION__ "()\n");
X
- ASSERT( dev != NULL, return;);
- ASSERT( dev->magic == IRDA_DEVICE_MAGIC, return;);
+ ASSERT(dev != NULL, return;);
+ ASSERT(dev->magic == IRDA_DEVICE_MAGIC, return;);
X
X self = (struct irtty_cb *) dev->priv;
X
- ASSERT( self != NULL, return;);
- ASSERT( self->magic == IRTTY_MAGIC, return;);
+ ASSERT(self != NULL, return;);
+ ASSERT(self->magic == IRTTY_MAGIC, return;);
X
X tty = self->tty;
- if ( !tty)
+ if (!tty)
X return;
X
X /* Power off dongle */
@@ -206,18 +213,20 @@
X
X /* Sleep 50 ms */
X current->state = TASK_INTERRUPTIBLE;
- schedule_timeout(5);
+ schedule_timeout(MSECS_TO_JIFFIES(50));
X
X /* Clear DTR, Set RTS */
X irtty_set_dtr_rts(tty, FALSE, TRUE);
X
X /* Should sleep 1 ms, but 10-20 should not do any harm */
X current->state = TASK_INTERRUPTIBLE;
- schedule_timeout(2);
+ schedule_timeout(MSECS_TO_JIFFIES(20));
X
X /* Set DTR, Set RTS */
X irtty_set_dtr_rts(tty, TRUE, TRUE);
X
+ udelay(50);
+
X /* Finished! */
X }
X
@@ -227,10 +236,11 @@
X * Initialize QoS capabilities
X *
X */
-static void tekram_init_qos( struct irda_device *idev, struct qos_info *qos)
+static void tekram_init_qos(struct irda_device *idev, struct qos_info *qos)
X {
X qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200;
- qos->min_turn_time.bits &= 0xfe; /* All except 0 ms */
+ qos->min_turn_time.bits &= 0x01; /* Needs at least 10 ms */
+ irda_qos_bits_to_value(qos);
X }
X
X #ifdef MODULE
@@ -246,8 +256,7 @@
X */
X int init_module(void)
X {
- tekram_init();
- return(0);
+ return tekram_init();
X }
X
X /*
diff -u --recursive --new-file v2.2.6/linux/drivers/net/irda/uircc.c linux/drivers/net/irda/uircc.c
--- v2.2.6/linux/drivers/net/irda/uircc.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/net/irda/uircc.c Sat Apr 24 17:49:37 1999
@@ -7,7 +7,7 @@
X * Status: Experimental.
X * Author: Dag Brattli <da...@cs.uit.no>
X * Created at: Sat Dec 26 10:59:03 1998
- * Modified at: Sat Apr 3 15:54:41 1999
+ * Modified at: Tue Apr 20 11:15:52 1999
X * Modified by: Dag Brattli <da...@cs.uit.no>
X *
X * Copyright (c) 1998 Dag Brattli, All Rights Reserved.


@@ -190,7 +190,7 @@
X

X /* The only value we must override it the baudrate */
X idev->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
- IR_115200|/*IR_576000|IR_1152000| */(IR_4000000 << 8);
+ IR_115200/*IR_576000|IR_1152000 |(IR_4000000 << 8)*/;
X
X idev->qos.min_turn_time.bits = 0x0f;
X irda_qos_bits_to_value(&idev->qos);
@@ -372,7 +372,7 @@
X DEBUG(0, __FUNCTION__ "(), handling baud of 4000000\n");
X
X /* Set self pole address */
- outb(0x10, iobase+UIRCC_CR8);
+ //outb(0xfe, iobase+UIRCC_CR8);
X
X /* outb(0x10, iobase+UIRCC_CR11); */
X break;
@@ -443,8 +443,7 @@
X skb->len++;
X
X idev->tx_buff.len = skb->len;
- idev->tx_buff.head = idev->tx_buff.data;
- idev->tx_buff.offset = 0;
+ idev->tx_buff.data = idev->tx_buff.head;
X
X mtt = irda_get_mtt(skb);
X
@@ -586,11 +585,15 @@
X outb(self->cr3, iobase+UIRCC_CR3);
X
X /* Transmit reset (just in case) */
- outb(UIRCC_CR0_XMIT_RST, iobase+UIRCC_CR0);
+ outb(UIRCC_CR0_XMIT_RST|0x17, iobase+UIRCC_CR0);
X
X /* Set modem */
X outb(0x08, iobase+UIRCC_CR10);
X
+ /* Enable receiving with CRC */
+ self->cr3 = (UIRCC_CR3_RECV_EN|UIRCC_CR3_RX_CRC_EN);
+ outb(self->cr3, iobase+UIRCC_CR3);
+
X /* Make sure Rx DMA is set */
X outb(UIRCC_CR1_RX_DMA|UIRCC_CR1_MUST_SET, iobase+UIRCC_CR1);
X
@@ -602,13 +605,13 @@
X
X /* driver->media_busy = FALSE; */
X idev->io.direction = IO_RECV;
- idev->rx_buff.head = idev->rx_buff.data;
- idev->rx_buff.offset = 0;
+ idev->rx_buff.data = idev->rx_buff.head;
X
+#if 0
X /* Enable receiving with CRC */
X self->cr3 = (UIRCC_CR3_RECV_EN|UIRCC_CR3_RX_CRC_EN);
X outb(self->cr3, iobase+UIRCC_CR3);
-
+#endif
X DEBUG(4, __FUNCTION__ "(), cr3=%#x\n", self->cr3);
X
X /* Address check? */
@@ -673,7 +676,7 @@
X /* } */
X
X skb_put(skb, len);
- memcpy(skb->data, idev->rx_buff.head, len);
+ memcpy(skb->data, idev->rx_buff.data, len);
X idev->stats.rx_packets++;
X
X skb->dev = &idev->netdev;
@@ -737,7 +740,7 @@
X uircc_dma_xmit_complete(idev, FALSE);
X uircc_dma_receive(idev);
X
- /* outb(0, iobase+UIRCC_CR2); */
+ outb(0x0d, iobase+UIRCC_CR2);
X break;
X case UIRCC_SR3_TMR_OUT:
X /* Disable timer */
diff -u --recursive --new-file v2.2.6/linux/drivers/net/irda/w83977af_ir.c linux/drivers/net/irda/w83977af_ir.c
--- v2.2.6/linux/drivers/net/irda/w83977af_ir.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/net/irda/w83977af_ir.c Sat Apr 24 17:49:37 1999
@@ -6,7 +6,7 @@
X * Status: Experimental.
X * Author: Paul VanderSpek
X * Created at: Wed Nov 4 11:46:16 1998
- * Modified at: Wed Apr 7 17:35:59 1999
+ * Modified at: Tue Apr 20 11:15:00 1999
X * Modified by: Dag Brattli <da...@cs.uit.no>
X *
X * Copyright (c) 1998 Corel Computer Corp.
@@ -482,8 +482,7 @@
X if (idev->io.baudrate > 115200) {
X memcpy(idev->tx_buff.data, skb->data, skb->len);
X idev->tx_buff.len = skb->len;
- idev->tx_buff.head = idev->tx_buff.data;
- idev->tx_buff.offset = 0;
+ idev->tx_buff.data = idev->tx_buff.head;
X
X mtt = irda_get_mtt(skb);
X if (mtt > 50) {
@@ -512,20 +511,18 @@
X w83977af_dma_write(idev, iobase);
X }
X } else {
+ idev->tx_buff.data = idev->tx_buff.head;
X idev->tx_buff.len = async_wrap_skb(skb, idev->tx_buff.data,
X idev->tx_buff.truesize);
X
- idev->tx_buff.offset = 0;
- idev->tx_buff.head = idev->tx_buff.data;
-
X /* Add interrupt on tx low level (will fire immediately) */
- switch_bank( iobase, SET0);
+ switch_bank(iobase, SET0);
X outb(ICR_ETXTHI, iobase+ICR);
X }
X dev_kfree_skb(skb);
X
X /* Restore set register */
- outb( set, iobase+SSR);
+ outb(set, iobase+SSR);


X
X return 0;
X }

@@ -594,9 +591,9 @@
X }
X
X /* Fill FIFO with current frame */
- while (( fifo_size-- > 0) && (actual < len)) {
+ while ((fifo_size-- > 0) && (actual < len)) {
X /* Transmit next byte */
- outb( buf[actual++], iobase+TBR);
+ outb(buf[actual++], iobase+TBR);
X }
X
X DEBUG(4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n",
@@ -702,8 +699,7 @@
X #endif
X /* driver->media_busy = FALSE; */
X idev->io.direction = IO_RECV;
- idev->rx_buff.head = idev->rx_buff.data;
- idev->rx_buff.offset = 0;
+ idev->rx_buff.data = idev->rx_buff.head;
X
X /*
X * Reset Rx FIFO. This will also flush the ST_FIFO, it's very
@@ -751,30 +747,30 @@
X __u8 set;
X __u8 status;
X
- DEBUG( 0, __FUNCTION__ "\n");
+ DEBUG(0, __FUNCTION__ "\n");
X
X iobase = idev->io.iobase;
X
X /* Save current set */
- set = inb( iobase+SSR);
+ set = inb(iobase+SSR);
X
X iobase = idev->io.iobase;
X
X switch_bank(iobase, SET5);
- if ( prev.status & FS_FO_FSFDR) {
+ if (prev.status & FS_FO_FSFDR) {
X status = prev.status;
X len = prev.len;
-
+
X prev.status = 0;
X } else {
- status = inb( iobase+FS_FO);
- len = inb( iobase+RFLFL);
- len |= inb( iobase+RFLFH) << 8;
+ status = inb(iobase+FS_FO);
+ len = inb(iobase+RFLFL);
+ len |= inb(iobase+RFLFH) << 8;
X }
X
- while ( status & FS_FO_FSFDR) {
+ while (status & FS_FO_FSFDR) {
X /* Check for errors */
- if ( status & FS_FO_ERR_MSK) {
+ if (status & FS_FO_ERR_MSK) {
X if ( status & FS_FO_LST_FR) {
X /* Add number of lost frames to stats */
X idev->stats.rx_errors += len;
@@ -782,29 +778,28 @@
X /* Skip frame */
X idev->stats.rx_errors++;
X
- idev->rx_buff.offset += len;
- idev->rx_buff.head += len;
+ idev->rx_buff.data += len;
X
- if ( status & FS_FO_MX_LEX)
+ if (status & FS_FO_MX_LEX)
X idev->stats.rx_length_errors++;
X
- if ( status & FS_FO_PHY_ERR)
+ if (status & FS_FO_PHY_ERR)
X idev->stats.rx_frame_errors++;
X
- if ( status & FS_FO_CRC_ERR)
+ if (status & FS_FO_CRC_ERR)
X idev->stats.rx_crc_errors++;
X }
X /* The errors below can be reported in both cases */
- if ( status & FS_FO_RX_OV)
+ if (status & FS_FO_RX_OV)
X idev->stats.rx_fifo_errors++;
X
- if ( status & FS_FO_FSF_OV)
+ if (status & FS_FO_FSF_OV)
X idev->stats.rx_fifo_errors++;
X
X } else {
X /* Check if we have transfered all data to memory */
X switch_bank(iobase, SET0);
- if ( inb( iobase+USR) & USR_RDR) {
+ if (inb(iobase+USR) & USR_RDR) {
X /* Put this entry back in fifo */
X prev.status = status;
X prev.len = len;
@@ -815,31 +810,30 @@
X return FALSE; /* I'll be back! */
X }
X
- skb = dev_alloc_skb( len+1);
+ skb = dev_alloc_skb(len+1);
X if (skb == NULL) {
- printk( KERN_INFO __FUNCTION__
- "(), memory squeeze, dropping frame.\n");
+ printk(KERN_INFO __FUNCTION__
+ "(), memory squeeze, dropping frame.\n");
X /* Restore set register */
- outb( set, iobase+SSR);
+ outb(set, iobase+SSR);
X
X return FALSE;
X }
X
X /* Align to 20 bytes */
- skb_reserve( skb, 1);
+ skb_reserve(skb, 1);
X
X /* Copy frame without CRC */
X if ( idev->io.baudrate < 4000000) {
X skb_put( skb, len-2);
- memcpy( skb->data, idev->rx_buff.head, len-2);
+ memcpy( skb->data, idev->rx_buff.data, len-2);
X } else {
X skb_put( skb, len-4);
- memcpy( skb->data, idev->rx_buff.head, len-4);
+ memcpy( skb->data, idev->rx_buff.data, len-4);
X }
X
X /* Move to next frame */
- idev->rx_buff.offset += len;
- idev->rx_buff.head += len;
+ idev->rx_buff.data += len;
X
X skb->dev = &idev->netdev;
X skb->mac.raw = skb->data;
@@ -854,7 +848,7 @@
X len |= inb( iobase+RFLFH) << 8;
X }
X /* Restore set register */
- outb( set, iobase+SSR);
+ outb(set, iobase+SSR);
X
X return TRUE;
X }
@@ -865,28 +859,24 @@
X * Receive all data in receiver FIFO
X *
X */
-static void w83977af_pio_receive( struct irda_device *idev)
+static void w83977af_pio_receive(struct irda_device *idev)
X {
X __u8 byte = 0x00;
X int iobase;
X
- DEBUG( 4, __FUNCTION__ "()\n");
+ DEBUG(4, __FUNCTION__ "()\n");
X
- ASSERT( idev != NULL, return;);
- ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+ ASSERT(idev != NULL, return;);
+ ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
X
X iobase = idev->io.iobase;
X
- if ( idev->rx_buff.len == 0) {
- idev->rx_buff.head = idev->rx_buff.data;
- }
-
X /* Receive all characters in Rx FIFO */
X do {
- byte = inb( iobase+RBR);
- async_unwrap_char( idev, byte);
+ byte = inb(iobase+RBR);
+ async_unwrap_char(idev, byte);
X
- } while ( inb( iobase+USR) & USR_RDR); /* Data available */
+ } while (inb(iobase+USR) & USR_RDR); /* Data available */
X }
X
X /*
@@ -897,7 +887,6 @@
X */
X static __u8 w83977af_sir_interrupt(struct irda_device *idev, int isr)
X {
- int len;
X int actual;
X __u8 new_icr = 0;
X
@@ -906,19 +895,19 @@
X /* Transmit FIFO low on data */
X if (isr & ISR_TXTH_I) {
X /* Write data left in transmit buffer */
- len = idev->tx_buff.len - idev->tx_buff.offset;
-
- ASSERT(len > 0, return 0;);
X actual = w83977af_pio_write(idev->io.iobase,
- idev->tx_buff.head,
- len, idev->io.fifo_size);
- idev->tx_buff.offset += actual;
- idev->tx_buff.head += actual;
+ idev->tx_buff.data,
+ idev->tx_buff.len,
+ idev->io.fifo_size);
+ idev->tx_buff.data += actual;
+ idev->tx_buff.len -= actual;
X
X idev->io.direction = IO_XMIT;
- ASSERT( actual <= len, return 0;);
+
X /* Check if finished */
- if ( actual == len) {
+ if (idev->tx_buff.len > 0)
+ new_icr |= ICR_ETXTHI;
+ else {
X DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
X idev->netdev.tbusy = 0; /* Unlock */
X idev->stats.tx_packets++;
@@ -927,8 +916,8 @@
X mark_bh(NET_BH);
X
X new_icr |= ICR_ETBREI;
- } else
- new_icr |= ICR_ETXTHI;
+ }
+
X }
X /* Check if transmission has completed */
X if (isr & ISR_TXEMP_I) {
diff -u --recursive --new-file v2.2.6/linux/drivers/net/net_init.c linux/drivers/net/net_init.c
--- v2.2.6/linux/drivers/net/net_init.c Tue Dec 22 14:16:55 1998
+++ linux/drivers/net/net_init.c Sat Apr 24 17:51:48 1999
@@ -252,6 +252,22 @@
X return dev;
X }
X
+
+void unregister_hipdev(struct device *dev)
+{
+ int i;
+ rtnl_lock();
+ unregister_netdevice(dev);
+ for (i = 0; i < MAX_HIP_CARDS; ++i) {
+ if (hipdev_index[i] == dev) {
+ hipdev_index[i] = NULL;
+ break;
+ }
+ }
+ rtnl_unlock();
+}
+
+
X static int hippi_neigh_setup_dev(struct device *dev, struct neigh_parms *p)
X {
X /* Never send broadcast/multicast ARP messages */
diff -u --recursive --new-file v2.2.6/linux/drivers/net/pcnet32.c linux/drivers/net/pcnet32.c
--- v2.2.6/linux/drivers/net/pcnet32.c Tue Jan 19 11:32:51 1999
+++ linux/drivers/net/pcnet32.c Sat Apr 24 17:51:48 1999
@@ -13,7 +13,7 @@
X * This driver is for PCnet32 and PCnetPCI based ethercards
X */
X
-static const char *version = "pcnet32.c:v1.11 17.1.99 tsbo...@alpha.franken.de\n";
+static const char *version = "pcnet32.c:v1.21 31.3.99 tsbo...@alpha.franken.de\n";
X
X #include <linux/config.h>
X #include <linux/module.h>
@@ -58,9 +58,36 @@
X
X #define PORT_PORTSEL 0x03
X #define PORT_ASEL 0x04
+#define PORT_100 0x40
X #define PORT_FD 0x80
X
-static int options = PORT_ASEL; /* port selection */
+
+/*
+ * table to translate option values from tulip
+ * to internal options
+ */
+static unsigned char options_mapping[] = {
+ PORT_ASEL, /* 0 Auto-select */
+ PORT_AUI, /* 1 BNC/AUI */
+ PORT_AUI, /* 2 AUI/BNC */
+ PORT_ASEL, /* 3 not supported */
+ PORT_10BT | PORT_FD, /* 4 10baseT-FD */
+ PORT_ASEL, /* 5 not supported */
+ PORT_ASEL, /* 6 not supported */
+ PORT_ASEL, /* 7 not supported */
+ PORT_ASEL, /* 8 not supported */
+ PORT_MII, /* 9 MII 10baseT */
+ PORT_MII | PORT_FD, /* 10 MII 10baseT-FD */
+ PORT_MII, /* 11 MII (autosel) */
+ PORT_10BT, /* 12 10BaseT */
+ PORT_MII | PORT_100, /* 13 MII 100BaseTx */
+ PORT_MII | PORT_100 | PORT_FD, /* 14 MII 100BaseTx-FD */
+ PORT_ASEL /* 15 not supported */
+};
+
+#define MAX_UNITS 8
+static int options[MAX_UNITS] = {0, };
+static int full_duplex[MAX_UNITS] = {0, };
X
X /*
X * Theory of Operation
@@ -116,6 +143,12 @@
X * added port selection for modules
X * detect special T1/E1 WAN card and setup port selection
X * v1.11: fixed wrong checking of Tx errors
+ * v1.20: added check of return value kmalloc (cpet...@cs.washington.edu)
+ * added save original kmalloc addr for freeing (m...@solidum.com)
+ * added support for PCnetHome chip (j...@MIT.EDU)
+ * rewritten PCI card detection
+ * added dwio mode to get driver working on some PPC machines
+ * v1.21: added mii selection and mii ioctl
X */
X
X
@@ -140,202 +173,402 @@
X #define PKT_BUF_SZ 1544
X
X /* Offsets from base I/O address. */
-#define PCNET32_DATA 0x10
-#define PCNET32_ADDR 0x12
-#define PCNET32_RESET 0x14
-#define PCNET32_BUS_IF 0x16
-#define PCNET32_TOTAL_SIZE 0x18
+#define PCNET32_WIO_RDP 0x10
+#define PCNET32_WIO_RAP 0x12
+#define PCNET32_WIO_RESET 0x14
+#define PCNET32_WIO_BDP 0x16
+
+#define PCNET32_DWIO_RDP 0x10
+#define PCNET32_DWIO_RAP 0x14
+#define PCNET32_DWIO_RESET 0x18
+#define PCNET32_DWIO_BDP 0x1C
+
+#define PCNET32_TOTAL_SIZE 0x20
X
X #define CRC_POLYNOMIAL_LE 0xedb88320UL /* Ethernet CRC, little endian */
X
X /* The PCNET32 Rx and Tx ring descriptors. */
X struct pcnet32_rx_head {
- u32 base;
- s16 buf_length;
- s16 status;
- u32 msg_length;
- u32 reserved;
+ u32 base;
+ s16 buf_length;
+ s16 status;
+ u32 msg_length;
+ u32 reserved;
X };
X
X struct pcnet32_tx_head {
- u32 base;
- s16 length;
- s16 status;
- u32 misc;
- u32 reserved;
+ u32 base;
+ s16 length;
+ s16 status;
+ u32 misc;
+ u32 reserved;
X };
X
-
X /* The PCNET32 32-Bit initialization block, described in databook. */
X struct pcnet32_init_block {
- u16 mode;
- u16 tlen_rlen;
- u8 phys_addr[6];
- u16 reserved;
- u32 filter[2];
- /* Receive and transmit ring base, along with extra bits. */
- u32 rx_ring;
- u32 tx_ring;
+ u16 mode;
+ u16 tlen_rlen;
+ u8 phys_addr[6];
+ u16 reserved;
+ u32 filter[2];
+ /* Receive and transmit ring base, along with extra bits. */
+ u32 rx_ring;
+ u32 tx_ring;
+};
+
+/* PCnet32 access functions */
+struct pcnet32_access {
+ u16 (*read_csr)(unsigned long, int);
+ void (*write_csr)(unsigned long, int, u16);
+ u16 (*read_bcr)(unsigned long, int);
+ void (*write_bcr)(unsigned long, int, u16);
+ u16 (*read_rap)(unsigned long);
+ void (*write_rap)(unsigned long, u16);
+ void (*reset)(unsigned long);
X };
X
X struct pcnet32_private {
- /* The Tx and Rx ring entries must be aligned on 16-byte boundaries in 32bit mode. */
- struct pcnet32_rx_head rx_ring[RX_RING_SIZE];
- struct pcnet32_tx_head tx_ring[TX_RING_SIZE];
- struct pcnet32_init_block init_block;
- const char *name;
- /* The saved address of a sent-in-place packet/buffer, for skfree(). */
- struct sk_buff *tx_skbuff[TX_RING_SIZE];
- struct sk_buff *rx_skbuff[RX_RING_SIZE];
- int cur_rx, cur_tx; /* The next free ring entry */
- int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
- struct net_device_stats stats;
- char tx_full;
- int options;
- int shared_irq:1, /* shared irq possible */
- full_duplex:1; /* full duplex possible */
+ /* The Tx and Rx ring entries must be aligned on 16-byte boundaries in 32bit mode. */
+ struct pcnet32_rx_head rx_ring[RX_RING_SIZE];
+ struct pcnet32_tx_head tx_ring[TX_RING_SIZE];
+ struct pcnet32_init_block init_block;
+ const char *name;
+ /* The saved address of a sent-in-place packet/buffer, for skfree(). */
+ struct sk_buff *tx_skbuff[TX_RING_SIZE];
+ struct sk_buff *rx_skbuff[RX_RING_SIZE];
+ struct pcnet32_access a;
+ void *origmem;
+ int cur_rx, cur_tx; /* The next free ring entry */
+ int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
+ struct net_device_stats stats;
+ char tx_full;
+ int options;
+ int shared_irq:1, /* shared irq possible */
+ full_duplex:1, /* full duplex possible */
+ mii:1; /* mii port available */
X #ifdef MODULE
- struct device *next;
+ struct device *next;
X #endif
X };
X
-int pcnet32_probe(struct device *dev);
-static int pcnet32_probe1(struct device *dev, unsigned int ioaddr, unsigned char irq_line, int shared);
-static int pcnet32_open(struct device *dev);
-static int pcnet32_init_ring(struct device *dev);
-static int pcnet32_start_xmit(struct sk_buff *skb, struct device *dev);
-static int pcnet32_rx(struct device *dev);
-static void pcnet32_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-static int pcnet32_close(struct device *dev);
-static struct net_device_stats *pcnet32_get_stats(struct device *dev);
-static void pcnet32_set_multicast_list(struct device *dev);
+int pcnet32_probe(struct device *);
+static int pcnet32_probe1(struct device *, unsigned long, unsigned char, int, int);
+static int pcnet32_open(struct device *);
+static int pcnet32_init_ring(struct device *);
+static int pcnet32_start_xmit(struct sk_buff *, struct device *);
+static int pcnet32_rx(struct device *);
+static void pcnet32_interrupt(int, void *, struct pt_regs *);
+static int pcnet32_close(struct device *);
+static struct net_device_stats *pcnet32_get_stats(struct device *);
+static void pcnet32_set_multicast_list(struct device *);
+#ifdef HAVE_PRIVATE_IOCTL
+static int pcnet32_mii_ioctl(struct device *, struct ifreq *, int);
+#endif
+
+enum pci_flags_bit {
+ PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4,
+ PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3,
+};
+
+struct pcnet32_pci_id_info {
+ const char *name;
+ u16 vendor_id, device_id, device_id_mask, flags;
+ int io_size;
+ int (*probe1) (struct device *, unsigned long, unsigned char, int, int);
+};
+
+static struct pcnet32_pci_id_info pcnet32_tbl[] = {
+ { "AMD PCnetPCI series",
+ 0x1022, 0x2000, 0xfffe, PCI_USES_IO|PCI_USES_MASTER, PCNET32_TOTAL_SIZE,
+ pcnet32_probe1},
+ {0,}
+};
+
+static u16 pcnet32_wio_read_csr (unsigned long addr, int index)
+{
+ outw (index, addr+PCNET32_WIO_RAP);
+ return inw (addr+PCNET32_WIO_RDP);
+}
+
+static void pcnet32_wio_write_csr (unsigned long addr, int index, u16 val)
+{
+ outw (index, addr+PCNET32_WIO_RAP);
+ outw (val, addr+PCNET32_WIO_RDP);
+}
+
+static u16 pcnet32_wio_read_bcr (unsigned long addr, int index)
+{
+ outw (index, addr+PCNET32_WIO_RAP);
+ return inw (addr+PCNET32_WIO_BDP);
+}
+
+static void pcnet32_wio_write_bcr (unsigned long addr, int index, u16 val)
+{
+ outw (index, addr+PCNET32_WIO_RAP);
+ outw (val, addr+PCNET32_WIO_BDP);
+}
+
+static u16 pcnet32_wio_read_rap (unsigned long addr)
+{
+ return inw (addr+PCNET32_WIO_RAP);
+}
+
+static void pcnet32_wio_write_rap (unsigned long addr, u16 val)
+{
+ outw (val, addr+PCNET32_WIO_RAP);
+}
+
+static void pcnet32_wio_reset (unsigned long addr)
+{
+ inw (addr+PCNET32_WIO_RESET);
+}
+
+static int pcnet32_wio_check (unsigned long addr)
+{
+ outw (88, addr+PCNET32_WIO_RAP);
+ return (inw (addr+PCNET32_WIO_RAP) == 88);
+}
+
+static struct pcnet32_access pcnet32_wio = {
+ pcnet32_wio_read_csr,
+ pcnet32_wio_write_csr,
+ pcnet32_wio_read_bcr,
+ pcnet32_wio_write_bcr,
+ pcnet32_wio_read_rap,
+ pcnet32_wio_write_rap,
+ pcnet32_wio_reset
+};
+
+static u16 pcnet32_dwio_read_csr (unsigned long addr, int index)
+{
+ outl (index, addr+PCNET32_DWIO_RAP);
+ return (inl (addr+PCNET32_DWIO_RDP) & 0xffff);
+}
+
+static void pcnet32_dwio_write_csr (unsigned long addr, int index, u16 val)
+{
+ outl (index, addr+PCNET32_DWIO_RAP);
+ outl (val, addr+PCNET32_DWIO_RDP);
+}
+
+static u16 pcnet32_dwio_read_bcr (unsigned long addr, int index)
+{
+ outl (index, addr+PCNET32_DWIO_RAP);
+ return (inl (addr+PCNET32_DWIO_BDP) & 0xffff);
+}
+
+static void pcnet32_dwio_write_bcr (unsigned long addr, int index, u16 val)
+{
+ outl (index, addr+PCNET32_DWIO_RAP);
+ outl (val, addr+PCNET32_DWIO_BDP);
+}
+
+static u16 pcnet32_dwio_read_rap (unsigned long addr)
+{
+ return (inl (addr+PCNET32_DWIO_RAP) & 0xffff);
+}
+
+static void pcnet32_dwio_write_rap (unsigned long addr, u16 val)
+{
+ outl (val, addr+PCNET32_DWIO_RAP);
+}
+
+static void pcnet32_dwio_reset (unsigned long addr)
+{
+ inl (addr+PCNET32_DWIO_RESET);
+}
+
+static int pcnet32_dwio_check (unsigned long addr)
+{
+ outl (88, addr+PCNET32_DWIO_RAP);
+ return (inl (addr+PCNET32_DWIO_RAP) == 88);
+}
+
+static struct pcnet32_access pcnet32_dwio = {
+ pcnet32_dwio_read_csr,
+ pcnet32_dwio_write_csr,
+ pcnet32_dwio_read_bcr,
+ pcnet32_dwio_write_bcr,
+ pcnet32_dwio_read_rap,
+ pcnet32_dwio_write_rap,
+ pcnet32_dwio_reset
+
+};
X
X
X
-__initfunc(int pcnet32_probe (struct device *dev))
+int __init pcnet32_probe (struct device *dev)
X {
- unsigned int ioaddr = dev ? dev->base_addr: 0;
+ unsigned long ioaddr = dev ? dev->base_addr: 0;
X unsigned int irq_line = dev ? dev->irq : 0;
X int *port;
+ int cards_found = 0;
X
- if (ioaddr > 0x1ff)
- return pcnet32_probe1(dev, ioaddr, irq_line, 0);
- else if(ioaddr != 0)
- return ENXIO;
+
+#ifndef __powerpc__
+ if (ioaddr > 0x1ff) {
+ if (check_region(ioaddr, PCNET32_TOTAL_SIZE) == 0)
+ return pcnet32_probe1(dev, ioaddr, irq_line, 0, 0);
+ else
+ return ENODEV;
+ } else
+#endif
+ if(ioaddr != 0)
+ return ENXIO;
X
X #if defined(CONFIG_PCI)
X if (pci_present()) {
- struct pci_dev *pdev = NULL;
+ struct pci_dev *pdev;
+ unsigned char pci_bus, pci_device_fn;
+ int pci_index;
X
X printk("pcnet32.c: PCI bios is present, checking for devices...\n");
- while ((pdev = pci_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE, pdev))) {
- unsigned short pci_command;
+ for (pci_index = 0; pci_index < 0xff; pci_index++) {
+ u16 vendor, device, pci_command;
+ int chip_idx;
X
- irq_line = pdev->irq;
+ 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);
+
+ for (chip_idx = 0; pcnet32_tbl[chip_idx].vendor_id; chip_idx++)
+ if (vendor == pcnet32_tbl[chip_idx].vendor_id &&
+ (device & pcnet32_tbl[chip_idx].device_id_mask) == pcnet32_tbl[chip_idx].device_id)
+ break;
+ if (pcnet32_tbl[chip_idx].vendor_id == 0)
+ continue;
+
+ pdev = pci_find_slot(pci_bus, pci_device_fn);
X ioaddr = pdev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK;
+#if defined(ADDR_64BITS) && defined(__alpha__)
+ ioaddr |= ((long)pdev->base_address[1]) << 32;
+#endif
+ irq_line = pdev->irq;
+
+ /* Avoid already found cards from previous pcnet32_probe() calls */
+ if ((pcnet32_tbl[chip_idx].flags & PCI_USES_IO) &&
+ check_region(ioaddr, pcnet32_tbl[chip_idx].io_size))
+ continue;
+
X /* PCI Spec 2.1 states that it is either the driver or PCI card's
X * responsibility to set the PCI Master Enable Bit if needed.
X * (From Mark Stockton <ma...@schooner.sys.hou.compaq.com>)
X */
X pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
-
- /* Avoid already found cards from previous pcnet32_probe() calls */
- if (check_region(ioaddr, PCNET32_TOTAL_SIZE))
- continue;
-
X if ( ! (pci_command & PCI_COMMAND_MASTER)) {
X printk("PCI Master Bit has not been set. Setting...\n");
X pci_command |= PCI_COMMAND_MASTER|PCI_COMMAND_IO;
X pci_write_config_word(pdev, PCI_COMMAND, pci_command);
X }
+ printk("Found PCnet/PCI at %#lx, irq %d.\n", ioaddr, irq_line);
X
- printk("Found PCnet/PCI at %#x, irq %d.\n",
- ioaddr, irq_line);
-
- if (pcnet32_probe1(dev, ioaddr, irq_line, 1) != 0) { /* Shouldn't happen. */
- printk(KERN_ERR "pcnet32.c: Probe of PCI card at %#x failed.\n", ioaddr);
- break;
+ if (pcnet32_tbl[chip_idx].probe1(dev, ioaddr, irq_line, 1, cards_found) == 0) {
+ cards_found++;
+ dev = NULL;
X }
- return 0;
X }
X } else
X #endif /* defined(CONFIG_PCI) */
X
X /* now look for PCnet32 VLB cards */
X for (port = pcnet32_portlist; *port; port++) {
- unsigned int ioaddr = *port;
+ unsigned long ioaddr = *port;
X
X if ( check_region(ioaddr, PCNET32_TOTAL_SIZE) == 0) {
X /* check if there is really a pcnet chip on that ioaddr */
X if ((inb(ioaddr + 14) == 0x57) &&
X (inb(ioaddr + 15) == 0x57) &&
- (pcnet32_probe1(dev, ioaddr, 0, 0) == 0))
- return 0;
+ (pcnet32_probe1(dev, ioaddr, 0, 0, 0) == 0))
+ cards_found++;
X }
X }
- return ENODEV;
+ return cards_found ? 0: ENODEV;
X }
X
X
X /* pcnet32_probe1 */
-__initfunc(static int pcnet32_probe1(struct device *dev, unsigned int ioaddr, unsigned char irq_line, int shared))
+static int __init
+pcnet32_probe1(struct device *dev, unsigned long ioaddr, unsigned char irq_line, int shared, int card_idx)
X {
X struct pcnet32_private *lp;
- int i,full_duplex = 0;
+ int i,media,fdx = 0, mii = 0;
+ int chip_version;
X char *chipname;
+ char *priv;
+ struct pcnet32_access *a;
X
- inw(ioaddr+PCNET32_RESET); /* Reset the PCNET32 */
+ /* reset the chip */
+ pcnet32_dwio_reset(ioaddr);
+ pcnet32_wio_reset(ioaddr);
+
+ if (pcnet32_wio_read_csr (ioaddr, 0) == 4 && pcnet32_wio_check (ioaddr)) {
+ a = &pcnet32_wio;
+ } else {
+ if (pcnet32_dwio_read_csr (ioaddr, 0) == 4 && pcnet32_dwio_check(ioaddr)) {
+ a = &pcnet32_dwio;
+ } else
+ return ENODEV;
+ }
X
- outw(0x0000, ioaddr+PCNET32_ADDR); /* Switch to window 0 */
- if (inw(ioaddr+PCNET32_DATA) != 0x0004)
- return ENODEV;
-
- /* Get the version of the chip. */
- outw(88, ioaddr+PCNET32_ADDR);
- if (inw(ioaddr+PCNET32_ADDR) != 88) {
- /* should never happen */
+ chip_version = a->read_csr (ioaddr, 88) | (a->read_csr (ioaddr,89) << 16);
+ if (pcnet32_debug > 2)
+ printk(" PCnet chip version is %#x.\n", chip_version);
+ if ((chip_version & 0xfff) != 0x003)
X return ENODEV;
- } else { /* Good, it's a newer chip. */
- int chip_version = inw(ioaddr+PCNET32_DATA);
- outw(89, ioaddr+PCNET32_ADDR);
- chip_version |= inw(ioaddr+PCNET32_DATA) << 16;
+ chip_version = (chip_version >> 12) & 0xffff;
+ switch (chip_version) {
+ case 0x2420:
+ chipname = "PCnet/PCI 79C970";
+ break;
+ case 0x2430:
+ if (shared)
+ chipname = "PCnet/PCI 79C970"; /* 970 gives the wrong chip id back */
+ else
+ chipname = "PCnet/32 79C965";
+ break;
+ case 0x2621:
+ chipname = "PCnet/PCI II 79C970A";
+ fdx = 1;
+ break;
+ case 0x2623:
+ chipname = "PCnet/FAST 79C971";
+ fdx = 1; mii = 1;
+ break;
+ case 0x2624:
+ chipname = "PCnet/FAST+ 79C972";
+ fdx = 1; mii = 1;
+ break;
+ case 0x2626:
+ chipname = "PCnet/Home 79C978";
+ fdx = 1;
+ /*
+ * This is based on specs published at www.amd.com. This section
+ * assumes that a card with a 79C978 wants to go into 1Mb HomePNA
+ * mode. The 79C978 can also go into standard ethernet, and there
+ * probably should be some sort of module option to select the
+ * mode by which the card should operate
+ */
+ /* switch to home wiring mode */
+ media = a->read_bcr (ioaddr, 49);
X if (pcnet32_debug > 2)
- printk(" PCnet chip version is %#x.\n", chip_version);
- if ((chip_version & 0xfff) != 0x003)
- return ENODEV;
- chip_version = (chip_version >> 12) & 0xffff;
- switch (chip_version) {
- case 0x2420:
- chipname = "PCnet/PCI 79C970";
- break;
- case 0x2430:
- if (shared)
- chipname = "PCnet/PCI 79C970"; /* 970 gives the wrong chip id back */
- else
- chipname = "PCnet/32 79C965";
- break;
- case 0x2621:
- chipname = "PCnet/PCI II 79C970A";
- full_duplex = 1;
- break;
- case 0x2623:
- chipname = "PCnet/FAST 79C971";
- full_duplex = 1;
- break;
- case 0x2624:
- chipname = "PCnet/FAST+ 79C972";
- full_duplex = 1;
- break;
- default:
- printk("pcnet32: PCnet version %#x, no PCnet32 chip.\n",chip_version);
- return ENODEV;
- }
+ printk("pcnet32: pcnet32 media value %#x.\n", media);
+ media &= ~3;
+ media |= 1;
+ if (pcnet32_debug > 2)
+ printk("pcnet32: pcnet32 media reset to %#x.\n", media);
+ a->write_bcr (ioaddr, 49, media);
+ break;
+ default:
+ printk("pcnet32: PCnet version %#x, no PCnet32 chip.\n",chip_version);
+ return ENODEV;
X }
X
- if (dev == NULL)
- dev = init_etherdev(0, 0);
+ dev = init_etherdev(dev, 0);
X
- printk("%s: %s at %#3x,", dev->name, chipname, ioaddr);
+ printk(KERN_INFO "%s: %s at %#3lx,", dev->name, chipname, ioaddr);
X
X /* There is a 16 byte station address PROM at the base address.
X The first six bytes are the station address. */
@@ -345,15 +578,31 @@
X dev->base_addr = ioaddr;
X request_region(ioaddr, PCNET32_TOTAL_SIZE, chipname);
X
- /* Make certain the data structures used by the PCnet32 are 16byte aligned and DMAble. */
- lp = (struct pcnet32_private *) (((unsigned long)kmalloc(sizeof(*lp)+15, GFP_DMA | GFP_KERNEL)+15) & ~15);
+ if ((priv = kmalloc(sizeof(*lp)+15,GFP_KERNEL)) == NULL)
+ return ENOMEM;
+
+ /*
+ * Make certain the data structures used by
+ * the PCnet32 are 16byte aligned
+ */
+ lp = (struct pcnet32_private *)(((unsigned long)priv+15) & ~15);
X
X memset(lp, 0, sizeof(*lp));
X dev->priv = lp;
X lp->name = chipname;
X lp->shared_irq = shared;
- lp->full_duplex = full_duplex;
- lp->options = options;
+ lp->full_duplex = fdx;
+ lp->mii = mii;
+ if (options[card_idx] > sizeof (options_mapping))
+ lp->options = PORT_ASEL;
+ else
+ lp->options = options_mapping[options[card_idx]];
+
+ if (fdx && !(lp->options & PORT_ASEL) && full_duplex[card_idx])
+ lp->options |= PORT_FD;
+
+ lp->origmem = priv;
+ lp->a = *a;
X
X /* detect special T1/E1 WAN card by checking for MAC address */
X if (dev->dev_addr[0] == 0x00 && dev->dev_addr[1] == 0xe0 && dev->dev_addr[2] == 0x75)
@@ -369,24 +618,17 @@
X lp->init_block.tx_ring = (u32)le32_to_cpu(virt_to_bus(lp->tx_ring));
X
X /* switch pcnet32 to 32bit mode */
- outw(0x0014, ioaddr+PCNET32_ADDR);
- outw(0x0002, ioaddr+PCNET32_BUS_IF);
+ a->write_bcr (ioaddr, 20, 2);
X
- outw(0x0001, ioaddr+PCNET32_ADDR);
- inw(ioaddr+PCNET32_ADDR);
- outw(virt_to_bus(&lp->init_block) & 0xffff, ioaddr+PCNET32_DATA);
- outw(0x0002, ioaddr+PCNET32_ADDR);
- inw(ioaddr+PCNET32_ADDR);
- outw(virt_to_bus(&lp->init_block) >> 16, ioaddr+PCNET32_DATA);
- outw(0x0000, ioaddr+PCNET32_ADDR);
- inw(ioaddr+PCNET32_ADDR);
+ a->write_csr (ioaddr, 1, virt_to_bus(&lp->init_block) & 0xffff);
+ a->write_csr (ioaddr, 2, virt_to_bus(&lp->init_block) >> 16);
X
X if (irq_line) {
X dev->irq = irq_line;
X }
X
X if (dev->irq >= 2)
- printk(" assigned IRQ %d.\n", dev->irq);
+ printk(" assigned IRQ %d.\n", dev->irq);
X else {
X unsigned long irq_mask = probe_irq_on();
X
@@ -396,7 +638,7 @@
X * boards will work.
X */
X /* Trigger an initialization just for the interrupt. */
- outw(0x0041, ioaddr+PCNET32_DATA);
+ a->write_csr (ioaddr, 0, 0x41);
X mdelay (1);
X
X dev->irq = probe_irq_off (irq_mask);
@@ -409,7 +651,7 @@
X }
X
X if (pcnet32_debug > 0)
- printk(version);
+ printk(version);
X
X /* The PCNET32-specific entries in the device structure. */
X dev->open = &pcnet32_open;
@@ -417,6 +659,10 @@
X dev->stop = &pcnet32_close;
X dev->get_stats = &pcnet32_get_stats;
X dev->set_multicast_list = &pcnet32_set_multicast_list;
+#ifdef HAVE_PRIVATE_IOCTL
+ dev->do_ioctl = &pcnet32_mii_ioctl;
+#endif
+
X
X #ifdef MODULE
X lp->next = pcnet32_dev;
@@ -432,95 +678,96 @@
X static int
X pcnet32_open(struct device *dev)
X {
- struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
- unsigned int ioaddr = dev->base_addr;
- unsigned short val;
- int i;
-
- if (dev->irq == 0 ||
- request_irq(dev->irq, &pcnet32_interrupt,
- lp->shared_irq ? SA_SHIRQ : 0, lp->name, (void *)dev)) {
- return -EAGAIN;
- }
+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
+ unsigned long ioaddr = dev->base_addr;
+ u16 val;
+ int i;
+
+ if (dev->irq == 0 ||
+ request_irq(dev->irq, &pcnet32_interrupt,
+ lp->shared_irq ? SA_SHIRQ : 0, lp->name, (void *)dev)) {
+ return -EAGAIN;
+ }
X
- /* Reset the PCNET32 */
- inw(ioaddr+PCNET32_RESET);
+ /* Reset the PCNET32 */
+ lp->a.reset (ioaddr);
X
- /* switch pcnet32 to 32bit mode */
- outw(0x0014, ioaddr+PCNET32_ADDR);
- outw(0x0002, ioaddr+PCNET32_BUS_IF);
-
- if (pcnet32_debug > 1)
- printk("%s: pcnet32_open() irq %d tx/rx rings %#x/%#x init %#x.\n",
- dev->name, dev->irq,
- (u32) virt_to_bus(lp->tx_ring),
- (u32) virt_to_bus(lp->rx_ring),
- (u32) virt_to_bus(&lp->init_block));
-
- /* set/reset autoselect bit */
- outw(0x0002, ioaddr+PCNET32_ADDR);
- val = inw(ioaddr+PCNET32_BUS_IF) & ~2;
- if (lp->options & PORT_ASEL)
- val |= 2;
- outw(val, ioaddr+PCNET32_BUS_IF);
-
- /* handle full duplex setting */
- if (lp->full_duplex) {
- outw (0x0009, ioaddr+PCNET32_ADDR);
- val = inw(ioaddr+PCNET32_BUS_IF) & ~3;
- if (lp->options & PORT_FD) {
- val |= 1;
- if (lp->options == (PORT_FD | PORT_AUI))
- val |= 2;
- }
- outw(val, ioaddr+PCNET32_BUS_IF);
+ /* switch pcnet32 to 32bit mode */
+ lp->a.write_csr (ioaddr, 20, 2);
+
+ if (pcnet32_debug > 1)
+ printk("%s: pcnet32_open() irq %d tx/rx rings %#x/%#x init %#x.\n",
+ dev->name, dev->irq,
+ (u32) virt_to_bus(lp->tx_ring),
+ (u32) virt_to_bus(lp->rx_ring),
+ (u32) virt_to_bus(&lp->init_block));
+
+ /* set/reset autoselect bit */
+ val = lp->a.read_bcr (ioaddr, 2) & ~2;
+ if (lp->options & PORT_ASEL)
+ val |= 2;
+ lp->a.write_bcr (ioaddr, 2, val);
+
+ /* handle full duplex setting */
+ if (lp->full_duplex) {
+ val = lp->a.read_bcr (ioaddr, 9) & ~3;
+ if (lp->options & PORT_FD) {
+ val |= 1;
+ if (lp->options == (PORT_FD | PORT_AUI))
+ val |= 2;
X }
+ lp->a.write_bcr (ioaddr, 9, val);
+ }
X
- /* set/reset GPSI bit in test register */
- outw (0x007c, ioaddr+PCNET32_ADDR);
- val = inw(ioaddr+PCNET32_DATA) & ~0x10;
- if ((lp->options & PORT_PORTSEL) == PORT_GPSI)
- val |= 0x10;
- outw(val, ioaddr+PCNET32_DATA);
-
- lp->init_block.mode = le16_to_cpu((lp->options & PORT_PORTSEL) << 7);
- lp->init_block.filter[0] = 0x00000000;
- lp->init_block.filter[1] = 0x00000000;
- if (pcnet32_init_ring(dev))
- return -ENOMEM;
-
- /* Re-initialize the PCNET32, and start it when done. */
- outw(0x0001, ioaddr+PCNET32_ADDR);
- outw(virt_to_bus(&lp->init_block) &0xffff, ioaddr+PCNET32_DATA);
- outw(0x0002, ioaddr+PCNET32_ADDR);
- outw(virt_to_bus(&lp->init_block) >> 16, ioaddr+PCNET32_DATA);
-
- outw(0x0004, ioaddr+PCNET32_ADDR);
- outw(0x0915, ioaddr+PCNET32_DATA);
-
- outw(0x0000, ioaddr+PCNET32_ADDR);
- outw(0x0001, ioaddr+PCNET32_DATA);
-
- dev->tbusy = 0;
- dev->interrupt = 0;
- dev->start = 1;
- i = 0;
- while (i++ < 100)
- if (inw(ioaddr+PCNET32_DATA) & 0x0100)
- break;
- /*
- * We used to clear the InitDone bit, 0x0100, here but Mark Stockton
- * reports that doing so triggers a bug in the '974.
- */
- outw(0x0042, ioaddr+PCNET32_DATA);
-
- if (pcnet32_debug > 2)
- printk("%s: PCNET32 open after %d ticks, init block %#x csr0 %4.4x.\n",
- dev->name, i, (u32) virt_to_bus(&lp->init_block), inw(ioaddr+PCNET32_DATA));
+ /* set/reset GPSI bit in test register */
+ val = lp->a.read_csr (ioaddr, 124) & ~0x10;
+ if ((lp->options & PORT_PORTSEL) == PORT_GPSI)
+ val |= 0x10;
+ lp->a.write_csr (ioaddr, 124, val);
+
+ if (lp->mii & (lp->options & PORT_ASEL)) {
+ val = lp->a.read_bcr (ioaddr, 32) & ~0x38; /* disable Auto Negotiation, set 10Mpbs, HD */
+ if (lp->options & PORT_FD)
+ val |= 0x10;
+ if (lp->options & PORT_100)
+ val |= 0x08;
+ lp->a.write_bcr (ioaddr, 32, val);
+ }
+
+ lp->init_block.mode = le16_to_cpu((lp->options & PORT_PORTSEL) << 7);
+ lp->init_block.filter[0] = 0x00000000;
+ lp->init_block.filter[1] = 0x00000000;
+ if (pcnet32_init_ring(dev))
+ return -ENOMEM;
+
+ /* Re-initialize the PCNET32, and start it when done. */
+ lp->a.write_csr (ioaddr, 1, virt_to_bus(&lp->init_block) &0xffff);
+ lp->a.write_csr (ioaddr, 2, virt_to_bus(&lp->init_block) >> 16);
+
+ lp->a.write_csr (ioaddr, 4, 0x0915);
+ lp->a.write_csr (ioaddr, 0, 0x0001);
+
+ dev->tbusy = 0;
+ dev->interrupt = 0;
+ dev->start = 1;
+ i = 0;
+ while (i++ < 100)
+ if (lp->a.read_csr (ioaddr, 0) & 0x0100)
+ break;
+ /*
+ * We used to clear the InitDone bit, 0x0100, here but Mark Stockton
+ * reports that doing so triggers a bug in the '974.
+ */
+ lp->a.write_csr (ioaddr, 0, 0x0042);
+
+ if (pcnet32_debug > 2)
+ printk("%s: PCNET32 open after %d ticks, init block %#x csr0 %4.4x.\n",
+ dev->name, i, (u32) virt_to_bus(&lp->init_block),
+ lp->a.read_csr (ioaddr, 0));
X
- MOD_INC_USE_COUNT;
+ MOD_INC_USE_COUNT;
X
- return 0; /* Always succeed */
+ return 0; /* Always succeed */
X }
X
X /*
@@ -539,15 +786,15 @@
X static void
X pcnet32_purge_tx_ring(struct device *dev)
X {
- struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
- int i;
+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
+ int i;
X
- for (i = 0; i < TX_RING_SIZE; i++) {
- if (lp->tx_skbuff[i]) {
- dev_kfree_skb(lp->tx_skbuff[i]);
- lp->tx_skbuff[i] = NULL;
- }
+ for (i = 0; i < TX_RING_SIZE; i++) {
+ if (lp->tx_skbuff[i]) {
+ dev_kfree_skb(lp->tx_skbuff[i]);
+ lp->tx_skbuff[i] = NULL;
X }
+ }
X }
X
X
@@ -555,445 +802,437 @@
X static int
X pcnet32_init_ring(struct device *dev)
X {
- struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
- int i;
+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
+ int i;
X
- lp->tx_full = 0;
- lp->cur_rx = lp->cur_tx = 0;
- lp->dirty_rx = lp->dirty_tx = 0;
-
- for (i = 0; i < RX_RING_SIZE; i++) {
- if (lp->rx_skbuff[i] == NULL) {
- if (!(lp->rx_skbuff[i] = dev_alloc_skb (PKT_BUF_SZ))) {
- /* there is not much, we can do at this point */
- printk ("%s: pcnet32_init_ring dev_alloc_skb failed.\n",dev->name);
- return -1;
- }
- skb_reserve (lp->rx_skbuff[i], 2);
+ lp->tx_full = 0;
+ lp->cur_rx = lp->cur_tx = 0;
+ lp->dirty_rx = lp->dirty_tx = 0;
+
+ for (i = 0; i < RX_RING_SIZE; i++) {
+ if (lp->rx_skbuff[i] == NULL) {
+ if (!(lp->rx_skbuff[i] = dev_alloc_skb (PKT_BUF_SZ))) {
+ /* there is not much, we can do at this point */
+ printk ("%s: pcnet32_init_ring dev_alloc_skb failed.\n",dev->name);
+ return -1;
X }
- lp->rx_ring[i].base = (u32)le32_to_cpu(virt_to_bus(lp->rx_skbuff[i]->tail));
- lp->rx_ring[i].buf_length = le16_to_cpu(-PKT_BUF_SZ);
- lp->rx_ring[i].status = le16_to_cpu(0x8000);
- }
- /* The Tx buffer address is filled in as needed, but we do need to clear
- the upper ownership bit. */
- for (i = 0; i < TX_RING_SIZE; i++) {
- lp->tx_ring[i].base = 0;
- lp->tx_ring[i].status = 0;
+ skb_reserve (lp->rx_skbuff[i], 2);
X }
+ lp->rx_ring[i].base = (u32)le32_to_cpu(virt_to_bus(lp->rx_skbuff[i]->tail));
+ lp->rx_ring[i].buf_length = le16_to_cpu(-PKT_BUF_SZ);
+ lp->rx_ring[i].status = le16_to_cpu(0x8000);
+ }
+ /* The Tx buffer address is filled in as needed, but we do need to clear
+ the upper ownership bit. */
+ for (i = 0; i < TX_RING_SIZE; i++) {
+ lp->tx_ring[i].base = 0;
+ lp->tx_ring[i].status = 0;
+ }
X
- lp->init_block.tlen_rlen = TX_RING_LEN_BITS | RX_RING_LEN_BITS;
- for (i = 0; i < 6; i++)
- lp->init_block.phys_addr[i] = dev->dev_addr[i];
- lp->init_block.rx_ring = (u32)le32_to_cpu(virt_to_bus(lp->rx_ring));
- lp->init_block.tx_ring = (u32)le32_to_cpu(virt_to_bus(lp->tx_ring));
- return 0;
+ lp->init_block.tlen_rlen = TX_RING_LEN_BITS | RX_RING_LEN_BITS;
+ for (i = 0; i < 6; i++)
+ lp->init_block.phys_addr[i] = dev->dev_addr[i];
+ lp->init_block.rx_ring = (u32)le32_to_cpu(virt_to_bus(lp->rx_ring));
+ lp->init_block.tx_ring = (u32)le32_to_cpu(virt_to_bus(lp->tx_ring));
+ return 0;


X }
X
X static void

X pcnet32_restart(struct device *dev, unsigned int csr0_bits)
X {
- int i;
- unsigned int ioaddr = dev->base_addr;
+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
+ unsigned long ioaddr = dev->base_addr;
+ int i;
X
- pcnet32_purge_tx_ring(dev);
- if (pcnet32_init_ring(dev))
- return;
-
- outw(0x0000, ioaddr + PCNET32_ADDR);
- /* ReInit Ring */
- outw(0x0001, ioaddr + PCNET32_DATA);
- i = 0;
- while (i++ < 100)
- if (inw(ioaddr+PCNET32_DATA) & 0x0100)
- break;
+ pcnet32_purge_tx_ring(dev);
+ if (pcnet32_init_ring(dev))
+ return;
+
+ /* ReInit Ring */
+ lp->a.write_csr (ioaddr, 0, 1);
+ i = 0;
+ while (i++ < 100)
+ if (lp->a.read_csr (ioaddr, 0) & 0x0100)
+ break;
X
- outw(csr0_bits, ioaddr + PCNET32_DATA);
+ lp->a.write_csr (ioaddr, 0, csr0_bits);
X }
X
X static int
X pcnet32_start_xmit(struct sk_buff *skb, struct device *dev)
X {
- struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
- unsigned int ioaddr = dev->base_addr;
- int entry;
- unsigned long flags;
-
- /* Transmitter timeout, serious problems. */
- if (dev->tbusy) {
- int tickssofar = jiffies - dev->trans_start;
- if (tickssofar < HZ/2)
- return 1;
- outw(0, ioaddr+PCNET32_ADDR);
- printk("%s: transmit timed out, status %4.4x, resetting.\n",
- dev->name, inw(ioaddr+PCNET32_DATA));
- outw(0x0004, ioaddr+PCNET32_DATA);
- lp->stats.tx_errors++;
- if (pcnet32_debug > 2) {
- int i;
- printk(" Ring data dump: dirty_tx %d cur_tx %d%s cur_rx %d.",
- lp->dirty_tx, lp->cur_tx, lp->tx_full ? " (full)" : "",
- lp->cur_rx);
- for (i = 0 ; i < RX_RING_SIZE; i++)
- printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ",
- lp->rx_ring[i].base, -lp->rx_ring[i].buf_length,
- lp->rx_ring[i].msg_length, (unsigned)lp->rx_ring[i].status);
- for (i = 0 ; i < TX_RING_SIZE; i++)
- printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ",
- lp->tx_ring[i].base, -lp->tx_ring[i].length,
- lp->tx_ring[i].misc, (unsigned)lp->tx_ring[i].status);
- printk("\n");
- }
- pcnet32_restart(dev, 0x0042);
-
- dev->tbusy = 0;
- dev->trans_start = jiffies;
- dev_kfree_skb(skb);
- return 0;
+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
+ unsigned int ioaddr = dev->base_addr;
+ int entry;
+ unsigned long flags;
+
+ /* Transmitter timeout, serious problems. */
+ if (dev->tbusy) {
+ int tickssofar = jiffies - dev->trans_start;
+ if (tickssofar < HZ/2)
+ return 1;
+ printk("%s: transmit timed out, status %4.4x, resetting.\n",
+ dev->name, lp->a.read_csr (ioaddr, 0));
+ lp->a.write_csr (ioaddr, 0, 0x0004);
+ lp->stats.tx_errors++;
+ if (pcnet32_debug > 2) {
+ int i;
+ printk(" Ring data dump: dirty_tx %d cur_tx %d%s cur_rx %d.",
+ lp->dirty_tx, lp->cur_tx, lp->tx_full ? " (full)" : "",
+ lp->cur_rx);
+ for (i = 0 ; i < RX_RING_SIZE; i++)
+ printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ",
+ lp->rx_ring[i].base, -lp->rx_ring[i].buf_length,
+ lp->rx_ring[i].msg_length, (unsigned)lp->rx_ring[i].status);
+ for (i = 0 ; i < TX_RING_SIZE; i++)
+ printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ",
+ lp->tx_ring[i].base, -lp->tx_ring[i].length,
+ lp->tx_ring[i].misc, (unsigned)lp->tx_ring[i].status);


+ printk("\n");
X }

+ pcnet32_restart(dev, 0x0042);
X
- if (pcnet32_debug > 3) {
- outw(0x0000, ioaddr+PCNET32_ADDR);
- printk("%s: pcnet32_start_xmit() called, csr0 %4.4x.\n", dev->name,
- inw(ioaddr+PCNET32_DATA));
- }
+ dev->tbusy = 0;
+ dev->trans_start = jiffies;
+ dev_kfree_skb(skb);
+ return 0;
+ }
X
- /* 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 (pcnet32_debug > 3) {
+ printk("%s: pcnet32_start_xmit() called, csr0 %4.4x.\n",
+ dev->name, lp->a.read_csr (ioaddr, 0));
+ }
X
- save_flags (flags);
- cli ();
+ /* 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;
+ }
X
- /* Fill in a Tx ring entry */
+ save_flags (flags);
+ cli ();
X
- /* Mask to ring buffer boundary. */
- entry = lp->cur_tx & TX_RING_MOD_MASK;
+ /* Fill in a Tx ring entry */
X
- /* Caution: the write order is important here, set the base address
- with the "ownership" bits last. */
+ /* Mask to ring buffer boundary. */
+ entry = lp->cur_tx & TX_RING_MOD_MASK;
X
- lp->tx_ring[entry].length = le16_to_cpu(-skb->len);
+ /* Caution: the write order is important here, set the base address
+ with the "ownership" bits last. */
X
- lp->tx_ring[entry].misc = 0x00000000;
+ lp->tx_ring[entry].length = le16_to_cpu(-skb->len);
X
- lp->tx_skbuff[entry] = skb;
- lp->tx_ring[entry].base = (u32)le32_to_cpu(virt_to_bus(skb->data));
- lp->tx_ring[entry].status = le16_to_cpu(0x8300);
+ lp->tx_ring[entry].misc = 0x00000000;
X
- lp->cur_tx++;
- lp->stats.tx_bytes += skb->len;
+ lp->tx_skbuff[entry] = skb;
+ lp->tx_ring[entry].base = (u32)le32_to_cpu(virt_to_bus(skb->data));


SHAR_EOF
true || echo 'restore of patch-2.2.7 failed'
fi

echo 'End of part 04'
echo 'File patch-2.2.7 is continued in part 05'
echo 05 > _shar_seq_.tmp
exit 0

Thomas...@ciw.uni-karlsruhe.de

unread,
May 1, 1999, 3:00:00 AM5/1/99
to
Archive-name: v2.2/patch-2.2.7/part03

#!/bin/sh
# this is part 03 of a 22 - part archive


# do not concatenate these parts, unpack them in order with /bin/sh
# file patch-2.2.7 continued
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck

if test "$Scheck" != 03; then


echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping patch-2.2.7'
else
echo 'x - continuing with patch-2.2.7'
sed 's/^X//' << 'SHAR_EOF' >> 'patch-2.2.7' &&

+ I2CWrite(bus, I2C_TEA6300, TEA6300_BA, 0x07, 1); /* bass 0dB */
+ I2CWrite(bus, I2C_TEA6300, TEA6300_TR, 0x07, 1); /* treble 0dB */
+ I2CWrite(bus, I2C_TEA6300, TEA6300_FA, 0x0f, 1); /* fader off */
+ I2CWrite(bus, I2C_TEA6300, TEA6300_SW, 0x01, 1); /* mute off input A */
+}
+
X static void init_tda8425(struct i2c_bus *bus)
X {
X I2CWrite(bus, I2C_TDA8425, TDA8425_VL, 0xFC, 1); /* volume left 0dB */
@@ -2978,6 +2988,14 @@
X break;
X }
X
+ if (I2CRead(&(btv->i2c), I2C_TEA6300) >=0)
+ {
+ printk(KERN_INFO "bttv%d: fader chip: TEA6300\n",btv->nr);
+ btv->audio_chip = TEA6300;
+ init_tea6300(&(btv->i2c));
+ } else
+ printk(KERN_INFO "bttv%d: NO fader chip: TEA6300\n",btv->nr);
+
X printk(KERN_INFO "bttv%d: model: ",btv->nr);
X
X sprintf(btv->video_dev.name,"BT%d",btv->id);
diff -u --recursive --new-file v2.2.6/linux/drivers/char/bttv.h linux/drivers/char/bttv.h
--- v2.2.6/linux/drivers/char/bttv.h Fri Apr 16 14:47:30 1999
+++ linux/drivers/char/bttv.h Sat Apr 24 17:49:37 1999
@@ -114,6 +114,7 @@
X int type; /* card type */
X int audio; /* audio mode */
X int audio_chip;
+ int fader_chip;
X int radio;
X
X u32 *risc_jmp;
@@ -222,6 +223,7 @@
X #define TDA9850 0x01
X #define TDA8425 0x02
X #define TDA9840 0x03
+#define TEA6300 0x04
X
X #define I2C_TSA5522 0xc2
X #define I2C_TDA9840 0x84
@@ -230,6 +232,7 @@
X #define I2C_HAUPEE 0xa0
X #define I2C_STBEE 0xae
X #define I2C_VHX 0xc0
+#define I2C_TEA6300 0x80
X
X #define TDA9840_SW 0x00
X #define TDA9840_LVADJ 0x02
@@ -249,6 +252,12 @@
X #define TDA8425_BA 0x02
X #define TDA8425_TR 0x03
X #define TDA8425_S1 0x08
-
+
+#define TEA6300_VL 0x00 /* volume control left */
+#define TEA6300_VR 0x01 /* volume control right */
+#define TEA6300_BA 0x02 /* bass control */
+#define TEA6300_TR 0x03 /* treble control */
+#define TEA6300_FA 0x04 /* fader control */
+#define TEA6300_SW 0x05 /* mute and source switch */
X
X #endif
diff -u --recursive --new-file v2.2.6/linux/drivers/char/dn_keyb.c linux/drivers/char/dn_keyb.c
--- v2.2.6/linux/drivers/char/dn_keyb.c Wed Aug 26 11:37:36 1998
+++ linux/drivers/char/dn_keyb.c Mon Apr 26 13:28:07 1999
@@ -414,9 +414,9 @@
X }
X else if((scancode & (~BREAK_FLAG)) == DNKEY_CAPS) {
X /* printk("handle_scancode: %02x\n",DNKEY_CAPS); */
- handle_scancode(DNKEY_CAPS);
+ handle_scancode(DNKEY_CAPS, 1);
X /* printk("handle_scancode: %02x\n",BREAK_FLAG | DNKEY_CAPS); */
- handle_scancode(BREAK_FLAG | DNKEY_CAPS);
+ handle_scancode(DNKEY_CAPS, 0);
X }
X else if( (scancode == DNKEY_REPEAT) && (prev_scancode < 0x7e) &&
X !(prev_scancode==DNKEY_CTRL || prev_scancode==DNKEY_LSHIFT ||
@@ -424,13 +424,13 @@
X prev_scancode==DNKEY_LALT || prev_scancode==DNKEY_RALT)) {
X if(jiffies-lastkeypress > DNKEY_REPEAT_DELAY) {
X /* printk("handle_scancode: %02x\n",prev_scancode); */
- handle_scancode(prev_scancode);
+ handle_scancode(prev_scancode, 1);
X }
X lastscancode=prev_scancode;
X }
X else {
X /* printk("handle_scancode: %02x\n",scancode); */
- handle_scancode(scancode);
+ handle_scancode(scancode & ~BREAK_FLAG, !(scancode & BREAK_FLAG));
X lastkeypress=jiffies;
X }
X }
diff -u --recursive --new-file v2.2.6/linux/drivers/char/keyboard.c linux/drivers/char/keyboard.c
--- v2.2.6/linux/drivers/char/keyboard.c Fri Jan 8 22:36:05 1999
+++ linux/drivers/char/keyboard.c Mon Apr 26 13:21:42 1999
@@ -24,6 +24,7 @@


X */
X
X #include <linux/config.h>

+#include <linux/module.h>
X #include <linux/sched.h>
X #include <linux/tty.h>
X #include <linux/tty_flip.h>
@@ -59,6 +60,8 @@
X #define KBD_DEFLOCK 0
X #endif
X
+EXPORT_SYMBOL(handle_scancode);
+
X extern void ctrl_alt_del(void);
X
X struct wait_queue * keypress_wait = NULL;
@@ -190,15 +193,15 @@
X return kbd_getkeycode(scancode);
X }
X
-void handle_scancode(unsigned char scancode)
+void handle_scancode(unsigned char scancode, int down)
X {
X unsigned char keycode;
- char up_flag; /* 0 or 0200 */
+ char up_flag = down ? 0 : 0200;
X char raw_mode;
X
X do_poke_blanked_console = 1;
X mark_bh(CONSOLE_BH);
- add_keyboard_randomness(scancode);
+ add_keyboard_randomness(scancode | up_flag);
X
X tty = ttytab? ttytab[fg_console]: NULL;
X if (tty && (!tty->driver_data)) {
@@ -213,20 +216,15 @@
X }
X kbd = kbd_table + fg_console;
X if ((raw_mode = (kbd->kbdmode == VC_RAW))) {
- put_queue(scancode);
+ put_queue(scancode | up_flag);
X /* we do not return yet, because we want to maintain
X the key_down array, so that we have the correct
X values when finishing RAW mode or when changing VT's */
- }
+ }
X
- if (!kbd_pretranslate(scancode, raw_mode))
- return;
- /*
+ /*
X * Convert scancode to keycode
- */
- up_flag = (scancode & 0200);
- scancode &= 0x7f;
-
+ */
X if (!kbd_translate(scancode, &keycode, raw_mode))
X return;
X
@@ -239,10 +237,10 @@
X
X if (up_flag) {
X rep = 0;
- if(!test_and_clear_bit(keycode, key_down))
+ if(!test_and_clear_bit(keycode, key_down))
X up_flag = kbd_unexpected_up(keycode);
X } else
- rep = test_and_set_bit(keycode, key_down);
+ rep = test_and_set_bit(keycode, key_down);
X
X #ifdef CONFIG_MAGIC_SYSRQ /* Handle the SysRq Hack */
X if (keycode == SYSRQ_KEY) {
@@ -257,11 +255,11 @@
X
X if (kbd->kbdmode == VC_MEDIUMRAW) {
X /* soon keycodes will require more than one byte */
- put_queue(keycode + up_flag);
+ put_queue(keycode + up_flag);
X raw_mode = 1; /* Most key classes will be ignored */
- }
+ }
X
- /*
+ /*
X * Small change in philosophy: earlier we defined repetition by
X * rep = keycode == prev_keycode;
X * prev_keycode = keycode;
@@ -270,9 +268,9 @@
X */
X
X /*
- * Repeat a key only if the input buffers are empty or the
- * characters get echoed locally. This makes key repeat usable
- * with slow applications and under heavy loads.
+ * Repeat a key only if the input buffers are empty or the
+ * characters get echoed locally. This makes key repeat usable
+ * with slow applications and under heavy loads.
X */
X if (!rep ||
X (vc_kbd_mode(kbd,VC_REPEAT) && tty &&
diff -u --recursive --new-file v2.2.6/linux/drivers/char/mem.c linux/drivers/char/mem.c
--- v2.2.6/linux/drivers/char/mem.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/char/mem.c Mon Apr 26 12:55:29 1999
@@ -51,6 +51,12 @@
X #if defined(CONFIG_PPC) || defined(CONFIG_MAC)
X extern void adbdev_init(void);
X #endif
+#ifdef CONFIG_USB_UHCI
+int uhci_init(void);
+#endif
+#ifdef CONFIG_USB_OHCI
+int ohci_init(void);
+#endif
X
X static ssize_t do_write_mem(struct file * file, void *p, unsigned long realp,
X const char * buf, size_t count, loff_t *ppos)
@@ -599,6 +605,12 @@
X if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
X printk("unable to get major %d for memory devs\n", MEM_MAJOR);
X rand_initialize();
+#ifdef CONFIG_USB_UHCI
+ uhci_init();
+#endif
+#ifdef CONFIG_USB_OHCI
+ ohci_init();
+#endif
X #if defined (CONFIG_FB)
X fbmem_init();
X #endif
diff -u --recursive --new-file v2.2.6/linux/drivers/char/n_tty.c linux/drivers/char/n_tty.c
--- v2.2.6/linux/drivers/char/n_tty.c Tue Jan 19 11:32:51 1999
+++ linux/drivers/char/n_tty.c Sat Apr 24 17:49:37 1999
@@ -922,8 +922,14 @@
X }
X }
X
- if (down_interruptible(&tty->atomic_read))
- return -ERESTARTSYS;
+ if (file->f_flags & O_NONBLOCK) {
+ if (down_trylock(&tty->atomic_read))
+ return -EAGAIN;
+ }
+ else {
+ if (down_interruptible(&tty->atomic_read))
+ return -ERESTARTSYS;
+ }
X
X add_wait_queue(&tty->read_wait, &wait);
X set_bit(TTY_DONT_FLIP, &tty->flags);
diff -u --recursive --new-file v2.2.6/linux/drivers/char/pc_keyb.c linux/drivers/char/pc_keyb.c
--- v2.2.6/linux/drivers/char/pc_keyb.c Tue Feb 23 15:21:33 1999
+++ linux/drivers/char/pc_keyb.c Mon Apr 26 13:43:01 1999
@@ -240,8 +240,6 @@
X 0, 0, 0, 0, 0, 0, 0, 0 /* 0x78-0x7f */
X };
X
-static unsigned int prev_scancode = 0; /* remember E0, E1 */
-
X int pckbd_setkeycode(unsigned int scancode, unsigned int keycode)
X {
X if (scancode < SC_LIM || scancode > 255 || keycode > 127)
@@ -284,41 +282,28 @@
X scancode);
X #endif
X }
- if (scancode == 0) {
-#ifdef KBD_REPORT_ERR
- printk(KERN_INFO "Keyboard buffer overflow\n");
-#endif
- prev_scancode = 0;
- return 0;
- }
X return 1;
X }
X
-int pckbd_pretranslate(unsigned char scancode, char raw_mode)
+int pckbd_translate(unsigned char scancode, unsigned char *keycode,
+ char raw_mode)
X {
- if (scancode == 0xff) {
- /* in scancode mode 1, my ESC key generates 0xff */
- /* the calculator keys on a FOCUS 9000 generate 0xff */
-#ifndef KBD_IS_FOCUS_9000
-#ifdef KBD_REPORT_ERR
- if (!raw_mode)
- printk(KERN_DEBUG "Keyboard error\n");
-#endif
-#endif
- prev_scancode = 0;
- return 0;
- }
+ static int prev_scancode = 0;
X
+ /* special prefix scancodes.. */
X if (scancode == 0xe0 || scancode == 0xe1) {
X prev_scancode = scancode;
X return 0;


- }
- return 1;
-}

+ }
+
+ /* 0xFF is sent by a few keyboards, ignore it. 0x00 is error */
+ if (scancode == 0x00 || scancode == 0xff) {
+ prev_scancode = 0;


+ return 0;
+ }
+

+ scancode &= 0x7f;
X
-int pckbd_translate(unsigned char scancode, unsigned char *keycode,
- char raw_mode)
-{
X if (prev_scancode) {
X /*
X * usually it will be 0xe0, but a Pause key generates
@@ -452,7 +437,7 @@
X handle_mouse_event(scancode);
X } else {
X if (do_acknowledge(scancode))
- handle_scancode(scancode);
+ handle_scancode(scancode, !(scancode & 0x80));
X mark_bh(KEYBOARD_BH);
X }
X
diff -u --recursive --new-file v2.2.6/linux/drivers/char/radio-sf16fmi.c linux/drivers/char/radio-sf16fmi.c
--- v2.2.6/linux/drivers/char/radio-sf16fmi.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/char/radio-sf16fmi.c Sat Apr 24 17:49:37 1999
@@ -4,6 +4,7 @@
X * (c) 1998 Petr Vandrovec, vand...@vc.cvut.cz
X *
X * Fitted to new interface by Alan Cox <alan...@linux.org>
+ * Made working and cleaned up functions <mikael...@irf.se>
X *
X * Notes on the hardware
X *
@@ -74,9 +75,10 @@
X outb(0x08, port);
X }
X
-static inline int fmi_setfreq(struct fmi_device *dev, unsigned long freq)
+static inline int fmi_setfreq(struct fmi_device *dev)
X {
X int myport = dev->port;
+ unsigned long freq = dev->curfreq;
X int i;
X
X outbits(16, RSF16_ENCODE(freq), myport);
@@ -158,7 +160,6 @@
X v.flags=fmi->flags;
X v.mode=VIDEO_MODE_AUTO;
X v.signal = fmi_getsigstr(fmi);
- strcpy(v.name, "FM");
X if(copy_to_user(arg,&v, sizeof(v)))
X return -EFAULT;
X return 0;
@@ -192,8 +193,10 @@
X tmp *= 1000;
X if ( tmp<RSF16_MINFREQ || tmp>RSF16_MAXFREQ )
X return -EINVAL;
- fmi->curfreq = tmp;
- fmi_setfreq(fmi, fmi->curfreq);
+ /*rounding in steps of 800 to match th freq
+ that will be used */
+ fmi->curfreq = (tmp/800)*800;
+ fmi_setfreq(fmi);
X return 0;
X }
X case VIDIOCGAUDIO:
@@ -205,7 +208,7 @@
X v.treble=0;
X v.flags=( (!fmi->curvol)*VIDEO_AUDIO_MUTE | VIDEO_AUDIO_MUTABLE);
X strcpy(v.name, "Radio");
- v.mode=VIDEO_SOUND_MONO;
+ v.mode=VIDEO_SOUND_STEREO;
X v.balance=0;
X v.step=0; /* No volume, just (un)mute */
X if(copy_to_user(arg,&v, sizeof(v)))
diff -u --recursive --new-file v2.2.6/linux/drivers/char/radio-typhoon.c linux/drivers/char/radio-typhoon.c
--- v2.2.6/linux/drivers/char/radio-typhoon.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/char/radio-typhoon.c Sat Apr 24 17:49:37 1999
@@ -196,7 +196,7 @@
X v.flags = VIDEO_TUNER_LOW;
X v.mode = VIDEO_MODE_AUTO;
X v.signal = 0xFFFF; /* We can't get the signal strength */
- strcpy(v.tuner, "FM");
+ strcpy(v.name, "FM");
X if (copy_to_user(arg, &v, sizeof(v)))
X return -EFAULT;
X return 0;
diff -u --recursive --new-file v2.2.6/linux/drivers/char/softdog.c linux/drivers/char/softdog.c
--- v2.2.6/linux/drivers/char/softdog.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/char/softdog.c Sat Apr 24 17:49:37 1999
@@ -132,7 +132,6 @@
X static int softdog_ioctl(struct inode *inode, struct file *file,
X unsigned int cmd, unsigned long arg)
X {
- int i;
X static struct watchdog_info ident=
X {
X 0,
diff -u --recursive --new-file v2.2.6/linux/drivers/macintosh/mac_keyb.c linux/drivers/macintosh/mac_keyb.c
--- v2.2.6/linux/drivers/macintosh/mac_keyb.c Tue Mar 23 14:35:47 1999
+++ linux/drivers/macintosh/mac_keyb.c Mon Apr 26 13:31:31 1999
@@ -194,7 +194,7 @@


X extern struct kbd_struct kbd_table[];

X extern struct wait_queue * keypress_wait;
X

-extern void handle_scancode(unsigned char);
+extern void handle_scancode(unsigned char, int);
X

X static struct adb_ids keyboard_ids;
X static struct adb_ids mouse_ids;
@@ -234,11 +234,6 @@
X return -EINVAL;
X }
X
-int mackbd_pretranslate(unsigned char scancode, char raw_mode)


-{
- return 1;
-}
-

X int mackbd_translate(unsigned char keycode, unsigned char *keycodep,
X char raw_mode)
X {
@@ -338,8 +333,8 @@
X switch (keycode) {
X /*case 0xb9:*/
X case 0x39:
- handle_scancode(0x39);
- handle_scancode(0xb9);
+ handle_scancode(0x39, 1);
+ handle_scancode(0x39, 0);
X mark_bh(KEYBOARD_BH);
X return;
X case 0x47:
@@ -349,7 +344,7 @@


X }
X }
X
- handle_scancode(keycode + up_flag);

+ handle_scancode(keycode, !up_flag);
X }
X

X static void
diff -u --recursive --new-file v2.2.6/linux/drivers/net/3c523.c linux/drivers/net/3c523.c
--- v2.2.6/linux/drivers/net/3c523.c Tue Jan 19 11:32:51 1999
+++ linux/drivers/net/3c523.c Sat Apr 24 17:49:37 1999
@@ -62,8 +62,8 @@
X search the MCA slots until it finds a 3c523 with the specified
X parameters.
X
- This driver should support multiple ethernet cards, but I can't test
- that. If someone would I'd greatly appreciate it.
+ This driver does support multiple ethernet cards when used as a module
+ (up to MAX_3C523_CARDS, the default being 4)
X
X This has been tested with both BNC and TP versions, internal and
X external transceivers. Haven't tested with the 64K version (that I
@@ -76,7 +76,12 @@
X update to 1.3.59, incorporated multicast diffs from ni52.c
X Feb 15th, 1996
X added shared irq support
-
+ Apr 1999
+ added support for multiple cards when used as a module
+ added option to disable multicast as is causes problems
+ Ganesh Sittampalam <ganesh.si...@magdalen.oxford.ac.uk>
+ Stuart Adamson <stuart....@compsoc.net>
+
X $Header: /fsys2/home/chrisb/linux-1.3.59-MCA/drivers/net/RCS/3c523.c,v 1.1 1996/02/05 01:53:46 chrisb Exp chrisb $
X */
X
@@ -107,6 +112,7 @@
X /*************************************************************************/
X #define DEBUG /* debug on */
X #define SYSBUSVAL 0 /* 1 = 8 Bit, 0 = 16 bit - 3c523 only does 16 bit */
+#undef ELMC_MULTICAST /* Disable multicast support as it is somewhat seriously broken at the moment */
X
X #define make32(ptr16) (p->memtop + (short) (ptr16) )
X #define make24(ptr32) ((char *) (ptr32) - p->base)
@@ -180,7 +186,9 @@
X static int elmc_close(struct device *dev);
X static int elmc_send_packet(struct sk_buff *, struct device *);
X static struct net_device_stats *elmc_get_stats(struct device *dev);
+#ifdef ELMC_MULTICAST
X static void set_multicast_list(struct device *dev);
+#endif
X
X /* helper-functions */
X static int init586(struct device *dev);
@@ -432,21 +440,19 @@
X while (slot != -1) {
X status = mca_read_stored_pos(slot, 2);
X
+ dev->irq=irq_table[(status & ELMC_STATUS_IRQ_SELECT) >> 6];
+ dev->base_addr=csr_table[(status & ELMC_STATUS_CSR_SELECT) >> 1];
+
X /*
X If we're trying to match a specified irq or IO address,
X we'll reject a match unless it's what we're looking for.
+ Also reject it if the card is already in use.
X */
- if (base_addr || irq) {
- /* we're looking for a card at a particular place */
X
- if (irq && irq != irq_table[(status & ELMC_STATUS_IRQ_SELECT) >> 6]) {
- slot = mca_find_adapter(ELMC_MCA_ID, slot + 1);
- continue;
- }
- if (base_addr && base_addr != csr_table[(status & ELMC_STATUS_CSR_SELECT) >> 1]) {
- slot = mca_find_adapter(ELMC_MCA_ID, slot + 1);
- continue;
- }
+ if((irq && irq != dev->irq) || (base_addr && base_addr != dev->base_addr)
+ || check_region(dev->base_addr,ELMC_IO_EXTENT)) {
+ slot = mca_find_adapter(ELMC_MCA_ID, slot + 1);
+ continue;
X }
X /* found what we're looking for... */
X break;
@@ -476,9 +482,6 @@
X /* revision is stored in the first 4 bits of the revision register */
X revision = inb(dev->base_addr + ELMC_REVISION) & 0xf;
X
- /* figure out our irq */
- dev->irq = irq_table[(status & ELMC_STATUS_IRQ_SELECT) >> 6];
-
X /* according to docs, we read the interrupt and write it back to
X the IRQ select register, since the POST might not configure the IRQ
X properly. */
@@ -497,9 +500,6 @@
X break;
X }
X
- /* Our IO address? */
- dev->base_addr = csr_table[(status & ELMC_STATUS_CSR_SELECT) >> 1];
-
X request_region(dev->base_addr, ELMC_IO_EXTENT, "3c523");
X
X dev->priv = (void *) kmalloc(sizeof(struct priv), GFP_KERNEL);
@@ -565,7 +565,11 @@
X dev->stop = &elmc_close;
X dev->get_stats = &elmc_get_stats;
X dev->hard_start_xmit = &elmc_send_packet;
+#ifdef ELMC_MULTICAST
X dev->set_multicast_list = &set_multicast_list;
+#else
+ dev->set_multicast_list = NULL;
+#endif
X
X ether_setup(dev);
X
@@ -577,6 +581,10 @@
X That gets done in elmc_open(). I'm not sure that's such a good idea,
X but it works, so I'll go with it. */
X
+#ifndef ELMC_MULTICAST
+ dev->flags&=~IFF_MULTICAST; /* Multicast doesn't work */
+#endif
+
X return 0;
X }
X
@@ -1210,6 +1218,7 @@
X * Set MC list ..
X */
X
+#ifdef ELMC_MULTICAST
X static void set_multicast_list(struct device *dev)
X {
X if (!dev->start) {
@@ -1222,60 +1231,85 @@
X startrecv586(dev);
X dev->start = 1;
X }
+#endif
X
X /*************************************************************************/


X
X #ifdef MODULE
X

-static char devicename[9] = {0,};
+/* Increase if needed ;) */
+#define MAX_3C523_CARDS 4
+/* I'm not sure where this magic 9 comes from */
+#define NAMELEN 9
X
-static struct device dev_elmc =
-{
- devicename /*"3c523" */ , 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, elmc_probe
+static char devicenames[NAMELEN * MAX_3C523_CARDS] = {0,};
+
+static struct device dev_elmc[MAX_3C523_CARDS] =
+{
+ {
+ NULL /*"3c523" */ , 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL
+ },
X };
X
-static int irq = 0;
-static int io = 0;
-MODULE_PARM(irq, "i");
-MODULE_PARM(io, "i");
+static int irq[MAX_3C523_CARDS] = {0,};
+static int io[MAX_3C523_CARDS] = {0,};
+MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_3C523_CARDS) "i");
+MODULE_PARM(io, "1-" __MODULE_STRING(MAX_3C523_CARDS) "i");
X
X int init_module(void)
X {
- struct device *dev = &dev_elmc;
+ int this_dev,found = 0;
X
- dev->base_addr = io;
- dev->irq = irq;
- if (register_netdev(dev) != 0) {
- return -EIO;
- }
- return 0;
+ /* Loop until we either can't find any more cards, or we have MAX_3C523_CARDS */
+ for(this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++)
+ {
+ struct device *dev = &dev_elmc[this_dev];
+ dev->name=devicenames+(NAMELEN*this_dev);
+ dev->irq=irq[this_dev];
+ dev->base_addr=io[this_dev];
+ dev->init=elmc_probe;
+ if(register_netdev(dev)!=0) {
+ if(io[this_dev]==0) break;
+ printk(KERN_WARNING "3c523.c: No 3c523 card found at io=%#x\n",io[this_dev]);
+ } else found++;
+ }
+
+ if(found==0) {
+ if(io[0]==0) printk(KERN_NOTICE "3c523.c: No 3c523 cards found\n");
+ return -ENXIO;
+ } else return 0;
X }
X
X void cleanup_module(void)
X {
- struct device *dev = &dev_elmc;
+ int this_dev;
+ for(this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++) {
X
- /* shutdown interrupts on the card */
- elmc_id_reset586();
- if (dev->irq != 0) {
- /* this should be done by close, but if we failed to
- initialize properly something may have gotten hosed. */
- free_irq(dev->irq, dev);
- dev->irq = 0;
- }
- if (dev->base_addr != 0) {
- release_region(dev->base_addr, ELMC_IO_EXTENT);
- dev->base_addr = 0;
- }
- irq = 0;
- io = 0;
- unregister_netdev(dev);
+ struct device *dev = &dev_elmc[this_dev];
+ if(dev->priv) {
+ /* shutdown interrupts on the card */
+ elmc_id_reset586();
+ if (dev->irq != 0) {
+ /* this should be done by close, but if we failed to
+ initialize properly something may have gotten hosed. */
+ free_irq(dev->irq, dev);
+ dev->irq = 0;
+ }
+ if (dev->base_addr != 0) {
+ release_region(dev->base_addr, ELMC_IO_EXTENT);
+ dev->base_addr = 0;
+ }
+ irq[this_dev] = 0;
+ io[this_dev] = 0;
+ unregister_netdev(dev);
X
- mca_set_adapter_procfn(((struct priv *) (dev->priv))->slot,
+ mca_set_adapter_procfn(((struct priv *) (dev->priv))->slot,
X NULL, NULL);
X
- kfree_s(dev->priv, sizeof(struct priv));
- dev->priv = NULL;
+ kfree_s(dev->priv, sizeof(struct priv));
+ dev->priv = NULL;
+ }
+ }
X }
X
X #endif /* MODULE */
diff -u --recursive --new-file v2.2.6/linux/drivers/net/ibmtr.c linux/drivers/net/ibmtr.c
--- v2.2.6/linux/drivers/net/ibmtr.c Tue Mar 23 14:35:47 1999
+++ linux/drivers/net/ibmtr.c Sat Apr 24 17:49:37 1999
@@ -70,6 +70,12 @@
X * Changes by Joel Sloan (j...@c-me.com) :
X * + disable verbose debug messages by default - to enable verbose
X * debugging, edit the IBMTR_DEBUG_MESSAGES define below
+ *
+ * Changes by Mike Phillips <phi...@amtrak.com> :
+ * + Added extra #ifdef's to work with new PCMCIA Token Ring Code.
+ * The PCMCIA code now just sets up the card so it can be recognized
+ * by ibmtr_probe. Also checks allocated memory vs. on-board memory
+ * for correct figure to use.
X *
X * Changes by Tim Hockin (tho...@isunix.it.ilstu.edu) :
X * + added spinlocks for SMP sanity (10 March 1999)
@@ -94,6 +100,7 @@
X #undef NO_AUTODETECT
X #undef ENABLE_PAGING
X
+
X #define FALSE 0
X #define TRUE (!FALSE)
X
@@ -191,6 +198,9 @@
X int ibmtr_probe(struct device *dev);
X static int ibmtr_probe1(struct device *dev, int ioaddr);
X static unsigned char get_sram_size(struct tok_info *adapt_info);
+#ifdef PCMCIA
+extern unsigned char pcmcia_reality_check(unsigned char gss);
+#endif
X static int tok_init_card(struct device *dev);
X void tok_interrupt(int irq, void *dev_id, struct pt_regs *regs);
X static int trdev_init(struct device *dev);
@@ -256,8 +266,10 @@
X if (ibmtr_probe1(dev, base_addr))
X {
X #ifndef MODULE
+#ifndef PCMCIA
X tr_freedev(dev);
X #endif
+#endif
X return -ENODEV;
X } else
X return 0;
@@ -272,8 +284,10 @@
X continue;
X if (ibmtr_probe1(dev, ioaddr)) {
X #ifndef MODULE
+#ifndef PCMCIA
X tr_freedev(dev);
X #endif
+#endif
X } else
X return 0;
X }
@@ -291,8 +305,10 @@
X unsigned long timeout;
X
X #ifndef MODULE
+#ifndef PCMCIA
X dev = init_trdev(dev,0);
X #endif
+#endif
X
X /* Query the adapter PIO base port which will return
X * indication of where MMIO was placed. We also have a
@@ -300,7 +316,7 @@
X */
X
X segment = inb(PIOaddr);
-
+
X /*
X * Out of range values so we'll assume non-existent IO device
X */
@@ -373,12 +389,19 @@
X }
X
X /* Now, allocate some of the pl0 buffers for this driver.. */
+
+ /* If called from PCMCIA, ti is already set up, so no need to
+ waste the memory, just use the existing structure */
+
+#ifndef PCMCIA
X ti = (struct tok_info *)kmalloc(sizeof(struct tok_info), GFP_KERNEL);
X if (ti == NULL)
X return -ENOMEM;
X
X memset(ti, 0, sizeof(struct tok_info));
-
+#else
+ ti = dev->priv ;
+#endif
X ti->mmio= t_mmio;
X ti->readlog_pending = 0;
X
@@ -388,6 +411,10 @@
X should fit with out future hope of multiple
X adapter support as well /dwm */
X
+ /* if PCMCIA, then the card is recognized as TR_ISAPNP
+ * and there is no need to set up the interrupt, it is already done. */
+
+#ifndef PCMCIA
X switch (cardpresent)
X {
X case TR_ISA:
@@ -428,7 +455,6 @@
X irq=10;
X if (intr==3)
X irq=11;
-
X timeout = jiffies + TR_SPIN_INTERVAL;
X while(!readb(ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN))
X if (time_after(jiffies, timeout)) {
@@ -436,11 +462,13 @@
X kfree_s(ti, sizeof(struct tok_info));
X return -ENODEV;
X }
+
X ti->sram=((__u32)readb(ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN)<<12);
X ti->global_int_enable=PIOaddr+ADAPTINTREL;
X ti->adapter_int_enable=PIOaddr+ADAPTINTREL;
X break;
X }
+#endif
X
X if (ibmtr_debug_trace & TRC_INIT) { /* just report int */
X DPRINTK("irq=%d",irq);
@@ -483,8 +511,11 @@
X ti->token_release = readb(ti->mmio + AIPEARLYTOKEN);
X
X /* How much shared RAM is on adapter ? */
+#ifdef PCMCIA
+ ti->avail_shared_ram = pcmcia_reality_check(get_sram_size(ti));
+#else
X ti->avail_shared_ram = get_sram_size(ti);
-
+#endif
X /* We need to set or do a bunch of work here based on previous results.. */
X /* Support paging? What sizes?: F=no, E=16k, D=32k, C=16 & 32k */
X ti->shared_ram_paging = readb(ti->mmio + AIPSHRAMPAGE);
@@ -593,7 +624,6 @@


X }
X #endif
X }
-

X /* finish figuring the shared RAM address */
X if (cardpresent==TR_ISA) {
X static __u32 ram_bndry_mask[]={0xffffe000, 0xffffc000, 0xffff8000, 0xffff0000};
@@ -619,15 +649,20 @@
X DPRINTK("Using %dK shared RAM\n",ti->mapped_ram_size/2);
X #endif
X
+ /* The PCMCIA has already got the interrupt line and the io port,
+ so no chance of anybody else getting it - MLP */
+
+#ifndef PCMCIA
X if (request_irq (dev->irq = irq, &tok_interrupt,0,"ibmtr", dev) != 0) {
X DPRINTK("Could not grab irq %d. Halting Token Ring driver.\n",irq);
X kfree_s(ti, sizeof(struct tok_info));
X return -ENODEV;
X }
+
+ /*?? Now, allocate some of the PIO PORTs for this driver.. */
+ request_region(PIOaddr,IBMTR_IO_EXTENT,"ibmtr"); /* record PIOaddr range as busy */
+#endif
X
- /*?? Now, allocate some of the PIO PORTs for this driver.. */
- request_region(PIOaddr,IBMTR_IO_EXTENT,"ibmtr"); /* record PIOaddr range
- as busy */
X #if !TR_NEWFORMAT
X DPRINTK("%s",version); /* As we have passed card identification,
X let the world know we're here! */
@@ -717,7 +752,6 @@
X
X unsigned char avail_sram_code;
X static unsigned char size_code[]={ 0,16,32,64,127,128 };
-
X /* Adapter gives
X 'F' -- use RRR bits 3,2
X 'E' -- 8kb 'D' -- 16kb
@@ -747,8 +781,10 @@
X dev->change_mtu = ibmtr_change_mtu;
X
X #ifndef MODULE
+#ifndef PCMCIA
X tr_setup(dev);
X #endif
+#endif
X return 0;
X }
X
@@ -842,7 +878,7 @@
X DPRINTK("PCMCIA card removed.\n");
X spin_unlock(&(ti->lock));
X dev->interrupt = 0;
- return;
+ return;
X }
X
X /* Check ISRP EVEN too. */
@@ -1186,7 +1222,6 @@
X __u32 encoded_addr;
X __u32 hw_encoded_addr;
X struct tok_info *ti;
-
X ti=(struct tok_info *) dev->priv;
X
X ti->do_tok_int=NOT_FIRST;
diff -u --recursive --new-file v2.2.6/linux/drivers/net/irda/actisys.c linux/drivers/net/irda/actisys.c
--- v2.2.6/linux/drivers/net/irda/actisys.c Wed Mar 10 15:29:46 1999
+++ linux/drivers/net/irda/actisys.c Sat Apr 24 17:49:37 1999


@@ -7,7 +7,7 @@
X * Status: Experimental.
X * Author: Dag Brattli <da...@cs.uit.no>

X * Created at: Wed Oct 21 20:02:35 1998

- * Modified at: Tue Feb 9 15:38:16 1999
+ * Modified at: Mon Apr 12 11:56:35 1999


X * Modified by: Dag Brattli <da...@cs.uit.no>

X *

X * Copyright (c) 1998 Dag Brattli, All Rights Reserved.

@@ -234,8 +234,8 @@
X /* Remove support for 38400 if this is not a 220L+ dongle */
X if ( idev->io.dongle_id == ACTISYS_DONGLE)
X qos->baud_rate.bits &= ~IR_38400;
-

- qos->min_turn_time.bits &= 0xfe; /* All except 0 ms */
+

+ qos->min_turn_time.bits &= 0x40; /* Needs 0.01 ms */


X }
X
X #ifdef MODULE

diff -u --recursive --new-file v2.2.6/linux/drivers/net/irda/esi.c linux/drivers/net/irda/esi.c
--- v2.2.6/linux/drivers/net/irda/esi.c Wed Mar 10 15:29:46 1999
+++ linux/drivers/net/irda/esi.c Sat Apr 24 17:49:37 1999


@@ -6,7 +6,7 @@
X * Status: Experimental.

X * Author: Thomas Davis, <rat...@radiks.net>
X * Created at: Sat Feb 21 18:54:38 1998
- * Modified at: Tue Feb 9 15:36:47 1999
+ * Modified at: Mon Apr 12 11:55:30 1999


X * Modified by: Dag Brattli <da...@cs.uit.no>

X * Sources: esi.c
X *
@@ -56,9 +56,9 @@
X esi_qos_init,
X };
X
-__initfunc(void esi_init(void))
+__initfunc(int esi_init(void))


X {
- irtty_register_dongle( &dongle);
+ return irtty_register_dongle(&dongle);
X }
X

X void esi_cleanup(void)
@@ -132,7 +132,7 @@
X }
X /* Change speed of serial driver */


X tty->termios->c_cflag = cflag;
- tty->driver.set_termios( tty, &old_termios);
+ tty->driver.set_termios(tty, &old_termios);
X

X irtty_set_dtr_rts(tty, dtr, rts);
X }
@@ -151,6 +151,7 @@
X static void esi_qos_init( struct irda_device *idev, struct qos_info *qos)
X {
X qos->baud_rate.bits &= IR_9600|IR_19200|IR_115200;


+ qos->min_turn_time.bits &= 0x01; /* Needs at least 10 ms */

X }
X
X #ifdef MODULE

@@ -163,8 +164,7 @@


X */
X int init_module(void)
X {

- esi_init();
- return(0);
+ return esi_init();
X }
X
X /*
diff -u --recursive --new-file v2.2.6/linux/drivers/net/irda/girbil.c linux/drivers/net/irda/girbil.c
--- v2.2.6/linux/drivers/net/irda/girbil.c Wed Mar 10 15:29:46 1999
+++ linux/drivers/net/irda/girbil.c Sat Apr 24 17:49:37 1999


@@ -6,7 +6,7 @@
X * Status: Experimental.

X * Author: Dag Brattli <da...@cs.uit.no>

X * Created at: Sat Feb 6 21:02:33 1999
- * Modified at: Tue Feb 9 15:36:36 1999
+ * Modified at: Sat Apr 10 19:53:12 1999


X * Modified by: Dag Brattli <da...@cs.uit.no>

X *
X * Copyright (c) 1999 Dag Brattli, All Rights Reserved.
@@ -195,7 +195,7 @@


X {
X struct irtty_cb *self;
X struct tty_struct *tty;

- __u8 control = GIRBIL_TXEN | GIRBIL_RXEN /* | GIRBIL_ECAN */;
+ __u8 control = GIRBIL_TXEN | GIRBIL_RXEN;
X
X ASSERT(idev != NULL, return;);
X ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
diff -u --recursive --new-file v2.2.6/linux/drivers/net/irda/irport.c linux/drivers/net/irda/irport.c
--- v2.2.6/linux/drivers/net/irda/irport.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/net/irda/irport.c Sat Apr 24 17:49:37 1999
@@ -1,7 +1,7 @@
X /*********************************************************************
X *
X * Filename: irport.c
- * Version: 0.8
+ * Version: 0.9
X * Description: Serial driver for IrDA.

X * Status: Experimental.
X * Author: Dag Brattli <da...@cs.uit.no>

@@ -9,7 +9,6 @@
X * Modified at: Sat May 23 23:15:20 1998


X * Modified by: Dag Brattli <da...@cs.uit.no>

X * Sources: serial.c by Linus Torvalds
- * serial_serial.c by Aage Kvalnes <aa...@cs.uit.no>
X *
X * Copyright (c) 1997,1998 Dag Brattli <da...@cs.uit.no>
X * All Rights Reserved.
@@ -25,10 +24,10 @@
X *
X * NOTICE:
X *
- * This driver is ment to be a small serial driver to be used for
- * IR-chipsets that has a UART (16550) compatibility mode. If your
- * chipset is is UART only, you should probably use IrTTY instead since
- * the Linux serial driver is probably more robust and optimized.
+ * This driver is ment to be a small half duplex serial driver to be
+ * used for IR-chipsets that has a UART (16550) compatibility mode. If
+ * your chipset is is UART only, you should probably use IrTTY instead
+ * since the Linux serial driver is probably more robust and optimized.
X *
X * The functions in this file may be used by FIR drivers, but this
X * driver knows nothing about FIR drivers so don't ever insert such
@@ -64,7 +63,6 @@
X #include <net/irda/irport.h>
X
X #define IO_EXTENT 8
-#define CONFIG_HALF_DUPLEX
X
X /* static unsigned int io[] = { 0x3e8, ~0, ~0, ~0 }; */
X /* static unsigned int irq[] = { 11, 0, 0, 0 }; */
@@ -114,7 +112,7 @@
X * Start IO port
X *
X */
-int irport_open( int iobase)
+int irport_open(int iobase)
X {
X DEBUG(4, __FUNCTION__ "(), iobase=%#x\n", iobase);
X
@@ -134,7 +132,7 @@
X * Stop IO port
X *
X */
-void irport_close( int iobase)
+void irport_close(int iobase)
X {
X DEBUG(4, __FUNCTION__ "()\n");
X
@@ -142,7 +140,7 @@
X outb(0, iobase+UART_MCR);
X
X /* Turn off interrupts */
- outb(0, iobase+UART_IER);
+ outb(0, iobase+UART_IER);
X }
X
X /*
@@ -186,16 +184,22 @@
X * more packets to send, we send them here.
X *
X */
-static void irport_write_wakeup( struct irda_device *idev)
+static void irport_write_wakeup(struct irda_device *idev)
X {
- int actual = 0, count;
+ int actual = 0;
X int iobase;
X
X ASSERT(idev != NULL, return;);
X ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
X
X /* Finished with frame? */
- if (idev->tx_buff.offset == idev->tx_buff.len) {


+ if (idev->tx_buff.len > 0) {

+ /* Write data left in transmit buffer */
+ actual = irport_write(idev->io.iobase2, idev->io.fifo_size,
+ idev->tx_buff.data, idev->tx_buff.len);


+ idev->tx_buff.data += actual;
+ idev->tx_buff.len -= actual;

+ } else {
X iobase = idev->io.iobase2;
X /*
X * Now serial buffer is almost free & we can start
@@ -206,23 +210,14 @@
X
X /* Schedule network layer, so we can get some more frames */
X mark_bh(NET_BH);
-#ifdef CONFIG_HALF_DUPLEX
+
X outb(UART_FCR_ENABLE_FIFO |
X UART_FCR_TRIGGER_14 |
X UART_FCR_CLEAR_RCVR, iobase+UART_FCR); /* Enable FIFO's */
X
X /* Turn on receive interrupts */
X outb(UART_IER_RLSI|UART_IER_RDI, iobase+UART_IER);
-#endif
- return;
X }
-
- /* Write data left in transmit buffer */
- count = idev->tx_buff.len - idev->tx_buff.offset;
- actual = irport_write(idev->io.iobase2, idev->io.fifo_size,
- idev->tx_buff.head, count);


- idev->tx_buff.offset += actual;
- idev->tx_buff.head += actual;

X }
X
X /*
@@ -283,22 +278,19 @@
X if (irda_lock((void *) &dev->tbusy) == FALSE)
X return -EBUSY;
X
- /*
- * Transfer skb to tx_buff while wrapping, stuffing and making CRC
- */
+ /* Init tx buffer */


+ idev->tx_buff.data = idev->tx_buff.head;

+
+ /* Copy skb to tx_buff while wrapping, stuffing and making CRC */


X idev->tx_buff.len = async_wrap_skb(skb, idev->tx_buff.data,
X idev->tx_buff.truesize);
X

-/* actual = irport_write(idev->io.iobase2, idev->io.fifo_size, */
-/* idev->tx_buff.data, idev->tx_buff.len); */
-
- idev->tx_buff.offset = actual;
- idev->tx_buff.head = idev->tx_buff.data + actual;


+ idev->tx_buff.data += actual;
+ idev->tx_buff.len -= actual;
X

-#ifdef CONFIG_HALF_DUPLEX
X /* Turn on transmit finished interrupt. Will fire immediately! */
X outb(UART_IER_THRI, iobase+UART_IER);
-#endif
+
X dev_kfree_skb(skb);
X
X return 0;
@@ -318,44 +310,37 @@
X if (!idev)
X return;


X
- DEBUG( 4, __FUNCTION__ "()\n");
+ DEBUG(4, __FUNCTION__ "()\n");
X

X iobase = idev->io.iobase2;
X
- if (idev->rx_buff.len == 0)


- idev->rx_buff.head = idev->rx_buff.data;
-

X /*
X * Receive all characters in Rx FIFO, unwrap and unstuff them.
X * async_unwrap_char will deliver all found frames
X */
X do {
- async_unwrap_char(idev, inb( iobase+UART_RX));
+ async_unwrap_char(idev, inb(iobase+UART_RX));
X
X /* Make sure we don't stay here to long */
X if (boguscount++ > 32) {
X DEBUG(0,__FUNCTION__ "(), breaking!\n");
X break;
X }
-
X } while (inb(iobase+UART_LSR) & UART_LSR_DR);
X }
X
X /*
X * Function irport_interrupt (irq, dev_id, regs)
X *
- *
+ * Interrupt handler
X */
X void irport_interrupt(int irq, void *dev_id, struct pt_regs *regs)
X {
X struct irda_device *idev = (struct irda_device *) dev_id;
-
X int iobase;
X int iir, lsr;
X int boguscount = 0;
X
- DEBUG(5, __FUNCTION__ "(), irq %d\n", irq);
-
X if (!idev) {
X printk(KERN_WARNING __FUNCTION__
X "() irq %d for unknown device.\n", irq);
@@ -368,19 +353,13 @@
X
X iir = inb(iobase + UART_IIR) & UART_IIR_ID;
X while (iir) {
- DEBUG(4,__FUNCTION__ "(), iir=%#x\n", iir);
-
X /* Clear interrupt */
X lsr = inb(iobase+UART_LSR);
X
X if ((iir & UART_IIR_THRI) && (lsr & UART_LSR_THRE)) {
X /* Transmitter ready for data */
X irport_write_wakeup(idev);
- }
-#ifdef CONFIG_HALF_DUPLEX
- else
-#endif
- if ((iir & UART_IIR_RDI) && (lsr & UART_LSR_DR)) {
+ } else if ((iir & UART_IIR_RDI) && (lsr & UART_LSR_DR)) {
X /* Receive interrupt */
X irport_receive(idev);
X }
@@ -393,7 +372,6 @@
X }
X idev->netdev.interrupt = 0;
X }
-


X
X #ifdef MODULE
X

diff -u --recursive --new-file v2.2.6/linux/drivers/net/irda/irtty.c linux/drivers/net/irda/irtty.c
--- v2.2.6/linux/drivers/net/irda/irtty.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/net/irda/irtty.c Sat Apr 24 17:49:37 1999


@@ -6,7 +6,7 @@
X * Status: Experimental.

X * Author: Dag Brattli <da...@cs.uit.no>

X * Created at: Tue Dec 9 21:18:38 1997
- * Modified at: Tue Apr 6 21:35:25 1999
+ * Modified at: Thu Apr 22 09:20:24 1999


X * Modified by: Dag Brattli <da...@cs.uit.no>

X * Sources: slip.c by Laurence Culhane, <l...@holmes.demon.co.uk>
X * Fred N. van Kempen, <wal...@uwalt.nl.mugnet.org>
@@ -45,22 +45,22 @@
X
X static struct tty_ldisc irda_ldisc;
X
-static int irtty_hard_xmit( struct sk_buff *skb, struct device *dev);
-static void irtty_wait_until_sent( struct irda_device *driver);
-static int irtty_is_receiving( struct irda_device *idev);
-static int irtty_net_init( struct device *dev);
+static int irtty_hard_xmit(struct sk_buff *skb, struct device *dev);
+static void irtty_wait_until_sent(struct irda_device *driver);
+static int irtty_is_receiving(struct irda_device *idev);
+static int irtty_net_init(struct device *dev);
X static int irtty_net_open(struct device *dev);
X static int irtty_net_close(struct device *dev);
X
-static int irtty_open( struct tty_struct *tty);
-static void irtty_close( struct tty_struct *tty);
-static int irtty_ioctl( struct tty_struct *, void *, int, void *);
-static int irtty_receive_room( struct tty_struct *tty);
-static void irtty_change_speed( struct irda_device *dev, int baud);
-static void irtty_write_wakeup( struct tty_struct *tty);
+static int irtty_open(struct tty_struct *tty);
+static void irtty_close(struct tty_struct *tty);
+static int irtty_ioctl(struct tty_struct *, void *, int, void *);
+static int irtty_receive_room(struct tty_struct *tty);
+static void irtty_change_speed(struct irda_device *dev, int baud);
+static void irtty_write_wakeup(struct tty_struct *tty);
X
-static void irtty_receive_buf( struct tty_struct *, const unsigned char *,
- char *, int);
+static void irtty_receive_buf(struct tty_struct *, const unsigned char *,
+ char *, int);
X char *driver_name = "irtty";
X
X __initfunc(int irtty_init(void))
@@ -73,15 +73,15 @@
X return -ENOMEM;
X }
X
- dongles = hashbin_new( HB_LOCAL);
- if ( dongles == NULL) {
- printk( KERN_WARNING
- "IrDA: Can't allocate dongles hashbin!\n");
+ dongles = hashbin_new(HB_LOCAL);
+ if (dongles == NULL) {
+ printk(KERN_WARNING
+ "IrDA: Can't allocate dongles hashbin!\n");
X return -ENOMEM;
X }
X
X /* Fill in our line protocol discipline, and register it */
- memset( &irda_ldisc, 0, sizeof( irda_ldisc));
+ memset(&irda_ldisc, 0, sizeof( irda_ldisc));
X
X irda_ldisc.magic = TTY_LDISC_MAGIC;
X irda_ldisc.name = "irda";
@@ -97,10 +97,10 @@
X irda_ldisc.receive_room = irtty_receive_room;
X irda_ldisc.write_wakeup = irtty_write_wakeup;
X
- if (( status = tty_register_ldisc( N_IRDA, &irda_ldisc)) != 0) {
- printk( KERN_ERR
- "IrDA: can't register line discipline (err = %d)\n",
- status);
+ if (( status = tty_register_ldisc(N_IRDA, &irda_ldisc)) != 0) {
+ printk(KERN_ERR
+ "IrDA: can't register line discipline (err = %d)\n",
+ status);
X }
X
X return status;
@@ -120,10 +120,10 @@
X /*
X * Unregister tty line-discipline
X */
- if (( ret = tty_register_ldisc( N_IRDA, NULL))) {
- printk( KERN_ERR
- "IrTTY: can't unregister line discipline (err = %d)\n",
- ret);
+ if ((ret = tty_register_ldisc(N_IRDA, NULL))) {
+ ERROR(__FUNCTION__
+ "(), can't unregister line discipline (err = %d)\n",
+ ret);
X }
X
X /*
@@ -131,8 +131,8 @@
X * callback to irtty_close(), therefore we do give any deallocation
X * function to hashbin_destroy().
X */
- hashbin_delete( irtty, NULL);
- hashbin_delete( dongles, NULL);
+ hashbin_delete(irtty, NULL);
+ hashbin_delete(dongles, NULL);
X }
X #endif /* MODULE */
X
@@ -143,47 +143,45 @@
X * discipline is called for. Because we are sure the tty line exists,
X * we only have to link it to a free IrDA channel.
X */
-static int irtty_open( struct tty_struct *tty)
+static int irtty_open(struct tty_struct *tty)

X {
X struct irtty_cb *self;

X char name[16];
X
- ASSERT( tty != NULL, return -EEXIST;);
+ ASSERT(tty != NULL, return -EEXIST;);
X
X /* First make sure we're not already connected. */
X self = (struct irtty_cb *) tty->disc_data;
- if ( self != NULL && self->magic == IRTTY_MAGIC)
+ if (self != NULL && self->magic == IRTTY_MAGIC)
X return -EEXIST;
X
X /*
X * Allocate new instance of the driver
X */
- self = kmalloc( sizeof(struct irtty_cb), GFP_KERNEL);
- if ( self == NULL) {
- printk( KERN_ERR "IrDA: Can't allocate memory for "
- "IrDA control block!\n");
+ self = kmalloc(sizeof(struct irtty_cb), GFP_KERNEL);
+ if (self == NULL) {
+ printk(KERN_ERR "IrDA: Can't allocate memory for "
+ "IrDA control block!\n");
X return -ENOMEM;
X }
- memset( self, 0, sizeof(struct irtty_cb));
+ memset(self, 0, sizeof(struct irtty_cb));
X
X self->tty = tty;
X tty->disc_data = self;
X
X /* Give self a name */
- sprintf( name, "%s%d", tty->driver.name,
- MINOR(tty->device) - tty->driver.minor_start +
- tty->driver.name_base);
-
+ sprintf(name, "%s%d", tty->driver.name,
+ MINOR(tty->device) - tty->driver.minor_start +
+ tty->driver.name_base);
+
X /* hashbin_insert( irtty, (QUEUE*) self, 0, self->name); */
- hashbin_insert( irtty, (QUEUE*) self, (int) self, NULL);
+ hashbin_insert(irtty, (QUEUE*) self, (int) self, NULL);
X
- if (tty->driver.flush_buffer) {
+ if (tty->driver.flush_buffer)
X tty->driver.flush_buffer(tty);
- }
-
- if (tty->ldisc.flush_buffer) {
+
+ if (tty->ldisc.flush_buffer)
X tty->ldisc.flush_buffer(tty);
- }
X
X self->magic = IRTTY_MAGIC;
X
@@ -198,12 +196,12 @@
X * that are not device dependent (such as link disconnect time) so
X * this parameter can be set by IrLAP (or the user) instead. DB
X */
- irda_init_max_qos_capabilies( &self->idev.qos);
+ irda_init_max_qos_capabilies(&self->idev.qos);


X
X /* The only value we must override it the baudrate */

X self->idev.qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
X IR_115200;
- self->idev.qos.min_turn_time.bits = 0x03;
+ self->idev.qos.min_turn_time.bits = 0x0f;
X self->idev.flags = IFF_SIR | IFF_PIO;
X irda_qos_bits_to_value(&self->idev.qos);
X
@@ -236,7 +234,7 @@
X }
X
X /*
- * Function irtty_close ( tty)
+ * Function irtty_close (tty)
X *
X * Close down a IrDA channel. This means flushing out any pending queues,
X * and then restoring the TTY line discipline to what it was before it got
@@ -272,14 +270,40 @@
X MOD_DEC_USE_COUNT;
X }
X
+/*
+ * Function irtty_stop_receiver (irda_device, stop)
+ *
+ *
+ *
+ */
+static void irtty_stop_receiver(struct irda_device *idev, int stop)
+{
+ struct termios old_termios;
+ struct irtty_cb *self;
+ int cflag;
+
+ self = (struct irtty_cb *) idev->priv;
+
+ old_termios = *(self->tty->termios);
+ cflag = self->tty->termios->c_cflag;
+
+ if (stop)
+ cflag &= ~CREAD;
+ else
+ cflag |= CREAD;
+
+ self->tty->termios->c_cflag = cflag;
+ self->tty->driver.set_termios(self->tty, &old_termios);
+}
+
X /*
- * Function irtty_change_speed ( self, baud)
+ * Function irtty_change_speed (self, baud)
X *
X * Change the speed of the serial port. The driver layer must check that
X * all transmission has finished using the irtty_wait_until_sent()
X * function.
X */
-static void irtty_change_speed( struct irda_device *idev, int baud)
+static void irtty_change_speed(struct irda_device *idev, int baud)
X {
X struct termios old_termios;
X struct irtty_cb *self;
@@ -287,22 +311,22 @@
X
X DEBUG(4,__FUNCTION__ "(), <%ld>\n", jiffies);

X
- ASSERT( idev != NULL, return;);
- ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+ ASSERT(idev != NULL, return;);
+ ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
X

X self = (struct irtty_cb *) idev->priv;


X
- ASSERT( self != NULL, return;);
- ASSERT( self->magic == IRTTY_MAGIC, return;);
+ ASSERT(self != NULL, return;);
+ ASSERT(self->magic == IRTTY_MAGIC, return;);
X

X old_termios = *(self->tty->termios);
X cflag = self->tty->termios->c_cflag;
X

X cflag &= ~CBAUD;
X

- DEBUG( 4, __FUNCTION__ "(), Setting speed to %d\n", baud);
+ DEBUG(4, __FUNCTION__ "(), Setting speed to %d\n", baud);
X
- switch( baud) {
+ switch (baud) {
X case 1200:
X cflag |= B1200;
X break;
@@ -331,7 +355,7 @@
X }
X
X self->tty->termios->c_cflag = cflag;
- self->tty->driver.set_termios( self->tty, &old_termios);
+ self->tty->driver.set_termios(self->tty, &old_termios);
X }
X
X /*
@@ -340,43 +364,42 @@
X * Initialize attached dongle. Warning, must be called with a process
X * context!
X */
-static void irtty_init_dongle( struct irtty_cb *self, int type)
+static void irtty_init_dongle(struct irtty_cb *self, int type)
X {
X struct dongle_q *node;


X
- ASSERT( self != NULL, return;);
- ASSERT( self->magic == IRTTY_MAGIC, return;);
+ ASSERT(self != NULL, return;);
+ ASSERT(self->magic == IRTTY_MAGIC, return;);
X

X #ifdef CONFIG_KMOD
X /* Try to load the module needed */
X switch( type) {
X case ESI_DONGLE:
- DEBUG( 0, __FUNCTION__ "(), ESI dongle!\n");
- request_module( "esi");
+ MESSAGE("IrDA: Trying to initialize ESI dongle!\n");
+ request_module("esi");
X break;
X case TEKRAM_DONGLE:
- DEBUG( 0, __FUNCTION__ "(), Tekram dongle!\n");
- request_module( "tekram");
+ MESSAGE("IrDA: Trying to initialize Tekram dongle!\n");
+ request_module("tekram");
X break;
X case ACTISYS_DONGLE: /* FALLTHROUGH */
X case ACTISYS_PLUS_DONGLE:
- DEBUG( 0, __FUNCTION__ "(), ACTiSYS dongle!\n");
- request_module( "actisys");
+ MESSAGE("IrDA: Trying to initialize ACTiSYS dongle!\n");
+ request_module("actisys");
X break;
X case GIRBIL_DONGLE:
- DEBUG( 0, __FUNCTION__ "(), GIrBIL dongle!\n");
- request_module( "girbil");
+ MESSAGE("IrDA: Trying to initialize GIrBIL dongle!\n");
+ request_module("girbil");
X break;
X default:
- DEBUG( 0, __FUNCTION__ "(), Unknown dongle type!\n");
+ ERROR("Unknown dongle type!\n");
X return;
- break;
X }
X #endif /* CONFIG_KMOD */
X
- node = hashbin_find( dongles, type, NULL);
+ node = hashbin_find(dongles, type, NULL);
X if ( !node) {
- DEBUG(0, __FUNCTION__ "(), Unable to find requested dongle\n");
+ ERROR("Unable to find requested dongle\n");
X return;
X }
X self->dongle_q = node;
@@ -387,14 +410,14 @@
X /*
X * Now initialize the dongle!
X */
- node->dongle->open( &self->idev, type);
- node->dongle->qos_init( &self->idev, &self->idev.qos);
+ node->dongle->open(&self->idev, type);
+ node->dongle->qos_init(&self->idev, &self->idev.qos);
X
X /* Reset dongle */
- node->dongle->reset( &self->idev, 0);
+ node->dongle->reset(&self->idev, 0);
X
X /* Set to default baudrate */
- node->dongle->change_speed( &self->idev, 9600);
+ node->dongle->change_speed(&self->idev, 9600);
X }
X
X /*
@@ -411,25 +434,25 @@
X
X self = (struct irtty_cb *) tty->disc_data;
X
- ASSERT( self != NULL, return -ENODEV;);
- ASSERT( self->magic == IRTTY_MAGIC, return -EBADR;);
+ ASSERT(self != NULL, return -ENODEV;);
+ ASSERT(self->magic == IRTTY_MAGIC, return -EBADR;);
X
- if ( _IOC_DIR(cmd) & _IOC_READ)
+ if (_IOC_DIR(cmd) & _IOC_READ)
X err = verify_area( VERIFY_WRITE, (void *) arg, size);
- else if ( _IOC_DIR(cmd) & _IOC_WRITE)
+ else if (_IOC_DIR(cmd) & _IOC_WRITE)
X err = verify_area( VERIFY_READ, (void *) arg, size);
- if ( err)
+ if (err)
X return err;
X
X switch(cmd) {
X case TCGETS:
X case TCGETA:
- return n_tty_ioctl( tty, (struct file *) file, cmd,
- (unsigned long) arg);
+ return n_tty_ioctl(tty, (struct file *) file, cmd,
+ (unsigned long) arg);
X break;
X case IRTTY_IOCTDONGLE:
X /* Initialize dongle */
- irtty_init_dongle( self, (int) arg);
+ irtty_init_dongle(self, (int) arg);
X break;
X default:
X return -ENOIOCTLCMD;
@@ -450,8 +473,8 @@
X {
X struct irtty_cb *self = (struct irtty_cb *) tty->disc_data;


X
- ASSERT( self != NULL, return;);
- ASSERT( self->magic == IRTTY_MAGIC, return;);
+ ASSERT(self != NULL, return;);
+ ASSERT(self->magic == IRTTY_MAGIC, return;);
X

X /* Read the characters out of the buffer */
X while (count--) {
@@ -461,19 +484,19 @@
X if (fp && *fp++) {
X DEBUG( 0, "Framing or parity error!\n");
X irda_device_set_media_busy( &self->idev, TRUE);
- /* sl->rx_errors++; */
+
X cp++;
X continue;
X }
X /* Unwrap and destuff one byte */
- async_unwrap_char( &self->idev, *cp++);
+ async_unwrap_char(&self->idev, *cp++);
X }
X }
X
X /*
X * Function irtty_hard_xmit (skb, dev)
X *
- * Transmit skb
+ * Transmit frame
X *
X */
X static int irtty_hard_xmit(struct sk_buff *skb, struct device *dev)
@@ -482,9 +505,6 @@
X struct irda_device *idev;
X int actual = 0;
X
- ASSERT( dev != NULL, return 0;);
- ASSERT( skb != NULL, return 0;);
-
X idev = (struct irda_device *) dev->priv;
X
X ASSERT(idev != NULL, return 0;);
@@ -498,10 +518,11 @@
X /* Lock transmit buffer */
X if (irda_lock((void *) &dev->tbusy) == FALSE)
X return -EBUSY;
-
- /*
- * Transfer skb to tx_buff while wrapping, stuffing and making CRC
- */
+
+ /* Init tx buffer*/


+ idev->tx_buff.data = idev->tx_buff.head;

+
+ /* Copy skb to tx_buff while wrapping, stuffing and making CRC */


X idev->tx_buff.len = async_wrap_skb(skb, idev->tx_buff.data,
X idev->tx_buff.truesize);
X

@@ -509,13 +530,14 @@
X
X dev->trans_start = jiffies;
X
- if ( self->tty->driver.write)
+ if (self->tty->driver.write)
X actual = self->tty->driver.write(self->tty, 0,
X idev->tx_buff.data,
X idev->tx_buff.len);
X
- idev->tx_buff.offset = actual;
- idev->tx_buff.head = idev->tx_buff.data + actual;
+ /* Hide the part we just transmitted */


+ idev->tx_buff.data += actual;
+ idev->tx_buff.len -= actual;
X

X idev->stats.tx_packets++;
X idev->stats.tx_bytes += idev->tx_buff.len;
@@ -524,7 +546,7 @@
X * Did we transmit the whole frame? Commented out for now since
X * I must check if this optimalization really works. DB.
X */
- if (( idev->tx.count - idev->tx.ptr) <= 0) {
+ if ((idev->tx_buff.len) == 0) {
X DEBUG( 4, "irtty_xmit_buf: finished with frame!\n");
X self->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
X irda_unlock( &self->tbusy);
@@ -541,8 +563,9 @@
X * Used by the TTY to find out how much data we can receive at a time
X *
X */
-static int irtty_receive_room( struct tty_struct *tty)
+static int irtty_receive_room(struct tty_struct *tty)
X {
+ DEBUG(0, __FUNCTION__ "()\n");
X return 65536; /* We can handle an infinite amount of data. :-) */
X }
X
@@ -553,47 +576,42 @@
X * more packets to send, we send them here.
X *
X */
-static void irtty_write_wakeup( struct tty_struct *tty)
+static void irtty_write_wakeup(struct tty_struct *tty)
X {
- int actual = 0, count;
X struct irtty_cb *self = (struct irtty_cb *) tty->disc_data;
X struct irda_device *idev;
+ int actual = 0;
X
X /*
X * First make sure we're connected.
X */


- ASSERT( self != NULL, return;);
- ASSERT( self->magic == IRTTY_MAGIC, return;);
+ ASSERT(self != NULL, return;);
+ ASSERT(self->magic == IRTTY_MAGIC, return;);
X

X idev = &self->idev;
X
- /*
- * Finished with frame?
- */
- if ( idev->tx_buff.offset == idev->tx_buff.len) {
-
+ /* Finished with frame? */


+ if (idev->tx_buff.len > 0) {

+ /* Write data left in transmit buffer */
+ actual = tty->driver.write(tty, 0, idev->tx_buff.data,
+ idev->tx_buff.len);
+


+ idev->tx_buff.data += actual;
+ idev->tx_buff.len -= actual;

+ } else {
X /*
X * Now serial buffer is almost free & we can start
X * transmission of another packet
X */
X DEBUG(5, __FUNCTION__ "(), finished with frame!\n");
-
+
X tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
X

X idev->netdev.tbusy = 0; /* Unlock */

-
+
X /* Tell network layer that we want more frames */
- mark_bh( NET_BH);
-
- return;
+ mark_bh(NET_BH);
X }
- /*
- * Write data left in transmit buffer
- */
- count = idev->tx_buff.len - idev->tx_buff.offset;
- actual = tty->driver.write( tty, 0, idev->tx_buff.head, count);


- idev->tx_buff.offset += actual;
- idev->tx_buff.head += actual;

X }
X
X /*
@@ -602,9 +620,9 @@
X * Return TRUE is we are currently receiving a frame
X *
X */
-static int irtty_is_receiving( struct irda_device *idev)
+static int irtty_is_receiving(struct irda_device *idev)
X {
- return ( idev->rx_buff.state != OUTSIDE_FRAME);
+ return (idev->rx_buff.state != OUTSIDE_FRAME);
X }
X
X /*
@@ -614,20 +632,20 @@
X * to change the speed of the serial port. Warning this function must
X * be called with a process context!
X */
-static void irtty_wait_until_sent( struct irda_device *idev)
+static void irtty_wait_until_sent(struct irda_device *idev)
X {
X struct irtty_cb *self = (struct irtty_cb *) idev->priv;


X
- ASSERT( self != NULL, return;);
- ASSERT( self->magic == IRTTY_MAGIC, return;);
+ ASSERT(self != NULL, return;);
+ ASSERT(self->magic == IRTTY_MAGIC, return;);
X

- DEBUG( 4, "Chars in buffer %d\n",
- self->tty->driver.chars_in_buffer( self->tty));
+ DEBUG(4, "Chars in buffer %d\n",
+ self->tty->driver.chars_in_buffer(self->tty));
X
- tty_wait_until_sent( self->tty, 0);
+ tty_wait_until_sent(self->tty, 0);
X }
X
-int irtty_register_dongle( struct dongle *dongle)
+int irtty_register_dongle(struct dongle *dongle)
X {
X struct dongle_q *new;
X
@@ -638,12 +656,11 @@
X }
X
X /* Make new IrDA dongle */
- new = (struct dongle_q *)kmalloc(sizeof(struct dongle_q), GFP_KERNEL);
- if (new == NULL) {
- return 1;
+ new = (struct dongle_q *) kmalloc(sizeof(struct dongle_q), GFP_KERNEL);
+ if (new == NULL)


+ return -1;
X
- }

- memset( new, 0, sizeof( struct dongle_q));
+ memset(new, 0, sizeof( struct dongle_q));
X new->dongle = dongle;
X
X /* Insert IrDA dongle into hashbin */
@@ -652,16 +669,16 @@
X return 0;
X }
X
-void irtty_unregister_dongle( struct dongle *dongle)
+void irtty_unregister_dongle(struct dongle *dongle)
X {
X struct dongle_q *node;
X
- node = hashbin_remove( dongles, dongle->type, NULL);
- if ( !node) {
- DEBUG( 0, __FUNCTION__ "(), dongle not found!\n");
+ node = hashbin_remove(dongles, dongle->type, NULL);
+ if (!node) {
+ ERROR(__FUNCTION__ "(), dongle not found!\n");
X return;
X }
- kfree( node);
+ kfree(node);
X }
X
X
@@ -696,26 +713,24 @@
X set_fs(get_ds());
X
X if (tty->driver.ioctl(tty, NULL, TIOCMSET, (unsigned long) &arg)) {
- DEBUG(0, __FUNCTION__ "(), error!\n");
+ ERROR(__FUNCTION__ "(), error doing ioctl!\n");
X }
X set_fs(fs);
X }
X
-
-static int irtty_net_init( struct device *dev)
+static int irtty_net_init(struct device *dev)
X {
X /* Set up to be a normal IrDA network device driver */
- irda_device_setup( dev);
+ irda_device_setup(dev);
X
X /* Insert overrides below this line! */


X
X return 0;
X }

X
-
-static int irtty_net_open( struct device *dev)
+static int irtty_net_open(struct device *dev)
X {
- ASSERT( dev != NULL, return -1;);
+ ASSERT(dev != NULL, return -1;);
X
X /* Ready to play! */
X dev->tbusy = 0;
@@ -729,7 +744,7 @@
X
X static int irtty_net_close(struct device *dev)
X {
- ASSERT( dev != NULL, return -1;);
+ ASSERT(dev != NULL, return -1;);
X
X /* Stop device */
X dev->tbusy = 1;
diff -u --recursive --new-file v2.2.6/linux/drivers/net/irda/pc87108.c linux/drivers/net/irda/pc87108.c
--- v2.2.6/linux/drivers/net/irda/pc87108.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/net/irda/pc87108.c Sat Apr 24 17:49:37 1999


@@ -6,7 +6,7 @@
X * Status: Experimental.

X * Author: Dag Brattli <da...@cs.uit.no>

X * Created at: Sat Nov 7 21:43:15 1998
- * Modified at: Sat Apr 3 15:54:47 1999
+ * Modified at: Tue Apr 20 11:11:39 1999


X * Modified by: Dag Brattli <da...@cs.uit.no>

X *
X * Copyright (c) 1998 Dag Brattli <da...@cs.uit.no>
@@ -734,10 +734,9 @@
X
X /* Decide if we should use PIO or DMA transfer */
X if ( idev->io.baudrate > 115200) {
- memcpy( idev->tx_buff.data, skb->data, skb->len);


+ idev->tx_buff.data = idev->tx_buff.head;

+ memcpy(idev->tx_buff.data, skb->data, skb->len);


X idev->tx_buff.len = skb->len;
- idev->tx_buff.head = idev->tx_buff.data;
- idev->tx_buff.offset = 0;

X
X mtt = irda_get_mtt( skb);
X if ( mtt > 50) {
@@ -767,11 +766,10 @@
X pc87108_dma_write( idev, iobase);
X }
X } else {
- idev->tx_buff.len = async_wrap_skb( skb, idev->tx_buff.data,
- idev->tx_buff.truesize);
+ idev->tx_buff.len = async_wrap_skb(skb, idev->tx_buff.data,
+ idev->tx_buff.truesize);


X
- idev->tx_buff.offset = 0;
- idev->tx_buff.head = idev->tx_buff.data;

+ idev->tx_buff.data = idev->tx_buff.head;
X

X /* Add interrupt on tx low level (will fire immediately) */

X switch_bank( iobase, BANK0);
@@ -945,8 +943,7 @@


X
X /* driver->media_busy = FALSE; */
X idev->io.direction = IO_RECV;

SHAR_EOF
true || echo 'restore of patch-2.2.7 failed'
fi

echo 'End of part 03'
echo 'File patch-2.2.7 is continued in part 04'
echo 04 > _shar_seq_.tmp

Thomas...@ciw.uni-karlsruhe.de

unread,
May 1, 1999, 3:00:00 AM5/1/99
to
Archive-name: v2.2/patch-2.2.7/part06

#!/bin/sh
# this is part 06 of a 22 - part archive


# do not concatenate these parts, unpack them in order with /bin/sh
# file patch-2.2.7 continued
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck

if test "$Scheck" != 06; then


echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping patch-2.2.7'
else
echo 'x - continuing with patch-2.2.7'
sed 's/^X//' << 'SHAR_EOF' >> 'patch-2.2.7' &&

+ if (!rrpriv->info){
+ kfree(rrpriv->rx_ctrl);
+ ecode = -ENOMEM;
+ goto error;
+ }
+ memset(rrpriv->rx_ctrl, 0, 256 * sizeof(struct ring_ctrl));
+ memset(rrpriv->info, 0, sizeof(struct rr_info));
+ mb();
+
+ spin_lock_irqsave(&rrpriv->lock, flags);
+ writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, &regs->HostCtrl);
+ spin_unlock_irqrestore(&rrpriv->lock, flags);
X
X if (request_irq(dev->irq, rr_interrupt, SA_SHIRQ, rrpriv->name, dev))
X {
X printk(KERN_WARNING "%s: Requested IRQ %d is busy\n",
X dev->name, dev->irq);
- return -EAGAIN;
+ ecode = -EAGAIN;
+ goto error;
X }
X
- rrpriv->rx_ctrl = kmalloc(256*sizeof(struct ring_ctrl),
- GFP_KERNEL | GFP_DMA);
- rrpriv->info = kmalloc(sizeof(struct rr_info), GFP_KERNEL | GFP_DMA);
-
X rr_init1(dev);
X

X dev->tbusy = 0;

-#if 0


- dev->interrupt = 0;

-#endif


X dev->start = 1;
X

X MOD_INC_USE_COUNT;
X return 0;
+
+ error:
+ spin_lock_irqsave(&rrpriv->lock, flags);
+ writel(readl(&regs->HostCtrl)|HALT_NIC|RR_CLEAR_INT, &regs->HostCtrl);
+ spin_unlock_irqrestore(&rrpriv->lock, flags);
+
+ dev->tbusy = 1;
+ dev->start = 0;
+ return -ENOMEM;
X }
X
X
@@ -965,12 +1009,13 @@
X printk("%s: dumping NIC TX rings\n", dev->name);
X
X printk("RxPrd %08x, TxPrd %02x, EvtPrd %08x, TxPi %02x, TxCtrlPi %02x\n",
- regs->RxPrd, regs->TxPrd, regs->EvtPrd, regs->TxPi,
+ readl(&regs->RxPrd), readl(&regs->TxPrd),
+ readl(&regs->EvtPrd), readl(&regs->TxPi),
X rrpriv->info->tx_ctrl.pi);
X
- printk("Error code 0x%x\n", regs->Fail1);
+ printk("Error code 0x%x\n", readl(&regs->Fail1));
X
- index = (((regs->EvtPrd >> 8) & 0xff ) - 1) % EVT_RING_ENTRIES;
+ index = (((readl(&regs->EvtPrd) >> 8) & 0xff ) - 1) % EVT_RING_ENTRIES;
X cons = rrpriv->dirty_tx;
X printk("TX ring index %i, TX consumer %i\n",
X index, cons);
@@ -989,12 +1034,12 @@
X if (rrpriv->tx_skbuff[cons]){
X len = min(0x80, rrpriv->tx_skbuff[cons]->len);
X printk("skbuff for cons %i is valid - dumping data (0x%x bytes - skbuff len 0x%x)\n", cons, len, rrpriv->tx_skbuff[cons]->len);
- printk("mode 0x%x, size 0x%x,\n phys %08x (virt %08x), skbuff-addr %08x, truesize 0x%x\n",
+ printk("mode 0x%x, size 0x%x,\n phys %08x (virt %08lx), skbuff-addr %08lx, truesize 0x%x\n",
X rrpriv->tx_ring[cons].mode,
X rrpriv->tx_ring[cons].size,
- rrpriv->tx_ring[cons].addr,
- (unsigned int)bus_to_virt(rrpriv->tx_ring[cons].addr),
- (unsigned int)rrpriv->tx_skbuff[cons]->data,
+ rrpriv->tx_ring[cons].addr.addrlo,
+ (unsigned long)bus_to_virt(rrpriv->tx_ring[cons].addr.addrlo),
+ (unsigned long)rrpriv->tx_skbuff[cons]->data,
X (unsigned int)rrpriv->tx_skbuff[cons]->truesize);
X for (i = 0; i < len; i++){
X if (!(i & 7))
@@ -1009,7 +1054,7 @@
X printk("mode 0x%x, size 0x%x, phys-addr %08x\n",
X rrpriv->tx_ring[i].mode,
X rrpriv->tx_ring[i].size,
- rrpriv->tx_ring[i].addr);
+ rrpriv->tx_ring[i].addr.addrlo);
X
X }
X
@@ -1033,24 +1078,26 @@
X */
X spin_lock(&rrpriv->lock);
X
- tmp = regs->HostCtrl;
+ tmp = readl(&regs->HostCtrl);
X if (tmp & NIC_HALTED){
X printk("%s: NIC already halted\n", dev->name);
X rr_dump(dev);
- }else
- tmp |= HALT_NIC;
- regs->HostCtrl = tmp;
+ }else{
+ tmp |= HALT_NIC | RR_CLEAR_INT;
+ writel(tmp, &regs->HostCtrl);
+ mb();
+ }
X
X rrpriv->fw_running = 0;
X
- regs->TxPi = 0;
- regs->IpRxPi = 0;
+ writel(0, &regs->TxPi);
+ writel(0, &regs->IpRxPi);
X
- regs->EvtCon = 0;
- regs->EvtPrd = 0;
+ writel(0, &regs->EvtCon);
+ writel(0, &regs->EvtPrd);
X
X for (i = 0; i < CMD_RING_ENTRIES; i++)
- regs->CmdRing[i] = 0;
+ writel(0, &regs->CmdRing[i]);
X
X rrpriv->info->tx_ctrl.entries = 0;
X rrpriv->info->cmd_ctrl.pi = 0;
@@ -1060,7 +1107,7 @@
X for (i = 0; i < TX_RING_ENTRIES; i++) {
X if (rrpriv->tx_skbuff[i]) {
X rrpriv->tx_ring[i].size = 0;
- rrpriv->tx_ring[i].addr = 0;
+ set_rraddr(&rrpriv->tx_ring[i].addr, 0);
X dev_kfree_skb(rrpriv->tx_skbuff[i]);
X }
X }
@@ -1068,7 +1115,7 @@
X for (i = 0; i < RX_RING_ENTRIES; i++) {
X if (rrpriv->rx_skbuff[i]) {
X rrpriv->rx_ring[i].size = 0;
- rrpriv->rx_ring[i].addr = 0;
+ set_rraddr(&rrpriv->rx_ring[i].addr, 0);
X dev_kfree_skb(rrpriv->rx_skbuff[i]);
X }
X }
@@ -1094,6 +1141,10 @@
X u32 *ifield;
X struct sk_buff *new_skb;
X
+ if (readl(&regs->Mode) & FATAL_ERR)
+ printk("error codes Fail1 %02x, Fail2 %02x\n",
+ readl(&regs->Fail1), readl(&regs->Fail2));
+
X /*
X * We probably need to deal with tbusy here to prevent overruns.
X */
@@ -1128,11 +1179,11 @@
X index = txctrl->pi;
X
X rrpriv->tx_skbuff[index] = skb;
- rrpriv->tx_ring[index].addr = virt_to_bus(skb->data);
+ set_rraddr(&rrpriv->tx_ring[index].addr, skb->data);
X rrpriv->tx_ring[index].size = len + 8; /* include IFIELD */
X rrpriv->tx_ring[index].mode = PACKET_START | PACKET_END;
X txctrl->pi = (index + 1) % TX_RING_ENTRIES;
- regs->TxPi = txctrl->pi;
+ writel(txctrl->pi, &regs->TxPi);
X
X if (txctrl->pi == rrpriv->dirty_tx){
X rrpriv->tx_full = 1;
@@ -1167,8 +1218,9 @@
X {
X struct rr_private *rrpriv;
X struct rr_regs *regs;
+ unsigned long eptr, segptr;
X int i, j;
- u32 localctrl, eptr, sptr, segptr, len, tmp;
+ u32 localctrl, sptr, len, tmp;
X u32 p2len, p2size, nr_seg, revision, io, sram_size;
X struct eeprom *hw = NULL;
X
@@ -1178,40 +1230,44 @@
X if (dev->flags & IFF_UP)
X return -EBUSY;
X
- if (!(regs->HostCtrl & NIC_HALTED)){
+ if (!(readl(&regs->HostCtrl) & NIC_HALTED)){
X printk("%s: Trying to load firmware to a running NIC.\n",
X dev->name);
X return -EBUSY;
X }
X
- localctrl = regs->LocalCtrl;
- regs->LocalCtrl = 0;
+ localctrl = readl(&regs->LocalCtrl);
+ writel(0, &regs->LocalCtrl);
X
- regs->EvtPrd = 0;
- regs->RxPrd = 0;
- regs->TxPrd = 0;
+ writel(0, &regs->EvtPrd);
+ writel(0, &regs->RxPrd);
+ writel(0, &regs->TxPrd);
X
X /*
X * First wipe the entire SRAM, otherwise we might run into all
X * kinds of trouble ... sigh, this took almost all afternoon
X * to track down ;-(
X */
- io = regs->ExtIo;
- regs->ExtIo = 0;
- sram_size = read_eeprom_word(rrpriv, (void *)8);
+ io = readl(&regs->ExtIo);
+ writel(0, &regs->ExtIo);
+ sram_size = rr_read_eeprom_word(rrpriv, (void *)8);
X
X for (i = 200; i < sram_size / 4; i++){
- regs->WinBase = i * 4;
- regs->WinData = 0;
+ writel(i * 4, &regs->WinBase);
+ mb();
+ writel(0, &regs->WinData);
+ mb();
X }
- regs->ExtIo = io;
+ writel(io, &regs->ExtIo);
+ mb();
X
- eptr = read_eeprom_word(rrpriv, &hw->rncd_info.AddrRunCodeSegs);
+ eptr = (unsigned long)rr_read_eeprom_word(rrpriv,
+ &hw->rncd_info.AddrRunCodeSegs);
X eptr = ((eptr & 0x1fffff) >> 3);
X
- p2len = read_eeprom_word(rrpriv, (void *)(0x83*4));
+ p2len = rr_read_eeprom_word(rrpriv, (void *)(0x83*4));
X p2len = (p2len << 2);
- p2size = read_eeprom_word(rrpriv, (void *)(0x84*4));
+ p2size = rr_read_eeprom_word(rrpriv, (void *)(0x84*4));
X p2size = ((p2size & 0x1fffff) >> 3);
X
X if ((eptr < p2size) || (eptr > (p2size + p2len))){
@@ -1219,7 +1275,7 @@
X goto out;
X }
X
- revision = read_eeprom_word(rrpriv, &hw->manf.HeaderFmt);
+ revision = rr_read_eeprom_word(rrpriv, &hw->manf.HeaderFmt);
X
X if (revision != 1){
X printk("%s: invalid firmware format (%i)\n",
@@ -1227,18 +1283,18 @@
X goto out;
X }
X
- nr_seg = read_eeprom_word(rrpriv, (void *)eptr);
+ nr_seg = rr_read_eeprom_word(rrpriv, (void *)eptr);
X eptr +=4;
X #if (DEBUG > 1)
X printk("%s: nr_seg %i\n", dev->name, nr_seg);
X #endif
X
X for (i = 0; i < nr_seg; i++){
- sptr = read_eeprom_word(rrpriv, (void *)eptr);
+ sptr = rr_read_eeprom_word(rrpriv, (void *)eptr);
X eptr += 4;
- len = read_eeprom_word(rrpriv, (void *)eptr);
+ len = rr_read_eeprom_word(rrpriv, (void *)eptr);
X eptr += 4;
- segptr = read_eeprom_word(rrpriv, (void *)eptr);
+ segptr = (unsigned long)rr_read_eeprom_word(rrpriv, (void *)eptr);
X segptr = ((segptr & 0x1fffff) >> 3);
X eptr += 4;
X #if (DEBUG > 1)
@@ -1246,16 +1302,19 @@
X dev->name, i, sptr, len, segptr);
X #endif
X for (j = 0; j < len; j++){
- tmp = read_eeprom_word(rrpriv, (void *)segptr);
- regs->WinBase = sptr;
- regs->WinData = tmp;
+ tmp = rr_read_eeprom_word(rrpriv, (void *)segptr);
+ writel(sptr, &regs->WinBase);
+ mb();
+ writel(tmp, &regs->WinData);
+ mb();
X segptr += 4;
X sptr += 4;
X }
X }
X
X out:
- regs->LocalCtrl = localctrl;
+ writel(localctrl, &regs->LocalCtrl);
+ mb();


X return 0;
X }
X

@@ -1291,7 +1350,7 @@
X error = -ENOMEM;
X goto out;
X }
- i = read_eeprom(rrpriv, 0, image, EEPROM_BYTES);
+ i = rr_read_eeprom(rrpriv, 0, image, EEPROM_BYTES);
X if (i != EEPROM_BYTES){
X kfree(image);
X printk(KERN_ERR "%s: Error reading EEPROM\n",
@@ -1325,7 +1384,7 @@
X }
X
X oldimage = kmalloc(EEPROM_WORDS * sizeof(u32), GFP_KERNEL);
- if (!image){
+ if (!oldimage){
X printk(KERN_ERR "%s: Unable to allocate memory "
X "for old EEPROM image\n", dev->name);
X error = -ENOMEM;
@@ -1343,7 +1402,7 @@
X printk(KERN_ERR "%s: Error writing EEPROM\n",
X dev->name);
X
- i = read_eeprom(rrpriv, 0, oldimage, EEPROM_BYTES);
+ i = rr_read_eeprom(rrpriv, 0, oldimage, EEPROM_BYTES);
X if (i != EEPROM_BYTES)
X printk(KERN_ERR "%s: Error reading back EEPROM "
X "image\n", dev->name);
@@ -1354,7 +1413,6 @@
X dev->name);
X error = -EFAULT;
X }
-
X kfree(image);
X kfree(oldimage);
X break;
@@ -1374,6 +1432,6 @@
X
X /*
X * Local variables:
- * compile-command: "gcc -D__SMP__ -D__KERNEL__ -I../../include -Wall -Wstrict-prototypes -O2 -pipe -fomit-frame-pointer -fno-strength-reduce -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=686 -c rrunner.c"
+ * compile-command: "gcc -D__SMP__ -D__KERNEL__ -I../../include -Wall -Wstrict-prototypes -O2 -pipe -fomit-frame-pointer -fno-strength-reduce -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=686 -DMODULE -DMODVERSIONS -include ../../include/linux/modversions.h -c rrunner.c"
X * End:
X */
diff -u --recursive --new-file v2.2.6/linux/drivers/net/rrunner.h linux/drivers/net/rrunner.h
--- v2.2.6/linux/drivers/net/rrunner.h Tue Dec 22 14:16:56 1998
+++ linux/drivers/net/rrunner.h Sat Apr 24 17:51:48 1999
@@ -278,7 +278,6 @@
X #define TRACE_ON_WHAT_BIT 0x00020000 /* Traces on */
X #define ONEM_BUF_WHAT_BIT 0x00040000 /* 1Meg vs 256K */
X #define CHAR_API_WHAT_BIT 0x00080000 /* Char API vs network only */
-#define MS_DOS_WHAT_BIT 0x00100000 /* MS_DOS */
X #define CMD_EVT_WHAT_BIT 0x00200000 /* Command event */
X #define LONG_TX_WHAT_BIT 0x00400000
X #define LONG_RX_WHAT_BIT 0x00800000
@@ -486,6 +485,63 @@
X #define SAME_IFIELD 0x80
X
X
+typedef struct {
+#if (BITS_PER_LONG == 64)
+ u64 addrlo;
+#else
+ u32 addrhi;
+ u32 addrlo;
+#endif
+} rraddr;
+
+
+static inline void set_rraddr(rraddr *ra, volatile void *addr)
+{
+ unsigned long baddr = virt_to_bus((void *)addr);
+#if (BITS_PER_LONG == 64)
+ ra->addrlo = baddr;
+#else
+ /* Don't bother setting zero every time */
+ ra->addrlo = baddr;
+#endif
+ mb();
+}
+
+
+static inline void set_rxaddr(struct rr_regs *regs, volatile void *addr)
+{
+ unsigned long baddr = virt_to_bus((void *)addr);
+#if (BITS_PER_LONG == 64) && defined(__LITTLE_ENDIAN)
+ writel(baddr & 0xffffffff, &regs->RxRingHi);
+ writel(baddr >> 32, &regs->RxRingLo);
+#elif (BITS_PER_LONG == 64)
+ writel(baddr >> 32, &regs->RxRingHi);
+ writel(baddr & 0xffffffff, &regs->RxRingLo);
+#else
+ writel(0, &regs->RxRingHi);
+ writel(baddr, &regs->RxRingLo);
+#endif
+ mb();
+}
+
+
+static inline void set_infoaddr(struct rr_regs *regs, volatile void *addr)
+{
+ unsigned long baddr = virt_to_bus((void *)addr);
+#if (BITS_PER_LONG == 64) && defined(__LITTLE_ENDIAN)
+ writel(baddr & 0xffffffff, &regs->InfoPtrHi);
+ writel(baddr >> 32, &regs->InfoPtrLo);
+#elif (BITS_PER_LONG == 64)
+ writel(baddr >> 32, &regs->InfoPtrHi);
+ writel(baddr & 0xffffffff, &regs->InfoPtrLo);
+#else
+ writel(0, &regs->InfoPtrHi);
+ writel(baddr, &regs->InfoPtrLo);
+#endif
+ mb();
+}
+
+
X /*
X * TX ring
X */
@@ -498,12 +554,7 @@
X #define TX_RING_SIZE (TX_RING_ENTRIES * sizeof(struct tx_desc))
X
X struct tx_desc{
-#if (BITS_PER_LONG == 64)
- u64 addr;
-#else
- u32 zero;
- u32 addr;
-#endif
+ rraddr addr;
X u32 res;
X #ifdef __LITTLE_ENDIAN
X u16 size;
@@ -525,12 +576,7 @@
X #define RX_RING_SIZE (RX_RING_ENTRIES * sizeof(struct rx_desc))
X
X struct rx_desc{
-#if (BITS_PER_LONG == 64)
- u64 addr;
-#else
- u32 zero;
- u32 addr;
-#endif
+ rraddr addr;
X u32 res;
X #ifdef __LITTLE_ENDIAN
X u16 size;
@@ -714,12 +760,7 @@
X * This struct is shared with the NIC firmware.
X */
X struct ring_ctrl {
-#if (BITS_PER_LONG == 64)
- u64 rngptr;
-#else
- u32 zero;
- u32 rngptr;
-#endif
+ rraddr rngptr;
X #ifdef __LITTLE_ENDIAN
X u16 entries;
X u8 pad;
@@ -759,19 +800,19 @@
X struct rx_desc rx_ring[RX_RING_ENTRIES];
X struct tx_desc tx_ring[TX_RING_ENTRIES];
X struct event evt_ring[EVT_RING_ENTRIES];
- struct sk_buff *tx_skbuff[TX_RING_ENTRIES];
X struct sk_buff *rx_skbuff[RX_RING_ENTRIES];
+ struct sk_buff *tx_skbuff[TX_RING_ENTRIES];
X struct rr_regs *regs; /* Register base */
X struct ring_ctrl *rx_ctrl; /* Receive ring control */
X struct rr_info *info; /* Shared info page */
+ struct device *next;
X spinlock_t lock;
X struct timer_list timer;
X u32 cur_rx, cur_cmd, cur_evt;
X u32 dirty_rx, dirty_tx;
X u32 tx_full;
+ u32 fw_rev;
X short fw_running;
- u8 pci_bus; /* PCI bus number */
- u8 pci_dev_fun; /* PCI device numbers */
X char name[24]; /* The assigned name */
X struct net_device_stats stats;
X };
@@ -789,5 +830,11 @@
X static int rr_close(struct device *dev);
X static struct net_device_stats *rr_get_stats(struct device *dev);
X static int rr_ioctl(struct device *dev, struct ifreq *rq, int cmd);
+static unsigned int rr_read_eeprom(struct rr_private *rrpriv,
+ unsigned long offset,
+ unsigned char *buf,
+ unsigned long length);
+static u32 rr_read_eeprom_word(struct rr_private *rrpriv, void * offset);
+static int rr_load_firmware(struct device *dev);
X
X #endif /* _RRUNNER_H_ */
diff -u --recursive --new-file v2.2.6/linux/drivers/net/z85230.c linux/drivers/net/z85230.c
--- v2.2.6/linux/drivers/net/z85230.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/net/z85230.c Sat Apr 24 17:51:48 1999
@@ -48,6 +48,7 @@
X #include <asm/spinlock.h>
X
X #include "z85230.h"
+#include "syncppp.h"
X
X
X static spinlock_t z8530_buffer_lock = SPIN_LOCK_UNLOCKED;
diff -u --recursive --new-file v2.2.6/linux/drivers/pci/oldproc.c linux/drivers/pci/oldproc.c
--- v2.2.6/linux/drivers/pci/oldproc.c Fri Apr 16 14:47:30 1999
+++ linux/drivers/pci/oldproc.c Wed Apr 21 09:28:49 1999
@@ -445,6 +445,7 @@
X DEVICE( 3DFX, 3DFX_VOODOO2, "Voodoo2"),
X DEVICE( 3DFX, 3DFX_BANSHEE, "Banshee"),
X DEVICE( SIGMADES, SIGMADES_6425, "REALmagic64/GX"),
+ DEVICE( AVM, AVM_A1, "A1 (Fritz)"),
X DEVICE( STALLION, STALLION_ECHPCI832,"EasyConnection 8/32"),
X DEVICE( STALLION, STALLION_ECHPCI864,"EasyConnection 8/64"),
X DEVICE( STALLION, STALLION_EIOPCI,"EasyIO"),
@@ -784,6 +785,7 @@
X case PCI_VENDOR_ID_O2: return "O2 Micro";
X case PCI_VENDOR_ID_3DFX: return "3Dfx";
X case PCI_VENDOR_ID_SIGMADES: return "Sigma Designs";
+ case PCI_VENDOR_ID_AVM: return "AVM";
X case PCI_VENDOR_ID_CCUBE: return "C-Cube";
X case PCI_VENDOR_ID_DIPIX: return "Dipix";
X case PCI_VENDOR_ID_STALLION: return "Stallion Technologies";
diff -u --recursive --new-file v2.2.6/linux/drivers/sbus/audio/audio.c linux/drivers/sbus/audio/audio.c
--- v2.2.6/linux/drivers/sbus/audio/audio.c Tue Mar 23 14:35:48 1999
+++ linux/drivers/sbus/audio/audio.c Thu Apr 22 19:24:51 1999
@@ -7,6 +7,7 @@
X *
X * Mixer code adapted from code contributed by and
X * Copyright (C) 1998 Michael Mraka (mic...@fi.muni.cz)
+ * and with fixes from Michael Shuey (sh...@ecn.purdue.edu)
X * The mixer code cheats; Sparc hardware doesn't generally allow independent
X * line control, and this fakes it badly.
X *
@@ -628,13 +629,12 @@
X #define MONO_DEVICES (SOUND_MASK_SPEAKER | SOUND_MASK_MIC)
X
X static int sparcaudio_mixer_ioctl(struct inode * inode, struct file * file,
- unsigned int cmd, unsigned long arg)
+ unsigned int cmd, unsigned int *arg)
X {
X struct sparcaudio_driver *drv = drivers[(MINOR(inode->i_rdev) >>
X SPARCAUDIO_DEVICE_SHIFT)];
- unsigned long i = 0, j = 0, k = 0;
-
- k = arg;
+ unsigned long i = 0, j = 0;
+ unsigned int k;
X
X if(cmd == SOUND_MIXER_INFO) {
X audio_device_t tmp;
@@ -663,6 +663,9 @@
X case SOUND_MIXER_WRITE_MIC:
X case SOUND_MIXER_WRITE_CD:
X case SOUND_MIXER_WRITE_LINE:
+ case SOUND_MIXER_WRITE_IMIX:
+ if(get_user(k, arg))
+ return -EFAULT;
X tprintk(("setting input volume (0x%x)", k));
X if (drv->ops->get_input_channels)
X j = drv->ops->get_input_channels(drv);
@@ -692,6 +695,8 @@
X case SOUND_MIXER_WRITE_PCM:
X case SOUND_MIXER_WRITE_VOLUME:
X case SOUND_MIXER_WRITE_SPEAKER:
+ if(get_user(k, arg))
+ return -EFAULT;
X tprintk(("setting output volume (0x%x)", k));
X if (drv->ops->get_output_channels)
X j = drv->ops->get_output_channels(drv);
@@ -731,10 +736,13 @@
X case SOUND_MIXER_WRITE_RECSRC:
X if (!drv->ops->set_input_port)
X return -EINVAL;
- if (arg & SOUND_MASK_IMIX) j |= AUDIO_ANALOG_LOOPBACK;
- if (arg & SOUND_MASK_CD) j |= AUDIO_CD;
- if (arg & SOUND_MASK_LINE) j |= AUDIO_LINE_IN;
- if (arg & SOUND_MASK_MIC) j |= AUDIO_MICROPHONE;
+ if(get_user(k, arg))
+ return -EFAULT;
+ /* only one should ever be selected */
+ if (k & SOUND_MASK_IMIX) j = AUDIO_ANALOG_LOOPBACK;
+ if (k & SOUND_MASK_CD) j = AUDIO_CD;
+ if (k & SOUND_MASK_LINE) j = AUDIO_LINE_IN;
+ if (k & SOUND_MASK_MIC) j = AUDIO_MICROPHONE;
X tprintk(("setting inport to %d\n", j));
X i = drv->ops->set_input_port(drv, j);
X
@@ -790,11 +798,12 @@
X j = drv->ops->get_output_balance(drv);
X i = b_to_s(i,j);
X }
- return COPY_OUT((int *)arg, i);
+ return COPY_OUT(arg, i);
X case SOUND_MIXER_READ_RECLEV:
X case SOUND_MIXER_READ_MIC:
X case SOUND_MIXER_READ_CD:
X case SOUND_MIXER_READ_LINE:
+ case SOUND_MIXER_READ_IMIX:
X if (drv->ops->get_input_channels)
X j = drv->ops->get_input_channels(drv);
X if (j == 1) {
@@ -808,7 +817,7 @@
X j = drv->ops->get_input_balance(drv);
X i = b_to_s(i,j);
X }
- return COPY_OUT((int *)arg, i);
+ return COPY_OUT(arg, i);
X default:
X return -EINVAL;
X }
@@ -862,7 +871,7 @@
X
X switch (minor & 0xf) {
X case SPARCAUDIO_MIXER_MINOR:
- return sparcaudio_mixer_ioctl(inode, file, cmd, arg);
+ return sparcaudio_mixer_ioctl(inode, file, cmd, (unsigned int *)arg);
X case SPARCAUDIO_DSP16_MINOR:
X case SPARCAUDIO_DSP_MINOR:
X case SPARCAUDIO_AUDIO_MINOR:
diff -u --recursive --new-file v2.2.6/linux/drivers/sbus/audio/cs4231.c linux/drivers/sbus/audio/cs4231.c
--- v2.2.6/linux/drivers/sbus/audio/cs4231.c Tue Mar 23 14:35:48 1999
+++ linux/drivers/sbus/audio/cs4231.c Wed Apr 28 08:47:39 1999
@@ -73,6 +73,7 @@
X static int cs4231_recintr(struct sparcaudio_driver *drv);
X static int cs4231_output_muted(struct sparcaudio_driver *drv, int value);
X static void cs4231_pollinput(struct sparcaudio_driver *drv);
+static void eb4231_pollinput(struct sparcaudio_driver *drv);
X static int cs4231_length_to_samplecount(struct audio_prinfo *thisdir,
X unsigned int length);
X static void cs4231_getsamplecount(struct sparcaudio_driver *drv,
@@ -92,8 +93,8 @@
X tprintk(("enabling interrupts\n"));
X save_flags(flags);
X cli();
- cs4231_chip->regs->iar = 0xa;
- cs4231_chip->regs->idr = INTR_ON;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0xa);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), INTR_ON);
X restore_flags(flags);
X
X cs4231_chip->status |= CS_STATUS_INTS_ON;
@@ -111,8 +112,8 @@
X tprintk(("disabling interrupts\n"));
X save_flags(flags);
X cli();
- cs4231_chip->regs->iar = 0xa;
- cs4231_chip->regs->idr = INTR_OFF;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0xa);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), INTR_OFF);
X restore_flags(flags);
X
X cs4231_chip->status &= ~CS_STATUS_INTS_ON;
@@ -127,8 +128,9 @@
X save_flags(flags);
X cli();
X
- cs4231_chip->regs->iar = 0x9;
- cs4231_chip->regs->idr |= PEN_ENABLE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x9);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) | PEN_ENABLE));
X restore_flags(flags);
X }
X
@@ -140,8 +142,9 @@
X tprintk(("disabling play\n"));
X save_flags(flags);
X cli();
- cs4231_chip->regs->iar = 0x9;
- cs4231_chip->regs->idr &= PEN_DISABLE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x9);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) & PEN_DISABLE));
X restore_flags(flags);
X }
X
@@ -153,8 +156,9 @@
X tprintk(("enabling rec\n"));
X save_flags(flags);
X cli();
- cs4231_chip->regs->iar = 0x9;
- cs4231_chip->regs->idr |= CEN_ENABLE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x9);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) | CEN_ENABLE));
X restore_flags(flags);
X }
X
@@ -166,64 +170,68 @@
X tprintk(("disabling rec\n"));
X save_flags(flags);
X cli();
- cs4231_chip->regs->iar = 0x9;
- cs4231_chip->regs->idr &= CEN_DISABLE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x9);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) & CEN_DISABLE));
X restore_flags(flags);
X }
X
+static struct cs4231_rates {
+ int speed, bits;
+} cs4231_rate_table[] = {
+ { 5512, CS4231_DFR_5512 },
+ { 6615, CS4231_DFR_6615 },
+ { 8000, CS4231_DFR_8000 },
+ { 9600, CS4231_DFR_9600 },
+ { 11025, CS4231_DFR_11025 },
+ { 16000, CS4231_DFR_16000 },
+ { 18900, CS4231_DFR_18900 },
+ { 22050, CS4231_DFR_22050 },
+ { 27429, CS4231_DFR_27429 },
+ { 32000, CS4231_DFR_32000 },
+ { 33075, CS4231_DFR_33075 },
+ { 37800, CS4231_DFR_37800 },
+ { 44100, CS4231_DFR_44100 },
+ { 48000, CS4231_DFR_48000 }
+};
+
+#define NUM_RATES (sizeof(cs4231_rate_table) / sizeof(struct cs4231_rates))
+
X static int
-cs4231_rate_to_bits(struct sparcaudio_driver *drv, int value)
+cs4231_rate_to_bits(struct sparcaudio_driver *drv, int *value)
X {
- int set_bits;
+ struct cs4231_rates *p = &cs4231_rate_table[0];
+ int i, wanted = *value;
X
- switch (value) {
- case 5512:
- set_bits = CS4231_DFR_5512;
- break;
- case 6615:
- set_bits = CS4231_DFR_6615;
- break;
- case 8000:
- set_bits = CS4231_DFR_8000;
- break;
- case 9600:
- set_bits = CS4231_DFR_9600;
- break;
- case 11025:
- set_bits = CS4231_DFR_11025;
- break;
- case 16000:
- set_bits = CS4231_DFR_16000;
- break;
- case 18900:
- set_bits = CS4231_DFR_18900;
- break;
- case 22050:
- set_bits = CS4231_DFR_22050;
- break;
- case 27429:
- set_bits = CS4231_DFR_27429;
- break;
- case 32000:
- set_bits = CS4231_DFR_32000;
- break;
- case 33075:
- set_bits = CS4231_DFR_33075;
- break;
- case 37800:
- set_bits = CS4231_DFR_37800;
- break;
- case 44100:
- set_bits = CS4231_DFR_44100;
- break;
- case 48000:
- set_bits = CS4231_DFR_48000;
- break;
- default:
- set_bits = -(EINVAL);
- break;
+ /* We try to be nice and approximate what the user asks for. */
+ if(wanted < 5512)
+ wanted = 5512;
+ if(wanted > 48000)
+ wanted = 48000;
+
+ for(i = 0; i < NUM_RATES; i++, p++) {
+ /* Exact match? */
+ if(wanted == p->speed)
+ break;
+
+ /* If we're inbetween two entries, and neither is exact,
+ * pick the closest one.
+ */
+ if(wanted == p[1].speed)
+ continue;
+ if(wanted > p->speed &&
+ wanted < p[1].speed) {
+ int diff1, diff2;
+
+ diff1 = wanted - p->speed;
+ diff2 = p[1].speed - wanted;
+ if(diff2 < diff1)
+ p++;
+ break;
+ }
X }
- return set_bits;
+ *value = p->speed;
+ return p->bits;


X }
X
X static int

@@ -268,9 +276,14 @@
X if (value != 0) {
X set_bits = cs4231_encoding_to_bits(drv, value);
X if (set_bits >= 0) {
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x8;
- tmp_bits = cs4231_chip->regs->idr;
- cs4231_chip->regs->idr = CHANGE_ENCODING(tmp_bits, set_bits);
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x8);
+ tmp_bits = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ CHANGE_ENCODING(tmp_bits, set_bits));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
X
X CHIP_READY
X
@@ -298,9 +311,14 @@
X if (value != 0) {
X set_bits = cs4231_encoding_to_bits(drv, value);
X if (set_bits >= 0) {
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x1c;
- tmp_bits = cs4231_chip->regs->idr;
- cs4231_chip->regs->idr = CHANGE_ENCODING(tmp_bits, set_bits);
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x1c);
+ tmp_bits = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ CHANGE_ENCODING(tmp_bits, set_bits));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
X
X CHIP_READY
X
@@ -326,15 +344,22 @@
X
X tprintk(("output rate %d\n", value));
X if (value != 0) {
- set_bits = cs4231_rate_to_bits(drv, value);
+ set_bits = cs4231_rate_to_bits(drv, &value);
X if (set_bits >= 0) {
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x8;
- tmp_bits = cs4231_chip->regs->idr;
- cs4231_chip->regs->idr = CHANGE_DFR(tmp_bits, set_bits);
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x8);
+ tmp_bits = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ CHANGE_DFR(tmp_bits, set_bits));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
X
X CHIP_READY
X
X cs4231_chip->perchip_info.play.sample_rate = value;
+ tprintk(("tmp_bits[%02x] set_bits[%02x] CHANGE_DFR[%02x]\n",
+ tmp_bits, set_bits, CHANGE_DFR(tmp_bits, set_bits)));


X return 0;
X }
X }

@@ -356,11 +381,16 @@
X
X tprintk(("input rate %d\n", value));
X if (value != 0) {
- set_bits = cs4231_rate_to_bits(drv, value);
+ set_bits = cs4231_rate_to_bits(drv, &value);
X if (set_bits >= 0) {
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x1c;
- tmp_bits = cs4231_chip->regs->idr;
- cs4231_chip->regs->idr = CHANGE_DFR(tmp_bits, set_bits);
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x1c);
+ tmp_bits = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ CHANGE_DFR(tmp_bits, set_bits));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
X
X CHIP_READY
X
@@ -390,10 +420,10 @@
X tmp_bits = cs4231_chip->regs->idr;
X switch (value) {
X case 1:
- cs4231_chip->regs->idr = CS4231_MONO_ON(tmp_bits);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), CS4231_MONO_ON(tmp_bits));
X break;
X case 2:
- cs4231_chip->regs->idr = CS4231_STEREO_ON(tmp_bits);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), CS4231_STEREO_ON(tmp_bits));
X break;
X default:
X dprintk(("input chan failed\n"));
@@ -420,14 +450,14 @@
X int tmp_bits;
X
X tprintk(("output channels %d\n", value));
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x8;
- tmp_bits = cs4231_chip->regs->idr;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x8);
+ tmp_bits = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
X switch (value) {
X case 1:
- cs4231_chip->regs->idr = CS4231_MONO_ON(tmp_bits);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), CS4231_MONO_ON(tmp_bits));
X break;
X case 2:
- cs4231_chip->regs->idr = CS4231_STEREO_ON(tmp_bits);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), CS4231_STEREO_ON(tmp_bits));
X break;
X default:
X dprintk(("output chan failed\n"));
@@ -483,14 +513,16 @@
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
X unsigned int x = 0;
X
- cs4231_chip->regs->iar = IAR_AUTOCAL_END;
- while (cs4231_chip->regs->idr == IAR_NOT_READY && x <= CS_TIMEOUT) {
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_END);
+ while (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) == IAR_NOT_READY &&
+ x <= CS_TIMEOUT) {
X x++;
X }
X
X x = 0;
- cs4231_chip->regs->iar = 0x0b;
- while (cs4231_chip->regs->idr == AUTOCAL_IN_PROGRESS && x <= CS_TIMEOUT) {
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0b);
+ while (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) == AUTOCAL_IN_PROGRESS &&
+ x <= CS_TIMEOUT) {
X x++;
X }
X }
@@ -501,16 +533,20 @@
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
X tprintk(("in cs4231_output_muted: %d\n", value));
X if (!value) {
- cs4231_chip->regs->iar = 0x7;
- cs4231_chip->regs->idr &= OUTCR_UNMUTE;
- cs4231_chip->regs->iar = 0x6;
- cs4231_chip->regs->idr &= OUTCR_UNMUTE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x7);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) & OUTCR_UNMUTE));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x6);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) & OUTCR_UNMUTE));
X cs4231_chip->perchip_info.output_muted = 0;
X } else {
- cs4231_chip->regs->iar = 0x7;
- cs4231_chip->regs->idr |= OUTCR_MUTE;
- cs4231_chip->regs->iar = 0x6;
- cs4231_chip->regs->idr |= OUTCR_MUTE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x7);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) | OUTCR_MUTE));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x6);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) | OUTCR_MUTE));
X cs4231_chip->perchip_info.output_muted = 1;
X }
X return 0;
@@ -555,27 +591,33 @@
X /* Aaaaaah! It's all coming so fast! Turn it all off, then selectively
X * enable things.
X */
- cs4231_chip->regs->iar = 0x1a;
- cs4231_chip->regs->idr |= MONO_IOCR_MUTE;
- cs4231_chip->regs->iar = 0x0a;
- cs4231_chip->regs->idr |= PINCR_LINE_MUTE;
- cs4231_chip->regs->idr |= PINCR_HDPH_MUTE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x1a);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) | MONO_IOCR_MUTE));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0a);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) | PINCR_LINE_MUTE));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) | PINCR_HDPH_MUTE));
X
X if (value & AUDIO_SPEAKER) {
- cs4231_chip->regs->iar = 0x1a;
- cs4231_chip->regs->idr &= ~MONO_IOCR_MUTE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x1a);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) & ~MONO_IOCR_MUTE));
X retval |= AUDIO_SPEAKER;
X }
X
X if (value & AUDIO_HEADPHONE) {
- cs4231_chip->regs->iar = 0x0a;
- cs4231_chip->regs->idr &= ~PINCR_HDPH_MUTE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0a);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) & ~PINCR_HDPH_MUTE));
X retval |= AUDIO_HEADPHONE;
X }
X
X if (value & AUDIO_LINE_OUT) {
- cs4231_chip->regs->iar = 0x0a;
- cs4231_chip->regs->idr &= ~PINCR_LINE_MUTE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0a);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) & ~PINCR_LINE_MUTE));
X retval |= AUDIO_LINE_OUT;
X }
X
@@ -605,32 +647,40 @@
X
X /* Ultra systems do not support AUDIO_INTERNAL_CD_IN */
X /* This apparently applies only to APC ultras, not ebus ultras */
- if (!cs4231_chip->status & CS_STATUS_IS_ULTRA) {
+ if (!(cs4231_chip->status & CS_STATUS_IS_ULTRA)) {
X if (value & AUDIO_INTERNAL_CD_IN) {
- cs4231_chip->regs->iar = 0x1;
- cs4231_chip->regs->idr = CDROM_ENABLE(cs4231_chip->regs->idr);
- cs4231_chip->regs->iar = 0x0;
- cs4231_chip->regs->idr = CDROM_ENABLE(cs4231_chip->regs->idr);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x1);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ CDROM_ENABLE(CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr))));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ CDROM_ENABLE(CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr))));
X retval = AUDIO_INTERNAL_CD_IN;
X }
X }
X if ((value & AUDIO_LINE_IN)) {
- cs4231_chip->regs->iar = 0x1;
- cs4231_chip->regs->idr = LINE_ENABLE(cs4231_chip->regs->idr);
- cs4231_chip->regs->iar = 0x0;
- cs4231_chip->regs->idr = LINE_ENABLE(cs4231_chip->regs->idr);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x1);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ LINE_ENABLE(CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr))));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ LINE_ENABLE(CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr))));
X retval = AUDIO_LINE_IN;
X } else if (value & AUDIO_MICROPHONE) {
- cs4231_chip->regs->iar = 0x1;
- cs4231_chip->regs->idr = MIC_ENABLE(cs4231_chip->regs->idr);
- cs4231_chip->regs->iar = 0x0;
- cs4231_chip->regs->idr = MIC_ENABLE(cs4231_chip->regs->idr);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x1);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ MIC_ENABLE(CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr))));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ MIC_ENABLE(CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr))));
X retval = AUDIO_MICROPHONE;
X } else if (value & AUDIO_ANALOG_LOOPBACK) {
- cs4231_chip->regs->iar = 0x1;
- cs4231_chip->regs->idr = OUTPUTLOOP_ENABLE(cs4231_chip->regs->idr);
- cs4231_chip->regs->iar = 0x0;
- cs4231_chip->regs->idr = OUTPUTLOOP_ENABLE(cs4231_chip->regs->idr);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x1);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ OUTPUTLOOP_ENABLE(CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr))));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ OUTPUTLOOP_ENABLE(CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr))));
X retval = AUDIO_ANALOG_LOOPBACK;
X }
X
@@ -659,18 +709,19 @@
X a = CS4231_MON_MAX_ATEN - (value * (CS4231_MON_MAX_ATEN + 1) /
X (AUDIO_MAX_GAIN + 1));
X
- cs4231_chip->regs->iar = 0x0d;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0d);
X if (a >= CS4231_MON_MAX_ATEN)
- cs4231_chip->regs->idr = LOOPB_OFF;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), LOOPB_OFF);
X else
- cs4231_chip->regs->idr = ((a << 2) | LOOPB_ON);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), ((a << 2) | LOOPB_ON));
X
X if (value == AUDIO_MAX_GAIN)
- cs4231_chip->perchip_info.monitor_gain = AUDIO_MAX_GAIN;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->perchip_info.monitor_gain), AUDIO_MAX_GAIN);
X else
- cs4231_chip->perchip_info.monitor_gain = ((CS4231_MAX_DEV_ATEN - a) *
- (AUDIO_MAX_GAIN + 1) /
- (CS4231_MAX_DEV_ATEN + 1));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->perchip_info.monitor_gain),
+ ((CS4231_MAX_DEV_ATEN - a) *
+ (AUDIO_MAX_GAIN + 1) /
+ (CS4231_MAX_DEV_ATEN + 1)));


X
X return 0;
X }

@@ -852,12 +903,12 @@
X l_adj = l * (CS4231_MAX_GAIN + 1) / (AUDIO_MAX_GAIN + 1);
X r_adj = r * (CS4231_MAX_GAIN + 1) / (AUDIO_MAX_GAIN + 1);
X
- cs4231_chip->regs->iar = 0x0;
- old_gain = cs4231_chip->regs->idr;
- cs4231_chip->regs->idr = RECGAIN_SET(old_gain, l_adj);
- cs4231_chip->regs->iar = 0x1;
- old_gain = cs4231_chip->regs->idr;
- cs4231_chip->regs->idr = RECGAIN_SET(old_gain, r_adj);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0);
+ old_gain = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), RECGAIN_SET(old_gain, l_adj));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x1);
+ old_gain = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), RECGAIN_SET(old_gain, r_adj));
X
X if (l == value) {
X (l == 0) ? (tmp = 0) : (tmp = ((l_adj + 1) * AUDIO_MAX_GAIN) /
@@ -894,12 +945,12 @@
X (r * (CS4231_MAX_ATEN + 1) /
X (AUDIO_MAX_GAIN + 1)));
X
- cs4231_chip->regs->iar = 0x6;
- old_gain = cs4231_chip->regs->idr;
- cs4231_chip->regs->idr = GAIN_SET(old_gain, l_adj);
- cs4231_chip->regs->iar = 0x7;
- old_gain = cs4231_chip->regs->idr;
- cs4231_chip->regs->idr = GAIN_SET(old_gain, r_adj);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x6);
+ old_gain = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), GAIN_SET(old_gain, l_adj));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x7);
+ old_gain = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), GAIN_SET(old_gain, r_adj));
X
X if ((value == 0) || (value == AUDIO_MAX_GAIN)) {
X tmp = value;
@@ -920,13 +971,16 @@
X static void cs4231_chip_reset(struct sparcaudio_driver *drv)
X {
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
+ unsigned char vers;
X
X tprintk(("in cs4231_chip_reset\n"));
X
X if (cs4231_chip->status & CS_STATUS_IS_EBUS) {
X #ifdef EB4231_SUPPORT
- writel(EBUS_DCSR_RESET, &cs4231_chip->eb2p->dcsr);
- writel(EBUS_DCSR_RESET, &cs4231_chip->eb2c->dcsr);
+ writel(EBUS_DCSR_RESET, &(cs4231_chip->eb2p->dcsr));
+ writel(EBUS_DCSR_RESET, &(cs4231_chip->eb2c->dcsr));
+ writel(EBUS_DCSR_BURST_SZ_16, &(cs4231_chip->eb2p->dcsr));
+ writel(EBUS_DCSR_BURST_SZ_16, &(cs4231_chip->eb2c->dcsr));
X #endif
X } else {
X cs4231_chip->regs->dmacsr = APC_CHIP_RESET;
@@ -938,12 +992,13 @@
X cs4231_chip->regs->dmacsr &= ~(APC_CDC_RESET);
X }
X
- cs4231_chip->regs->iar |= IAR_AUTOCAL_BEGIN;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->iar)) | IAR_AUTOCAL_BEGIN));
X
X CHIP_READY
X
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x0c;
- cs4231_chip->regs->idr = MISC_IR_MODE2;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x0c);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), MISC_IR_MODE2);
X
X /* This is the equivalent of DEFAULT_DATA_FMAT */
X cs4231_set_input_encoding(drv, AUDIO_ENCODING_ULAW);
@@ -956,25 +1011,27 @@
X cs4231_set_output_channels(drv, CS4231_CHANNELS);
X cs4231_set_output_precision(drv, CS4231_PRECISION);
X
- cs4231_chip->regs->iar = 0x19;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x19);
+
X /* see what we can turn on */
- if (cs4231_chip->regs->idr & CS4231A) {
+ vers = CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr));
+ if (vers & CS4231A) {
X tprintk(("This is a CS4231A\n"));
X cs4231_chip->status |= CS_STATUS_REV_A;
X } else
X cs4231_chip->status &= ~CS_STATUS_REV_A;
X
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x10;
- cs4231_chip->regs->idr = OLB_ENABLE;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x10);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), OLB_ENABLE);
X
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x11;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x11);
X if (cs4231_chip->status & CS_STATUS_REV_A)
- cs4231_chip->regs->idr = (HPF_ON | XTALE_ON);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), (HPF_ON | XTALE_ON));
X else
- cs4231_chip->regs->idr = HPF_ON;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), HPF_ON);
X
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x1a;
- cs4231_chip->regs->idr = 0x00;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x1a);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), 0x00);
X
X /* Now set things up for defaults */
X cs4231_set_input_balance(drv, AUDIO_MID_BALANCE);
@@ -988,13 +1045,14 @@
X
X cs4231_set_monitor_volume(drv, LOOPB_OFF);
X
- cs4231_chip->regs->iar = IAR_AUTOCAL_END;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_END);
X
X cs4231_ready(drv);
X
- cs4231_chip->regs->iar = IAR_AUTOCAL_BEGIN | 0x09;
- cs4231_chip->regs->idr &= ACAL_DISABLE;
- cs4231_chip->regs->iar = IAR_AUTOCAL_END;
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_BEGIN | 0x09);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr),
+ (CS4231_READ8(cs4231_chip, &(cs4231_chip->regs->idr)) & ACAL_DISABLE));
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), IAR_AUTOCAL_END);
X
X cs4231_ready(drv);
X
@@ -1036,24 +1094,18 @@
X {
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
X struct audio_prinfo *thisdir;
- unsigned int count, nextcount, curcount;
+ unsigned int count, curcount, nextcount, dbcr;
X
- if (direction == 1) /* record */
- {
- thisdir = &cs4231_chip->perchip_info.record;
- curcount =
- cs4231_length_to_samplecount(thisdir, readl(&cs4231_chip->eb2c->dbcr));
- nextcount =
- cs4231_length_to_samplecount(thisdir, 0/*cs4231_chip->regs->dmacnc*/);
- }
- else /* play */
- {
- thisdir = &cs4231_chip->perchip_info.play;
- curcount =
- cs4231_length_to_samplecount(thisdir, readl(&cs4231_chip->eb2p->dbcr));
- nextcount =
- cs4231_length_to_samplecount(thisdir, 0/*cs4231_chip->regs->dmapnc*/);
- }
+ if(direction == 1) {
+ thisdir = &cs4231_chip->perchip_info.record;
+ dbcr = readl(&(cs4231_chip->eb2c->dbcr));
+ nextcount = cs4231_chip->input_next_dma_size;
+ } else {
+ thisdir = &cs4231_chip->perchip_info.play;
+ dbcr = readl(&(cs4231_chip->eb2p->dbcr));
+ nextcount = cs4231_chip->output_next_dma_size;
+ }
+ curcount = cs4231_length_to_samplecount(thisdir, dbcr);
X count = thisdir->samples;
X length = cs4231_length_to_samplecount(thisdir, length);
X /* normalize for where we are. */
@@ -1131,18 +1183,16 @@
X /* stop capture here or midlevel? */
X cs4231_chip->perchip_info.record.open = 0;
X if (cs4231_chip->input_dma_handle) {
-#if 0
- mmu_release_scsi_one(cs4231_chip->input_dma_handle,
- cs4231_chip->input_dma_size, drv->dev->my_bus);
-#endif
+ if(!(cs4231_chip->status & CS_STATUS_IS_EBUS))
+ mmu_release_scsi_one(cs4231_chip->input_dma_handle,
+ cs4231_chip->input_dma_size, drv->dev->my_bus);
X cs4231_chip->input_dma_handle = 0;
X cs4231_chip->input_dma_size = 0;
X }
X if (cs4231_chip->input_next_dma_handle) {
-#if 0
- mmu_release_scsi_one(cs4231_chip->input_next_dma_handle,
- cs4231_chip->input_next_dma_size, drv->dev->my_bus);
-#endif
+ if(!(cs4231_chip->status & CS_STATUS_IS_EBUS))
+ mmu_release_scsi_one(cs4231_chip->input_next_dma_handle,
+ cs4231_chip->input_next_dma_size, drv->dev->my_bus);
X cs4231_chip->input_next_dma_handle = 0;
X cs4231_chip->input_next_dma_size = 0;
X }
@@ -1152,19 +1202,17 @@
X cs4231_chip->perchip_info.play.active =
X cs4231_chip->perchip_info.play.open = 0;
X if (cs4231_chip->output_dma_handle) {
-#if 0
- mmu_release_scsi_one(cs4231_chip->output_dma_handle,
- cs4231_chip->output_dma_size, drv->dev->my_bus);
-#endif
+ if(!(cs4231_chip->status & CS_STATUS_IS_EBUS))
+ mmu_release_scsi_one(cs4231_chip->output_dma_handle,
+ cs4231_chip->output_dma_size, drv->dev->my_bus);
X cs4231_chip->output_dma_handle = 0;
X cs4231_chip->output_dma_size = 0;
X }
X if (cs4231_chip->output_next_dma_handle) {
-#if 0
- mmu_release_scsi_one(cs4231_chip->output_next_dma_handle,
- cs4231_chip->output_next_dma_size,
- drv->dev->my_bus);
-#endif
+ if(!(cs4231_chip->status & CS_STATUS_IS_EBUS))
+ mmu_release_scsi_one(cs4231_chip->output_next_dma_handle,
+ cs4231_chip->output_next_dma_size,
+ drv->dev->my_bus);
X cs4231_chip->output_next_dma_handle = 0;
X cs4231_chip->output_next_dma_size = 0;
X }
@@ -1230,11 +1278,7 @@
X {
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
X int status = 0;
- unsigned int dcsr;
-
- dcsr = readl(&cs4231_chip->eb2p->dcsr);
X
- printk("pintr\ncsr 0x%x acr 0x%x bcr %d\n", readl(&cs4231_chip->eb2p->dcsr), readl(&cs4231_chip->eb2p->dacr), readl(&cs4231_chip->eb2p->dbcr));
X if (cs4231_chip->playlen == 0 && cs4231_chip->output_size > 0)
X cs4231_chip->playlen = cs4231_chip->output_size;
X
@@ -1244,35 +1288,24 @@
X cs4231_chip->playing_count--;
X status++;
X }
-
-#if 0
- if (cs4231_chip->output_next_dma_handle) {
+ if(cs4231_chip->output_next_dma_handle) {
X cs4231_chip->output_dma_handle = cs4231_chip->output_next_dma_handle;
X cs4231_chip->output_dma_size = cs4231_chip->output_next_dma_size;
- cs4231_chip->output_next_dma_size = 0;
X cs4231_chip->output_next_dma_handle = 0;
+ cs4231_chip->output_next_dma_size = 0;
X }
-#endif
X
X if ((cs4231_chip->output_ptr && cs4231_chip->output_size > 0) &&
X !(cs4231_chip->perchip_info.play.pause)) {
-#if 0
- if (dcsr & EBUS_DCSR_A_LOADED) {
- cs4231_chip->output_next_dma_handle = virt_to_bus(cs4231_chip->output_ptr);
- cs4231_chip->output_next_dma_size = cs4231_chip->output_size;
- } else {
-#endif
- cs4231_chip->output_dma_handle = virt_to_bus(cs4231_chip->output_ptr);
- cs4231_chip->output_dma_size = cs4231_chip->output_size;
-#if 0
- }
-#endif
- writel(virt_to_bus(cs4231_chip->output_ptr), &cs4231_chip->eb2p->dacr);
- writel(cs4231_chip->output_size, &cs4231_chip->eb2p->dbcr);
+ cs4231_chip->output_next_dma_handle = virt_to_bus(cs4231_chip->output_ptr);
+ cs4231_chip->output_next_dma_size = cs4231_chip->output_size;
+
+ writel(cs4231_chip->output_next_dma_size, &(cs4231_chip->eb2p->dbcr));
+ writel(cs4231_chip->output_next_dma_handle, &(cs4231_chip->eb2p->dacr));
X cs4231_chip->output_size = 0;
X cs4231_chip->output_ptr = NULL;
X cs4231_chip->playing_count++;
- status+=2;
+ status += 2;
X }
X
X sparcaudio_output_done(drv, status);
@@ -1354,14 +1387,11 @@
X
X if (cs4231_chip->perchip_info.record.active == 0) {
X dprintk(("going inactive\n"));
+ eb4231_pollinput(drv);
X cs4231_disable_rec(drv);
X }
X
X if (cs4231_chip->input_dma_handle) {
-#if 0
- mmu_release_scsi_one(cs4231_chip->input_dma_handle,
- cs4231_chip->input_dma_size, drv->dev->my_bus);
-#endif
X cs4231_chip->input_dma_handle = 0;
X cs4231_chip->input_dma_size = 0;
X cs4231_chip->recording_count--;
@@ -1378,29 +1408,17 @@
X !(cs4231_chip->perchip_info.record.pause)) {
X cs4231_recclear(cs4231_chip->perchip_info.record.encoding,
X (char *)cs4231_chip->input_ptr, cs4231_chip->input_size);
-#if 0
- cs4231_chip->input_next_dma_handle =
- mmu_get_scsi_one((char *) cs4231_chip->input_ptr,
- cs4231_chip->input_size, drv->dev->my_bus);
- cs4231_chip->regs->dmacnva = cs4231_chip->input_next_dma_handle;
- cs4231_chip->input_next_dma_size = cs4231_chip->regs->dmacnc =
- cs4231_chip->input_size;
-#else
- cs4231_chip->input_next_dma_handle = cs4231_chip->eb2c->dacr = virt_to_bus(cs4231_chip->input_ptr);
- cs4231_chip->input_next_dma_size = cs4231_chip->eb2c->dbcr = cs4231_chip->input_size;
-#endif
+
+ cs4231_chip->input_next_dma_handle = virt_to_bus(cs4231_chip->input_ptr);
+ cs4231_chip->input_next_dma_size = cs4231_chip->input_size;
+
+ writel(cs4231_chip->input_next_dma_size, &(cs4231_chip->eb2c->dbcr));
+ writel(cs4231_chip->input_next_dma_handle, &(cs4231_chip->eb2c->dacr));
+
X cs4231_chip->input_size = 0;
X cs4231_chip->input_ptr = NULL;
X cs4231_chip->recording_count++;
X status += 2;
- } else {
-#if 0
- cs4231_chip->regs->dmacnva = 0;
- cs4231_chip->regs->dmacnc = 0;
-#else
- cs4231_chip->eb2c->dacr = 0;
- cs4231_chip->eb2c->dbcr = 0;
-#endif
X }
X
X sparcaudio_input_done(drv, 1);
@@ -1416,7 +1434,6 @@
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
X unsigned int dcsr;
X
- dprintk(("in eb4231 start output act %d pau %d\n", cs4231_chip->perchip_info.play.active, cs4231_chip->perchip_info.play.pause));
X cs4231_chip->output_ptr = buffer;
X cs4231_chip->output_size = count;
X
@@ -1431,17 +1448,19 @@
X
X dcsr = readl(&cs4231_chip->eb2p->dcsr);
X if (!(dcsr & EBUS_DCSR_EN_DMA)) {
- dprintk(("about to go setup\n"));
+ writel(EBUS_DCSR_RESET, &(cs4231_chip->eb2p->dcsr));
+ writel(EBUS_DCSR_BURST_SZ_16, &(cs4231_chip->eb2p->dcsr));
X
- dcsr = EB2_PLAY_SETUP;
- writel(dcsr, (unsigned long)&cs4231_chip->eb2p->dcsr);
X eb4231_playintr(drv);
- dprintk(("enabling\n"));
+
+ writel(EBUS_DCSR_BURST_SZ_16 |
+ (EBUS_DCSR_EN_DMA | EBUS_DCSR_INT_EN | EBUS_DCSR_EN_CNT | EBUS_DCSR_EN_NEXT),
+ &(cs4231_chip->eb2p->dcsr));
+
X cs4231_enable_play(drv);
X
X cs4231_ready(drv);
X } else {
- dprintk(("playing next block\n"));
X eb4231_playintr(drv);
X }
X }
@@ -1484,21 +1503,28 @@
X static void eb4231_stop_output(struct sparcaudio_driver *drv)
X {
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
+ int dcsr;
X
- dprintk(("in cs4231_stop_output\n"));
- dprintk(("csr 0x%x acr 0x%x bcr %d\n", readl(&cs4231_chip->eb2p->dcsr), readl(&cs4231_chip->eb2p->dacr), readl(&cs4231_chip->eb2p->dbcr)));
+ dprintk(("eb4231_stop_output: dcsr 0x%x dacr 0x%x dbcr %d\n",
+ readl(&cs4231_chip->eb2p->dcsr),
+ readl(&cs4231_chip->eb2p->dacr),
+ readl(&cs4231_chip->eb2p->dbcr)));
X cs4231_chip->output_ptr = NULL;
X cs4231_chip->output_size = 0;
X if (cs4231_chip->output_dma_handle) {
X cs4231_chip->output_dma_handle = 0;
X cs4231_chip->output_dma_size = 0;
X }
-#if 0
X if (cs4231_chip->output_next_dma_handle) {
X cs4231_chip->output_next_dma_handle = 0;
X cs4231_chip->output_next_dma_size = 0;
X }
-#endif
+ dcsr = readl(&(cs4231_chip->eb2p->dcsr));
+ if(dcsr & EBUS_DCSR_EN_DMA)
+ writel(dcsr & ~EBUS_DCSR_EN_DMA, &(cs4231_chip->eb2p->dcsr));
+
+ /* Else subsequent speed setting changes are ignored by the chip. */
+ cs4231_disable_play(drv);
X }
X #endif
X
@@ -1521,8 +1547,27 @@
X cs4231_chip->output_next_dma_handle = 0;
X cs4231_chip->output_next_dma_size = 0;
X }
+#if 0 /* Not safe without shutting off the DMA controller as well. -DaveM */
+ /* Else subsequent speed setting changes are ignored by the chip. */
+ cs4231_disable_play(drv);
+#endif
X }
X
+#ifdef EB4231_SUPPORT
+static void eb4231_pollinput(struct sparcaudio_driver *drv)
+{
+ struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
+ int x = 0, dcsr;
+
+ while (!((dcsr = readl(&(cs4231_chip->eb2c->dcsr))) & EBUS_DCSR_TC) &&
+ x <= CS_TIMEOUT) {
+ x++;
+ }
+
+ writel(dcsr | EBUS_DCSR_TC, &(cs4231_chip->eb2c->dcsr));
+}
+#endif
+
X static void cs4231_pollinput(struct sparcaudio_driver *drv)
X {
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
@@ -1687,8 +1732,8 @@
X {
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
X
- cs4231_chip->regs->iar = 0x0d;
- cs4231_chip->regs->idr = (value ? LOOPB_ON : 0);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->iar), 0x0d);
+ CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), (value ? LOOPB_ON : 0));
X }
X
X static int cs4231_ioctl(struct inode * inode, struct file * file,
@@ -1716,61 +1761,15 @@
X {
X struct sparcaudio_driver *drv = (struct sparcaudio_driver *)dev_id;
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
- int dummy1, dummy2;
+ int dummy;
X
- printk("in eb4231_interrupt\n");
-
- /* Clear the interrupt. */
- dummy1 = readl(&cs4231_chip->eb2p->dcsr);
- dummy2 = readl(&cs4231_chip->eb2c->dcsr);
+ /* Read status. */
+ dummy = readl(&cs4231_chip->eb2c->dcsr);
X
- printk("play csr 0x%x capt csr 0x%x\n", dummy1, dummy2);
-
- cs4231_chip->eb2p->dcsr = dummy1;
- cs4231_chip->eb2c->dcsr = dummy2;
-#if 0
- if (dummy & APC_PLAY_INT) {
- if (dummy & APC_XINT_PNVA) {
- cs4231_chip->perchip_info.play.samples +=
- cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.play),
- cs4231_chip->playlen);
- eb4231_playintr(drv);
- }
- /* Any other conditions we need worry about? */
- }
-
- if (dummy & APC_CAPT_INT) {
- if (dummy & APC_XINT_CNVA) {
- cs4231_chip->perchip_info.record.samples +=
- cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.record),
- cs4231_chip->reclen);
- eb4231_recintr(drv);
- }
- /* Any other conditions we need worry about? */
- }
-
-
- if (dummy & APC_XINT_CEMP) {
- if (cs4231_chip->perchip_info.record.active == 0) {
- /* Fix me */
- cs4231_chip->perchip_info.record.active = 0;
- cs4231_chip->perchip_info.record.error = 1;
- eb4231_recintr(drv);
- }
- }
-
- if (dummy & APC_XINT_EMPT) {
- if (!cs4231_chip->output_next_dma_handle) {
- cs4231_chip->regs->dmacsr |= (APC_PPAUSE);
- cs4231_disable_play(drv);
- cs4231_chip->perchip_info.play.error = 1;
- }
- cs4231_chip->perchip_info.play.active = 0;
- eb4231_playintr(drv);
-
- eb4231_getsamplecount(drv, cs4231_chip->playlen, 0);
- }
-#endif
+ cs4231_chip->perchip_info.record.samples +=
+ cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.record),
+ cs4231_chip->reclen);
+ eb4231_recintr(drv);
X }
X
X /* ebus audio play interrupt handler. */
@@ -1780,42 +1779,29 @@
X struct cs4231_chip *cs4231_chip = (struct cs4231_chip *)drv->private;
X unsigned int dummy;
X
- dprintk(("in eb4231_interrupt2\n"));
-
- /* Clear the interrupt. */
- dummy = readl(&cs4231_chip->eb2p->dcsr);
- dprintk(("play csr 0x%x\n", dummy));
+ /* Clear the interrupt. Bleh, when not using the next-address
+ * feature, TC can only be cleared by a reset.
+ */
+ dummy = readl(&(cs4231_chip->eb2p->dcsr));
+ writel(dummy, &(cs4231_chip->eb2p->dcsr));
X
- if (dummy & EBUS_DCSR_INT_PEND) {
-#if 0
- if (!(dummy & EBUS_DCSR_NA_LOADED)) {
-#endif
- cs4231_chip->perchip_info.play.samples +=
- cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.play),

SHAR_EOF
true || echo 'restore of patch-2.2.7 failed'
fi

echo 'End of part 06'
echo 'File patch-2.2.7 is continued in part 07'
echo 07 > _shar_seq_.tmp
exit 0

Thomas...@ciw.uni-karlsruhe.de

unread,
May 1, 1999, 3:00:00 AM5/1/99
to
Archive-name: v2.2/patch-2.2.7/part07

#!/bin/sh
# this is part 07 of a 22 - part archive


# do not concatenate these parts, unpack them in order with /bin/sh
# file patch-2.2.7 continued
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck

if test "$Scheck" != 07; then


echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping patch-2.2.7'
else
echo 'x - continuing with patch-2.2.7'
sed 's/^X//' << 'SHAR_EOF' >> 'patch-2.2.7' &&

- cs4231_chip->playlen);
- eb4231_playintr(drv);

-#if 0
- }
-#endif
+ /* If we get a terminal count and address loaded condition,
+ * this means the DNAR was copied into DACR.
+ */
+ if((dummy & EBUS_DCSR_TC) != 0
+ /*&& (dummy & EBUS_DCSR_A_LOADED) != 0*/) {
+ cs4231_chip->perchip_info.play.samples +=
+ cs4231_length_to_samplecount(&(cs4231_chip->perchip_info.play),
+ cs4231_chip->playlen);
+ eb4231_playintr(drv);
X }
X
- if (!(dummy & EBUS_DCSR_A_LOADED)) {
-#if 0
- if (!cs4231_chip->output_next_dma_handle) {
-#endif
- writel((dummy & ~EBUS_DCSR_EN_DMA), &cs4231_chip->eb2p->dcsr);


- cs4231_disable_play(drv);
- cs4231_chip->perchip_info.play.error = 1;

-#if 0
- }
-#endif
+ if((dummy & EBUS_DCSR_A_LOADED) == 0) {
X cs4231_chip->perchip_info.play.active = 0;
-#if 0
X eb4231_playintr(drv);
-#endif
+
X eb4231_getsamplecount(drv, cs4231_chip->playlen, 0);
X }
-
X }
X #endif
X
@@ -2151,26 +2137,6 @@
X
X nregs = len / sizeof(regs[0]);
X
- /* Make sure we can map the registers first */
- if (check_region(edev->base_address[0],
- sizeof(struct cs4231_regs))) {
- printk("eb4231_attach: can't get region at %016lx\n",
- edev->base_address[0]);
- goto cleanup;
- }
- if (check_region(edev->base_address[1],
- sizeof(struct linux_ebus_dma))) {
- printk("eb4231_attach: can't get region at %016lx\n",
- edev->base_address[1]);
- goto cleanup;
- }
- if (check_region(edev->base_address[2],
- sizeof(struct linux_ebus_dma))) {
- printk("eb4231_attach: can't get region at %016lx\n",
- edev->base_address[2]);
- goto cleanup;
- }
-
X cs4231_chip->regs = (struct cs4231_regs *)edev->base_address[0];
X cs4231_chip->eb2p = (struct linux_ebus_dma *)edev->base_address[1];
X cs4231_chip->eb2c = (struct linux_ebus_dma *)edev->base_address[2];
@@ -2188,13 +2154,9 @@
X cs4231_chip->irq = edev->irqs[0];
X cs4231_chip->irq2 = edev->irqs[1];
X
- request_irq(cs4231_chip->irq, eb4231_cinterrupt, SA_SHIRQ, "cs4231", drv);
-#if 0
- enable_irq(cs4231_chip->irq);
-#endif
-
- request_irq(cs4231_chip->irq2, eb4231_pinterrupt, SA_SHIRQ, "cs4231", drv);
- enable_irq(cs4231_chip->irq2);
+ if(request_irq(cs4231_chip->irq, eb4231_cinterrupt, SA_SHIRQ, "cs4231", drv) ||
+ request_irq(cs4231_chip->irq2, eb4231_pinterrupt, SA_SHIRQ, "cs4231", drv))
+ goto bail;
X
X cs4231_chip->nirqs = 2;
X
@@ -2207,21 +2169,20 @@
X err = register_sparcaudio_driver(drv, 1);
X
X if (err < 0) {
+ bail:
X printk(KERN_ERR "cs4231: unable to register\n");
X cs4231_disable_interrupts(drv);
X disable_irq(cs4231_chip->irq);
X free_irq(cs4231_chip->irq, drv);
- if (cs4231_chip->nirqs == 2) {
- disable_irq(cs4231_chip->irq2);
- free_irq(cs4231_chip->irq2, drv);
- }
+ disable_irq(cs4231_chip->irq2);
+ free_irq(cs4231_chip->irq2, drv);
+
X release_region((unsigned long)cs4231_chip->regs,
X sizeof(struct cs4231_regs));
X release_region((unsigned long)cs4231_chip->eb2c,
X sizeof(struct linux_ebus_dma));
X release_region((unsigned long)cs4231_chip->eb2p,
X sizeof(struct linux_ebus_dma));
- cleanup:
X kfree(drv->private);
X return -EIO;
X }
@@ -2312,9 +2273,11 @@
X sparc_free_io(cs4231_chip->regs, cs4231_chip->regs_size);
X } else {
X #ifdef EB4231_SUPPORT
- release_region(cs4231_chip->regs, sizeof(struct cs4231_regs));
- release_region(cs4231_chip->eb2c, sizeof(struct linux_ebus_dma));
- release_region(cs4231_chip->eb2p, sizeof(struct linux_ebus_dma));
+ disable_irq(cs4231_chip->irq2);
+ free_irq(cs4231_chip->irq2, drv);
+ release_region((unsigned long)cs4231_chip->regs, sizeof(struct cs4231_regs));
+ release_region((unsigned long)cs4231_chip->eb2c, sizeof(struct linux_ebus_dma));
+ release_region((unsigned long)cs4231_chip->eb2p, sizeof(struct linux_ebus_dma));
X #endif
X }
X kfree(drv->private);
diff -u --recursive --new-file v2.2.6/linux/drivers/sbus/audio/cs4231.h linux/drivers/sbus/audio/cs4231.h
--- v2.2.6/linux/drivers/sbus/audio/cs4231.h Tue Mar 23 14:35:48 1999
+++ linux/drivers/sbus/audio/cs4231.h Thu Apr 22 19:24:51 1999
@@ -64,6 +64,27 @@
X volatile unsigned long recording_count;
X };
X
+#ifdef EB4231_SUPPORT
+#define CS4231_READ32(__C, __REG) \
+ (((__C)->status & CS_STATUS_IS_EBUS) ? readl((unsigned long)(__REG)) : (*(__REG)))
+#define CS4231_READ8(__C, __REG) \
+ (((__C)->status & CS_STATUS_IS_EBUS) ? readb((unsigned long)(__REG)) : (*(__REG)))
+#define CS4231_WRITE32(__C, __REG, __VAL) \
+ (((__C)->status & CS_STATUS_IS_EBUS) ? \
+ writel((__VAL), (unsigned long)(__REG)) : \
+ (*(__REG) = (__VAL)))
+#define CS4231_WRITE8(__C, __REG, __VAL) \
+ (((__C)->status & CS_STATUS_IS_EBUS) ? \
+ writeb((__VAL), (unsigned long)(__REG)) : \
+ (*(__REG) = (__VAL)))
+#else
+/* We can assume all is SBUS in this case. */
+#define CS4231_READ32(__C, __REG) (*(__REG))
+#define CS4231_READ8(__C, __REG) (*(__REG))
+#define CS4231_WRITE32(__C, __REG, __VAL) (*(__REG) = (__VAL))
+#define CS4231_WRITE8(__C, __REG, __VAL) (*(__REG) = (__VAL))
+#endif
+
X /* Local status bits */
X #define CS_STATUS_NEED_INIT 0x01
X #define CS_STATUS_INIT_ON_CLOSE 0x02
diff -u --recursive --new-file v2.2.6/linux/drivers/sbus/char/pcikbd.c linux/drivers/sbus/char/pcikbd.c
--- v2.2.6/linux/drivers/sbus/char/pcikbd.c Tue Mar 23 14:35:48 1999
+++ linux/drivers/sbus/char/pcikbd.c Wed Apr 28 08:47:39 1999
@@ -1,4 +1,4 @@
-/* $Id: pcikbd.c,v 1.25 1999/02/08 07:01:48 ecd Exp $
+/* $Id: pcikbd.c,v 1.26 1999/04/28 11:55:42 davem Exp $
X * pcikbd.c: Ultra/AX PC keyboard support.
X *
X * Copyright (C) 1997 Eddie C. Dost (e...@skynet.be)
@@ -228,8 +228,6 @@
X "\r\000/"; /* 0x60 - 0x6f */
X #endif


X
-static unsigned int prev_scancode = 0;

-
X int pcikbd_setkeycode(unsigned int scancode, unsigned int keycode)
X {
X if(scancode < SC_LIM || scancode > 255 || keycode > 127)
@@ -262,29 +260,22 @@


X return 0;
X }
X }

- if(scancode == 0) {


- prev_scancode = 0;
- return 0;
- }
X return 1;
X }
X

-int pcikbd_pretranslate(unsigned char scancode, char raw_mode)
+int pcikbd_translate(unsigned char scancode, unsigned char *keycode,


+ char raw_mode)
X {
- if(scancode == 0xff) {

- prev_scancode = 0;


+ static int prev_scancode = 0;

+
+ if (scancode == 0xe0 || scancode == 0xe1) {
+ prev_scancode = scancode;
X return 0;
X }
- if(scancode == 0xe0 || scancode == 0xe1) {
- prev_scancode = scancode;


+ if (scancode == 0x00 || scancode == 0xff) {
+ prev_scancode = 0;

X return 0;
X }


- return 1;
-}
-

-int pcikbd_translate(unsigned char scancode, unsigned char *keycode,


- char raw_mode)
-{
X if(prev_scancode) {

X if(prev_scancode != 0xe0) {
X if(prev_scancode == 0xe1 && scancode == 0x1d) {
@@ -338,7 +329,7 @@
X break;
X scancode = pcikbd_inb(pcikbd_iobase + KBD_DATA_REG);
X if((status & KBD_STAT_OBF) && do_acknowledge(scancode))


- handle_scancode(scancode);
+ handle_scancode(scancode, !(scancode & 0x80));

X status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG);
X } while(status & KBD_STAT_OBF);
X mark_bh(KEYBOARD_BH);
diff -u --recursive --new-file v2.2.6/linux/drivers/sbus/char/sunkbd.c linux/drivers/sbus/char/sunkbd.c
--- v2.2.6/linux/drivers/sbus/char/sunkbd.c Tue Mar 23 14:35:48 1999
+++ linux/drivers/sbus/char/sunkbd.c Thu Apr 22 19:24:51 1999
@@ -1479,7 +1479,7 @@
X return 0;
X
X if (kbd_redirected)
- kbd_table [kbd_opened-1].kbdmode = VC_XLATE;
+ kbd_table [kbd_redirected-1].kbdmode = VC_XLATE;
X
X kbd_redirected = 0;
X kbd_opened = 0;
diff -u --recursive --new-file v2.2.6/linux/drivers/sbus/char/sunmouse.c linux/drivers/sbus/char/sunmouse.c
--- v2.2.6/linux/drivers/sbus/char/sunmouse.c Mon Oct 5 13:13:40 1998
+++ linux/drivers/sbus/char/sunmouse.c Thu Apr 22 19:24:51 1999
@@ -94,7 +94,7 @@
X
X #undef SMOUSE_DEBUG
X
-static void
+static int
X push_event (Firm_event *ev)
X {
X int next = (sunmouse.head + 1) % EV_SIZE;
@@ -102,7 +102,9 @@
X if (next != sunmouse.tail){
X sunmouse.queue.ev [sunmouse.head] = *ev;
X sunmouse.head = next;
+ return 1;
X }
+ return 0;


X }
X
X static int

@@ -150,7 +152,11 @@
X extern void rs_change_mouse_baud(int newbaud);
X
X if(mouse_baud == 1200)
+ mouse_baud = 2400;
+ else if(mouse_baud == 2400)
X mouse_baud = 4800;
+ else if(mouse_baud == 4800)
+ mouse_baud = 9600;
X else
X mouse_baud = 1200;
X
@@ -196,7 +202,7 @@
X sun_mouse_inbyte(unsigned char byte)
X {
X signed char mvalue;
- int d;
+ int d, pushed = 0;
X Firm_event ev;
X
X add_mouse_randomness (byte);
@@ -290,29 +296,31 @@
X }
X ev.time = xtime;
X ev.value = ev.value ? VKEY_DOWN : VKEY_UP;
- push_event (&ev);
+ pushed += push_event (&ev);
X }
X if (sunmouse.delta_x){
X ev.id = LOC_X_DELTA;
X ev.time = xtime;
X ev.value = sunmouse.delta_x;
- push_event (&ev);
+ pushed += push_event (&ev);
X sunmouse.delta_x = 0;
X }
X if (sunmouse.delta_y){
X ev.id = LOC_Y_DELTA;
X ev.time = xtime;
X ev.value = sunmouse.delta_y;
- push_event (&ev);
+ pushed += push_event (&ev);
X }
X
- /* We just completed a transaction, wake up whoever is awaiting
- * this event.
- */
- sunmouse.ready = 1;
- if (sunmouse.fasync)
- kill_fasync (sunmouse.fasync, SIGIO);
- wake_up_interruptible(&sunmouse.proc_list);
+ if(pushed != 0) {
+ /* We just completed a transaction, wake up whoever is awaiting
+ * this event.
+ */
+ sunmouse.ready = 1;
+ if (sunmouse.fasync)
+ kill_fasync (sunmouse.fasync, SIGIO);
+ wake_up_interruptible(&sunmouse.proc_list);
+ }
X return;
X }
X
diff -u --recursive --new-file v2.2.6/linux/drivers/sbus/char/zs.c linux/drivers/sbus/char/zs.c
--- v2.2.6/linux/drivers/sbus/char/zs.c Tue Mar 23 14:35:48 1999
+++ linux/drivers/sbus/char/zs.c Thu Apr 22 19:24:51 1999
@@ -1,4 +1,4 @@
-/* $Id: zs.c,v 1.40 1999/02/23 15:14:45 jj Exp $
+/* $Id: zs.c,v 1.41 1999/04/16 16:22:27 jj Exp $
X * zs.c: Zilog serial port driver for the Sparc.
X *


X * Copyright (C) 1995 David S. Miller (da...@caip.rutgers.edu)

@@ -1844,7 +1844,7 @@
X
X static void show_serial_version(void)
X {
- char *revision = "$Revision: 1.40 $";
+ char *revision = "$Revision: 1.41 $";
X char *version, *p;
X
X version = strchr(revision, ' ');
@@ -2276,11 +2276,6 @@
X #if CONFIG_AP1000
X printk("not doing zs_init()\n");
X return 0;
-#endif
-
-#ifdef CONFIG_PCI
- if (pci_present())
- return 0;
X #endif
X
X /* Setup base handler, and timer table. */
diff -u --recursive --new-file v2.2.6/linux/drivers/scsi/ide-scsi.c linux/drivers/scsi/ide-scsi.c
--- v2.2.6/linux/drivers/scsi/ide-scsi.c Tue Feb 23 15:21:33 1999
+++ linux/drivers/scsi/ide-scsi.c Thu Apr 22 19:24:50 1999
@@ -67,7 +67,7 @@
X int b_count; /* Bytes transferred from current entry */
X Scsi_Cmnd *scsi_cmd; /* SCSI command */
X void (*done)(Scsi_Cmnd *); /* Scsi completion routine */
- unsigned int flags; /* Status/Action flags */
+ unsigned long flags; /* Status/Action flags */
X unsigned long timeout; /* Command timeout */
X } idescsi_pc_t;
X
@@ -92,9 +92,9 @@
X typedef struct {
X ide_drive_t *drive;
X idescsi_pc_t *pc; /* Current packet command */
- unsigned int flags; /* Status/Action flags */
- int transform; /* SCSI cmd translation layer */
- int log; /* log flags */
+ unsigned long flags; /* Status/Action flags */
+ unsigned long transform; /* SCSI cmd translation layer */
+ unsigned long log; /* log flags */
X } idescsi_scsi_t;
X
X /*
diff -u --recursive --new-file v2.2.6/linux/drivers/scsi/qlogicisp.c linux/drivers/scsi/qlogicisp.c
--- v2.2.6/linux/drivers/scsi/qlogicisp.c Fri Nov 27 13:09:24 1998
+++ linux/drivers/scsi/qlogicisp.c Thu Apr 22 19:30:08 1999
@@ -27,6 +27,7 @@
X #include <asm/io.h>
X #include <asm/irq.h>
X #include <asm/spinlock.h>
+#include <asm/byteorder.h>
X
X #include "sd.h"
X #include "hosts.h"
@@ -49,7 +50,7 @@
X /* Macros used for debugging */
X
X #define DEBUG_ISP1020 0
-#define DEBUG_ISP1020_INT 0
+#define DEBUG_ISP1020_INTR 0
X #define DEBUG_ISP1020_SETUP 0
X #define TRACE_ISP 0
X
@@ -730,17 +731,17 @@
X cmd->hdr.entry_type = ENTRY_COMMAND;
X cmd->hdr.entry_cnt = 1;
X
- cmd->handle = (u_int) virt_to_bus(Cmnd);
+ cmd->handle = cpu_to_le32((u_int) virt_to_bus(Cmnd));
X cmd->target_lun = Cmnd->lun;
X cmd->target_id = Cmnd->target;
- cmd->cdb_length = Cmnd->cmd_len;
- cmd->control_flags = CFLAG_READ | CFLAG_WRITE;
- cmd->time_out = 30;
+ cmd->cdb_length = cpu_to_le16(Cmnd->cmd_len);
+ cmd->control_flags = cpu_to_le16(CFLAG_READ | CFLAG_WRITE);
+ cmd->time_out = cpu_to_le16(30);
X
X memcpy(cmd->cdb, Cmnd->cmnd, Cmnd->cmd_len);
X
X if (Cmnd->use_sg) {
- cmd->segment_cnt = sg_count = Cmnd->use_sg;
+ cmd->segment_cnt = cpu_to_le16(sg_count = Cmnd->use_sg);
X sg = (struct scatterlist *) Cmnd->request_buffer;
X ds = cmd->dataseg;
X
@@ -749,8 +750,8 @@
X if (n > 4)
X n = 4;
X for (i = 0; i < n; i++) {
- ds[i].d_base = (u_int) virt_to_bus(sg->address);
- ds[i].d_count = sg->length;
+ ds[i].d_base = cpu_to_le32((u_int) virt_to_bus(sg->address));
+ ds[i].d_count = cpu_to_le32(sg->length);
X ++sg;
X }
X sg_count -= 4;
@@ -776,18 +777,18 @@
X if (n > 7)
X n = 7;
X for (i = 0; i < n; ++i) {
- ds[i].d_base = (u_int)virt_to_bus(sg->address);
- ds[i].d_count = sg->length;
+ ds[i].d_base = cpu_to_le32((u_int)virt_to_bus(sg->address));
+ ds[i].d_count = cpu_to_le32(sg->length);
X ++sg;
X }
X sg_count -= n;
X }
X } else {
X cmd->dataseg[0].d_base =
- (u_int) virt_to_bus(Cmnd->request_buffer);
+ cpu_to_le32((u_int) virt_to_bus(Cmnd->request_buffer));
X cmd->dataseg[0].d_count =
- (u_int) Cmnd->request_bufflen;
- cmd->segment_cnt = 1;
+ cpu_to_le32((u_int) Cmnd->request_bufflen);
+ cmd->segment_cnt = cpu_to_le16(1);
X }
X
X outw(in_ptr, host->io_port + MBOX4);
@@ -861,22 +862,22 @@
X
X DEBUG_INTR(printk("qlogicisp : response queue update\n"));
X DEBUG_INTR(printk("qlogicisp : response queue depth %d\n",
- QUEUE_DEPTH(in_ptr, out_ptr)));
+ QUEUE_DEPTH(in_ptr, out_ptr, RES_QUEUE_LEN)));
X
X while (out_ptr != in_ptr) {
X sts = (struct Status_Entry *) &hostdata->res[out_ptr][0];
X out_ptr = (out_ptr + 1) & RES_QUEUE_LEN;
X
- Cmnd = (Scsi_Cmnd *) bus_to_virt(sts->handle);
+ Cmnd = (Scsi_Cmnd *) bus_to_virt(le32_to_cpu(sts->handle));
X
X TRACE("done", out_ptr, Cmnd);
X
- if (sts->completion_status == CS_RESET_OCCURRED
- || sts->completion_status == CS_ABORTED
- || (sts->status_flags & STF_BUS_RESET))
+ if (le16_to_cpu(sts->completion_status) == CS_RESET_OCCURRED
+ || le16_to_cpu(sts->completion_status) == CS_ABORTED
+ || (le16_to_cpu(sts->status_flags) & STF_BUS_RESET))
X hostdata->send_marker = 1;
X
- if (sts->state_flags & SF_GOT_SENSE)
+ if (le16_to_cpu(sts->state_flags) & SF_GOT_SENSE)
X memcpy(Cmnd->sense_buffer, sts->req_sense_data,
X sizeof(Cmnd->sense_buffer));
X
@@ -917,24 +918,24 @@
X ENTER("isp1020_return_status");
X
X DEBUG(printk("qlogicisp : completion status = 0x%04x\n",
- sts->completion_status));
+ le16_to_cpu(sts->completion_status)));
X
- switch(sts->completion_status) {
+ switch(le16_to_cpu(sts->completion_status)) {
X case CS_COMPLETE:
X host_status = DID_OK;
X break;
X case CS_INCOMPLETE:
- if (!(sts->state_flags & SF_GOT_BUS))
+ if (!(le16_to_cpu(sts->state_flags) & SF_GOT_BUS))
X host_status = DID_NO_CONNECT;
- else if (!(sts->state_flags & SF_GOT_TARGET))
+ else if (!(le16_to_cpu(sts->state_flags) & SF_GOT_TARGET))
X host_status = DID_BAD_TARGET;
- else if (!(sts->state_flags & SF_SENT_CDB))
+ else if (!(le16_to_cpu(sts->state_flags) & SF_SENT_CDB))
X host_status = DID_ERROR;
- else if (!(sts->state_flags & SF_TRANSFERRED_DATA))
+ else if (!(le16_to_cpu(sts->state_flags) & SF_TRANSFERRED_DATA))
X host_status = DID_ERROR;
- else if (!(sts->state_flags & SF_GOT_STATUS))
+ else if (!(le16_to_cpu(sts->state_flags) & SF_GOT_STATUS))
X host_status = DID_ERROR;
- else if (!(sts->state_flags & SF_GOT_SENSE))
+ else if (!(le16_to_cpu(sts->state_flags) & SF_GOT_SENSE))
X host_status = DID_ERROR;
X break;
X case CS_DMA_ERROR:
@@ -970,17 +971,17 @@
X break;
X default:
X printk("qlogicisp : unknown completion status 0x%04x\n",
- sts->completion_status);
+ le16_to_cpu(sts->completion_status));
X host_status = DID_ERROR;
X break;
X }
X
X DEBUG_INTR(printk("qlogicisp : host status (%s) scsi status %x\n",
- reason[host_status], sts->scsi_status));
+ reason[host_status], le16_to_cpu(sts->scsi_status)));
X
X LEAVE("isp1020_return_status");
X
- return (sts->scsi_status & STATUS_MASK) | (host_status << 16);
+ return (le16_to_cpu(sts->scsi_status) & STATUS_MASK) | (host_status << 16);
X }
X
X
@@ -1082,7 +1083,9 @@
X ENTER("isp1020_reset_hardware");
X
X outw(ISP_RESET, host->io_port + PCI_INTF_CTL);
+ udelay(100);
X outw(HCCR_RESET, host->io_port + HOST_HCCR);
+ udelay(100);
X outw(HCCR_RELEASE, host->io_port + HOST_HCCR);
X outw(HCCR_BIOS_DISABLE, host->io_port + HOST_HCCR);
X
@@ -1103,27 +1106,25 @@
X printk("qlogicisp : mbox 5 0x%04x \n", inw(host->io_port + MBOX5));
X #endif /* DEBUG_ISP1020 */
X
+ param[0] = MBOX_NO_OP;
+ isp1020_mbox_command(host, param);
+ if (param[0] != MBOX_COMMAND_COMPLETE) {
+ printk("qlogicisp : NOP test failed\n");
+ return 1;
+ }
+
X DEBUG(printk("qlogicisp : loading risc ram\n"));
X
X #if RELOAD_FIRMWARE
- /* Do not reload firmware if 1040B, i.e. revision 5 chip. */
- if (((struct isp1020_hostdata *) host->hostdata)->revision >= 5)
- printk("qlogicisp : 1040B or later chip,"
- " firmware not (re)loaded\n");
- else
- {
- int i;
- for (i = 0; i < risc_code_length01; i++) {
- param[0] = MBOX_WRITE_RAM_WORD;
- param[1] = risc_code_addr01 + i;
- param[2] = risc_code01[i];
-
- isp1020_mbox_command(host, param);
-
- if (param[0] != MBOX_COMMAND_COMPLETE) {
- printk("qlogicisp : firmware load failure\n");
- return 1;
- }
+ for (loop_count = 0; loop_count < risc_code_length01; loop_count++) {
+ param[0] = MBOX_WRITE_RAM_WORD;
+ param[1] = risc_code_addr01 + loop_count;
+ param[2] = risc_code01[loop_count];
+ isp1020_mbox_command(host, param);
+ if (param[0] != MBOX_COMMAND_COMPLETE) {
+ printk("qlogicisp : firmware load failure at %d\n",
+ loop_count);
+ return 1;
X }
X }
X #endif /* RELOAD_FIRMWARE */
@@ -1200,6 +1201,15 @@


X return 1;
X }
X

+#ifdef __sparc__
+ command |= (PCI_COMMAND_MASTER|PCI_COMMAND_IO|PCI_COMMAND_MEMORY|
+ PCI_COMMAND_INVALIDATE|PCI_COMMAND_SERR);
+ pci_write_config_word(pdev, PCI_COMMAND, command);
+ pci_read_config_word(pdev, PCI_COMMAND, &command);
+ pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 16);
+ pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 64);
+#endif
+
X if (command & PCI_COMMAND_IO && (io_base & 3) == 1)
X io_base &= PCI_BASE_ADDRESS_IO_MASK;
X else {
@@ -1227,6 +1237,8 @@
X
X sh->irq = irq;
X sh->io_port = io_base;
+ sh->max_id = MAX_TARGETS;
+ sh->max_lun = MAX_LUNS;
X
X LEAVE("isp1020_init");
X
@@ -1691,14 +1703,15 @@
X printk("qlogicisp : entry count = 0x%02x, type = 0x%02x, flags = 0x%02x\n",
X status->hdr.entry_cnt, status->hdr.entry_type, status->hdr.flags);
X printk("qlogicisp : scsi status = 0x%04x, completion status = 0x%04x\n",
- status->scsi_status, status->completion_status);
+ le16_to_cpu(status->scsi_status), le16_to_cpu(status->completion_status));
X printk("qlogicisp : state flags = 0x%04x, status flags = 0x%04x\n",
- status->state_flags, status->status_flags);
+ le16_to_cpu(status->state_flags), le16_to_cpu(status->status_flags));
X printk("qlogicisp : time = 0x%04x, request sense length = 0x%04x\n",
- status->time, status->req_sense_len);
- printk("qlogicisp : residual transfer length = 0x%08x\n", status->residual);
+ le16_to_cpu(status->time), le16_to_cpu(status->req_sense_len));
+ printk("qlogicisp : residual transfer length = 0x%08x\n",
+ le32_to_cpu(status->residual));
X
- for (i = 0; i < status->req_sense_len; i++)
+ for (i = 0; i < le16_to_cpu(status->req_sense_len); i++)
X printk("qlogicisp : sense data = 0x%02x\n", status->req_sense_data[i]);
X }
X
diff -u --recursive --new-file v2.2.6/linux/drivers/scsi/qlogicisp_asm.c linux/drivers/scsi/qlogicisp_asm.c
--- v2.2.6/linux/drivers/scsi/qlogicisp_asm.c Sun Feb 2 05:34:32 1997
+++ linux/drivers/scsi/qlogicisp_asm.c Thu Apr 22 19:30:08 1999
@@ -1,1304 +1,2034 @@
X /*
- * Version 2.10 Initiator Firmware (16:13 Oct 18, 1995)
+ * Firmware Version 7.63.00 (12:07 Jan 27, 1999)
X */
-
-static const unsigned short risc_code_version = 2*1024+10;
+static const unsigned short risc_code_version = 7*1024+63;
X
X static const unsigned short risc_code_addr01 = 0x1000 ;
X
X #if RELOAD_FIRMWARE
X
-static const unsigned short risc_code01[] = {
- 0x0078, 0x1041, 0x0000, 0x283a, 0x0000, 0x2043, 0x4f50, 0x5952,
- 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
- 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
- 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
- 0x3130, 0x3230, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
- 0x6572, 0x7369, 0x6f6e, 0x2030, 0x322e, 0x3130, 0x2020, 0x2043,
- 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
- 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
- 0x2400, 0x20b9, 0x1212, 0x2071, 0x0010, 0x70c3, 0x0004, 0x20c9,
- 0x43ff, 0x2089, 0x115b, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf,
- 0x2020, 0x70d3, 0x0002, 0x3f00, 0x70d6, 0x20c1, 0x0008, 0x2019,
- 0x0000, 0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5, 0xa1ec, 0x7fff,
- 0x2d64, 0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54, 0x205b, 0x5050,
- 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10b3, 0xa386, 0x000f, 0x0040,
- 0x1079, 0x2c6a, 0x2a5a, 0x20c1, 0x0000, 0x2019, 0x000f, 0x0078,
- 0x1059, 0x2c6a, 0x2a5a, 0x20c1, 0x0008, 0x2009, 0x7fff, 0x2148,
- 0x2944, 0x204b, 0x0a0a, 0xa9bc, 0x3fff, 0x2734, 0x203b, 0x5050,
- 0x2114, 0xa286, 0x0a0a, 0x0040, 0x109d, 0x284a, 0x263a, 0x20c1,
- 0x0004, 0x2009, 0x3fff, 0x2134, 0x200b, 0x5050, 0x2114, 0xa286,
- 0x5050, 0x0040, 0x109e, 0x0078, 0x1163, 0x284a, 0x263a, 0x98c0,
- 0xa188, 0x1000, 0x212c, 0x200b, 0xa5a5, 0x2114, 0xa286, 0xa5a5,
- 0x0040, 0x10b0, 0x250a, 0xa18a, 0x1000, 0x98c1, 0x0078, 0x10b5,
- 0x250a, 0x0078, 0x10b5, 0x2c6a, 0x2a5a, 0x2130, 0xa18a, 0x0040,
- 0x2128, 0xa1a2, 0x3900, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
- 0x8424, 0xa192, 0x4400, 0x2009, 0x0000, 0x2001, 0x002f, 0x1078,
- 0x1a70, 0x2218, 0x2079, 0x3900, 0x2fa0, 0x2408, 0x2011, 0x0000,
- 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10d0, 0x7eea, 0x7dde,
- 0x8528, 0x7dda, 0x7ce2, 0x7be6, 0x787b, 0x0000, 0x2031, 0x0030,
- 0x78c3, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f, 0x0003,
- 0x2069, 0x3940, 0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa,
- 0x680f, 0x0008, 0x6813, 0x0005, 0x681f, 0x0000, 0x6823, 0x0006,
- 0x6817, 0x0008, 0x6827, 0x0000, 0x2069, 0x3a00, 0x2011, 0x0020,
- 0x2009, 0x0010, 0x680b, 0x0c19, 0x680f, 0x0019, 0x6803, 0xfd00,
+static const unsigned short risc_code01[] = {
+ 0x0078, 0x103a, 0x0000, 0x3f14, 0x0000, 0x2043, 0x4f50, 0x5952,
+ 0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
+ 0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
+ 0x3130, 0x3230, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
+ 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x372e, 0x3633,
+ 0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
+ 0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
+ 0x3031, 0x2024, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048,
+ 0x1045, 0x0038, 0x104b, 0x0078, 0x1047, 0x0028, 0x104b, 0x20b9,
+ 0x1212, 0x0078, 0x104d, 0x20b9, 0x2222, 0x20c1, 0x0008, 0x2071,
+ 0x0010, 0x70c3, 0x0004, 0x20c9, 0x76ff, 0x2089, 0x1186, 0x70c7,
+ 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0007, 0x3f00,
+ 0x70d6, 0x20c1, 0x0008, 0x2019, 0x0000, 0x2009, 0xfeff, 0x2100,
+ 0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc,
+ 0x3fff, 0x2b54, 0x205b, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040,
+ 0x10bf, 0xa386, 0x000f, 0x0040, 0x1085, 0x2c6a, 0x2a5a, 0x20c1,
+ 0x0000, 0x2019, 0x000f, 0x0078, 0x1065, 0x2c6a, 0x2a5a, 0x20c1,
+ 0x0008, 0x2009, 0x7fff, 0x2148, 0x2944, 0x204b, 0x0a0a, 0xa9bc,
+ 0x3fff, 0x2734, 0x203b, 0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040,
+ 0x10a9, 0x284a, 0x263a, 0x20c1, 0x0004, 0x2009, 0x3fff, 0x2134,
+ 0x200b, 0x5050, 0x2114, 0xa286, 0x5050, 0x0040, 0x10aa, 0x0078,
+ 0x118e, 0x284a, 0x263a, 0x98c0, 0xa188, 0x1000, 0x212c, 0x200b,
+ 0xa5a5, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10bc, 0x250a, 0xa18a,
+ 0x1000, 0x98c1, 0x0078, 0x10c1, 0x250a, 0x0078, 0x10c1, 0x2c6a,
+ 0x2a5a, 0x2130, 0xa18a, 0x0040, 0x2128, 0xa1a2, 0x5000, 0x8424,
+ 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0xa192, 0x7700, 0x2009,
+ 0x0000, 0x2001, 0x0031, 0x1078, 0x1c9d, 0x2218, 0x2079, 0x5000,
+ 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109,
+ 0x00c0, 0x10dc, 0x7ef2, 0x8528, 0x7de6, 0x7cea, 0x7bee, 0x7883,
+ 0x0000, 0x2031, 0x0030, 0x78cf, 0x0101, 0x780b, 0x0002, 0x780f,
+ 0x0002, 0x784f, 0x0003, 0x2069, 0x5040, 0x2001, 0x04fd, 0x2004,
+ 0xa082, 0x0005, 0x0048, 0x1104, 0x0038, 0x1100, 0x0078, 0x1108,
+ 0x681b, 0x003c, 0x0078, 0x110a, 0x00a8, 0x1108, 0x681b, 0x003c,
+ 0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, 0x680f, 0x0008,
+ 0x6813, 0x0005, 0x6823, 0x0000, 0x6827, 0x0006, 0x6817, 0x0008,
+ 0x682b, 0x0000, 0x681f, 0x0019, 0x2069, 0x5280, 0x2011, 0x0020,
+ 0x2009, 0x0010, 0x680b, 0x080c, 0x680f, 0x0019, 0x6803, 0xfd00,
X 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
- 0x8109, 0x00c0, 0x1102, 0x2069, 0x3a80, 0x20a9, 0x0080, 0x680b,
- 0x0040, 0x7be8, 0xa386, 0xfeff, 0x00c0, 0x1124, 0x6817, 0x0100,
- 0x681f, 0x0064, 0x0078, 0x1128, 0x6817, 0x0064, 0x681f, 0x0002,
- 0xade8, 0x0010, 0x0070, 0x112e, 0x0078, 0x1117, 0x1078, 0x1d15,
- 0x1078, 0x3366, 0x1078, 0x18a4, 0x1078, 0x37fc, 0x3200, 0xa085,
- 0x000d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x1145, 0x70c0, 0xa086,
- 0x0002, 0x00c0, 0x1145, 0x1078, 0x1274, 0x1078, 0x1186, 0x78c0,
- 0xa005, 0x00c0, 0x1151, 0x1078, 0x1a99, 0x0068, 0x1155, 0x1078,
- 0x1c6f, 0x0068, 0x1155, 0x1078, 0x1997, 0x00e0, 0x1145, 0x1078,
- 0x369a, 0x0078, 0x1145, 0x1163, 0x1165, 0x1ebb, 0x1ebb, 0x33d7,
- 0x33d7, 0x1ebb, 0x1ebb, 0x0078, 0x1163, 0x0078, 0x1165, 0x0078,
- 0x1167, 0x0078, 0x1169, 0x2009, 0x0022, 0x2104, 0xa086, 0x4000,
- 0x0040, 0x1181, 0x7008, 0x800b, 0x00c8, 0x1181, 0x7007, 0x0002,
- 0xa08c, 0x0060, 0x00c0, 0x1182, 0xa084, 0x0008, 0x0040, 0x1181,
- 0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x1277, 0x0068, 0x11f1,
- 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x11f1, 0x7814,
- 0xa005, 0x00c0, 0x1197, 0x0010, 0x11f2, 0x0078, 0x11f1, 0x2009,
- 0x3968, 0x2104, 0xa005, 0x00c0, 0x11f1, 0x2009, 0x3971, 0x200b,
- 0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11bc, 0x7816, 0x2009,
- 0x396f, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
+ 0x8109, 0x00c0, 0x1122, 0x2069, 0x5300, 0x2009, 0x0002, 0x20a9,
+ 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bf0, 0xa386, 0xfeff,
+ 0x00c0, 0x1148, 0x6817, 0x0100, 0x681f, 0x0064, 0x0078, 0x114c,
+ 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x0070, 0x1152,
+ 0x0078, 0x1139, 0x8109, 0x00c0, 0x1137, 0x1078, 0x21e9, 0x1078,
+ 0x46e9, 0x1078, 0x1946, 0x1078, 0x4bdf, 0x3200, 0xa085, 0x000d,
+ 0x2090, 0x70c3, 0x0000, 0x0090, 0x116c, 0x70c0, 0xa086, 0x0002,
+ 0x00c0, 0x116c, 0x1078, 0x1284, 0x1078, 0x1196, 0x78cc, 0xa005,
+ 0x00c0, 0x117a, 0x1078, 0x1cc6, 0x0010, 0x1180, 0x0068, 0x1180,
+ 0x1078, 0x20c8, 0x0010, 0x1180, 0x0068, 0x1180, 0x1078, 0x1a2b,
+ 0x00e0, 0x116c, 0x1078, 0x4a66, 0x0078, 0x116c, 0x118e, 0x1190,
+ 0x23ea, 0x23ea, 0x476a, 0x476a, 0x23ea, 0x23ea, 0x0078, 0x118e,
+ 0x0078, 0x1190, 0x0078, 0x1192, 0x0078, 0x1194, 0x0068, 0x1201,
+ 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1201, 0x7814,
+ 0xa005, 0x00c0, 0x11a7, 0x0010, 0x1202, 0x0078, 0x1201, 0x2009,
+ 0x505b, 0x2104, 0xa005, 0x00c0, 0x1201, 0x2009, 0x5064, 0x200b,
+ 0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11cc, 0x7816, 0x2009,
+ 0x5062, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
X 0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce,
- 0x1078, 0x1896, 0x0078, 0x11ef, 0x7814, 0xa086, 0x0018, 0x00c0,
- 0x11c3, 0x1078, 0x1622, 0x7817, 0x0000, 0x2009, 0x396f, 0x2104,
- 0xa065, 0x0040, 0x11df, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x18f6,
- 0x0c7f, 0x609f, 0x0000, 0x1078, 0x16e9, 0x2009, 0x001c, 0x6087,
- 0x0103, 0x1078, 0x181d, 0x00c0, 0x11eb, 0x1078, 0x1896, 0x2009,
- 0x396f, 0x200b, 0x0000, 0x2009, 0x3969, 0x2104, 0x200b, 0x0000,
- 0xa005, 0x0040, 0x11ef, 0x2001, 0x4005, 0x0078, 0x1276, 0x0078,
- 0x1274, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000,
- 0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1242, 0x2038,
- 0x0079, 0x1202, 0x1274, 0x12cf, 0x1293, 0x12cf, 0x1338, 0x1338,
- 0x128a, 0x16fd, 0x1343, 0x1282, 0x1297, 0x1299, 0x129b, 0x129d,
- 0x1702, 0x1282, 0x1355, 0x1380, 0x163a, 0x16f7, 0x129f, 0x1569,
- 0x158b, 0x15a1, 0x15be, 0x1526, 0x1534, 0x1548, 0x155c, 0x13f3,
- 0x1282, 0x13a1, 0x13a7, 0x13ac, 0x13b1, 0x13b7, 0x13bc, 0x13c1,
- 0x13c6, 0x13cb, 0x13cf, 0x13e4, 0x13f0, 0x1282, 0x1282, 0x1282,
- 0x1282, 0x13ff, 0x1408, 0x1417, 0x143d, 0x1447, 0x144e, 0x1474,
- 0x1483, 0x1492, 0x14a4, 0x1506, 0x1516, 0x1282, 0x1282, 0x1282,
- 0x1282, 0x151b, 0xa0bc, 0xffa0, 0x00c0, 0x1282, 0x2038, 0xa084,
- 0x001f, 0x0079, 0x124b, 0x1719, 0x171c, 0x172c, 0x17a8, 0x17e1,
- 0x1282, 0x1282, 0x1282, 0x1282, 0x1282, 0x1282, 0x1282, 0x1282,
- 0x1282, 0x1282, 0x1282, 0x12c5, 0x132e, 0x134b, 0x1376, 0x1630,
- 0x1282, 0x1282, 0x1282, 0x1282, 0x1282, 0x17f9, 0x1803, 0x1807,
- 0x1815, 0x1282, 0x1282, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
- 0x1276, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068,
- 0x1277, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091,
- 0x4080, 0x007c, 0x70c3, 0x4001, 0x0078, 0x1277, 0x70c3, 0x4006,
- 0x0078, 0x1277, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005,
- 0x53a3, 0x0078, 0x1274, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078,
- 0x1274, 0x0078, 0x1274, 0x0078, 0x1274, 0x0078, 0x1274, 0x2091,
- 0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf,
- 0x2020, 0x70d3, 0x0002, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b,
- 0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051,
- 0x0470, 0x2061, 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091,
- 0x5000, 0x2091, 0x4080, 0x0078, 0x0455, 0x1078, 0x1a04, 0x00c0,
- 0x1286, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x12d2, 0x2029,
- 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0, 0x2098,
- 0x2031, 0x0030, 0x81ff, 0x0040, 0x1274, 0x7007, 0x0004, 0x731a,
- 0x721e, 0x7422, 0x7526, 0x2051, 0x0012, 0x2049, 0x130d, 0x2041,
- 0x1274, 0x7003, 0x0002, 0xa786, 0x0001, 0x0040, 0x12f5, 0xa786,
- 0x0050, 0x0040, 0x12f5, 0x0078, 0x12fb, 0x2049, 0x131a, 0x2041,
- 0x1326, 0x7003, 0x0003, 0x7017, 0x0000, 0x810b, 0x7112, 0x00c8,
- 0x1303, 0x7017, 0x0001, 0x7007, 0x0001, 0xa786, 0x0001, 0x0040,
- 0x131a, 0xa786, 0x0050, 0x0040, 0x131a, 0x700c, 0xa084, 0x007f,
- 0x2009, 0x0040, 0xa102, 0x8004, 0x094a, 0x20a8, 0x26a0, 0x53a6,
- 0x0078, 0x116b, 0x700c, 0xa084, 0x007f, 0x0040, 0x131a, 0x80ac,
- 0x0048, 0x131a, 0x2698, 0x53a5, 0x0078, 0x116b, 0x700c, 0xa084,
- 0x007f, 0x80ac, 0x2698, 0x53a5, 0x0078, 0x1274, 0x1078, 0x1a04,
- 0x00c0, 0x1286, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x12d2,
- 0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x1340, 0x200a,
- 0x72ca, 0x0078, 0x1273, 0x70c7, 0x0002, 0x70cb, 0x000a, 0x70cf,
- 0x0000, 0x0078, 0x1274, 0x1078, 0x1a04, 0x00c0, 0x1286, 0x75d8,
- 0x76dc, 0x75da, 0x76de, 0x0078, 0x1358, 0x2029, 0x0000, 0x2530,
- 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, 0x73ce, 0x74d2,
- 0xa005, 0x0040, 0x1370, 0x8001, 0x788a, 0x7a92, 0x7b96, 0x7d9a,
- 0x7e9e, 0x7c8e, 0x78c0, 0xa084, 0xfffc, 0x78c2, 0x0078, 0x1374,
- 0x78c0, 0xa085, 0x0001, 0x78c2, 0x0078, 0x1274, 0x1078, 0x1a04,
- 0x00c0, 0x1286, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1383,
+ 0x1078, 0x192b, 0x0078, 0x11ff, 0x7814, 0xa086, 0x0018, 0x00c0,
+ 0x11d3, 0x1078, 0x165a, 0x7817, 0x0000, 0x2009, 0x5062, 0x2104,
+ 0xa065, 0x0040, 0x11ef, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1996,
+ 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c, 0x6007,
+ 0x0103, 0x1078, 0x1907, 0x00c0, 0x11fb, 0x1078, 0x192b, 0x2009,
+ 0x5062, 0x200b, 0x0000, 0x2009, 0x505c, 0x2104, 0x200b, 0x0000,
+ 0xa005, 0x0040, 0x11ff, 0x2001, 0x4005, 0x0078, 0x1286, 0x0078,
+ 0x1284, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000,
+ 0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1252, 0x2038,
+ 0x0079, 0x1212, 0x1284, 0x12e5, 0x12a9, 0x12fe, 0x130d, 0x1313,
+ 0x12a0, 0x1748, 0x1317, 0x1298, 0x12ad, 0x12af, 0x12b1, 0x12b3,
+ 0x174d, 0x1298, 0x1329, 0x1360, 0x1672, 0x1742, 0x12b5, 0x1591,
+ 0x15ad, 0x15c9, 0x15f4, 0x154a, 0x1558, 0x156c, 0x1580, 0x13df,
+ 0x1298, 0x138d, 0x1393, 0x1398, 0x139d, 0x13a3, 0x13a8, 0x13ad,
+ 0x13b2, 0x13b7, 0x13bb, 0x13d0, 0x13dc, 0x1298, 0x1298, 0x1298,
+ 0x1298, 0x13eb, 0x13f4, 0x1403, 0x1429, 0x1433, 0x143a, 0x1480,
+ 0x148f, 0x149e, 0x14b0, 0x152a, 0x153a, 0x1298, 0x1298, 0x1298,
+ 0x1298, 0x153f, 0xa0bc, 0xffa0, 0x00c0, 0x1298, 0x2038, 0xa084,
+ 0x001f, 0x0079, 0x125b, 0x1786, 0x1789, 0x1799, 0x1298, 0x1298,
+ 0x18d8, 0x18f5, 0x1298, 0x1298, 0x1298, 0x18f9, 0x1901, 0x1298,
+ 0x1298, 0x1298, 0x1298, 0x12db, 0x12f4, 0x131f, 0x1356, 0x1668,
+ 0x1764, 0x1778, 0x1298, 0x1829, 0x1298, 0x18b4, 0x18be, 0x18c2,
+ 0x18d0, 0x1298, 0x1298, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
+ 0x1286, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068,
+ 0x1287, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x00e0,
+ 0x128f, 0x00e0, 0x1291, 0x0068, 0x1291, 0x2091, 0x4080, 0x007c,
+ 0x70c3, 0x4001, 0x0078, 0x1287, 0x70c3, 0x4006, 0x0078, 0x1287,
+ 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078,
+ 0x1284, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x1284, 0x0078,
+ 0x1284, 0x0078, 0x1284, 0x0078, 0x1284, 0x2091, 0x8000, 0x70c3,
+ 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
+ 0x0007, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031,
+ 0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061,
+ 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091,
+ 0x4080, 0x0078, 0x0455, 0x1078, 0x1b36, 0x00c0, 0x129c, 0x75d8,
+ 0x74dc, 0x75da, 0x74de, 0x0078, 0x12e8, 0x2029, 0x0000, 0x2520,
+ 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1a70, 0x0040, 0x1284,
+ 0x70c3, 0x4002, 0x0078, 0x1284, 0x1078, 0x1b36, 0x00c0, 0x129c,
+ 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1301, 0x2029, 0x0000,
+ 0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1ad0, 0x0040,
+ 0x1284, 0x70c3, 0x4002, 0x0078, 0x1284, 0x71c4, 0x70c8, 0x2114,
+ 0x200a, 0x0078, 0x1282, 0x71c4, 0x2114, 0x0078, 0x1282, 0x70c7,
+ 0x0007, 0x70cb, 0x003f, 0x70cf, 0x0000, 0x0078, 0x1284, 0x1078,
+ 0x1b36, 0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
+ 0x132c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
+ 0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x1350, 0x8001,
+ 0x7892, 0xa084, 0xfc00, 0x0040, 0x1345, 0x78cc, 0xa085, 0x0001,
+ 0x78ce, 0x2001, 0x4005, 0x0078, 0x1286, 0x7a9a, 0x7b9e, 0x7da2,
+ 0x7ea6, 0x7c96, 0x78cc, 0xa084, 0xfffc, 0x78ce, 0x0078, 0x1354,
+ 0x78cc, 0xa085, 0x0001, 0x78ce, 0x0078, 0x1284, 0x1078, 0x1b36,
+ 0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1363,
X 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6,
- 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x139b, 0x8001, 0x78a6,
- 0x7aae, 0x7bb2, 0x7db6, 0x7eba, 0x7caa, 0x78c0, 0xa084, 0xfcff,
- 0x78c2, 0x0078, 0x139f, 0x78c0, 0xa085, 0x0100, 0x78c2, 0x0078,
- 0x1274, 0x2009, 0x395f, 0x210c, 0x7ae4, 0x0078, 0x1272, 0x2009,
- 0x3941, 0x210c, 0x0078, 0x1273, 0x2009, 0x3942, 0x210c, 0x0078,
- 0x1273, 0x2061, 0x3940, 0x610c, 0x6210, 0x0078, 0x1272, 0x2009,
- 0x3945, 0x210c, 0x0078, 0x1273, 0x2009, 0x3946, 0x210c, 0x0078,
- 0x1273, 0x2009, 0x3947, 0x210c, 0x0078, 0x1273, 0x2009, 0x3948,
- 0x210c, 0x0078, 0x1273, 0x7908, 0x7a0c, 0x0078, 0x1272, 0x71c4,
- 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x3a00,
- 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x13e1, 0x6b08, 0x0078,
- 0x13e2, 0x6b0c, 0x0078, 0x1271, 0x77c4, 0x1078, 0x18b4, 0x2091,
- 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x1271,
- 0x794c, 0x0078, 0x1273, 0x77c4, 0x1078, 0x18b4, 0x2091, 0x8000,
- 0x6908, 0x6a18, 0x6b10, 0x2091, 0x8001, 0x0078, 0x1271, 0x71c4,
- 0xa182, 0x0010, 0x00c8, 0x126c, 0x1078, 0x1d9b, 0x0078, 0x1271,
- 0x71c4, 0xa182, 0x0010, 0x00c8, 0x126c, 0x2011, 0x3941, 0x2204,
- 0x007e, 0x2112, 0x1078, 0x1d54, 0x017f, 0x0078, 0x1273, 0x71c4,
- 0x2011, 0x1435, 0x20a9, 0x0008, 0x2204, 0xa106, 0x0040, 0x1427,
- 0x8210, 0x0070, 0x1425, 0x0078, 0x141c, 0x0078, 0x126c, 0xa292,
- 0x1435, 0x027e, 0x2011, 0x3942, 0x2204, 0x2112, 0x017f, 0x007e,
- 0x1078, 0x1d60, 0x017f, 0x0078, 0x1273, 0x03e8, 0x00fa, 0x01f4,
- 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061, 0x3940, 0x610c,
- 0x6210, 0x70c4, 0x600e, 0x70c8, 0x6012, 0x0078, 0x1272, 0x2061,
- 0x3940, 0x6114, 0x70c4, 0x6016, 0x0078, 0x1273, 0x71c4, 0x2011,
- 0x0004, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, 0x1467, 0x2011,
- 0x0005, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040, 0x1467, 0x2011,
- 0x0006, 0x2019, 0x2323, 0xa186, 0x003c, 0x00c0, 0x126c, 0x2061,
- 0x3940, 0x6018, 0x007e, 0x611a, 0x23b8, 0x1078, 0x1d71, 0x1078,
- 0x37fc, 0x017f, 0x0078, 0x1273, 0x71c4, 0xa184, 0xffcf, 0x00c0,
- 0x126c, 0x2011, 0x3947, 0x2204, 0x2112, 0x007e, 0x1078, 0x1d93,
- 0x017f, 0x0078, 0x1273, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x126c,
- 0x2011, 0x3948, 0x2204, 0x007e, 0x2112, 0x1078, 0x1d82, 0x017f,
- 0x0078, 0x1273, 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x126b,
- 0xa284, 0xfffd, 0x00c0, 0x126b, 0x2100, 0x7908, 0x780a, 0x2200,
- 0x7a0c, 0x780e, 0x0078, 0x1272, 0x71c4, 0x8107, 0xa084, 0x000f,
- 0x8003, 0x8003, 0x8003, 0xa0e8, 0x3a00, 0x2019, 0x0000, 0x72c8,
- 0x6800, 0x007e, 0xa226, 0x0040, 0x14d3, 0x6a02, 0xa484, 0x2000,
- 0x0040, 0x14bc, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x14c2,
- 0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x14d3, 0x810f, 0xa284,
- 0x4000, 0x0040, 0x14cf, 0x1078, 0x1db5, 0x0078, 0x14d3, 0x1078,
- 0x1da7, 0x0078, 0x14d3, 0x72cc, 0x82ff, 0x0040, 0x14ff, 0x6808,
- 0xa206, 0x0040, 0x14ff, 0xa2a4, 0x00ff, 0x2061, 0x3940, 0x6118,
- 0xa186, 0x0028, 0x0040, 0x14ec, 0xa186, 0x0032, 0x0040, 0x14f2,
- 0xa186, 0x003c, 0x0040, 0x14f8, 0xa482, 0x0064, 0x00c8, 0x126d,
- 0x0078, 0x14fc, 0xa482, 0x0050, 0x00c8, 0x126d, 0x0078, 0x14fc,
- 0xa482, 0x0043, 0x00c8, 0x126d, 0x6a0a, 0xa39d, 0x000a, 0x6804,
- 0xa305, 0x6806, 0x027f, 0x6b0c, 0x0078, 0x1271, 0x77c4, 0x1078,
- 0x18b4, 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8,
- 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, 0x1271, 0x70c4, 0x794c,
- 0x784e, 0x0078, 0x1273, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010,
- 0x00c8, 0x126c, 0x1078, 0x1dc3, 0x0078, 0x1271, 0x77c4, 0x1078,
- 0x18b4, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002, 0x6a0a, 0x2091,
- 0x8001, 0x2708, 0x0078, 0x1272, 0x77c4, 0x1078, 0x18b4, 0x2091,
- 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040,
- 0x1543, 0x1078, 0x1cf6, 0x2091, 0x8001, 0x2708, 0x0078, 0x1272,
- 0x77c4, 0x1078, 0x18b4, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0004,
- 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1557, 0x1078, 0x1cf6, 0x2091,
- 0x8001, 0x2708, 0x0078, 0x1272, 0x77c4, 0x2041, 0x0001, 0x2049,
- 0x0005, 0x2051, 0x0020, 0x1078, 0x18c1, 0x2708, 0x6a08, 0x0078,
- 0x1272, 0x77c4, 0x73c8, 0x72cc, 0x77c6, 0x73ca, 0x72ce, 0x1078,
- 0x193c, 0x00c0, 0x1587, 0x6818, 0xa005, 0x0040, 0x1581, 0x2708,
- 0x1078, 0x1dd3, 0x00c0, 0x1581, 0x7817, 0x0015, 0x2091, 0x8001,
- 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x1276, 0x2091,
- 0x8001, 0x0078, 0x1274, 0x77c4, 0x77c6, 0x2061, 0x3940, 0x60a3,
- 0x0003, 0x67b6, 0x60c7, 0x000f, 0x2041, 0x0021, 0x2049, 0x0005,
- 0x2051, 0x0020, 0x1078, 0x18c1, 0x7817, 0x0016, 0x1078, 0x1cf6,
- 0x007c, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2061, 0x3940, 0x60a3,
- 0x0002, 0x67b6, 0x60c7, 0x000f, 0x7817, 0x0017, 0x1078, 0x1cf6,
- 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078, 0x18c1,
- 0x8738, 0xa784, 0x0007, 0x00c0, 0x15b6, 0x007c, 0x78c0, 0xa084,
- 0x0003, 0x00c0, 0x15e2, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049,
- 0x0004, 0x2051, 0x0008, 0x1078, 0x18b4, 0x2091, 0x8000, 0x6808,
- 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x0007, 0x00c0,
- 0x15cb, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00,
- 0x00c0, 0x15cb, 0x2091, 0x8000, 0x2069, 0x0100, 0x6830, 0xa084,
- 0x0040, 0x0040, 0x160b, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
- 0xa084, 0x0004, 0x0040, 0x15f8, 0x0070, 0x15f8, 0x0078, 0x15ef,
- 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040,
- 0x1605, 0x0070, 0x1605, 0x0078, 0x15fc, 0x20a9, 0x00fa, 0x0070,
- 0x160b, 0x0078, 0x1607, 0x2079, 0x3900, 0x7817, 0x0018, 0x2061,
- 0x3940, 0x60a3, 0x0001, 0x60c7, 0x000f, 0x78c0, 0xa085, 0x0002,
- 0x78c2, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0047, 0x2091,
- 0x8001, 0x007c, 0x78c0, 0xa084, 0xfffd, 0x78c2, 0xa084, 0x0001,
- 0x00c0, 0x162c, 0x1078, 0x197e, 0x71c4, 0x71c6, 0x794a, 0x007c,
- 0x1078, 0x1a04, 0x00c0, 0x1286, 0x75d8, 0x74dc, 0x75da, 0x74de,
- 0x0078, 0x163d, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc,
- 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x3900, 0x1078, 0x188d, 0x0040,
- 0x16e5, 0x20a9, 0x0005, 0x20a1, 0x3916, 0x41a1, 0x2009, 0x0040,
- 0x1078, 0x1857, 0x0040, 0x1658, 0x1078, 0x1896, 0x0078, 0x16e5,
- 0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x16b9, 0x0c7e,
- 0x2c68, 0x1078, 0x188d, 0x0040, 0x1688, 0x2c00, 0x689e, 0x8109,
- 0x00c0, 0x1660, 0x609f, 0x0000, 0x0c7f, 0x0c7e, 0x7218, 0x731c,
- 0x7420, 0x7524, 0x2c68, 0x689c, 0xa065, 0x0040, 0x16b8, 0x2009,
- 0x0040, 0x1078, 0x1857, 0x00c0, 0x16a1, 0x6004, 0xa084, 0x00ff,
- 0xa086, 0x0002, 0x00c0, 0x1688, 0x2d00, 0x6002, 0x0078, 0x166e,
- 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x18f6, 0x0c7f, 0x609f,
- 0x0000, 0x1078, 0x16e9, 0x2009, 0x001c, 0x6008, 0xa085, 0x0200,
- 0x600a, 0x6004, 0x6086, 0x1078, 0x181d, 0x1078, 0x1896, 0x0078,
- 0x16e5, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x18f6, 0x0c7f,
- 0x609f, 0x0000, 0x1078, 0x16e9, 0x2009, 0x001c, 0x6087, 0x0103,
- 0x601b, 0x0003, 0x1078, 0x181d, 0x1078, 0x1896, 0x0078, 0x16e5,
- 0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x7817, 0x0012, 0x0e7e,
- 0x2071, 0x3940, 0x70a3, 0x0005, 0x70a7, 0x0000, 0x73aa, 0x72ae,
- 0x74b2, 0x70b6, 0x70bb, 0x0000, 0x2c00, 0x70be, 0x70c3, 0x0000,
- 0xa02e, 0x2530, 0x611c, 0xa184, 0x0060, 0x0040, 0x16d9, 0x1078,
- 0x330a, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x669a, 0x60af, 0x0000,
- 0x60b3, 0x0000, 0x1078, 0x1cf6, 0x007c, 0x70c3, 0x4005, 0x0078,
- 0x1277, 0x20a9, 0x0005, 0x2099, 0x3916, 0x530a, 0x2100, 0xa210,
- 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4,
- 0x70c7, 0x0000, 0x7906, 0x0078, 0x1274, 0x71c4, 0x71c6, 0x2168,
- 0x0078, 0x1704, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210,
- 0x8d68, 0x8109, 0x00c0, 0x1706, 0xa285, 0x0000, 0x00c0, 0x1714,
- 0x70c3, 0x4000, 0x0078, 0x1716, 0x70c3, 0x4003, 0x70ca, 0x0078,
- 0x1277, 0x79d8, 0x0078, 0x1273, 0x71c4, 0x71c6, 0x2198, 0x20a1,
- 0x0042, 0x20a9, 0x0004, 0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9,
- 0x0004, 0x53a3, 0x0078, 0x1274, 0x70c4, 0x2068, 0x2079, 0x3900,
- 0x1078, 0x188d, 0x0040, 0x17a4, 0x6007, 0x0001, 0x600b, 0x0000,
- 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x0007, 0xa284,
- 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016, 0xa284,
- 0x0800, 0x0040, 0x174f, 0x601b, 0x000a, 0x0078, 0x1755, 0xa284,
- 0x1000, 0x0040, 0x1755, 0x601b, 0x000c, 0xa284, 0x0300, 0x0040,
- 0x175e, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085, 0x0001,
- 0x601e, 0x6023, 0x0000, 0x6027, 0x000a, 0xa284, 0x0400, 0x0040,
- 0x176b, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b, 0x20a0,
- 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0, 0x1780,
- 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078, 0x178a,
- 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c, 0x6552,
- 0x6596, 0x669a, 0x6014, 0x7817, 0x0042, 0x2c08, 0x2061, 0x3940,
- 0x60a3, 0x0005, 0x60a7, 0x0000, 0x60ab, 0x0000, 0x60af, 0x0000,
- 0x60b3, 0x0000, 0x60b6, 0x61be, 0xa284, 0x0400, 0x60c2, 0x1078,
- 0x32f5, 0x1078, 0x1cf6, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1277,
- 0x78f0, 0xa005, 0x0040, 0x1282, 0x2091, 0x8000, 0x70c4, 0x800a,
- 0x2011, 0x0010, 0x810c, 0x0048, 0x17ba, 0x3a00, 0xa084, 0xfff7,
- 0x0078, 0x17bd, 0x3a00, 0xa085, 0x0008, 0x20d0, 0x0005, 0x0005,
- 0xa084, 0xfffb, 0x20d0, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
- 0x0005, 0x0005, 0x0005, 0xa085, 0x0004, 0x20d0, 0x0005, 0x0005,
- 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x8211, 0x00c0,
- 0x17b2, 0x3a00, 0xa085, 0x0008, 0x20d0, 0x2091, 0x8001, 0x0078,
- 0x1274, 0x2011, 0x04fd, 0x2204, 0xa082, 0x0004, 0x0048, 0x17f5,
- 0x78f3, 0x0001, 0x2009, 0xff01, 0x200a, 0x2001, 0x000c, 0x20d8,
- 0x2001, 0x000c, 0x20d0, 0x0078, 0x1274, 0x2001, 0x4005, 0x0078,
- 0x1276, 0x7978, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x126c,
- 0x797a, 0x0078, 0x1274, 0x7978, 0x71c6, 0x0078, 0x1274, 0x796c,
- 0x71c6, 0x71c4, 0x796e, 0x7970, 0x71ca, 0x71c8, 0x7972, 0x7974,
- 0x71ce, 0x71cc, 0x7976, 0x0078, 0x1274, 0x796c, 0x71c6, 0x7970,
- 0x71ca, 0x7974, 0x71ce, 0x0078, 0x1274, 0x700c, 0xa084, 0x00ff,
- 0x0040, 0x1829, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
- 0x1824, 0x7017, 0x0000, 0x7112, 0x721a, 0x731e, 0x7422, 0x7526,
- 0xac80, 0x0001, 0x8108, 0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030,
- 0x6084, 0x20a2, 0x53a6, 0x780c, 0xa085, 0x0000, 0x7002, 0x7007,
- 0x0001, 0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1841,
- 0x7108, 0x8103, 0x00c8, 0x1841, 0x7014, 0xa005, 0x0040, 0x1841,
- 0x7007, 0x0002, 0xa184, 0x0060, 0x7003, 0x0000, 0x007c, 0x700c,
- 0xa084, 0x00ff, 0x0040, 0x1863, 0x7007, 0x0004, 0x7004, 0xa084,
- 0x0004, 0x00c0, 0x185e, 0x7017, 0x0000, 0x7112, 0x721a, 0x7422,
- 0x7526, 0x731e, 0x2099, 0x0030, 0x8108, 0x81ac, 0x780c, 0xa085,
- 0x0001, 0x7002, 0x7007, 0x0001, 0x2009, 0x0022, 0x2104, 0xa084,
- 0x4000, 0x00c0, 0x1874, 0x7008, 0x800b, 0x00c8, 0x1874, 0x7007,
- 0x0002, 0xa08c, 0x0060, 0x00c0, 0x188a, 0xac80, 0x0001, 0x20a0,
- 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x7850, 0xa065, 0x0040,
- 0x1895, 0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079,
- 0x3900, 0x7850, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x18a1, 0x1078,
- 0x1eac, 0x7852, 0x0f7f, 0x007c, 0x2011, 0x4400, 0x7a52, 0x7be4,
- 0x8319, 0x0040, 0x18b1, 0xa280, 0x002f, 0x2012, 0x2010, 0x0078,
- 0x18a8, 0x2013, 0x0000, 0x007c, 0xa784, 0x0f00, 0x800c, 0xa784,
- 0x0007, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e8, 0x3a80,
- 0x007c, 0x1078, 0x18b4, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808,
- 0xa084, 0xffef, 0xa80d, 0x690a, 0x2091, 0x8000, 0x2009, 0x394f,
- 0x210c, 0x6804, 0xa005, 0x0040, 0x18de, 0xa116, 0x00c0, 0x18de,
- 0x2060, 0x6000, 0x6806, 0x017e, 0x0078, 0x18e1, 0x2009, 0x0000,
- 0x017e, 0x6804, 0xa065, 0x0040, 0x18f0, 0x6000, 0x6806, 0x1078,
- 0x1903, 0x1078, 0x1a14, 0x6810, 0x8001, 0x6812, 0x00c0, 0x18e1,
- 0x017f, 0x6902, 0x6906, 0x2091, 0x8001, 0x007c, 0xa065, 0x0040,
- 0x1902, 0x609c, 0x609f, 0x0000, 0x2008, 0x1078, 0x1896, 0x2100,
- 0x0078, 0x18f6, 0x007c, 0x6007, 0x0103, 0x20a9, 0x001c, 0xac80,
- 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a, 0x682c,
- 0x6022, 0x007c, 0x0e7e, 0x2071, 0x3940, 0x7040, 0xa08c, 0x0080,
- 0x00c0, 0x1920, 0xa088, 0x3980, 0x2d0a, 0x8000, 0x7042, 0xa006,
- 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x3940, 0x2009, 0x3980, 0x7240,
- 0x8221, 0x8211, 0x0048, 0x193a, 0x2104, 0x8108, 0xad06, 0x00c0,
- 0x1929, 0x8119, 0x211e, 0x8108, 0x8318, 0x8211, 0x00c8, 0x1932,
- 0x7442, 0xa006, 0x0e7f, 0x007c, 0x1078, 0x18b4, 0x2091, 0x8000,
- 0x6804, 0x781e, 0xa065, 0x0040, 0x197d, 0x0078, 0x194d, 0x2c00,
- 0x781e, 0x6000, 0xa065, 0x0040, 0x197d, 0x6010, 0xa306, 0x00c0,
- 0x1947, 0x600c, 0xa206, 0x00c0, 0x1947, 0x2c28, 0x6804, 0xac06,
- 0x00c0, 0x1964, 0x6000, 0x2060, 0x6806, 0xa005, 0x00c0, 0x1964,
- 0x6803, 0x0000, 0x0078, 0x196e, 0x6400, 0x781c, 0x2060, 0x6402,
- 0xa486, 0x0000, 0x00c0, 0x196e, 0x2c00, 0x6802, 0x2560, 0x1078,
- 0x1903, 0x601b, 0x0005, 0x6023, 0x0020, 0x1078, 0x1a14, 0x6810,
- 0x8001, 0x6812, 0x2001, 0xffff, 0xa005, 0x007c, 0x2039, 0x0000,
- 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078, 0x18c1,
- 0x8738, 0xa784, 0x0007, 0x00c0, 0x1986, 0xa7bc, 0xff00, 0x873f,
- 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1986, 0x007c, 0x2061,
- 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x19a8, 0x2091, 0x8000,
- 0x78d4, 0x78d7, 0x0000, 0x2091, 0x8001, 0xa005, 0x00c0, 0x19a9,
- 0x007c, 0xa08c, 0xfff0, 0x0040, 0x19af, 0x1078, 0x1eac, 0x0079,
- 0x19b1, 0x19c1, 0x19c3, 0x19c9, 0x19cd, 0x19c1, 0x19d1, 0x19c1,
- 0x19d8, 0x19dc, 0x19e0, 0x1a0a, 0x1a0e, 0x19c1, 0x19c1, 0x19c1,
- 0x19c1, 0x1078, 0x1eac, 0x1078, 0x197e, 0x2001, 0x8001, 0x0078,
- 0x1276, 0x2001, 0x8003, 0x0078, 0x1276, 0x2001, 0x8004, 0x0078,
- 0x1276, 0x1078, 0x197e, 0x2001, 0x8006, 0x007c, 0x0078, 0x1276,
- 0x2001, 0x8008, 0x0078, 0x1276, 0x2001, 0x8009, 0x0078, 0x1276,
- 0x2091, 0x8000, 0x2069, 0x3940, 0x6800, 0xa086, 0x0000, 0x0040,
- 0x19ee, 0x2091, 0x8001, 0x78d7, 0x0009, 0x007c, 0x68b4, 0xa0bc,
- 0xff00, 0x2091, 0x8000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
- 0x0010, 0x1078, 0x18c1, 0x8738, 0xa784, 0x0007, 0x00c0, 0x19f9,
- 0x2001, 0x800a, 0x0078, 0x1276, 0x2001, 0x04fd, 0x2004, 0xa086,
- 0x0004, 0x007c, 0x2001, 0x800c, 0x0078, 0x1276, 0x1078, 0x197e,
- 0x2001, 0x800d, 0x0078, 0x1276, 0x6004, 0x6086, 0x2c08, 0x2063,
- 0x0000, 0x787c, 0x8000, 0x787e, 0x7880, 0xa005, 0x7982, 0x0040,
- 0x1a24, 0x2c02, 0x0078, 0x1a25, 0x7986, 0x007c, 0x0c7e, 0x2061,
- 0x3900, 0x6887, 0x0103, 0x2d08, 0x206b, 0x0000, 0x607c, 0x8000,
- 0x607e, 0x6080, 0xa005, 0x6182, 0x0040, 0x1a39, 0x2d02, 0x0078,
- 0x1a3a, 0x6186, 0x0c7f, 0x007c, 0x1078, 0x1a4d, 0x0040, 0x1a4c,
- 0x0c7e, 0x609c, 0xa065, 0x0040, 0x1a47, 0x1078, 0x18f6, 0x0c7f,
- 0x609f, 0x0000, 0x1078, 0x1896, 0x007c, 0x7884, 0xa065, 0x0040,
- 0x1a5f, 0x2091, 0x8000, 0x787c, 0x8001, 0x787e, 0x2c04, 0x7886,
- 0xa005, 0x00c0, 0x1a5d, 0x7882, 0x8000, 0x2091, 0x8001, 0x007c,
- 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x1a69,
- 0xa200, 0x0070, 0x1a6d, 0x0078, 0x1a64, 0x8086, 0x818e, 0x007c,
- 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x1a93, 0xa11a, 0x00c8,
- 0x1a93, 0x8213, 0x818d, 0x0048, 0x1a84, 0xa11a, 0x00c8, 0x1a85,
- 0x0070, 0x1a8b, 0x0078, 0x1a79, 0xa11a, 0x2308, 0x8210, 0x0070,
- 0x1a8b, 0x0078, 0x1a79, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080,
- 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078,
- 0x1a8f, 0x798c, 0x70d0, 0x007e, 0x007f, 0xa106, 0x0040, 0x1ae9,
- 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1ae9,
- 0x7008, 0x7208, 0xa206, 0x00c0, 0x1ae9, 0xa286, 0x0008, 0x00c0,
- 0x1ae9, 0x2071, 0x0010, 0x1078, 0x188d, 0x0040, 0x1ae9, 0x7a94,
- 0x7b90, 0x7c9c, 0x7d98, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399,
- 0x0000, 0x2009, 0x0040, 0x1078, 0x1857, 0x2091, 0x8001, 0x0040,
- 0x1ae0, 0x1078, 0x1896, 0x78a0, 0x8000, 0x78a2, 0xa086, 0x0002,
- 0x00c0, 0x1ae9, 0x2091, 0x8000, 0x78d7, 0x0002, 0x78a3, 0x0000,
- 0x78c0, 0xa085, 0x0003, 0x78c2, 0x2091, 0x8001, 0x0078, 0x1ae9,
- 0x78a3, 0x0000, 0x1078, 0x1c38, 0x6004, 0xa084, 0x000f, 0x0079,
- 0x1aee, 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x1afe, 0x1b20,
- 0x1b46, 0x1afe, 0x1b58, 0x1b0d, 0x1afe, 0x1afe, 0x1afe, 0x1b1a,
- 0x1b40, 0x1afe, 0x1afe, 0x1afe, 0x1afe, 0x1afe, 0x2039, 0x0400,
- 0x78d0, 0xa705, 0x78d2, 0x6008, 0xa705, 0x600a, 0x1078, 0x1b96,
- 0x609c, 0x78ce, 0x1078, 0x1c20, 0x007c, 0x78d0, 0xa084, 0x0100,
- 0x0040, 0x1b14, 0x0078, 0x1afe, 0x601c, 0xa085, 0x0080, 0x601e,
- 0x0078, 0x1b27, 0x1078, 0x1a04, 0x00c0, 0x1afe, 0x1078, 0x1c52,
- 0x78d0, 0xa084, 0x0100, 0x0040, 0x1b27, 0x0078, 0x1afe, 0x78d3,
- 0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78c6, 0x8001, 0x609f,
- 0x0000, 0x0040, 0x1b3d, 0x1078, 0x1b96, 0x0040, 0x1b3d, 0x78d0,
- 0xa085, 0x0100, 0x78d2, 0x0078, 0x1b3f, 0x1078, 0x1bba, 0x007c,
- 0x1078, 0x1a04, 0x00c0, 0x1afe, 0x1078, 0x1c4e, 0x78d0, 0xa08c,
- 0x0e00, 0x00c0, 0x1b4f, 0xa084, 0x0100, 0x00c0, 0x1b51, 0x0078,
- 0x1afe, 0x1078, 0x1b96, 0x00c0, 0x1b57, 0x1078, 0x1bba, 0x007c,
- 0x78d0, 0xa084, 0x0100, 0x0040, 0x1b5f, 0x0078, 0x1afe, 0x78d3,
- 0x0000, 0x6714, 0x20a9, 0x0001, 0x6018, 0xa005, 0x0040, 0x1b7a,
- 0xa7bc, 0xff00, 0x20a9, 0x0008, 0xa08e, 0x0001, 0x0040, 0x1b7a,
- 0x2039, 0x0000, 0x20a9, 0x0080, 0xa08e, 0x0002, 0x0040, 0x1b7a,
- 0x0078, 0x1b93, 0x1078, 0x18b4, 0x2d00, 0xa088, 0x0002, 0x2091,
- 0x8000, 0x2168, 0x682b, 0x0000, 0x682f, 0x0000, 0x2104, 0xa084,
- 0xffde, 0x200a, 0x2100, 0xa088, 0x0010, 0x2091, 0x8001, 0x0070,
- 0x1b93, 0x0078, 0x1b7f, 0x1078, 0x1896, 0x007c, 0x78c8, 0xa06d,
- 0x00c0, 0x1ba1, 0x2c00, 0x78ca, 0x78ce, 0x609f, 0x0000, 0x0078,
- 0x1bad, 0x2c00, 0x689e, 0x609f, 0x0000, 0x78ca, 0x2d00, 0x6002,
- 0x78cc, 0xad06, 0x00c0, 0x1bad, 0x6002, 0x78c4, 0x8001, 0x78c6,
- 0x00c0, 0x1bb9, 0x78d0, 0xa084, 0x0000, 0x78d2, 0x78cc, 0x2060,
- 0xa006, 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0xc1ff,
- 0x601e, 0xa184, 0x0060, 0x0040, 0x1bc9, 0x0e7e, 0x1078, 0x330a,
- 0x0e7f, 0x6596, 0x669a, 0x6714, 0x1078, 0x18b4, 0x2091, 0x8000,
- 0x6808, 0xa084, 0x0001, 0x0040, 0x1be5, 0x2091, 0x8001, 0x1078,
- 0x1903, 0x2091, 0x8000, 0x1078, 0x1a14, 0x2091, 0x8001, 0x78cb,
- 0x0000, 0x78cf, 0x0000, 0x0078, 0x1c1f, 0x6024, 0xa096, 0x0001,
- 0x00c0, 0x1bec, 0x8000, 0x6026, 0x6a10, 0x6814, 0x2091, 0x8001,
- 0xa202, 0x0048, 0x1bfb, 0x0040, 0x1bfb, 0x2039, 0x0200, 0x1078,
- 0x1c20, 0x0078, 0x1c1f, 0x2c08, 0x2091, 0x8000, 0x6800, 0xa065,
- 0x0040, 0x1c03, 0x6102, 0x6902, 0x00c0, 0x1c07, 0x6906, 0x2160,
- 0x6003, 0x0000, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0x6808,
- 0xa08c, 0x0040, 0x0040, 0x1c19, 0xa086, 0x0040, 0x680a, 0x1078,
- 0x1912, 0x1078, 0x1cf6, 0x78cf, 0x0000, 0x78cb, 0x0000, 0x007c,
- 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x1a14, 0x2091,
- 0x8001, 0x78cc, 0xa065, 0x0040, 0x1c33, 0x609c, 0x78ce, 0x609f,
- 0x0000, 0x0078, 0x1c23, 0x78cb, 0x0000, 0x78cf, 0x0000, 0x007c,
- 0x7988, 0x788c, 0x8000, 0xa10a, 0x00c8, 0x1c3f, 0xa006, 0x788e,
- 0x70d2, 0x7804, 0xa005, 0x0040, 0x1c4d, 0x8001, 0x7806, 0x00c0,
- 0x1c4d, 0x0068, 0x1c4d, 0x2091, 0x4080, 0x007c, 0x2039, 0x1c66,
- 0x0078, 0x1c54, 0x2039, 0x1c6c, 0x2704, 0xa005, 0x0040, 0x1c65,
- 0xac00, 0x2068, 0x6b08, 0x6c0c, 0x6910, 0x6a14, 0x690a, 0x6a0e,
- 0x6b12, 0x6c16, 0x8738, 0x0078, 0x1c54, 0x007c, 0x0003, 0x0009,
- 0x000f, 0x0015, 0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x0068,
- 0x1c87, 0x2029, 0x0000, 0x7884, 0xa065, 0x0040, 0x1c82, 0x1078,
- 0x1c88, 0x0040, 0x1c82, 0x1078, 0x1c99, 0x00c0, 0x1c82, 0x8528,
- 0x0078, 0x1c73, 0x85ff, 0x0040, 0x1c87, 0x2091, 0x4080, 0x007c,
- 0x7ba4, 0x79a8, 0x70d4, 0x007e, 0x007f, 0xa102, 0x00c0, 0x1c93,
- 0x2300, 0xa005, 0x007c, 0x0048, 0x1c97, 0xa302, 0x007c, 0x8002,
- 0x007c, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0,
- 0x1cdd, 0x7008, 0x7208, 0xa206, 0x00c0, 0x1cdd, 0xa286, 0x0008,
- 0x00c0, 0x1cdd, 0x2071, 0x0010, 0x1078, 0x1ce2, 0x2009, 0x001c,
- 0x6028, 0xa005, 0x0040, 0x1cb6, 0x2009, 0x0040, 0x1078, 0x181d,
- 0x0040, 0x1ccf, 0x78bc, 0x8000, 0x78be, 0xa086, 0x0002, 0x00c0,
- 0x1cdd, 0x2091, 0x8000, 0x78d7, 0x0003, 0x78bf, 0x0000, 0x78c0,
- 0xa085, 0x0300, 0x78c2, 0x2091, 0x8001, 0x0078, 0x1cdd, 0x78bf,
- 0x0000, 0x1078, 0x1a3c, 0x79a4, 0x78a8, 0x8000, 0xa10a, 0x00c8,
- 0x1cda, 0xa006, 0x78aa, 0x70d6, 0xa006, 0x2071, 0x0010, 0x2091,
- 0x8001, 0x007c, 0x8107, 0x8004, 0x8004, 0x7ab0, 0x7bac, 0x7cb8,
- 0x7db4, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
- 0x007c, 0x2009, 0x3968, 0x2091, 0x8000, 0x200a, 0x0f7e, 0x2079,
- 0x0100, 0x2009, 0x3940, 0x2091, 0x8000, 0x2104, 0xa086, 0x0000,
- 0x00c0, 0x1d11, 0x2009, 0x3912, 0x2104, 0xa005, 0x00c0, 0x1d11,
- 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1d11, 0x0018, 0x1d11, 0x781b,
- 0x0045, 0x2091, 0x8001, 0x0f7f, 0x007c, 0x127e, 0x2091, 0x2300,
- 0x2071, 0x3940, 0x2079, 0x0100, 0x784b, 0x000f, 0x2019, 0x3205,
- 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040, 0x1d2f, 0x789a, 0x8318,
- 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318, 0x0078, 0x1d22, 0x789b,
- 0x0020, 0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x0020, 0x0070,
- 0x1d3b, 0x0078, 0x1d33, 0x7003, 0x0000, 0x1078, 0x1e40, 0x7004,
- 0xa084, 0x000f, 0xa085, 0x6280, 0x7806, 0x780f, 0x9200, 0x7843,
- 0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7047, 0x397f, 0x7043,
- 0x0000, 0x127f, 0x2000, 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101,
- 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x1078, 0x1e40, 0x007c,
- 0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x0070, 0x1d69, 0x0078,
- 0x1d64, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012,
- 0x007c, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, 0x1d7a,
- 0x0078, 0x1d75, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205,
- 0x200a, 0x007c, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070,
- 0x1d8b, 0x0078, 0x1d86, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff,
- 0xa105, 0x2012, 0x007c, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf,
- 0xa105, 0x2012, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e,
- 0x2061, 0x0100, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103,
- 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4,
- 0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080,
- 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020,
- 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e,
- 0x2061, 0x0100, 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae,
- 0x2018, 0x0c7f, 0x007c, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040,
- 0x1e1c, 0x2061, 0x4380, 0x1078, 0x1e22, 0x0040, 0x1e06, 0x20a9,
- 0x0000, 0x2061, 0x4280, 0x0c7e, 0x1078, 0x1e22, 0x0040, 0x1df0,
- 0x0c7f, 0x8c60, 0x0070, 0x1dee, 0x0078, 0x1de3, 0x0078, 0x1e1c,
- 0x007f, 0xa082, 0x4280, 0x2071, 0x3940, 0x70ba, 0x6020, 0xa085,
- 0x0800, 0x6022, 0x2091, 0x8001, 0x71b6, 0x2001, 0x0004, 0x70a2,
- 0x70c7, 0x000f, 0x1078, 0x1cf1, 0x0078, 0x1e18, 0x2071, 0x3940,
- 0x6020, 0xa085, 0x0800, 0x6022, 0x2091, 0x8001, 0x71b6, 0x2c00,
- 0x70be, 0x2001, 0x0006, 0x70a2, 0x70c7, 0x000f, 0x1078, 0x1cf1,


SHAR_EOF
true || echo 'restore of patch-2.2.7 failed'
fi

echo 'End of part 07'
echo 'File patch-2.2.7 is continued in part 08'
echo 08 > _shar_seq_.tmp

Thomas...@ciw.uni-karlsruhe.de

unread,
May 1, 1999, 3:00:00 AM5/1/99
to
Archive-name: v2.2/patch-2.2.7/part08

#!/bin/sh
# this is part 08 of a 22 - part archive


# do not concatenate these parts, unpack them in order with /bin/sh
# file patch-2.2.7 continued
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck

if test "$Scheck" != 08; then


echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping patch-2.2.7'
else
echo 'x - continuing with patch-2.2.7'
sed 's/^X//' << 'SHAR_EOF' >> 'patch-2.2.7' &&

- 0x2001, 0x0000, 0x0078, 0x1e1e, 0x2001, 0x0001, 0xa005, 0x0e7f,
- 0x0c7f, 0x007c, 0x2091, 0x8000, 0x2c04, 0xa005, 0x0040, 0x1e3b,
- 0x2060, 0x6010, 0xa306, 0x00c0, 0x1e38, 0x600c, 0xa206, 0x00c0,
- 0x1e38, 0x6014, 0xa106, 0x00c0, 0x1e38, 0xa006, 0x0078, 0x1e3f,
- 0x6000, 0x0078, 0x1e25, 0xa085, 0x0001, 0x2091, 0x8001, 0x007c,
- 0x2011, 0x3941, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204,
- 0xa084, 0x0100, 0x0040, 0x1e56, 0x2021, 0xff04, 0x2122, 0x810b,
- 0x810b, 0x810b, 0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e,
- 0x68e4, 0xa08c, 0x0020, 0x0040, 0x1eaa, 0xa084, 0x0006, 0x00c0,
- 0x1eaa, 0x6014, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
- 0xa0f0, 0x3a00, 0x7004, 0xa084, 0x000a, 0x00c0, 0x1eaa, 0x7108,
- 0xa194, 0xff00, 0x0040, 0x1eaa, 0xa18c, 0x00ff, 0x2001, 0x000c,
- 0xa106, 0x0040, 0x1e91, 0x2001, 0x0012, 0xa106, 0x0040, 0x1e95,
- 0x2001, 0x0014, 0xa106, 0x0040, 0x1e99, 0x2001, 0x0019, 0xa106,
- 0x0040, 0x1e9d, 0x2001, 0x0032, 0xa106, 0x0040, 0x1ea1, 0x0078,
- 0x1ea5, 0x2009, 0x0012, 0x0078, 0x1ea7, 0x2009, 0x0014, 0x0078,
- 0x1ea7, 0x2009, 0x0019, 0x0078, 0x1ea7, 0x2009, 0x0020, 0x0078,
- 0x1ea7, 0x2009, 0x003f, 0x0078, 0x1ea7, 0x2011, 0x0000, 0x2100,
- 0xa205, 0x700a, 0x0e7f, 0x007c, 0x2071, 0x0010, 0x70ca, 0x007f,
- 0x70c6, 0x70c3, 0x8002, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091,
- 0x4080, 0x0078, 0x1eb9, 0x107e, 0x007e, 0x127e, 0x2091, 0x2300,
- 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x2009, 0x3974, 0x78a0, 0x200a,
- 0x8108, 0x250a, 0x8108, 0x240a, 0x8108, 0x260a, 0x8108, 0x270a,
- 0xa594, 0x003f, 0xa484, 0x4000, 0x0040, 0x1edc, 0xa784, 0x007c,
- 0x00c0, 0x318f, 0x1078, 0x1eac, 0xa49c, 0x000f, 0xa382, 0x0004,
- 0x0050, 0x1ee4, 0x1078, 0x1eac, 0x8507, 0xa084, 0x000f, 0x0079,
- 0x1ee9, 0x236e, 0x240d, 0x242e, 0x2699, 0x28dd, 0x293b, 0x2984,
- 0x29f0, 0x2a8d, 0x2b1a, 0x1f11, 0x1ef9, 0x21c3, 0x2288, 0x28bc,
- 0x1ef9, 0x1078, 0x1eac, 0x0018, 0x1ec0, 0x127f, 0x2091, 0x8001,
- 0x007f, 0x107f, 0x007c, 0x7003, 0x0000, 0x703f, 0x0000, 0x7030,
- 0xa005, 0x0040, 0x1f0d, 0x7033, 0x0000, 0x1078, 0x316a, 0x0018,
- 0x1ec0, 0x2009, 0x390f, 0x200b, 0x0000, 0x705c, 0xa005, 0x00c0,
- 0x1fe2, 0x70a0, 0xa084, 0x0007, 0x0079, 0x1f1e, 0x2005, 0x1f26,
- 0x1f34, 0x1f51, 0x1f73, 0x1fc0, 0x1f99, 0x1f26, 0x7808, 0xa084,
- 0xfffd, 0x780a, 0x2009, 0x0047, 0x1078, 0x27c1, 0x00c0, 0x1f32,
- 0x7003, 0x0004, 0x0078, 0x1efb, 0x1078, 0x3151, 0x00c0, 0x1f4f,
- 0x70b4, 0x8007, 0x7882, 0x789b, 0x0010, 0x78ab, 0x000c, 0x789b,
- 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009, 0x00fb, 0x1078,
- 0x27bf, 0x00c0, 0x1f4f, 0x7003, 0x0004, 0x70c7, 0x000f, 0x0078,
- 0x1efb, 0x1078, 0x3151, 0x00c0, 0x1f71, 0x71b4, 0x8107, 0x7882,
- 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d, 0x00c0, 0x79aa, 0x78ab,
- 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009,
- 0x00fb, 0x1078, 0x27bf, 0x00c0, 0x1f71, 0x7003, 0x0004, 0x70c7,
- 0x000f, 0x0078, 0x1efb, 0x1078, 0x3151, 0x00c0, 0x1f97, 0x71b4,
- 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d, 0x00c0,
- 0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab, 0x000d, 0x789b,
- 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009, 0x00fb, 0x1078,
- 0x27bf, 0x00c0, 0x1f97, 0x7003, 0x0004, 0x70c7, 0x000f, 0x0078,
- 0x1efb, 0x1078, 0x3151, 0x00c0, 0x1fbe, 0x71b4, 0x8107, 0x7882,
- 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d, 0x00c0, 0x79aa, 0x78ab,
- 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009,
- 0x00fb, 0x1078, 0x27bf, 0x00c0, 0x1fbe, 0x70bc, 0x70bf, 0x0000,
- 0x2068, 0x703e, 0x7003, 0x0002, 0x70c7, 0x000f, 0x0078, 0x1efb,
- 0x1078, 0x3151, 0x00c0, 0x1efb, 0x70bc, 0x2068, 0x1078, 0x31f3,
- 0x789b, 0x0010, 0x6814, 0xa084, 0x0007, 0xa085, 0x0080, 0x007e,
- 0x007f, 0x78aa, 0x6e1c, 0x067e, 0x067f, 0x2041, 0x0001, 0x70c0,
- 0xa084, 0x0400, 0x2001, 0x0004, 0x0040, 0x1fe0, 0x2001, 0x0006,
- 0x0078, 0x20e1, 0x1078, 0x3151, 0x00c0, 0x1efb, 0x789b, 0x0010,
- 0x705c, 0x2068, 0x1078, 0x31f3, 0x6f14, 0x1078, 0x3099, 0x6008,
- 0xa085, 0x0010, 0x600a, 0xad80, 0x0009, 0x2003, 0x0005, 0x6814,
- 0xa084, 0x0007, 0xa085, 0x0080, 0x78aa, 0x2031, 0x0020, 0x2041,
- 0x0001, 0x2001, 0x0003, 0x0078, 0x20e1, 0x0018, 0x1ec0, 0x7440,
- 0xa485, 0x0000, 0x0040, 0x201f, 0xa080, 0x3980, 0x2030, 0x7144,
- 0x8108, 0xa12a, 0x0048, 0x2016, 0x2009, 0x3980, 0x2164, 0x6504,
- 0x85ff, 0x00c0, 0x202c, 0x8421, 0x00c0, 0x2010, 0x7146, 0x7003,
- 0x0000, 0x703f, 0x0000, 0x0078, 0x1efb, 0x7640, 0xa6b0, 0x3980,
- 0x7144, 0x2600, 0x0078, 0x201b, 0x7146, 0x2568, 0x2558, 0x753e,
- 0x2c50, 0x6708, 0x7736, 0xa784, 0x013f, 0x0040, 0x2059, 0xa784,
- 0x0021, 0x00c0, 0x2029, 0xa784, 0x0002, 0x0040, 0x2046, 0xa784,
- 0x0004, 0x0040, 0x2029, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0008,
- 0x00c0, 0x2029, 0xa784, 0x0010, 0x00c0, 0x2029, 0xa784, 0x0100,
- 0x0040, 0x2059, 0x6018, 0xa005, 0x00c0, 0x2029, 0xa7bc, 0xfeff,
- 0x670a, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e, 0x6118, 0x0040,
- 0x2069, 0x601c, 0xa102, 0x0048, 0x206c, 0x0040, 0x206c, 0x0078,
- 0x2025, 0x81ff, 0x00c0, 0x2025, 0xa784, 0x0080, 0x00c0, 0x2072,
- 0x700c, 0x6022, 0x1078, 0x31f3, 0x0018, 0x1ec0, 0x789b, 0x0010,
- 0xa046, 0x1078, 0x3151, 0x00c0, 0x1efb, 0x6b14, 0xa39c, 0x0007,
- 0xa39d, 0x00c0, 0x704c, 0xa084, 0x8000, 0x0040, 0x208b, 0xa684,
- 0x0001, 0x0040, 0x208d, 0xa39c, 0xffbf, 0xa684, 0x0010, 0x0040,
- 0x2093, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684, 0x000e, 0x00c0,
- 0x209e, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x20df, 0x714c, 0xa18c,
- 0x0800, 0x0040, 0x2cfc, 0x2011, 0x0021, 0x8004, 0x8004, 0x0048,
- 0x20b5, 0x2011, 0x0022, 0x8004, 0x0048, 0x20b5, 0x2011, 0x0020,
- 0x8004, 0x0048, 0x20b5, 0x0040, 0x20df, 0x7aaa, 0x8840, 0x1078,
- 0x316a, 0x6a14, 0x610c, 0x8108, 0xa18c, 0x00ff, 0xa1e0, 0x4280,
- 0x2c64, 0x8cff, 0x0040, 0x20d6, 0x6014, 0xa206, 0x00c0, 0x20c0,
- 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x20bb, 0x0c7e, 0x2a60, 0x6008,
- 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078, 0x2005, 0x1078, 0x3151,
- 0x00c0, 0x1efb, 0x2a60, 0x610e, 0x79aa, 0x8840, 0x712e, 0x2001,
- 0x0001, 0x007e, 0x7150, 0xa184, 0x0018, 0x0040, 0x20fc, 0xa184,
- 0x0010, 0x0040, 0x20ef, 0x1078, 0x2ee3, 0x00c0, 0x211f, 0xa184,
- 0x0008, 0x0040, 0x20fc, 0x69a0, 0xa184, 0x0600, 0x00c0, 0x20fc,
- 0x1078, 0x2ddf, 0x0078, 0x211f, 0x69a0, 0xa184, 0x0800, 0x0040,
- 0x2113, 0x0c7e, 0x027e, 0x2960, 0x6000, 0xa085, 0x2000, 0x6002,
- 0x6104, 0xa18d, 0x0010, 0x6106, 0x027f, 0x0c7f, 0x1078, 0x2ee3,
- 0x00c0, 0x211f, 0x69a0, 0xa184, 0x0200, 0x0040, 0x211b, 0x1078,
- 0x2e2e, 0x0078, 0x211f, 0xa184, 0x0400, 0x00c0, 0x20f8, 0x69a0,
- 0xa184, 0x1000, 0x0040, 0x212a, 0x6914, 0xa18c, 0xff00, 0x810f,
- 0x1078, 0x1da7, 0x007f, 0x7002, 0xa68c, 0x00e0, 0xa684, 0x0060,
- 0x0040, 0x2138, 0xa086, 0x0060, 0x00c0, 0x2138, 0xa18d, 0x4000,
- 0x88ff, 0x0040, 0x213d, 0xa18d, 0x0004, 0x795a, 0x69b6, 0x789b,
- 0x0060, 0x2800, 0x78aa, 0x789b, 0x0061, 0x6818, 0xa08d, 0x8000,
- 0xa084, 0x7fff, 0x691a, 0xa68c, 0x0080, 0x0040, 0x215c, 0x70cb,
- 0x0000, 0xa08a, 0x000d, 0x0050, 0x215a, 0xa08a, 0x000c, 0x71ca,
- 0x2001, 0x000c, 0x800c, 0x71ce, 0x78aa, 0x8008, 0x810c, 0x0040,
- 0x2d07, 0xa18c, 0x00f8, 0x00c0, 0x2d07, 0x157e, 0x137e, 0x147e,
- 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b,
- 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0x8007, 0x7882,
- 0x6d94, 0x7dd6, 0x7dde, 0x6e98, 0x7ed2, 0x7eda, 0x7830, 0xa084,
- 0x00c0, 0x00c0, 0x2185, 0x0098, 0x218d, 0x6008, 0xa084, 0xffef,
- 0x600a, 0x1078, 0x316a, 0x0078, 0x1f03, 0x7200, 0xa284, 0x0007,
- 0xa086, 0x0001, 0x00c0, 0x219a, 0x781b, 0x004a, 0x1078, 0x316a,
- 0x0078, 0x21ab, 0x6ab4, 0xa295, 0x2000, 0x7a5a, 0x781b, 0x004a,
- 0x1078, 0x316a, 0x7200, 0x2500, 0xa605, 0x0040, 0x21ab, 0xa284,
- 0x0007, 0x1079, 0x21b9, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0,
- 0x1efb, 0x6018, 0x8000, 0x601a, 0xad80, 0x0009, 0x7032, 0x0078,
- 0x1efb, 0x21c1, 0x3571, 0x3571, 0x3560, 0x3571, 0x21c1, 0x3560,
- 0x21c1, 0x1078, 0x1eac, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e,
- 0x2079, 0x3900, 0x78c0, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x21e9,
- 0x70a0, 0xa086, 0x0001, 0x00c0, 0x21d8, 0x70a2, 0x0078, 0x226c,
- 0x70a0, 0xa086, 0x0005, 0x00c0, 0x21e7, 0x70bc, 0x2068, 0x681b,
- 0x0004, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x70a3,
- 0x0000, 0x157e, 0x2011, 0x0004, 0x71a0, 0xa186, 0x0001, 0x0040,
- 0x2207, 0xa186, 0x0007, 0x00c0, 0x21fb, 0x2009, 0x3935, 0x200b,
- 0x0005, 0x0078, 0x2207, 0x2009, 0x3913, 0x2104, 0x2009, 0x3912,
- 0x200a, 0x2009, 0x3935, 0x200b, 0x0001, 0x0078, 0x2209, 0x70a3,
- 0x0000, 0x1078, 0x32f5, 0x20a9, 0x0010, 0x2039, 0x0000, 0x1078,
- 0x2f9a, 0xa7b8, 0x0100, 0x0070, 0x2217, 0x0078, 0x220f, 0x7000,
- 0x0079, 0x221a, 0x2248, 0x2231, 0x2231, 0x2224, 0x2248, 0x2248,
- 0x2248, 0x2222, 0x1078, 0x1eac, 0x2021, 0x3957, 0x2404, 0xa005,
- 0x0040, 0x2248, 0xad06, 0x00c0, 0x2231, 0x6800, 0x2022, 0x0078,
- 0x2241, 0x6820, 0xa084, 0x0001, 0x00c0, 0x223d, 0x6f14, 0x1078,
- 0x3099, 0x1078, 0x2cc9, 0x0078, 0x2241, 0x7054, 0x2060, 0x6800,
- 0x6002, 0x6a1a, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078, 0x1a26,
- 0x2021, 0x4380, 0x1078, 0x2272, 0x2021, 0x3957, 0x1078, 0x2272,
- 0x20a9, 0x0000, 0x2021, 0x4280, 0x1078, 0x2272, 0x8420, 0x0070,
- 0x225b, 0x0078, 0x2254, 0x20a9, 0x0080, 0x2061, 0x3a80, 0x6018,
- 0x6110, 0xa102, 0x6012, 0x601b, 0x0000, 0xace0, 0x0010, 0x0070,
- 0x226b, 0x0078, 0x225f, 0x157f, 0x7003, 0x0000, 0x703f, 0x0000,
- 0x0078, 0x1efb, 0x047e, 0x2404, 0xa005, 0x0040, 0x2284, 0x2068,
- 0x6800, 0x007e, 0x6a1a, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078,
- 0x1a26, 0x007f, 0x0078, 0x2274, 0x047f, 0x2023, 0x0000, 0x007c,
- 0xa282, 0x0003, 0x0050, 0x228e, 0x1078, 0x1eac, 0x2300, 0x0079,
- 0x2291, 0x2294, 0x2311, 0x232e, 0xa282, 0x0002, 0x0040, 0x229a,
- 0x1078, 0x1eac, 0x70a0, 0x70a3, 0x0000, 0x70c7, 0x0000, 0x0079,
- 0x22a1, 0x22a9, 0x22a9, 0x22ab, 0x22e9, 0x2d0d, 0x22a9, 0x22e9,
- 0x22a9, 0x1078, 0x1eac, 0x77b4, 0x1078, 0x2f9a, 0x77b4, 0xa7bc,
- 0x0f00, 0x1078, 0x3099, 0x6018, 0xa005, 0x0040, 0x22e0, 0x2021,
- 0x4380, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x2349, 0x0040,
- 0x22e0, 0x157e, 0x20a9, 0x0000, 0x2021, 0x4280, 0x047e, 0x2009,
- 0x0004, 0x2011, 0x0010, 0x1078, 0x2349, 0x047f, 0x0040, 0x22d5,
- 0x8420, 0x0070, 0x22d5, 0x0078, 0x22c6, 0x157f, 0x2021, 0x3957,
- 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x2349, 0x0040, 0x22e0,
- 0x8738, 0xa784, 0x0007, 0x00c0, 0x22b1, 0x0078, 0x1f03, 0x0078,
- 0x1f03, 0x77b4, 0x1078, 0x3099, 0x6018, 0xa005, 0x0040, 0x230f,
- 0x2021, 0x4380, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x2349,
- 0x0040, 0x230f, 0x157e, 0x20a9, 0x0000, 0x2021, 0x4280, 0x047e,
- 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x2349, 0x047f, 0x0040,
- 0x230e, 0x8420, 0x0070, 0x230e, 0x0078, 0x22ff, 0x157f, 0x0078,
- 0x1f03, 0x2200, 0x0079, 0x2314, 0x2317, 0x2319, 0x2319, 0x1078,
- 0x1eac, 0x2009, 0x0012, 0x70a0, 0xa086, 0x0002, 0x0040, 0x2322,
- 0x2009, 0x000e, 0x6818, 0xa084, 0x8000, 0x0040, 0x2328, 0x691a,
- 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x311c, 0x2200, 0x0079,
- 0x2331, 0x2336, 0x2319, 0x2334, 0x1078, 0x1eac, 0x1078, 0x27ce,
- 0x7000, 0xa086, 0x0001, 0x00c0, 0x2c9f, 0x1078, 0x2cdf, 0x6008,
- 0xa084, 0xffef, 0x600a, 0x1078, 0x2c92, 0x0040, 0x2c9f, 0x0078,
- 0x2005, 0x2404, 0xa005, 0x0040, 0x236a, 0x2068, 0x2d04, 0x007e,
- 0x6814, 0xa706, 0x0040, 0x2358, 0x2d20, 0x007f, 0x0078, 0x234a,
- 0x007f, 0x2022, 0x691a, 0x6820, 0xa205, 0x6822, 0x1078, 0x1a26,
- 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
- 0x2cdf, 0x007c, 0xa085, 0x0001, 0x0078, 0x2369, 0x2300, 0x0079,
- 0x2371, 0x2376, 0x2374, 0x23c2, 0x1078, 0x1eac, 0x78e4, 0xa005,
- 0x00d0, 0x238a, 0x0018, 0x238a, 0xa084, 0x0007, 0x0079, 0x2380,
- 0x239b, 0x23a8, 0x238e, 0x2388, 0x3144, 0x3144, 0x2388, 0x23b5,
- 0x1078, 0x1eac, 0x2001, 0x0003, 0x0078, 0x26ad, 0x6818, 0xa084,
- 0x8000, 0x0040, 0x2395, 0x681b, 0x001d, 0x1078, 0x2f7d, 0x781b,
- 0x0053, 0x0078, 0x1efb, 0x6818, 0xa084, 0x8000, 0x0040, 0x23a2,
- 0x681b, 0x001d, 0x1078, 0x2f7d, 0x781b, 0x00de, 0x0078, 0x1efb,
- 0x6818, 0xa084, 0x8000, 0x0040, 0x23af, 0x681b, 0x001d, 0x1078,
- 0x2f7d, 0x781b, 0x00e5, 0x0078, 0x1efb, 0x6818, 0xa084, 0x8000,
- 0x0040, 0x23bc, 0x681b, 0x001d, 0x1078, 0x2f7d, 0x781b, 0x009c,
- 0x0078, 0x1efb, 0xa584, 0x000f, 0x00c0, 0x23e1, 0x1078, 0x27ce,
- 0x7000, 0x0079, 0x23cb, 0x23d3, 0x23d5, 0x23d3, 0x2c9f, 0x2c9f,
- 0x2c9f, 0x2c9f, 0x23d3, 0x1078, 0x1eac, 0x1078, 0x2cdf, 0x6008,
- 0xa084, 0xffef, 0x600a, 0x1078, 0x2c92, 0x0040, 0x2c9f, 0x0078,
- 0x2005, 0x79e4, 0xa005, 0x00d0, 0x238a, 0x0018, 0x238a, 0xa184,
- 0x0007, 0x0079, 0x23eb, 0x23fb, 0x2401, 0x23f5, 0x23f3, 0x3144,
- 0x3144, 0x23f3, 0x313c, 0x1078, 0x1eac, 0x1078, 0x2f85, 0x781b,
- 0x0053, 0x0078, 0x1efb, 0x1078, 0x2f85, 0x781b, 0x00de, 0x0078,
- 0x1efb, 0x1078, 0x2f85, 0x781b, 0x00e5, 0x0078, 0x1efb, 0x1078,
- 0x2f85, 0x781b, 0x009c, 0x0078, 0x1efb, 0x2300, 0x0079, 0x2410,
- 0x2415, 0x2413, 0x2417, 0x1078, 0x1eac, 0x0078, 0x29f0, 0x681b,
- 0x0008, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x29f0,
- 0xa184, 0x0007, 0x0079, 0x2424, 0x242c, 0x2401, 0x238e, 0x311c,
- 0x3144, 0x3144, 0x242c, 0x313c, 0x1078, 0x1eac, 0xa282, 0x0005,
- 0x0050, 0x2434, 0x1078, 0x1eac, 0x2300, 0x0079, 0x2437, 0x243a,
- 0x265e, 0x266a, 0x2200, 0x0079, 0x243d, 0x2457, 0x2444, 0x2457,
- 0x2442, 0x2643, 0x1078, 0x1eac, 0x789b, 0x0018, 0x78a8, 0xa084,
- 0x00ff, 0xa082, 0x0020, 0x0048, 0x2f69, 0xa08a, 0x0004, 0x00c8,
- 0x2f69, 0x0079, 0x2453, 0x2f69, 0x2f69, 0x2f69, 0x2f23, 0x789b,
- 0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x246c, 0xa184, 0x0018,
- 0x0040, 0x2468, 0x0078, 0x2f69, 0x7000, 0xa005, 0x00c0, 0x2462,
- 0x2011, 0x0004, 0x0078, 0x2b28, 0xa184, 0x00ff, 0xa08a, 0x0010,
- 0x00c8, 0x2f69, 0x0079, 0x2474, 0x2486, 0x2484, 0x249e, 0x24a2,
- 0x255a, 0x2f69, 0x2f69, 0x255c, 0x2f69, 0x2f69, 0x263f, 0x263f,
- 0x2f69, 0x2f69, 0x2f69, 0x2641, 0x1078, 0x1eac, 0xa684, 0x1000,
- 0x0040, 0x2493, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a, 0x781b,
- 0x0099, 0x0078, 0x1efb, 0x6818, 0xa084, 0x8000, 0x0040, 0x249c,
- 0x681b, 0x001d, 0x0078, 0x248a, 0x0078, 0x311c, 0x681b, 0x001d,
- 0x0078, 0x2f75, 0x6920, 0xa184, 0x8000, 0x00c0, 0x24ae, 0x68af,
- 0x0000, 0x68b3, 0x0000, 0xa18d, 0x8000, 0x6922, 0xa684, 0x1800,
- 0x00c0, 0x24ed, 0x6820, 0xa084, 0x0001, 0x00c0, 0x24f3, 0x6818,
- 0xa086, 0x0008, 0x00c0, 0x24be, 0x681b, 0x0000, 0xa684, 0x0400,
- 0x0040, 0x2556, 0xa684, 0x0080, 0x0040, 0x24e9, 0x70cb, 0x0000,
- 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, 0x0050, 0x24e9, 0xa08a,
- 0x000c, 0x71ca, 0x2001, 0x000c, 0x800c, 0x71ce, 0x789b, 0x0061,
- 0x78aa, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000,
- 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f,
- 0x157f, 0x781b, 0x0056, 0x0078, 0x1efb, 0xa684, 0x1000, 0x0040,
- 0x24f3, 0x0078, 0x1efb, 0xa684, 0x0060, 0x0040, 0x2552, 0xa684,
- 0x0800, 0x0040, 0x2552, 0xa684, 0x8000, 0x00c0, 0x2503, 0x69b0,
- 0x6aac, 0x0078, 0x251d, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x789b,
- 0x0074, 0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, 0x2510, 0x8000,
- 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
- 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xa684, 0x4000, 0x0040,
- 0x2525, 0xa6b4, 0xbfff, 0x7e5a, 0x6eb6, 0xa006, 0x1078, 0x362f,
- 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040, 0x2534,
- 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x6ba6, 0x7bd6,
- 0x2300, 0xa405, 0x00c0, 0x2544, 0xa6b5, 0x4000, 0x7e5a, 0x6eb6,
- 0x781b, 0x0065, 0x0078, 0x1efb, 0x781b, 0x0065, 0x2200, 0xa115,
- 0x00c0, 0x254e, 0x1078, 0x3571, 0x0078, 0x1efb, 0x1078, 0x35a6,
- 0x0078, 0x1efb, 0x781b, 0x0068, 0x0078, 0x1efb, 0x781b, 0x0056,
- 0x0078, 0x1efb, 0x1078, 0x1eac, 0x0078, 0x25b1, 0x6920, 0xa184,
- 0x0100, 0x0040, 0x2570, 0xa18c, 0xfeff, 0x6922, 0x0c7e, 0x7048,
- 0x2060, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078, 0x25a0,
- 0xa184, 0x0200, 0x0040, 0x25a0, 0xa18c, 0xfdff, 0x6922, 0x0c7e,
- 0x7048, 0x2060, 0x6004, 0xa084, 0xffef, 0x6006, 0x2008, 0x2c48,
- 0x0c7f, 0xa184, 0x0008, 0x0040, 0x25a0, 0x1078, 0x3095, 0x1078,
- 0x2ddf, 0x88ff, 0x0040, 0x25a0, 0x789b, 0x0060, 0x2800, 0x78aa,
- 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x259c,
- 0x781b, 0x0053, 0x0078, 0x1efb, 0x781b, 0x0067, 0x0078, 0x1efb,
- 0x7e58, 0xa684, 0x0400, 0x00c0, 0x25a9, 0x781b, 0x0056, 0x0078,
- 0x1efb, 0x781b, 0x0068, 0x0078, 0x1efb, 0x0078, 0x2f6f, 0x0078,
- 0x2f6f, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040, 0x25af,
- 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0,
- 0x25d4, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x25cc,
- 0x0048, 0x25cc, 0x0078, 0x25ce, 0x0078, 0x255e, 0x24a8, 0x7aa8,
- 0x00f0, 0x25ce, 0x0078, 0x25ba, 0xa284, 0x00f0, 0xa086, 0x0020,
- 0x00c0, 0x2630, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040, 0x25e4,
- 0x0048, 0x25e4, 0x0078, 0x262d, 0xa286, 0x0023, 0x0040, 0x25af,
- 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xa085,
- 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085, 0x0010, 0x600a, 0x0c7e,
- 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0010,
- 0x0040, 0x2608, 0x1078, 0x3095, 0x1078, 0x2ee3, 0x0078, 0x2617,
- 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184,
- 0x0008, 0x0040, 0x25a0, 0x1078, 0x3095, 0x1078, 0x2ddf, 0x88ff,
- 0x0040, 0x25a0, 0x789b, 0x0060, 0x2800, 0x78aa, 0xa6b5, 0x0004,
- 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2629, 0x781b, 0x0053, 0x0078,
- 0x1efb, 0x781b, 0x0067, 0x0078, 0x1efb, 0x7aa8, 0x0078, 0x25ba,
- 0x8318, 0x2300, 0xa102, 0x0040, 0x2639, 0x0048, 0x2639, 0x0078,
- 0x25ba, 0xa284, 0x0080, 0x00c0, 0x2f75, 0x0078, 0x2f6f, 0x0078,
- 0x2f75, 0x0078, 0x2f69, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
- 0xa08e, 0x0001, 0x0040, 0x264e, 0x1078, 0x1eac, 0x7aa8, 0xa294,
- 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x2f69,
- 0x0079, 0x265a, 0x2f69, 0x2d32, 0x2f69, 0x2e7e, 0xa282, 0x0000,
- 0x00c0, 0x2664, 0x1078, 0x1eac, 0x1078, 0x2f7d, 0x781b, 0x0067,
- 0x0078, 0x1efb, 0xa282, 0x0003, 0x00c0, 0x2670, 0x1078, 0x1eac,
- 0xa484, 0x8000, 0x00c0, 0x2693, 0x70a0, 0xa005, 0x0040, 0x267a,
- 0x1078, 0x1eac, 0x6f14, 0x77b6, 0xa7bc, 0x0f00, 0x1078, 0x3099,
- 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x0007, 0x00c0,
- 0x267e, 0x1078, 0x2f81, 0x70a3, 0x0002, 0x2009, 0x3935, 0x200b,
- 0x0009, 0x0078, 0x2695, 0x1078, 0x2f8d, 0x781b, 0x0067, 0x0078,
- 0x1efb, 0xa282, 0x0004, 0x0050, 0x269f, 0x1078, 0x1eac, 0x2300,
- 0x0079, 0x26a2, 0x26a5, 0x2781, 0x27a9, 0xa286, 0x0003, 0x0040,
- 0x26ab, 0x1078, 0x1eac, 0x2001, 0x0000, 0x703a, 0x7000, 0xa084,
- 0x0007, 0x0079, 0x26b3, 0x26bb, 0x26bd, 0x26bd, 0x2871, 0x28a2,
- 0x1f03, 0x28a2, 0x26bb, 0x1078, 0x1eac, 0xa684, 0x1000, 0x00c0,
- 0x26c5, 0x1078, 0x32f5, 0x0040, 0x275b, 0x7868, 0xa08c, 0x00ff,
- 0x0040, 0x270d, 0xa186, 0x0008, 0x00c0, 0x26dc, 0x1078, 0x2cdf,
- 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2c92, 0x0040, 0x270d,
- 0x1078, 0x32f5, 0x0078, 0x26f4, 0xa186, 0x0028, 0x00c0, 0x270d,
- 0x1078, 0x32f5, 0x6008, 0xa084, 0xffef, 0x600a, 0x6018, 0xa005,
- 0x0040, 0x26f4, 0x8001, 0x601a, 0xa005, 0x0040, 0x26f4, 0x8001,
- 0xa005, 0x0040, 0x26f4, 0x601e, 0x6820, 0xa084, 0x0001, 0x0040,
- 0x1f03, 0x6820, 0xa084, 0xfffe, 0x6822, 0x7054, 0x0c7e, 0x2060,
- 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0,
- 0x270a, 0x6002, 0x6006, 0x0078, 0x1f03, 0x017e, 0x1078, 0x27ce,
- 0x017f, 0xa684, 0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14, 0x81ff,
- 0x0040, 0x275b, 0xa186, 0x0002, 0x00c0, 0x2753, 0xa684, 0x0800,
- 0x00c0, 0x272a, 0xa684, 0x0060, 0x0040, 0x272a, 0x78d8, 0x7adc,
- 0x682e, 0x6a32, 0x6820, 0xa084, 0x0800, 0x00c0, 0x275b, 0x8717,
- 0xa294, 0x000f, 0x8213, 0x8213, 0x8213, 0xa290, 0x3a00, 0xa290,
- 0x0000, 0x221c, 0x8210, 0x2204, 0xa085, 0x0018, 0x2012, 0x8211,
- 0xa384, 0x0400, 0x0040, 0x274d, 0x68a0, 0xa084, 0x0100, 0x00c0,
- 0x274d, 0x1078, 0x2830, 0x0078, 0x1f03, 0x6008, 0xa085, 0x0002,
- 0x600a, 0x0078, 0x275b, 0xa186, 0x0018, 0x0040, 0x275b, 0xa186,
- 0x0014, 0x0040, 0x1f03, 0x6916, 0x6818, 0xa084, 0x8000, 0x0040,
- 0x2763, 0x7038, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x1078, 0x2cd0,
- 0x1078, 0x2cdf, 0x00c0, 0x2770, 0x6008, 0xa084, 0xffef, 0x600a,
- 0x6820, 0xa084, 0x0001, 0x00c0, 0x2779, 0x1078, 0x2cc9, 0x0078,
- 0x277d, 0x7054, 0x2060, 0x6800, 0x6002, 0x1078, 0x1a26, 0x0078,
- 0x1f03, 0xa282, 0x0004, 0x0048, 0x2787, 0x1078, 0x1eac, 0x2200,
- 0x0079, 0x278a, 0x2785, 0x278e, 0x2794, 0x278e, 0x1078, 0x2f7d,
- 0x781b, 0x0067, 0x0078, 0x1efb, 0x7890, 0x8007, 0x8001, 0xa084,
- 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186,
- 0x0003, 0x0040, 0x27a5, 0x0078, 0x2f69, 0x781b, 0x0068, 0x0078,
- 0x1efb, 0x6820, 0xa085, 0x0004, 0x6822, 0x82ff, 0x00c0, 0x27b4,
- 0x1078, 0x2f7d, 0x0078, 0x27bb, 0x8211, 0x0040, 0x27b9, 0x1078,
- 0x1eac, 0x1078, 0x2f8d, 0x781b, 0x0067, 0x0078, 0x1efb, 0x1078,
- 0x316a, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x27cb, 0x0018, 0x27cb,
- 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684, 0x0060,
- 0x00c0, 0x27d8, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x282f,
- 0xa684, 0x0800, 0x00c0, 0x27e8, 0x6998, 0x6a94, 0x692e, 0x6a32,
- 0x7000, 0xa086, 0x0006, 0x0040, 0x27e7, 0x1078, 0x32f5, 0x007c,
- 0xa684, 0x0020, 0x0040, 0x2802, 0xa684, 0x4000, 0x0040, 0x27f6,
- 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x27e0, 0x7038, 0xa005,
- 0x00c0, 0x27fc, 0x703b, 0x0015, 0x79d8, 0x7adc, 0x692e, 0x6a32,
- 0x0078, 0x27e0, 0xa684, 0x4000, 0x0040, 0x280c, 0x682f, 0x0000,
- 0x6833, 0x0000, 0x0078, 0x27e0, 0x7038, 0xa005, 0x00c0, 0x2812,
- 0x703b, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb, 0x00c8, 0x2819,
+ 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x1387, 0x8001, 0x78ae,
+ 0xa084, 0xfc00, 0x0040, 0x137c, 0x78cc, 0xa085, 0x0100, 0x78ce,
+ 0x2001, 0x4005, 0x0078, 0x1286, 0x7ab6, 0x7bba, 0x7dbe, 0x7ec2,
+ 0x7cb2, 0x78cc, 0xa084, 0xfcff, 0x78ce, 0x0078, 0x138b, 0x78cc,
+ 0xa085, 0x0100, 0x78ce, 0x0078, 0x1284, 0x2009, 0x5061, 0x210c,
+ 0x7aec, 0x0078, 0x1282, 0x2009, 0x5041, 0x210c, 0x0078, 0x1283,
+ 0x2009, 0x5042, 0x210c, 0x0078, 0x1283, 0x2061, 0x5040, 0x610c,
+ 0x6210, 0x0078, 0x1282, 0x2009, 0x5045, 0x210c, 0x0078, 0x1283,
+ 0x2009, 0x5046, 0x210c, 0x0078, 0x1283, 0x2009, 0x5048, 0x210c,
+ 0x0078, 0x1283, 0x2009, 0x5049, 0x210c, 0x0078, 0x1283, 0x7908,
+ 0x7a0c, 0x0078, 0x1282, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003,
+ 0x8003, 0x8003, 0xa0e8, 0x5280, 0x6a00, 0x6804, 0xa084, 0x0008,
+ 0x0040, 0x13cd, 0x6b08, 0x0078, 0x13ce, 0x6b0c, 0x0078, 0x1281,
+ 0x77c4, 0x1078, 0x1956, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091,
+ 0x8001, 0x2708, 0x0078, 0x1281, 0x794c, 0x0078, 0x1283, 0x77c4,
+ 0x1078, 0x1956, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091,
+ 0x8001, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x127c,
+ 0x1078, 0x22c1, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8,
+ 0x127c, 0x2011, 0x5041, 0x2204, 0x007e, 0x2112, 0x1078, 0x227a,
+ 0x017f, 0x0078, 0x1283, 0x71c4, 0x2011, 0x1421, 0x20a9, 0x0008,
+ 0x2204, 0xa106, 0x0040, 0x1413, 0x8210, 0x0070, 0x1411, 0x0078,
+ 0x1408, 0x0078, 0x127c, 0xa292, 0x1421, 0x027e, 0x2011, 0x5042,
+ 0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x2286, 0x017f, 0x0078,
+ 0x1283, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032,
+ 0x004b, 0x2061, 0x5040, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
+ 0x6012, 0x0078, 0x1282, 0x2061, 0x5040, 0x6114, 0x70c4, 0x6016,
+ 0x0078, 0x1283, 0x2061, 0x5040, 0x71c4, 0x2011, 0x0004, 0x601f,
+ 0x0019, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, 0x145b, 0x2011,
+ 0x0005, 0x601f, 0x0019, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040,
+ 0x145b, 0x2011, 0x0006, 0x601f, 0x000c, 0x2019, 0x2222, 0xa186,
+ 0x003c, 0x00c0, 0x127c, 0x6018, 0x007e, 0x611a, 0x7800, 0xa084,
+ 0x0001, 0x00c0, 0x1476, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
+ 0x0048, 0x146e, 0x0038, 0x1472, 0x0078, 0x1476, 0x0028, 0x1472,
+ 0x0078, 0x1476, 0x2019, 0x2222, 0x0078, 0x1478, 0x2019, 0x1212,
+ 0x23b8, 0x1078, 0x2297, 0x1078, 0x4bdf, 0x017f, 0x0078, 0x1283,
+ 0x71c4, 0xa184, 0xffcf, 0x00c0, 0x127c, 0x2011, 0x5048, 0x2204,
+ 0x2112, 0x007e, 0x1078, 0x22b9, 0x017f, 0x0078, 0x1283, 0x71c4,
+ 0xa182, 0x0010, 0x00c8, 0x127c, 0x2011, 0x5049, 0x2204, 0x007e,
+ 0x2112, 0x1078, 0x22a8, 0x017f, 0x0078, 0x1283, 0x71c4, 0x72c8,
+ 0xa184, 0xfffd, 0x00c0, 0x127b, 0xa284, 0xfffd, 0x00c0, 0x127b,
+ 0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x1282,
+ 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
+ 0x5280, 0x2019, 0x0000, 0x72c8, 0xa284, 0x0080, 0x0040, 0x14c6,
+ 0x6c14, 0x84ff, 0x00c0, 0x14c6, 0x6817, 0x0040, 0xa284, 0x0040,
+ 0x0040, 0x14d0, 0x6c10, 0x84ff, 0x00c0, 0x14d0, 0x6813, 0x0001,
+ 0x6800, 0x007e, 0xa226, 0x0040, 0x14f3, 0x6a02, 0xa484, 0x2000,
+ 0x0040, 0x14dc, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x14e2,
+ 0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x14f3, 0x810f, 0xa284,
+ 0x4000, 0x0040, 0x14ef, 0x1078, 0x22db, 0x0078, 0x14f3, 0x1078,
+ 0x22cd, 0x0078, 0x14f3, 0x72cc, 0x6808, 0xa206, 0x0040, 0x1522,
+ 0xa2a4, 0x00ff, 0x2061, 0x5040, 0x6118, 0xa186, 0x0028, 0x0040,
+ 0x1509, 0xa186, 0x0032, 0x0040, 0x150f, 0xa186, 0x003c, 0x0040,
+ 0x1515, 0xa482, 0x0064, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482,
+ 0x0050, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482, 0x0043, 0x0048,
+ 0x151f, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x127d, 0x6a0a,
+ 0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4,
+ 0x0078, 0x1281, 0x77c4, 0x1078, 0x1956, 0x2091, 0x8000, 0x6a14,
+ 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
+ 0x0078, 0x1281, 0x70c4, 0x794c, 0x784e, 0x0078, 0x1283, 0x71c4,
+ 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x127c, 0x1078, 0x22e9,
+ 0x0078, 0x1281, 0x77c4, 0x1078, 0x1956, 0x2091, 0x8000, 0x6a08,
+ 0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
+ 0x77c4, 0x1078, 0x1956, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
+ 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1567, 0x1078, 0x21b1, 0x2091,
+ 0x8001, 0x2708, 0x0078, 0x1282, 0x77c4, 0x1078, 0x1956, 0x2091,
+ 0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040,
+ 0x157b, 0x1078, 0x21b1, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
+ 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091,
+ 0x8000, 0x1078, 0x1963, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078,
+ 0x1282, 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078,
+ 0x19c4, 0x00c0, 0x15a9, 0x6818, 0xa005, 0x0040, 0x15a9, 0x2708,
+ 0x1078, 0x22f9, 0x00c0, 0x15a9, 0x7817, 0x0015, 0x2091, 0x8001,
+ 0x007c, 0x2091, 0x8001, 0x0078, 0x1284, 0x77c4, 0x77c6, 0x2041,
+ 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
+ 0x1963, 0x2061, 0x5040, 0x606f, 0x0003, 0x6782, 0x6093, 0x000f,
+ 0x6073, 0x0000, 0x7817, 0x0016, 0x1078, 0x21b1, 0x2091, 0x8001,
+ 0x007c, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091,
+ 0x8000, 0x2061, 0x5040, 0x606f, 0x0002, 0x6073, 0x0000, 0x6782,
+ 0x6093, 0x000f, 0x7817, 0x0017, 0x1078, 0x21b1, 0x2091, 0x8001,
+ 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000,
+ 0x1078, 0x1963, 0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0,
+ 0x15e8, 0x2091, 0x8001, 0x007c, 0x78cc, 0xa084, 0x0003, 0x00c0,
+ 0x1618, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
+ 0x0008, 0x1078, 0x1956, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a,
+ 0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1601, 0xa7bc,
+ 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1601,
+ 0x2091, 0x8000, 0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040,
+ 0x1641, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004,
+ 0x0040, 0x162e, 0x0070, 0x162e, 0x0078, 0x1625, 0x684b, 0x0009,
+ 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x163b, 0x0070,
+ 0x163b, 0x0078, 0x1632, 0x20a9, 0x00fa, 0x0070, 0x1641, 0x0078,
+ 0x163d, 0x2079, 0x5000, 0x7817, 0x0018, 0x2061, 0x5040, 0x606f,
+ 0x0001, 0x6073, 0x0000, 0x6093, 0x000f, 0x78cc, 0xa085, 0x0002,
+ 0x78ce, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2091,
+ 0x8001, 0x007c, 0x78cc, 0xa084, 0xfffd, 0x78ce, 0xa084, 0x0001,
+ 0x00c0, 0x1664, 0x1078, 0x1a0e, 0x71c4, 0x71c6, 0x794a, 0x007c,
+ 0x1078, 0x1b36, 0x00c0, 0x129c, 0x75d8, 0x74dc, 0x75da, 0x74de,
+ 0x0078, 0x1675, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc,
+ 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x5000, 0x2091, 0x8000, 0x1078,
+ 0x1911, 0x2091, 0x8001, 0x0040, 0x172c, 0x20a9, 0x0005, 0x20a1,
+ 0x5018, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0020,
+ 0x1078, 0x190c, 0x0040, 0x1698, 0x1078, 0x192b, 0x0078, 0x172c,
+ 0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x16fb, 0x0c7e,
+ 0x2c68, 0x2091, 0x8000, 0x1078, 0x1911, 0x2091, 0x8001, 0x0040,
+ 0x16cc, 0x2c00, 0x689e, 0x8109, 0x00c0, 0x16a0, 0x609f, 0x0000,
+ 0x0c7f, 0x0c7e, 0x7218, 0x731c, 0x7420, 0x7524, 0x2c68, 0x689c,
+ 0xa065, 0x0040, 0x16fa, 0x2009, 0x0020, 0x1078, 0x190c, 0x00c0,
+ 0x16e3, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0002, 0x00c0, 0x16cc,
+ 0x2d00, 0x6002, 0x0078, 0x16b2, 0x0c7f, 0x0c7e, 0x609c, 0x2060,
+ 0x1078, 0x1996, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009,
+ 0x000c, 0x6008, 0xa085, 0x0200, 0x600a, 0x1078, 0x1907, 0x1078,
+ 0x192b, 0x0078, 0x172c, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078,
+ 0x1996, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c,
+ 0x6007, 0x0103, 0x601b, 0x0003, 0x1078, 0x1907, 0x1078, 0x192b,
+ 0x0078, 0x172c, 0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x2091,
+ 0x8000, 0x7817, 0x0012, 0x0e7e, 0x2071, 0x5040, 0x706f, 0x0005,
+ 0x7073, 0x0000, 0x7376, 0x727a, 0x747e, 0x7082, 0x7087, 0x0000,
+ 0x2c00, 0x708a, 0x708f, 0x0000, 0xa02e, 0x2530, 0x611c, 0x61a2,
+ 0xa184, 0x0060, 0x0040, 0x171e, 0x1078, 0x467f, 0x0e7f, 0x6596,
+ 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x1078,
+ 0x21b1, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1287,
+ 0x20a9, 0x0005, 0x2099, 0x5018, 0x2091, 0x8000, 0x530a, 0x2091,
+ 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
+ 0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x1284,
+ 0x71c4, 0x71c6, 0x2168, 0x0078, 0x174f, 0x2069, 0x1000, 0x690c,
+ 0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1751, 0xa285,
+ 0x0000, 0x00c0, 0x175f, 0x70c3, 0x4000, 0x0078, 0x1761, 0x70c3,
+ 0x4003, 0x70ca, 0x0078, 0x1287, 0x2011, 0x5067, 0x220c, 0x70c4,
+ 0x8003, 0x0048, 0x1771, 0x1078, 0x3b49, 0xa184, 0x7fff, 0x0078,
+ 0x1775, 0x1078, 0x3b3c, 0xa185, 0x8000, 0x2012, 0x0078, 0x1283,
+ 0x71c4, 0x1078, 0x3b33, 0x6100, 0x2001, 0x5067, 0x2004, 0xa084,
+ 0x8000, 0xa10d, 0x6204, 0x6308, 0x0078, 0x1281, 0x79e4, 0x0078,
+ 0x1283, 0x71c4, 0x71c6, 0x2198, 0x20a1, 0x0042, 0x20a9, 0x0004,
+ 0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, 0x0004, 0x53a3, 0x0078,
+ 0x1284, 0x70c4, 0x2068, 0x2079, 0x5000, 0x2091, 0x8000, 0x1078,
+ 0x1911, 0x2091, 0x8001, 0x0040, 0x1825, 0x6007, 0x0001, 0x600b,
+ 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x000f,
+ 0xa284, 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016,
+ 0xa284, 0x0800, 0x0040, 0x17c0, 0x601b, 0x000a, 0x0078, 0x17c6,
+ 0xa284, 0x1000, 0x0040, 0x17c6, 0x601b, 0x000c, 0xa284, 0x0300,
+ 0x0040, 0x17cf, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085,
+ 0x0001, 0x601e, 0x6023, 0x0000, 0x6027, 0x0000, 0xa284, 0x0400,
+ 0x0040, 0x17dc, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b,
+ 0x20a0, 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0,
+ 0x17f1, 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078,
+ 0x17fb, 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c,
+ 0x6552, 0x6596, 0x669a, 0x6014, 0x2091, 0x8000, 0x7817, 0x0042,
+ 0x2c08, 0x2061, 0x5040, 0x606f, 0x0005, 0x6073, 0x0000, 0x6077,
+ 0x0000, 0x607b, 0x0000, 0x607f, 0x0000, 0x6082, 0x618a, 0xa284,
+ 0x0400, 0x608e, 0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020, 0x7007,
+ 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091, 0x8000,
+ 0x1078, 0x21b1, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078,
+ 0x1287, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000, 0x2071,
+ 0x5040, 0x2079, 0x0100, 0x2061, 0x0010, 0x70a0, 0xa06d, 0x0040,
+ 0x18aa, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0007, 0x0040, 0x1844,
+ 0xa286, 0x000f, 0x00c0, 0x18aa, 0x691c, 0xa184, 0x0080, 0x00c0,
+ 0x18aa, 0x6824, 0xa18c, 0xff00, 0xa085, 0x0019, 0x6826, 0x71b0,
+ 0x81ff, 0x0040, 0x1865, 0x0d7e, 0x2069, 0x0020, 0x6908, 0x6808,
+ 0xa106, 0x00c0, 0x1856, 0x690c, 0x680c, 0xa106, 0x00c0, 0x185b,
+ 0xa184, 0x00ff, 0x00c0, 0x185b, 0x0d7f, 0x78b8, 0xa084, 0x801f,
+ 0x00c0, 0x1865, 0x7848, 0xa085, 0x000c, 0x784a, 0x71b0, 0x81ff,
+ 0x0040, 0x1888, 0x70b3, 0x0000, 0x0d7e, 0x2069, 0x0020, 0x6807,
+ 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0, 0x1879, 0x6807, 0x0008,
+ 0x6804, 0xa084, 0x0008, 0x00c0, 0x1880, 0x6807, 0x0002, 0x0d7f,
+ 0x61c4, 0x62c8, 0x63cc, 0x61c6, 0x62ca, 0x63ce, 0x0e7e, 0x2071,
+ 0x5000, 0x7266, 0x736a, 0xae80, 0x0019, 0x0e7f, 0x1078, 0x4598,
+ 0x78a3, 0x0000, 0x7858, 0xa084, 0xedff, 0x785a, 0x70b4, 0xa080,
+ 0x00da, 0x781a, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001,
+ 0x0078, 0x1284, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001,
+ 0x2001, 0x4005, 0x0078, 0x1286, 0x7980, 0x71c6, 0x71c4, 0xa182,
+ 0x0003, 0x00c8, 0x127c, 0x7982, 0x0078, 0x1284, 0x7980, 0x71c6,
+ 0x0078, 0x1284, 0x7974, 0x71c6, 0x71c4, 0x7976, 0x7978, 0x71ca,
+ 0x71c8, 0x797a, 0x797c, 0x71ce, 0x71cc, 0x797e, 0x0078, 0x1284,
+ 0x7974, 0x71c6, 0x7978, 0x71ca, 0x797c, 0x71ce, 0x0078, 0x1284,
+ 0x7900, 0x71c6, 0x71c4, 0x7902, 0x2001, 0x04fd, 0x2004, 0xa082,
+ 0x0005, 0x0048, 0x18e7, 0x0038, 0x18e9, 0x0078, 0x18f3, 0x00a8,
+ 0x18f3, 0xa18c, 0x0001, 0x00c0, 0x18f1, 0x20b9, 0x2222, 0x0078,
+ 0x18f3, 0x20b9, 0x1212, 0x0078, 0x1284, 0x7900, 0x71c6, 0x0078,
+ 0x1284, 0x2009, 0x5074, 0x2104, 0x70c6, 0x70c4, 0x200a, 0x0078,
+ 0x1284, 0x2009, 0x5074, 0x2104, 0x70c6, 0x0078, 0x1284, 0xac80,
+ 0x0001, 0x1078, 0x1af2, 0x007c, 0xac80, 0x0001, 0x1078, 0x1a92,
+ 0x007c, 0x7850, 0xa065, 0x0040, 0x1919, 0x2c04, 0x7852, 0x2063,
+ 0x0000, 0x007c, 0x0f7e, 0x2079, 0x5000, 0x7850, 0xa06d, 0x0040,
+ 0x1929, 0x2d04, 0x7852, 0x6803, 0x0000, 0x6807, 0x0000, 0x680b,
+ 0x0000, 0x0f7f, 0x007c, 0x2091, 0x8000, 0x0f7e, 0x2079, 0x5000,
+ 0x7850, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1938, 0x1078, 0x23ca,
+ 0x7852, 0x0f7f, 0x2091, 0x8001, 0x007c, 0x0f7e, 0x2079, 0x5000,
+ 0x7850, 0x206a, 0x2d00, 0x7852, 0x0f7f, 0x007c, 0x2011, 0x7700,
+ 0x7a52, 0x7bec, 0x8319, 0x0040, 0x1953, 0xa280, 0x0031, 0x2012,
+ 0x2010, 0x0078, 0x194a, 0x2013, 0x0000, 0x007c, 0xa784, 0x0f00,
+ 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
+ 0xa0e8, 0x5300, 0x007c, 0x1078, 0x1956, 0x2900, 0x682a, 0x2a00,
+ 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d, 0x690a, 0x2009, 0x5052,
+ 0x210c, 0x6804, 0xa005, 0x0040, 0x1995, 0xa116, 0x00c0, 0x1980,
+ 0x2060, 0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x1983,
+ 0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1992, 0x6000,
+ 0x6806, 0x1078, 0x19a3, 0x1078, 0x1c42, 0x6810, 0x8001, 0x6812,
+ 0x00c0, 0x1983, 0x017f, 0x6902, 0x6906, 0x007c, 0xa065, 0x0040,
+ 0x19a2, 0x609c, 0x609f, 0x0000, 0x2008, 0x1078, 0x192b, 0x2100,
+ 0x0078, 0x1996, 0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
+ 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
+ 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0x2071, 0x5040, 0x704c,
+ 0xa08c, 0x0200, 0x00c0, 0x19c2, 0xa088, 0x5080, 0x2d0a, 0x8000,
+ 0x704e, 0xa006, 0x0e7f, 0x007c, 0x1078, 0x1956, 0x2091, 0x8000,
+ 0x6804, 0x781e, 0xa065, 0x0040, 0x1a0d, 0x0078, 0x19d5, 0x2c00,
+ 0x781e, 0x6000, 0xa065, 0x0040, 0x1a0d, 0x600c, 0xa306, 0x00c0,
+ 0x19cf, 0x6010, 0xa206, 0x00c0, 0x19cf, 0x2c28, 0x2001, 0x5052,
+ 0x2004, 0xac06, 0x00c0, 0x19e6, 0x0078, 0x1a0b, 0x6804, 0xac06,
+ 0x00c0, 0x19f3, 0x6000, 0xa065, 0x6806, 0x00c0, 0x19fd, 0x6803,
+ 0x0000, 0x0078, 0x19fd, 0x6400, 0x781c, 0x2060, 0x6402, 0xa486,
+ 0x0000, 0x00c0, 0x19fd, 0x2c00, 0x6802, 0x2560, 0x1078, 0x19a3,
+ 0x601b, 0x0005, 0x6023, 0x0020, 0x1078, 0x1c42, 0x6810, 0x8001,
+ 0x1050, 0x23ca, 0x6812, 0xa085, 0xffff, 0x007c, 0x2039, 0x0000,
+ 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000,
+ 0x1078, 0x1963, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1a18, 0xa7bc,
+ 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1a18,
+ 0x2091, 0x8001, 0x007c, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001,
+ 0x00c0, 0x1a3c, 0x2091, 0x8000, 0x78e0, 0x78e3, 0x0000, 0x2091,
+ 0x8001, 0xa005, 0x00c0, 0x1a3d, 0x007c, 0xa08c, 0xfff0, 0x0040,
+ 0x1a43, 0x1078, 0x23ca, 0x0079, 0x1a45, 0x1a55, 0x1a58, 0x1a5e,
+ 0x1a62, 0x1a56, 0x1a66, 0x1a6c, 0x1a56, 0x1a56, 0x1c0c, 0x1c30,
+ 0x1c34, 0x1a56, 0x1a56, 0x1a56, 0x1a56, 0x007c, 0x1078, 0x23ca,
+ 0x1078, 0x1a0e, 0x2001, 0x8001, 0x0078, 0x1c3a, 0x2001, 0x8003,
+ 0x0078, 0x1c3a, 0x2001, 0x8004, 0x0078, 0x1c3a, 0x1078, 0x1a0e,
+ 0x2001, 0x8006, 0x0078, 0x1c3a, 0x2001, 0x8007, 0x0078, 0x1c3a,
+ 0x2030, 0x2138, 0xa782, 0x0021, 0x0048, 0x1a78, 0x2009, 0x0020,
+ 0x2600, 0x1078, 0x1a92, 0x00c0, 0x1a91, 0xa7ba, 0x0020, 0x0048,
+ 0x1a90, 0x0040, 0x1a90, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040,
+ 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1a72,
+ 0xa006, 0x007c, 0x81ff, 0x0040, 0x1acd, 0x2099, 0x0030, 0x20a0,
+ 0x700c, 0xa084, 0x00ff, 0x0040, 0x1aa4, 0x7007, 0x0004, 0x7004,
+ 0xa084, 0x0004, 0x00c0, 0x1a9f, 0x21a8, 0x7017, 0x0000, 0x810b,
+ 0x7112, 0x721a, 0x731e, 0x7422, 0x7526, 0x780c, 0xa085, 0x0001,
+ 0x7002, 0x7007, 0x0001, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
+ 0x00c8, 0x1ac1, 0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0,
+ 0x1ab3, 0x7008, 0x800b, 0x00c8, 0x1ab3, 0x7007, 0x0002, 0xa08c,
+ 0x01e0, 0x00c0, 0x1acd, 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c,
+ 0x2030, 0x2138, 0xa782, 0x0021, 0x0048, 0x1ad8, 0x2009, 0x0020,
+ 0x2600, 0x1078, 0x1af2, 0x00c0, 0x1af1, 0xa7ba, 0x0020, 0x0048,
+ 0x1af0, 0x0040, 0x1af0, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040,
+ 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1ad2,
+ 0xa006, 0x007c, 0x81ff, 0x0040, 0x1b33, 0x2098, 0x20a1, 0x0030,
+ 0x700c, 0xa084, 0x00ff, 0x0040, 0x1b04, 0x7007, 0x0004, 0x7004,
+ 0xa084, 0x0004, 0x00c0, 0x1aff, 0x21a8, 0x7017, 0x0000, 0x810b,
+ 0x7112, 0x721a, 0x731e, 0x7422, 0x7526, 0x780c, 0xa085, 0x0000,
+ 0x7002, 0x53a6, 0x7007, 0x0001, 0x2001, 0x04fd, 0x2004, 0xa082,
+ 0x0005, 0x00c8, 0x1b22, 0x2009, 0x0022, 0x2104, 0xa084, 0x4000,
+ 0x00c0, 0x1b14, 0x7010, 0xa084, 0xf000, 0x0040, 0x1b2b, 0x7007,
+ 0x0008, 0x0078, 0x1b2f, 0x7108, 0x8103, 0x00c8, 0x1b14, 0x7007,
+ 0x0002, 0xa184, 0x01e0, 0x7003, 0x0000, 0x007c, 0x2001, 0x04fd,
+ 0x2004, 0xa082, 0x0004, 0x00c8, 0x1b3f, 0x0078, 0x1b42, 0xa006,
+ 0x0078, 0x1b44, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x2071, 0x5000,
+ 0x2d08, 0x7058, 0x6802, 0xa005, 0x00c0, 0x1b4f, 0x715e, 0x715a,
+ 0x0e7f, 0x007c, 0x2c08, 0x7858, 0x6002, 0xa005, 0x00c0, 0x1b59,
+ 0x795e, 0x795a, 0x007c, 0x2091, 0x8000, 0x6003, 0x0000, 0x2c08,
+ 0x785c, 0xa065, 0x00c0, 0x1b67, 0x795a, 0x0078, 0x1b68, 0x6102,
+ 0x795e, 0x2091, 0x8001, 0x1078, 0x21ce, 0x007c, 0x0e7e, 0x2071,
+ 0x5000, 0x7058, 0xa06d, 0x0040, 0x1b7c, 0x6800, 0x705a, 0xa005,
+ 0x00c0, 0x1b7b, 0x705e, 0x8dff, 0x0e7f, 0x007c, 0x0d7e, 0x0c7e,
+ 0x0f7e, 0x2079, 0x5000, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa005,
+ 0x0040, 0x1bac, 0x2068, 0x6814, 0xa306, 0x00c0, 0x1b95, 0x6828,
+ 0xa084, 0x00ff, 0xa406, 0x0040, 0x1b98, 0x2d60, 0x0078, 0x1b86,
+ 0x6800, 0xa005, 0x6002, 0x00c0, 0x1ba4, 0xaf80, 0x0016, 0xac06,
+ 0x0040, 0x1ba3, 0x2c00, 0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040,
+ 0x1bab, 0x1078, 0x1996, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005,
+ 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5000, 0xaf80, 0x0016,
+ 0x2060, 0x6000, 0xa005, 0x0040, 0x1bdb, 0x2068, 0x6814, 0xa084,
+ 0x00ff, 0xa306, 0x0040, 0x1bc7, 0x2d60, 0x0078, 0x1bb9, 0x6800,
+ 0xa005, 0x6002, 0x00c0, 0x1bd3, 0xaf80, 0x0016, 0xac06, 0x0040,
+ 0x1bd2, 0x2c00, 0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040, 0x1bda,
+ 0x1078, 0x1996, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c,
+ 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5000, 0xaf80, 0x0016, 0x2060,
+ 0x6000, 0xa06d, 0x0040, 0x1c07, 0x6814, 0xa306, 0x0040, 0x1bf3,
+ 0x2d60, 0x0078, 0x1be8, 0x6800, 0xa005, 0x6002, 0x00c0, 0x1bff,
+ 0xaf80, 0x0016, 0xac06, 0x0040, 0x1bfe, 0x2c00, 0x785e, 0x0d7e,
+ 0x689c, 0xa005, 0x0040, 0x1c06, 0x1078, 0x1996, 0x007f, 0x0f7f,
+ 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x2091, 0x8000, 0x2069, 0x5040,
+ 0x6800, 0xa086, 0x0000, 0x0040, 0x1c1a, 0x2091, 0x8001, 0x78e3,
+ 0x0009, 0x007c, 0x6880, 0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049,
+ 0x0004, 0x2051, 0x0010, 0x1078, 0x1963, 0x8738, 0xa784, 0x001f,
+ 0x00c0, 0x1c23, 0x2091, 0x8001, 0x2001, 0x800a, 0x0078, 0x1c3a,
+ 0x2001, 0x800c, 0x0078, 0x1c3a, 0x1078, 0x1a0e, 0x2001, 0x800d,
+ 0x0078, 0x1c3a, 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091,
+ 0x4080, 0x007c, 0x6004, 0x2c08, 0x2063, 0x0000, 0x7884, 0x8000,
+ 0x7886, 0x7888, 0xa005, 0x798a, 0x0040, 0x1c51, 0x2c02, 0x0078,
+ 0x1c52, 0x798e, 0x007c, 0x6807, 0x0103, 0x0c7e, 0x2061, 0x5000,
+ 0x2d08, 0x206b, 0x0000, 0x6084, 0x8000, 0x6086, 0x6088, 0xa005,
+ 0x618a, 0x0040, 0x1c66, 0x2d02, 0x0078, 0x1c67, 0x618e, 0x0c7f,
+ 0x007c, 0x1078, 0x1c7a, 0x0040, 0x1c79, 0x0c7e, 0x609c, 0xa065,
+ 0x0040, 0x1c74, 0x1078, 0x1996, 0x0c7f, 0x609f, 0x0000, 0x1078,
+ 0x192b, 0x007c, 0x788c, 0xa065, 0x0040, 0x1c8c, 0x2091, 0x8000,
+ 0x7884, 0x8001, 0x7886, 0x2c04, 0x788e, 0xa005, 0x00c0, 0x1c8a,
+ 0x788a, 0x8000, 0x2091, 0x8001, 0x007c, 0x20a9, 0x0010, 0xa006,
+ 0x8004, 0x8086, 0x818e, 0x00c8, 0x1c96, 0xa200, 0x0070, 0x1c9a,
+ 0x0078, 0x1c91, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9, 0x0010,
+ 0xa005, 0x0040, 0x1cc0, 0xa11a, 0x00c8, 0x1cc0, 0x8213, 0x818d,
+ 0x0048, 0x1cb1, 0xa11a, 0x00c8, 0x1cb2, 0x0070, 0x1cb8, 0x0078,
+ 0x1ca6, 0xa11a, 0x2308, 0x8210, 0x0070, 0x1cb8, 0x0078, 0x1ca6,
+ 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c,
+ 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x1cbc, 0x7994, 0x70d0,
+ 0xa106, 0x0040, 0x1d34, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004,
+ 0xa005, 0x00c0, 0x1d34, 0x7008, 0x7208, 0xa206, 0x00c0, 0x1d34,
+ 0xa286, 0x0008, 0x00c0, 0x1d34, 0x2071, 0x0010, 0x1078, 0x1911,
+ 0x0040, 0x1d34, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0, 0xa184, 0xff00,
+ 0x0040, 0x1d02, 0x2031, 0x0000, 0x810b, 0x86b5, 0x810b, 0x86b5,
+ 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5,
+ 0x2100, 0xa210, 0x2600, 0xa319, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
+ 0x0078, 0x1d0c, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399, 0x0000,
+ 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x2009, 0x0020, 0x1078, 0x190c,
+ 0x2091, 0x8001, 0x0040, 0x1d2b, 0x1078, 0x192b, 0x78a8, 0x8000,
+ 0x78aa, 0xa086, 0x0002, 0x00c0, 0x1d34, 0x2091, 0x8000, 0x78e3,
+ 0x0002, 0x78ab, 0x0000, 0x78cc, 0xa085, 0x0003, 0x78ce, 0x2091,
+ 0x8001, 0x0078, 0x1d34, 0x78ab, 0x0000, 0x1078, 0x208b, 0x6004,
+ 0xa084, 0x000f, 0x0079, 0x1d39, 0x2071, 0x0010, 0x2091, 0x8001,
+ 0x007c, 0x1d49, 0x1d6b, 0x1d91, 0x1d49, 0x1dae, 0x1d58, 0x1f0d,
+ 0x1f28, 0x1d49, 0x1d65, 0x1d8b, 0x1df6, 0x1e63, 0x1eb3, 0x1ec5,
+ 0x1f24, 0x2039, 0x0400, 0x78dc, 0xa705, 0x78de, 0x6008, 0xa705,
+ 0x600a, 0x1078, 0x1fa6, 0x609c, 0x78da, 0x1078, 0x2073, 0x007c,
+ 0x78dc, 0xa084, 0x0100, 0x0040, 0x1d5f, 0x0078, 0x1d49, 0x601c,
+ 0xa085, 0x0080, 0x601e, 0x0078, 0x1d72, 0x1078, 0x1b36, 0x00c0,
+ 0x1d49, 0x1078, 0x20a5, 0x78dc, 0xa084, 0x0100, 0x0040, 0x1d72,
+ 0x0078, 0x1d49, 0x78df, 0x0000, 0x6004, 0x8007, 0xa084, 0x00ff,
+ 0x78d2, 0x8001, 0x609f, 0x0000, 0x0040, 0x1d88, 0x1078, 0x1fa6,
+ 0x0040, 0x1d88, 0x78dc, 0xa085, 0x0100, 0x78de, 0x0078, 0x1d8a,
+ 0x1078, 0x1fca, 0x007c, 0x1078, 0x1b36, 0x00c0, 0x1d49, 0x1078,
+ 0x20a1, 0x78dc, 0xa08c, 0x0e00, 0x00c0, 0x1d9a, 0xa084, 0x0100,
+ 0x00c0, 0x1d9c, 0x0078, 0x1d49, 0x1078, 0x1fa6, 0x00c0, 0x1dad,
+ 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x1f63, 0xa186,
+ 0x000f, 0x0040, 0x1f63, 0x1078, 0x1fca, 0x007c, 0x78dc, 0xa084,
+ 0x0100, 0x0040, 0x1db5, 0x0078, 0x1d49, 0x78df, 0x0000, 0x6714,
+ 0x2011, 0x0001, 0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff, 0xa005,
+ 0x0040, 0x1dd8, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020,
+ 0xa08e, 0x0001, 0x0040, 0x1dd8, 0x2039, 0x0000, 0x2011, 0x0002,
+ 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0040, 0x1dd8, 0x0078, 0x1df3,
+ 0x1078, 0x1956, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
+ 0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001,
+ 0x0070, 0x1dec, 0x0078, 0x1dda, 0x8211, 0x0040, 0x1df3, 0x20a9,
+ 0x0100, 0x0078, 0x1dda, 0x1078, 0x192b, 0x007c, 0x2001, 0x5067,
+ 0x2004, 0xa084, 0x8000, 0x0040, 0x1f8b, 0x6114, 0x1078, 0x20c2,
+ 0x6900, 0xa184, 0x0001, 0x0040, 0x1e17, 0x6028, 0xa084, 0x00ff,
+ 0x00c0, 0x1f83, 0x6800, 0xa084, 0x0001, 0x0040, 0x1f8b, 0x6803,
+ 0x0000, 0x680b, 0x0000, 0x6807, 0x0000, 0x0078, 0x1f93, 0x2011,
+ 0x0001, 0x6020, 0xa084, 0x4000, 0x0040, 0x1e20, 0xa295, 0x0002,
+ 0x6020, 0xa084, 0x0100, 0x0040, 0x1e27, 0xa295, 0x0008, 0x601c,
+ 0xa084, 0x0002, 0x0040, 0x1e2e, 0xa295, 0x0004, 0x602c, 0xa08c,
+ 0x00ff, 0xa182, 0x0002, 0x0048, 0x1f8f, 0xa182, 0x001b, 0x00c8,
+ 0x1f8f, 0x0040, 0x1f8f, 0x690e, 0x602c, 0x8007, 0xa08c, 0x00ff,
+ 0xa182, 0x0002, 0x0048, 0x1f8f, 0xa182, 0x001b, 0x00c8, 0x1f8f,
+ 0x0040, 0x1f8f, 0x6912, 0x6030, 0xa005, 0x00c0, 0x1e51, 0x2001,
+ 0x001e, 0x8000, 0x6816, 0x6028, 0xa084, 0x00ff, 0x0040, 0x1f8b,
+ 0x6806, 0x6028, 0x8007, 0xa084, 0x00ff, 0x0040, 0x1f8b, 0x680a,
+ 0x6a02, 0x0078, 0x1f93, 0x2001, 0x5067, 0x2004, 0xa084, 0x8000,
+ 0x0040, 0x1f8b, 0x6114, 0x1078, 0x20c2, 0x2091, 0x8000, 0x6a04,
+ 0x6b08, 0x6418, 0xa484, 0x0003, 0x0040, 0x1e89, 0x6128, 0xa18c,
+ 0x00ff, 0x8001, 0x00c0, 0x1e82, 0x2100, 0xa210, 0x0048, 0x1eaf,
+ 0x0078, 0x1e89, 0x8001, 0x00c0, 0x1eaf, 0x2100, 0xa212, 0x0048,
+ 0x1eaf, 0xa484, 0x000c, 0x0040, 0x1ea3, 0x6128, 0x810f, 0xa18c,
+ 0x00ff, 0xa082, 0x0004, 0x00c0, 0x1e9b, 0x2100, 0xa318, 0x0048,
+ 0x1eaf, 0x0078, 0x1ea3, 0xa082, 0x0004, 0x00c0, 0x1eaf, 0x2100,
+ 0xa31a, 0x0048, 0x1eaf, 0x6030, 0xa005, 0x0040, 0x1ea9, 0x8000,
+ 0x6816, 0x6a06, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x1f93, 0x2091,
+ 0x8001, 0x0078, 0x1f8f, 0x6114, 0x1078, 0x20c2, 0x2091, 0x8000,
+ 0x6b08, 0x8318, 0x0048, 0x1ec1, 0x6b0a, 0x2091, 0x8001, 0x0078,
+ 0x1fa2, 0x2091, 0x8001, 0x0078, 0x1f8f, 0x6024, 0x8007, 0xa084,
+ 0x00ff, 0x0040, 0x1ee3, 0xa086, 0x0080, 0x00c0, 0x1f0b, 0x20a9,
+ 0x0008, 0x2069, 0x7410, 0x2091, 0x8000, 0x6800, 0xa084, 0xfcff,
+ 0x6802, 0xade8, 0x0008, 0x0070, 0x1edf, 0x0078, 0x1ed5, 0x2091,
+ 0x8001, 0x0078, 0x1f93, 0x6028, 0xa015, 0x0040, 0x1f0b, 0x6114,
+ 0x1078, 0x20c2, 0x0d7e, 0xade8, 0x0007, 0x2091, 0x8000, 0x6800,
+ 0xa00d, 0x0040, 0x1f08, 0xa206, 0x0040, 0x1ef9, 0x2168, 0x0078,
+ 0x1eef, 0x0c7e, 0x2160, 0x6000, 0x6802, 0x1078, 0x192b, 0x0c7f,
+ 0x0d7f, 0x6808, 0x8000, 0x680a, 0x2091, 0x8001, 0x0078, 0x1fa2,
+ 0x2091, 0x8001, 0x0d7f, 0x0078, 0x1f8b, 0x6114, 0x1078, 0x20c2,
+ 0x6800, 0xa084, 0x0001, 0x0040, 0x1f7b, 0x2091, 0x8000, 0x6a04,
+ 0x8210, 0x0048, 0x1f20, 0x6a06, 0x2091, 0x8001, 0x0078, 0x1fa2,
+ 0x2091, 0x8001, 0x0078, 0x1f8f, 0x1078, 0x1b36, 0x00c0, 0x1d49,
+ 0x6114, 0x1078, 0x20c2, 0x60be, 0x6900, 0xa184, 0x0008, 0x0040,
+ 0x1f35, 0x6020, 0xa085, 0x0100, 0x6022, 0xa184, 0x0001, 0x0040,
+ 0x1f8b, 0xa184, 0x0100, 0x00c0, 0x1f77, 0xa184, 0x0200, 0x00c0,
+ 0x1f73, 0x681c, 0xa005, 0x00c0, 0x1f7f, 0x6004, 0xa084, 0x00ff,
+ 0xa086, 0x000f, 0x00c0, 0x1f4e, 0x1078, 0x20a5, 0x78df, 0x0000,
+ 0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f, 0x0000,
+ 0x0040, 0x1f63, 0x1078, 0x1fa6, 0x0040, 0x1f63, 0x78dc, 0xa085,
+ 0x0100, 0x78de, 0x007c, 0x78d7, 0x0000, 0x78db, 0x0000, 0x6024,
+ 0xa084, 0xff00, 0x6026, 0x1078, 0x39aa, 0x0040, 0x1cc6, 0x1078,
+ 0x1b5b, 0x0078, 0x1cc6, 0x2009, 0x0017, 0x0078, 0x1f95, 0x2009,
+ 0x000e, 0x0078, 0x1f95, 0x2009, 0x0007, 0x0078, 0x1f95, 0x2009,
+ 0x0035, 0x0078, 0x1f95, 0x2009, 0x003e, 0x0078, 0x1f95, 0x2009,
+ 0x0004, 0x0078, 0x1f95, 0x2009, 0x0006, 0x0078, 0x1f95, 0x2009,
+ 0x0016, 0x0078, 0x1f95, 0x2009, 0x0001, 0x6024, 0xa084, 0xff00,
+ 0xa105, 0x6026, 0x2091, 0x8000, 0x1078, 0x1c42, 0x2091, 0x8001,
+ 0x0078, 0x1cc6, 0x1078, 0x192b, 0x0078, 0x1cc6, 0x78d4, 0xa06d,
+ 0x00c0, 0x1fb1, 0x2c00, 0x78d6, 0x78da, 0x609f, 0x0000, 0x0078,
+ 0x1fbd, 0x2c00, 0x689e, 0x609f, 0x0000, 0x78d6, 0x2d00, 0x6002,
+ 0x78d8, 0xad06, 0x00c0, 0x1fbd, 0x6002, 0x78d0, 0x8001, 0x78d2,
+ 0x00c0, 0x1fc9, 0x78dc, 0xa084, 0xfeff, 0x78de, 0x78d8, 0x2060,
+ 0xa006, 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0xe1ff,
+ 0x601e, 0xa184, 0x0060, 0x0040, 0x1fd9, 0x0e7e, 0x1078, 0x467f,
+ 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3,
+ 0x0000, 0x6714, 0x1078, 0x1956, 0x2091, 0x8000, 0x60a0, 0xa084,
+ 0x8000, 0x00c0, 0x2000, 0x6808, 0xa084, 0x0001, 0x0040, 0x2000,
+ 0x2091, 0x8001, 0x1078, 0x19a3, 0x2091, 0x8000, 0x1078, 0x1c42,
+ 0x2091, 0x8001, 0x78d7, 0x0000, 0x78db, 0x0000, 0x0078, 0x2072,
+ 0x6024, 0xa096, 0x0001, 0x00c0, 0x2007, 0x8000, 0x6026, 0x6a10,
+ 0x6814, 0x2091, 0x8001, 0xa202, 0x0048, 0x2016, 0x0040, 0x2016,
+ 0x2039, 0x0200, 0x1078, 0x2073, 0x0078, 0x2072, 0x2c08, 0x2091,
+ 0x8000, 0x60a0, 0xa084, 0x8000, 0x0040, 0x2043, 0x6800, 0xa065,
+ 0x0040, 0x2048, 0x6a04, 0x0e7e, 0x2071, 0x5040, 0x7000, 0xa084,
+ 0x0001, 0x0040, 0x203d, 0x7048, 0xa206, 0x00c0, 0x203d, 0x6b04,
+ 0x231c, 0x2160, 0x6302, 0x2300, 0xa005, 0x00c0, 0x2038, 0x6902,
+ 0x2260, 0x6102, 0x0e7f, 0x0078, 0x204f, 0x2160, 0x6202, 0x6906,
+ 0x0e7f, 0x0078, 0x204f, 0x6800, 0xa065, 0x0040, 0x2048, 0x6102,
+ 0x6902, 0x00c0, 0x204c, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160,
+ 0x60a0, 0xa084, 0x8000, 0x0040, 0x2059, 0x6808, 0xa084, 0xfffc,
+ 0x680a, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0x6808, 0xa08c,
+ 0x0040, 0x0040, 0x2068, 0xa086, 0x0040, 0x680a, 0x1078, 0x19b4,
+ 0x2091, 0x8000, 0x1078, 0x21b1, 0x2091, 0x8001, 0x78db, 0x0000,
+ 0x78d7, 0x0000, 0x007c, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000,
+ 0x1078, 0x1c42, 0x2091, 0x8001, 0x78d8, 0xa065, 0x0040, 0x2086,
+ 0x609c, 0x78da, 0x609f, 0x0000, 0x0078, 0x2076, 0x78d7, 0x0000,
+ 0x78db, 0x0000, 0x007c, 0x7990, 0x7894, 0x8000, 0xa10a, 0x00c8,
+ 0x2092, 0xa006, 0x7896, 0x70d2, 0x7804, 0xa005, 0x0040, 0x20a0,
+ 0x8001, 0x7806, 0x00c0, 0x20a0, 0x0068, 0x20a0, 0x2091, 0x4080,
+ 0x007c, 0x2039, 0x20b9, 0x0078, 0x20a7, 0x2039, 0x20bf, 0x2704,
+ 0xa005, 0x0040, 0x20b8, 0xac00, 0x2068, 0x6b08, 0x6c0c, 0x6910,
+ 0x6a14, 0x690a, 0x6a0e, 0x6b12, 0x6c16, 0x8738, 0x0078, 0x20a7,
+ 0x007c, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015,
+ 0x001b, 0x0000, 0x0c7e, 0x1078, 0x3b33, 0x2c68, 0x0c7f, 0x007c,
+ 0x0010, 0x2139, 0x0068, 0x2139, 0x2029, 0x0000, 0x78cb, 0x0000,
+ 0x788c, 0xa065, 0x0040, 0x2132, 0x2009, 0x5074, 0x2104, 0xa084,
+ 0x0001, 0x0040, 0x2100, 0x6004, 0xa086, 0x0103, 0x00c0, 0x2100,
+ 0x6018, 0xa005, 0x00c0, 0x2100, 0x6014, 0xa005, 0x00c0, 0x2100,
+ 0x0d7e, 0x2069, 0x0000, 0x6818, 0xa084, 0x0001, 0x00c0, 0x20ff,
+ 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001,
+ 0x2091, 0x4080, 0x0d7f, 0x1078, 0x1c69, 0x0078, 0x2137, 0x0d7f,
+ 0x1078, 0x213a, 0x0040, 0x2132, 0x6204, 0xa294, 0x00ff, 0xa296,
+ 0x0003, 0x0040, 0x2112, 0x6204, 0xa296, 0x0110, 0x00c0, 0x2120,
+ 0x78cb, 0x0001, 0x6204, 0xa294, 0xff00, 0x8217, 0x8211, 0x0040,
+ 0x2120, 0x85ff, 0x00c0, 0x2132, 0x8210, 0xa202, 0x00c8, 0x2132,
+ 0x057e, 0x1078, 0x2149, 0x057f, 0x0040, 0x212d, 0x78e0, 0xa086,
+ 0x0003, 0x0040, 0x2132, 0x0078, 0x2120, 0x8528, 0x78c8, 0xa005,
+ 0x0040, 0x20d0, 0x85ff, 0x0040, 0x2139, 0x2091, 0x4080, 0x78b0,
+ 0x70d6, 0x007c, 0x7bac, 0x79b0, 0x70d4, 0xa102, 0x00c0, 0x2143,
+ 0x2300, 0xa005, 0x007c, 0x0048, 0x2147, 0xa302, 0x007c, 0x8002,
+ 0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x2163,
+ 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x2198,
+ 0x7008, 0x7208, 0xa206, 0x00c0, 0x2198, 0xa286, 0x0008, 0x00c0,
+ 0x2198, 0x2071, 0x0010, 0x1078, 0x219d, 0x2009, 0x0020, 0x6004,
+ 0xa086, 0x0103, 0x00c0, 0x2172, 0x6028, 0xa005, 0x00c0, 0x2172,
+ 0x2009, 0x000c, 0x1078, 0x1907, 0x0040, 0x218b, 0x78c4, 0x8000,
+ 0x78c6, 0xa086, 0x0002, 0x00c0, 0x2198, 0x2091, 0x8000, 0x78e3,
+ 0x0003, 0x78c7, 0x0000, 0x78cc, 0xa085, 0x0300, 0x78ce, 0x2091,
+ 0x8001, 0x0078, 0x2198, 0x78c7, 0x0000, 0x1078, 0x1c69, 0x79ac,
+ 0x78b0, 0x8000, 0xa10a, 0x00c8, 0x2196, 0xa006, 0x78b2, 0xa006,
+ 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x8107, 0x8004, 0x8004,
+ 0x7ab8, 0x7bb4, 0x7cc0, 0x7dbc, 0xa210, 0xa399, 0x0000, 0xa4a1,
+ 0x0000, 0xa5a9, 0x0000, 0x007c, 0x2009, 0x505b, 0x2091, 0x8000,
+ 0x200a, 0x0f7e, 0x0e7e, 0x2071, 0x5040, 0x7000, 0xa086, 0x0000,
+ 0x00c0, 0x21cb, 0x2009, 0x5012, 0x2104, 0xa005, 0x00c0, 0x21cb,
+ 0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x21cb, 0x0018,
+ 0x21cb, 0x781b, 0x004b, 0x0e7f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e,
+ 0x2071, 0x5040, 0x2091, 0x8000, 0x7000, 0xa086, 0x0000, 0x00c0,
+ 0x21e4, 0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x21e4,
+ 0x0018, 0x21e4, 0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f, 0x0f7f,
+ 0x007c, 0x127e, 0x2091, 0x2300, 0x2071, 0x5040, 0x2079, 0x0100,
+ 0x784b, 0x000f, 0x0098, 0x21f7, 0x7838, 0x0078, 0x21f0, 0x20a9,
+ 0x0040, 0x7800, 0xa082, 0x0004, 0x0048, 0x2200, 0x20a9, 0x0060,
+ 0x789b, 0x0000, 0x78af, 0x0000, 0x78af, 0x0000, 0x0070, 0x220a,
+ 0x0078, 0x2202, 0x7800, 0xa082, 0x0004, 0x0048, 0x2219, 0x70b7,
+ 0x009b, 0x2019, 0x4da4, 0x1078, 0x2255, 0x702f, 0x8001, 0x0078,
+ 0x2225, 0x70b7, 0x0000, 0x2019, 0x4c1c, 0x1078, 0x2255, 0x2019,
+ 0x4c5b, 0x1078, 0x2255, 0x702f, 0x8000, 0x7003, 0x0000, 0x1078,
+ 0x235e, 0x7004, 0xa084, 0x000f, 0x017e, 0x2009, 0x04fd, 0x210c,
+ 0xa18a, 0x0005, 0x0048, 0x223a, 0x0038, 0x2240, 0xa085, 0x6280,
+ 0x0078, 0x2242, 0x0028, 0x2240, 0xa085, 0x6280, 0x0078, 0x2242,
+ 0xa085, 0x62c0, 0x017f, 0x7806, 0x780f, 0xb204, 0x7843, 0x00d8,
+ 0x7853, 0x0080, 0x780b, 0x0008, 0x7047, 0x0008, 0x7053, 0x507f,
+ 0x704f, 0x0000, 0x127f, 0x2000, 0x007c, 0x137e, 0x147e, 0x157e,
+ 0x047e, 0x20a1, 0x012b, 0x2304, 0xa005, 0x789a, 0x0040, 0x2275,
+ 0x8318, 0x2324, 0x8318, 0x2398, 0x24a8, 0xa484, 0xff00, 0x0040,
+ 0x226d, 0xa482, 0x0100, 0x20a9, 0x0100, 0x2020, 0x53a6, 0xa005,
+ 0x00c0, 0x2264, 0x3318, 0x0078, 0x225b, 0x047f, 0x157f, 0x147f,
+ 0x137f, 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084,
+ 0xfff0, 0xa105, 0x2012, 0x1078, 0x235e, 0x007c, 0x2011, 0x0101,
+ 0x20a9, 0x0009, 0x810b, 0x0070, 0x228f, 0x0078, 0x228a, 0xa18c,
+ 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009,
+ 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, 0x22a0, 0x0078, 0x229b,
+ 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c,
+ 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, 0x22b1, 0x0078,
+ 0x22ac, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012,
+ 0x007c, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012,
+ 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100,
+ 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080,
+ 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf,
+ 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e,
+ 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f,
+ 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100,
+ 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f,
+ 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040,
+ 0x233c, 0x2061, 0x7400, 0x1078, 0x2344, 0x0040, 0x2328, 0x20a9,
+ 0x0000, 0x2061, 0x7300, 0x0c7e, 0x1078, 0x2344, 0x0040, 0x2318,
+ 0x0c7f, 0x8c60, 0x0070, 0x2316, 0x0078, 0x230b, 0x0078, 0x233c,
+ 0x007f, 0xa082, 0x7300, 0x2071, 0x5040, 0x7086, 0x7182, 0x2001,
+ 0x0004, 0x706e, 0x7093, 0x000f, 0x1078, 0x21ac, 0x0078, 0x2338,
+ 0x60c0, 0xa005, 0x00c0, 0x233c, 0x2071, 0x5040, 0x7182, 0x2c00,
+ 0x708a, 0x2001, 0x0006, 0x706e, 0x7093, 0x000f, 0x1078, 0x21ac,
+ 0x2001, 0x0000, 0x0078, 0x233e, 0x2001, 0x0001, 0x2091, 0x8001,
+ 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040, 0x235b,
+ 0x2060, 0x600c, 0xa306, 0x00c0, 0x2358, 0x6010, 0xa206, 0x00c0,
+ 0x2358, 0x6014, 0xa106, 0x00c0, 0x2358, 0xa006, 0x0078, 0x235d,
+ 0x6000, 0x0078, 0x2345, 0xa085, 0x0001, 0x007c, 0x2011, 0x5041,
+ 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084, 0x0100,
+ 0x0040, 0x2374, 0x2021, 0xff04, 0x2122, 0x810b, 0x810b, 0x810b,
+ 0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e, 0x68e4, 0xa08c,
+ 0x0020, 0x0040, 0x23c8, 0xa084, 0x0006, 0x00c0, 0x23c8, 0x6014,
+ 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0, 0x5280,
+ 0x7004, 0xa084, 0x000a, 0x00c0, 0x23c8, 0x7108, 0xa194, 0xff00,
+ 0x0040, 0x23c8, 0xa18c, 0x00ff, 0x2001, 0x000c, 0xa106, 0x0040,
+ 0x23af, 0x2001, 0x0012, 0xa106, 0x0040, 0x23b3, 0x2001, 0x0014,
+ 0xa106, 0x0040, 0x23b7, 0x2001, 0x0019, 0xa106, 0x0040, 0x23bb,
+ 0x2001, 0x0032, 0xa106, 0x0040, 0x23bf, 0x0078, 0x23c3, 0x2009,
+ 0x0012, 0x0078, 0x23c5, 0x2009, 0x0014, 0x0078, 0x23c5, 0x2009,
+ 0x0019, 0x0078, 0x23c5, 0x2009, 0x0020, 0x0078, 0x23c5, 0x2009,
+ 0x003f, 0x0078, 0x23c5, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a,
+ 0x0e7f, 0x007c, 0x0068, 0x23ca, 0x2091, 0x8000, 0x2071, 0x0000,
+ 0x007e, 0x7018, 0xa084, 0x0001, 0x00c0, 0x23d1, 0x007f, 0x2071,
+ 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x073f,
+ 0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
+ 0x0078, 0x23e8, 0x107e, 0x007e, 0x127e, 0x2091, 0x2300, 0x7f3c,
+ 0x7e58, 0x7c30, 0x7d38, 0x77c2, 0x74c6, 0x76ca, 0x75ce, 0xa594,
+ 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0079, 0x23ff, 0x2411,
+ 0x2411, 0x2411, 0x274b, 0x3907, 0x240f, 0x2440, 0x244a, 0x240f,
+ 0x240f, 0x240f, 0x240f, 0x240f, 0x240f, 0x240f, 0x240f, 0x1078,
+ 0x23ca, 0x8507, 0xa084, 0x001f, 0x0079, 0x2416, 0x2454, 0x274b,
+ 0x2905, 0x2a02, 0x2a2a, 0x2cc3, 0x2f6e, 0x2fb1, 0x2ffc, 0x3081,
+ 0x3139, 0x31e2, 0x2440, 0x2827, 0x2f43, 0x2436, 0x3c78, 0x3c98,
+ 0x3e5e, 0x3e6a, 0x3f3f, 0x2436, 0x2436, 0x4012, 0x4016, 0x3c76,
+ 0x2436, 0x3dc9, 0x2436, 0x3b56, 0x244a, 0x2436, 0x1078, 0x23ca,
+ 0x0018, 0x23ef, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c,
+ 0x2019, 0x4cfd, 0x1078, 0x2255, 0x702f, 0x0001, 0x781b, 0x004f,
+ 0x0078, 0x2438, 0x2019, 0x4c5b, 0x1078, 0x2255, 0x702f, 0x8000,
+ 0x781b, 0x00d5, 0x0078, 0x2438, 0x7242, 0x2009, 0x500f, 0x200b,
+ 0x0000, 0xa584, 0x0001, 0x00c0, 0x3b6a, 0x0040, 0x2471, 0x1078,
+ 0x23ca, 0x7003, 0x0000, 0x704b, 0x0000, 0x7043, 0x0000, 0x7037,
+ 0x0000, 0x1078, 0x38de, 0x0018, 0x23ef, 0x2009, 0x500f, 0x200b,
+ 0x0000, 0x7068, 0xa005, 0x00c0, 0x253c, 0x706c, 0xa084, 0x0007,
+ 0x0079, 0x247a, 0x2573, 0x2482, 0x248e, 0x24ab, 0x24cd, 0x251a,
+ 0x24f3, 0x2482, 0x1078, 0x38c6, 0x2009, 0x0048, 0x1078, 0x2e0f,
+ 0x00c0, 0x248c, 0x7003, 0x0004, 0x0078, 0x2438, 0x1078, 0x38c6,
+ 0x00c0, 0x24a9, 0x7080, 0x8007, 0x7882, 0x789b, 0x0010, 0x78ab,
+ 0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009,
+ 0x00e5, 0x1078, 0x2e03, 0x00c0, 0x24a9, 0x7003, 0x0004, 0x7093,
+ 0x000f, 0x0078, 0x2438, 0x1078, 0x38c6, 0x00c0, 0x24cb, 0x7180,
+ 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0,
+ 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b,
+ 0x0004, 0x2009, 0x00e5, 0x1078, 0x2e03, 0x00c0, 0x24cb, 0x7003,
+ 0x0004, 0x7093, 0x000f, 0x0078, 0x2438, 0x1078, 0x38c6, 0x00c0,
+ 0x24f1, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f,
+ 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x7184, 0x79aa, 0x78ab,


SHAR_EOF
true || echo 'restore of patch-2.2.7 failed'
fi

echo 'End of part 08'
echo 'File patch-2.2.7 is continued in part 09'
echo 09 > _shar_seq_.tmp

Thomas...@ciw.uni-karlsruhe.de

unread,
May 1, 1999, 3:00:00 AM5/1/99
to
Archive-name: v2.2/patch-2.2.7/part05

#!/bin/sh
# this is part 05 of a 22 - part archive


# do not concatenate these parts, unpack them in order with /bin/sh
# file patch-2.2.7 continued
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck

if test "$Scheck" != 05; then


echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping patch-2.2.7'
else
echo 'x - continuing with patch-2.2.7'
sed 's/^X//' << 'SHAR_EOF' >> 'patch-2.2.7' &&

+ lp->tx_ring[entry].status = le16_to_cpu(0x8300);
X
- /* Trigger an immediate send poll. */
- outw(0x0000, ioaddr+PCNET32_ADDR);
- outw(0x0048, ioaddr+PCNET32_DATA);
+ lp->cur_tx++;
+ lp->stats.tx_bytes += skb->len;
X

- dev->trans_start = jiffies;

+ /* Trigger an immediate send poll. */
+ lp->a.write_csr (ioaddr, 0, 0x0048);
X
- if (lp->tx_ring[(entry+1) & TX_RING_MOD_MASK].base == 0)
- clear_bit (0, (void *)&dev->tbusy);
- else
- lp->tx_full = 1;
- restore_flags(flags);
- return 0;


+ dev->trans_start = jiffies;
+

+ if (lp->tx_ring[(entry+1) & TX_RING_MOD_MASK].base == 0)
+ clear_bit (0, (void *)&dev->tbusy);
+ else
+ lp->tx_full = 1;
+ restore_flags(flags);


+ return 0;
X }
X

X /* The PCNET32 interrupt handler. */
X static void
X pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs)
X {
- struct device *dev = (struct device *)dev_id;
- struct pcnet32_private *lp;
- unsigned int csr0, ioaddr;
- int boguscnt = max_interrupt_work;
- int must_restart;
-


- if (dev == NULL) {

- printk ("pcnet32_interrupt(): irq %d for unknown device.\n", irq);
- return;
- }
+ struct device *dev = (struct device *)dev_id;
+ struct pcnet32_private *lp;
+ unsigned long ioaddr;
+ u16 csr0;
+ int boguscnt = max_interrupt_work;
+ int must_restart;
X
- ioaddr = dev->base_addr;
- lp = (struct pcnet32_private *)dev->priv;
- if (dev->interrupt)
- printk("%s: Re-entering the interrupt handler.\n", dev->name);
+ if (dev == NULL) {
+ printk ("pcnet32_interrupt(): irq %d for unknown device.\n", irq);
+ return;
+ }
X
- dev->interrupt = 1;
+ ioaddr = dev->base_addr;
+ lp = (struct pcnet32_private *)dev->priv;
+ if (dev->interrupt)
+ printk("%s: Re-entering the interrupt handler.\n", dev->name);
X
- outw(0x00, dev->base_addr + PCNET32_ADDR);
- while ((csr0 = inw(dev->base_addr + PCNET32_DATA)) & 0x8600 && --boguscnt >= 0) {
- /* Acknowledge all of the current interrupt sources ASAP. */
- outw(csr0 & ~0x004f, dev->base_addr + PCNET32_DATA);
+ dev->interrupt = 1;
X
- must_restart = 0;
+ while ((csr0 = lp->a.read_csr (ioaddr, 0)) & 0x8600 && --boguscnt >= 0) {
+ /* Acknowledge all of the current interrupt sources ASAP. */
+ lp->a.write_csr (ioaddr, 0, csr0 & ~0x004f);
X
- if (pcnet32_debug > 5)
- printk("%s: interrupt csr0=%#2.2x new csr=%#2.2x.\n",
- dev->name, csr0, inw(dev->base_addr + PCNET32_DATA));
+ must_restart = 0;
X
- if (csr0 & 0x0400) /* Rx interrupt */
- pcnet32_rx(dev);
+ if (pcnet32_debug > 5)
+ printk("%s: interrupt csr0=%#2.2x new csr=%#2.2x.\n",
+ dev->name, csr0, lp->a.read_csr (ioaddr, 0));
X
- if (csr0 & 0x0200) { /* Tx-done interrupt */
- int dirty_tx = lp->dirty_tx;
+ if (csr0 & 0x0400) /* Rx interrupt */
+ pcnet32_rx(dev);
X
- while (dirty_tx < lp->cur_tx) {
- int entry = dirty_tx & TX_RING_MOD_MASK;
- int status = (short)le16_to_cpu(lp->tx_ring[entry].status);
+ if (csr0 & 0x0200) { /* Tx-done interrupt */
+ int dirty_tx = lp->dirty_tx;
+
+ while (dirty_tx < lp->cur_tx) {
+ int entry = dirty_tx & TX_RING_MOD_MASK;
+ int status = (short)le16_to_cpu(lp->tx_ring[entry].status);
X
- if (status < 0)
- break; /* It still hasn't been Txed */
+ if (status < 0)
+ break; /* It still hasn't been Txed */
X
- lp->tx_ring[entry].base = 0;
+ lp->tx_ring[entry].base = 0;
X
- if (status & 0x4000) {
- /* There was an major error, log it. */
- int err_status = le32_to_cpu(lp->tx_ring[entry].misc);
- lp->stats.tx_errors++;
- if (err_status & 0x04000000) lp->stats.tx_aborted_errors++;
- if (err_status & 0x08000000) lp->stats.tx_carrier_errors++;
- if (err_status & 0x10000000) lp->stats.tx_window_errors++;
- if (err_status & 0x40000000) {
- /* Ackk! On FIFO errors the Tx unit is turned off! */
- lp->stats.tx_fifo_errors++;
- /* Remove this verbosity later! */
- printk("%s: Tx FIFO error! Status %4.4x.\n",
- dev->name, csr0);
- must_restart = 1;
+ if (status & 0x4000) {
+ /* There was an major error, log it. */
+ int err_status = le32_to_cpu(lp->tx_ring[entry].misc);
+ lp->stats.tx_errors++;
+ if (err_status & 0x04000000) lp->stats.tx_aborted_errors++;
+ if (err_status & 0x08000000) lp->stats.tx_carrier_errors++;
+ if (err_status & 0x10000000) lp->stats.tx_window_errors++;
+ if (err_status & 0x40000000) {
+ /* Ackk! On FIFO errors the Tx unit is turned off! */
+ lp->stats.tx_fifo_errors++;
+ /* Remove this verbosity later! */
+ printk("%s: Tx FIFO error! Status %4.4x.\n",
+ dev->name, csr0);
+ must_restart = 1;
X }
- } else {
- if (status & 0x1800)
- lp->stats.collisions++;
- lp->stats.tx_packets++;
- }
-
- /* We must free the original skb */
- if (lp->tx_skbuff[entry]) {
- dev_kfree_skb(lp->tx_skbuff[entry]);
- lp->tx_skbuff[entry] = 0;
- }
- dirty_tx++;
- }
+ } else {
+ if (status & 0x1800)
+ lp->stats.collisions++;
+ lp->stats.tx_packets++;
+ }
+
+ /* We must free the original skb */
+ if (lp->tx_skbuff[entry]) {
+ dev_kfree_skb(lp->tx_skbuff[entry]);
+ lp->tx_skbuff[entry] = 0;
+ }
+ dirty_tx++;
+ }
X
X #ifndef final_version
- if (lp->cur_tx - dirty_tx >= TX_RING_SIZE) {
- printk("out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
- dirty_tx, lp->cur_tx, lp->tx_full);
- dirty_tx += TX_RING_SIZE;
- }
+ if (lp->cur_tx - dirty_tx >= TX_RING_SIZE) {
+ printk("out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
+ dirty_tx, lp->cur_tx, lp->tx_full);
+ dirty_tx += TX_RING_SIZE;
+ }
X #endif
+ if (lp->tx_full && dev->tbusy
+ && dirty_tx > lp->cur_tx - TX_RING_SIZE + 2) {
+ /* The ring is no longer full, clear tbusy. */


+ lp->tx_full = 0;

+ clear_bit(0, (void *)&dev->tbusy);
+ mark_bh(NET_BH);
+ }
+ lp->dirty_tx = dirty_tx;
+ }
X
- if (lp->tx_full && dev->tbusy
- && dirty_tx > lp->cur_tx - TX_RING_SIZE + 2) {
- /* The ring is no longer full, clear tbusy. */


- lp->tx_full = 0;

- clear_bit(0, (void *)&dev->tbusy);
- mark_bh(NET_BH);
- }
- lp->dirty_tx = dirty_tx;
- }
-
- /* Log misc errors. */
- if (csr0 & 0x4000) lp->stats.tx_errors++; /* Tx babble. */
- if (csr0 & 0x1000) {
- /*
- * this happens when our receive ring is full. This shouldn't
- * be a problem as we will see normal rx interrupts for the frames
- * in the receive ring. But there are some PCI chipsets (I can reproduce
- * this on SP3G with Intel saturn chipset) which have sometimes problems
- * and will fill up the receive ring with error descriptors. In this
- * situation we don't get a rx interrupt, but a missed frame interrupt sooner
- * or later. So we try to clean up our receive ring here.
- */
- pcnet32_rx(dev);
- lp->stats.rx_errors++; /* Missed a Rx frame. */
- }
- if (csr0 & 0x0800) {
- printk("%s: Bus master arbitration failure, status %4.4x.\n",
- dev->name, csr0);
- /* unlike for the lance, there is no restart needed */
- }
+ /* Log misc errors. */
+ if (csr0 & 0x4000) lp->stats.tx_errors++; /* Tx babble. */
+ if (csr0 & 0x1000) {
+ /*
+ * this happens when our receive ring is full. This shouldn't
+ * be a problem as we will see normal rx interrupts for the frames
+ * in the receive ring. But there are some PCI chipsets (I can reproduce
+ * this on SP3G with Intel saturn chipset) which have sometimes problems
+ * and will fill up the receive ring with error descriptors. In this
+ * situation we don't get a rx interrupt, but a missed frame interrupt sooner
+ * or later. So we try to clean up our receive ring here.
+ */
+ pcnet32_rx(dev);
+ lp->stats.rx_errors++; /* Missed a Rx frame. */
+ }
+ if (csr0 & 0x0800) {
+ printk("%s: Bus master arbitration failure, status %4.4x.\n",
+ dev->name, csr0);
+ /* unlike for the lance, there is no restart needed */
+ }
X
- if (must_restart) {
- /* stop the chip to clear the error condition, then restart */
- outw(0x0000, dev->base_addr + PCNET32_ADDR);
- outw(0x0004, dev->base_addr + PCNET32_DATA);
- pcnet32_restart(dev, 0x0002);
- }
+ if (must_restart) {
+ /* stop the chip to clear the error condition, then restart */
+ lp->a.write_csr (ioaddr, 0, 0x0004);
+ pcnet32_restart(dev, 0x0002);
X }
+ }
X
X /* Clear any other interrupt, and set interrupt enable. */
- outw(0x0000, dev->base_addr + PCNET32_ADDR);
- outw(0x7940, dev->base_addr + PCNET32_DATA);
+ lp->a.write_csr (ioaddr, 0, 0x7940);
X
- if (pcnet32_debug > 4)
- printk("%s: exiting interrupt, csr%d=%#4.4x.\n",
- dev->name, inw(ioaddr + PCNET32_ADDR),
- inw(dev->base_addr + PCNET32_DATA));
+ if (pcnet32_debug > 4)
+ printk("%s: exiting interrupt, csr0=%#4.4x.\n",


+ dev->name, lp->a.read_csr (ioaddr, 0));

X

- dev->interrupt = 0;

- return;


+ dev->interrupt = 0;

+ return;


X }
X
X static int

X pcnet32_rx(struct device *dev)


X {
- struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;

- int entry = lp->cur_rx & RX_RING_MOD_MASK;
- int i;
-
- /* If we own the next entry, it's a new packet. Send it up. */
- while ((short)le16_to_cpu(lp->rx_ring[entry].status) >= 0) {
- int status = (short)le16_to_cpu(lp->rx_ring[entry].status) >> 8;
-
- if (status != 0x03) { /* There was an error. */
- /* There is a tricky error noted by John Murphy,
- <mu...@perftech.com> to Russ Nelson: Even with full-sized
- buffers it's possible for a jabber packet to use two
- buffers, with only the last correctly noting the error. */
- if (status & 0x01) /* Only count a general error at the */
- lp->stats.rx_errors++; /* end of a packet.*/
- if (status & 0x20) lp->stats.rx_frame_errors++;
- if (status & 0x10) lp->stats.rx_over_errors++;
- if (status & 0x08) lp->stats.rx_crc_errors++;
- if (status & 0x04) lp->stats.rx_fifo_errors++;
- lp->rx_ring[entry].status &= le16_to_cpu(0x03ff);
- }
- else
- {
- /* Malloc up new buffer, compatible with net-2e. */
- short pkt_len = (le32_to_cpu(lp->rx_ring[entry].msg_length) & 0xfff)-4;
- struct sk_buff *skb;


+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;

+ int entry = lp->cur_rx & RX_RING_MOD_MASK;
+ int i;
+
+ /* If we own the next entry, it's a new packet. Send it up. */
+ while ((short)le16_to_cpu(lp->rx_ring[entry].status) >= 0) {
+ int status = (short)le16_to_cpu(lp->rx_ring[entry].status) >> 8;
+
+ if (status != 0x03) { /* There was an error. */
+ /*
+ * There is a tricky error noted by John Murphy,
+ * <mu...@perftech.com> to Russ Nelson: Even with full-sized
+ * buffers it's possible for a jabber packet to use two
+ * buffers, with only the last correctly noting the error.
+ */
+ if (status & 0x01) /* Only count a general error at the */
+ lp->stats.rx_errors++; /* end of a packet.*/
+ if (status & 0x20) lp->stats.rx_frame_errors++;
+ if (status & 0x10) lp->stats.rx_over_errors++;
+ if (status & 0x08) lp->stats.rx_crc_errors++;
+ if (status & 0x04) lp->stats.rx_fifo_errors++;
+ lp->rx_ring[entry].status &= le16_to_cpu(0x03ff);
+ } else {
+ /* Malloc up new buffer, compatible with net-2e. */
+ short pkt_len = (le32_to_cpu(lp->rx_ring[entry].msg_length) & 0xfff)-4;
+ struct sk_buff *skb;
X
- if(pkt_len < 60) {
- printk("%s: Runt packet!\n",dev->name);
- lp->stats.rx_errors++;
- } else {
- int rx_in_place = 0;
+ if(pkt_len < 60) {
+ printk("%s: Runt packet!\n",dev->name);
+ lp->stats.rx_errors++;
+ } else {
+ int rx_in_place = 0;
X
- if (pkt_len > rx_copybreak) {
- struct sk_buff *newskb;
+ if (pkt_len > rx_copybreak) {
+ struct sk_buff *newskb;
X
- if ((newskb = dev_alloc_skb (PKT_BUF_SZ))) {
- skb_reserve (newskb, 2);
- skb = lp->rx_skbuff[entry];
- skb_put (skb, pkt_len);
- lp->rx_skbuff[entry] = newskb;
- newskb->dev = dev;
- lp->rx_ring[entry].base = le32_to_cpu(virt_to_bus(newskb->tail));
- rx_in_place = 1;
- } else
- skb = NULL;
- } else
- skb = dev_alloc_skb(pkt_len+2);
+ if ((newskb = dev_alloc_skb (PKT_BUF_SZ))) {
+ skb_reserve (newskb, 2);
+ skb = lp->rx_skbuff[entry];
+ skb_put (skb, pkt_len);
+ lp->rx_skbuff[entry] = newskb;
+ newskb->dev = dev;
+ lp->rx_ring[entry].base = le32_to_cpu(virt_to_bus(newskb->tail));
+ rx_in_place = 1;
+ } else
+ skb = NULL;
+ } else
+ skb = dev_alloc_skb(pkt_len+2);
X
- if (skb == NULL) {
- printk("%s: Memory squeeze, deferring packet.\n", dev->name);
- for (i=0; i < RX_RING_SIZE; i++)
- if ((short)le16_to_cpu(lp->rx_ring[(entry+i) & RX_RING_MOD_MASK].status) < 0)
- break;
-
- if (i > RX_RING_SIZE -2) {
- lp->stats.rx_dropped++;
- lp->rx_ring[entry].status |= le16_to_cpu(0x8000);
- lp->cur_rx++;
- }
- break;
- }
- skb->dev = dev;
- if (!rx_in_place) {
- skb_reserve(skb,2); /* 16 byte align */
- skb_put(skb,pkt_len); /* Make room */
- eth_copy_and_sum(skb,
- (unsigned char *)bus_to_virt(le32_to_cpu(lp->rx_ring[entry].base)),
- pkt_len,0);
- }
- lp->stats.rx_bytes += skb->len;
- skb->protocol=eth_type_trans(skb,dev);
- netif_rx(skb);
- lp->stats.rx_packets++;
- }
+ if (skb == NULL) {
+ printk("%s: Memory squeeze, deferring packet.\n", dev->name);
+ for (i=0; i < RX_RING_SIZE; i++)
+ if ((short)le16_to_cpu(lp->rx_ring[(entry+i) & RX_RING_MOD_MASK].status) < 0)
+ break;
+
+ if (i > RX_RING_SIZE -2) {
+ lp->stats.rx_dropped++;
+ lp->rx_ring[entry].status |= le16_to_cpu(0x8000);
+ lp->cur_rx++;
+ }
+ break;
X }
- /* The docs say that the buffer length isn't touched, but Andrew Boyd
- of QNX reports that some revs of the 79C965 clear it. */
- lp->rx_ring[entry].buf_length = le16_to_cpu(-PKT_BUF_SZ);
- lp->rx_ring[entry].status |= le16_to_cpu(0x8000);
- entry = (++lp->cur_rx) & RX_RING_MOD_MASK;
+ skb->dev = dev;
+ if (!rx_in_place) {
+ skb_reserve(skb,2); /* 16 byte align */
+ skb_put(skb,pkt_len); /* Make room */
+ eth_copy_and_sum(skb,
+ (unsigned char *)bus_to_virt(le32_to_cpu(lp->rx_ring[entry].base)),
+ pkt_len,0);
+ }
+ lp->stats.rx_bytes += skb->len;
+ skb->protocol=eth_type_trans(skb,dev);
+ netif_rx(skb);
+ lp->stats.rx_packets++;
+ }
X }
+ /*
+ * The docs say that the buffer length isn't touched, but Andrew Boyd
+ * of QNX reports that some revs of the 79C965 clear it.
+ */
+ lp->rx_ring[entry].buf_length = le16_to_cpu(-PKT_BUF_SZ);
+ lp->rx_ring[entry].status |= le16_to_cpu(0x8000);
+ entry = (++lp->cur_rx) & RX_RING_MOD_MASK;
+ }
X
- /* We should check that at least two ring entries are free. If not,
- we should free one and mark stats->rx_dropped++. */
-
- return 0;


+ return 0;
X }
X

X static int
X pcnet32_close(struct device *dev)
X {
- unsigned int ioaddr = dev->base_addr;


- struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
- int i;

-
- dev->start = 0;
- set_bit (0, (void *)&dev->tbusy);
-
- outw(112, ioaddr+PCNET32_ADDR);
- lp->stats.rx_missed_errors = inw(ioaddr+PCNET32_DATA);
-
- outw(0, ioaddr+PCNET32_ADDR);


-
- if (pcnet32_debug > 1)

- printk("%s: Shutting down ethercard, status was %2.2x.\n",


- dev->name, inw(ioaddr+PCNET32_DATA));
-

- /* We stop the PCNET32 here -- it occasionally polls
- memory if we don't. */
- outw(0x0004, ioaddr+PCNET32_DATA);
-


- free_irq(dev->irq, dev);
-

- /* free all allocated skbuffs */
- for (i = 0; i < RX_RING_SIZE; i++) {
- lp->rx_ring[i].status = 0;
- if (lp->rx_skbuff[i])
- dev_kfree_skb(lp->rx_skbuff[i]);
- lp->rx_skbuff[i] = NULL;
- }


+ unsigned long ioaddr = dev->base_addr;

+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
+ int i;

+


+ dev->start = 0;

+ set_bit (0, (void *)&dev->tbusy);
+
+ lp->stats.rx_missed_errors = lp->a.read_csr (ioaddr, 112);


+
+ if (pcnet32_debug > 1)

+ printk("%s: Shutting down ethercard, status was %2.2x.\n",


+ dev->name, lp->a.read_csr (ioaddr, 0));
+

+ /* We stop the PCNET32 here -- it occasionally polls memory if we don't. */
+ lp->a.write_csr (ioaddr, 0, 0x0004);
+
+ /*
+ * Switch back to 16bit mode to avoid problems with dumb
+ * DOS packet driver after a warm reboot
+ */
+ lp->a.write_bcr (ioaddr, 20, 4);
+


+ free_irq(dev->irq, dev);
+

+ /* free all allocated skbuffs */
+ for (i = 0; i < RX_RING_SIZE; i++) {
+ lp->rx_ring[i].status = 0;
+ if (lp->rx_skbuff[i])
+ dev_kfree_skb(lp->rx_skbuff[i]);
+ lp->rx_skbuff[i] = NULL;
+ }


X
- for (i = 0; i < TX_RING_SIZE; i++) {
- if (lp->tx_skbuff[i])
- dev_kfree_skb(lp->tx_skbuff[i]);

- lp->rx_skbuff[i] = NULL;


- }
+ for (i = 0; i < TX_RING_SIZE; i++) {
+ if (lp->tx_skbuff[i])
+ dev_kfree_skb(lp->tx_skbuff[i]);

+ lp->rx_skbuff[i] = NULL;
+ }
X
- MOD_DEC_USE_COUNT;
+ MOD_DEC_USE_COUNT;
X
- return 0;


+ return 0;
X }
X

X static struct net_device_stats *
X pcnet32_get_stats(struct device *dev)


X {
- struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
- unsigned int ioaddr = dev->base_addr;

- unsigned short saved_addr;


- unsigned long flags;
-

- save_flags(flags);
- cli();
- saved_addr = inw(ioaddr+PCNET32_ADDR);
- outw(112, ioaddr+PCNET32_ADDR);
- lp->stats.rx_missed_errors = inw(ioaddr+PCNET32_DATA);
- outw(saved_addr, ioaddr+PCNET32_ADDR);
- restore_flags(flags);


+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
+ unsigned long ioaddr = dev->base_addr;

+ u16 saved_addr;


+ unsigned long flags;
+

+ save_flags(flags);
+ cli();
+ saved_addr = lp->a.read_rap(ioaddr);
+ lp->stats.rx_missed_errors = lp->a.read_csr (ioaddr, 112);
+ lp->a.write_rap(ioaddr, saved_addr);
+ restore_flags(flags);
X
- return &lp->stats;
+ return &lp->stats;
X }
X
-
X /* taken from the sunlance driver, which it took from the depca driver */
X static void pcnet32_load_multicast (struct device *dev)
X {
@@ -1044,34 +1283,68 @@
X }
X
X
-/* Set or clear the multicast filter for this adaptor.
+/*
+ * Set or clear the multicast filter for this adaptor.
X */
-
X static void pcnet32_set_multicast_list(struct device *dev)
X {
- unsigned int ioaddr = dev->base_addr;


- struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;

+ unsigned long ioaddr = dev->base_addr;

+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
X
- if (dev->flags&IFF_PROMISC) {
- /* Log any net taps. */
- printk("%s: Promiscuous mode enabled.\n", dev->name);
- lp->init_block.mode = le16_to_cpu(0x8000 | (lp->options & PORT_PORTSEL) << 7);
- } else {


- lp->init_block.mode = le16_to_cpu((lp->options & PORT_PORTSEL) << 7);

- pcnet32_load_multicast (dev);
- }
+ if (dev->flags&IFF_PROMISC) {
+ /* Log any net taps. */
+ printk("%s: Promiscuous mode enabled.\n", dev->name);
+ lp->init_block.mode = le16_to_cpu(0x8000 | (lp->options & PORT_PORTSEL) << 7);
+ } else {


+ lp->init_block.mode = le16_to_cpu((lp->options & PORT_PORTSEL) << 7);

+ pcnet32_load_multicast (dev);
+ }
X
- outw(0, ioaddr+PCNET32_ADDR);
- outw(0x0004, ioaddr+PCNET32_DATA); /* Temporarily stop the lance. */
+ lp->a.write_csr (ioaddr, 0, 0x0004); /* Temporarily stop the lance. */
X
- pcnet32_restart(dev, 0x0042); /* Resume normal operation */
+ pcnet32_restart(dev, 0x0042); /* Resume normal operation */
X }
X
+#ifdef HAVE_PRIVATE_IOCTL
+static int pcnet32_mii_ioctl(struct device *dev, struct ifreq *rq, int cmd)
+{


+ unsigned long ioaddr = dev->base_addr;
+ struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;

+ u16 *data = (u16 *)&rq->ifr_data;
+ int phyaddr = lp->a.read_bcr (ioaddr, 33);
+
+ if (lp->mii) {
+ switch(cmd) {
+ case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */
+ data[0] = (phyaddr >> 5) & 0x1f;
+ /* Fall Through */
+ case SIOCDEVPRIVATE+1: /* Read the specified MII register. */
+ lp->a.write_bcr (ioaddr, 33, ((data[0] & 0x1f) << 5) | (data[1] & 0x1f));
+ data[3] = lp->a.read_bcr (ioaddr, 34);
+ lp->a.write_bcr (ioaddr, 33, phyaddr);
+ return 0;
+ case SIOCDEVPRIVATE+2: /* Write the specified MII register */
+ if (!suser())
+ return -EPERM;
+ lp->a.write_bcr (ioaddr, 33, ((data[0] & 0x1f) << 5) | (data[1] & 0x1f));
+ lp->a.write_bcr (ioaddr, 34, data[2]);
+ lp->a.write_bcr (ioaddr, 33, phyaddr);
+ return 0;
+ default:
+ return -EOPNOTSUPP;
+ }
+ }
+ return -EOPNOTSUPP;
+}
+#endif /* HAVE_PRIVATE_IOCTL */
+
X #ifdef MODULE
X MODULE_PARM(debug, "i");
-MODULE_PARM(options, "i");
X MODULE_PARM(max_interrupt_work, "i");
X MODULE_PARM(rx_copybreak, "i");
+MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
+MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
+
X
X /* An additional parameter that may be passed in... */
X static int debug = -1;
@@ -1079,27 +1352,27 @@
X int
X init_module(void)
X {
- if (debug > 0)
- pcnet32_debug = debug;
+ if (debug > 0)
+ pcnet32_debug = debug;
X
- pcnet32_dev = NULL;
- return pcnet32_probe(NULL);
+ pcnet32_dev = NULL;
+ return pcnet32_probe(NULL);
X }
X
X void
X cleanup_module(void)
X {
- struct device *next_dev;
+ struct device *next_dev;
X
- /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
- while (pcnet32_dev) {
- next_dev = ((struct pcnet32_private *) pcnet32_dev->priv)->next;
- unregister_netdev(pcnet32_dev);
- release_region(pcnet32_dev->base_addr, PCNET32_TOTAL_SIZE);
- kfree(pcnet32_dev->priv);
- kfree(pcnet32_dev);
- pcnet32_dev = next_dev;
- }
+ /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
+ while (pcnet32_dev) {
+ next_dev = ((struct pcnet32_private *) pcnet32_dev->priv)->next;
+ unregister_netdev(pcnet32_dev);
+ release_region(pcnet32_dev->base_addr, PCNET32_TOTAL_SIZE);
+ kfree(((struct pcnet32_private *)pcnet32_dev->priv)->origmem);
+ kfree(pcnet32_dev);
+ pcnet32_dev = next_dev;
+ }


X }
X #endif /* MODULE */

X
diff -u --recursive --new-file v2.2.6/linux/drivers/net/ppp.c linux/drivers/net/ppp.c
--- v2.2.6/linux/drivers/net/ppp.c Tue Mar 23 14:35:48 1999
+++ linux/drivers/net/ppp.c Tue Apr 27 00:38:27 1999
@@ -4,7 +4,7 @@
X * Al Longyear <long...@netcom.com>
X * Extensively rewritten by Paul Mackerras <pau...@cs.anu.edu.au>
X *
- * ==FILEVERSION 990114==
+ * ==FILEVERSION 990331==
X *
X * NOTE TO MAINTAINERS:
X * If you modify this file at all, please set the number above to the
@@ -45,9 +45,8 @@
X
X #define PPP_MAX_RCV_QLEN 32 /* max # frames we queue up for pppd */
X
-/* $Id: ppp.c,v 1.19 1998/07/07 04:27:37 paulus Exp $ */
+/* $Id: ppp.c,v 1.24 1999/03/31 06:07:57 paulus Exp $ */
X
-#include <linux/version.h>


X #include <linux/config.h>
X #include <linux/module.h>

X #include <linux/kernel.h>
@@ -61,6 +60,7 @@
X #include <linux/malloc.h>
X #include <linux/tty.h>
X #include <linux/errno.h>
+#include <linux/sched.h> /* to get the struct task_struct */
X #include <linux/string.h> /* used in new tty drivers */
X #include <linux/signal.h> /* used in new tty drivers */
X #include <asm/system.h>
@@ -90,6 +90,9 @@
X #include <linux/kmod.h>
X #endif
X
+typedef ssize_t rw_ret_t;
+typedef size_t rw_count_t;
+
X /*
X * Local functions
X */
@@ -101,9 +104,11 @@
X
X static void ppp_async_init(struct ppp *ppp);
X static void ppp_async_release(struct ppp *ppp);
+static int ppp_tty_sync_push(struct ppp *ppp);
X static int ppp_tty_push(struct ppp *ppp);
X static int ppp_async_encode(struct ppp *ppp);
X static int ppp_async_send(struct ppp *, struct sk_buff *);
+static int ppp_sync_send(struct ppp *, struct sk_buff *);
X
X static int ppp_ioctl(struct ppp *, unsigned int, unsigned long);
X static int ppp_set_compression (struct ppp *ppp, struct ppp_option_data *odp);
@@ -186,10 +191,10 @@
X * TTY callbacks
X */
X
-static ssize_t ppp_tty_read(struct tty_struct *, struct file *, __u8 *,
- size_t);
-static ssize_t ppp_tty_write(struct tty_struct *, struct file *, const __u8 *,
- size_t);
+static rw_ret_t ppp_tty_read(struct tty_struct *, struct file *, __u8 *,
+ rw_count_t);
+static rw_ret_t ppp_tty_write(struct tty_struct *, struct file *, const __u8 *,
+ rw_count_t);
X static int ppp_tty_ioctl(struct tty_struct *, struct file *, unsigned int,
X unsigned long);
X static unsigned int ppp_tty_poll(struct tty_struct *tty, struct file *filp,
@@ -236,7 +241,6 @@
X 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
X 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
X };
-EXPORT_SYMBOL(ppp_crc16_table);
X
X #ifdef CHECK_CHARACTERS
X static __u32 paritytab[8] =
@@ -458,13 +462,13 @@
X * Read a PPP frame from the rcv_q list,
X * waiting if necessary
X */
-static ssize_t
+static rw_ret_t
X ppp_tty_read(struct tty_struct *tty, struct file *file, __u8 * buf,
- size_t nr)
+ rw_count_t nr)
X {
X struct ppp *ppp = tty2ppp (tty);
X struct sk_buff *skb;
- ssize_t len, err;
+ rw_ret_t len, err;
X
X /*
X * Validate the pointers
@@ -546,9 +550,9 @@
X * Writing to a tty in ppp line discipline sends a PPP frame.
X * Used by pppd to send control packets (LCP, etc.).
X */
-static ssize_t
+static rw_ret_t
X ppp_tty_write(struct tty_struct *tty, struct file *file, const __u8 * data,
- size_t count)
+ rw_count_t count)
X {
X struct ppp *ppp = tty2ppp (tty);
X __u8 *new_data;
@@ -600,7 +604,7 @@
X */
X ppp_send_ctrl(ppp, skb)