diff -u --recursive --new-file v2.4.5/linux/CREDITS linux/CREDITS --- v2.4.5/linux/CREDITS Fri May 25 18:28:53 2001 +++ linux/CREDITS Tue Jun 5 18:11:40 2001 @@ -1356,13 +1356,15 @@ E: davej@suse.de W: http://www.suse.de/~davej D: Moved PCI bridge tuning to userspace (Powertweak). -D: Centaur/IDT Winchip/Winchip 2 tweaks. +D: Various x86 (& clones) setup code hacking. D: AFFS fixes for 2.3.x -D: Misc clean ups and other random hacking. -S: 28, Laura Street, -S: Treforest, Pontypridd, -S: Mid Glamorgan, CF37 1NW, -S: Wales, United Kingdom +D: Various Janitorial hacks. (kernel-janitor.sourceforge.net) +S: c/o SuSE Linux UK Ltd +S: The Kinetic Centre +S: Theobald Street +S: Borehamwood +S: Herts, WD6 4PJ +S: United Kingdom N: Ani Joshi E: ajoshi@shell.unixbox.com @@ -1517,6 +1519,17 @@ S: Markham, Ontario S: L3R 8B2 S: Canada + +N: Maxim Krasnyansky +E: maxk@qualcomm.com +W: http://vtun.sf.net +W: http://bluez.sf.net +D: Author of the Universal TUN/TAP driver +D: Author of the Linux Bluetooth Subsystem (BlueZ) +D: Various other kernel patches, cleanups and fixes +S: 2213 La Terrace Circle +S: San Jose, CA 95123 +S: USA N: Andreas S. Krebs E: akrebs@altavista.net diff -u --recursive --new-file v2.4.5/linux/Documentation/Changes linux/Documentation/Changes --- v2.4.5/linux/Documentation/Changes Fri May 25 18:28:53 2001 +++ linux/Documentation/Changes Tue Jun 5 18:27:19 2001 @@ -320,7 +320,7 @@ LVM toolset ----------- -o +o Pcmcia-cs --------- diff -u --recursive --new-file v2.4.5/linux/Documentation/Configure.help linux/Documentation/Configure.help --- v2.4.5/linux/Documentation/Configure.help Fri May 25 18:28:53 2001 +++ linux/Documentation/Configure.help Mon Jun 4 16:02:56 2001 @@ -10709,9 +10709,10 @@ USB Handspring Visor Driver CONFIG_USB_SERIAL_VISOR - Say Y here if you want to connect to your HandSpring Visor through - its USB docking station. See http://usbvisor.sourceforge.net for - more information on using this driver. + Say Y here if you want to connect to your HandSpring Visor, Palm m500 + or m505 through its USB docking station. + See http://usbvisor.sourceforge.net for more information on using this + driver. This code is also available as a module ( = code which can be inserted in and removed from the running kernel whenever you want). @@ -11128,12 +11129,13 @@ Microtek USB scanner support CONFIG_USB_MICROTEK - Say Y here if you want support for the Microtek X6USB and possibly - some other scanners by that vendor. The scanner will appear as a - scsi generic device to the rest of the system. - A patched version of SANE is necessary to use the - scanner. It's available at - http://fachschaft.cup.uni-muenchen.de/~neukum/scanner.html + Say Y here if you want support for the Microtek X6USB and + possibly the Phantom 336CX, Phantom C6 and ScanMaker V6U(S)L. + Support for anything but the X6 is experimetal. + Please report failures and successes. + The scanner will appear as a scsi generic device to the rest + of the system. Scsi support is required for this driver to compile + and work. SANE 1.0.4 or newer is needed to make use of your scanner. This driver can be compiled as a module. USB Bluetooth support diff -u --recursive --new-file v2.4.5/linux/Documentation/filesystems/hpfs.txt linux/Documentation/filesystems/hpfs.txt --- v2.4.5/linux/Documentation/filesystems/hpfs.txt Fri Jul 28 12:50:51 2000 +++ linux/Documentation/filesystems/hpfs.txt Fri Jun 8 13:17:08 2001 @@ -1,5 +1,5 @@ -Read/Write HPFS 2.00 -1998-1999, Mikulas Patocka +Read/Write HPFS 2.05 +1998-2001, Mikulas Patocka email: mikulas@artax.karlin.mff.cuni.cz homepage: http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi @@ -269,6 +269,20 @@ Removed a lot of redundant code 2.00 Fixed a bug in rename (it was there since 1.96) Better anti-fragmentation strategy +2.01 Fixed problem with directory listing over NFS + Directory lseek now checks for proper parameters + Fixed race-condition in buffer code - it is in all filesystems in Linux; + when reading device (cat /dev/hda) while creating files on it, files + could be damaged +2.02 Woraround for bug in breada in Linux. breada could cause accesses beyond + end of partition +2.03 Char, block devices and pipes are correctly created + Fixed non-crashing race in unlink (Alexander Viro) + Now it works with Japanese version of OS/2 +2.04 Fixed error when ftruncate used to extend file +2.05 Fixed crash when got mount parameters without = + Fixed crash when allocation of anode failed due to full disk + Fixed some crashes when block io or inode allocation failed vim: set textwidth=80: diff -u --recursive --new-file v2.4.5/linux/Documentation/filesystems/udf.txt linux/Documentation/filesystems/udf.txt --- v2.4.5/linux/Documentation/filesystems/udf.txt Thu Mar 2 11:17:32 2000 +++ linux/Documentation/filesystems/udf.txt Wed Jun 6 10:24:10 2001 @@ -1,10 +1,10 @@ * * ./Documentation/filesystems/udf.txt * -UDF Filesystem version 0.9.1 +UDF Filesystem version 0.9.4 If you encounter problems with reading UDF discs using this driver, -please report them to linux_udf@hootie.lvld.hp.com, which is the +please report them to linux_udf@hpesjro.fc.hp.com, which is the developer's list. Write support requires a block driver which supports writing. The current @@ -23,7 +23,8 @@ noadinicb Don't embed data in the inode shortad Use short ad's longad Use long ad's (default) - strict Set strict conformance (unused) + strict Set strict conformance + iocharset= Set the NLS character set The remaining are for debugging and disaster recovery: diff -u --recursive --new-file v2.4.5/linux/MAINTAINERS linux/MAINTAINERS --- v2.4.5/linux/MAINTAINERS Fri May 25 18:28:53 2001 +++ linux/MAINTAINERS Wed Jun 6 10:25:21 2001 @@ -231,7 +231,7 @@ CIRRUS LOGIC GENERIC FBDEV DRIVER P: Jeff Garzik M: jgarzik@mandrakesoft.com -L: linux-fbdev@vuser.vu.union.edu +L: linux-fbdev-devel@lists.sourceforge.net S: Odd Fixes CIRRUS LOGIC CS4280/CS461x SOUNDDRIVER @@ -804,9 +804,9 @@ LOGICAL VOLUME MANAGER P: Heinz Mauelshagen -M: linux-LVM@EZ-Darmstadt.Telekom.de -L: linux-LVM@msede.com -W: http://linux.msede.com/lvm +M: mge@sistina.de +L: linux-LVM@sistina.com +W: http://www.sistina.com/lvm S: Maintained M68K @@ -1087,9 +1087,9 @@ S: Maintained RAGE128 FRAMEBUFFER DISPLAY DRIVER -P: Brad Douglas -M: brad@neruo.com -L: linux-fbdev@vuser.vu.union.edu +P: Ani Joshi +M: ajoshi@shell.unixbox.com +L: linux-fbdev-devel@lists.sourceforge.net S: Maintained RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER @@ -1347,8 +1347,8 @@ M: bfennema@falcon.csc.calpoly.edu P: Dave Boynton M: dave@trylinux.com -L: linux_udf@hootie.lvld.hp.com -W: http://www.trylinux.com/projects/udf/index.html +L: linux_udf@hpesjro.fc.hp.com +W: http://linux-udf.sourceforge.net S: Maintained UMSDOS FILESYSTEM @@ -1571,6 +1571,12 @@ M: middelin@polyware.nl W: http://www.polyware.nl/~middelin/En/hobbies.html W: http://www.polyware.nl/~middelin/hobbies.html +S: Maintained + +Bluetooth Subsystem (BlueZ) +P: Maxim Krasnyansky +M: maxk@qualcomm.com +W: http://bluez.sf.net S: Maintained THE REST diff -u --recursive --new-file v2.4.5/linux/Makefile linux/Makefile --- v2.4.5/linux/Makefile Fri May 25 18:28:53 2001 +++ linux/Makefile Tue Jun 5 18:11:40 2001 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 4 -SUBLEVEL = 5 -EXTRAVERSION = +SUBLEVEL = 6 +EXTRAVERSION =-pre1 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) @@ -177,6 +177,7 @@ DRIVERS-$(CONFIG_PHONE) += drivers/telephony/telephony.o DRIVERS-$(CONFIG_ACPI) += drivers/acpi/acpi.o DRIVERS-$(CONFIG_MD) += drivers/md/mddev.o +DRIVERS-$(CONFIG_BLUEZ) += drivers/bluetooth/bluetooth.o DRIVERS := $(DRIVERS-y) diff -u --recursive --new-file v2.4.5/linux/arch/alpha/config.in linux/arch/alpha/config.in --- v2.4.5/linux/arch/alpha/config.in Fri May 25 18:28:53 2001 +++ linux/arch/alpha/config.in Tue Jun 5 18:11:40 2001 @@ -348,6 +348,10 @@ source drivers/usb/Config.in source drivers/input/Config.in +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + source net/bluetooth/Config.in +fi + mainmenu_option next_comment comment 'Kernel hacking' diff -u --recursive --new-file v2.4.5/linux/arch/alpha/kernel/core_tsunami.c linux/arch/alpha/kernel/core_tsunami.c --- v2.4.5/linux/arch/alpha/kernel/core_tsunami.c Fri May 25 18:28:53 2001 +++ linux/arch/alpha/kernel/core_tsunami.c Sun Jun 3 16:45:55 2001 @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -21,6 +20,8 @@ #include #include #undef __EXTERN_INLINE + +#include #include "proto.h" #include "pci_impl.h" diff -u --recursive --new-file v2.4.5/linux/arch/alpha/kernel/entry.S linux/arch/alpha/kernel/entry.S --- v2.4.5/linux/arch/alpha/kernel/entry.S Fri May 25 18:28:53 2001 +++ linux/arch/alpha/kernel/entry.S Tue Jun 5 16:53:23 2001 @@ -31,7 +31,7 @@ #define TASK_STATE 0 #define TASK_FLAGS 8 #define TASK_SIGPENDING 16 -#define TASK_ADDR_LIMIT 24 +#define TASK_ADDR_LIMIT 24 #define TASK_EXEC_DOMAIN 32 #define TASK_NEED_RESCHED 40 #define TASK_PTRACE 48 @@ -576,13 +576,15 @@ .align 3 ret_from_sys_call: cmovne $26,0,$19 /* $19 = 0 => non-restartable */ +#ifdef CONFIG_SMP ldl $3,TASK_PROCESSOR($8) - lda $4,irq_stat /* softirq_active */ sll $3,L1_CACHE_SHIFT,$3 +#endif + lda $4,irq_stat +#ifdef CONFIG_SMP addq $3,$4,$4 - ldq $4,0($4) /* softirq_active[32] + softirq_mask[32] */ - sll $4,32,$3 - and $4,$3,$4 +#endif + ldq $4,0($4) /* __softirq_pending */ bne $4,handle_softirq ret_from_softirq: ldq $0,SP_OFF($30) diff -u --recursive --new-file v2.4.5/linux/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c --- v2.4.5/linux/arch/alpha/kernel/irq.c Fri Feb 9 11:29:44 2001 +++ linux/arch/alpha/kernel/irq.c Tue Jun 5 16:53:23 2001 @@ -359,7 +359,9 @@ static void register_irq_proc (unsigned int irq) { +#ifdef CONFIG_SMP struct proc_dir_entry *entry; +#endif char name [MAX_NAMELEN]; if (!root_irq_dir || (irq_desc[irq].handler == &no_irq_type)) @@ -389,7 +391,9 @@ void init_irq_proc (void) { +#ifdef CONFIG_SMP struct proc_dir_entry *entry; +#endif int i; /* create /proc/irq */ @@ -569,7 +573,7 @@ /* - * do_IRQ handles all normal device IRQ's (the special + * handle_irq handles all normal device IRQ's (the special * SMP cross-CPU interrupts have their own specific * handlers). */ @@ -632,7 +636,7 @@ /* * Edge triggered interrupts need to remember pending events. * This applies to any hw interrupts that allow a second - * instance of the same irq to arrive while we are in do_IRQ + * instance of the same irq to arrive while we are in handle_irq * or in the handler. But the code here only handles the _second_ * instance of the irq, not the third or fourth. So it is mostly * useful for irq hardware that does not mask cleanly in an @@ -656,6 +660,9 @@ */ desc->handler->end(irq); spin_unlock(&desc->lock); + + if (softirq_pending(cpu)) + do_softirq(); } /* diff -u --recursive --new-file v2.4.5/linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c --- v2.4.5/linux/arch/alpha/kernel/smp.c Fri May 25 18:28:53 2001 +++ linux/arch/alpha/kernel/smp.c Tue Jun 5 16:53:23 2001 @@ -682,6 +682,9 @@ data->prof_counter = data->prof_multiplier; irq_exit(cpu, RTC_IRQ); + + if (softirq_pending(cpu)) + do_softirq(); } } diff -u --recursive --new-file v2.4.5/linux/arch/alpha/kernel/sys_dp264.c linux/arch/alpha/kernel/sys_dp264.c --- v2.4.5/linux/arch/alpha/kernel/sys_dp264.c Fri May 25 18:28:53 2001 +++ linux/arch/alpha/kernel/sys_dp264.c Sun Jun 3 16:34:41 2001 @@ -16,18 +16,15 @@ #include #include -#define __EXTERN_INLINE inline -#include -#include -#undef __EXTERN_INLINE - #include #include #include #include #include #include +#include #include +#include #include #include "proto.h" diff -u --recursive --new-file v2.4.5/linux/arch/alpha/kernel/sys_rawhide.c linux/arch/alpha/kernel/sys_rawhide.c --- v2.4.5/linux/arch/alpha/kernel/sys_rawhide.c Fri Mar 2 11:12:07 2001 +++ linux/arch/alpha/kernel/sys_rawhide.c Sun Jun 3 16:51:30 2001 @@ -59,10 +59,11 @@ irq -= 16; hose = irq / 24; irq -= hose * 24; + mask = 1 << irq; spin_lock(&rawhide_irq_lock); - mask = cached_irq_masks[hose] |= 1 << irq; - mask |= hose_irq_masks[hose]; + mask |= cached_irq_masks[hose]; + cached_irq_masks[hose] = mask; rawhide_update_irq_hw(hose, mask); spin_unlock(&rawhide_irq_lock); } @@ -75,14 +76,37 @@ irq -= 16; hose = irq / 24; irq -= hose * 24; + mask = ~(1 << irq) | hose_irq_masks[hose]; spin_lock(&rawhide_irq_lock); - mask = cached_irq_masks[hose] &= ~(1 << irq); - mask |= hose_irq_masks[hose]; + mask &= cached_irq_masks[hose]; + cached_irq_masks[hose] = mask; rawhide_update_irq_hw(hose, mask); spin_unlock(&rawhide_irq_lock); } +static void +rawhide_mask_and_ack_irq(unsigned int irq) +{ + unsigned int mask, mask1, hose; + + irq -= 16; + hose = irq / 24; + irq -= hose * 24; + mask1 = 1 << irq; + mask = ~mask1 | hose_irq_masks[hose]; + + spin_lock(&rawhide_irq_lock); + + mask &= cached_irq_masks[hose]; + cached_irq_masks[hose] = mask; + rawhide_update_irq_hw(hose, mask); + + /* Clear the interrupt. */ + *(vuip)MCPCIA_INT_REQ(MCPCIA_HOSE2MID(hose)) = mask1; + + spin_unlock(&rawhide_irq_lock); +} static unsigned int rawhide_startup_irq(unsigned int irq) @@ -104,7 +128,7 @@ shutdown: rawhide_disable_irq, enable: rawhide_enable_irq, disable: rawhide_disable_irq, - ack: rawhide_disable_irq, + ack: rawhide_mask_and_ack_irq, end: rawhide_end_irq, }; @@ -145,8 +169,12 @@ mcpcia_init_hoses(); for (hose = hose_head; hose; hose = hose->next) { - int h = hose->index; - rawhide_update_irq_hw(h, hose_irq_masks[h]); + unsigned int h = hose->index; + unsigned int mask = hose_irq_masks[h]; + + cached_irq_masks[h] = mask; + *(vuip)MCPCIA_INT_MASK0(MCPCIA_HOSE2MID(h)) = mask; + *(vuip)MCPCIA_INT_MASK1(MCPCIA_HOSE2MID(h)) = 0; } for (i = 16; i < 128; ++i) { diff -u --recursive --new-file v2.4.5/linux/arch/arm/config.in linux/arch/arm/config.in --- v2.4.5/linux/arch/arm/config.in Tue Apr 17 17:19:24 2001 +++ linux/arch/arm/config.in Tue Jun 5 18:11:40 2001 @@ -482,6 +482,9 @@ source drivers/usb/Config.in +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + source net/bluetooth/Config.in +fi mainmenu_option next_comment comment 'Kernel hacking' diff -u --recursive --new-file v2.4.5/linux/arch/cris/drivers/ide.c linux/arch/cris/drivers/ide.c --- v2.4.5/linux/arch/cris/drivers/ide.c Fri Apr 6 10:42:55 2001 +++ linux/arch/cris/drivers/ide.c Sun Jun 3 21:17:47 2001 @@ -1,4 +1,4 @@ -/* $Id: ide.c,v 1.9 2001/03/01 13:11:18 bjornw Exp $ +/* $Id: ide.c,v 1.16 2001/04/05 08:30:07 matsfg Exp $ * * Etrax specific IDE functions, like init and PIO-mode setting etc. * Almost the entire ide.c is used for the rest of the Etrax ATA driver. @@ -8,6 +8,28 @@ * Mikael Starvik (pio setup stuff) * * $Log: ide.c,v $ + * Revision 1.16 2001/04/05 08:30:07 matsfg + * Corrected cse1 and csp0 reset. + * + * Revision 1.15 2001/04/04 14:34:06 bjornw + * Re-instated code that mysteriously disappeared during review updates. + * + * Revision 1.14 2001/04/04 13:45:12 matsfg + * Calls REG_SHADOW_SET for cse1 reset so only the resetbit is affected + * + * Revision 1.13 2001/04/04 13:26:40 matsfg + * memmapping is done in init.c + * + * Revision 1.12 2001/04/04 11:37:56 markusl + * Updated according to review remarks + * + * Revision 1.11 2001/03/29 12:49:14 matsfg + * Changed check for ata_tot_size from >= to >. + * Sets sw_len to 0 if size is exactly 65536. + * + * Revision 1.10 2001/03/16 09:39:30 matsfg + * Support for reset on port CSP0 + * * Revision 1.9 2001/03/01 13:11:18 bjornw * 100 -> HZ * @@ -158,6 +180,10 @@ #define ATA_PIO0_STROBE 19 #define ATA_PIO0_HOLD 4 +static int e100_dmaproc (ide_dma_action_t func, ide_drive_t *drive); +static void e100_ideproc (ide_ide_action_t func, ide_drive_t *drive, + void *buffer, unsigned int length); + /* * good_dma_drives() lists the model names (from "hdparm -i") * of drives which do not support mword2 DMA but which are @@ -174,7 +200,7 @@ unsigned long flags; pio = 4; - //pio = ide_get_best_pio_mode(drive, pio, 4, NULL); + /* pio = ide_get_best_pio_mode(drive, pio, 4, NULL); */ save_flags(flags); cli(); @@ -226,10 +252,6 @@ restore_flags(flags); } -static int e100_dmaproc (ide_dma_action_t func, ide_drive_t *drive); /* defined below */ -static void e100_ideproc (ide_ide_action_t func, ide_drive_t *drive, - void *buffer, unsigned int length); /* defined below */ - void __init init_e100_ide (void) { @@ -277,26 +299,23 @@ *R_GEN_CONFIG = genconfig_shadow; #ifdef CONFIG_ETRAX_IDE_CSE1_16_RESET -#ifndef CONFIG_CRIS_LOW_MAP - /* remap the I/O-mapped reset-bit from CSE1 to something inside our kernel space */ - reset_addr = (unsigned long *)ioremap((unsigned long)(MEM_CSE1_START | - MEM_NON_CACHEABLE), 16); - *reset_addr = 0; -#else - /* LOW_MAP, can't do the ioremap, but it's already mapped straight over */ - reset_addr = (unsigned long *)(MEM_CSE1_START | MEM_NON_CACHEABLE); - *reset_addr = 0; + init_ioremap(); + REG_SHADOW_SET(port_cse1_addr, port_cse1_shadow, 16, 0); #endif + +#ifdef CONFIG_ETRAX_IDE_CSP0_8_RESET + init_ioremap(); + REG_SHADOW_SET(port_csp0_addr, port_csp0_shadow, 8, 0); #endif /* wait some */ - - dummy = 1; - dummy = 2; - dummy = 3; + udelay(25); #ifdef CONFIG_ETRAX_IDE_CSE1_16_RESET - *reset_addr = 1 << 16; + REG_SHADOW_SET(port_cse1_addr, port_cse1_shadow, 16, 1); +#endif +#ifdef CONFIG_ETRAX_IDE_CSP0_8_RESET + REG_SHADOW_SET(port_csp0_addr, port_csp0_shadow, 8, 1); #endif #ifdef CONFIG_ETRAX_IDE_G27_RESET *R_PORT_G_DATA = 0; /* de-assert bus-reset */ @@ -349,7 +368,6 @@ e100_atapi_input_bytes (ide_drive_t *drive, void *buffer, unsigned int bytecount) { ide_ioreg_t data_reg = IDE_DATA_REG; - unsigned long status; D(printk("atapi_input_bytes, dreg 0x%x, buffer 0x%x, count %d\n", data_reg, buffer, bytecount)); @@ -376,7 +394,7 @@ /* initiate a multi word dma read using PIO handshaking */ - *R_ATA_TRANSFER_CNT = bytecount >> 1; + *R_ATA_TRANSFER_CNT = IO_FIELD(R_ATA_TRANSFER_CNT, count, bytecount >> 1); *R_ATA_CTRL_DATA = data_reg | IO_STATE(R_ATA_CTRL_DATA, rw, read) | @@ -390,35 +408,38 @@ LED_DISK_READ(1); WAIT_DMA(3); LED_DISK_READ(0); - + #if 0 - /* old polled transfer code */ - - /* initiate a multi word read */ - - *R_ATA_TRANSFER_CNT = wcount << 1; - - *R_ATA_CTRL_DATA = data_reg | - IO_STATE(R_ATA_CTRL_DATA, rw, read) | - IO_STATE(R_ATA_CTRL_DATA, src_dst, register) | - IO_STATE(R_ATA_CTRL_DATA, handsh, pio) | - IO_STATE(R_ATA_CTRL_DATA, multi, on) | - IO_STATE(R_ATA_CTRL_DATA, dma_size, word); - - /* svinto has a latency until the busy bit actually is set */ - - nop(); nop(); - nop(); nop(); - nop(); nop(); - nop(); nop(); - nop(); nop(); - - /* unit should be busy during multi transfer */ - while((status = *R_ATA_STATUS_DATA) & IO_MASK(R_ATA_STATUS_DATA, busy)) { - while(!(status & IO_MASK(R_ATA_STATUS_DATA, dav))) - status = *R_ATA_STATUS_DATA; - *ptr++ = (unsigned short)(status & 0xffff); - } + /* old polled transfer code + * this should be moved into a new function that can do polled + * transfers if DMA is not available + */ + + /* initiate a multi word read */ + + *R_ATA_TRANSFER_CNT = wcount << 1; + + *R_ATA_CTRL_DATA = data_reg | + IO_STATE(R_ATA_CTRL_DATA, rw, read) | + IO_STATE(R_ATA_CTRL_DATA, src_dst, register) | + IO_STATE(R_ATA_CTRL_DATA, handsh, pio) | + IO_STATE(R_ATA_CTRL_DATA, multi, on) | + IO_STATE(R_ATA_CTRL_DATA, dma_size, word); + + /* svinto has a latency until the busy bit actually is set */ + + nop(); nop(); + nop(); nop(); + nop(); nop(); + nop(); nop(); + nop(); nop(); + + /* unit should be busy during multi transfer */ + while((status = *R_ATA_STATUS_DATA) & IO_MASK(R_ATA_STATUS_DATA, busy)) { + while(!(status & IO_MASK(R_ATA_STATUS_DATA, dav))) + status = *R_ATA_STATUS_DATA; + *ptr++ = (unsigned short)(status & 0xffff); + } #endif } @@ -426,8 +447,6 @@ e100_atapi_output_bytes (ide_drive_t *drive, void *buffer, unsigned int bytecount) { ide_ioreg_t data_reg = IDE_DATA_REG; - unsigned short *ptr = (unsigned short *)buffer; - unsigned long ctrl; D(printk("atapi_output_bytes, dreg 0x%x, buffer 0x%x, count %d\n", data_reg, buffer, bytecount)); @@ -454,7 +473,7 @@ /* initiate a multi word dma write using PIO handshaking */ - *R_ATA_TRANSFER_CNT = bytecount >> 1; + *R_ATA_TRANSFER_CNT = IO_FIELD(R_ATA_TRANSFER_CNT, count, bytecount >> 1); *R_ATA_CTRL_DATA = data_reg | IO_STATE(R_ATA_CTRL_DATA, rw, write) | @@ -470,40 +489,42 @@ LED_DISK_WRITE(0); #if 0 - /* old polled write code */ + /* old polled write code - see comment in input_bytes */ - while(*R_ATA_STATUS_DATA & IO_MASK(R_ATA_STATUS_DATA, busy)); /* wait for busy flag */ + /* wait for busy flag */ + while(*R_ATA_STATUS_DATA & IO_MASK(R_ATA_STATUS_DATA, busy)); - /* initiate a multi word write */ + /* initiate a multi word write */ - *R_ATA_TRANSFER_CNT = bytecount >> 1; + *R_ATA_TRANSFER_CNT = bytecount >> 1; - ctrl = data_reg | - IO_STATE(R_ATA_CTRL_DATA, rw, write) | - IO_STATE(R_ATA_CTRL_DATA, src_dst, register) | - IO_STATE(R_ATA_CTRL_DATA, handsh, pio) | - IO_STATE(R_ATA_CTRL_DATA, multi, on) | - IO_STATE(R_ATA_CTRL_DATA, dma_size, word); - - LED_DISK_WRITE(1); - - /* Etrax will set busy = 1 until the multi pio transfer has finished - * and tr_rdy = 1 after each succesful word transfer. - * When the last byte has been transferred Etrax will first set tr_tdy = 1 - * and then busy = 0 (not in the same cycle). If we read busy before it - * has been set to 0 we will think that we should transfer more bytes - * and then tr_rdy would be 0 forever. This is solved by checking busy - * in the inner loop. - */ - - do { - *R_ATA_CTRL_DATA = ctrl | *ptr++; - while(!(*R_ATA_STATUS_DATA & IO_MASK(R_ATA_STATUS_DATA, tr_rdy)) && - (*R_ATA_STATUS_DATA & IO_MASK(R_ATA_STATUS_DATA, busy))); - } while(*R_ATA_STATUS_DATA & IO_MASK(R_ATA_STATUS_DATA, busy)); + ctrl = data_reg | + IO_STATE(R_ATA_CTRL_DATA, rw, write) | + IO_STATE(R_ATA_CTRL_DATA, src_dst, register) | + IO_STATE(R_ATA_CTRL_DATA, handsh, pio) | + IO_STATE(R_ATA_CTRL_DATA, multi, on) | + IO_STATE(R_ATA_CTRL_DATA, dma_size, word); + + LED_DISK_WRITE(1); + + /* Etrax will set busy = 1 until the multi pio transfer has finished + * and tr_rdy = 1 after each succesful word transfer. + * When the last byte has been transferred Etrax will first set tr_tdy = 1 + * and then busy = 0 (not in the same cycle). If we read busy before it + * has been set to 0 we will think that we should transfer more bytes + * and then tr_rdy would be 0 forever. This is solved by checking busy + * in the inner loop. + */ + + do { + *R_ATA_CTRL_DATA = ctrl | *ptr++; + while(!(*R_ATA_STATUS_DATA & IO_MASK(R_ATA_STATUS_DATA, tr_rdy)) && + (*R_ATA_STATUS_DATA & IO_MASK(R_ATA_STATUS_DATA, busy))); + } while(*R_ATA_STATUS_DATA & IO_MASK(R_ATA_STATUS_DATA, busy)); + + LED_DISK_WRITE(0); +#endif - LED_DISK_WRITE(0); -#endif } /* @@ -604,7 +625,7 @@ those blocks that were actually set-up for transfer. */ - if(ata_tot_size + size >= 131072) { + if(ata_tot_size + size > 131072) { printk("too large total ATA DMA request, %d + %d!\n", ata_tot_size, size); return 1; } @@ -625,7 +646,12 @@ addr += 65536; } /* ok we want to do IO at addr, size bytes. set up a new descriptor entry */ - ata_descrs[count].sw_len = size; + if(size == 65536) { + ata_descrs[count].sw_len = 0; /* 0 means 65536, this is a 16-bit field */ + } + else { + ata_descrs[count].sw_len = size; + } ata_descrs[count].ctrl = 0; ata_descrs[count].buf = addr; ata_descrs[count].next = virt_to_phys(&ata_descrs[count + 1]); @@ -793,9 +819,11 @@ /* initiate a multi word dma read using DMA handshaking */ - *R_ATA_TRANSFER_CNT = ata_tot_size >> 1; + *R_ATA_TRANSFER_CNT = + IO_FIELD(R_ATA_TRANSFER_CNT, count, ata_tot_size >> 1); - *R_ATA_CTRL_DATA = IDE_DATA_REG | + *R_ATA_CTRL_DATA = + IO_FIELD(R_ATA_CTRL_DATA, data, IDE_DATA_REG) | IO_STATE(R_ATA_CTRL_DATA, rw, read) | IO_STATE(R_ATA_CTRL_DATA, src_dst, dma) | IO_STATE(R_ATA_CTRL_DATA, handsh, dma) | @@ -834,9 +862,11 @@ /* initiate a multi word dma write using DMA handshaking */ - *R_ATA_TRANSFER_CNT = ata_tot_size >> 1; + *R_ATA_TRANSFER_CNT = + IO_FIELD(R_ATA_TRANSFER_CNT, count, ata_tot_size >> 1); - *R_ATA_CTRL_DATA = IDE_DATA_REG | + *R_ATA_CTRL_DATA = + IO_FIELD(R_ATA_CTRL_DATA, data, IDE_DATA_REG) | IO_STATE(R_ATA_CTRL_DATA, rw, write) | IO_STATE(R_ATA_CTRL_DATA, src_dst, dma) | IO_STATE(R_ATA_CTRL_DATA, handsh, dma) | diff -u --recursive --new-file v2.4.5/linux/arch/i386/config.in linux/arch/i386/config.in --- v2.4.5/linux/arch/i386/config.in Fri May 25 18:28:53 2001 +++ linux/arch/i386/config.in Tue Jun 5 18:11:40 2001 @@ -375,6 +375,10 @@ source drivers/usb/Config.in +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + source net/bluetooth/Config.in +fi + mainmenu_option next_comment comment 'Kernel hacking' diff -u --recursive --new-file v2.4.5/linux/arch/i386/kernel/apic.c linux/arch/i386/kernel/apic.c --- v2.4.5/linux/arch/i386/kernel/apic.c Tue Dec 5 12:43:48 2000 +++ linux/arch/i386/kernel/apic.c Mon Jun 4 15:57:49 2001 @@ -728,6 +728,9 @@ irq_enter(cpu, 0); smp_local_timer_interrupt(regs); irq_exit(cpu, 0); + + if (softirq_pending(cpu)) + do_softirq(); } /* diff -u --recursive --new-file v2.4.5/linux/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S --- v2.4.5/linux/arch/i386/kernel/entry.S Wed Nov 8 17:09:50 2000 +++ linux/arch/i386/kernel/entry.S Wed Jun 6 10:03:11 2001 @@ -203,18 +203,7 @@ call *SYMBOL_NAME(sys_call_table)(,%eax,4) movl %eax,EAX(%esp) # save the return value ENTRY(ret_from_sys_call) -#ifdef CONFIG_SMP - movl processor(%ebx),%eax - shll $CONFIG_X86_L1_CACHE_SHIFT,%eax - movl SYMBOL_NAME(irq_stat)(,%eax),%ecx # softirq_active - testl SYMBOL_NAME(irq_stat)+4(,%eax),%ecx # softirq_mask -#else - movl SYMBOL_NAME(irq_stat),%ecx # softirq_active - testl SYMBOL_NAME(irq_stat)+4,%ecx # softirq_mask -#endif - jne handle_softirq - -ret_with_reschedule: + cli # need_resched and signals atomic test cmpl $0,need_resched(%ebx) jne reschedule cmpl $0,sigpending(%ebx) @@ -258,31 +247,21 @@ ALIGN ret_from_exception: -#ifdef CONFIG_SMP - GET_CURRENT(%ebx) - movl processor(%ebx),%eax - shll $CONFIG_X86_L1_CACHE_SHIFT,%eax - movl SYMBOL_NAME(irq_stat)(,%eax),%ecx # softirq_active - testl SYMBOL_NAME(irq_stat)+4(,%eax),%ecx # softirq_mask -#else - movl SYMBOL_NAME(irq_stat),%ecx # softirq_active - testl SYMBOL_NAME(irq_stat)+4,%ecx # softirq_mask -#endif - jne handle_softirq + cli + cmpl $0,need_resched(%ebx) + jne reschedule + cmpl $0,sigpending(%ebx) + jne signal_return + jmp restore_all ENTRY(ret_from_intr) GET_CURRENT(%ebx) movl EFLAGS(%esp),%eax # mix EFLAGS and CS movb CS(%esp),%al testl $(VM_MASK | 3),%eax # return to VM86 mode or non-supervisor? - jne ret_with_reschedule + jne ret_from_sys_call jmp restore_all - ALIGN -handle_softirq: - call SYMBOL_NAME(do_softirq) - jmp ret_from_intr - ALIGN reschedule: call SYMBOL_NAME(schedule) # test diff -u --recursive --new-file v2.4.5/linux/arch/i386/kernel/io_apic.c linux/arch/i386/kernel/io_apic.c --- v2.4.5/linux/arch/i386/kernel/io_apic.c Fri Feb 9 11:28:31 2001 +++ linux/arch/i386/kernel/io_apic.c Thu Jun 7 00:12:45 2001 @@ -255,10 +255,16 @@ */ static int pin_2_irq(int idx, int apic, int pin); -int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pci_pin) +int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin) { int apic, i, best_guess = -1; + Dprintk("querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n", + bus, slot, pin); + if (mp_bus_id_to_pci_bus[bus] == -1) { + printk(KERN_WARNING "PCI BIOS passed nonexistent PCI bus %d!\n", bus); + return -1; + } for (i = 0; i < mp_irq_entries; i++) { int lbus = mp_irqs[i].mpc_srcbus; @@ -269,14 +275,14 @@ if ((mp_bus_id_to_type[lbus] == MP_BUS_PCI) && !mp_irqs[i].mpc_irqtype && - (bus == mp_bus_id_to_pci_bus[mp_irqs[i].mpc_srcbus]) && + (bus == lbus) && (slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) { int irq = pin_2_irq(i,apic,mp_irqs[i].mpc_dstirq); if (!(apic || IO_APIC_IRQ(irq))) continue; - if (pci_pin == (mp_irqs[i].mpc_srcbusirq & 3)) + if (pin == (mp_irqs[i].mpc_srcbusirq & 3)) return irq; /* * Use the first all-but-pin matching entry as a @@ -728,9 +734,11 @@ printk(KERN_DEBUG ".... register #01: %08X\n", *(int *)®_01); printk(KERN_DEBUG "....... : max redirection entries: %04X\n", reg_01.entries); if ( (reg_01.entries != 0x0f) && /* older (Neptune) boards */ + (reg_01.entries != 0x11) && (reg_01.entries != 0x17) && /* typical ISA+PCI boards */ (reg_01.entries != 0x1b) && /* Compaq Proliant boards */ (reg_01.entries != 0x1f) && /* dual Xeon boards */ + (reg_01.entries != 0x20) && (reg_01.entries != 0x22) && /* bigger Xeon boards */ (reg_01.entries != 0x2E) && (reg_01.entries != 0x3F) @@ -1426,7 +1434,7 @@ pin1 = find_isa_irq_pin(0, mp_INT); pin2 = find_isa_irq_pin(0, mp_ExtINT); - printk(KERN_INFO "..TIMER: vector=%d pin1=%d pin2=%d\n", vector, pin1, pin2); + printk(KERN_INFO "..TIMER: vector=%02X pin1=%d pin2=%d\n", vector, pin1, pin2); if (pin1 != -1) { /* diff -u --recursive --new-file v2.4.5/linux/arch/i386/kernel/irq.c linux/arch/i386/kernel/irq.c --- v2.4.5/linux/arch/i386/kernel/irq.c Fri Feb 9 11:29:44 2001 +++ linux/arch/i386/kernel/irq.c Mon Jun 4 15:57:49 2001 @@ -623,7 +623,7 @@ desc->handler->end(irq); spin_unlock(&desc->lock); - if (softirq_active(cpu) & softirq_mask(cpu)) + if (softirq_pending(cpu)) do_softirq(); return 1; } diff -u --recursive --new-file v2.4.5/linux/arch/i386/kernel/mpparse.c linux/arch/i386/kernel/mpparse.c --- v2.4.5/linux/arch/i386/kernel/mpparse.c Tue Nov 14 21:25:34 2000 +++ linux/arch/i386/kernel/mpparse.c Mon Jun 4 15:57:21 2001 @@ -36,7 +36,7 @@ */ int apic_version [MAX_APICS]; int mp_bus_id_to_type [MAX_MP_BUSSES]; -int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { -1, }; +int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; int mp_current_pci_id; int pic_mode; unsigned long mp_lapic_addr; diff -u --recursive --new-file v2.4.5/linux/arch/i386/kernel/pci-irq.c linux/arch/i386/kernel/pci-irq.c --- v2.4.5/linux/arch/i386/kernel/pci-irq.c Fri May 25 18:28:53 2001 +++ linux/arch/i386/kernel/pci-irq.c Mon Jun 4 15:57:21 2001 @@ -656,10 +656,12 @@ if (pin) { pin--; /* interrupt pins are numbered starting from 1 */ irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin); -/* - * Will be removed completely if things work out well with fuzzy parsing - */ -#if 0 + /* + * Busses behind bridges are typically not listed in the MP-table. + * In this case we have to look up the IRQ based on the parent bus, + * parent slot, and pin number. The SMP code detects such bridged + * busses itself so we should get into this branch reliably. + */ if (irq < 0 && dev->bus->parent) { /* go back to the bridge */ struct pci_dev * bridge = dev->bus->self; @@ -670,7 +672,6 @@ printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n", bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq); } -#endif if (irq >= 0) { printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n", dev->bus->number, PCI_SLOT(dev->devfn), pin, irq); diff -u --recursive --new-file v2.4.5/linux/arch/m68k/Makefile linux/arch/m68k/Makefile --- v2.4.5/linux/arch/m68k/Makefile Thu Jan 4 13:00:55 2001 +++ linux/arch/m68k/Makefile Tue Jun 5 18:27:19 2001 @@ -110,8 +110,8 @@ endif ifdef CONFIG_SUN3X -CORE_FILES := $(CORE_FILES) arch/m68k/sun3x/sun3x.o -SUBDIRS := $(SUBDIRS) arch/m68k/sun3x +CORE_FILES := $(CORE_FILES) arch/m68k/sun3x/sun3x.o arch/m68k/sun3/sun3.o +SUBDIRS := $(SUBDIRS) arch/m68k/sun3x arch/m68k/sun3 endif ifdef CONFIG_SUN3 diff -u --recursive --new-file v2.4.5/linux/arch/m68k/amiga/amisound.c linux/arch/m68k/amiga/amisound.c --- v2.4.5/linux/arch/m68k/amiga/amisound.c Thu Jan 4 13:00:55 2001 +++ linux/arch/m68k/amiga/amisound.c Tue Jun 5 18:27:19 2001 @@ -16,7 +16,7 @@ #include #include -static u_short *snd_data = NULL; +static unsigned short *snd_data = NULL; static const signed char sine_data[] = { 0, 39, 75, 103, 121, 127, 121, 103, 75, 39, 0, -39, -75, -103, -121, -127, -121, -103, -75, -39 @@ -28,7 +28,7 @@ * device since it depends on htotal (for OCS/ECS/AGA) */ -volatile u_short amiga_audio_min_period = 124; /* Default for pre-OCS */ +volatile unsigned short amiga_audio_min_period = 124; /* Default for pre-OCS */ #define MAX_PERIOD (65535) @@ -37,9 +37,9 @@ * Current period (set by dmasound.c) */ -u_short amiga_audio_period = MAX_PERIOD; +unsigned short amiga_audio_period = MAX_PERIOD; -static u_long clock_constant; +static unsigned long clock_constant; void __init amiga_init_sound(void) { @@ -76,7 +76,7 @@ del_timer( &sound_timer ); if (hz > 20 && hz < 32767) { - u_long period = (clock_constant / hz); + unsigned long period = (clock_constant / hz); if (period < amiga_audio_min_period) period = amiga_audio_min_period; @@ -86,7 +86,7 @@ /* setup pointer to data, period, length and volume */ custom.aud[2].audlc = snd_data; custom.aud[2].audlen = sizeof(sine_data)/2; - custom.aud[2].audper = (u_short)period; + custom.aud[2].audper = (unsigned short)period; custom.aud[2].audvol = 32; /* 50% of maxvol */ if (ticks) { diff -u --recursive --new-file v2.4.5/linux/arch/m68k/amiga/cia.c linux/arch/m68k/amiga/cia.c --- v2.4.5/linux/arch/m68k/amiga/cia.c Mon Nov 27 17:57:34 2000 +++ linux/arch/m68k/amiga/cia.c Tue Jun 5 18:27:20 2001 @@ -23,8 +23,8 @@ struct ciabase { volatile struct CIA *cia; - u_char icr_mask, icr_data; - u_short int_mask; + unsigned char icr_mask, icr_data; + unsigned short int_mask; int handler_irq, cia_irq, server_irq; char *name; irq_handler_t irq_list[CIA_IRQS]; @@ -46,7 +46,7 @@ unsigned char cia_set_irq(struct ciabase *base, unsigned char mask) { - u_char old; + unsigned char old; old = (base->icr_data |= base->cia->icr); if (mask & CIA_ICR_SETCLR) @@ -65,7 +65,7 @@ unsigned char cia_able_irq(struct ciabase *base, unsigned char mask) { - u_char old, tmp; + unsigned char old, tmp; int i; old = base->icr_mask; @@ -91,7 +91,7 @@ void (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id) { - u_char mask; + unsigned char mask; base->irq_list[irq].handler = handler; base->irq_list[irq].flags = flags; diff -u --recursive --new-file v2.4.5/linux/arch/m68k/amiga/config.c linux/arch/m68k/amiga/config.c --- v2.4.5/linux/arch/m68k/amiga/config.c Fri Apr 13 20:26:07 2001 +++ linux/arch/m68k/amiga/config.c Tue Jun 5 18:27:20 2001 @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -31,6 +30,7 @@ #include #include #include +#include #include #include #include diff -u --recursive --new-file v2.4.5/linux/arch/m68k/amiga/pcmcia.c linux/arch/m68k/amiga/pcmcia.c --- v2.4.5/linux/arch/m68k/amiga/pcmcia.c Thu Dec 17 09:06:25 1998 +++ linux/arch/m68k/amiga/pcmcia.c Tue Jun 5 18:27:20 2001 @@ -19,7 +19,7 @@ #include /* gayle config byte for program voltage and access speed */ -static u_char cfg_byte = GAYLE_CFG_0V|GAYLE_CFG_150NS; +static unsigned char cfg_byte = GAYLE_CFG_0V|GAYLE_CFG_150NS; void pcmcia_reset(void) { @@ -64,7 +64,7 @@ void pcmcia_program_voltage(int voltage) { - u_char v; + unsigned char v; switch (voltage) { case PCMCIA_0V: @@ -87,7 +87,7 @@ void pcmcia_access_speed(int speed) { - u_char s; + unsigned char s; if (speed <= PCMCIA_SPEED_100NS) s = GAYLE_CFG_100NS; diff -u --recursive --new-file v2.4.5/linux/arch/m68k/apollo/config.c linux/arch/m68k/apollo/config.c --- v2.4.5/linux/arch/m68k/apollo/config.c Wed Jan 26 12:44:20 2000 +++ linux/arch/m68k/apollo/config.c Tue Jun 5 18:27:20 2001 @@ -2,7 +2,6 @@ #include #include #include -#include #include #include @@ -12,6 +11,7 @@ #include #include #include +#include #include u_long sio01_physaddr; diff -u --recursive --new-file v2.4.5/linux/arch/m68k/atari/time.c linux/arch/m68k/atari/time.c --- v2.4.5/linux/arch/m68k/atari/time.c Thu Aug 26 12:42:31 1999 +++ linux/arch/m68k/atari/time.c Tue Jun 5 18:27:20 2001 @@ -12,10 +12,10 @@ #include #include -#include #include #include +#include void __init atari_sched_init(void (*timer_routine)(int, void *, struct pt_regs *)) diff -u --recursive --new-file v2.4.5/linux/arch/m68k/bvme6000/config.c linux/arch/m68k/bvme6000/config.c --- v2.4.5/linux/arch/m68k/bvme6000/config.c Mon Jan 31 10:32:53 2000 +++ linux/arch/m68k/bvme6000/config.c Tue Jun 5 18:27:20 2001 @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -30,6 +29,7 @@ #include #include #include +#include #include #include diff -u --recursive --new-file v2.4.5/linux/arch/m68k/bvme6000/rtc.c linux/arch/m68k/bvme6000/rtc.c --- v2.4.5/linux/arch/m68k/bvme6000/rtc.c Fri Feb 9 11:29:44 2001 +++ linux/arch/m68k/bvme6000/rtc.c Tue Jun 5 18:27:20 2001 @@ -76,7 +76,7 @@ unsigned char mon, day, hrs, min, sec, leap_yr; unsigned int yrs; - if (!suser()) + if (!capable(CAP_SYS_ADMIN)) return -EACCES; if (copy_from_user(&rtc_tm, (struct rtc_time*)arg, diff -u --recursive --new-file v2.4.5/linux/arch/m68k/config.in linux/arch/m68k/config.in --- v2.4.5/linux/arch/m68k/config.in Fri May 25 18:28:53 2001 +++ linux/arch/m68k/config.in Tue Jun 5 18:27:20 2001 @@ -55,8 +55,8 @@ if [ "$CONFIG_HP300" = "y" ]; then bool ' DIO bus support' CONFIG_DIO fi -bool 'Sun3 support' CONFIG_SUN3 bool 'Sun3x support' CONFIG_SUN3X +bool 'Sun3 support' CONFIG_SUN3 bool 'Q40/Q60 support' CONFIG_Q40 @@ -112,7 +112,7 @@ bool 'Support for ST-RAM as swap space' CONFIG_STRAM_SWAP bool 'ST-RAM statistics in /proc' CONFIG_STRAM_PROC fi -if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" ]; then +if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_ATARI" = "y" -o "$CONFIG_Q40" = "y" ]; then bool 'Use power LED as a heartbeat' CONFIG_HEARTBEAT else if [ "$CONFIG_HP300" = "y" ]; then @@ -142,13 +142,17 @@ fi dep_tristate ' Parallel printer support' CONFIG_PRINTER $CONFIG_PARPORT if [ "$CONFIG_PRINTER" != "n" ]; then - bool ' Support IEEE1284 status readback' CONFIG_PRINTER_READBACK + bool ' Support IEEE1284 status readback' CONFIG_PARPORT_1284 fi fi source drivers/pci/Config.in source drivers/zorro/Config.in +if [ "$CONFIG_Q40" = "y" ]; then +source drivers/pnp/Config.in +fi + endmenu source drivers/mtd/Config.in @@ -264,11 +268,11 @@ fi if [ "$CONFIG_SUN3" = "y" ]; then - dep_tristate 'Sun3 NCR5380 SCSI' CONFIG_SUN3_SCSI $CONFIG_SCSI + dep_tristate 'Sun3 NCR5380 OBIO SCSI' CONFIG_SUN3_SCSI $CONFIG_SCSI fi if [ "$CONFIG_SUN3X" = "y" ]; then - bool 'ESP SCSI driver' CONFIG_SUN3X_ESP + bool 'Sun3x ESP SCSI' CONFIG_SUN3X_ESP fi endmenu @@ -338,6 +342,9 @@ if [ "$CONFIG_SUN3" = "y" -o "$CONFIG_SUN3X" = "y" ]; then tristate ' Sun3/Sun3x on-board LANCE support' CONFIG_SUN3LANCE fi + if [ "$CONFIG_SUN3" = "y" ]; then + tristate ' Sun3 on-board Intel 82586 support' CONFIG_SUN3_82586 + fi if [ "$CONFIG_HP300" = "y" ]; then bool ' HP on-board LANCE support' CONFIG_HPLANCE fi @@ -367,7 +374,6 @@ if [ "$CONFIG_SERIAL_EXTENDED" = "y" ]; then bool ' Support more than 4 serial ports' CONFIG_SERIAL_MANY_PORTS bool ' Support for sharing serial interrupts' CONFIG_SERIAL_SHARE_IRQ -# bool ' Autodetect IRQ - do not yet enable !!' CONFIG_SERIAL_DETECT_IRQ bool ' Support special multiport boards' CONFIG_SERIAL_MULTIPORT bool ' Support the Bell Technologies HUB6 card' CONFIG_HUB6 fi @@ -451,16 +457,16 @@ else define_bool CONFIG_SUN3X_ZS n fi -dep_bool ' Sun keyboard support' CONFIG_SUN_KEYBOARD $CONFIG_SUN3X_ZS -dep_bool ' Sun mouse support' CONFIG_SUN_MOUSE $CONFIG_SUN3X_ZS -if [ "$CONFIG_SUN_MOUSE" = "y" ]; then - define_bool CONFIG_BUSMOUSE y -fi if [ "$CONFIG_SUN3X_ZS" = "y" ]; then + define_bool CONFIG_SUN_KEYBOARD y + define_bool CONFIG_SUN_MOUSE y + define_bool CONFIG_BUSMOUSE y define_bool CONFIG_SBUS y define_bool CONFIG_SBUSCHAR y define_bool CONFIG_SUN_SERIAL y else + define_bool CONFIG_SUN_KEYBOARD n + define_bool CONFIG_SUN_MOUSE n define_bool CONFIG_SBUS n fi @@ -508,9 +514,6 @@ else bool 'Generic /dev/rtc emulation' CONFIG_GEN_RTC fi -fi -if [ "$CONFIG_Q40" = "y" ]; then - bool 'Q40 Real Time Clock Support' CONFIG_Q40RTC fi bool 'Unix98 PTY support' CONFIG_UNIX98_PTYS if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then diff -u --recursive --new-file v2.4.5/linux/arch/m68k/kernel/head.S linux/arch/m68k/kernel/head.S --- v2.4.5/linux/arch/m68k/kernel/head.S Tue Mar 6 19:44:36 2001 +++ linux/arch/m68k/kernel/head.S Tue Jun 5 18:27:20 2001 @@ -1178,8 +1178,45 @@ #ifdef CONFIG_SUN3X is_not_sun3x(L(notsun3x)) + /* oh, the pain.. We're gonna want the prom code after + * starting the MMU, so we copy the mappings, translating + * from 8k -> 4k pages as we go. + */ + + /* copy maps from 0xfee00000 to 0xff000000 */ + movel #0xfee00000, %d0 + moveq #ROOT_INDEX_SHIFT, %d1 + lsrl %d1,%d0 + mmu_get_root_table_entry %d0 + + movel #0xfee00000, %d0 + moveq #PTR_INDEX_SHIFT, %d1 + lsrl %d1,%d0 + andl #PTR_TABLE_SIZE-1, %d0 + mmu_get_ptr_table_entry %a0,%d0 + + movel #0xfee00000, %d0 + moveq #PAGE_INDEX_SHIFT, %d1 + lsrl %d1,%d0 + andl #PAGE_TABLE_SIZE-1, %d0 + mmu_get_page_table_entry %a0,%d0 + + /* this is where the prom page table lives */ + movel 0xfefe00d4, %a1 + movel %a1@, %a1 + + movel #((0x200000 >> 13)-1), %d1 + +1: + movel %a1@+, %d3 + movel %d3,%a0@+ + addl #0x1000,%d3 + movel %d3,%a0@+ + + dbra %d1,1b + /* setup tt1 for I/O */ - mmu_map_tt #1,#0x40000000,#0x40000000,#_PAGE_NOCACHE_S + mmu_map_tt #1,#0x40000000,#0x40000000,#_PAGE_NOCACHE_S jbra L(mmu_init_done) L(notsun3x): @@ -1363,7 +1400,7 @@ is_not_sun3x(1f) /* enable copro */ - oriw #0x4000,0x61000000 + oriw #0x4000,0x61000000 1: #endif @@ -3061,6 +3098,16 @@ 2: #endif +#ifdef CONFIG_SUN3X + is_not_sun3x(2f) + movel %d0,-(%sp) + movel 0xFEFE0018,%a1 + jbsr (%a1) + addq #4,%sp + jbra L(serial_putc_done) +2: +#endif + #ifdef CONFIG_Q40 is_not_q40(2f) tst.l %pc@(L(q40_do_debug)) /* only debug if requested */ diff -u --recursive --new-file v2.4.5/linux/arch/m68k/kernel/ptrace.c linux/arch/m68k/kernel/ptrace.c --- v2.4.5/linux/arch/m68k/kernel/ptrace.c Mon Nov 27 18:02:06 2000 +++ linux/arch/m68k/kernel/ptrace.c Tue Jun 5 18:27:20 2001 @@ -107,15 +107,19 @@ ret = -ESRCH; read_lock(&tasklist_lock); child = find_task_by_pid(pid); - read_unlock(&tasklist_lock); /* FIXME!!! */ + if (child) + get_task_struct(child); + read_unlock(&tasklist_lock); if (!child) goto out; + ret = -EPERM; if (pid == 1) /* you may not mess with init */ - goto out; + goto out_tsk; + if (request == PTRACE_ATTACH) { if (child == current) - goto out; + goto out_tsk; if ((!child->dumpable || (current->uid != child->euid) || (current->uid != child->suid) || @@ -124,10 +128,10 @@ (current->gid != child->sgid) || (!cap_issubset(child->cap_permitted, current->cap_permitted)) || (current->gid != child->gid)) && !capable(CAP_SYS_PTRACE)) - goto out; + goto out_tsk; /* the same process cannot be attached many times */ if (child->ptrace & PT_PTRACED) - goto out; + goto out_tsk; child->ptrace |= PT_PTRACED; write_lock_irqsave(&tasklist_lock, flags); @@ -140,17 +144,17 @@ send_sig(SIGSTOP, child, 1); ret = 0; - goto out; + goto out_tsk; } ret = -ESRCH; if (!(child->ptrace & PT_PTRACED)) - goto out; + goto out_tsk; if (child->state != TASK_STOPPED) { if (request != PTRACE_KILL) - goto out; + goto out_tsk; } if (child->p_pptr != current) - goto out; + goto out_tsk; switch (request) { /* when I and D space are separate, these will need to be fixed. */ @@ -162,9 +166,9 @@ copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); ret = -EIO; if (copied != sizeof(tmp)) - goto out; + break; ret = put_user(tmp,(unsigned long *) data); - goto out; + break; } /* read the word at location addr in the USER area. */ @@ -172,8 +176,9 @@ unsigned long tmp; ret = -EIO; - if ((addr & 3) || addr < 0 || addr >= sizeof(struct user)) - goto out; + if ((addr & 3) || addr < 0 || + addr > sizeof(struct user) - 3) + break; tmp = 0; /* Default return condition */ addr = addr >> 2; /* temporary hack. */ @@ -193,9 +198,9 @@ ((tmp & 0x0000ffff) << 16); #endif } else - goto out; + break; ret = put_user(tmp,(unsigned long *) data); - goto out; + break; } /* when I and D space are separate, this will have to be fixed. */ @@ -203,14 +208,15 @@ case PTRACE_POKEDATA: ret = 0; if (access_process_vm(child, addr, &data, sizeof(data), 1) == sizeof(data)) - goto out; + break; ret = -EIO; - goto out; + break; case PTRACE_POKEUSR: /* write the word at location addr in the USER area */ ret = -EIO; - if ((addr & 3) || addr < 0 || addr >= sizeof(struct user)) - goto out; + if ((addr & 3) || addr < 0 || + addr > sizeof(struct user) - 3) + break; addr = addr >> 2; /* temporary hack. */ @@ -221,9 +227,9 @@ } if (addr < 19) { if (put_reg(child, addr, data)) - goto out; + break; ret = 0; - goto out; + break; } if (addr >= 21 && addr < 48) { @@ -240,7 +246,7 @@ child->thread.fp[addr - 21] = data; ret = 0; } - goto out; + break; case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */ case PTRACE_CONT: { /* restart after signal. */ @@ -248,7 +254,7 @@ ret = -EIO; if ((unsigned long) data > _NSIG) - goto out; + break; if (request == PTRACE_SYSCALL) child->ptrace |= PT_TRACESYS; else @@ -259,7 +265,7 @@ put_reg(child, PT_SR, tmp); wake_up_process(child); ret = 0; - goto out; + break; } /* @@ -272,13 +278,13 @@ ret = 0; if (child->state == TASK_ZOMBIE) /* already dead */ - goto out; + break; child->exit_code = SIGKILL; /* make sure the single step bit is not set. */ tmp = get_reg(child, PT_SR) & ~(TRACE_BITS << 16); put_reg(child, PT_SR, tmp); wake_up_process(child); - goto out; + break; } case PTRACE_SINGLESTEP: { /* set the trap flag. */ @@ -286,7 +292,7 @@ ret = -EIO; if ((unsigned long) data > _NSIG) - goto out; + break; child->ptrace &= ~PT_TRACESYS; tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16); put_reg(child, PT_SR, tmp); @@ -295,7 +301,7 @@ /* give it a chance to run. */ wake_up_process(child); ret = 0; - goto out; + break; } case PTRACE_DETACH: { /* detach a process that was attached. */ @@ -303,7 +309,7 @@ ret = -EIO; if ((unsigned long) data > _NSIG) - goto out; + break; child->ptrace &= ~(PT_PTRACED|PT_TRACESYS); child->exit_code = data; write_lock_irqsave(&tasklist_lock, flags); @@ -316,7 +322,7 @@ put_reg(child, PT_SR, tmp); wake_up_process(child); ret = 0; - goto out; + break; } case PTRACE_GETREGS: { /* Get all gp regs from the child. */ @@ -328,12 +334,12 @@ tmp >>= 16; if (put_user(tmp, (unsigned long *) data)) { ret = -EFAULT; - goto out; + break; } data += sizeof(long); } ret = 0; - goto out; + break; } case PTRACE_SETREGS: { /* Set all gp regs in the child. */ @@ -342,7 +348,7 @@ for (i = 0; i < 19; i++) { if (get_user(tmp, (unsigned long *) data)) { ret = -EFAULT; - goto out; + break; } if (i == PT_SR) { tmp &= SR_MASK; @@ -353,7 +359,7 @@ data += sizeof(long); } ret = 0; - goto out; + break; } case PTRACE_GETFPREGS: { /* Get the child FPU state. */ @@ -361,7 +367,7 @@ if (copy_to_user((void *)data, &child->thread.fp, sizeof(struct user_m68kfp_struct))) ret = -EFAULT; - goto out; + break; } case PTRACE_SETFPREGS: { /* Set the child FPU state. */ @@ -369,13 +375,15 @@ if (copy_from_user(&child->thread.fp, (void *)data, sizeof(struct user_m68kfp_struct))) ret = -EFAULT; - goto out; + break; } default: ret = -EIO; - goto out; + break; } +out_tsk: + free_task_struct(child); out: unlock_kernel(); return ret; @@ -383,10 +391,9 @@ asmlinkage void syscall_trace(void) { - lock_kernel(); if ((current->ptrace & (PT_PTRACED|PT_TRACESYS)) != (PT_PTRACED|PT_TRACESYS)) - goto out; + return; current->exit_code = SIGTRAP; current->state = TASK_STOPPED; notify_parent(current, SIGCHLD); @@ -400,6 +407,4 @@ send_sig(current->exit_code, current, 1); current->exit_code = 0; } -out: - unlock_kernel(); } diff -u --recursive --new-file v2.4.5/linux/arch/m68k/kernel/setup.c linux/arch/m68k/kernel/setup.c --- v2.4.5/linux/arch/m68k/kernel/setup.c Fri Apr 13 20:26:07 2001 +++ linux/arch/m68k/kernel/setup.c Tue Jun 5 18:27:20 2001 @@ -34,6 +34,10 @@ #ifdef CONFIG_ATARI #include #endif +#ifdef CONFIG_SUN3X +#include +extern void sun_serial_setup(void); +#endif #ifdef CONFIG_BLK_DEV_INITRD #include @@ -106,6 +110,11 @@ char *mach_sysrq_xlate = NULL; #endif +#if defined(CONFIG_ISA) +int isa_type; +int isa_sex; +#endif + extern int amiga_parse_bootinfo(const struct bi_record *); extern int atari_parse_bootinfo(const struct bi_record *); extern int mac_parse_bootinfo(const struct bi_record *); @@ -137,7 +146,7 @@ { while (record->tag != BI_LAST) { int unknown = 0; - const u_long *data = record->data; + const unsigned long *data = record->data; switch (record->tag) { case BI_MACHTYPE: case BI_CPUTYPE: @@ -186,7 +195,7 @@ if (unknown) printk("m68k_parse_bootinfo: unknown tag 0x%04x ignored\n", record->tag); - record = (struct bi_record *)((u_long)record+record->size); + record = (struct bi_record *)((unsigned long)record+record->size); } m68k_realnum_memory = m68k_num_memory; @@ -365,14 +374,44 @@ if (MACH_IS_ATARI) atari_stram_reserve_pages(availmem); #endif +#ifdef CONFIG_SUN3X + if (MACH_IS_SUN3X) { + dvma_init(); +#ifdef CONFIG_SUN3X_ZS + sun_serial_setup(); +#endif + } +#endif + #endif /* !CONFIG_SUN3 */ + paging_init(); + +/* set ISA defs early as possible */ +#if defined(CONFIG_ISA) +#if defined(CONFIG_Q40) + if (MACH_IS_Q40) { + isa_type = Q40_ISA; + isa_sex = 0; + } +#elif defined(CONFIG_GG2) + if (MACH_IS_AMIGA && AMIGAHW_PRESENT(GG2_ISA)){ + isa_type = GG2_ISA; + isa_sex = 0; + } +#elif defined(CONFIG_AMIGA_PCMCIA) + if (MACH_IS_AMIGA && AMIGAHW_PRESENT(PCMCIA)){ + isa_type = AG_ISA; + isa_sex = 1; + } +#endif +#endif } int get_cpuinfo(char * buffer) { const char *cpu, *mmu, *fpu; - u_long clockfreq, clockfactor; + unsigned long clockfreq, clockfactor; #define LOOP_CYCLES_68020 (8) #define LOOP_CYCLES_68030 (8) @@ -447,7 +486,7 @@ { int len = 0; char model[80]; - u_long mem; + unsigned long mem; int i; if (mach_get_model) diff -u --recursive --new-file v2.4.5/linux/arch/m68k/kernel/sys_m68k.c linux/arch/m68k/kernel/sys_m68k.c --- v2.4.5/linux/arch/m68k/kernel/sys_m68k.c Mon Mar 19 12:35:09 2001 +++ linux/arch/m68k/kernel/sys_m68k.c Tue Jun 5 18:27:20 2001 @@ -267,7 +267,8 @@ return -ENOSYS; } -/* Convert virtual address VADDR to physical address PADDR */ + +/* Convert virtual (user) address VADDR to physical address PADDR */ #define virt_to_phys_040(vaddr) \ ({ \ unsigned long _mmusr, _paddr; \ @@ -447,6 +448,12 @@ { unsigned long paddr, i; + /* + * 68060 manual says: + * cpush %dc : flush DC, remains valid (with our %cacr setup) + * cpush %ic : invalidate IC + * cpush %bc : flush DC + invalidate IC + */ switch (scope) { case FLUSH_SCOPE_ALL: @@ -455,20 +462,17 @@ case FLUSH_CACHE_DATA: __asm__ __volatile__ (".chip 68060\n\t" "cpusha %dc\n\t" - "cinva %dc\n\t" ".chip 68k"); break; case FLUSH_CACHE_INSN: __asm__ __volatile__ (".chip 68060\n\t" "cpusha %ic\n\t" - "cinva %ic\n\t" ".chip 68k"); break; default: case FLUSH_CACHE_BOTH: __asm__ __volatile__ (".chip 68060\n\t" "cpusha %bc\n\t" - "cinva %bc\n\t" ".chip 68k"); break; } @@ -506,14 +510,12 @@ case FLUSH_CACHE_DATA: __asm__ __volatile__ (".chip 68060\n\t" "cpushl %%dc,(%0)\n\t" - "cinvl %%dc,(%0)\n\t" ".chip 68k" : : "a" (paddr)); break; case FLUSH_CACHE_INSN: __asm__ __volatile__ (".chip 68060\n\t" "cpushl %%ic,(%0)\n\t" - "cinvl %%ic,(%0)\n\t" ".chip 68k" : : "a" (paddr)); break; @@ -521,7 +523,6 @@ case FLUSH_CACHE_BOTH: __asm__ __volatile__ (".chip 68060\n\t" "cpushl %%bc,(%0)\n\t" - "cinvl %%bc,(%0)\n\t" ".chip 68k" : : "a" (paddr)); break; @@ -568,14 +569,12 @@ case FLUSH_CACHE_DATA: __asm__ __volatile__ (".chip 68060\n\t" "cpushp %%dc,(%0)\n\t" - "cinvp %%dc,(%0)\n\t" ".chip 68k" : : "a" (paddr)); break; case FLUSH_CACHE_INSN: __asm__ __volatile__ (".chip 68060\n\t" "cpushp %%ic,(%0)\n\t" - "cinvp %%ic,(%0)\n\t" ".chip 68k" : : "a" (paddr)); break; @@ -583,7 +582,6 @@ case FLUSH_CACHE_BOTH: __asm__ __volatile__ (".chip 68060\n\t" "cpushp %%bc,(%0)\n\t" - "cinvp %%bc,(%0)\n\t" ".chip 68k" : : "a" (paddr)); break; @@ -607,13 +605,14 @@ goto out; if (scope == FLUSH_SCOPE_ALL) { - /* Only the superuser may flush the whole cache. */ + /* Only the superuser may explicitly flush the whole cache. */ ret = -EPERM; if (!capable(CAP_SYS_ADMIN)) goto out; } else { - /* Verify that the specified address region actually belongs to - * this process. + /* + * Verify that the specified address region actually belongs + * to this process. */ vma = find_vma (current->mm, addr); ret = -EINVAL; @@ -652,10 +651,21 @@ } ret = 0; goto out; - } else if (CPU_IS_040) { + } else { + /* + * 040 or 060: don't blindly trust 'scope', someone could + * try to flush a few megs of memory. + */ + + if (len>=3*PAGE_SIZE && scope=10*PAGE_SIZE && scopeun.fmt7.faddr = current->thread.faddr; + fp->un.fmt7.faddr = wba; fp->un.fmt7.ssw = wbs & 0xff; + if (wba != current->thread.faddr) + fp->un.fmt7.ssw |= MA_040; } static inline void do_040writebacks(struct frame *fp) @@ -312,7 +331,7 @@ res = do_040writeback1(fp->un.fmt7.wb2s, fp->un.fmt7.wb2a, fp->un.fmt7.wb2d); if (res) - fix_xframe040(fp, fp->un.fmt7.wb2s); + fix_xframe040(fp, fp->un.fmt7.wb2a, fp->un.fmt7.wb2s); else fp->un.fmt7.wb2s = 0; } @@ -322,7 +341,14 @@ res = do_040writeback1(fp->un.fmt7.wb3s, fp->un.fmt7.wb3a, fp->un.fmt7.wb3d); if (res) - fix_xframe040(fp, fp->un.fmt7.wb3s); + { + fix_xframe040(fp, fp->un.fmt7.wb3a, fp->un.fmt7.wb3s); + + fp->un.fmt7.wb2s = fp->un.fmt7.wb3s; + fp->un.fmt7.wb3s &= (~WBV_040); + fp->un.fmt7.wb2a = fp->un.fmt7.wb3a; + fp->un.fmt7.wb2d = fp->un.fmt7.wb3d; + } else fp->un.fmt7.wb3s = 0; } @@ -339,19 +365,15 @@ */ asmlinkage void berr_040cleanup(struct frame *fp) { - mm_segment_t old_fs = get_fs(); - fp->un.fmt7.wb2s &= ~4; fp->un.fmt7.wb3s &= ~4; do_040writebacks(fp); - set_fs(old_fs); } static inline void access_error040(struct frame *fp) { unsigned short ssw = fp->un.fmt7.ssw; - mm_segment_t old_fs = get_fs(); unsigned long mmusr; #ifdef DEBUG @@ -374,9 +396,8 @@ if (ssw & MA_040) addr = (addr + 7) & -8; - set_fs(MAKE_MM_SEG(ssw)); /* MMU error, get the MMUSR info for this access */ - mmusr = probe040(!(ssw & RW_040), addr); + mmusr = probe040(!(ssw & RW_040), addr, ssw); #ifdef DEBUG printk("mmusr = %lx\n", mmusr); #endif @@ -386,8 +407,12 @@ __flush_tlb040_one(addr); errorcode = 0; } - if (!(ssw & RW_040)) + + /* despite what documentation seems to say, RMW + * accesses have always both the LK and RW bits set */ + if (!(ssw & RW_040) || (ssw & LK_040)) errorcode |= 2; + if (do_page_fault(&fp->ptregs, addr, errorcode)) { #ifdef DEBUG printk("do_page_fault() !=0 \n"); @@ -415,7 +440,6 @@ } do_040writebacks(fp); - set_fs(old_fs); } #endif /* CONFIG_M68040 */ diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mac/config.c linux/arch/m68k/mac/config.c --- v2.4.5/linux/arch/m68k/mac/config.c Sun Dec 3 17:48:19 2000 +++ linux/arch/m68k/mac/config.c Tue Jun 5 18:27:20 2001 @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -31,6 +30,7 @@ #include #include #include +#include #include #include @@ -78,8 +78,6 @@ extern void (*kd_mksound)(unsigned int, unsigned int); extern void mac_mksound(unsigned int, unsigned int); -extern int mac_floppy_init(void); -extern void mac_floppy_setup(char *,int *); extern void nubus_sweep_video(void); @@ -122,8 +120,6 @@ } #endif -extern struct fb_info *mac_fb_init(long *); - extern void mac_default_handler(int, void *, struct pt_regs *); void (*mac_handlers[8])(int, void *, struct pt_regs *)= @@ -387,8 +383,7 @@ { MAC_MODEL_P460, "Performa 460", MAC_ADB_IISI, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS}, { MAC_MODEL_P475, "Performa 475", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS}, { MAC_MODEL_P475F, "Performa 475", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS}, - { MAC_MODEL_P520, "Performa 520", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS}, - + { MAC_MODEL_P520, "Performa 520", MAC_ADB_CUDA, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS}, { MAC_MODEL_P550, "Performa 550", MAC_ADB_CUDA, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS}, { MAC_MODEL_P575, "Performa 575", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS}, /* These have the comm slot, and therefore the possibility of SONIC ethernet */ diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mac/debug.c linux/arch/m68k/mac/debug.c --- v2.4.5/linux/arch/m68k/mac/debug.c Thu Oct 12 14:20:48 2000 +++ linux/arch/m68k/mac/debug.c Tue Jun 5 18:27:20 2001 @@ -187,7 +187,7 @@ -/* Mac: loops_per_sec min. 1900000 ^= .5 us; MFPDELAY was 0.6 us*/ +/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/ #define uSEC 1 @@ -286,9 +286,9 @@ barrier(); \ } while(0) -/* loops_per_sec isn't initialized yet, so we can't use udelay(). This does a +/* loops_per_jiffy isn't initialized yet, so we can't use udelay(). This does a * delay of ~ 60us. */ -/* Mac: loops_per_sec min. 1900000 ^= .5 us; MFPDELAY was 0.6 us*/ +/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/ #define LONG_DELAY() \ do { \ int i; \ diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mac/iop.c linux/arch/m68k/mac/iop.c --- v2.4.5/linux/arch/m68k/mac/iop.c Sun Feb 13 11:21:42 2000 +++ linux/arch/m68k/mac/iop.c Tue Jun 5 18:27:20 2001 @@ -51,9 +51,6 @@ * IOP hasn't died. * o Some of the IOP manager routines need better error checking and * return codes. Nothing major, just prettying up. - * - * + share the stuff you were smoking when you wrote the iop_get_proc_info() - * for case when CONFIG_PROC_FS is undefined. */ /* @@ -129,9 +126,6 @@ #ifdef CONFIG_PROC_FS static int iop_get_proc_info(char *, char **, off_t, int); -#else -/* What the bloody hell is THAT ??? */ -static int iop_get_proc_info(char *, char **, off_t, int) {} #endif /* CONFIG_PROC_FS */ /* structure for tracking channel listeners */ @@ -307,7 +301,11 @@ iop_listeners[IOP_NUM_ISM][i].handler = NULL; } - create_proc_info_entry("mac_iop",0,0,iop_get_proc_info); +#if 0 /* Crashing in 2.4 now, not yet sure why. --jmt */ +#ifdef CONFIG_PROC_FS + create_proc_info_entry("mac_iop", 0, &proc_root, iop_get_proc_info); +#endif +#endif } /* diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mac/macints.c linux/arch/m68k/mac/macints.c --- v2.4.5/linux/arch/m68k/mac/macints.c Sun Dec 3 17:48:19 2000 +++ linux/arch/m68k/mac/macints.c Tue Jun 5 18:27:20 2001 @@ -129,9 +129,13 @@ #include #include #include +#include #include +#define DEBUG_SPURIOUS +#define SHUTUP_SONIC + /* * The mac_irq_list array is an array of linked lists of irq_node_t nodes. * Each node contains one handler to be called whenever the interrupt @@ -233,6 +237,17 @@ scc_mask = 0; + /* Make sure the SONIC interrupt is cleared or things get ugly */ +#ifdef SHUTUP_SONIC + printk("Killing onboard sonic... "); + /* This address should hopefully be mapped already */ + if (hwreg_present((void*)(0x50f0a000))) { + *(long *)(0x50f0a014) = 0x7fffL; + *(long *)(0x50f0a010) = 0L; + } + printk("Done.\n"); +#endif /* SHUTUP_SONIC */ + /* * Now register the handlers for the the master IRQ handlers * at levels 1-7. Most of the work is done elsewhere. @@ -627,9 +642,7 @@ void mac_default_handler(int irq, void *dev_id, struct pt_regs *regs) { #ifdef DEBUG_SPURIOUS - if (console_loglevel > 6) { - printk("Unexpected IRQ %d on device %p\n", irq, dev_id); - } + printk("Unexpected IRQ %d on device %p\n", irq, dev_id); #endif } diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mac/misc.c linux/arch/m68k/mac/misc.c --- v2.4.5/linux/arch/m68k/mac/misc.c Fri Feb 9 11:29:44 2001 +++ linux/arch/m68k/mac/misc.c Tue Jun 5 18:27:20 2001 @@ -2,7 +2,6 @@ * Miscellaneous Mac68K-specific stuff */ -#include #include #include #include @@ -12,7 +11,7 @@ #include #include #include -#include + #include #include @@ -21,6 +20,7 @@ #include #include +#include #include #include #include diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mac/psc.c linux/arch/m68k/mac/psc.c --- v2.4.5/linux/arch/m68k/mac/psc.c Sun Dec 3 17:48:19 2000 +++ linux/arch/m68k/mac/psc.c Tue Jun 5 18:27:20 2001 @@ -139,7 +139,6 @@ int irq_bit,i; unsigned char events; - irq -= VEC_SPUR; base_irq = irq << 3; #ifdef DEBUG_IRQS diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mac/via.c linux/arch/m68k/mac/via.c --- v2.4.5/linux/arch/m68k/mac/via.c Sun Dec 3 17:45:20 2000 +++ linux/arch/m68k/mac/via.c Tue Jun 5 18:27:20 2001 @@ -410,8 +410,6 @@ int irq_bit, i; unsigned char events, mask; - irq -= VEC_SPUR; - mask = via1[vIER] & 0x7F; if (!(events = via1[vIFR] & mask)) return; @@ -423,6 +421,7 @@ via1[vIER] = irq_bit | 0x80; } +#if 0 /* freakin' pmu is doing weird stuff */ if (!oss_present) { /* This (still) seems to be necessary to get IDE working. However, if you enable VBL interrupts, @@ -435,14 +434,13 @@ mac_do_irq_list(IRQ_MAC_NUBUS, regs); via_irq_enable(IRQ_MAC_NUBUS); } +#endif } void via2_irq(int irq, void *dev_id, struct pt_regs *regs) { int irq_bit, i; unsigned char events, mask; - - irq -= VEC_SPUR; mask = via2[gIER] & 0x7F; if (!(events = via2[gIFR] & mask)) return; diff -u --recursive --new-file v2.4.5/linux/arch/m68k/math-emu/multi_arith.h linux/arch/m68k/math-emu/multi_arith.h --- v2.4.5/linux/arch/m68k/math-emu/multi_arith.h Sun Aug 15 11:47:29 1999 +++ linux/arch/m68k/math-emu/multi_arith.h Tue Jun 5 18:27:20 2001 @@ -329,7 +329,7 @@ int carry; /* we assume here, gcc only insert move and a clr instr */ - asm volatile ("add.b %1,%0" : "=d,=g" (dest->lowmant) + asm volatile ("add.b %1,%0" : "=d,g" (dest->lowmant) : "g,d" (src->lowmant), "0,0" (dest->lowmant)); asm volatile ("addx.l %1,%0" : "=d" (dest->mant.m32[1]) : "d" (src->mant.m32[1]), "0" (dest->mant.m32[1])); @@ -360,7 +360,7 @@ extern inline void fp_submant(struct fp_ext *dest, struct fp_ext *src1, struct fp_ext *src2) { /* we assume here, gcc only insert move and a clr instr */ - asm volatile ("sub.b %1,%0" : "=d,=g" (dest->lowmant) + asm volatile ("sub.b %1,%0" : "=d,g" (dest->lowmant) : "g,d" (src2->lowmant), "0,0" (src1->lowmant)); asm volatile ("subx.l %1,%0" : "=d" (dest->mant.m32[1]) : "d" (src2->mant.m32[1]), "0" (src1->mant.m32[1])); @@ -383,7 +383,7 @@ }) #define fp_addx96(dest, src) ({ \ /* we assume here, gcc only insert move and a clr instr */ \ - asm volatile ("add.l %1,%0" : "=d,=g" (dest->m32[2]) \ + asm volatile ("add.l %1,%0" : "=d,g" (dest->m32[2]) \ : "g,d" (temp.m32[1]), "0,0" (dest->m32[2])); \ asm volatile ("addx.l %1,%0" : "=d" (dest->m32[1]) \ : "d" (temp.m32[0]), "0" (dest->m32[1])); \ diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mm/init.c linux/arch/m68k/mm/init.c --- v2.4.5/linux/arch/m68k/mm/init.c Mon Oct 16 12:58:51 2000 +++ linux/arch/m68k/mm/init.c Tue Jun 5 18:27:20 2001 @@ -32,11 +32,7 @@ #include #endif -static unsigned long totalram_pages; - -#ifdef CONFIG_SUN3 -void mmu_emu_reserve_pages(unsigned long max_page); -#endif +unsigned long totalram_pages = 0; int do_check_pgt_cache(int low, int high) { @@ -86,7 +82,7 @@ void show_mem(void) { unsigned long i; - int free = 0, total = 0, reserved = 0, nonshared = 0, shared = 0; + int free = 0, total = 0, reserved = 0, shared = 0; int cached = 0; printk("\nMem-info:\n"); @@ -101,15 +97,12 @@ cached++; else if (!page_count(mem_map+i)) free++; - else if (page_count(mem_map+i) == 1) - nonshared++; else shared += page_count(mem_map+i) - 1; } printk("%d pages of RAM\n",total); printk("%d free pages\n",free); printk("%d reserved pages\n",reserved); - printk("%d pages nonshared\n",nonshared); printk("%d pages shared\n",shared); printk("%d pages swap cached\n",cached); printk("%ld pages in page table cache\n",pgtable_cache_size); @@ -137,17 +130,11 @@ #ifdef CONFIG_ATARI if (MACH_IS_ATARI) - atari_stram_reserve_pages( start_mem ); -#endif - -#ifdef CONFIG_SUN3 - /* reserve rom pages */ - mmu_emu_reserve_pages(max_mapnr); + atari_stram_mem_init_hook(); #endif /* this will put all memory onto the freelists */ totalram_pages = free_all_bootmem(); - printk("tp:%ld\n", totalram_pages); for (tmp = PAGE_OFFSET ; tmp < (unsigned long)high_memory; tmp += PAGE_SIZE) { #if 0 @@ -201,13 +188,15 @@ #ifdef CONFIG_BLK_DEV_INITRD void free_initrd_mem(unsigned long start, unsigned long end) { + int pages = 0; for (; start < end; start += PAGE_SIZE) { ClearPageReserved(virt_to_page(start)); set_page_count(virt_to_page(start), 1); free_page(start); totalram_pages++; + pages++; } - printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); + printk ("Freeing initrd memory: %dk freed\n", pages); } #endif @@ -220,15 +209,8 @@ val->sharedram = 0; val->freeram = nr_free_pages(); val->bufferram = atomic_read(&buffermem_pages); - while (i-- > 0) { - if (PageReserved(mem_map+i)) - continue; - val->totalram++; - if (!page_count(mem_map+i)) - continue; - val->sharedram += page_count(mem_map+i) - 1; - } val->totalhigh = 0; val->freehigh = 0; + val->mem_unit = PAGE_SIZE; return; } diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mm/memory.c linux/arch/m68k/mm/memory.c --- v2.4.5/linux/arch/m68k/mm/memory.c Fri May 25 18:28:53 2001 +++ linux/arch/m68k/mm/memory.c Tue Jun 5 18:27:20 2001 @@ -39,6 +39,7 @@ pgd_set(pgd, (pmd_t *)BAD_PAGETABLE); } +#if 0 pte_t *get_pte_slow(pmd_t *pmd, unsigned long offset) { pte_t *pte; @@ -63,7 +64,9 @@ } return (pte_t *)__pmd_page(*pmd) + offset; } +#endif +#if 0 pmd_t *get_pmd_slow(pgd_t *pgd, unsigned long offset) { pmd_t *pmd; @@ -84,7 +87,7 @@ } return (pmd_t *)__pgd_page(*pgd) + offset; } - +#endif /* ++andreas: {get,free}_pointer_table rewritten to use unused fields from struct page instead of separately kmalloced struct. Stolen from @@ -250,6 +253,10 @@ if (voff == 0) return m68k_memory[i-1].addr + m68k_memory[i-1].size; + /* As a special case allow `__pa(high_memory)'. */ + if (voff == 0) + return m68k_memory[i-1].addr + m68k_memory[i-1].size; + return mm_vtop_fallback(vaddr); } #endif @@ -454,16 +461,21 @@ ".chip 68k" \ : : "a" (paddr)) -/* push and invalidate page in both caches */ +/* push and invalidate page in both caches, must disable ints + * to avoid invalidating valid data */ #define pushcl040(paddr) \ - do { push040(paddr); \ + do { unsigned long flags; \ + save_flags(flags); \ + cli(); \ + push040(paddr); \ if (CPU_IS_060) clear040(paddr); \ + restore_flags(flags); \ } while(0) /* push page in both caches, invalidate in i-cache */ +/* RZ: cpush %bc DOES invalidate %ic, regardless of DPI */ #define pushcli040(paddr) \ do { push040(paddr); \ - if (CPU_IS_060) cleari040(paddr); \ } while(0) diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mvme147/config.c linux/arch/m68k/mvme147/config.c --- v2.4.5/linux/arch/m68k/mvme147/config.c Mon Nov 27 17:11:26 2000 +++ linux/arch/m68k/mvme147/config.c Tue Jun 5 18:27:20 2001 @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -29,6 +28,7 @@ #include #include #include +#include #include #include diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mvme16x/config.c linux/arch/m68k/mvme16x/config.c --- v2.4.5/linux/arch/m68k/mvme16x/config.c Mon Jan 31 10:32:53 2000 +++ linux/arch/m68k/mvme16x/config.c Tue Jun 5 18:27:20 2001 @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -30,11 +29,10 @@ #include #include #include +#include #include #include -int atari_SCC_reset_done = 1; /* So SCC doesn't get reset */ -u_long atari_mch_cookie = 0; extern t_bdid mvme_bdid; static MK48T08ptr_t volatile rtc = (MK48T08ptr_t)MVME_RTC_BASE; diff -u --recursive --new-file v2.4.5/linux/arch/m68k/mvme16x/rtc.c linux/arch/m68k/mvme16x/rtc.c --- v2.4.5/linux/arch/m68k/mvme16x/rtc.c Fri Feb 9 11:29:44 2001 +++ linux/arch/m68k/mvme16x/rtc.c Tue Jun 5 18:27:20 2001 @@ -72,7 +72,7 @@ unsigned char mon, day, hrs, min, sec, leap_yr; unsigned int yrs; - if (!suser()) + if (!capable(CAP_SYS_ADMIN)) return -EACCES; if (copy_from_user(&rtc_tm, (struct rtc_time*)arg, diff -u --recursive --new-file v2.4.5/linux/arch/m68k/q40/README linux/arch/m68k/q40/README --- v2.4.5/linux/arch/m68k/q40/README Tue Mar 6 19:44:36 2001 +++ linux/arch/m68k/q40/README Tue Jun 5 18:27:20 2001 @@ -3,43 +3,48 @@ You may try http://www.geocities.com/SiliconValley/Bay/2602/ for some up to date information. Booter and other tools will be also -available from this place and ftp.uni-erlangen.de/linux/680x0/q40/ +available from this place or ftp.uni-erlangen.de/linux/680x0/q40/ and mirrors. Hints to documentation usually refer to the linux source tree in /usr/src/linux/Documentation unless URL given. -It seems IRQ unmasking can't be safely done on a Q40. Autoprobing is -not yet implemented - do not try it! (See below) +It seems IRQ unmasking can't be safely done on a Q40. IRQ probing +is not implemented - do not try it! (See below) -For a list of kernel commandline options read the documentation for the +For a list of kernel command-line options read the documentation for the particular device drivers. The floppy imposes a very high interrupt load on the CPU, approx 30K/s. When something blocks interrupts (HD) it will loose some of them, so far -this is not known to have caused any data loss. On hihgly loaded systems -it can make the floppy very slow or practicaly stop. Other Q40 OS' simply +this is not known to have caused any data loss. On highly loaded systems +it can make the floppy very slow or practically stop. Other Q40 OS' simply poll the floppy for this reason - something that can't be done in Linux. -Only possible cure is getting a 82072 contoler with fifo instead of -the 8272A +Only possible cure is getting a 82072 controller with fifo instead of +the 8272A. -drivers used by the Q40, appart from the very obvious (console etc.): +drivers used by the Q40, apart from the very obvious (console etc.): drivers/char/q40_keyb.c # use PC keymaps for national keyboards serial.c # normal PC driver - any speed lp.c # printer driver - char/joystick/* # most of this should work + genrtc.c # RTC + char/joystick/* # most of this should work, not + # in default config.in block/q40ide.c # startup for ide ide* # see Documentation/ide.txt floppy.c # normal PC driver, DMA emu in asm/floppy.h # and arch/m68k/kernel/entry.S # see drivers/block/README.fd + net/ne.c video/q40fb.c - misc/parport_pc.c + parport/* + sound/dmasound_core.c + dmasound_q40.c Various other PC drivers can be enabled simply by adding them to arch/m68k/config.in, especially 8 bit devices should be without any problems. For cards using 16bit io/mem more care is required, like -checking byteorder issues, hacking memcpy_*_io etc. +checking byte order issues, hacking memcpy_*_io etc. Debugging @@ -47,7 +52,7 @@ Upon startup the kernel will usually output "ABCQGHIJ" into the SRAM, preceded by the booter signature. This is a trace just in case something -went wrong during earliest setup stages. +went wrong during earliest setup stages of head.S. **Changed** to preserve SRAM contents by default, this is only done when requested - SRAM must start with '%LX$' signature to do this. '-d' option to 'lxx' loader enables this. @@ -55,13 +60,15 @@ SRAM can also be used as additional console device, use debug=mem. This will save kernel startup msgs into SRAM, the screen will display only the penguin - and shell prompt if it gets that far.. +Unfortunately only 2000 bytes are available. Serial console works and can also be used for debugging, see loader_txt Most problems seem to be caused by fawlty or badly configured io-cards or -harddrives anyway..there are so many things that can go wrong here. -Make sure to configure the parallel port as SPP for first testing..the -Q40 may have trouble with parallel interrupts. +hard drives anyway. +Make sure to configure the parallel port as SPP and remove IRQ/DMA jumpers +for first testing. The Q40 does not support DMA and may have trouble with +parallel ports version of interrupts. Q40 Hardware Description @@ -71,30 +78,27 @@ questions. The Q40 consists of a 68040@40 MHz, 1MB video RAM, up to 32MB RAM, AT-style -keyboard interface, 1 Programmable LED, 2 8bit DACs and up to 1MB ROM, 1MB +keyboard interface, 1 Programmable LED, 2x8bit DACs and up to 1MB ROM, 1MB shadow ROM. +The Q60 has any of 68060 or 68LC060 and up to 128 MB RAM. -Most interfacing like floppy, hd, serial, parallel ports is done via ISA +Most interfacing like floppy, IDE, serial and parallel ports is done via ISA slots. The ISA io and mem range is mapped (sparse&byteswapped!) into separate regions of the memory. The main interrupt register IIRQ_REG will indicate whether an IRQ was internal or from some ISA devices, EIRQ_REG can distinguish up to 8 ISA IRQs. The Q40 custom chip is programmable to provide 2 periodic timers: - - 50 or 200 Hz - level 2, - - 10 or 20 KHz - level 4 - !!THIS CANT BE DISABLED!! - + - 50 or 200 Hz - level 2, !!THIS CANT BE DISABLED!! + - 10 or 20 KHz - level 4, used for dma-sound + Linux uses the 200 Hz interrupt for timer and beep by default. Interrupts ========== -q40 master chip handles only level triggered interrupts :-(( - -IRQ sharing is not yet implemented but this should be only a minor -problem.. +q40 master chip handles only a subset of level triggered interrupts. Linux has some requirements wrt interrupt architecture, these are to my knowledge: @@ -103,27 +107,28 @@ (b) working enable/disable_irq Luckily these requirements are only important for drivers shared -with other architectures - ide,serial,parallel, ethernet.. +with other architectures - ide,serial,parallel, ethernet. q40ints.c now contains a trivial hack for (a), (b) is more difficult -because only irq's 4-15 can be disabled - and only all o them at once. +because only irq's 4-15 can be disabled - and only all of them at once. Thus disable_irq() can effectively block the machine if the driver goes asleep. -One thing to keep in minde when hacking around the interrupt code is -that there is no way to find out which IRQ caused a request. +One thing to keep in mind when hacking around the interrupt code is +that there is no way to find out which IRQ caused a request, [EI]IRQ_REG +displays current state of the various IRQ lines. Keyboard ======== q40 receives AT make/break codes from the keyboard, these are translated to the PC scancodes x86 Linux uses. So by theory every national keyboard should -work just by loading the apropriate x86 keytable - see any national-HOWTO. +work just by loading the appropriate x86 keytable - see any national-HOWTO. Unfortunately the AT->PC translation isn't quite trivial and even worse, my documentation of it is absolutely minimal - thus some exotic keys may not behave exactly as expected. There is still hope that it can be fixed completely though. If you encounter -problems, email me idealy this: +problems, email me ideally this: - exact keypress/release sequence - 'showkey -s' run on q40, non-X session - 'showkey -s' run on a PC, non-X session diff -u --recursive --new-file v2.4.5/linux/arch/m68k/q40/config.c linux/arch/m68k/q40/config.c --- v2.4.5/linux/arch/m68k/q40/config.c Fri Apr 6 10:42:48 2001 +++ linux/arch/m68k/q40/config.c Tue Jun 5 18:27:20 2001 @@ -13,11 +13,9 @@ */ #include -#include #include #include #include -#include #include #include #include @@ -25,6 +23,7 @@ #include #include +#include #include #include #include @@ -32,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +39,8 @@ extern void floppy_eject(void); extern void floppy_setup(char *str, int *ints); +extern int q40kbd_translate(unsigned char scancode, unsigned char *keycode, + char raw_mode); extern void q40_process_int (int level, struct pt_regs *regs); extern void (*q40_sys_default_handler[]) (int, void *, struct pt_regs *); /* added just for debugging */ extern void q40_init_IRQ (void); @@ -50,16 +52,17 @@ static int q40_get_hardware_list(char *buffer); extern int q40_request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id); extern void q40_sched_init(void (*handler)(int, void *, struct pt_regs *)); -extern int q40_keyb_init(void); -extern int q40_kbdrate (struct kbd_repeat *); + extern unsigned long q40_gettimeoffset (void); extern void q40_gettod (int *year, int *mon, int *day, int *hour, int *min, int *sec); extern int q40_hwclk (int, struct hwclk_time *); extern int q40_set_clock_mmss (unsigned long); extern void q40_reset (void); +void q40_halt(void); extern void q40_waitbut(void); void q40_set_vectors (void); + extern void (*kd_mksound)(unsigned int, unsigned int); void q40_mksound(unsigned int /*freq*/, unsigned int /*ticks*/ ); @@ -67,16 +70,9 @@ extern char m68k_debug_device[]; static void q40_mem_console_write(struct console *co, const char *b, unsigned int count); -#if 0 -extern int ql_ticks=0; -extern int sound_ticks=0; -#endif extern int ql_ticks; -static unsigned char bcd2bin (unsigned char b); -static unsigned char bin2bcd (unsigned char b); - static int q40_wait_key(struct console *co){return 0;} static struct console q40_console_driver = { name: "debug", @@ -90,11 +86,13 @@ extern char *q40_mem_cptr; /*=(char *)0xff020000;*/ static int _cpleft; +#if 0 int q40_kbd_translate(unsigned char keycode, unsigned char *keycodep, char raw_mode) { *keycodep = keycode; return 1; } +#endif static void q40_mem_console_write(struct console *co, const char *s, unsigned int count) @@ -130,13 +128,36 @@ } #endif -void q40_reset() +static int halted=0; + +#ifdef CONFIG_HEARTBEAT +static void q40_heartbeat(int on) { + if (halted) return; + if (on) + Q40_LED_ON(); + else + Q40_LED_OFF(); +} +#endif + +void q40_reset() +{ + halted=1; printk ("\n\n*******************************************\n" "Called q40_reset : press the RESET button!! \n" "*******************************************\n"); - + Q40_LED_ON(); + while(1) ; +} +void q40_halt() +{ + halted=1; + printk ("\n\n*******************\n" + " Called q40_halt\n" + "*******************\n"); + Q40_LED_ON(); while(1) ; } @@ -202,17 +223,17 @@ void __init config_q40(void) { - mach_sched_init = q40_sched_init; /* ok */ - /*mach_kbdrate = q40_kbdrate;*/ /* unneeded ?*/ - mach_keyb_init = q40_keyb_init; /* OK */ - mach_kbd_translate = q40_kbd_translate; + mach_sched_init = q40_sched_init; + + mach_keyb_init = q40kbd_init_hw; + mach_kbd_translate = q40kbd_translate; mach_init_IRQ = q40_init_IRQ; mach_gettimeoffset = q40_gettimeoffset; mach_gettod = q40_gettod; mach_hwclk = q40_hwclk; mach_set_clock_mmss = q40_set_clock_mmss; -/* mach_mksound = q40_mksound; */ - mach_reset = q40_reset; /* use reset button instead !*/ + + mach_reset = q40_reset; mach_free_irq = q40_free_irq; mach_process_int = q40_process_int; mach_get_irq_list = q40_get_irq_list; @@ -220,26 +241,28 @@ enable_irq = q40_enable_irq; disable_irq = q40_disable_irq; mach_default_handler = &q40_sys_default_handler; - mach_get_model = q40_get_model; /* no use..*/ - mach_get_hardware_list = q40_get_hardware_list; /* no use */ + mach_get_model = q40_get_model; + mach_get_hardware_list = q40_get_hardware_list; kd_mksound = q40_mksound; - /*mach_kbd_leds = q40kbd_leds;*/ + #ifdef CONFIG_MAGIC_SYSRQ mach_sysrq_key = 0x54; #endif - conswitchp = &dummy_con; -#if 0 /*def CONFIG_BLK_DEV_FD*/ - mach_floppy_setup = floppy_setup; - mach_floppy_eject = floppy_eject; - /**/ +#ifdef CONFIG_HEARTBEAT + mach_heartbeat = q40_heartbeat; #endif + mach_halt = q40_halt; + conswitchp = &dummy_con; + /* disable a few things that SMSQ might have left enabled */ q40_disable_irqs(); - mach_max_dma_address = 32*1024*1024; /* no DMA at all, but ide-scsi requires it.. */ + /* no DMA at all, but ide-scsi requires it.. make sure + * all physical RAM fits into the boundary - otherwise + * allocator may play costly and useless tricks */ + mach_max_dma_address = 1024*1024*1024; -/* useful for early debugging stages - writes kernel messages into SRAM */ - + /* useful for early debugging stages - writes kernel messages into SRAM */ if (!strncmp( m68k_debug_device,"mem",3 )) { /*printk("using NVRAM debug, q40_mem_cptr=%p\n",q40_mem_cptr);*/ @@ -252,109 +275,24 @@ int q40_parse_bootinfo(const struct bi_record *rec) { - return 1; /* unknown */ + return 1; } -#if 0 -#define DAC_LEFT ((unsigned char *)0xff008000) -#define DAC_RIGHT ((unsigned char *)0xff008004) -void q40_mksound(unsigned int hz, unsigned int ticks) -{ - /* for now ignore hz, except that hz==0 switches off sound */ - /* simply alternate the ampl 0-255-0-.. at 200Hz */ - if (hz==0) - { - if (sound_ticks) - sound_ticks=1; /* atomic - no irq spinlock used */ - - *DAC_LEFT=0; - *DAC_RIGHT=0; - return; - } - /* sound itself is done in q40_timer_int */ - if (sound_ticks == 0) sound_ticks=1000; /* pretty long beep */ - sound_ticks=ticks<<1; -} - -static void (*q40_timer_routine)(int, void *, struct pt_regs *); -static short rtc_oldsecs=0; -unsigned rtc_irq_flags=0; -unsigned rtc_irq_ctrl=0; - -static void q40_timer_int (int irq, void *dev_id, struct pt_regs *fp) -{ -#if (HZ==10000) - master_outb(-1,SAMPLE_CLEAR_REG); -#else /* must be 50 or 100 */ - master_outb(-1,FRAME_CLEAR_REG); -#endif - -#if (HZ==100) - ql_ticks = ql_ticks ? 0 : 1; - if (sound_ticks) - { - unsigned char sval=(sound_ticks & 1) ? 0 : 255; - sound_ticks--; - *DAC_LEFT=sval; - *DAC_RIGHT=sval; - } -#ifdef CONFIG_Q40RTC - if (rtc_irq_ctrl && (rtc_oldsecs != RTC_SECS)) - { - rtc_oldsecs = RTC_SECS; - rtc_irq_flags = RTC_UIE; - rtc_interrupt(); - } -#endif - if (ql_ticks) return; -#endif - q40_timer_routine(irq, dev_id, fp); +static inline unsigned char bcd2bin (unsigned char b) +{ + return ((b>>4)*10 + (b&15)); } -#endif -#if 0 -extern void (*q40_timer_routine)(int, void *, struct pt_regs *); -extern void q40_timer_int(); - -void q40_sched_init (void (*timer_routine)(int, void *, struct pt_regs *)) +static inline unsigned char bin2bcd (unsigned char b) { - int timer_irq; - - q40_timer_routine = timer_routine; - -#if (HZ==10000) - timer_irq=Q40_IRQ_TIMER; -#else - timer_irq=Q40_IRQ_FRAME; -#endif - - /*printk("registering sched/timer IRQ %d\n", timer_irq);*/ - - if (request_irq(timer_irq, q40_timer_int, 0, - "timer", q40_timer_int)) - panic ("Couldn't register timer int"); - -#if (HZ==10000) - master_outb(SAMPLE_LOW,SAMPLE_RATE_REG); - master_outb(-1,SAMPLE_CLEAR_REG); - master_outb(1,SAMPLE_ENABLE_REG); -#else - master_outb(-1,FRAME_CLEAR_REG); /* not necessary ? */ -#if (HZ==100) - master_outb( 1,FRAME_RATE_REG); -#endif -#endif + return (((b/10)*16) + (b%10)); } -#endif + unsigned long q40_gettimeoffset (void) { -#if (HZ==100) return 5000*(ql_ticks!=0); -#else - return 0; -#endif } extern void q40_gettod (int *year, int *mon, int *day, int *hour, @@ -362,7 +300,7 @@ { RTC_CTRL |= RTC_READ; *year = bcd2bin (RTC_YEAR); - *mon = bcd2bin (RTC_MNTH)-1; + *mon = bcd2bin (RTC_MNTH); *day = bcd2bin (RTC_DATE); *hour = bcd2bin (RTC_HOUR); *min = bcd2bin (RTC_MINS); @@ -371,15 +309,6 @@ } -static unsigned char bcd2bin (unsigned char b) -{ - return ((b>>4)*10 + (b&15)); -} - -static unsigned char bin2bcd (unsigned char b) -{ - return (((b/10)*16) + (b%10)); -} /* @@ -439,8 +368,6 @@ /* * Set the minutes and seconds from seconds value 'nowtime'. Fail if * clock is out by > 30 minutes. Logic lifted from atari code. - * Algorithm is to wait for the 10ms register to change, and then to - * wait a short while, and then set it. */ int q40_set_clock_mmss (unsigned long nowtime) @@ -469,18 +396,3 @@ return retval; } -extern void q40kbd_init_hw(void); - -int q40_keyb_init (void) -{ - q40kbd_init_hw(); - return 0; -} - -#if 0 -/* dummy to cause */ -void q40_slow_io() -{ - return; -} -#endif diff -u --recursive --new-file v2.4.5/linux/arch/m68k/q40/q40ints.c linux/arch/m68k/q40/q40ints.c --- v2.4.5/linux/arch/m68k/q40/q40ints.c Mon Nov 27 17:11:26 2000 +++ linux/arch/m68k/q40/q40ints.c Tue Jun 5 18:27:20 2001 @@ -1,7 +1,7 @@ /* * arch/m68k/q40/q40ints.c * - * Copyright (C) 1999 Richard Zidlicky + * Copyright (C) 1999,2001 Richard Zidlicky * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive @@ -44,7 +44,7 @@ void q40_irq2_handler (int, void *, struct pt_regs *fp); -extern void (*q40_sys_default_handler[]) (int, void *, struct pt_regs *); /* added just for debugging */ +extern void (*q40_sys_default_handler[]) (int, void *, struct pt_regs *); static void q40_defhand (int irq, void *dev_id, struct pt_regs *fp); static void sys_default_handler(int lev, void *dev_id, struct pt_regs *regs); @@ -97,9 +97,9 @@ sys_request_irq(IRQ2,q40_irq2_handler, 0, "q40 ISA and master chip", NULL); /* now enable some ints.. */ - master_outb(1,EXT_ENABLE_REG); /* hm, aint that too early? */ + master_outb(1,EXT_ENABLE_REG); /* ISA IRQ 5-15 */ - /* would be spurious ints by now, q40kbd_init_hw() does that */ + /* make sure keyboard IRQ is disabled */ master_outb(0,KEY_IRQ_ENABLE_REG); } @@ -139,7 +139,7 @@ if (dev_id==NULL) { printk("WARNING: dev_id == NULL in request_irq\n"); - dev_id=1; + dev_id=(void*)1; } irq_tab[irq].handler = handler; irq_tab[irq].flags = flags; @@ -202,7 +202,8 @@ /* * this stuff doesn't really belong here.. */ -int ql_ticks=0; + +int ql_ticks=0; /* 200Hz ticks since last jiffie */ static int sound_ticks=0; #define SVOL 45 @@ -214,7 +215,7 @@ if (hz==0) { if (sound_ticks) - sound_ticks=1; /* atomic - no irq spinlock used */ + sound_ticks=1; *DAC_LEFT=128; *DAC_RIGHT=128; @@ -227,14 +228,9 @@ } static void (*q40_timer_routine)(int, void *, struct pt_regs *); -static short rtc_oldsecs=0; -unsigned rtc_irq_flags=0; -unsigned rtc_irq_ctrl=0; static void q40_timer_int (int irq, void * dev, struct pt_regs * regs) { - - #if (HZ==100) ql_ticks = ql_ticks ? 0 : 1; if (sound_ticks) @@ -244,12 +240,12 @@ *DAC_LEFT=sval; *DAC_RIGHT=sval; } -#ifdef CONFIG_Q40RTC - if (rtc_irq_ctrl && (rtc_oldsecs != RTC_SECS)) +#if defined(CONFIG_Q40RTC) || defined(CONFIG_GEN_RTC) + if (gen_rtc_irq_ctrl && (q40rtc_oldsecs != RTC_SECS)) { - rtc_oldsecs = RTC_SECS; - rtc_irq_flags = RTC_UIE; - rtc_interrupt(); + q40rtc_oldsecs = RTC_SECS; + gen_rtc_irq_flags = RTC_UIE; + gen_rtc_interrupt(0); } #endif if (ql_ticks) return; @@ -322,16 +318,14 @@ static int ccleirq=60; /* ISA dev IRQ's*/ /*static int cclirq=60;*/ /* internal */ -/* FIX: add shared ints,mask,unmask,probing.... */ - +/* FIXME: add shared ints,mask,unmask,probing.... */ #define IRQ_INPROGRESS 1 /*static unsigned short saved_mask;*/ static int do_tint=0; #define DEBUG_Q40INT -#define IP_USE_DISABLE /* would be nice, but crashes ???? */ -/*static int dd_count=0;*/ +/*#define IP_USE_DISABLE *//* would be nice, but crashes ???? */ static int mext_disabled=0; /* ext irq disabled by master chip? */ static int aliased_irq=0; /* how many times inside handler ?*/ @@ -404,40 +398,36 @@ if ( disabled ) { #ifdef IP_USE_DISABLE - if (irq>4){ - disabled=0; - /*dd_count--;*/ - enable_irq(irq);} + if (irq>4){ + disabled=0; + enable_irq(irq);} #else - disabled=0; + disabled=0; /*printk("reenabling irq %d\n",irq); */ -#if 0 - fp->sr = ((fp->sr) & (~0x700)); /* unneeded ?! */ -#endif #endif } goto repeat; /* return; */ } } - if (mer && ccleirq>0 && !aliased_irq) + if (mer && ccleirq>0 && !aliased_irq) printk("ISA interrupt from unknown source? EIRQ_REG = %x\n",mer),ccleirq--; } iirq: - mir=master_inb(IIRQ_REG); - if (mir&IRQ_FRAME_MASK) + mir=master_inb(IIRQ_REG); + if (mir&IRQ_FRAME_MASK) { - do_tint++; - master_outb(-1,FRAME_CLEAR_REG); - } - for(;do_tint>0;do_tint--) - { - irq_tab[Q40_IRQ_FRAME].count++; - irq_tab[Q40_IRQ_FRAME].handler(Q40_IRQ_FRAME,irq_tab[Q40_IRQ_FRAME].dev_id,fp); - } - if (mir&IRQ_KEYB_MASK) /* may handle it even if actually disabled*/ - { - irq_tab[Q40_IRQ_KEYBOARD].count++; - irq_tab[Q40_IRQ_KEYBOARD].handler(Q40_IRQ_KEYBOARD,irq_tab[Q40_IRQ_KEYBOARD].dev_id,fp); + do_tint++; + master_outb(-1,FRAME_CLEAR_REG); + } + for(;do_tint>0;do_tint--) + { + irq_tab[Q40_IRQ_FRAME].count++; + irq_tab[Q40_IRQ_FRAME].handler(Q40_IRQ_FRAME,irq_tab[Q40_IRQ_FRAME].dev_id,fp); + } + if (mir&IRQ_KEYB_MASK) /* may handle it even if actually disabled*/ + { + irq_tab[Q40_IRQ_KEYBOARD].count++; + irq_tab[Q40_IRQ_KEYBOARD].handler(Q40_IRQ_KEYBOARD,irq_tab[Q40_IRQ_KEYBOARD].dev_id,fp); } } @@ -499,7 +489,7 @@ void q40_disable_irq (unsigned int irq) { /* disable ISA iqs : only do something if the driver has been - * verified to be Q40 "compatible" - right now only IDE + * verified to be Q40 "compatible" - right now IDE, NE2K * Any driver should not attempt to sleep accross disable_irq !! */ diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3/Makefile linux/arch/m68k/sun3/Makefile --- v2.4.5/linux/arch/m68k/sun3/Makefile Fri Dec 29 14:07:20 2000 +++ linux/arch/m68k/sun3/Makefile Tue Jun 5 18:27:20 2001 @@ -14,7 +14,9 @@ export-objs := sun3_ksyms.o -obj-y := config.o idprom.o mmu_emu.o sun3ints.o leds.o dvma.o \ - sbus.o intersil.o sun3_ksyms.o +obj-y := sun3_ksyms.o sun3ints.o sun3dvma.o sbus.o + +obj-$(CONFIG_SUN3) += config.o idprom.o mmu_emu.o leds.o dvma.o \ + intersil.o include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3/config.c linux/arch/m68k/sun3/config.c --- v2.4.5/linux/arch/m68k/sun3/config.c Fri Dec 29 14:07:20 2000 +++ linux/arch/m68k/sun3/config.c Tue Jun 5 18:27:20 2001 @@ -8,13 +8,10 @@ * for more details. */ -#include - #include #include #include #include -#include #include #include #include @@ -27,10 +24,12 @@ #include #include #include +#include #include #include #include #include +#include extern char _text, _end; @@ -39,15 +38,6 @@ extern unsigned long sun3_gettimeoffset(void); extern int sun3_get_irq_list (char *); extern void sun3_sched_init(void (*handler)(int, void *, struct pt_regs *)); -extern void sun3_init_IRQ (void); -extern void (*sun3_default_handler[]) (int, void *, struct pt_regs *); -extern int sun3_request_irq (unsigned int irq, void (*handler)(int, void *, struct pt_regs *), - unsigned long flags, const char *devname, void *dev_id); -extern void sun3_free_irq (unsigned int irq, void *dev_id); -extern void sun3_enable_irq (unsigned int); -extern void sun3_disable_irq (unsigned int); -extern void sun3_enable_interrupts (void); -extern void sun3_disable_interrupts (void); extern void sun3_get_model (char* model); extern void idprom_init (void); extern void sun3_gettod (int *yearp, int *monp, int *dayp, @@ -56,7 +46,7 @@ extern void sun_serial_setup(void); volatile char* clock_va; -extern unsigned char* sun3_intreg; +extern volatile unsigned char* sun3_intreg; extern unsigned long availmem; unsigned long num_pages; @@ -76,7 +66,7 @@ prom_init((void *)LINUX_OPPROM_BEGVM); GET_CONTROL_BYTE(AC_SENABLE,enable_register); - enable_register |= 0x40; /* Enable FPU */ + enable_register |= 0x50; /* Enable FPU */ SET_CONTROL_BYTE(AC_SENABLE,enable_register); GET_CONTROL_BYTE(AC_SENABLE,enable_register); @@ -154,6 +144,7 @@ // mach_keyb_init = sun3_keyb_init; enable_irq = sun3_enable_irq; disable_irq = sun3_disable_irq; + mach_process_int = sun3_process_int; mach_get_irq_list = sun3_get_irq_list; mach_gettod = sun3_gettod; mach_reset = sun3_reboot; @@ -161,7 +152,7 @@ mach_get_model = sun3_get_model; mach_hwclk = sun3_hwclk; mach_halt = sun3_halt; -#ifndef CONFIG_SERIAL_CONSOLE +#if !defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_FB) conswitchp = &dummy_con; #endif diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3/dvma.c linux/arch/m68k/sun3/dvma.c --- v2.4.5/linux/arch/m68k/sun3/dvma.c Fri Dec 29 14:07:20 2000 +++ linux/arch/m68k/sun3/dvma.c Tue Jun 5 18:27:20 2001 @@ -4,42 +4,62 @@ #include #include #include +#include #include #include #include #include -unsigned long dvma_next_free = DVMA_START; -unsigned long dvma_region_end = DVMA_START + (DVMA_RESERVED_PMEGS * SUN3_PMEG_SIZE); +static unsigned long ptelist[120]; -/* reserve such dma memory as we see fit */ -void sun3_dvma_init(void) +inline unsigned long dvma_page(unsigned long kaddr, unsigned long vaddr) { - unsigned long dvma_phys_start; - - dvma_phys_start = (sun3_get_pte(DVMA_START) & - SUN3_PAGE_PGNUM_MASK); - dvma_phys_start <<= PAGE_SHIFT; + unsigned long pte; + unsigned long j; + pte_t ptep; - reserve_bootmem(dvma_phys_start, - (DVMA_RESERVED_PMEGS * SUN3_PMEG_SIZE)); + j = *(volatile unsigned long *)kaddr; + *(volatile unsigned long *)kaddr = j; -} + ptep = __mk_pte(kaddr, PAGE_KERNEL); + pte = pte_val(ptep); +// printk("dvma_remap: addr %lx -> %lx pte %08lx len %x\n", +// kaddr, vaddr, pte, len); + if(ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] != pte) { + sun3_put_pte(vaddr, pte); + ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] = pte; + } -/* get needed number of free dma pages, or panic if not enough */ + return (vaddr + (kaddr & ~PAGE_MASK)); -void *sun3_dvma_malloc(int len) +} + +int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, + int len) { + + unsigned long end; unsigned long vaddr; - if((dvma_next_free + len) > dvma_region_end) - panic("sun3_dvma_malloc: out of dvma pages"); + vaddr = dvma_btov(baddr); + + end = vaddr + len; - vaddr = dvma_next_free; - dvma_next_free = DVMA_ALIGN(dvma_next_free + len); + while(vaddr < end) { + dvma_page(kaddr, vaddr); + kaddr += PAGE_SIZE; + vaddr += PAGE_SIZE; + } + + return 0; - return (void *)vaddr; } - +void sun3_dvma_init(void) +{ + + memset(ptelist, 0, sizeof(ptelist)); + + +} diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3/intersil.c linux/arch/m68k/sun3/intersil.c --- v2.4.5/linux/arch/m68k/sun3/intersil.c Wed Jan 26 12:44:21 2000 +++ linux/arch/m68k/sun3/intersil.c Tue Jun 5 18:27:20 2001 @@ -11,9 +11,9 @@ */ #include -#include #include +#include #include @@ -30,7 +30,7 @@ void sun3_gettod (int *yearp, int *monp, int *dayp, int *hourp, int *minp, int *secp) { - u_char wday; + unsigned char wday; volatile struct intersil_dt* todintersil; unsigned long flags; diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3/mmu_emu.c linux/arch/m68k/sun3/mmu_emu.c --- v2.4.5/linux/arch/m68k/sun3/mmu_emu.c Fri Dec 29 14:07:20 2000 +++ linux/arch/m68k/sun3/mmu_emu.c Tue Jun 5 18:27:20 2001 @@ -29,6 +29,7 @@ extern void prom_reboot (char *) __attribute__ ((__noreturn__)); #undef DEBUG_MMU_EMU +#define DEBUG_PROM_MAPS /* ** Defines @@ -157,9 +158,12 @@ j = 0; for (num=0, seg=0x0F800000; seg<0x10000000; seg+=16*PAGE_SIZE) { if (sun3_get_segmap (seg) != SUN3_INVALID_PMEG) { -#ifdef DEBUG_MMU_EMU - printk ("mapped:"); - print_pte_vaddr (seg); +#ifdef DEBUG_PROM_MAPS + for(i = 0; i < 16; i++) { + printk ("mapped:"); + print_pte_vaddr (seg + (i*PAGE_SIZE)); + break; + } #endif // the lowest mapping here is the end of our // vmalloc region @@ -174,7 +178,7 @@ } - sun3_dvma_init(); + dvma_init(); /* blank everything below the kernel, and we've got the base diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3/sbus.c linux/arch/m68k/sun3/sbus.c --- v2.4.5/linux/arch/m68k/sun3/sbus.c Wed Sep 8 11:20:42 1999 +++ linux/arch/m68k/sun3/sbus.c Tue Jun 5 18:27:20 2001 @@ -12,8 +12,12 @@ #include #include +extern void rs_init(void); + void __init sbus_init(void) { + + rs_init(); } diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3/sun3_ksyms.c linux/arch/m68k/sun3/sun3_ksyms.c --- v2.4.5/linux/arch/m68k/sun3/sun3_ksyms.c Fri Jan 28 08:04:58 2000 +++ linux/arch/m68k/sun3/sun3_ksyms.c Tue Jun 5 18:27:20 2001 @@ -6,5 +6,8 @@ /* * Add things here when you find the need for it. */ -EXPORT_SYMBOL(sun3_dvma_malloc); +EXPORT_SYMBOL(dvma_map_align); +EXPORT_SYMBOL(dvma_unmap); +EXPORT_SYMBOL(dvma_malloc_align); +EXPORT_SYMBOL(dvma_free); EXPORT_SYMBOL(idprom); diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3/sun3dvma.c linux/arch/m68k/sun3/sun3dvma.c --- v2.4.5/linux/arch/m68k/sun3/sun3dvma.c Wed Dec 31 16:00:00 1969 +++ linux/arch/m68k/sun3/sun3dvma.c Tue Jun 5 18:27:20 2001 @@ -0,0 +1,295 @@ +/* + * linux/arch/m68k/mm/sun3dvma.c + * + * Copyright (C) 2000 Sam Creasey + * + * Contains common routines for sun3/sun3x DVMA management. + */ + +#include +#include +#include + +#include +#include +#include + +#ifdef CONFIG_SUN3X +extern void dvma_unmap_iommu(unsigned long baddr, int len); +#else +static inline void dvma_unmap_iommu(unsigned long a, int b) +{ +} +#endif + +unsigned long iommu_use[IOMMU_TOTAL_ENTRIES]; + +#define dvma_index(baddr) ((baddr - DVMA_START) >> DVMA_PAGE_SHIFT) + +#define dvma_entry_use(baddr) (iommu_use[dvma_index(baddr)]) + +struct hole { + unsigned long start; + unsigned long end; + unsigned long size; + struct list_head list; +}; + +static struct list_head hole_list; +static struct list_head hole_cache; +static struct hole initholes[64]; + +static inline int refill(void) +{ + + struct hole *hole; + struct hole *prev = NULL; + struct list_head *cur; + int ret = 0; + + list_for_each(cur, &hole_list) { + hole = list_entry(cur, struct hole, list); + + if(!prev) { + prev = hole; + continue; + } + + if(hole->end == prev->start) { + hole->size += prev->size; + hole->end = prev->end; + list_del(&(prev->list)); + list_add(&(prev->list), &hole_cache); + ret++; + } + + } + + return ret; +} + +static inline struct hole *rmcache(void) +{ + struct hole *ret; + + if(list_empty(&hole_cache)) { + if(!refill()) { + printk("out of dvma hole cache!\n"); + BUG(); + } + } + + ret = list_entry(hole_cache.next, struct hole, list); + list_del(&(ret->list)); + + return ret; + +} + +static inline unsigned long get_baddr(int len, unsigned long align) +{ + + struct list_head *cur; + struct hole *hole; + + if(list_empty(&hole_list)) { + printk("out of dvma holes!\n"); + BUG(); + } + + list_for_each(cur, &hole_list) { + unsigned long newlen; + + hole = list_entry(cur, struct hole, list); + + if(align > DVMA_PAGE_SIZE) + newlen = len + ((hole->end - len) & (align-1)); + else + newlen = len; + + if(hole->size > newlen) { + hole->end -= newlen; + hole->size -= newlen; + dvma_entry_use(hole->end) = newlen; + return hole->end; + } else if(hole->size == newlen) { + list_del(&(hole->list)); + list_add(&(hole->list), &hole_cache); + dvma_entry_use(hole->start) = newlen; + return hole->start; + } + + } + + printk("unable to find dvma hole!\n"); + BUG(); + return 0; +} + +static inline int free_baddr(unsigned long baddr) +{ + + unsigned long len; + struct hole *hole; + struct list_head *cur; + unsigned long orig_baddr; + + orig_baddr = baddr; + len = dvma_entry_use(baddr); + dvma_entry_use(baddr) = 0; + baddr &= DVMA_PAGE_MASK; + dvma_unmap_iommu(baddr, len); + + list_for_each(cur, &hole_list) { + hole = list_entry(cur, struct hole, list); + + if(hole->end == baddr) { + hole->end += len; + hole->size += len; + return 0; + } else if(hole->start == (baddr + len)) { + hole->start = baddr; + hole->size += len; + return 0; + } + + } + + hole = rmcache(); + + hole->start = baddr; + hole->end = baddr + len; + hole->size = len; + +// list_add_tail(&(hole->list), cur); + list_add(&(hole->list), cur); + + return 0; + +} + +void dvma_init(void) +{ + + struct hole *hole; + int i; + + INIT_LIST_HEAD(&hole_list); + INIT_LIST_HEAD(&hole_cache); + + /* prepare the hole cache */ + for(i = 0; i < 64; i++) + list_add(&(initholes[i].list), &hole_cache); + + hole = rmcache(); + hole->start = DVMA_START; + hole->end = DVMA_END; + hole->size = DVMA_SIZE; + + list_add(&(hole->list), &hole_list); + + memset(iommu_use, 0, sizeof(iommu_use)); + + dvma_unmap_iommu(DVMA_START, DVMA_SIZE); + +#ifdef CONFIG_SUN3 + sun3_dvma_init(); +#endif + +} + +inline unsigned long dvma_map_align(unsigned long kaddr, int len, int align) +{ + + unsigned long baddr; + unsigned long off; + + if(!len) + len = 0x800; + + if(!kaddr || !len) { +// printk("error: kaddr %lx len %x\n", kaddr, len); +// *(int *)4 = 0; + return 0; + } + +#ifdef DEBUG + printk("dvma_map request %08lx bytes from %08lx\n", + len, kaddr); +#endif + off = kaddr & ~DVMA_PAGE_MASK; + kaddr &= PAGE_MASK; + len += off; + len = ((len + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK); + + if(align == 0) + align = DVMA_PAGE_SIZE; + else + align = ((align + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK); + + baddr = get_baddr(len, align); +// printk("using baddr %lx\n", baddr); + + if(!dvma_map_iommu(kaddr, baddr, len)) + return (baddr + off); + + printk("dvma_map failed kaddr %lx baddr %lx len %x\n", kaddr, baddr, len); + BUG(); + return 0; +} + +void dvma_unmap(void *baddr) +{ + + free_baddr((unsigned long)baddr); + + return; + +} + + +void *dvma_malloc_align(unsigned long len, unsigned long align) +{ + unsigned long kaddr; + unsigned long baddr; + unsigned long vaddr; + + if(!len) + return NULL; + +#ifdef DEBUG + printk("dvma_malloc request %lx bytes\n", len); +#endif + len = ((len + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK); + + if((kaddr = __get_free_pages(GFP_ATOMIC, get_order(len))) == 0) + return NULL; + + if((baddr = (unsigned long)dvma_map_align(kaddr, len, align)) == 0) { + free_pages(kaddr, get_order(len)); + return NULL; + } + + vaddr = dvma_btov(baddr); + + if(dvma_map_cpu(kaddr, vaddr, len) < 0) { + dvma_unmap((void *)baddr); + free_pages(kaddr, get_order(len)); + return NULL; + } + +#ifdef DEBUG + printk("mapped %08lx bytes %08lx kern -> %08lx bus\n", + len, kaddr, baddr); +#endif + + return (void *)vaddr; + +} + +void dvma_free(void *vaddr) +{ + + return; + +} diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3/sun3ints.c linux/arch/m68k/sun3/sun3ints.c --- v2.4.5/linux/arch/m68k/sun3/sun3ints.c Fri Dec 29 14:07:20 2000 +++ linux/arch/m68k/sun3/sun3ints.c Tue Jun 5 18:27:20 2001 @@ -1,5 +1,5 @@ /* - * linux/arch/m68k/sun3/sun3ints.c -- Sun-3 Linux interrupt handling code + * linux/arch/m68k/sun3/sun3ints.c -- Sun-3(x) Linux interrupt handling code * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive @@ -35,7 +35,7 @@ ~(0x10), ~(0x08) }; -unsigned char* sun3_intreg; +volatile unsigned char* sun3_intreg; void sun3_insert_irq(irq_node_t **list, irq_node_t *node) { @@ -45,10 +45,6 @@ { } -void sun3_free_irq(unsigned int irq, void *dev_id) -{ -} - void sun3_enable_irq(unsigned int irq) { *sun3_intreg |= (1<= 64) && (irq <= 255)) { + int vec; + + vec = irq - 64; + if(sun3_vechandler[vec] != NULL) { + printk("sun3_request_irq: request for vec %d -- already taken!\n", irq); + return 1; + } + + sun3_vechandler[vec] = handler; + vec_ids[vec] = dev_id; + vec_names[vec] = devname; + + return 0; + } + } - /* setting devname would be nice */ - - sys_request_irq(irq, sun3_default_handler[irq], 0, devname, NULL); - + printk("sun3_request_irq: invalid irq %d\n", irq); + return 1; - return 0; } +void sun3_free_irq(unsigned int irq, void *dev_id) +{ + + if(irq < SYS_IRQS) { + if(sun3_inthandler[irq] == NULL) + panic("sun3_free_int: attempt to free unused irq %d\n", irq); + if(dev_ids[irq] != dev_id) + panic("sun3_free_int: incorrect dev_id for irq %d\n", irq); + + sun3_inthandler[irq] = NULL; + return; + } else if((irq >= 64) && (irq <= 255)) { + int vec; + + vec = irq - 64; + if(sun3_vechandler[vec] == NULL) + panic("sun3_free_int: attempt to free unused vector %d\n", irq); + if(vec_ids[irq] != dev_id) + panic("sun3_free_int: incorrect dev_id for vec %d\n", irq); + + sun3_vechandler[vec] = NULL; + return; + } else { + panic("sun3_free_irq: invalid irq %d\n", irq); + } +} + +void sun3_process_int(int irq, struct pt_regs *regs) +{ + + if((irq >= 64) && (irq <= 255)) { + int vec; + + vec = irq - 64; + if(sun3_vechandler[vec] == NULL) + panic ("bad interrupt vector %d received\n",irq); + + sun3_vechandler[vec](irq, vec_ids[vec], regs); + return; + } else { + panic("sun3_process_int: unable to handle interrupt vector %d\n", + irq); + } +} diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3x/Makefile linux/arch/m68k/sun3x/Makefile --- v2.4.5/linux/arch/m68k/sun3x/Makefile Fri Dec 29 14:07:20 2000 +++ linux/arch/m68k/sun3x/Makefile Tue Jun 5 18:27:20 2001 @@ -9,6 +9,6 @@ O_TARGET := sun3x.o -obj-y := config.o time.o dvma.o sbus.o +obj-y := config.o time.o dvma.o prom.o include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3x/config.c linux/arch/m68k/sun3x/config.c --- v2.4.5/linux/arch/m68k/sun3x/config.c Thu Aug 26 12:42:31 1999 +++ linux/arch/m68k/sun3x/config.c Tue Jun 5 18:27:20 2001 @@ -14,39 +14,24 @@ #include #include #include -#include +#include +#include +#include #include "time.h" -static volatile unsigned char *sun3x_intreg = (unsigned char *)SUN3X_INTREG; -extern int serial_console; +volatile char *clock_va; +extern volatile unsigned char *sun3_intreg; -void sun3x_halt(void) -{ - /* Disable interrupts */ - cli(); - - /* we can't drop back to PROM, so we loop here */ - for (;;); -} - -void sun3x_reboot(void) -{ - /* This never returns, don't bother saving things */ - cli(); - - /* no idea, whether this works */ - asm ("reset"); -} int __init sun3x_keyb_init(void) { - return 0; + return 0; } int sun3x_kbdrate(struct kbd_repeat *r) { - return 0; + return 0; } void sun3x_kbd_leds(unsigned int i) @@ -54,36 +39,15 @@ } -static void sun3x_badint (int irq, void *dev_id, struct pt_regs *fp) +void sun3_leds(unsigned int i) { - printk ("received spurious interrupt %d\n",irq); - num_spurious += 1; -} -void (*sun3x_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = { - sun3x_badint, sun3x_badint, sun3x_badint, sun3x_badint, - sun3x_badint, sun3x_badint, sun3x_badint, sun3x_badint -}; - -void sun3x_enable_irq(unsigned int irq) -{ - *sun3x_intreg |= (1 << irq); } -void sun3x_disable_irq(unsigned int irq) +/* should probably detect types of these eventually. */ +static void sun3x_get_model(char *model) { - *sun3x_intreg &= ~(1 << irq); -} - -void __init sun3x_init_IRQ(void) -{ - /* disable all interrupts initially */ - *sun3x_intreg = 1; /* master enable only */ -} - -int sun3x_get_irq_list(char *buf) -{ - return 0; + sprintf(model, "Sun3x"); } /* @@ -91,38 +55,51 @@ */ void __init config_sun3x(void) { - mach_get_irq_list = sun3x_get_irq_list; - mach_max_dma_address = 0xffffffff; /* we can DMA anywhere, whee */ - mach_keyb_init = sun3x_keyb_init; - mach_kbdrate = sun3x_kbdrate; - mach_kbd_leds = sun3x_kbd_leds; - - mach_sched_init = sun3x_sched_init; - mach_init_IRQ = sun3x_init_IRQ; - enable_irq = sun3x_enable_irq; - disable_irq = sun3x_disable_irq; - mach_request_irq = sys_request_irq; - mach_free_irq = sys_free_irq; - mach_default_handler = &sun3x_default_handler; - mach_gettimeoffset = sun3x_gettimeoffset; - mach_reset = sun3x_reboot; + sun3x_prom_init(); + + mach_get_irq_list = sun3_get_irq_list; + mach_max_dma_address = 0xffffffff; /* we can DMA anywhere, whee */ - mach_gettod = sun3x_gettod; + mach_keyb_init = sun3x_keyb_init; + mach_kbdrate = sun3x_kbdrate; + mach_kbd_leds = sun3x_kbd_leds; + + mach_default_handler = &sun3_default_handler; + mach_sched_init = sun3x_sched_init; + mach_init_IRQ = sun3_init_IRQ; + enable_irq = sun3_enable_irq; + disable_irq = sun3_disable_irq; + mach_request_irq = sun3_request_irq; + mach_free_irq = sun3_free_irq; + mach_process_int = sun3_process_int; - switch (*(unsigned char *)SUN3X_EEPROM_CONS) { + mach_gettimeoffset = sun3x_gettimeoffset; + mach_reset = sun3x_reboot; + + mach_gettod = sun3x_gettod; + mach_hwclk = sun3x_hwclk; + mach_get_model = sun3x_get_model; + + sun3_intreg = (unsigned char *)SUN3X_INTREG; + + /* only the serial console is known to work anyway... */ +#if 0 + switch (*(unsigned char *)SUN3X_EEPROM_CONS) { case 0x10: - serial_console = 1; - conswitchp = NULL; - break; + serial_console = 1; + conswitchp = NULL; + break; case 0x11: - serial_console = 2; - conswitchp = NULL; - break; + serial_console = 2; + conswitchp = NULL; + break; default: - serial_console = 0; - conswitchp = &dummy_con; - break; - } + serial_console = 0; + conswitchp = &dummy_con; + break; + } +#endif } + diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3x/dvma.c linux/arch/m68k/sun3x/dvma.c --- v2.4.5/linux/arch/m68k/sun3x/dvma.c Tue May 11 09:57:14 1999 +++ linux/arch/m68k/sun3x/dvma.c Tue Jun 5 18:27:20 2001 @@ -2,21 +2,31 @@ * Virtual DMA allocation * * (C) 1999 Thomas Bogendoerfer (tsbogend@alpha.franken.de) + * + * 11/26/2000 -- disabled the existing code because it didn't work for + * me in 2.4. Replaced with a significantly more primitive version + * similar to the sun3 code. the old functionality was probably more + * desirable, but.... -- Sam Creasey (sammy@oh.verio.com) + * */ #include #include #include #include +#include +#include +#include #include #include #include #include +#include +#include /* IOMMU support */ -#define IOMMU_ENTRIES 2048 #define IOMMU_ADDR_MASK 0x03ffe000 #define IOMMU_CACHE_INHIBIT 0x00000040 #define IOMMU_FULL_BLOCK 0x00000020 @@ -28,135 +38,170 @@ #define IOMMU_DT_VALID 0x00000001 #define IOMMU_DT_BAD 0x00000002 -#define DVMA_PAGE_SHIFT 13 -#define DVMA_PAGE_SIZE (1UL << DVMA_PAGE_SHIFT) -#define DVMA_PAGE_MASK (~(DVMA_PAGE_SIZE-1)) - static volatile unsigned long *iommu_pte = (unsigned long *)SUN3X_IOMMU; -static unsigned long iommu_use[IOMMU_ENTRIES]; -static unsigned long iommu_bitmap[IOMMU_ENTRIES/32]; #define dvma_entry_paddr(index) (iommu_pte[index] & IOMMU_ADDR_MASK) #define dvma_entry_vaddr(index,paddr) ((index << DVMA_PAGE_SHIFT) | \ (paddr & (DVMA_PAGE_SIZE-1))) +#if 0 +#define dvma_entry_set(index,addr) (iommu_pte[index] = \ + (addr & IOMMU_ADDR_MASK) | \ + IOMMU_DT_VALID | IOMMU_CACHE_INHIBIT) +#else #define dvma_entry_set(index,addr) (iommu_pte[index] = \ (addr & IOMMU_ADDR_MASK) | \ IOMMU_DT_VALID) +#endif #define dvma_entry_clr(index) (iommu_pte[index] = IOMMU_DT_INVALID) -#define dvma_entry_use(index) (iommu_use[index]) -#define dvma_entry_inc(index) (iommu_use[index]++) -#define dvma_entry_dec(index) (iommu_use[index]--) #define dvma_entry_hash(addr) ((addr >> DVMA_PAGE_SHIFT) ^ \ ((addr & 0x03c00000) >> \ (DVMA_PAGE_SHIFT+4))) -#define dvma_map iommu_bitmap -#define dvma_map_size (IOMMU_ENTRIES/2) -#define dvma_slow_offset (IOMMU_ENTRIES/2) -#define dvma_is_slow(addr) ((addr) & \ - (dvma_slow_offset << DVMA_PAGE_SHIFT)) -static int fixed_dvma; +#undef DEBUG -void __init dvma_init(void) +#ifdef DEBUG +/* code to print out a dvma mapping for debugging purposes */ +void dvma_print (unsigned long dvma_addr) { - unsigned long tmp; - if ((unsigned long)high_memory < (IOMMU_ENTRIES << DVMA_PAGE_SHIFT)) { - printk ("Sun3x fixed DVMA mapping\n"); - fixed_dvma = 1; - for (tmp = 0; tmp < (unsigned long)high_memory; tmp += DVMA_PAGE_SIZE) - dvma_entry_set (tmp >> DVMA_PAGE_SHIFT, virt_to_phys((void *)tmp)); - fixed_dvma = 1; - } else { - printk ("Sun3x variable DVMA mapping\n"); - for (tmp = 0; tmp < IOMMU_ENTRIES; tmp++) - dvma_entry_clr (tmp); - fixed_dvma = 0; - } + unsigned long index; + + index = dvma_addr >> DVMA_PAGE_SHIFT; + + printk("idx %lx dvma_addr %08lx paddr %08lx\n", index, dvma_addr, + dvma_entry_paddr(index)); + + } +#endif -unsigned long dvma_slow_alloc (unsigned long paddr, int npages) + +/* create a virtual mapping for a page assigned within the IOMMU + so that the cpu can reach it easily */ +inline int dvma_map_cpu(unsigned long kaddr, + unsigned long vaddr, int len) { - int scan, base; - - scan = 0; - for (;;) { - scan = find_next_zero_bit(dvma_map, dvma_map_size, scan); - if ((base = scan) + npages > dvma_map_size) { - printk ("dvma_slow_alloc failed for %d pages\n",npages); - return 0; - } - for (;;) { - if (scan >= base + npages) goto found; - if (test_bit(scan, dvma_map)) break; - scan++; - } - } + pgd_t *pgd; + unsigned long end; + int ret = 0; + + kaddr &= PAGE_MASK; + vaddr &= PAGE_MASK; + + end = PAGE_ALIGN(vaddr + len); + +#ifdef DEBUG + printk("dvma: mapping kern %08lx to virt %08lx\n", + kaddr, vaddr); +#endif + pgd = pgd_offset_k(vaddr); + + do { + pmd_t *pmd; + unsigned long end2; + + if((pmd = pmd_alloc_kernel(pgd, vaddr)) == NULL) { + ret = -ENOMEM; + goto out; + } + + if((end & PGDIR_MASK) > (vaddr & PGDIR_MASK)) + end2 = (vaddr + (PGDIR_SIZE-1)) & PGDIR_MASK; + else + end2 = end; + + do { + pte_t *pte; + unsigned long end3; + + if((pte = pte_alloc_kernel(pmd, vaddr)) == NULL) { + ret = -ENOMEM; + goto out; + } + + if((end2 & PMD_MASK) > (vaddr & PMD_MASK)) + end3 = (vaddr + (PMD_SIZE-1)) & PMD_MASK; + else + end3 = end2; + + do { +#ifdef DEBUG + printk("mapping %08lx phys to %08lx\n", + __pa(kaddr), vaddr); +#endif + set_pte(pte, __mk_pte(kaddr, PAGE_KERNEL)); + pte++; + kaddr += PAGE_SIZE; + vaddr += PAGE_SIZE; + } while(vaddr < end3); + + } while(vaddr < end2); + + } while(vaddr < end); + + flush_tlb_all(); -found: - for (scan = base; scan < base+npages; scan++) { - dvma_entry_set(scan+dvma_slow_offset, paddr); - paddr += DVMA_PAGE_SIZE; - set_bit(scan, dvma_map); - } - return (dvma_entry_vaddr((base+dvma_slow_offset),paddr)); + out: + return ret; } -unsigned long dvma_alloc (unsigned long paddr, unsigned long size) + +inline int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, + int len) { - int index; - int pages = ((paddr & ~DVMA_PAGE_MASK) + size + (DVMA_PAGE_SIZE-1)) >> - DVMA_PAGE_SHIFT; - - if (fixed_dvma) - return ((unsigned long)phys_to_virt (paddr)); - - if (pages > 1) /* multi page, allocate from slow pool */ - return dvma_slow_alloc (paddr, pages); - - index = dvma_entry_hash (paddr); - - if (dvma_entry_use(index)) { - if (dvma_entry_paddr(index) == (paddr & DVMA_PAGE_MASK)) { - dvma_entry_inc(index); - return dvma_entry_vaddr(index,paddr); + unsigned long end, index; + + index = baddr >> DVMA_PAGE_SHIFT; + end = ((baddr+len) >> DVMA_PAGE_SHIFT); + + if(len & ~DVMA_PAGE_MASK) + end++; + + for(; index < end ; index++) { +// if(dvma_entry_use(index)) +// BUG(); +// printk("mapping pa %lx to ba %lx\n", __pa(kaddr), index << DVMA_PAGE_SHIFT); + + dvma_entry_set(index, __pa(kaddr)); + + iommu_pte[index] |= IOMMU_FULL_BLOCK; +// dvma_entry_inc(index); + + kaddr += DVMA_PAGE_SIZE; } - /* collision, allocate from slow pool */ - return dvma_slow_alloc (paddr, pages); - } - - dvma_entry_set(index,paddr); - dvma_entry_inc(index); - return dvma_entry_vaddr(index,paddr); + +#ifdef DEBUG + for(index = (baddr >> DVMA_PAGE_SHIFT); index < end; index++) + dvma_print(index << DVMA_PAGE_SHIFT); +#endif + return 0; + } -void dvma_free (unsigned long dvma_addr, unsigned long size) +void dvma_unmap_iommu(unsigned long baddr, int len) { - int npages; - int index; - - if (fixed_dvma) - return; - - if (!dvma_is_slow(dvma_addr)) { - index = (dvma_addr >> DVMA_PAGE_SHIFT); - if (dvma_entry_use(index) == 0) { - printk ("dvma_free: %lx entry already free\n",dvma_addr); - return; + + int index, end; + + + index = baddr >> DVMA_PAGE_SHIFT; + end = (DVMA_PAGE_ALIGN(baddr+len) >> DVMA_PAGE_SHIFT); + + for(; index < end ; index++) { +#ifdef DEBUG + printk("freeing bus mapping %08x\n", index << DVMA_PAGE_SHIFT); +#endif +#if 0 + if(!dvma_entry_use(index)) + printk("dvma_unmap freeing unused entry %04x\n", + index); + else + dvma_entry_dec(index); +#endif + dvma_entry_clr(index); } - dvma_entry_dec(index); - if (dvma_entry_use(index) == 0) - dvma_entry_clr(index); - return; - } - - /* free in slow pool */ - npages = ((dvma_addr & ~DVMA_PAGE_MASK) + size + (DVMA_PAGE_SIZE-1)) >> - DVMA_PAGE_SHIFT; - for (index = (dvma_addr >> DVMA_PAGE_SHIFT); npages--; index++) { - dvma_entry_clr(index); - clear_bit (index,dvma_map); - } + } + diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3x/prom.c linux/arch/m68k/sun3x/prom.c --- v2.4.5/linux/arch/m68k/sun3x/prom.c Wed Dec 31 16:00:00 1969 +++ linux/arch/m68k/sun3x/prom.c Tue Jun 5 18:27:20 2001 @@ -0,0 +1,165 @@ +/* Prom access routines for the sun3x */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void (*sun3x_putchar)(int); +int (*sun3x_getchar)(void); +int (*sun3x_mayget)(void); +int (*sun3x_mayput)(int); +void (*sun3x_prom_reboot)(void); +e_vector sun3x_prom_abort; +struct idprom *idprom; +static struct idprom idprom_buffer; +struct linux_romvec *romvec; + +/* prom vector table */ +e_vector *sun3x_prom_vbr; + +extern e_vector vectors[256]; /* arch/m68k/kernel/traps.c */ + +/* Handle returning to the prom */ +void sun3x_halt(void) +{ + unsigned long flags; + + /* Disable interrupts while we mess with things */ + save_flags(flags); cli(); + + /* Restore prom vbr */ + __asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr)); + + /* Restore prom NMI clock */ +// sun3x_disable_intreg(5); + sun3_enable_irq(7); + + /* Let 'er rip */ + __asm__ volatile ("trap #14" : : ); + + /* Restore everything */ + sun3_disable_irq(7); + sun3_enable_irq(5); + + __asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)vectors)); + restore_flags(flags); +} + +void sun3x_reboot(void) +{ + /* This never returns, don't bother saving things */ + cli(); + + /* Restore prom vbr */ + __asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr)); + + /* Restore prom NMI clock */ + sun3_disable_irq(5); + sun3_enable_irq(7); + + /* Let 'er rip */ + (*romvec->pv_reboot)("vmlinux"); +} + +extern char m68k_debug_device[]; + +static void sun3x_prom_write(struct console *co, const char *s, + unsigned int count) +{ + while (count--) { + if (*s == '\n') + sun3x_putchar('\r'); + sun3x_putchar(*s++); + } +} + +/* debug console - write-only */ + +static struct console sun3x_debug = { + "debug", + sun3x_prom_write, /* write */ + NULL, /* read */ + NULL, /* device */ + NULL, /* wait_key */ + NULL, /* unblank */ + NULL, /* setup */ + CON_PRINTBUFFER, + -1, + 0, + NULL +}; + +void sun3x_prom_init(void) +{ + /* Read the vector table */ + int i; + + + sun3x_putchar = *(void (**)(int)) (SUN3X_P_PUTCHAR); + sun3x_getchar = *(int (**)(void)) (SUN3X_P_GETCHAR); + sun3x_mayget = *(int (**)(void)) (SUN3X_P_MAYGET); + sun3x_mayput = *(int (**)(int)) (SUN3X_P_MAYPUT); + sun3x_prom_reboot = *(void (**)(void)) (SUN3X_P_REBOOT); + sun3x_prom_abort = *(e_vector *) (SUN3X_P_ABORT); + romvec = (struct linux_romvec *)SUN3X_PROM_BASE; + + /* make a copy of the idprom structure */ + for(i = 0; i < sizeof(struct idprom); i++) + ((unsigned char *)(&idprom_buffer))[i] = ((unsigned char *)SUN3X_IDPROM)[i]; + idprom = &idprom_buffer; + + if((idprom->id_machtype & SM_ARCH_MASK) != SM_SUN3X) { + printk("Warning: machine reports strange type %02x\n"); + printk("Pretending it's a 3/80, but very afraid...\n"); + idprom->id_machtype = SM_SUN3X | SM_3_80; + } + + /* point trap #14 at abort. + * XXX this is futile since we restore the vbr first - oops + */ + vectors[VEC_TRAP14] = sun3x_prom_abort; + + /* If debug=prom was specified, start the debug console */ + + if (!strcmp(m68k_debug_device, "prom")) + register_console(&sun3x_debug); + + +} + +/* some prom functions to export */ +int prom_getintdefault(int node, char *property, int deflt) +{ + return deflt; +} + +int prom_getbool (int node, char *prop) +{ + return 1; +} + +void prom_printf(char *fmt, ...) +{ + +} + +void prom_halt (void) +{ + sun3x_halt(); +} diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3x/sbus.c linux/arch/m68k/sun3x/sbus.c --- v2.4.5/linux/arch/m68k/sun3x/sbus.c Thu Aug 26 12:42:31 1999 +++ linux/arch/m68k/sun3x/sbus.c Wed Dec 31 16:00:00 1969 @@ -1,44 +0,0 @@ -/* - * SBus helper functions - * - * Sun3x don't have a sbus, but many of the used devices are also - * used on Sparc machines with sbus. To avoid having a lot of - * duplicate code, we provide necessary glue stuff to make using - * of the sbus driver code possible. - * - * (C) 1999 Thomas Bogendoerfer (tsbogend@alpha.franken.de) - */ - -#include -#include - -void __init sbus_init(void) -{ - -} - -void *sparc_alloc_io (u32 address, void *virtual, int len, char *name, - u32 bus_type, int rdonly) -{ - return (void *)address; -} - -int prom_getintdefault(int node, char *property, int deflt) -{ - return deflt; -} - -int prom_getbool (int node, char *prop) -{ - return 1; -} - -void prom_printf(char *fmt, ...) -{ - -} - -void prom_halt (void) -{ - -} diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3x/sun3x_ksyms.c linux/arch/m68k/sun3x/sun3x_ksyms.c --- v2.4.5/linux/arch/m68k/sun3x/sun3x_ksyms.c Wed Dec 31 16:00:00 1969 +++ linux/arch/m68k/sun3x/sun3x_ksyms.c Tue Jun 5 18:27:20 2001 @@ -0,0 +1,13 @@ +#include +#include +#include +#include + +/* + * Add things here when you find the need for it. + */ +EXPORT_SYMBOL(dvma_map_align); +EXPORT_SYMBOL(dvma_unmap); +EXPORT_SYMBOL(dvma_malloc_align); +EXPORT_SYMBOL(dvma_free); +EXPORT_SYMBOL(idprom); diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3x/time.c linux/arch/m68k/sun3x/time.c --- v2.4.5/linux/arch/m68k/sun3x/time.c Thu Aug 26 12:42:31 1999 +++ linux/arch/m68k/sun3x/time.c Tue Jun 5 18:27:20 2001 @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -15,6 +16,8 @@ #include #include #include +#include +#include #include "time.h" @@ -33,6 +36,7 @@ #define C_CALIB 0x1f #define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10) +#define BIN_TO_BCD(val) (((val/10) << 4) | (val % 10)) /* Read the Mostek */ void sun3x_gettod (int *yearp, int *monp, int *dayp, @@ -45,7 +49,7 @@ /* Read values */ *yearp = BCD_TO_BIN(*(eeprom + M_YEAR)); - *monp = BCD_TO_BIN(*(eeprom + M_MONTH)); + *monp = BCD_TO_BIN(*(eeprom + M_MONTH)) +1; *dayp = BCD_TO_BIN(*(eeprom + M_DATE)); *hourp = BCD_TO_BIN(*(eeprom + M_HOUR)); *minp = BCD_TO_BIN(*(eeprom + M_MIN)); @@ -55,6 +59,40 @@ *(eeprom + M_CONTROL) &= ~C_READ; } +int sun3x_hwclk(int set, struct hwclk_time *t) +{ + volatile struct mostek_dt *h = + (unsigned char *)(SUN3X_EEPROM+M_CONTROL); + unsigned long flags; + + save_and_cli(flags); + + if(set) { + h->csr |= C_WRITE; + h->sec = BIN_TO_BCD(t->sec); + h->min = BIN_TO_BCD(t->min); + h->hour = BIN_TO_BCD(t->hour); + h->wday = BIN_TO_BCD(t->wday); + h->mday = BIN_TO_BCD(t->day); + h->month = BIN_TO_BCD(t->mon); + h->year = BIN_TO_BCD(t->year); + h->csr &= ~C_WRITE; + } else { + h->csr |= C_READ; + t->sec = BCD_TO_BIN(h->sec); + t->min = BCD_TO_BIN(h->min); + t->hour = BCD_TO_BIN(h->hour); + t->wday = BCD_TO_BIN(h->wday); + t->day = BCD_TO_BIN(h->mday); + t->mon = BCD_TO_BIN(h->month); + t->year = BCD_TO_BIN(h->year); + h->csr &= ~C_READ; + } + + restore_flags(flags); + + return 0; +} /* Not much we can do here */ unsigned long sun3x_gettimeoffset (void) { @@ -74,9 +112,12 @@ void __init sun3x_sched_init(void (*vector)(int, void *, struct pt_regs *)) { - sys_request_irq(5, sun3x_timer_tick, IRQ_FLG_STD, "timer tick", vector); + + sun3_disable_interrupts(); + /* Pulse enable low to get the clock started */ - disable_irq(5); - enable_irq(5); + sun3_disable_irq(5); + sun3_enable_irq(5); + sun3_enable_interrupts(); } diff -u --recursive --new-file v2.4.5/linux/arch/m68k/sun3x/time.h linux/arch/m68k/sun3x/time.h --- v2.4.5/linux/arch/m68k/sun3x/time.h Tue May 11 09:57:14 1999 +++ linux/arch/m68k/sun3x/time.h Tue Jun 5 18:27:20 2001 @@ -1,9 +1,21 @@ #ifndef SUN3X_TIME_H #define SUN3X_TIME_H -void sun3x_gettod (int *yearp, int *monp, int *dayp, +extern void sun3x_gettod (int *yearp, int *monp, int *dayp, int *hourp, int *minp, int *secp); +extern int sun3x_hwclk(int set, struct hwclk_time *t); unsigned long sun3x_gettimeoffset (void); void sun3x_sched_init(void (*vector)(int, void *, struct pt_regs *)); + +struct mostek_dt { + volatile unsigned char csr; + volatile unsigned char sec; + volatile unsigned char min; + volatile unsigned char hour; + volatile unsigned char wday; + volatile unsigned char mday; + volatile unsigned char month; + volatile unsigned char year; +}; #endif diff -u --recursive --new-file v2.4.5/linux/arch/ppc/boot/common/misc-common.c linux/arch/ppc/boot/common/misc-common.c --- v2.4.5/linux/arch/ppc/boot/common/misc-common.c Fri May 25 18:28:53 2001 +++ linux/arch/ppc/boot/common/misc-common.c Thu Jun 7 00:16:57 2001 @@ -268,7 +268,7 @@ s.zfree = zfree; r = inflateInit2(&s, -MAX_WBITS); if (r != Z_OK) { - puts("inflateInit2 returned %d\n"); + puts("inflateInit2 returned "); puthex(r); puts("\n"); exit(); } s.next_in = src + i; @@ -277,7 +277,7 @@ s.avail_out = dstlen; r = inflate(&s, Z_FINISH); if (r != Z_OK && r != Z_STREAM_END) { - puts("inflate returned %d\n"); + puts("inflate returned "); puthex(r); puts("\n"); exit(); } *lenp = s.next_out - (unsigned char *) dst; diff -u --recursive --new-file v2.4.5/linux/arch/ppc/boot/mbx/Makefile linux/arch/ppc/boot/mbx/Makefile --- v2.4.5/linux/arch/ppc/boot/mbx/Makefile Fri May 25 18:28:53 2001 +++ linux/arch/ppc/boot/mbx/Makefile Thu Jun 7 00:16:57 2001 @@ -1,4 +1,4 @@ -# BK Id: SCCS/s.Makefile 1.5 05/18/01 06:20:29 patch +# BK Id: SCCS/s.Makefile 1.7 06/05/01 20:20:05 paulus # # # arch/ppc/mbxboot/Makefile @@ -87,13 +87,21 @@ $(OBJCOPY) $(OBJCOPY_ARGS) -R .comment \ --add-section=initrd=../images/ramdisk.image.gz \ --add-section=image=../images/vmlinux.gz \ - $@.tmp ../images/$@.mbx + $@.tmp ../images/$@.embedded zImage: zvmlinux - ln -sf zvmlinux.mbx ../images/zImage.mbx +ifeq ($(CONFIG_RPXCLASSIC),y) + dd if=../images/zvmlinux.embedded of=../images/zImage.embedded bs=65536 skip=1 +else + ln -sf ../images/zvmlinux.embedded ../images/zImage.embedded +endif zImage.initrd: zvmlinux.initrd - ln -sf zvmlinux.initrd.mbx ../images/zImage.initrd.mbx +ifeq ($(CONFIG_RPXCLASSIC),y) + dd if=../images/zvmlinux.initrd.embedded of=../images/zImage.initrd.embedded bs=65536 skip=1 +else + ln -sf ../images/zvmlinux.initrd.embedded ../images/zImage.initrd.embedded +endif zvmlinux: $(OBJECTS) $(LIBS) ../images/vmlinux.gz # @@ -114,14 +122,14 @@ $(LD) $(ZLINKFLAGS) -o $@.tmp $(OBJECTS) $(LIBS) $(OBJCOPY) $(OBJCOPY_ARGS) -R .comment \ --add-section=image=../images/vmlinux.gz \ - $@.tmp ../images/$@.mbx -# Remove zvmlinux and zvmlinux.temp, we have ../images/zvmlinux.mbx + $@.tmp ../images/$@.embedded +# Remove zvmlinux and zvmlinux.temp, we have ../images/zvmlinux.embedded rm -f $@.tmp $@ znetboot : zImage - cp ../images/zImage.mbx $(TFTPIMAGE) + cp ../images/zImage.embedded $(TFTPIMAGE) znetboot.initrd : zImage.initrd - cp ../images/zImage.initrd.mbx $(TFTPIMAGE) + cp ../images/zImage.initrd.embedded $(TFTPIMAGE) include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.5/linux/arch/ppc/boot/pmac/Makefile linux/arch/ppc/boot/pmac/Makefile --- v2.4.5/linux/arch/ppc/boot/pmac/Makefile Fri May 25 18:28:53 2001 +++ linux/arch/ppc/boot/pmac/Makefile Thu Jun 7 00:16:57 2001 @@ -1,4 +1,4 @@ -# BK Id: SCCS/s.Makefile 1.8 05/21/01 09:10:38 trini +# BK Id: SCCS/s.Makefile 1.10 06/05/01 20:22:51 paulus # # Makefile for making XCOFF bootable images for booting on PowerMacs # using Open Firmware. @@ -7,7 +7,7 @@ # # Cleaned up, moved into arch/ppc/boot/pmac # Tom Rini January 2001 - + OBJCOPY_ARGS = -O aixcoff-rs6000 -R .stab -R .stabstr -R .comment COFF_LD_ARGS = -e _start -T ld.script -Ttext 500000 -Tdata 510000 -Bstatic CHRP_LD_ARGS = -Ttext 0x01000000 diff -u --recursive --new-file v2.4.5/linux/arch/ppc/boot/prep/misc.c linux/arch/ppc/boot/prep/misc.c --- v2.4.5/linux/arch/ppc/boot/prep/misc.c Fri May 25 18:28:53 2001 +++ linux/arch/ppc/boot/prep/misc.c Thu Jun 7 00:16:57 2001 @@ -1,5 +1,5 @@ /* - * BK Id: SCCS/s.misc.c 1.8 05/18/01 06:20:29 patch + * BK Id: SCCS/s.misc.c 1.10 06/05/01 20:20:05 paulus */ /* * misc.c @@ -393,7 +393,7 @@ { struct bi_record *rec; - rec = (struct bi_record *)PAGE_ALIGN(zimage_size); + rec = (struct bi_record *)_ALIGN((unsigned long)(zimage_size)+(1<<20)-1,(1<<20)); rec->tag = BI_FIRST; rec->size = sizeof(struct bi_record); @@ -406,8 +406,8 @@ rec->tag = BI_MACHTYPE; rec->data[0] = _MACH_prep; - rec->data[1] = 1; - rec->size = sizeof(struct bi_record) + sizeof(unsigned long); + rec->data[1] = 0; + rec->size = sizeof(struct bi_record) + 2 * sizeof(unsigned long); rec = (struct bi_record *)((unsigned long)rec + rec->size); rec->tag = BI_CMD_LINE; diff -u --recursive --new-file v2.4.5/linux/arch/ppc/config.in linux/arch/ppc/config.in --- v2.4.5/linux/arch/ppc/config.in Fri May 25 18:28:53 2001 +++ linux/arch/ppc/config.in Tue Jun 5 18:11:40 2001 @@ -365,6 +365,10 @@ source drivers/usb/Config.in +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + source net/bluetooth/Config.in +fi + mainmenu_option next_comment comment 'Kernel hacking' diff -u --recursive --new-file v2.4.5/linux/arch/ppc/kernel/Makefile linux/arch/ppc/kernel/Makefile --- v2.4.5/linux/arch/ppc/kernel/Makefile Fri May 25 18:28:54 2001 +++ linux/arch/ppc/kernel/Makefile Thu Jun 7 00:16:57 2001 @@ -1,4 +1,4 @@ -# BK Id: SCCS/s.Makefile 1.17 05/21/01 00:48:24 cort +# BK Id: SCCS/s.Makefile 1.19 05/26/01 14:48:14 paulus # # # Makefile for the linux kernel. @@ -32,7 +32,7 @@ export-objs := ppc_ksyms.o prep_setup.o obj-y := entry.o traps.o irq.o idle.o time.o misc.o \ - process.o signal.o bitops.o ptrace.o \ + process.o signal.o ptrace.o \ ppc_htab.o semaphore.o syscalls.o \ align.o setup.o obj-$(CONFIG_MODULES) += ppc_ksyms.o diff -u --recursive --new-file v2.4.5/linux/arch/ppc/kernel/chrp_setup.c linux/arch/ppc/kernel/chrp_setup.c --- v2.4.5/linux/arch/ppc/kernel/chrp_setup.c Fri May 25 18:28:54 2001 +++ linux/arch/ppc/kernel/chrp_setup.c Thu Jun 7 00:16:57 2001 @@ -1,5 +1,5 @@ /* - * BK Id: SCCS/s.chrp_setup.c 1.17 05/17/01 18:14:21 cort + * BK Id: SCCS/s.chrp_setup.c 1.20 06/05/01 21:22:02 paulus */ /* * linux/arch/ppc/kernel/setup.c @@ -204,13 +204,10 @@ active = sio_read(0x30); level0 = sio_read(0x70); type0 = sio_read(0x71); - printk("sio: %s irq level %d, type %d, %sactive: ", name, level0, - type0, !active ? "in" : ""); - if (level0 == level && type0 == type && active) - printk("OK\n"); - else { - printk("remapping to level %d, type %d, active\n", level, - type); + if (level0 != level || type0 != type || !active) { + printk(KERN_WARNING "sio: %s irq level %d, type %d, %sactive: " + "remapping to level %d, type %d, active\n", + name, level0, type0, !active ? "in" : "", level, type); sio_write(0x01, 0x30); sio_write(level, 0x70); sio_write(type, 0x71); diff -u --recursive --new-file v2.4.5/linux/arch/ppc/kernel/irq.c linux/arch/ppc/kernel/irq.c --- v2.4.5/linux/arch/ppc/kernel/irq.c Fri May 25 18:28:54 2001 +++ linux/arch/ppc/kernel/irq.c Thu Jun 7 00:16:57 2001 @@ -1,5 +1,5 @@ /* - * BK Id: SCCS/s.irq.c 1.23 05/17/01 18:14:21 cort + * BK Id: SCCS/s.irq.c 1.26 06/06/01 22:33:09 paulus */ /* * arch/ppc/kernel/irq.c @@ -551,6 +551,9 @@ ppc_irq_dispatch_handler( regs, irq ); out: hardirq_exit( cpu ); + + if (softirq_pending(cpu)) + do_softirq(); return 1; /* lets ret_from_int know we can do checks */ } diff -u --recursive --new-file v2.4.5/linux/arch/ppc/kernel/prom.c linux/arch/ppc/kernel/prom.c --- v2.4.5/linux/arch/ppc/kernel/prom.c Fri May 25 18:28:54 2001 +++ linux/arch/ppc/kernel/prom.c Thu Jun 7 00:16:57 2001 @@ -1,5 +1,5 @@ /* - * BK Id: SCCS/s.prom.c 1.20 05/23/01 00:38:42 cort + * BK Id: SCCS/s.prom.c 1.23 06/06/01 22:49:01 paulus */ /* * Procedures for interfacing to the Open Firmware PROM on @@ -42,9 +42,11 @@ /* * Properties whose value is longer than this get excluded from our * copy of the device tree. This way we don't waste space storing - * things like "driver,AAPL,MacOS,PowerPC" properties. + * things like "driver,AAPL,MacOS,PowerPC" properties. But this value + * does need to be big enough to ensure that we don't lose things + * like the interrupt-map property on a PCI-PCI bridge. */ -#define MAX_PROPERTY_LENGTH 1024 +#define MAX_PROPERTY_LENGTH 4096 struct prom_args { const char *service; @@ -670,16 +672,16 @@ prom_alloc_htab(); #endif -#ifdef CONFIG_SMP - prom_hold_cpus(mem); -#endif - mem = check_display(mem); prom_print(RELOC("copying OF device tree...")); mem = copy_device_tree(mem, mem + (1<<20)); prom_print(RELOC("done\n")); +#ifdef CONFIG_SMP + prom_hold_cpus(mem); +#endif + RELOC(klimit) = (char *) (mem - offset); /* If we are already running at 0xc0000000, we assume we were loaded by @@ -1190,7 +1192,7 @@ if ((_machine == _MACH_chrp) || (boot_infos == 0 && pmac_newworld)) use_of_interrupt_tree = 1; - mem = finish_node(allnodes, mem, NULL, 0, 0); + mem = finish_node(allnodes, mem, NULL, 1, 1); dev_tree_size = mem - (unsigned long) allnodes; klimit = (char *) mem; } @@ -1225,10 +1227,7 @@ np->name = get_property(np, "name", 0); np->type = get_property(np, "device_type", 0); -#if 0 - np->n_addr_cells = naddrc; - np->n_size_cells = nsizec; -#endif + /* get the device addresses and interrupts */ if (ifunc != NULL) { mem_start = ifunc(np, mem_start, naddrc, nsizec); @@ -1244,16 +1243,6 @@ ip = (int *) get_property(np, "#size-cells", 0); if (ip != NULL) nsizec = *ip; -#if 0 - if (np->parent == NULL) { - /* - * Set the n_addr/size_cells on the root to its - * own values, rather than 0. - */ - np->n_addr_cells = naddrc; - np->n_size_cells = nsizec; - } -#endif /* the f50 sets the name to 'display' and 'compatible' to what we * expect for the name -- Cort @@ -1479,7 +1468,8 @@ if (ip != NULL) return *ip; } while(np->parent); - return 0; + /* No #address-cells property for the root node, default to 1 */ + return 1; } int @@ -1493,7 +1483,8 @@ if (ip != NULL) return *ip; } while(np->parent); - return 0; + /* No #size-cells property for the root node, default to 1 */ + return 1; } __init @@ -1980,7 +1971,7 @@ struct property *pp; for (pp = np->properties; pp != 0; pp = pp->next) { - if (name && strcmp(pp->name, name) == 0) { + if (pp->name != NULL && strcmp(pp->name, name) == 0) { if (lenp != 0) *lenp = pp->length; return pp->value; diff -u --recursive --new-file v2.4.5/linux/arch/ppc/kernel/smp.c linux/arch/ppc/kernel/smp.c --- v2.4.5/linux/arch/ppc/kernel/smp.c Fri May 25 18:28:54 2001 +++ linux/arch/ppc/kernel/smp.c Thu Jun 7 00:16:57 2001 @@ -1,5 +1,5 @@ /* - * BK Id: SCCS/s.smp.c 1.23 05/17/01 18:14:22 cort + * BK Id: SCCS/s.smp.c 1.25 05/23/01 00:38:42 cort */ /* * Smp support for ppc. @@ -670,12 +670,12 @@ static void smp_gemini_kick_cpu(int nr) { - openpic_init_processor( 1< #include +#include +#include + /* Use this to get at 32-bit user passed pointers. See sys_sparc32.c for description about these. */ #define A(__x) ((unsigned long)(__x)) @@ -3469,6 +3472,10 @@ COMPATIBLE_IOCTL(CDROM_LOCKDOOR) COMPATIBLE_IOCTL(CDROM_DEBUG) COMPATIBLE_IOCTL(CDROM_GET_CAPABILITY) +/* DVD ioctls */ +COMPATIBLE_IOCTL(DVD_READ_STRUCT) +COMPATIBLE_IOCTL(DVD_WRITE_STRUCT) +COMPATIBLE_IOCTL(DVD_AUTH) /* Big L */ COMPATIBLE_IOCTL(LOOP_SET_FD) COMPATIBLE_IOCTL(LOOP_CLR_FD) @@ -3719,6 +3726,17 @@ COMPATIBLE_IOCTL(WIOCSTART) COMPATIBLE_IOCTL(WIOCSTOP) COMPATIBLE_IOCTL(WIOCGSTAT) +/* Bluetooth ioctls */ +COMPATIBLE_IOCTL(HCIDEVUP) +COMPATIBLE_IOCTL(HCIDEVDOWN) +COMPATIBLE_IOCTL(HCIDEVRESET) +COMPATIBLE_IOCTL(HCIRESETSTAT) +COMPATIBLE_IOCTL(HCIGETINFO) +COMPATIBLE_IOCTL(HCIGETDEVLIST) +COMPATIBLE_IOCTL(HCISETRAW) +COMPATIBLE_IOCTL(HCISETSCAN) +COMPATIBLE_IOCTL(HCISETAUTH) +COMPATIBLE_IOCTL(HCIINQUIRY) /* Misc. */ COMPATIBLE_IOCTL(0x41545900) /* ATYIO_CLKR */ COMPATIBLE_IOCTL(0x41545901) /* ATYIO_CLKW */ diff -u --recursive --new-file v2.4.5/linux/arch/sparc64/kernel/irq.c linux/arch/sparc64/kernel/irq.c --- v2.4.5/linux/arch/sparc64/kernel/irq.c Thu Apr 26 22:17:25 2001 +++ linux/arch/sparc64/kernel/irq.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: irq.c,v 1.100 2001/04/24 01:09:12 davem Exp $ +/* $Id: irq.c,v 1.101 2001/06/04 06:50:18 ecd Exp $ * irq.c: UltraSparc IRQ handling/init/registry. * * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) @@ -783,6 +783,8 @@ unsigned char flags = bp->flags; nbp = __bucket(bp->irq_chain); + bp->irq_chain = 0; + if ((flags & IBF_ACTIVE) != 0) { #ifdef CONFIG_PCI if ((flags & IBF_DMA_SYNC) != 0) { diff -u --recursive --new-file v2.4.5/linux/arch/sparc64/kernel/pci_psycho.c linux/arch/sparc64/kernel/pci_psycho.c --- v2.4.5/linux/arch/sparc64/kernel/pci_psycho.c Fri May 25 18:28:54 2001 +++ linux/arch/sparc64/kernel/pci_psycho.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: pci_psycho.c,v 1.24 2001/05/15 08:54:30 davem Exp $ +/* $Id: pci_psycho.c,v 1.25 2001/06/04 23:20:32 ecd Exp $ * pci_psycho.c: PSYCHO/U2P specific PCI controller support. * * Copyright (C) 1997, 1998, 1999 David S. Miller (davem@caipfs.rutgers.edu) @@ -353,23 +353,28 @@ if (ret == 0 && pdev == NULL) { ret = 1; } else if (ret == 0) { - switch ((pdev->class >> 16) & 0x0f) { + switch ((pdev->class >> 16) & 0xff) { case PCI_BASE_CLASS_STORAGE: ret = 4; + break; case PCI_BASE_CLASS_NETWORK: ret = 6; + break; case PCI_BASE_CLASS_DISPLAY: ret = 9; + break; case PCI_BASE_CLASS_MULTIMEDIA: case PCI_BASE_CLASS_MEMORY: case PCI_BASE_CLASS_BRIDGE: ret = 10; + break; default: ret = 1; + break; }; } diff -u --recursive --new-file v2.4.5/linux/arch/sparc64/kernel/pci_sabre.c linux/arch/sparc64/kernel/pci_sabre.c --- v2.4.5/linux/arch/sparc64/kernel/pci_sabre.c Fri May 25 18:28:54 2001 +++ linux/arch/sparc64/kernel/pci_sabre.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: pci_sabre.c,v 1.32 2001/05/15 11:10:01 davem Exp $ +/* $Id: pci_sabre.c,v 1.33 2001/06/04 23:20:32 ecd Exp $ * pci_sabre.c: Sabre specific PCI controller support. * * Copyright (C) 1997, 1998, 1999 David S. Miller (davem@caipfs.rutgers.edu) @@ -590,23 +590,28 @@ if (ret == 0 && pdev == NULL) { ret = 1; } else if (ret == 0) { - switch ((pdev->class >> 16) & 0x0f) { + switch ((pdev->class >> 16) & 0xff) { case PCI_BASE_CLASS_STORAGE: ret = 4; + break; case PCI_BASE_CLASS_NETWORK: ret = 6; + break; case PCI_BASE_CLASS_DISPLAY: ret = 9; + break; case PCI_BASE_CLASS_MULTIMEDIA: case PCI_BASE_CLASS_MEMORY: case PCI_BASE_CLASS_BRIDGE: ret = 10; + break; default: ret = 1; + break; }; } return ret; diff -u --recursive --new-file v2.4.5/linux/arch/sparc64/kernel/pci_schizo.c linux/arch/sparc64/kernel/pci_schizo.c --- v2.4.5/linux/arch/sparc64/kernel/pci_schizo.c Fri May 25 18:28:54 2001 +++ linux/arch/sparc64/kernel/pci_schizo.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: pci_schizo.c,v 1.16 2001/05/15 08:54:30 davem Exp $ +/* $Id: pci_schizo.c,v 1.17 2001/06/04 23:20:32 ecd Exp $ * pci_schizo.c: SCHIZO specific PCI controller support. * * Copyright (C) 2001 David S. Miller (davem@redhat.com) @@ -339,23 +339,28 @@ if (ret == 0 && pdev == NULL) { ret = 1; } else if (ret == 0) { - switch ((pdev->class >> 16) & 0x0f) { + switch ((pdev->class >> 16) & 0xff) { case PCI_BASE_CLASS_STORAGE: ret = 4; + break; case PCI_BASE_CLASS_NETWORK: ret = 6; + break; case PCI_BASE_CLASS_DISPLAY: ret = 9; + break; case PCI_BASE_CLASS_MULTIMEDIA: case PCI_BASE_CLASS_MEMORY: case PCI_BASE_CLASS_BRIDGE: ret = 10; + break; default: ret = 1; + break; }; } diff -u --recursive --new-file v2.4.5/linux/arch/sparc64/kernel/process.c linux/arch/sparc64/kernel/process.c --- v2.4.5/linux/arch/sparc64/kernel/process.c Thu Apr 12 12:10:25 2001 +++ linux/arch/sparc64/kernel/process.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.117 2001/03/30 07:10:41 davem Exp $ +/* $Id: process.c,v 1.118 2001/06/03 13:41:13 ecd Exp $ * arch/sparc64/kernel/process.c * * Copyright (C) 1995, 1996 David S. Miller (davem@caip.rutgers.edu) @@ -111,6 +111,7 @@ extern void (*prom_palette)(int); extern int serial_console; #endif +extern void (*prom_keyboard)(void); void machine_halt(void) { @@ -121,6 +122,8 @@ if (!serial_console && prom_palette) prom_palette (1); #endif + if (prom_keyboard) + prom_keyboard(); prom_halt(); panic("Halt failed!"); } @@ -139,6 +142,8 @@ if (!serial_console && prom_palette) prom_palette (1); #endif + if (prom_keyboard) + prom_keyboard(); if (cmd) prom_reboot(cmd); if (*reboot_command) diff -u --recursive --new-file v2.4.5/linux/arch/sparc64/kernel/setup.c linux/arch/sparc64/kernel/setup.c --- v2.4.5/linux/arch/sparc64/kernel/setup.c Thu Apr 26 22:17:25 2001 +++ linux/arch/sparc64/kernel/setup.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: setup.c,v 1.64 2001/04/24 21:10:05 davem Exp $ +/* $Id: setup.c,v 1.65 2001/06/03 13:41:13 ecd Exp $ * linux/arch/sparc64/kernel/setup.c * * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu) @@ -64,6 +64,7 @@ #if CONFIG_SUN_CONSOLE void (*prom_palette)(int); #endif +void (*prom_keyboard)(void); asmlinkage void sys_sync(void); /* it's really int */ static void diff -u --recursive --new-file v2.4.5/linux/arch/sparc64/kernel/sparc64_ksyms.c linux/arch/sparc64/kernel/sparc64_ksyms.c --- v2.4.5/linux/arch/sparc64/kernel/sparc64_ksyms.c Fri May 25 18:28:54 2001 +++ linux/arch/sparc64/kernel/sparc64_ksyms.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: sparc64_ksyms.c,v 1.107 2001/05/18 08:01:35 davem Exp $ +/* $Id: sparc64_ksyms.c,v 1.108 2001/06/05 03:39:50 davem Exp $ * arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -184,6 +185,9 @@ EXPORT_SYMBOL(mostek_lock); EXPORT_SYMBOL(mstk48t02_regs); EXPORT_SYMBOL(request_fast_irq); +#if CONFIG_SUN_AUXIO +EXPORT_SYMBOL(auxio_register); +#endif #if CONFIG_SBUS EXPORT_SYMBOL(sbus_root); EXPORT_SYMBOL(dma_chain); diff -u --recursive --new-file v2.4.5/linux/drivers/Makefile linux/drivers/Makefile --- v2.4.5/linux/drivers/Makefile Fri May 25 18:28:54 2001 +++ linux/drivers/Makefile Tue Jun 5 18:11:41 2001 @@ -7,7 +7,8 @@ mod-subdirs := dio mtd sbus video macintosh usb input telephony sgi i2o ide \ - scsi md ieee1394 pnp isdn atm fc4 net/hamradio i2c acpi + scsi md ieee1394 pnp isdn atm fc4 net/hamradio i2c acpi \ + bluetooth subdir-y := parport char block net sound misc media cdrom subdir-m := $(subdir-y) @@ -42,6 +43,8 @@ subdir-$(CONFIG_HAMRADIO) += net/hamradio subdir-$(CONFIG_I2C) += i2c subdir-$(CONFIG_ACPI) += acpi + +subdir-$(CONFIG_BLUEZ) += bluetooth include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.5/linux/drivers/block/loop.c linux/drivers/block/loop.c --- v2.4.5/linux/drivers/block/loop.c Wed Apr 11 19:05:14 2001 +++ linux/drivers/block/loop.c Thu Jun 7 13:10:28 2001 @@ -651,8 +651,8 @@ inode->i_mapping->gfp_mask = GFP_BUFFER; bs = 0; - if (blksize_size[MAJOR(inode->i_rdev)]) - bs = blksize_size[MAJOR(inode->i_rdev)][MINOR(inode->i_rdev)]; + if (blksize_size[MAJOR(lo_device)]) + bs = blksize_size[MAJOR(lo_device)][MINOR(lo_device)]; if (!bs) bs = BLOCK_SIZE; diff -u --recursive --new-file v2.4.5/linux/drivers/bluetooth/Config.in linux/drivers/bluetooth/Config.in --- v2.4.5/linux/drivers/bluetooth/Config.in Wed Dec 31 16:00:00 1969 +++ linux/drivers/bluetooth/Config.in Tue Jun 5 18:11:41 2001 @@ -0,0 +1,8 @@ +mainmenu_option next_comment +comment 'Bluetooth device drivers' + +dep_tristate 'HCI USB driver' CONFIG_BLUEZ_HCIUSB $CONFIG_BLUEZ $CONFIG_USB +dep_tristate 'HCI UART driver' CONFIG_BLUEZ_HCIUART $CONFIG_BLUEZ +dep_tristate 'HCI EMU (virtual device) driver' CONFIG_BLUEZ_HCIEMU $CONFIG_BLUEZ + +endmenu diff -u --recursive --new-file v2.4.5/linux/drivers/bluetooth/Makefile linux/drivers/bluetooth/Makefile --- v2.4.5/linux/drivers/bluetooth/Makefile Wed Dec 31 16:00:00 1969 +++ linux/drivers/bluetooth/Makefile Tue Jun 5 18:11:41 2001 @@ -0,0 +1,11 @@ +# +# Makefile for Bluetooth HCI device drivers. +# + +O_TARGET := bluetooth.o + +obj-$(CONFIG_BLUEZ_HCIUSB) += hci_usb.o +obj-$(CONFIG_BLUEZ_HCIUART) += hci_uart.o +obj-$(CONFIG_BLUEZ_HCIEMU) += hci_emu.o + +include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.5/linux/drivers/bluetooth/hci_emu.c linux/drivers/bluetooth/hci_emu.c --- v2.4.5/linux/drivers/bluetooth/hci_emu.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/bluetooth/hci_emu.c Tue Jun 5 18:11:41 2001 @@ -0,0 +1,335 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ HCI virtual device driver. + * + * $Id: hci_emu.c,v 1.1 2001/06/01 08:12:10 davem Exp $ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +/* HCI device part */ + +int hci_emu_open(struct hci_dev *hdev) +{ + hdev->flags |= HCI_RUNNING; + return 0; +} + +int hci_emu_flush(struct hci_dev *hdev) +{ + struct hci_emu_struct *hci_emu = (struct hci_emu_struct *) hdev->driver_data; + bluez_skb_queue_purge(&hci_emu->readq); + return 0; +} + +int hci_emu_close(struct hci_dev *hdev) +{ + hdev->flags &= ~HCI_RUNNING; + hci_emu_flush(hdev); + return 0; +} + +int hci_emu_send_frame(struct sk_buff *skb) +{ + struct hci_dev* hdev = (struct hci_dev *) skb->dev; + struct hci_emu_struct *hci_emu; + + if (!hdev) { + ERR("Frame for uknown device (hdev=NULL)"); + return -ENODEV; + } + + if (!(hdev->flags & HCI_RUNNING)) + return -EBUSY; + + hci_emu = (struct hci_emu_struct *) hdev->driver_data; + + memcpy(skb_push(skb, 1), &skb->pkt_type, 1); + skb_queue_tail(&hci_emu->readq, skb); + + if (hci_emu->flags & HCI_EMU_FASYNC) + kill_fasync(&hci_emu->fasync, SIGIO, POLL_IN); + wake_up_interruptible(&hci_emu->read_wait); + + return 0; +} + +/* Character device part */ + +/* Poll */ +static unsigned int hci_emu_chr_poll(struct file *file, poll_table * wait) +{ + struct hci_emu_struct *hci_emu = (struct hci_emu_struct *) file->private_data; + + poll_wait(file, &hci_emu->read_wait, wait); + + if (skb_queue_len(&hci_emu->readq)) + return POLLIN | POLLRDNORM; + + return POLLOUT | POLLWRNORM; +} + +/* Get packet from user space buffer(already verified) */ +static __inline__ ssize_t hci_emu_get_user(struct hci_emu_struct *hci_emu, const char *buf, size_t count) +{ + struct sk_buff *skb; + + if (count > HCI_EMU_MAX_FRAME) + return -EINVAL; + + if (!(skb = bluez_skb_alloc(count, GFP_KERNEL))) + return -ENOMEM; + + copy_from_user(skb_put(skb, count), buf, count); + + skb->dev = (void *) &hci_emu->hdev; + skb->pkt_type = *((__u8 *) skb->data); + skb_pull(skb, 1); + + hci_recv_frame(skb); + + return count; +} + +/* Write */ +static ssize_t hci_emu_chr_write(struct file * file, const char * buf, + size_t count, loff_t *pos) +{ + struct hci_emu_struct *hci_emu = (struct hci_emu_struct *) file->private_data; + + if (verify_area(VERIFY_READ, buf, count)) + return -EFAULT; + + return hci_emu_get_user(hci_emu, buf, count); +} + +/* Put packet to user space buffer(already verified) */ +static __inline__ ssize_t hci_emu_put_user(struct hci_emu_struct *hci_emu, + struct sk_buff *skb, char *buf, int count) +{ + int len = count, total = 0; + char *ptr = buf; + + len = MIN(skb->len, len); + copy_to_user(ptr, skb->data, len); + total += len; + + hci_emu->hdev.stat.byte_tx += len; + switch (skb->pkt_type) { + case HCI_COMMAND_PKT: + hci_emu->hdev.stat.cmd_tx++; + break; + + case HCI_ACLDATA_PKT: + hci_emu->hdev.stat.acl_tx++; + break; + + case HCI_SCODATA_PKT: + hci_emu->hdev.stat.cmd_tx++; + break; + }; + + return total; +} + +/* Read */ +static ssize_t hci_emu_chr_read(struct file * file, char * buf, size_t count, loff_t *pos) +{ + struct hci_emu_struct *hci_emu = (struct hci_emu_struct *) file->private_data; + DECLARE_WAITQUEUE(wait, current); + struct sk_buff *skb; + ssize_t ret = 0; + + add_wait_queue(&hci_emu->read_wait, &wait); + while (count) { + current->state = TASK_INTERRUPTIBLE; + + /* Read frames from device queue */ + if (!(skb = skb_dequeue(&hci_emu->readq))) { + if (file->f_flags & O_NONBLOCK) { + ret = -EAGAIN; + break; + } + if (signal_pending(current)) { + ret = -ERESTARTSYS; + break; + } + + /* Nothing to read, let's sleep */ + schedule(); + continue; + } + + if (!verify_area(VERIFY_WRITE, buf, count)) + ret = hci_emu_put_user(hci_emu, skb, buf, count); + else + ret = -EFAULT; + + bluez_skb_free(skb); + break; + } + + current->state = TASK_RUNNING; + remove_wait_queue(&hci_emu->read_wait, &wait); + + return ret; +} + +static loff_t hci_emu_chr_lseek(struct file * file, loff_t offset, int origin) +{ + return -ESPIPE; +} + +static int hci_emu_chr_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) +{ + return -EINVAL; +} + +static int hci_emu_chr_fasync(int fd, struct file *file, int on) +{ + struct hci_emu_struct *hci_emu = (struct hci_emu_struct *) file->private_data; + int ret; + + if ((ret = fasync_helper(fd, file, on, &hci_emu->fasync)) < 0) + return ret; + + if (on) + hci_emu->flags |= HCI_EMU_FASYNC; + else + hci_emu->flags &= ~HCI_EMU_FASYNC; + + return 0; +} + +static int hci_emu_chr_open(struct inode *inode, struct file * file) +{ + struct hci_emu_struct *hci_emu = NULL; + struct hci_dev *hdev; + + if (!(hci_emu = kmalloc(sizeof(struct hci_emu_struct), GFP_KERNEL))) + return -ENOMEM; + + memset(hci_emu, 0, sizeof(struct hci_emu_struct)); + + skb_queue_head_init(&hci_emu->readq); + init_waitqueue_head(&hci_emu->read_wait); + + /* Initialize and register HCI device */ + hdev = &hci_emu->hdev; + + hdev->type = HCI_EMU; + hdev->driver_data = hci_emu; + + hdev->open = hci_emu_open; + hdev->close = hci_emu_close; + hdev->flush = hci_emu_flush; + hdev->send = hci_emu_send_frame; + + if (hci_register_dev(hdev) < 0) { + kfree(hci_emu); + return -EBUSY; + } + + file->private_data = hci_emu; + return 0; +} + +static int hci_emu_chr_close(struct inode *inode, struct file *file) +{ + struct hci_emu_struct *hci_emu = (struct hci_emu_struct *) file->private_data; + + if (hci_unregister_dev(&hci_emu->hdev) < 0) { + ERR("Can't unregister HCI device %s", hci_emu->hdev.name); + } + + kfree(hci_emu); + file->private_data = NULL; + + return 0; +} + +static struct file_operations hci_emu_fops = { + owner: THIS_MODULE, + llseek: hci_emu_chr_lseek, + read: hci_emu_chr_read, + write: hci_emu_chr_write, + poll: hci_emu_chr_poll, + ioctl: hci_emu_chr_ioctl, + open: hci_emu_chr_open, + release:hci_emu_chr_close, + fasync: hci_emu_chr_fasync +}; + +static struct miscdevice hci_emu_miscdev= +{ + HCI_EMU_MINOR, + "hci_emu", + &hci_emu_fops +}; + +int __init hci_emu_init(void) +{ + INF("BlueZ HCI EMU driver ver %s Copyright (C) 2000,2001 Qualcomm Inc", + BLUEZ_VER); + INF("Written 2000,2001 by Maxim Krasnyansky "); + + if (misc_register(&hci_emu_miscdev)) { + ERR("Can't register misc device %d\n", HCI_EMU_MINOR); + return -EIO; + } + + return 0; +} + +void hci_emu_cleanup(void) +{ + misc_deregister(&hci_emu_miscdev); +} + +module_init(hci_emu_init); +module_exit(hci_emu_cleanup); diff -u --recursive --new-file v2.4.5/linux/drivers/bluetooth/hci_uart.c linux/drivers/bluetooth/hci_uart.c --- v2.4.5/linux/drivers/bluetooth/hci_uart.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/bluetooth/hci_uart.c Tue Jun 5 18:11:41 2001 @@ -0,0 +1,575 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ HCI UART driver. + * + * $Id: hci_uart.c,v 1.1 2001/06/01 08:12:10 davem Exp $ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#ifndef HCI_UART_DEBUG +#undef DBG +#define DBG( A... ) +#undef DMP +#define DMP( A... ) +#endif + +/* ------- Interface to HCI layer ------ */ +/* Initialize device */ +int n_hci_open(struct hci_dev *hdev) +{ + DBG("%s %p", hdev->name, hdev); + + /* Nothing to do for UART driver */ + + hdev->flags |= HCI_RUNNING; + + return 0; +} + +/* Reset device */ +int n_hci_flush(struct hci_dev *hdev) +{ + struct n_hci *n_hci = (struct n_hci *) hdev->driver_data; + struct tty_struct *tty = n_hci->tty; + + DBG("hdev %p tty %p", hdev, tty); + + /* Drop TX queue */ + bluez_skb_queue_purge(&n_hci->txq); + + /* Flush any pending characters in the driver and discipline. */ + if (tty->ldisc.flush_buffer) + tty->ldisc.flush_buffer(tty); + + if (tty->driver.flush_buffer) + tty->driver.flush_buffer(tty); + + return 0; +} + +/* Close device */ +int n_hci_close(struct hci_dev *hdev) +{ + DBG("hdev %p", hdev); + + hdev->flags &= ~HCI_RUNNING; + + n_hci_flush(hdev); + + return 0; +} + +int n_hci_tx_wakeup(struct n_hci *n_hci) +{ + register struct tty_struct *tty = n_hci->tty; + + if (test_and_set_bit(TRANS_SENDING, &n_hci->tx_state)) { + set_bit(TRANS_WAKEUP, &n_hci->tx_state); + return 0; + } + + DBG(""); + do { + register struct sk_buff *skb; + register int len; + + clear_bit(TRANS_WAKEUP, &n_hci->tx_state); + + if (!(skb = skb_dequeue(&n_hci->txq))) + break; + + DMP(skb->data, skb->len); + + /* Send frame to TTY driver */ + tty->flags |= (1 << TTY_DO_WRITE_WAKEUP); + len = tty->driver.write(tty, 0, skb->data, skb->len); + + n_hci->hdev.stat.byte_tx += len; + + DBG("sent %d", len); + + if (len == skb->len) { + /* Full frame was sent */ + bluez_skb_free(skb); + } else { + /* Subtract sent part and requeue */ + skb_pull(skb, len); + skb_queue_head(&n_hci->txq, skb); + } + } while (test_bit(TRANS_WAKEUP, &n_hci->tx_state)); + clear_bit(TRANS_SENDING, &n_hci->tx_state); + + return 0; +} + +/* Send frames from HCI layer */ +int n_hci_send_frame(struct sk_buff *skb) +{ + struct hci_dev* hdev = (struct hci_dev *) skb->dev; + struct tty_struct *tty; + struct n_hci *n_hci; + + if (!hdev) { + ERR("Frame for uknown device (hdev=NULL)"); + return -ENODEV; + } + + if (!(hdev->flags & HCI_RUNNING)) + return -EBUSY; + + n_hci = (struct n_hci *) hdev->driver_data; + tty = n_hci2tty(n_hci); + + DBG("%s: type %d len %d", hdev->name, skb->pkt_type, skb->len); + + switch (skb->pkt_type) { + case HCI_COMMAND_PKT: + hdev->stat.cmd_tx++; + break; + + case HCI_ACLDATA_PKT: + hdev->stat.acl_tx++; + break; + + case HCI_SCODATA_PKT: + hdev->stat.cmd_tx++; + break; + }; + + /* Prepend skb with frame type and queue */ + memcpy(skb_push(skb, 1), &skb->pkt_type, 1); + skb_queue_tail(&n_hci->txq, skb); + + n_hci_tx_wakeup(n_hci); + + return 0; +} + +/* ------ LDISC part ------ */ + +/* n_hci_tty_open + * + * Called when line discipline changed to N_HCI. + * + * Arguments: + * tty pointer to tty info structure + * Return Value: + * 0 if success, otherwise error code + */ +static int n_hci_tty_open(struct tty_struct *tty) +{ + struct n_hci *n_hci = tty2n_hci(tty); + struct hci_dev *hdev; + + DBG("tty %p", tty); + + if (n_hci) + return -EEXIST; + + if (!(n_hci = kmalloc(sizeof(struct n_hci), GFP_KERNEL))) { + ERR("Can't allocate controll structure"); + return -ENFILE; + } + memset(n_hci, 0, sizeof(struct n_hci)); + + /* Initialize and register HCI device */ + hdev = &n_hci->hdev; + + hdev->type = HCI_UART; + hdev->driver_data = n_hci; + + hdev->open = n_hci_open; + hdev->close = n_hci_close; + hdev->flush = n_hci_flush; + hdev->send = n_hci_send_frame; + + if (hci_register_dev(hdev) < 0) { + ERR("Can't register HCI device %s", hdev->name); + kfree(n_hci); + return -ENODEV; + } + + tty->disc_data = n_hci; + n_hci->tty = tty; + + spin_lock_init(&n_hci->rx_lock); + n_hci->rx_state = WAIT_PACKET_TYPE; + + skb_queue_head_init(&n_hci->txq); + + MOD_INC_USE_COUNT; + + /* Flush any pending characters in the driver and discipline. */ + if (tty->ldisc.flush_buffer) + tty->ldisc.flush_buffer(tty); + + if (tty->driver.flush_buffer) + tty->driver.flush_buffer(tty); + + return 0; +} + +/* n_hci_tty_close() + * + * Called when the line discipline is changed to something + * else, the tty is closed, or the tty detects a hangup. + */ +static void n_hci_tty_close(struct tty_struct *tty) +{ + struct n_hci *n_hci = tty2n_hci(tty); + struct hci_dev *hdev = &n_hci->hdev; + + DBG("tty %p hdev %p", tty, hdev); + + if (n_hci != NULL) { + n_hci_close(hdev); + + if (hci_unregister_dev(hdev) < 0) { + ERR("Can't unregister HCI device %s",hdev->name); + } + + hdev->driver_data = NULL; + tty->disc_data = NULL; + kfree(n_hci); + + MOD_DEC_USE_COUNT; + } +} + +/* n_hci_tty_wakeup() + * + * Callback for transmit wakeup. Called when low level + * device driver can accept more send data. + * + * Arguments: tty pointer to associated tty instance data + * Return Value: None + */ +static void n_hci_tty_wakeup( struct tty_struct *tty ) +{ + struct n_hci *n_hci = tty2n_hci(tty); + + DBG(""); + + if (!n_hci) + return; + + tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP); + + if (tty != n_hci->tty) + return; + + n_hci_tx_wakeup(n_hci); +} + +/* n_hci_tty_room() + * + * Callback function from tty driver. Return the amount of + * space left in the receiver's buffer to decide if remote + * transmitter is to be throttled. + * + * Arguments: tty pointer to associated tty instance data + * Return Value: number of bytes left in receive buffer + */ +static int n_hci_tty_room (struct tty_struct *tty) +{ + return 65536; +} + +static inline int n_hci_check_data_len(struct n_hci *n_hci, int len) +{ + register int room = skb_tailroom(n_hci->rx_skb); + + DBG("len %d room %d", len, room); + if (!len) { + DMP(n_hci->rx_skb->data, n_hci->rx_skb->len); + hci_recv_frame(n_hci->rx_skb); + } else if (len > room) { + ERR("Data length is to large"); + bluez_skb_free(n_hci->rx_skb); + n_hci->hdev.stat.err_rx++; + } else { + n_hci->rx_state = WAIT_DATA; + n_hci->rx_count = len; + return len; + } + + n_hci->rx_state = WAIT_PACKET_TYPE; + n_hci->rx_skb = NULL; + n_hci->rx_count = 0; + return 0; +} + +static inline void n_hci_rx(struct n_hci *n_hci, const __u8 * data, char *flags, int count) +{ + register const char *ptr; + hci_event_hdr *eh; + hci_acl_hdr *ah; + hci_sco_hdr *sh; + register int len, type, dlen; + + DBG("count %d state %d rx_count %d", count, n_hci->rx_state, n_hci->rx_count); + + n_hci->hdev.stat.byte_rx += count; + + ptr = data; + while (count) { + if (n_hci->rx_count) { + len = MIN(n_hci->rx_count, count); + memcpy(skb_put(n_hci->rx_skb, len), ptr, len); + n_hci->rx_count -= len; count -= len; ptr += len; + + if (n_hci->rx_count) + continue; + + switch (n_hci->rx_state) { + case WAIT_DATA: + DBG("Complete data"); + + DMP(n_hci->rx_skb->data, n_hci->rx_skb->len); + + hci_recv_frame(n_hci->rx_skb); + + n_hci->rx_state = WAIT_PACKET_TYPE; + n_hci->rx_skb = NULL; + continue; + + case WAIT_EVENT_HDR: + eh = (hci_event_hdr *) n_hci->rx_skb->data; + + DBG("Event header: evt 0x%2.2x plen %d", eh->evt, eh->plen); + + n_hci_check_data_len(n_hci, eh->plen); + continue; + + case WAIT_ACL_HDR: + ah = (hci_acl_hdr *) n_hci->rx_skb->data; + dlen = __le16_to_cpu(ah->dlen); + + DBG("ACL header: dlen %d", dlen); + + n_hci_check_data_len(n_hci, dlen); + continue; + + case WAIT_SCO_HDR: + sh = (hci_sco_hdr *) n_hci->rx_skb->data; + + DBG("SCO header: dlen %d", sh->dlen); + + n_hci_check_data_len(n_hci, sh->dlen); + continue; + }; + } + + /* WAIT_PACKET_TYPE */ + switch (*ptr) { + case HCI_EVENT_PKT: + DBG("Event packet"); + n_hci->rx_state = WAIT_EVENT_HDR; + n_hci->rx_count = HCI_EVENT_HDR_SIZE; + type = HCI_EVENT_PKT; + break; + + case HCI_ACLDATA_PKT: + DBG("ACL packet"); + n_hci->rx_state = WAIT_ACL_HDR; + n_hci->rx_count = HCI_ACL_HDR_SIZE; + type = HCI_ACLDATA_PKT; + break; + + case HCI_SCODATA_PKT: + DBG("SCO packet"); + n_hci->rx_state = WAIT_SCO_HDR; + n_hci->rx_count = HCI_SCO_HDR_SIZE; + type = HCI_SCODATA_PKT; + break; + + default: + ERR("Unknown HCI packet type %2.2x", (__u8)*ptr); + n_hci->hdev.stat.err_rx++; + ptr++; count--; + continue; + }; + ptr++; count--; + + /* Allocate packet */ + if (!(n_hci->rx_skb = bluez_skb_alloc(HCI_MAX_READ, GFP_ATOMIC))) { + ERR("Can't allocate mem for new packet"); + + n_hci->rx_state = WAIT_PACKET_TYPE; + n_hci->rx_count = 0; + return; + } + n_hci->rx_skb->dev = (void *) &n_hci->hdev; + n_hci->rx_skb->pkt_type = type; + } +} + +/* n_hci_tty_receive() + * + * Called by tty low level driver when receive data is + * available. + * + * Arguments: tty pointer to tty isntance data + * data pointer to received data + * flags pointer to flags for data + * count count of received data in bytes + * + * Return Value: None + */ +static void n_hci_tty_receive(struct tty_struct *tty, const __u8 * data, char *flags, int count) +{ + struct n_hci *n_hci = tty2n_hci(tty); + + if (!n_hci || tty != n_hci->tty) + return; + + spin_lock(&n_hci->rx_lock); + n_hci_rx(n_hci, data, flags, count); + spin_unlock(&n_hci->rx_lock); + + if (test_and_clear_bit(TTY_THROTTLED,&tty->flags) && tty->driver.unthrottle) + tty->driver.unthrottle(tty); +} + +/* n_hci_tty_ioctl() + * + * Process IOCTL system call for the tty device. + * + * Arguments: + * + * tty pointer to tty instance data + * file pointer to open file object for device + * cmd IOCTL command code + * arg argument for IOCTL call (cmd dependent) + * + * Return Value: Command dependent + */ +static int n_hci_tty_ioctl (struct tty_struct *tty, struct file * file, + unsigned int cmd, unsigned long arg) +{ + struct n_hci *n_hci = tty2n_hci(tty); + int error = 0; + + DBG(""); + + /* Verify the status of the device */ + if (!n_hci) + return -EBADF; + + switch (cmd) { + default: + error = n_tty_ioctl(tty, file, cmd, arg); + break; + }; + + return error; +} + +/* + * We don't provide read/write/poll interface for user space. + */ +static ssize_t n_hci_tty_read(struct tty_struct *tty, struct file *file, unsigned char *buf, size_t nr) +{ + return 0; +} +static ssize_t n_hci_tty_write(struct tty_struct *tty, struct file *file, const unsigned char *data, size_t count) +{ + return 0; +} +static unsigned int n_hci_tty_poll(struct tty_struct *tty, struct file *filp, poll_table *wait) +{ + return 0; +} + +int __init n_hci_init(void) +{ + static struct tty_ldisc n_hci_ldisc; + int err; + + INF("BlueZ HCI UART driver ver %s Copyright (C) 2000,2001 Qualcomm Inc", + BLUEZ_VER); + INF("Written 2000,2001 by Maxim Krasnyansky "); + + /* Register the tty discipline */ + + memset(&n_hci_ldisc, 0, sizeof (n_hci_ldisc)); + n_hci_ldisc.magic = TTY_LDISC_MAGIC; + n_hci_ldisc.name = "n_hci"; + n_hci_ldisc.open = n_hci_tty_open; + n_hci_ldisc.close = n_hci_tty_close; + n_hci_ldisc.read = n_hci_tty_read; + n_hci_ldisc.write = n_hci_tty_write; + n_hci_ldisc.ioctl = n_hci_tty_ioctl; + n_hci_ldisc.poll = n_hci_tty_poll; + n_hci_ldisc.receive_room= n_hci_tty_room; + n_hci_ldisc.receive_buf = n_hci_tty_receive; + n_hci_ldisc.write_wakeup= n_hci_tty_wakeup; + + if ((err = tty_register_ldisc(N_HCI, &n_hci_ldisc))) { + ERR("Can't register HCI line discipline (%d)", err); + return err; + } + + return 0; +} + +void n_hci_cleanup(void) +{ + int err; + + /* Release tty registration of line discipline */ + if ((err = tty_register_ldisc(N_HCI, NULL))) + ERR("Can't unregister HCI line discipline (%d)", err); +} + +module_init(n_hci_init); +module_exit(n_hci_cleanup); diff -u --recursive --new-file v2.4.5/linux/drivers/bluetooth/hci_usb.c linux/drivers/bluetooth/hci_usb.c --- v2.4.5/linux/drivers/bluetooth/hci_usb.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/bluetooth/hci_usb.c Tue Jun 5 18:11:41 2001 @@ -0,0 +1,670 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ HCI USB driver. + * Based on original USB Bluetooth driver for Linux kernel + * Copyright (c) 2000 Greg Kroah-Hartman + * Copyright (c) 2000 Mark Douglas Corner + * + * $Id: hci_usb.c,v 1.1 2001/06/01 08:12:10 davem Exp $ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#ifndef HCI_USB_DEBUG +#undef DBG +#define DBG( A... ) +#undef DMP +#define DMP( A... ) +#endif + +static struct usb_device_id usb_bluetooth_ids [] = { + { USB_DEVICE_INFO(HCI_DEV_CLASS, HCI_DEV_SUBCLASS, HCI_DEV_PROTOCOL) }, + { } /* Terminating entry */ +}; + +MODULE_DEVICE_TABLE (usb, usb_bluetooth_ids); + +static int hci_usb_ctrl_msg(struct hci_usb *husb, struct sk_buff *skb); +static int hci_usb_write_msg(struct hci_usb *husb, struct sk_buff *skb); + +static void hci_usb_unlink_urbs(struct hci_usb *husb) +{ + usb_unlink_urb(husb->read_urb); + usb_unlink_urb(husb->intr_urb); + usb_unlink_urb(husb->ctrl_urb); + usb_unlink_urb(husb->write_urb); +} + +static void hci_usb_free_bufs(struct hci_usb *husb) +{ + if (husb->read_urb) { + if (husb->read_urb->transfer_buffer) + kfree(husb->read_urb->transfer_buffer); + usb_free_urb(husb->read_urb); + } + + if (husb->intr_urb) { + if (husb->intr_urb->transfer_buffer) + kfree(husb->intr_urb->transfer_buffer); + usb_free_urb(husb->intr_urb); + } + + if (husb->ctrl_urb) + usb_free_urb(husb->ctrl_urb); + + if (husb->write_urb) + usb_free_urb(husb->write_urb); + + if (husb->intr_skb) + bluez_skb_free(husb->intr_skb); +} + +/* ------- Interface to HCI layer ------ */ +/* Initialize device */ +int hci_usb_open(struct hci_dev *hdev) +{ + struct hci_usb *husb = (struct hci_usb *) hdev->driver_data; + int status; + + DBG("%s", hdev->name); + + husb->read_urb->dev = husb->udev; + if ((status = usb_submit_urb(husb->read_urb))) + DBG("read submit failed. %d", status); + + husb->intr_urb->dev = husb->udev; + if ((status = usb_submit_urb(husb->intr_urb))) + DBG("interrupt submit failed. %d", status); + + hdev->flags |= HCI_RUNNING; + + return 0; +} + +/* Reset device */ +int hci_usb_flush(struct hci_dev *hdev) +{ + struct hci_usb *husb = (struct hci_usb *) hdev->driver_data; + + DBG("%s", hdev->name); + + /* Drop TX queues */ + bluez_skb_queue_purge(&husb->tx_ctrl_q); + bluez_skb_queue_purge(&husb->tx_write_q); + + return 0; +} + +/* Close device */ +int hci_usb_close(struct hci_dev *hdev) +{ + struct hci_usb *husb = (struct hci_usb *) hdev->driver_data; + + DBG("%s", hdev->name); + + hdev->flags &= ~HCI_RUNNING; + hci_usb_unlink_urbs(husb); + + hci_usb_flush(hdev); + + return 0; +} + +void hci_usb_ctrl_wakeup(struct hci_usb *husb) +{ + struct sk_buff *skb; + + if (test_and_set_bit(HCI_TX_CTRL, &husb->tx_state)) + return; + + DBG("%s", husb->hdev.name); + + if (!(skb = skb_dequeue(&husb->tx_ctrl_q))) + goto done; + + if (hci_usb_ctrl_msg(husb, skb)){ + bluez_skb_free(skb); + goto done; + } + + DMP(skb->data, skb->len); + + husb->hdev.stat.byte_tx += skb->len; + return; + +done: + clear_bit(HCI_TX_CTRL, &husb->tx_state); + return; +} + +void hci_usb_write_wakeup(struct hci_usb *husb) +{ + struct sk_buff *skb; + + if (test_and_set_bit(HCI_TX_WRITE, &husb->tx_state)) + return; + + DBG("%s", husb->hdev.name); + + if (!(skb = skb_dequeue(&husb->tx_write_q))) + goto done; + + if (hci_usb_write_msg(husb, skb)) { + skb_queue_head(&husb->tx_write_q, skb); + goto done; + } + + DMP(skb->data, skb->len); + + husb->hdev.stat.byte_tx += skb->len; + return; + +done: + clear_bit(HCI_TX_WRITE, &husb->tx_state); + return; +} + +/* Send frames from HCI layer */ +int hci_usb_send_frame(struct sk_buff *skb) +{ + struct hci_dev *hdev = (struct hci_dev *) skb->dev; + struct hci_usb *husb; + + if (!hdev) { + ERR("frame for uknown device (hdev=NULL)"); + return -ENODEV; + } + + if (!(hdev->flags & HCI_RUNNING)) + return 0; + + husb = (struct hci_usb *) hdev->driver_data; + + DBG("%s type %d len %d", hdev->name, skb->pkt_type, skb->len); + + switch (skb->pkt_type) { + case HCI_COMMAND_PKT: + skb_queue_tail(&husb->tx_ctrl_q, skb); + hci_usb_ctrl_wakeup(husb); + hdev->stat.cmd_tx++; + return 0; + + case HCI_ACLDATA_PKT: + skb_queue_tail(&husb->tx_write_q, skb); + hci_usb_write_wakeup(husb); + hdev->stat.acl_tx++; + return 0; + + case HCI_SCODATA_PKT: + return -EOPNOTSUPP; + }; + + return 0; +} + +/* ---------- USB ------------- */ + +static void hci_usb_ctrl(struct urb *urb) +{ + struct sk_buff *skb = (struct sk_buff *) urb->context; + struct hci_dev *hdev; + struct hci_usb *husb; + + if (!skb) + return; + hdev = (struct hci_dev *) skb->dev; + husb = (struct hci_usb *) hdev->driver_data; + + DBG("%s", hdev->name); + + if (urb->status) + DBG("%s ctrl status: %d", hdev->name, urb->status); + + clear_bit(HCI_TX_CTRL, &husb->tx_state); + bluez_skb_free(skb); + + /* Wake up device */ + hci_usb_ctrl_wakeup(husb); +} + +static void hci_usb_bulk_write(struct urb *urb) +{ + struct sk_buff *skb = (struct sk_buff *) urb->context; + struct hci_dev *hdev; + struct hci_usb *husb; + + if (!skb) + return; + hdev = (struct hci_dev *) skb->dev; + husb = (struct hci_usb *) hdev->driver_data; + + DBG("%s", hdev->name); + + if (urb->status) + DBG("%s bulk write status: %d", hdev->name, urb->status); + + clear_bit(HCI_TX_WRITE, &husb->tx_state); + bluez_skb_free(skb); + + /* Wake up device */ + hci_usb_write_wakeup(husb); + + return; +} + +static void hci_usb_intr(struct urb *urb) +{ + struct hci_usb *husb = (struct hci_usb *) urb->context; + unsigned char *data = urb->transfer_buffer; + register int count = urb->actual_length; + register struct sk_buff *skb = husb->intr_skb; + hci_event_hdr *eh; + register int len; + + if (!husb) + return; + + DBG("%s count %d", husb->hdev.name, count); + + if (urb->status || !count) { + DBG("%s intr status %d, count %d", husb->hdev.name, urb->status, count); + return; + } + + /* Do we really have to handle continuations here ? */ + if (!skb) { + /* New frame */ + if (count < HCI_EVENT_HDR_SIZE) { + DBG("%s bad frame len %d", husb->hdev.name, count); + return; + } + + eh = (hci_event_hdr *) data; + len = eh->plen + HCI_EVENT_HDR_SIZE; + + if (count > len) { + DBG("%s corrupted frame, len %d", husb->hdev.name, count); + return; + } + + /* Allocate skb */ + if (!(skb = bluez_skb_alloc(len, GFP_ATOMIC))) { + ERR("Can't allocate mem for new packet"); + return; + } + skb->dev = (void *) &husb->hdev; + skb->pkt_type = HCI_EVENT_PKT; + + husb->intr_skb = skb; + husb->intr_count = len; + } else { + /* Continuation */ + if (count > husb->intr_count) { + ERR("%s bad frame len %d (expected %d)", husb->hdev.name, count, husb->intr_count); + + bluez_skb_free(skb); + husb->intr_skb = NULL; + husb->intr_count = 0; + return; + } + } + + memcpy(skb_put(skb, count), data, count); + husb->intr_count -= count; + + DMP(data, count); + + if (!husb->intr_count) { + /* Got complete frame */ + + husb->hdev.stat.byte_rx += skb->len; + hci_recv_frame(skb); + + husb->intr_skb = NULL; + } +} + +static void hci_usb_bulk_read(struct urb *urb) +{ + struct hci_usb *husb = (struct hci_usb *) urb->context; + unsigned char *data = urb->transfer_buffer; + int count = urb->actual_length, status; + struct sk_buff *skb; + hci_acl_hdr *ah; + register __u16 dlen; + + if (!husb) + return; + + DBG("%s status %d, count %d, flags %x", husb->hdev.name, urb->status, count, urb->transfer_flags); + + if (urb->status) { + /* Do not re-submit URB on critical errors */ + switch (urb->status) { + case -ENOENT: + return; + default: + goto resubmit; + }; + } + if (!count) + goto resubmit; + + DMP(data, count); + + ah = (hci_acl_hdr *) data; + dlen = le16_to_cpu(ah->dlen); + + /* Verify frame len and completeness */ + if ((count - HCI_ACL_HDR_SIZE) != dlen) { + ERR("%s corrupted ACL packet: count %d, plen %d", husb->hdev.name, count, dlen); + goto resubmit; + } + + /* Allocate packet */ + if (!(skb = bluez_skb_alloc(count, GFP_ATOMIC))) { + ERR("Can't allocate mem for new packet"); + goto resubmit; + } + + memcpy(skb_put(skb, count), data, count); + skb->dev = (void *) &husb->hdev; + skb->pkt_type = HCI_ACLDATA_PKT; + + husb->hdev.stat.byte_rx += skb->len; + + hci_recv_frame(skb); + +resubmit: + husb->read_urb->dev = husb->udev; + if ((status = usb_submit_urb(husb->read_urb))) + DBG("%s read URB submit failed %d", husb->hdev.name, status); + + DBG("%s read URB re-submited", husb->hdev.name); +} + +static int hci_usb_ctrl_msg(struct hci_usb *husb, struct sk_buff *skb) +{ + struct urb *urb = husb->ctrl_urb; + devrequest *dr = &husb->dev_req; + int pipe, status; + + DBG("%s len %d", husb->hdev.name, skb->len); + + pipe = usb_sndctrlpipe(husb->udev, 0); + + dr->requesttype = HCI_CTRL_REQ; + dr->request = 0; + dr->index = 0; + dr->value = 0; + dr->length = cpu_to_le16(skb->len); + + FILL_CONTROL_URB(urb, husb->udev, pipe, (void*)dr, skb->data, skb->len, + hci_usb_ctrl, skb); + + if ((status = usb_submit_urb(urb))) { + DBG("%s control URB submit failed %d", husb->hdev.name, status); + return status; + } + + return 0; +} + +static int hci_usb_write_msg(struct hci_usb *husb, struct sk_buff *skb) +{ + struct urb *urb = husb->write_urb; + int pipe, status; + + DBG("%s len %d", husb->hdev.name, skb->len); + + pipe = usb_sndbulkpipe(husb->udev, husb->bulk_out_ep_addr); + + FILL_BULK_URB(urb, husb->udev, pipe, skb->data, skb->len, + hci_usb_bulk_write, skb); + urb->transfer_flags |= USB_QUEUE_BULK; + + if ((status = usb_submit_urb(urb))) { + DBG("%s write URB submit failed %d", husb->hdev.name, status); + return status; + } + + return 0; +} + +static void * hci_usb_probe(struct usb_device *udev, unsigned int ifnum, const struct usb_device_id *id) +{ + struct usb_endpoint_descriptor *bulk_out_ep, *intr_in_ep, *bulk_in_ep; + struct usb_interface_descriptor *uif; + struct usb_endpoint_descriptor *ep; + struct hci_usb *husb; + struct hci_dev *hdev; + int i, size, pipe; + __u8 * buf; + + DBG("udev %p ifnum %d", udev, ifnum); + + /* Check device signature */ + if ((udev->descriptor.bDeviceClass != HCI_DEV_CLASS) || + (udev->descriptor.bDeviceSubClass != HCI_DEV_SUBCLASS)|| + (udev->descriptor.bDeviceProtocol != HCI_DEV_PROTOCOL) ) + return NULL; + + MOD_INC_USE_COUNT; + + uif = &udev->actconfig->interface[ifnum].altsetting[0]; + + if (uif->bNumEndpoints != 3) { + DBG("Wrong number of endpoints %d", uif->bNumEndpoints); + MOD_DEC_USE_COUNT; + return NULL; + } + + bulk_out_ep = intr_in_ep = bulk_in_ep = NULL; + + /* Find endpoints that we need */ + for ( i = 0; i < uif->bNumEndpoints; ++i) { + ep = &uif->endpoint[i]; + + switch (ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { + case USB_ENDPOINT_XFER_BULK: + if (ep->bEndpointAddress & USB_DIR_IN) + bulk_in_ep = ep; + else + bulk_out_ep = ep; + break; + + case USB_ENDPOINT_XFER_INT: + intr_in_ep = ep; + break; + }; + } + + if (!bulk_in_ep || !bulk_out_ep || !intr_in_ep) { + DBG("Endpoints not found: %p %p %p", bulk_in_ep, bulk_out_ep, intr_in_ep); + MOD_DEC_USE_COUNT; + return NULL; + } + + if (!(husb = kmalloc(sizeof(struct hci_usb), GFP_KERNEL))) { + ERR("Can't allocate: control structure"); + MOD_DEC_USE_COUNT; + return NULL; + } + + memset(husb, 0, sizeof(struct hci_usb)); + + husb->udev = udev; + husb->bulk_out_ep_addr = bulk_out_ep->bEndpointAddress; + + if (!(husb->ctrl_urb = usb_alloc_urb(0))) { + ERR("Can't allocate: control URB"); + goto probe_error; + } + + if (!(husb->write_urb = usb_alloc_urb(0))) { + ERR("Can't allocate: write URB"); + goto probe_error; + } + + if (!(husb->read_urb = usb_alloc_urb(0))) { + ERR("Can't allocate: read URB"); + goto probe_error; + } + + ep = bulk_in_ep; + pipe = usb_rcvbulkpipe(udev, ep->bEndpointAddress); + size = HCI_USB_MAX_READ; + + if (!(buf = kmalloc(size, GFP_KERNEL))) { + ERR("Can't allocate: read buffer"); + goto probe_error; + } + + FILL_BULK_URB(husb->read_urb, udev, pipe, buf, size, hci_usb_bulk_read, husb); + husb->read_urb->transfer_flags |= USB_QUEUE_BULK; + + ep = intr_in_ep; + pipe = usb_rcvintpipe(udev, ep->bEndpointAddress); + size = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + + if (!(husb->intr_urb = usb_alloc_urb(0))) { + ERR("Can't allocate: interrupt URB"); + goto probe_error; + } + + if (!(buf = kmalloc(size, GFP_KERNEL))) { + ERR("Can't allocate: interrupt buffer"); + goto probe_error; + } + + FILL_INT_URB(husb->intr_urb, udev, pipe, buf, size, hci_usb_intr, husb, ep->bInterval); + + skb_queue_head_init(&husb->tx_ctrl_q); + skb_queue_head_init(&husb->tx_write_q); + + /* Initialize and register HCI device */ + hdev = &husb->hdev; + + hdev->type = HCI_USB; + hdev->driver_data = husb; + + hdev->open = hci_usb_open; + hdev->close = hci_usb_close; + hdev->flush = hci_usb_flush; + hdev->send = hci_usb_send_frame; + + if (hci_register_dev(hdev) < 0) { + ERR("Can't register HCI device %s", hdev->name); + goto probe_error; + } + + return husb; + +probe_error: + hci_usb_free_bufs(husb); + kfree(husb); + MOD_DEC_USE_COUNT; + return NULL; +} + +static void hci_usb_disconnect(struct usb_device *udev, void *ptr) +{ + struct hci_usb *husb = (struct hci_usb *) ptr; + struct hci_dev *hdev = &husb->hdev; + + if (!husb) + return; + + DBG("%s", hdev->name); + + hci_usb_close(hdev); + + if (hci_unregister_dev(hdev) < 0) { + ERR("Can't unregister HCI device %s", hdev->name); + } + + hci_usb_free_bufs(husb); + kfree(husb); + + MOD_DEC_USE_COUNT; +} + +static struct usb_driver hci_usb_driver = +{ + name: "hci_usb", + probe: hci_usb_probe, + disconnect: hci_usb_disconnect, + id_table: usb_bluetooth_ids, +}; + +int hci_usb_init(void) +{ + int err; + + INF("BlueZ HCI USB driver ver %s Copyright (C) 2000,2001 Qualcomm Inc", + BLUEZ_VER); + INF("Written 2000,2001 by Maxim Krasnyansky "); + + if ((err = usb_register(&hci_usb_driver)) < 0) + ERR("Failed to register HCI USB driver"); + + return err; +} + +void hci_usb_cleanup(void) +{ + usb_deregister(&hci_usb_driver); +} + +module_init(hci_usb_init); +module_exit(hci_usb_cleanup); diff -u --recursive --new-file v2.4.5/linux/drivers/char/console.c linux/drivers/char/console.c --- v2.4.5/linux/drivers/char/console.c Fri Feb 9 11:30:22 2001 +++ linux/drivers/char/console.c Wed Jun 6 10:29:05 2001 @@ -103,8 +103,6 @@ #include #include -#include - #include "console_macros.h" diff -u --recursive --new-file v2.4.5/linux/drivers/char/drm/ffb_drv.c linux/drivers/char/drm/ffb_drv.c --- v2.4.5/linux/drivers/char/drm/ffb_drv.c Fri May 25 18:28:54 2001 +++ linux/drivers/char/drm/ffb_drv.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: ffb_drv.c,v 1.12 2001/04/14 01:12:03 davem Exp $ +/* $Id: ffb_drv.c,v 1.14 2001/05/24 12:01:47 davem Exp $ * ffb_drv.c: Creator/Creator3D direct rendering driver. * * Copyright (C) 2000 David S. Miller (davem@redhat.com) @@ -719,9 +719,19 @@ current->state = TASK_RUNNING; remove_wait_queue(&dev->lock.lock_queue, &entry); - if (!ret && - (dev->last_context != lock.context)) - ffb_context_switch(dev, dev->last_context, lock.context); + if (!ret) { + sigemptyset(&dev->sigmask); + sigaddset(&dev->sigmask, SIGSTOP); + sigaddset(&dev->sigmask, SIGTSTP); + sigaddset(&dev->sigmask, SIGTTIN); + sigaddset(&dev->sigmask, SIGTTOU); + dev->sigdata.context = lock.context; + dev->sigdata.lock = dev->lock.hw_lock; + block_all_signals(drm_notifier, &dev->sigdata, &dev->sigmask); + + if (dev->last_context != lock.context) + ffb_context_switch(dev, dev->last_context, lock.context); + } DRM_DEBUG("%d %s\n", lock.context, ret ? "interrupted" : "has lock"); @@ -770,6 +780,7 @@ wake_up_interruptible(&dev->lock.lock_queue); + unblock_all_signals(); return 0; } diff -u --recursive --new-file v2.4.5/linux/drivers/char/rio/rioroute.c linux/drivers/char/rio/rioroute.c --- v2.4.5/linux/drivers/char/rio/rioroute.c Fri Feb 9 11:30:23 2001 +++ linux/drivers/char/rio/rioroute.c Sun Jun 3 16:46:34 2001 @@ -657,6 +657,7 @@ */ if (PortP->TxStart == 0) { rio_dprintk (RIO_DEBUG_ROUTE, "Tx pkts not set up yet\n"); + rio_spin_unlock_irqrestore(&PortP->portSem, flags); break; } diff -u --recursive --new-file v2.4.5/linux/drivers/i2o/i2o_lan.c linux/drivers/i2o/i2o_lan.c --- v2.4.5/linux/drivers/i2o/i2o_lan.c Fri May 25 18:28:54 2001 +++ linux/drivers/i2o/i2o_lan.c Sun Jun 3 21:12:45 2001 @@ -984,7 +984,7 @@ __raw_writel(priv->unit << 16 | lan_send_context, msg+2); // InitiatorContext __raw_writel(1 << 30 | 1 << 3, msg+3); // TransmitControlWord // bit 30: reply as soon as transmission attempt is complete - // bit 3: Supress CRC generation + // bit 3: Suppress CRC generation __raw_writel(0xD5000000 | skb->len, msg+4); // MAC hdr included __raw_writel((u32)skb, msg+5); // TransactionContext __raw_writel(virt_to_bus(skb->data), msg+6); diff -u --recursive --new-file v2.4.5/linux/drivers/ide/ide-tape.c linux/drivers/ide/ide-tape.c --- v2.4.5/linux/drivers/ide/ide-tape.c Fri Feb 9 11:30:23 2001 +++ linux/drivers/ide/ide-tape.c Wed Jun 6 10:42:44 2001 @@ -1,8 +1,10 @@ /* - * linux/drivers/ide/ide-tape.c Version 1.16f Dec 15, 1999 + * linux/drivers/ide/ide-tape.c Version 1.17a Jan, 2001 * * Copyright (C) 1995 - 1999 Gadi Oxman * + * $Header$ + * * This driver was constructed as a student project in the software laboratory * of the faculty of electrical engineering in the Technion - Israel's * Institute Of Technology, with the guide of Avner Lottem and Dr. Ilana David. @@ -274,7 +276,21 @@ * this section correctly, a hypothetical and unwanted situation * is being described) * Ver 1.16f Dec 15 99 Change place of the secondary OnStream header frames. - * + * Ver 1.17 Nov 2000 / Jan 2001 Marcel Mol, marcel@mesa.nl + * - Add idetape_onstream_mode_sense_tape_parameter_page + * function to get tape capacity in frames: tape->capacity. + * - Add support for DI-50 drives( or any DI- drive). + * - 'workaround' for read error/blank block arround block 3000. + * - Implement Early warning for end of media for Onstream. + * - Cosmetic code changes for readability. + * - Idetape_position_tape should not use SKIP bit during + * Onstream read recovery. + * - Add capacity, logical_blk_num and first/last_frame_position + * to /proc/ide/hd?/settings. + * - Module use count was gone in the Linux 2.4 driver. + * Ver 1.17a Apr 2001 Willem Riede osst@riede.org + * - Get drive's actual block size from mode sense block descriptor + * - Limit size of pipeline * * Here are some words from the first releases of hd.c, which are quoted * in ide.c and apply here as well: @@ -384,7 +400,7 @@ * sharing a (fast) ATA-2 disk with any (slow) new ATAPI device. */ -#define IDETAPE_VERSION "1.16f" +#define IDETAPE_VERSION "1.17a" #include #include @@ -421,7 +437,11 @@ #define OS_CONFIG_PARTITION (0xff) #define OS_DATA_PARTITION (0) #define OS_PARTITION_VERSION (1) +#define OS_EW 300 +#define OS_ADR_MINREV 2 +#define OS_DATA_STARTFRAME1 20 +#define OS_DATA_ENDFRAME1 2980 /* * partition */ @@ -512,12 +532,33 @@ } os_header_t; /* + * OnStream Tape Parameters Page + */ +typedef struct { + unsigned page_code :6; /* Page code - Should be 0x2b */ + unsigned reserved1_6 :1; + unsigned ps :1; + __u8 reserved2; + __u8 density; /* kbpi */ + __u8 reserved3,reserved4; + __u16 segtrk; /* segment of per track */ + __u16 trks; /* tracks per tape */ + __u8 reserved5,reserved6,reserved7,reserved8,reserved9,reserved10; +} onstream_tape_paramtr_page_t; + +/* * OnStream ADRL frame */ #define OS_FRAME_SIZE (32 * 1024 + 512) #define OS_DATA_SIZE (32 * 1024) #define OS_AUX_SIZE (512) +/* + * internal error codes for onstream + */ +#define OS_PART_ERROR 2 +#define OS_WRITE_ERROR 1 + #include /**************************** Tunable parameters *****************************/ @@ -559,7 +600,7 @@ * is verified to be stable enough. This will make it much more * esthetic. */ -#define IDETAPE_DEBUG_INFO 0 +#define IDETAPE_DEBUG_INFO 1 #define IDETAPE_DEBUG_LOG 1 #define IDETAPE_DEBUG_LOG_VERBOSE 0 #define IDETAPE_DEBUG_BUGS 1 @@ -949,6 +990,7 @@ int eod_frame_addr; unsigned long cmd_start_time; unsigned long max_cmd_time; + unsigned capacity; /* * Optimize the number of "buffer filling" @@ -1157,7 +1199,7 @@ typedef union { unsigned all :8; struct { - unsigned dma :1; /* Using DMA of PIO */ + unsigned dma :1; /* Using DMA or PIO */ unsigned reserved321 :3; /* Reserved */ unsigned reserved654 :3; /* Reserved (Tag Type) */ unsigned reserved7 :1; /* Reserved */ @@ -1286,8 +1328,11 @@ * packet commands. Those packet commands are still not supported * by ide-tape. */ +#define IDETAPE_BLOCK_DESCRIPTOR 0 #define IDETAPE_CAPABILITIES_PAGE 0x2a +#define IDETAPE_PARAMTR_PAGE 0x2b /* Onstream DI-x0 only */ #define IDETAPE_BLOCK_SIZE_PAGE 0x30 +#define IDETAPE_BUFFER_FILLING_PAGE 0x33 /* * Mode Parameter Header for the MODE SENSE packet command @@ -1428,6 +1473,14 @@ #endif /* IDETAPE_DEBUG_LOG_VERBOSE */ /* + * Function declarations + * + */ +static void idetape_onstream_mode_sense_tape_parameter_page(ide_drive_t *drive, int debug); +static int idetape_chrdev_release (struct inode *inode, struct file *filp); +static void idetape_write_release (struct inode *inode); + +/* * Too bad. The drive wants to send us data which we are not ready to accept. * Just throw it away. */ @@ -1452,7 +1505,8 @@ #endif /* IDETAPE_DEBUG_BUGS */ count = IDE_MIN (bh->b_size - atomic_read(&bh->b_count), bcount); atapi_input_bytes (drive, bh->b_data + atomic_read(&bh->b_count), count); - bcount -= count; atomic_add(count, &bh->b_count); + bcount -= count; + atomic_add(count, &bh->b_count); if (atomic_read(&bh->b_count) == bh->b_size) { bh = bh->b_reqnext; if (bh) @@ -1476,7 +1530,9 @@ #endif /* IDETAPE_DEBUG_BUGS */ count = IDE_MIN (pc->b_count, bcount); atapi_output_bytes (drive, pc->b_data, count); - bcount -= count; pc->b_data += count; pc->b_count -= count; + bcount -= count; + pc->b_data += count; + pc->b_count -= count; if (!pc->b_count) { pc->bh = bh = bh->b_reqnext; if (bh) { @@ -1577,20 +1633,23 @@ * to analyze the request sense. We currently do not utilize this * information. */ -static void idetape_analyze_error (ide_drive_t *drive,idetape_request_sense_result_t *result) +static void idetape_analyze_error (ide_drive_t *drive, idetape_request_sense_result_t *result) { idetape_tape_t *tape = drive->driver_data; idetape_pc_t *pc = tape->failed_pc; - tape->sense = *result; - tape->sense_key = result->sense_key; tape->asc = result->asc; tape->ascq = result->ascq; + tape->sense = *result; + tape->sense_key = result->sense_key; + tape->asc = result->asc; + tape->ascq = result->ascq; #if IDETAPE_DEBUG_LOG /* * Without debugging, we only log an error if we decided to * give up retrying. */ if (tape->debug_level >= 1) - printk (KERN_INFO "ide-tape: pc = %x, sense key = %x, asc = %x, ascq = %x\n",pc->c[0],result->sense_key,result->asc,result->ascq); + printk (KERN_INFO "ide-tape: pc = %x, sense key = %x, asc = %x, ascq = %x\n", + pc->c[0], result->sense_key, result->asc, result->ascq); #if IDETAPE_DEBUG_LOG_VERBOSE if (tape->debug_level >= 1) printk (KERN_INFO "ide-tape: pc = %s, sense key = %x, asc = %x, ascq = %x\n", @@ -1660,7 +1719,7 @@ static void idetape_active_next_stage (ide_drive_t *drive) { idetape_tape_t *tape = drive->driver_data; - idetape_stage_t *stage=tape->next_stage; + idetape_stage_t *stage = tape->next_stage; struct request *rq = &stage->rq; #if IDETAPE_DEBUG_LOG @@ -1676,9 +1735,9 @@ rq->buffer = NULL; rq->bh = stage->bh; - tape->active_data_request=rq; - tape->active_stage=stage; - tape->next_stage=stage->next; + tape->active_data_request = rq; + tape->active_stage = stage; + tape->next_stage = stage->next; } /* @@ -1756,12 +1815,12 @@ return; } #endif /* IDETAPE_DEBUG_BUGS */ - stage=tape->first_stage; - tape->first_stage=stage->next; + stage = tape->first_stage; + tape->first_stage = stage->next; idetape_kfree_stage (tape, stage); tape->nr_stages--; if (tape->first_stage == NULL) { - tape->last_stage=NULL; + tape->last_stage = NULL; #if IDETAPE_DEBUG_BUGS if (tape->next_stage != NULL) printk (KERN_ERR "ide-tape: bug: tape->next_stage != NULL\n"); @@ -1821,12 +1880,12 @@ } #endif if (tape->onstream && !tape->raw) { - if (tape->first_frame_position == 0xba4) { + if (tape->first_frame_position == OS_DATA_ENDFRAME1) { #if ONSTREAM_DEBUG - if (tape->debug_level >= 2) - printk("ide-tape: %s: skipping over config parition..\n", tape->name); + if (tape->debug_level >= 2) + printk("ide-tape: %s: skipping over config parition..\n", tape->name); #endif - tape->onstream_write_error = 2; + tape->onstream_write_error = OS_PART_ERROR; if (tape->sem) up(tape->sem); } @@ -1839,7 +1898,7 @@ if (tape->onstream && !tape->raw && error == IDETAPE_ERROR_GENERAL && tape->sense.sense_key == 3) { clear_bit (IDETAPE_PIPELINE_ERROR, &tape->flags); printk(KERN_ERR "ide-tape: %s: write error, enabling error recovery\n", tape->name); - tape->onstream_write_error = 1; + tape->onstream_write_error = OS_WRITE_ERROR; remove_stage = 0; tape->nr_pending_stages++; tape->next_stage = tape->first_stage; @@ -1883,11 +1942,11 @@ printk (KERN_INFO "ide-tape: Reached idetape_request_sense_callback\n"); #endif /* IDETAPE_DEBUG_LOG */ if (!tape->pc->error) { - idetape_analyze_error (drive,(idetape_request_sense_result_t *) tape->pc->buffer); - idetape_end_request (1,HWGROUP (drive)); + idetape_analyze_error (drive, (idetape_request_sense_result_t *) tape->pc->buffer); + idetape_end_request (1, HWGROUP (drive)); } else { printk (KERN_ERR "ide-tape: Error in REQUEST SENSE itself - Aborting request!\n"); - idetape_end_request (0,HWGROUP (drive)); + idetape_end_request (0, HWGROUP (drive)); } return ide_stopped; } @@ -1980,7 +2039,7 @@ idetape_status_reg_t status; idetape_bcount_reg_t bcount; idetape_ireason_reg_t ireason; - idetape_pc_t *pc=tape->pc; + idetape_pc_t *pc = tape->pc; unsigned int temp; unsigned long cmd_time; @@ -2011,7 +2070,7 @@ */ set_bit (PC_DMA_ERROR, &pc->flags); } else if (!status.b.check) { - pc->actually_transferred=pc->request_transfer; + pc->actually_transferred = pc->request_transfer; idetape_update_buffers (pc); } #if IDETAPE_DEBUG_LOG @@ -2064,7 +2123,7 @@ return ide_stopped; } if (tape->failed_pc == pc) - tape->failed_pc=NULL; + tape->failed_pc = NULL; return pc->callback(drive); /* Command finished - Call the callback function */ } #ifdef CONFIG_BLK_DEV_IDEDMA @@ -2075,9 +2134,9 @@ return ide_do_reset (drive); } #endif /* CONFIG_BLK_DEV_IDEDMA */ - bcount.b.high=IN_BYTE (IDE_BCOUNTH_REG); /* Get the number of bytes to transfer */ - bcount.b.low=IN_BYTE (IDE_BCOUNTL_REG); /* on this interrupt */ - ireason.all=IN_BYTE (IDE_IREASON_REG); + bcount.b.high = IN_BYTE (IDE_BCOUNTH_REG); /* Get the number of bytes to transfer */ + bcount.b.low = IN_BYTE (IDE_BCOUNTL_REG); /* on this interrupt */ + ireason.all = IN_BYTE (IDE_IREASON_REG); if (ireason.b.cod) { printk (KERN_ERR "ide-tape: CoD != 0 in idetape_pc_intr\n"); @@ -2093,8 +2152,8 @@ if ( temp > pc->request_transfer) { if (temp > pc->buffer_size) { printk (KERN_ERR "ide-tape: The tape wants to send us more data than expected - discarding data\n"); - idetape_discard_data (drive,bcount.all); - ide_set_handler (drive,&idetape_pc_intr,IDETAPE_WAIT_CMD,NULL); + idetape_discard_data (drive, bcount.all); + ide_set_handler (drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL); return ide_started; } #if IDETAPE_DEBUG_LOG @@ -2114,13 +2173,13 @@ else atapi_input_bytes (drive,pc->current_position,bcount.all); /* Read the current buffer */ } - pc->actually_transferred+=bcount.all; /* Update the current position */ + pc->actually_transferred += bcount.all; /* Update the current position */ pc->current_position+=bcount.all; #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 2) printk(KERN_INFO "ide-tape: [cmd %x] transferred %d bytes on that interrupt\n", pc->c[0], bcount.all); #endif - ide_set_handler (drive,&idetape_pc_intr,IDETAPE_WAIT_CMD,NULL); /* And set the interrupt handler again */ + ide_set_handler (drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL); /* And set the interrupt handler again */ return ide_started; } @@ -2178,7 +2237,7 @@ printk (KERN_ERR "ide-tape: Strange, packet command initiated yet DRQ isn't asserted\n"); return startstop; } - ireason.all=IN_BYTE (IDE_IREASON_REG); + ireason.all = IN_BYTE (IDE_IREASON_REG); while (retries-- && (!ireason.b.cod || ireason.b.io)) { printk(KERN_ERR "ide-tape: (IO,CoD != (0,1) while issuing a packet command, retrying\n"); udelay(100); @@ -2203,7 +2262,7 @@ { idetape_tape_t *tape = drive->driver_data; idetape_bcount_reg_t bcount; - int dma_ok=0; + int dma_ok = 0; #if IDETAPE_DEBUG_BUGS if (tape->pc->c[0] == IDETAPE_REQUEST_SENSE_CMD && pc->c[0] == IDETAPE_REQUEST_SENSE_CMD) { @@ -2212,8 +2271,8 @@ #endif /* IDETAPE_DEBUG_BUGS */ if (tape->failed_pc == NULL && pc->c[0] != IDETAPE_REQUEST_SENSE_CMD) - tape->failed_pc=pc; - tape->pc=pc; /* Set the current packet command */ + tape->failed_pc = pc; + tape->pc = pc; /* Set the current packet command */ if (pc->retries > IDETAPE_MAX_PC_RETRIES || test_bit (PC_ABORT, &pc->flags)) { /* @@ -2223,24 +2282,25 @@ * example). */ if (!test_bit (PC_ABORT, &pc->flags)) { - if (!(pc->c[0] == 0 && tape->sense_key == 2 && tape->asc == 4 && (tape->ascq == 1 || tape->ascq == 8))) { + if (!(pc->c[0] == IDETAPE_TEST_UNIT_READY_CMD && tape->sense_key == 2 && + tape->asc == 4 && (tape->ascq == 1 || tape->ascq == 8))) { printk (KERN_ERR "ide-tape: %s: I/O error, pc = %2x, key = %2x, asc = %2x, ascq = %2x\n", tape->name, pc->c[0], tape->sense_key, tape->asc, tape->ascq); - if (tape->onstream && pc->c[0] == 8 && tape->sense_key == 3 && tape->asc == 0x11) /* AJN-1: 11 should be 0x11 */ + if (tape->onstream && pc->c[0] == IDETAPE_READ_CMD && tape->sense_key == 3 && tape->asc == 0x11) /* AJN-1: 11 should be 0x11 */ printk(KERN_ERR "ide-tape: %s: enabling read error recovery\n", tape->name); } pc->error = IDETAPE_ERROR_GENERAL; /* Giving up */ } - tape->failed_pc=NULL; + tape->failed_pc = NULL; return pc->callback(drive); } #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 2) - printk (KERN_INFO "ide-tape: Retry number - %d\n",pc->retries); + printk (KERN_INFO "ide-tape: Retry number - %d\n", pc->retries); #endif /* IDETAPE_DEBUG_LOG */ pc->retries++; - pc->actually_transferred=0; /* We haven't transferred any data yet */ + pc->actually_transferred = 0; /* We haven't transferred any data yet */ pc->current_position=pc->buffer; bcount.all=pc->request_transfer; /* Request to transfer the entire buffer at once */ @@ -2250,15 +2310,15 @@ (void) HWIF(drive)->dmaproc(ide_dma_off, drive); } if (test_bit (PC_DMA_RECOMMENDED, &pc->flags) && drive->using_dma) - dma_ok=!HWIF(drive)->dmaproc(test_bit (PC_WRITING, &pc->flags) ? ide_dma_write : ide_dma_read, drive); + dma_ok = !HWIF(drive)->dmaproc(test_bit (PC_WRITING, &pc->flags) ? ide_dma_write : ide_dma_read, drive); #endif /* CONFIG_BLK_DEV_IDEDMA */ if (IDE_CONTROL_REG) - OUT_BYTE (drive->ctl,IDE_CONTROL_REG); - OUT_BYTE (dma_ok ? 1:0,IDE_FEATURE_REG); /* Use PIO/DMA */ - OUT_BYTE (bcount.b.high,IDE_BCOUNTH_REG); - OUT_BYTE (bcount.b.low,IDE_BCOUNTL_REG); - OUT_BYTE (drive->select.all,IDE_SELECT_REG); + OUT_BYTE (drive->ctl, IDE_CONTROL_REG); + OUT_BYTE (dma_ok ? 1 : 0, IDE_FEATURE_REG); /* Use PIO/DMA */ + OUT_BYTE (bcount.b.high, IDE_BCOUNTH_REG); + OUT_BYTE (bcount.b.low, IDE_BCOUNTL_REG); + OUT_BYTE (drive->select.all, IDE_SELECT_REG); #ifdef CONFIG_BLK_DEV_IDEDMA if (dma_ok) { /* Begin DMA, if necessary */ set_bit (PC_DMA_IN_PROGRESS, &pc->flags); @@ -2287,7 +2347,7 @@ printk (KERN_INFO "ide-tape: Reached idetape_pc_callback\n"); #endif /* IDETAPE_DEBUG_LOG */ - idetape_end_request (tape->pc->error ? 0:1, HWGROUP(drive)); + idetape_end_request (tape->pc->error ? 0 : 1, HWGROUP(drive)); return ide_stopped; } @@ -2298,11 +2358,14 @@ { idetape_init_pc (pc); pc->c[0] = IDETAPE_MODE_SENSE_CMD; - pc->c[1] = 8; /* DBD = 1 - Don't return block descriptors for now */ + if (page_code != IDETAPE_BLOCK_DESCRIPTOR) + pc->c[1] = 8; /* DBD = 1 - Don't return block descriptors */ pc->c[2] = page_code; pc->c[3] = 255; /* Don't limit the returned information */ pc->c[4] = 255; /* (We will just discard data in that case) */ - if (page_code == IDETAPE_CAPABILITIES_PAGE) + if (page_code == IDETAPE_BLOCK_DESCRIPTOR) + pc->request_transfer = 12; + else if (page_code == IDETAPE_CAPABILITIES_PAGE) pc->request_transfer = 24; else pc->request_transfer = 50; @@ -2333,7 +2396,7 @@ if (tape->debug_level >= 1) printk(KERN_INFO "ide-tape: buffer fill callback, %d/%d\n", tape->cur_frames, tape->max_frames); #endif - idetape_end_request (tape->pc->error ? 0:1, HWGROUP(drive)); + idetape_end_request (tape->pc->error ? 0 : 1, HWGROUP(drive)); return ide_stopped; } @@ -2344,7 +2407,7 @@ pc = idetape_next_pc_storage (drive); rq = idetape_next_rq_storage (drive); - idetape_create_mode_sense_cmd (pc, 0x33); + idetape_create_mode_sense_cmd (pc, IDETAPE_BUFFER_FILLING_PAGE); pc->callback = idetape_onstream_buffer_fill_callback; idetape_queue_pc_head (drive, pc, rq); } @@ -2564,7 +2627,7 @@ * We do not support buffer cache originated requests. */ printk (KERN_NOTICE "ide-tape: %s: Unsupported command in request queue (%d)\n", drive->name, rq->cmd); - ide_end_request (0,HWGROUP (drive)); /* Let the common code handle it */ + ide_end_request (0, HWGROUP (drive)); /* Let the common code handle it */ return ide_stopped; } @@ -2578,7 +2641,7 @@ if (postponed_rq != NULL) if (rq != postponed_rq) { printk (KERN_ERR "ide-tape: ide-tape.c bug - Two DSC requests were queued\n"); - idetape_end_request (0,HWGROUP (drive)); + idetape_end_request (0, HWGROUP (drive)); return ide_stopped; } #endif /* IDETAPE_DEBUG_BUGS */ @@ -2624,8 +2687,15 @@ tape->insert_speed = tape->insert_size / 1024 * HZ / (jiffies - tape->insert_time); calculate_speeds(drive); if (tape->onstream && tape->max_frames && - ((rq->cmd == IDETAPE_WRITE_RQ && (tape->cur_frames == tape->max_frames || (tape->speed_control && tape->cur_frames > 5 && (tape->insert_speed > tape->max_insert_speed || (0 /* tape->cur_frames > 30 && tape->tape_still_time > 200 */))))) || - (rq->cmd == IDETAPE_READ_RQ && (tape->cur_frames == 0 || (tape->speed_control && (tape->cur_frames < tape->max_frames - 5) && tape->insert_speed > tape->max_insert_speed)) && rq->nr_sectors))) { + ((rq->cmd == IDETAPE_WRITE_RQ && + ( tape->cur_frames == tape->max_frames || + ( tape->speed_control && tape->cur_frames > 5 && + (tape->insert_speed > tape->max_insert_speed || + (0 /* tape->cur_frames > 30 && tape->tape_still_time > 200 */) ) ) ) ) || + (rq->cmd == IDETAPE_READ_RQ && + ( tape->cur_frames == 0 || + ( tape->speed_control && (tape->cur_frames < tape->max_frames - 5) && + tape->insert_speed > tape->max_insert_speed ) ) && rq->nr_sectors) ) ) { #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 4) printk(KERN_INFO "ide-tape: postponing request, cmd %d, cur %d, max %d\n", @@ -2672,7 +2742,7 @@ if (jiffies > tape->last_buffer_fill + 5 * HZ / 100) tape->req_buffer_fill = 1; } - pc=idetape_next_pc_storage (drive); + pc = idetape_next_pc_storage (drive); idetape_create_read_cmd (tape, pc, rq->current_nr_sectors, rq->bh); break; case IDETAPE_WRITE_RQ: @@ -2689,12 +2759,12 @@ tape->req_buffer_fill = 1; calculate_speeds(drive); } - pc=idetape_next_pc_storage (drive); + pc = idetape_next_pc_storage (drive); idetape_create_write_cmd (tape, pc, rq->current_nr_sectors, rq->bh); break; case IDETAPE_READ_BUFFER_RQ: tape->postpone_cnt = 0; - pc=idetape_next_pc_storage (drive); + pc = idetape_next_pc_storage (drive); idetape_create_read_buffer_cmd (tape, pc, rq->current_nr_sectors, rq->bh); break; case IDETAPE_ABORTED_WRITE_RQ: @@ -2710,7 +2780,7 @@ idetape_end_request (IDETAPE_ERROR_EOD, HWGROUP(drive)); return ide_stopped; case IDETAPE_PC_RQ1: - pc=(idetape_pc_t *) rq->buffer; + pc = (idetape_pc_t *) rq->buffer; rq->cmd = IDETAPE_PC_RQ2; break; case IDETAPE_PC_RQ2: @@ -2718,7 +2788,7 @@ return ide_stopped; default: printk (KERN_ERR "ide-tape: bug in IDETAPE_RQ_CMD macro\n"); - idetape_end_request (0,HWGROUP (drive)); + idetape_end_request (0, HWGROUP (drive)); return ide_stopped; } return idetape_issue_packet_command (drive, pc); @@ -2844,7 +2914,9 @@ #endif /* IDETAPE_DEBUG_BUGS */ count = IDE_MIN (bh->b_size - atomic_read(&bh->b_count), n); copy_from_user (bh->b_data + atomic_read(&bh->b_count), buf, count); - n -= count; atomic_add(count, &bh->b_count); buf += count; + n -= count; + atomic_add(count, &bh->b_count); + buf += count; if (atomic_read(&bh->b_count) == bh->b_size) { bh = bh->b_reqnext; if (bh) @@ -2868,7 +2940,10 @@ #endif /* IDETAPE_DEBUG_BUGS */ count = IDE_MIN (tape->b_count, n); copy_to_user (buf, tape->b_data, count); - n -= count; tape->b_data += count; tape->b_count -= count; buf += count; + n -= count; + tape->b_data += count; + tape->b_count -= count; + buf += count; if (!tape->b_count) { tape->bh = bh = bh->b_reqnext; if (bh) { @@ -2920,10 +2995,10 @@ if (tape->last_stage != NULL) tape->last_stage->next=stage; else - tape->first_stage=tape->next_stage=stage; - tape->last_stage=stage; + tape->first_stage = tape->next_stage=stage; + tape->last_stage = stage; if (tape->next_stage == NULL) - tape->next_stage=tape->last_stage; + tape->next_stage = tape->last_stage; tape->nr_stages++; tape->nr_pending_stages++; spin_unlock_irqrestore(&tape->spinlock, flags); @@ -2953,26 +3028,21 @@ par->par_desc_ver = OS_PARTITION_VERSION; par->wrt_pass_cntr = htons(0xffff); par->first_frame_addr = htonl(0); - par->last_frame_addr = htonl(0xbb7); + par->last_frame_addr = htonl(0xbb7); /* 2999 */ + aux->frame_seq_num = htonl(0); + aux->logical_blk_num_high = htonl(0); + aux->logical_blk_num = htonl(0); + aux->next_mark_addr = htonl(tape->first_mark_addr); } else { aux->update_frame_cntr = htonl(0); par->partition_num = OS_DATA_PARTITION; par->par_desc_ver = OS_PARTITION_VERSION; par->wrt_pass_cntr = htons(tape->wrt_pass_cntr); - par->first_frame_addr = htonl(0x14); - par->last_frame_addr = htonl(19239 * 24); - } - if (frame_type != OS_FRAME_TYPE_HEADER) { + par->first_frame_addr = htonl(OS_DATA_STARTFRAME1); + par->last_frame_addr = htonl(tape->capacity); aux->frame_seq_num = htonl(logical_blk_num); aux->logical_blk_num_high = htonl(0); aux->logical_blk_num = htonl(logical_blk_num); - } else { - aux->frame_seq_num = htonl(0); - aux->logical_blk_num_high = htonl(0); - aux->logical_blk_num = htonl(0); - } - - if (frame_type != OS_FRAME_TYPE_HEADER) { dat->dat_sz = 8; dat->reserved1 = 0; dat->entry_cnt = 1; @@ -2987,11 +3057,10 @@ else dat->dat_list[0].flags = OS_DAT_FLAGS_DATA; dat->dat_list[0].reserved = 0; - } else - aux->next_mark_addr = htonl(tape->first_mark_addr); - aux->filemark_cnt = ntohl(tape->filemark_cnt); - aux->phys_fm = ntohl(0xffffffff); - aux->last_mark_addr = ntohl(tape->last_mark_addr); + } + aux->filemark_cnt = ntohl(tape->filemark_cnt); /* shouldn't this be htonl ?? */ + aux->phys_fm = ntohl(0xffffffff); /* shouldn't this be htonl ?? */ + aux->last_mark_addr = ntohl(tape->last_mark_addr); /* shouldn't this be htonl ?? */ } /* @@ -3026,10 +3095,10 @@ idetape_tape_t *tape = drive->driver_data; idetape_read_position_result_t *result; -#if IDETAPE_DEBUG_LOG - if (tape->debug_level >= 4) +//#if IDETAPE_DEBUG_LOG +// if (tape->debug_level >= 4) printk (KERN_INFO "ide-tape: Reached idetape_read_position_callback\n"); -#endif /* IDETAPE_DEBUG_LOG */ +//#endif /* IDETAPE_DEBUG_LOG */ if (!tape->pc->error) { result = (idetape_read_position_result_t *) tape->pc->buffer; @@ -3042,7 +3111,7 @@ if (result->bpu) { printk (KERN_INFO "ide-tape: Block location is unknown to the tape\n"); clear_bit (IDETAPE_ADDRESS_VALID, &tape->flags); - idetape_end_request (0,HWGROUP (drive)); + idetape_end_request (0, HWGROUP (drive)); } else { #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 2) @@ -3053,10 +3122,10 @@ tape->last_frame_position = ntohl (result->last_block); tape->blocks_in_buffer = result->blocks_in_buffer[2]; set_bit (IDETAPE_ADDRESS_VALID, &tape->flags); - idetape_end_request (1,HWGROUP (drive)); + idetape_end_request (1, HWGROUP (drive)); } } else { - idetape_end_request (0,HWGROUP (drive)); + idetape_end_request (0, HWGROUP (drive)); } return ide_stopped; } @@ -3076,8 +3145,8 @@ idetape_init_pc (pc); pc->c[0] = IDETAPE_WRITE_FILEMARK_CMD; if (tape->onstream) - pc->c[1] = 1; - pc->c[4] = write_filemark; + pc->c[1] = 1; /* Immed bit */ + pc->c[4] = write_filemark; /* not used for OnStream ?? */ set_bit (PC_WAIT_FOR_DSC, &pc->flags); pc->callback = &idetape_pc_callback; } @@ -3109,7 +3178,7 @@ * the request to the request list without waiting for it to be serviced ! * In that case, we usually use idetape_queue_pc_head. */ -static int __idetape_queue_pc_tail (ide_drive_t *drive,idetape_pc_t *pc) +static int __idetape_queue_pc_tail (ide_drive_t *drive, idetape_pc_t *pc) { struct request rq; @@ -3150,7 +3219,7 @@ return 0; if (tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2) { idetape_create_load_unload_cmd (drive, &pc, IDETAPE_LU_LOAD_MASK); - __idetape_queue_pc_tail(drive,&pc); + __idetape_queue_pc_tail(drive, &pc); idetape_create_test_unit_ready_cmd(&pc); if (!__idetape_queue_pc_tail(drive, &pc)) return 0; @@ -3169,7 +3238,8 @@ int rc; rc = __idetape_queue_pc_tail(drive, pc); - if (rc) return rc; + if (rc) + return rc; if (tape->onstream && test_bit(PC_WAIT_FOR_DSC, &pc->flags)) rc = idetape_wait_ready(drive, 60 * 10 * HZ); /* AJN-4: Changed from 5 to 10 minutes; because retension takes approx. 8:20 with Onstream 30GB tape */ @@ -3182,7 +3252,7 @@ int rc; idetape_create_write_filemark_cmd(drive, &pc, 0); - if ((rc = idetape_queue_pc_tail (drive,&pc))) + if ((rc = idetape_queue_pc_tail (drive, &pc))) return rc; idetape_wait_ready(drive, 60 * 5 * HZ); return 0; @@ -3202,11 +3272,16 @@ idetape_pc_t pc; int position; +//#if IDETAPE_DEBUG_LOG +// if (tape->debug_level >= 4) + printk (KERN_INFO "ide-tape: Reached idetape_read_position\n"); +//#endif /* IDETAPE_DEBUG_LOG */ + #ifdef NO_LONGER_REQUIRED idetape_flush_tape_buffers(drive); #endif idetape_create_read_position_cmd(&pc); - if (idetape_queue_pc_tail (drive,&pc)) + if (idetape_queue_pc_tail (drive, &pc)) return -1; position = tape->first_frame_position; #ifdef NO_LONGER_REQUIRED @@ -3231,12 +3306,17 @@ idetape_init_pc (pc); pc->c[0] = IDETAPE_LOCATE_CMD; if (tape->onstream) - pc->c[1] = 1; + pc->c[1] = 1; /* Immediate bit */ else pc->c[1] = 2; put_unaligned (htonl (block), (unsigned int *) &pc->c[3]); pc->c[8] = partition; if (tape->onstream) + /* + * Set SKIP bit. + * In case of write error this will write buffered + * data in the drive to this new position! + */ pc->c[9] = skip << 7; set_bit (PC_WAIT_FOR_DSC, &pc->flags); pc->callback = &idetape_pc_callback; @@ -3307,11 +3387,12 @@ __idetape_discard_read_pipeline(drive); idetape_wait_ready(drive, 60 * 5 * HZ); idetape_create_locate_cmd (drive, &pc, block, partition, skip); - retval=idetape_queue_pc_tail (drive,&pc); - if (retval) return (retval); + retval = idetape_queue_pc_tail (drive, &pc); + if (retval) + return (retval); idetape_create_read_position_cmd (&pc); - return (idetape_queue_pc_tail (drive,&pc)); + return (idetape_queue_pc_tail (drive, &pc)); } static void idetape_discard_read_pipeline (ide_drive_t *drive, int restore_position) @@ -3339,7 +3420,7 @@ { idetape_pc_t pc; - idetape_create_mode_sense_cmd (&pc, 0x33); + idetape_create_mode_sense_cmd (&pc, IDETAPE_BUFFER_FILLING_PAGE); pc.callback = idetape_onstream_buffer_fill_callback; (void) idetape_queue_pc_tail(drive, &pc); } @@ -3447,33 +3528,41 @@ idetape_tape_t *tape = drive->driver_data; unsigned int block; - if (tape->onstream_write_error == 1) { - printk(KERN_ERR "ide-tape: %s: detected physical bad block at %u\n", tape->name, ntohl(tape->sense.information)); - block = ntohl(tape->sense.information) + 80; + if (tape->onstream_write_error == OS_WRITE_ERROR) { + printk(KERN_ERR "ide-tape: %s: onstream_write_error_recovery: detected physical bad block at %u, logical %u first frame %u last_frame %u bufblocks %u stages %u skipping %u frames\n", + tape->name, ntohl(tape->sense.information), tape->logical_blk_num, + tape->first_frame_position, tape->last_frame_position, + tape->blocks_in_buffer, tape->nr_stages, + (ntohl(tape->sense.command_specific) >> 16) & 0xff ); + block = ntohl(tape->sense.information) + ((ntohl(tape->sense.command_specific) >> 16) & 0xff); idetape_update_stats(drive); printk(KERN_ERR "ide-tape: %s: relocating %d buffered logical blocks to physical block %u\n", tape->name, tape->cur_frames, block); +#if 0 /* isn't once enough ??? MM */ idetape_update_stats(drive); +#endif if (tape->firmware_revision_num >= 106) idetape_position_tape(drive, block, 0, 1); else { idetape_onstream_read_back_buffer(drive); idetape_position_tape(drive, block, 0, 0); } +#if 0 /* already done in idetape_position_tape MM */ idetape_read_position(drive); +#endif #if ONSTREAM_DEBUG if (tape->debug_level >= 1) printk(KERN_ERR "ide-tape: %s: positioning complete, cur_frames %d, pos %d, tape pos %d\n", tape->name, tape->cur_frames, tape->first_frame_position, tape->last_frame_position); #endif - } else if (tape->onstream_write_error == 2) { + } else if (tape->onstream_write_error == OS_PART_ERROR) { #if ONSTREAM_DEBUG if (tape->debug_level >= 1) printk(KERN_INFO "ide-tape: %s: skipping over config partition\n", tape->name); #endif idetape_flush_tape_buffers(drive); block = idetape_read_position(drive); - if (block != 0xba4) - printk(KERN_ERR "ide-tape: warning, current position %d, expected %d\n", block, 0xba4); - idetape_position_tape(drive, 0xbb8, 0, 0); + if (block != OS_DATA_ENDFRAME1) + printk(KERN_ERR "ide-tape: warning, current position %d, expected %d\n", block, OS_DATA_ENDFRAME1); + idetape_position_tape(drive, 0xbb8, 0, 0); /* 3000 */ } tape->onstream_write_error = 0; } @@ -3572,48 +3661,48 @@ return 1; } if (rq->errors == IDETAPE_ERROR_GENERAL) { - printk(KERN_INFO "ide-tape: %s: skipping frame, read error\n", tape->name); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, read error\n", tape->name, tape->first_frame_position); return 0; } if (rq->errors == IDETAPE_ERROR_EOD) { - printk(KERN_INFO "ide-tape: %s: skipping frame, eod\n", tape->name); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, eod\n", tape->name, tape->first_frame_position); return 0; } if (ntohl(aux->format_id) != 0) { - printk(KERN_INFO "ide-tape: %s: skipping frame, format_id %u\n", tape->name, ntohl(aux->format_id)); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, format_id %u\n", tape->name, tape->first_frame_position, ntohl(aux->format_id)); return 0; } if (memcmp(aux->application_sig, tape->application_sig, 4) != 0) { - printk(KERN_INFO "ide-tape: %s: skipping frame, incorrect application signature\n", tape->name); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, incorrect application signature\n", tape->name, tape->first_frame_position); return 0; } if (aux->frame_type != OS_FRAME_TYPE_DATA && aux->frame_type != OS_FRAME_TYPE_EOD && aux->frame_type != OS_FRAME_TYPE_MARKER) { - printk(KERN_INFO "ide-tape: %s: skipping frame, frame type %x\n", tape->name, aux->frame_type); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, frame type %x\n", tape->name, tape->first_frame_position, aux->frame_type); return 0; } if (par->partition_num != OS_DATA_PARTITION) { if (!tape->linux_media || tape->linux_media_version != 2) { - printk(KERN_INFO "ide-tape: %s: skipping frame, partition num %d\n", tape->name, par->partition_num); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, partition num %d\n", tape->name, tape->first_frame_position, par->partition_num); return 0; } } if (par->par_desc_ver != OS_PARTITION_VERSION) { - printk(KERN_INFO "ide-tape: %s: skipping frame, partition version %d\n", tape->name, par->par_desc_ver); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, partition version %d\n", tape->name, tape->first_frame_position, par->par_desc_ver); return 0; } if (ntohs(par->wrt_pass_cntr) != tape->wrt_pass_cntr) { - printk(KERN_INFO "ide-tape: %s: skipping frame, wrt_pass_cntr %d (expected %d)(logical_blk_num %u)\n", tape->name, ntohs(par->wrt_pass_cntr), tape->wrt_pass_cntr, ntohl(aux->logical_blk_num)); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, wrt_pass_cntr %d (expected %d)(logical_blk_num %u)\n", tape->name, tape->first_frame_position, ntohs(par->wrt_pass_cntr), tape->wrt_pass_cntr, ntohl(aux->logical_blk_num)); return 0; } if (aux->frame_seq_num != aux->logical_blk_num) { - printk(KERN_INFO "ide-tape: %s: skipping frame, seq != logical\n", tape->name); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, seq != logical\n", tape->name, tape->first_frame_position); return 0; } if (logical_blk_num != -1 && ntohl(aux->logical_blk_num) != logical_blk_num) { if (!quiet) - printk(KERN_INFO "ide-tape: %s: skipping frame, logical_blk_num %u (expected %d)\n", tape->name, ntohl(aux->logical_blk_num), logical_blk_num); + printk(KERN_INFO "ide-tape: %s: skipping frame %d, logical_blk_num %u (expected %d)\n", tape->name, tape->first_frame_position, ntohl(aux->logical_blk_num), logical_blk_num); return 0; } if (aux->frame_type == OS_FRAME_TYPE_MARKER) { @@ -3689,7 +3778,7 @@ idetape_switch_buffers (tape, new_stage); idetape_init_stage(drive, new_stage, OS_FRAME_TYPE_DATA, tape->logical_blk_num); tape->logical_blk_num++; - idetape_add_stage_tail (drive,new_stage); + idetape_add_stage_tail (drive, new_stage); tape->pipeline_head++; #if USE_IOTRACE IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor); @@ -3766,7 +3855,7 @@ } #endif /* IDETAPE_DEBUG_BUGS */ if (tape->merge_stage_size) { - blocks=tape->merge_stage_size/tape->tape_block_size; + blocks = tape->merge_stage_size / tape->tape_block_size; if (tape->merge_stage_size % tape->tape_block_size) { blocks++; i = tape->tape_block_size - tape->merge_stage_size % tape->tape_block_size; @@ -3797,7 +3886,7 @@ tape->merge_stage = NULL; } clear_bit (IDETAPE_PIPELINE_ERROR, &tape->flags); - tape->chrdev_direction=idetape_direction_none; + tape->chrdev_direction = idetape_direction_none; /* * On the next backup, perform the feedback loop again. @@ -3874,13 +3963,13 @@ rq.sector = tape->first_frame_position; rq.nr_sectors = rq.current_nr_sectors = blocks; if (!test_bit(IDETAPE_PIPELINE_ERROR, &tape->flags) && tape->nr_stages <= max_stages) { - new_stage=idetape_kmalloc_stage (tape); + new_stage = idetape_kmalloc_stage (tape); while (new_stage != NULL) { - new_stage->rq=rq; - idetape_add_stage_tail (drive,new_stage); + new_stage->rq = rq; + idetape_add_stage_tail (drive, new_stage); if (tape->nr_stages >= max_stages) break; - new_stage=idetape_kmalloc_stage (tape); + new_stage = idetape_kmalloc_stage (tape); } } if (!idetape_pipeline_active(tape)) { @@ -3922,16 +4011,23 @@ #endif clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); position = idetape_read_position(drive); + printk(KERN_INFO "ide-tape: %s: blank block detected at %d\n", tape->name, position); if (position >= 3000 && position < 3080) - position += 32; - if (position >= 2980 && position < 3000) + position += 32; /* Why is this check and number ??? MM */ + if (position >= OS_DATA_ENDFRAME1 && position < 3000) position = 3000; else + /* + * compensate for write errors that generally skip 80 frames, + * expect around 20 read errors in a row... + */ position += 60; - if (position >= 2980 && position < 3000) + if (position >= OS_DATA_ENDFRAME1 && position < 3000) position = 3000; - printk(KERN_INFO "ide-tape: %s: blank block detected, positioning tape to block %d\n", tape->name, position); - idetape_position_tape(drive, position, 0, 1); + printk(KERN_INFO "ide-tape: %s: positioning tape to block %d\n", tape->name, position); + if (position == 3000) /* seems to be needed to correctly position at block 3000 MM */ + idetape_position_tape(drive, 0, 0, 0); + idetape_position_tape(drive, position, 0, 0); cnt += 40; continue; } else @@ -4089,12 +4185,14 @@ #endif /* IDETAPE_DEBUG_LOG */ idetape_create_rewind_cmd (drive, &pc); - retval=idetape_queue_pc_tail (drive,&pc); - if (retval) return retval; + retval = idetape_queue_pc_tail (drive, &pc); + if (retval) + return retval; idetape_create_read_position_cmd (&pc); - retval = idetape_queue_pc_tail (drive,&pc); - if (retval) return retval; + retval = idetape_queue_pc_tail (drive, &pc); + if (retval) + return retval; tape->logical_blk_num = 0; return 0; } @@ -4412,7 +4510,7 @@ switch (mt_op) { case MTFSF: idetape_create_space_cmd (&pc,mt_count-count,IDETAPE_SPACE_OVER_FILEMARK); - return (idetape_queue_pc_tail (drive,&pc)); + return (idetape_queue_pc_tail (drive, &pc)); case MTFSFM: if (!tape->capabilities.sprev) return (-EIO); @@ -4423,7 +4521,7 @@ if (!tape->capabilities.sprev) return (-EIO); idetape_create_space_cmd (&pc,-(mt_count+count),IDETAPE_SPACE_OVER_FILEMARK); - return (idetape_queue_pc_tail (drive,&pc)); + return (idetape_queue_pc_tail (drive, &pc)); case MTBSFM: if (!tape->capabilities.sprev) return (-EIO); @@ -4460,7 +4558,7 @@ struct inode *inode = file->f_dentry->d_inode; ide_drive_t *drive = get_drive_ptr (inode->i_rdev); idetape_tape_t *tape = drive->driver_data; - ssize_t bytes_read,temp,actually_read=0, rc; + ssize_t bytes_read,temp, actually_read = 0, rc; if (ppos != &file->f_pos) { /* "A request was outside the capabilities of the device." */ @@ -4482,28 +4580,32 @@ } if ((rc = idetape_initiate_read(drive, tape->max_stages)) < 0) return rc; - if (count==0) + if (count == 0) return (0); if (tape->merge_stage_size) { - actually_read=IDE_MIN (tape->merge_stage_size,count); + actually_read = IDE_MIN (tape->merge_stage_size, count); idetape_copy_stage_to_user (tape, buf, tape->merge_stage, actually_read); - buf += actually_read; tape->merge_stage_size -= actually_read; count-=actually_read; + buf += actually_read; + tape->merge_stage_size -= actually_read; + count -= actually_read; } while (count >= tape->stage_size) { - bytes_read=idetape_add_chrdev_read_request (drive, tape->capabilities.ctl); + bytes_read = idetape_add_chrdev_read_request (drive, tape->capabilities.ctl); if (bytes_read <= 0) goto finish; idetape_copy_stage_to_user (tape, buf, tape->merge_stage, bytes_read); - buf += bytes_read; count -= bytes_read; actually_read += bytes_read; + buf += bytes_read; + count -= bytes_read; + actually_read += bytes_read; } if (count) { bytes_read=idetape_add_chrdev_read_request (drive, tape->capabilities.ctl); if (bytes_read <= 0) goto finish; - temp=IDE_MIN (count,bytes_read); + temp = IDE_MIN (count, bytes_read); idetape_copy_stage_to_user (tape, buf, tape->merge_stage, temp); - actually_read+=temp; - tape->merge_stage_size=bytes_read-temp; + actually_read += temp; + tape->merge_stage_size = bytes_read-temp; } finish: if (!actually_read && test_bit (IDETAPE_FILEMARK, &tape->flags)) { @@ -4515,7 +4617,8 @@ return 0; } if (tape->onstream && !actually_read && test_and_clear_bit(IDETAPE_READ_ERROR, &tape->flags)) { - printk(KERN_ERR "ide-tape: %s: unrecovered read error on logical block number %d, skipping\n", tape->name, tape->logical_blk_num); + printk(KERN_ERR "ide-tape: %s: unrecovered read error on logical block number %d, skipping\n", + tape->name, tape->logical_blk_num); tape->logical_blk_num++; return -EIO; } @@ -4576,6 +4679,37 @@ return; } +static void idetape_write_filler (ide_drive_t *drive, int block, int cnt) +{ + idetape_tape_t *tape = drive->driver_data; + idetape_stage_t *stage; + int rc; + + if (!tape->onstream || tape->raw) + return; + stage = __idetape_kmalloc_stage(tape, 1, 1); + if (stage == NULL) + return; + idetape_init_stage(drive, stage, OS_FRAME_TYPE_FILL, 0); + idetape_wait_ready(drive, 60 * 5 * HZ); + rc = idetape_position_tape(drive, block, 0, 0); +#if ONSTREAM_DEBUG + printk(KERN_INFO "write_filler: positioning failed it returned %d\n", rc); +#endif + if (rc != 0) + return; /* don't write fillers if we cannot position the tape. */ + + strcpy(stage->bh->b_data, "Filler"); + while (cnt--) { + if (!idetape_queue_rw_tail (drive, IDETAPE_WRITE_RQ, 1, stage->bh)) { + printk(KERN_INFO "ide-tape: %s: write_filler: couldn't write header frame\n", tape->name); + __idetape_kfree_stage (stage); + return; + } + } + __idetape_kfree_stage (stage); +} + static void __idetape_write_header (ide_drive_t *drive, int block, int cnt) { idetape_tape_t *tape = drive->driver_data; @@ -4591,12 +4725,12 @@ memset(&header, 0, sizeof(header)); strcpy(header.ident_str, "ADR_SEQ"); header.major_rev = 1; - header.minor_rev = 2; + header.minor_rev = OS_ADR_MINREV; header.par_num = 1; header.partition.partition_num = OS_DATA_PARTITION; header.partition.par_desc_ver = OS_PARTITION_VERSION; - header.partition.first_frame_addr = htonl(0x14); - header.partition.last_frame_addr = htonl(19239 * 24); + header.partition.first_frame_addr = htonl(OS_DATA_STARTFRAME1); + header.partition.last_frame_addr = htonl(tape->capacity); header.partition.wrt_pass_cntr = htons(tape->wrt_pass_cntr); header.partition.eod_frame_addr = htonl(tape->eod_frame_addr); memcpy(stage->bh->b_data, &header, sizeof(header)); @@ -4623,7 +4757,7 @@ return; tape->update_frame_cntr++; __idetape_write_header(drive, 5, 5); - __idetape_write_header(drive, 0xbae, 5); + __idetape_write_header(drive, 0xbae, 5); /* 2990 */ if (locate_eod) { #if ONSTREAM_DEBUG if (tape->debug_level >= 2) @@ -4639,22 +4773,39 @@ struct inode *inode = file->f_dentry->d_inode; ide_drive_t *drive = get_drive_ptr (inode->i_rdev); idetape_tape_t *tape = drive->driver_data; - ssize_t retval,actually_written=0; + ssize_t retval, actually_written = 0; int position; if (ppos != &file->f_pos) { /* "A request was outside the capabilities of the device." */ return -ENXIO; } - if (tape->onstream && (count != tape->tape_block_size)) { - printk(KERN_ERR "ide-tape: %s: use %d bytes as block size (%Zd used)\n", tape->name, tape->tape_block_size, count); - return -EINVAL; - } + #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 3) printk (KERN_INFO "ide-tape: Reached idetape_chrdev_write, count %Zd\n", count); #endif /* IDETAPE_DEBUG_LOG */ + if (tape->onstream) { + if (count != tape->tape_block_size) { + printk(KERN_ERR "ide-tape: %s: chrdev_write: use %d bytes as block size (%d used)\n", + tape->name, tape->tape_block_size, count); + return -EINVAL; + } + /* + * Check if we reach the end of the tape. Just assume the whole pipeline + * is filled with write requests! + */ + if (tape->first_frame_position + tape->nr_stages >= tape->capacity - OS_EW) { +#if ONSTREAM_DEBUG + printk(KERN_INFO, "chrdev_write: Write truncated at EOM early warning"); +#endif + if (tape->chrdev_direction == idetape_direction_write) + idetape_write_release(inode); + return -ENOSPC; + } + } + if (tape->chrdev_direction != idetape_direction_write) { /* Initialize write operation */ if (tape->chrdev_direction == idetape_direction_read) idetape_discard_read_pipeline (drive, 1); @@ -4671,17 +4822,17 @@ if (tape->onstream) { position = idetape_read_position(drive); - if (position <= 20) { + if (position <= OS_DATA_STARTFRAME1) { tape->logical_blk_num = 0; tape->wrt_pass_cntr++; #if ONSTREAM_DEBUG if (tape->debug_level >= 2) - printk(KERN_INFO "ide-tape: %s: logical block num 0, setting eod to 20\n", tape->name); + printk(KERN_INFO "ide-tape: %s: logical block num 0, setting eod to %d\n", tape->name, OS_DATA_STARTFRAME1); if (tape->debug_level >= 2) printk(KERN_INFO "ide-tape: %s: allocating new write pass counter %d\n", tape->name, tape->wrt_pass_cntr); #endif tape->filemark_cnt = 0; - tape->eod_frame_addr = 20; + tape->eod_frame_addr = OS_DATA_STARTFRAME1; tape->first_mark_addr = tape->last_mark_addr = -1; idetape_write_header(drive, 1); } @@ -4715,7 +4866,7 @@ printk("ide-tape: first_frame_position %d\n", tape->first_frame_position); #endif } - if (count==0) + if (count == 0) return (0); if (tape->restart_speed_control_req) idetape_restart_speed_control(drive); @@ -4723,32 +4874,35 @@ #if IDETAPE_DEBUG_BUGS if (tape->merge_stage_size >= tape->stage_size) { printk (KERN_ERR "ide-tape: bug: merge buffer too big\n"); - tape->merge_stage_size=0; + tape->merge_stage_size = 0; } #endif /* IDETAPE_DEBUG_BUGS */ - actually_written=IDE_MIN (tape->stage_size-tape->merge_stage_size,count); + actually_written = IDE_MIN (tape->stage_size - tape->merge_stage_size, count); idetape_copy_stage_from_user (tape, tape->merge_stage, buf, actually_written); - buf+=actually_written;tape->merge_stage_size+=actually_written;count-=actually_written; + buf += actually_written; + tape->merge_stage_size += actually_written; + count -= actually_written; if (tape->merge_stage_size == tape->stage_size) { tape->merge_stage_size = 0; - retval=idetape_add_chrdev_write_request (drive, tape->capabilities.ctl); + retval = idetape_add_chrdev_write_request (drive, tape->capabilities.ctl); if (retval <= 0) return (retval); } } while (count >= tape->stage_size) { idetape_copy_stage_from_user (tape, tape->merge_stage, buf, tape->stage_size); - buf+=tape->stage_size;count-=tape->stage_size; - retval=idetape_add_chrdev_write_request (drive, tape->capabilities.ctl); - actually_written+=tape->stage_size; + buf += tape->stage_size; + count -= tape->stage_size; + retval = idetape_add_chrdev_write_request (drive, tape->capabilities.ctl); + actually_written += tape->stage_size; if (retval <= 0) return (retval); } if (count) { actually_written+=count; idetape_copy_stage_from_user (tape, tape->merge_stage, buf, count); - tape->merge_stage_size+=count; + tape->merge_stage_size += count; } return (actually_written); } @@ -4760,8 +4914,8 @@ idetape_pc_t pc; if (!tape->onstream) { - idetape_create_write_filemark_cmd(drive, &pc,1); /* Write a filemark */ - if (idetape_queue_pc_tail (drive,&pc)) { + idetape_create_write_filemark_cmd(drive, &pc, 1); /* Write a filemark */ + if (idetape_queue_pc_tail (drive, &pc)) { printk (KERN_ERR "ide-tape: Couldn't write a filemark\n"); return -EIO; } @@ -4937,24 +5091,24 @@ if (idetape_rewind_tape(drive)) return -EIO; if (tape->onstream && !tape->raw) - return idetape_position_tape(drive, 20, 0, 0); + return idetape_position_tape(drive, OS_DATA_STARTFRAME1, 0, 0); return 0; case MTLOAD: idetape_discard_read_pipeline (drive, 0); idetape_create_load_unload_cmd (drive, &pc, IDETAPE_LU_LOAD_MASK); - return (idetape_queue_pc_tail (drive,&pc)); + return (idetape_queue_pc_tail (drive, &pc)); case MTUNLOAD: case MTOFFL: idetape_discard_read_pipeline (drive, 0); idetape_create_load_unload_cmd (drive, &pc,!IDETAPE_LU_LOAD_MASK); - return (idetape_queue_pc_tail (drive,&pc)); + return (idetape_queue_pc_tail (drive, &pc)); case MTNOP: idetape_discard_read_pipeline (drive, 0); return (idetape_flush_tape_buffers (drive)); case MTRETEN: idetape_discard_read_pipeline (drive, 0); idetape_create_load_unload_cmd (drive, &pc,IDETAPE_LU_RETENSION_MASK | IDETAPE_LU_LOAD_MASK); - return (idetape_queue_pc_tail (drive,&pc)); + return (idetape_queue_pc_tail (drive, &pc)); case MTEOM: if (tape->onstream) { #if ONSTREAM_DEBUG @@ -4968,24 +5122,30 @@ return -EIO; return 0; } - idetape_create_space_cmd (&pc,0,IDETAPE_SPACE_TO_EOD); - return (idetape_queue_pc_tail (drive,&pc)); + idetape_create_space_cmd (&pc, 0, IDETAPE_SPACE_TO_EOD); + return (idetape_queue_pc_tail (drive, &pc)); case MTERASE: if (tape->onstream) { - tape->eod_frame_addr = 20; + tape->eod_frame_addr = OS_DATA_STARTFRAME1; tape->logical_blk_num = 0; tape->first_mark_addr = tape->last_mark_addr = -1; idetape_position_tape(drive, tape->eod_frame_addr, 0, 0); idetape_write_eod(drive); idetape_flush_tape_buffers (drive); idetape_write_header(drive, 0); + /* + * write filler frames to the unused frames... + * REMOVE WHEN going to LIN4 application type... + */ + idetape_write_filler(drive, OS_DATA_STARTFRAME1 - 10, 10); + idetape_write_filler(drive, OS_DATA_ENDFRAME1, 10); idetape_flush_tape_buffers (drive); (void) idetape_rewind_tape (drive); return 0; } (void) idetape_rewind_tape (drive); idetape_create_erase_cmd (&pc); - return (idetape_queue_pc_tail (drive,&pc)); + return (idetape_queue_pc_tail (drive, &pc)); case MTSETBLK: if (tape->onstream) { if (mt_count != tape->tape_block_size) { @@ -5028,14 +5188,14 @@ case MTLOCK: if (!idetape_create_prevent_cmd(drive, &pc, 1)) return 0; - retval = idetape_queue_pc_tail (drive,&pc); + retval = idetape_queue_pc_tail (drive, &pc); if (retval) return retval; tape->door_locked = DOOR_EXPLICITLY_LOCKED; return 0; case MTUNLOCK: if (!idetape_create_prevent_cmd(drive, &pc, 0)) return 0; - retval = idetape_queue_pc_tail (drive,&pc); + retval = idetape_queue_pc_tail (drive, &pc); if (retval) return retval; tape->door_locked = DOOR_UNLOCKED; return 0; @@ -5113,7 +5273,7 @@ mtget.mt_gstat |= GMT_ONLINE(0xffffffff); if (tape->first_stage && tape->first_stage->aux->frame_type == OS_FRAME_TYPE_EOD) mtget.mt_gstat |= GMT_EOD(0xffffffff); - if (position <= 20) + if (position <= OS_DATA_STARTFRAME1) mtget.mt_gstat |= GMT_BOT(0xffffffff); } if (copy_to_user ((char *) arg,(char *) &mtget, sizeof (struct mtget))) @@ -5150,7 +5310,7 @@ tape->header_ok = tape->linux_media = 0; tape->update_frame_cntr = 0; tape->wrt_pass_cntr = 0; - tape->eod_frame_addr = 20; + tape->eod_frame_addr = OS_DATA_STARTFRAME1; tape->first_mark_addr = tape->last_mark_addr = -1; stage = __idetape_kmalloc_stage (tape, 0, 0); if (stage == NULL) @@ -5172,8 +5332,8 @@ __idetape_kfree_stage (stage); return 0; } - if (header->major_rev != 1 || (header->minor_rev != 1 && header->minor_rev != 2)) - printk(KERN_INFO "ide-tape: warning: revision %d.%d detected (1.1/1.2 supported)\n", header->major_rev, header->minor_rev); + if (header->major_rev != 1 || (header->minor_rev > OS_ADR_MINREV)) + printk(KERN_INFO "ide-tape: warning: revision %d.%d detected (up to 1.%d supported)\n", header->major_rev, header->minor_rev, OS_ADR_MINREV); if (header->par_num != 1) printk(KERN_INFO "ide-tape: warning: %d partitions defined, only one supported\n", header->par_num); tape->wrt_pass_cntr = ntohs(header->partition.wrt_pass_cntr); @@ -5182,12 +5342,14 @@ tape->first_mark_addr = ntohl(aux->next_mark_addr); tape->last_mark_addr = ntohl(aux->last_mark_addr); tape->update_frame_cntr = ntohl(aux->update_frame_cntr); - memcpy(tape->application_sig, aux->application_sig, 4); tape->application_sig[4] = 0; + memcpy(tape->application_sig, aux->application_sig, 4); + tape->application_sig[4] = 0; if (memcmp(tape->application_sig, "LIN", 3) == 0) { tape->linux_media = 1; tape->linux_media_version = tape->application_sig[3] - '0'; if (tape->linux_media_version != 3) - printk(KERN_INFO "ide-tape: %s: Linux media version %d detected (current 3)\n", tape->name, tape->linux_media_version); + printk(KERN_INFO "ide-tape: %s: Linux media version %d detected (current 3)\n", + tape->name, tape->linux_media_version); } else { printk(KERN_INFO "ide-tape: %s: non Linux media detected (%s)\n", tape->name, tape->application_sig); tape->linux_media = 0; @@ -5214,18 +5376,14 @@ for (block = 5; block < 10; block++) if (__idetape_analyze_headers(drive, block)) goto ok; -#if 0 - for (block = 0xbae; block < 0xbb8; block++) -#else - for (block = 0xbae; block < 0xbb3; block++) -#endif + for (block = 0xbae; block < 0xbb3; block++) /* 2990 - 2994 */ if (__idetape_analyze_headers(drive, block)) goto ok; printk(KERN_ERR "ide-tape: %s: failed to find valid ADRL header\n", tape->name); return 0; ok: - if (position < 20) - position = 20; + if (position < OS_DATA_STARTFRAME1) + position = OS_DATA_STARTFRAME1; idetape_position_tape(drive, position, 0, 0); tape->header_ok = 1; return 1; @@ -5251,7 +5409,8 @@ if (test_and_set_bit (IDETAPE_BUSY, &tape->flags)) return -EBUSY; - if (!tape->onstream) { + MOD_INC_USE_COUNT; + if (!tape->onstream) { idetape_read_position(drive); if (!test_bit (IDETAPE_ADDRESS_VALID, &tape->flags)) (void) idetape_rewind_tape (drive); @@ -5263,18 +5422,22 @@ tape->tape_block_size = tape->stage_size = 32768; tape->raw = 0; } + idetape_onstream_mode_sense_tape_parameter_page(drive, tape->debug_level); } if (idetape_wait_ready(drive, 60 * HZ)) { clear_bit(IDETAPE_BUSY, &tape->flags); printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name); + MOD_DEC_USE_COUNT; return -EBUSY; } idetape_read_position(drive); + MOD_DEC_USE_COUNT; clear_bit (IDETAPE_PIPELINE_ERROR, &tape->flags); if (tape->chrdev_direction == idetape_direction_none) { + MOD_INC_USE_COUNT; if (idetape_create_prevent_cmd(drive, &pc, 1)) { - if (!idetape_queue_pc_tail (drive,&pc)) { + if (!idetape_queue_pc_tail (drive, &pc)) { if (tape->door_locked != DOOR_EXPLICITLY_LOCKED) tape->door_locked = DOOR_LOCKED; } @@ -5287,6 +5450,28 @@ return 0; } +static void idetape_write_release (struct inode *inode) +{ + ide_drive_t *drive = get_drive_ptr (inode->i_rdev); + idetape_tape_t *tape = drive->driver_data; + unsigned int minor=MINOR (inode->i_rdev); + + idetape_empty_write_pipeline (drive); + tape->merge_stage = __idetape_kmalloc_stage (tape, 1, 0); + if (tape->merge_stage != NULL) { + idetape_pad_zeros (drive, tape->tape_block_size * (tape->user_bs_factor - 1)); + __idetape_kfree_stage (tape->merge_stage); + tape->merge_stage = NULL; + } + idetape_write_filemark(drive); + idetape_write_eod(drive); + idetape_flush_tape_buffers (drive); + idetape_write_header(drive, minor >= 128); + idetape_flush_tape_buffers (drive); + + return; +} + /* * Our character device release function. */ @@ -5305,18 +5490,7 @@ #endif /* IDETAPE_DEBUG_LOG */ if (tape->chrdev_direction == idetape_direction_write) { - idetape_empty_write_pipeline (drive); - tape->merge_stage = __idetape_kmalloc_stage (tape, 1, 0); - if (tape->merge_stage != NULL) { - idetape_pad_zeros (drive, tape->tape_block_size * (tape->user_bs_factor - 1)); - __idetape_kfree_stage (tape->merge_stage); - tape->merge_stage = NULL; - } - idetape_write_filemark(drive); - idetape_write_eod(drive); - idetape_flush_tape_buffers (drive); - idetape_write_header(drive, minor >= 128); - idetape_flush_tape_buffers (drive); + idetape_write_release(inode); } if (tape->chrdev_direction == idetape_direction_read) { if (minor < 128) @@ -5333,9 +5507,10 @@ if (tape->chrdev_direction == idetape_direction_none) { if (tape->door_locked != DOOR_EXPLICITLY_LOCKED) { if (idetape_create_prevent_cmd(drive, &pc, 0)) - if (!idetape_queue_pc_tail (drive,&pc)) + if (!idetape_queue_pc_tail (drive, &pc)) tape->door_locked = DOOR_UNLOCKED; } + MOD_DEC_USE_COUNT; } clear_bit (IDETAPE_BUSY, &tape->flags); unlock_kernel(); @@ -5491,7 +5666,7 @@ pc.buffer[4 + 5] = vendor[3]; pc.buffer[4 + 6] = 0; pc.buffer[4 + 7] = 0; - if (idetape_queue_pc_tail (drive,&pc)) + if (idetape_queue_pc_tail (drive, &pc)) printk (KERN_ERR "ide-tape: Couldn't set vendor name to %s\n", vendor); } @@ -5513,7 +5688,7 @@ pc.buffer[4 + 1] = 2; pc.buffer[4 + 2] = 4; pc.buffer[4 + 3] = retries; - if (idetape_queue_pc_tail (drive,&pc)) + if (idetape_queue_pc_tail (drive, &pc)) printk (KERN_ERR "ide-tape: Couldn't set retries to %d\n", retries); } #endif @@ -5530,8 +5705,8 @@ /* * Get the current block size from the block size mode page */ - idetape_create_mode_sense_cmd (&pc,IDETAPE_BLOCK_SIZE_PAGE); - if (idetape_queue_pc_tail (drive,&pc)) + idetape_create_mode_sense_cmd (&pc, IDETAPE_BLOCK_SIZE_PAGE); + if (idetape_queue_pc_tail (drive, &pc)) printk (KERN_ERR "ide-tape: can't get tape block size mode page\n"); header = (idetape_mode_parameter_header_t *) pc.buffer; bs = (idetape_block_size_page_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t) + header->bdl); @@ -5552,7 +5727,7 @@ bs->record32 = 0; bs->record32_5 = 1; idetape_create_mode_select_cmd(&pc, sizeof(*header) + sizeof(*bs)); - if (idetape_queue_pc_tail (drive,&pc)) + if (idetape_queue_pc_tail (drive, &pc)) printk (KERN_ERR "ide-tape: Couldn't set tape block size mode page\n"); #if ONSTREAM_DEBUG @@ -5575,7 +5750,7 @@ idetape_inquiry_result_t *inquiry; idetape_create_inquiry_cmd(&pc); - if (idetape_queue_pc_tail (drive,&pc)) { + if (idetape_queue_pc_tail (drive, &pc)) { printk (KERN_ERR "ide-tape: %s: can't get INQUIRY results\n", tape->name); return; } @@ -5618,6 +5793,34 @@ } /* + * idetape_get_mode_sense_parameters asks the tape about its various + * parameters. This may work for other drives to??? + */ +static void idetape_onstream_mode_sense_tape_parameter_page(ide_drive_t *drive, int debug) +{ + idetape_tape_t *tape = drive->driver_data; + idetape_pc_t pc; + idetape_mode_parameter_header_t *header; + onstream_tape_paramtr_page_t *prm; + + idetape_create_mode_sense_cmd (&pc, IDETAPE_PARAMTR_PAGE); + if (idetape_queue_pc_tail (drive, &pc)) { + printk (KERN_ERR "ide-tape: Can't get tape parameters page - probably no tape inserted in onstream drive\n"); + return; + } + header = (idetape_mode_parameter_header_t *) pc.buffer; + prm = (onstream_tape_paramtr_page_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t) + header->bdl); + + tape->capacity = ntohs(prm->segtrk) * ntohs(prm->trks); + if (debug) { + printk (KERN_INFO "ide-tape: %s <-> %s: Tape length %dMB (%d frames/track, %d tracks = %d blocks, density: %dKbpi)\n", + drive->name, tape->name, tape->capacity/32, ntohs(prm->segtrk), ntohs(prm->trks), tape->capacity, prm->density); + } + + return; +} + +/* * idetape_get_mode_sense_results asks the tape about its various * parameters. In particular, we will adjust our data transfer buffer * size to the recommended value as returned by the tape. @@ -5629,8 +5832,8 @@ idetape_mode_parameter_header_t *header; idetape_capabilities_page_t *capabilities; - idetape_create_mode_sense_cmd (&pc,IDETAPE_CAPABILITIES_PAGE); - if (idetape_queue_pc_tail (drive,&pc)) { + idetape_create_mode_sense_cmd (&pc, IDETAPE_CAPABILITIES_PAGE); + if (idetape_queue_pc_tail (drive, &pc)) { printk (KERN_ERR "ide-tape: Can't get tape parameters - assuming some default values\n"); tape->tape_block_size = 512; tape->capabilities.ctl = 52; tape->capabilities.speed = 450; tape->capabilities.buffer_size = 6 * 52; @@ -5692,6 +5895,34 @@ #endif /* IDETAPE_DEBUG_INFO */ } +/* + * ide_get_blocksize_from_block_descriptor does a mode sense page 0 with block descriptor + * and if it succeeds sets the tape block size with the reported value + */ +static void idetape_get_blocksize_from_block_descriptor(ide_drive_t *drive) +{ + + idetape_tape_t *tape = drive->driver_data; + idetape_pc_t pc; + idetape_mode_parameter_header_t *header; + idetape_parameter_block_descriptor_t *block_descrp; + + idetape_create_mode_sense_cmd (&pc, IDETAPE_BLOCK_DESCRIPTOR); + if (idetape_queue_pc_tail (drive, &pc)) { + printk (KERN_ERR "ide-tape: Can't get block descriptor\n"); + if (tape->tape_block_size == 0) { + printk(KERN_WARNING "ide-tape: Cannot deal with zero block size, assume 32k\n"); + tape->tape_block_size = 32768; + } + return; + } + header = (idetape_mode_parameter_header_t *) pc.buffer; + block_descrp = (idetape_parameter_block_descriptor_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t)); + tape->tape_block_size =( block_descrp->length[0]<<16) + (block_descrp->length[1]<<8) + block_descrp->length[2]; +#if IDETAPE_DEBUG_INFO + printk (KERN_INFO "ide-tape: Adjusted block size - %d\n", tape->tape_block_size); +#endif /* IDETAPE_DEBUG_INFO */ +} static void idetape_add_settings (ide_drive_t *drive) { idetape_tape_t *tape = drive->driver_data; @@ -5712,15 +5943,18 @@ ide_add_setting(drive, "pipeline_head_speed_c",SETTING_READ, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->controlled_pipeline_head_speed, NULL); ide_add_setting(drive, "pipeline_head_speed_u",SETTING_READ, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->uncontrolled_pipeline_head_speed, NULL); ide_add_setting(drive, "avg_speed", SETTING_READ, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->avg_speed, NULL); + ide_add_setting(drive, "debug_level",SETTING_RW, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->debug_level, NULL); if (tape->onstream) { ide_add_setting(drive, "cur_frames", SETTING_READ, -1, -1, TYPE_SHORT, 0, 0xffff, 1, 1, &tape->cur_frames, NULL); ide_add_setting(drive, "max_frames", SETTING_READ, -1, -1, TYPE_SHORT, 0, 0xffff, 1, 1, &tape->max_frames, NULL); ide_add_setting(drive, "insert_speed", SETTING_READ, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->insert_speed, NULL); ide_add_setting(drive, "speed_control",SETTING_RW, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->speed_control, NULL); - ide_add_setting(drive, "debug_level",SETTING_RW, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->debug_level, NULL); ide_add_setting(drive, "tape_still_time",SETTING_READ, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->tape_still_time, NULL); ide_add_setting(drive, "max_insert_speed",SETTING_RW, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->max_insert_speed, NULL); ide_add_setting(drive, "insert_size", SETTING_READ, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->insert_size, NULL); + ide_add_setting(drive, "capacity", SETTING_READ, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->capacity, NULL); + ide_add_setting(drive, "first_frame", SETTING_READ, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->first_frame_position, NULL); + ide_add_setting(drive, "logical_blk", SETTING_READ, -1, -1, TYPE_INT, 0, 0xffff, 1, 1, &tape->logical_blk_num, NULL); } } @@ -5742,12 +5976,13 @@ int speed; struct idetape_id_gcw gcw; int stage_size; + struct sysinfo si; memset (tape, 0, sizeof (idetape_tape_t)); spin_lock_init(&tape->spinlock); drive->driver_data = tape; drive->ready_stat = 0; /* An ATAPI device ignores DRDY */ - if (strstr(drive->id->model, "OnStream DI-30")) + if (strstr(drive->id->model, "OnStream DI-")) tape->onstream = 1; drive->dsc_overlap = 1; #ifdef CONFIG_BLK_DEV_IDEPCI @@ -5778,9 +6013,11 @@ idetape_get_inquiry_results(drive); idetape_get_mode_sense_results(drive); - if (tape->onstream) + idetape_get_blocksize_from_block_descriptor(drive); + if (tape->onstream) { + idetape_onstream_mode_sense_tape_parameter_page(drive, 1); idetape_configure_onstream(drive); - + } tape->user_bs_factor = 1; tape->stage_size = tape->capabilities.ctl * tape->tape_block_size; while (tape->stage_size > 0xffff) { @@ -5804,6 +6041,13 @@ speed = IDE_MAX (tape->capabilities.speed, tape->capabilities.max_speed); tape->max_stages = speed * 1000 * 10 / tape->stage_size; + + /* + * Limit memory use for pipeline to 10% of physical memory + */ + si_meminfo(&si); + if ( tape->max_stages * tape->stage_size > si.totalram * si.mem_unit / 10) + tape->max_stages = si.totalram * si.mem_unit / (10 * tape->stage_size); tape->min_pipeline = tape->max_stages; tape->max_pipeline = tape->max_stages * 2; @@ -5867,8 +6111,8 @@ char *out = page; int len; - len = sprintf(out,"%s\n", tape->name); - PROC_IDE_READ_RETURN(page,start,off,count,eof,len); + len = sprintf(out, "%s\n", tape->name); + PROC_IDE_READ_RETURN(page, start, off, count, eof, len); } static ide_proc_entry_t idetape_proc[] = { @@ -5962,7 +6206,7 @@ continue; } if (drive->scsi) { - if (strstr(drive->id->model, "OnStream DI-30")) { + if (strstr(drive->id->model, "OnStream DI-")) { printk("ide-tape: ide-scsi emulation is not supported for %s.\n", drive->id->model); } else { printk("ide-tape: passing drive %s to ide-scsi emulation.\n", drive->name); diff -u --recursive --new-file v2.4.5/linux/drivers/net/eepro100.c linux/drivers/net/eepro100.c --- v2.4.5/linux/drivers/net/eepro100.c Tue Feb 13 13:15:05 2001 +++ linux/drivers/net/eepro100.c Tue Jun 5 18:11:42 2001 @@ -470,7 +470,7 @@ struct timer_list timer; /* Media selection timer. */ struct speedo_mc_block *mc_setup_head;/* Multicast setup frame list head. */ struct speedo_mc_block *mc_setup_tail;/* Multicast setup frame list tail. */ - int in_interrupt; /* Word-aligned dev->interrupt */ + long in_interrupt; /* Word-aligned dev->interrupt */ unsigned char acpi_pwr; signed char rx_mode; /* Current PROMISC/ALLMULTI setting. */ unsigned int tx_full:1; /* The Tx queue is full. */ diff -u --recursive --new-file v2.4.5/linux/drivers/net/tun.c linux/drivers/net/tun.c --- v2.4.5/linux/drivers/net/tun.c Wed Apr 18 14:40:06 2001 +++ linux/drivers/net/tun.c Tue Jun 5 18:11:42 2001 @@ -12,7 +12,7 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * $Id: tun.c,v 1.3 2000/10/23 10:01:25 maxk Exp $ + * $Id: tun.c,v 1.12 2001/03/08 03:29:27 maxk Exp $ */ /* @@ -20,15 +20,16 @@ * Modifications for 2.3.99-pre5 kernel. */ -#define TUN_VER "1.3" +#define TUN_VER "1.4" +#include #include #include #include #include #include -#include +#include #include #include #include @@ -56,28 +57,14 @@ /* Net device open. */ static int tun_net_open(struct net_device *dev) { -#ifdef TUN_DEBUG - struct tun_struct *tun = (struct tun_struct *)dev->priv; - - DBG(KERN_INFO "%s: tun_net_open\n", tun->name); -#endif - netif_start_queue(dev); - return 0; } /* Net device close. */ static int tun_net_close(struct net_device *dev) { -#ifdef TUN_DEBUG - struct tun_struct *tun = (struct tun_struct *)dev->priv; - - DBG(KERN_INFO "%s: tun_net_close\n", tun->name); -#endif - netif_stop_queue(dev); - return 0; } @@ -88,38 +75,46 @@ DBG(KERN_INFO "%s: tun_net_xmit %d\n", tun->name, skb->len); - /* Queue frame */ - skb_queue_tail(&tun->txq, skb); - if (skb_queue_len(&tun->txq) >= TUN_TXQ_SIZE) - netif_stop_queue(dev); + /* Drop packet if interface is not attached */ + if (!tun->attached) + goto drop; + + /* Queue packet */ + if (!(tun->flags & TUN_ONE_QUEUE)) { + /* Normal queueing mode. + * Packet scheduler handles dropping. */ + if (skb_queue_len(&tun->readq) >= TUN_READQ_SIZE) + netif_stop_queue(dev); + } else { + /* Single queue mode. + * Driver handles dropping itself. */ + if (skb_queue_len(&tun->readq) >= dev->tx_queue_len) + goto drop; + } + skb_queue_tail(&tun->readq, skb); + /* Notify and wake up reader process */ if (tun->flags & TUN_FASYNC) kill_fasync(&tun->fasync, SIGIO, POLL_IN); - - /* Wake up process */ wake_up_interruptible(&tun->read_wait); + return 0; +drop: + tun->stats.tx_dropped++; + kfree_skb(skb); return 0; } static void tun_net_mclist(struct net_device *dev) { -#ifdef TUN_DEBUG - struct tun_struct *tun = (struct tun_struct *)dev->priv; - - DBG(KERN_INFO "%s: tun_net_mclist\n", tun->name); -#endif - /* Nothing to do for multicast filters. - * We always accept all frames. - */ + * We always accept all frames. */ return; } static struct net_device_stats *tun_net_stats(struct net_device *dev) { struct tun_struct *tun = (struct tun_struct *)dev->priv; - return &tun->stats; } @@ -170,15 +165,19 @@ static unsigned int tun_chr_poll(struct file *file, poll_table * wait) { struct tun_struct *tun = (struct tun_struct *)file->private_data; + unsigned int mask = POLLOUT | POLLWRNORM; + + if (!tun) + return -EBADFD; DBG(KERN_INFO "%s: tun_chr_poll\n", tun->name); poll_wait(file, &tun->read_wait, wait); - if (skb_queue_len(&tun->txq)) - return POLLIN | POLLRDNORM; + if (skb_queue_len(&tun->readq)) + mask |= POLLIN | POLLRDNORM; - return POLLOUT | POLLWRNORM; + return mask; } /* Get packet from user space buffer(already verified) */ @@ -189,9 +188,6 @@ register int len = count; struct sk_buff *skb; - if (len > TUN_MAX_FRAME) - return -EINVAL; - if (!(tun->flags & TUN_NO_PI)) { if ((len -= sizeof(pi)) < 0) return -EINVAL; @@ -222,7 +218,6 @@ if (tun->flags & TUN_NOCHECKSUM) skb->ip_summed = CHECKSUM_UNNECESSARY; - skb->dev->last_rx = jiffies; netif_rx(skb); tun->stats.rx_packets++; @@ -237,10 +232,10 @@ { struct tun_struct *tun = (struct tun_struct *)file->private_data; - DBG(KERN_INFO "%s: tun_chr_write %d\n", tun->name, count); + if (!tun) + return -EBADFD; - if (!(tun->flags & TUN_IFF_SET)) - return -EBUSY; + DBG(KERN_INFO "%s: tun_chr_write %d\n", tun->name, count); if (verify_area(VERIFY_READ, buf, count)) return -EFAULT; @@ -291,14 +286,17 @@ struct sk_buff *skb; ssize_t ret = 0; + if (!tun) + return -EBADFD; + DBG(KERN_INFO "%s: tun_chr_read\n", tun->name); add_wait_queue(&tun->read_wait, &wait); while (count) { current->state = TASK_INTERRUPTIBLE; - /* Read frames from device queue */ - if (!(skb=skb_dequeue(&tun->txq))) { + /* Read frames from the queue */ + if (!(skb=skb_dequeue(&tun->readq))) { if (file->f_flags & O_NONBLOCK) { ret = -EAGAIN; break; @@ -334,50 +332,83 @@ return -ESPIPE; } -static int tun_set_iff(struct tun_struct *tun, unsigned long arg) +static int tun_set_iff(struct file *file, struct ifreq *ifr) { - struct ifreq ifr; - char *mask; + struct tun_struct *tun; + struct net_device *dev; + int err; + + dev = __dev_get_by_name(ifr->ifr_name); + if (dev) { + /* Device exist */ + tun = dev->priv; + + if (dev->init != tun_net_init || tun->attached) + return -EBUSY; + + /* Check permissions */ + if (tun->owner != -1) + if (current->euid != tun->owner && !capable(CAP_NET_ADMIN)) + return -EPERM; + } else { + char *name; + + /* Allocate new device */ + if (!(tun = kmalloc(sizeof(struct tun_struct), GFP_KERNEL)) ) + return -ENOMEM; + memset(tun, 0, sizeof(struct tun_struct)); + + skb_queue_head_init(&tun->readq); + init_waitqueue_head(&tun->read_wait); + + tun->owner = -1; + tun->dev.init = tun_net_init; + tun->dev.priv = tun; + + err = -EINVAL; + + /* Set dev type */ + if (ifr->ifr_flags & IFF_TUN) { + /* TUN device */ + tun->flags |= TUN_TUN_DEV; + name = "tun%d"; + } else if (ifr->ifr_flags & IFF_TAP) { + /* TAP device */ + tun->flags |= TUN_TAP_DEV; + name = "tap%d"; + } else + goto failed; + + if (*ifr->ifr_name) + name = ifr->ifr_name; - if (copy_from_user(&ifr, (void *)arg, sizeof(ifr))) - return -EFAULT; - ifr.ifr_name[IFNAMSIZ-1] = '\0'; + if ((err = dev_alloc_name(&tun->dev, name)) < 0) + goto failed; + if ((err = register_netdevice(&tun->dev))) + goto failed; + + MOD_INC_USE_COUNT; - if (tun->flags & TUN_IFF_SET) - return -EEXIST; + tun->name = tun->dev.name; + } - /* Set dev type */ - if (ifr.ifr_flags & IFF_TUN) { - /* TUN device */ - tun->flags |= TUN_TUN_DEV; - mask = "tun%d"; - } else if (ifr.ifr_flags & IFF_TAP) { - /* TAP device */ - tun->flags |= TUN_TAP_DEV; - mask = "tap%d"; - } else - return -EINVAL; - - if (ifr.ifr_flags & IFF_NO_PI) + DBG(KERN_INFO "%s: tun_set_iff\n", tun->name); + + if (ifr->ifr_flags & IFF_NO_PI) tun->flags |= TUN_NO_PI; - if (*ifr.ifr_name) - strcpy(tun->dev.name, ifr.ifr_name); - else - strcpy(tun->dev.name, mask); - - /* Register net device */ - if (register_netdev(&tun->dev)) - return -EBUSY; - - tun->flags |= TUN_IFF_SET; - strcpy(tun->name, tun->dev.name); - - /* Return iface info to the user space */ - strcpy(ifr.ifr_name, tun->dev.name); - copy_to_user((void *)arg, &ifr, sizeof(ifr)); + if (ifr->ifr_flags & IFF_ONE_QUEUE) + tun->flags |= TUN_ONE_QUEUE; + + file->private_data = tun; + tun->attached = 1; + + strcpy(ifr->ifr_name, tun->name); + return 0; - return 0; +failed: + kfree(tun); + return err; } static int tun_chr_ioctl(struct inode *inode, struct file *file, @@ -385,14 +416,33 @@ { struct tun_struct *tun = (struct tun_struct *)file->private_data; - DBG(KERN_INFO "%s: tun_chr_ioctl\n", tun->name); + if (cmd == TUNSETIFF && !tun) { + struct ifreq ifr; + int err; + + if (copy_from_user(&ifr, (void *)arg, sizeof(ifr))) + return -EFAULT; + ifr.ifr_name[IFNAMSIZ-1] = '\0'; - switch (cmd) { - case TUNSETIFF: - return tun_set_iff(tun, arg); + rtnl_lock(); + err = tun_set_iff(file, &ifr); + rtnl_unlock(); + if (err) + return err; + + copy_to_user((void *)arg, &ifr, sizeof(ifr)); + return 0; + } + + if (!tun) + return -EBADFD; + + DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->name, cmd); + + switch (cmd) { case TUNSETNOCSUM: - /* Disable/Enable checksum on net iface */ + /* Disable/Enable checksum */ if (arg) tun->flags |= TUN_NOCHECKSUM; else @@ -402,6 +452,24 @@ tun->name, arg ? "disabled" : "enabled"); break; + case TUNSETPERSIST: + /* Disable/Enable persist mode */ + if (arg) + tun->flags |= TUN_PERSIST; + else + tun->flags &= ~TUN_PERSIST; + + DBG(KERN_INFO "%s: persist %s\n", + tun->name, arg ? "disabled" : "enabled"); + break; + + case TUNSETOWNER: + /* Set owner of the device */ + tun->owner = (uid_t) arg; + + DBG(KERN_INFO "%s: owner set to %d\n", tun->owner); + break; + #ifdef TUN_DEBUG case TUNSETDEBUG: tun->debug = arg; @@ -420,14 +488,22 @@ struct tun_struct *tun = (struct tun_struct *)file->private_data; int ret; + if (!tun) + return -EBADFD; + DBG(KERN_INFO "%s: tun_chr_fasync %d\n", tun->name, on); if ((ret = fasync_helper(fd, file, on, &tun->fasync)) < 0) return ret; - if (on) + if (on) { tun->flags |= TUN_FASYNC; - else + if (!file->f_owner.pid) { + file->f_owner.pid = current->pid; + file->f_owner.uid = current->uid; + file->f_owner.euid = current->euid; + } + } else tun->flags &= ~TUN_FASYNC; return 0; @@ -435,25 +511,8 @@ static int tun_chr_open(struct inode *inode, struct file * file) { - struct tun_struct *tun = NULL; - DBG1(KERN_INFO "tunX: tun_chr_open\n"); - - tun = kmalloc(sizeof(struct tun_struct), GFP_KERNEL); - if (tun == NULL) - return -ENOMEM; - - memset(tun, 0, sizeof(struct tun_struct)); - file->private_data = tun; - - skb_queue_head_init(&tun->txq); - init_waitqueue_head(&tun->read_wait); - - sprintf(tun->name, "tunX"); - - tun->dev.init = tun_net_init; - tun->dev.priv = tun; - + file->private_data = NULL; return 0; } @@ -461,22 +520,30 @@ { struct tun_struct *tun = (struct tun_struct *)file->private_data; - DBG(KERN_INFO "%s: tun_chr_close\n", tun->name); + if (!tun) + return 0; - if (tun->flags & TUN_IFF_SET) { - rtnl_lock(); - dev_close(&tun->dev); - rtnl_unlock(); + DBG(KERN_INFO "%s: tun_chr_close\n", tun->name); - /* Drop TX queue */ - skb_queue_purge(&tun->txq); + tun_chr_fasync(-1, file, 0); - unregister_netdev(&tun->dev); - } + rtnl_lock(); - kfree(tun); + /* Detach from net device */ file->private_data = NULL; + tun->attached = 0; + + /* Drop read queue */ + skb_queue_purge(&tun->readq); + + if (!(tun->flags & TUN_PERSIST)) { + dev_close(&tun->dev); + unregister_netdevice(&tun->dev); + kfree(tun); + MOD_DEC_USE_COUNT; + } + rtnl_unlock(); return 0; } @@ -494,15 +561,15 @@ static struct miscdevice tun_miscdev= { - TUN_MINOR, - "net/tun", - &tun_fops + TUN_MINOR, + "net/tun", + &tun_fops }; int __init tun_init(void) { printk(KERN_INFO "Universal TUN/TAP device driver %s " - "(C)1999-2000 Maxim Krasnyansky\n", TUN_VER); + "(C)1999-2001 Maxim Krasnyansky\n", TUN_VER); if (misc_register(&tun_miscdev)) { printk(KERN_ERR "tun: Can't register misc device %d\n", TUN_MINOR); diff -u --recursive --new-file v2.4.5/linux/drivers/net/wireless/hermes.c linux/drivers/net/wireless/hermes.c --- v2.4.5/linux/drivers/net/wireless/hermes.c Fri May 25 18:28:54 2001 +++ linux/drivers/net/wireless/hermes.c Tue Jun 5 18:03:33 2001 @@ -32,9 +32,10 @@ #include "hermes.h" +/* These are maximum timeouts. Most often, card wil react much faster */ #define CMD_BUSY_TIMEOUT (100) /* In iterations of ~1us */ #define CMD_INIT_TIMEOUT (50000) /* in iterations of ~10us */ -#define CMD_COMPL_TIMEOUT (10000) /* in iterations of ~10us */ +#define CMD_COMPL_TIMEOUT (20000) /* in iterations of ~10us */ #define ALLOC_COMPL_TIMEOUT (1000) /* in iterations of ~10us */ #define BAP_BUSY_TIMEOUT (500) /* In iterations of ~1us */ #define BAP_ERROR_RETRY (10) /* How many times to retry a BAP seek when there is an error */ @@ -141,6 +142,12 @@ /* No need to explicitly handle the timeout - hermes_issue_cmd() will probably return -EBUSY */ + /* According to the documentation, EVSTAT may contain + obsolete event occurrence information. We have to acknowledge + it by writing EVACK. */ + reg = hermes_read_regn(hw, EVSTAT); + hermes_write_regn(hw, EVACK, reg); + /* We don't use hermes_docmd_wait here, because the reset wipes the magic constant in SWSUPPORT0 away, and it gets confused */ err = hermes_issue_cmd(hw, HERMES_CMD_INIT, 0); @@ -323,8 +330,10 @@ reg = hermes_read_reg(hw, oreg); } - if (reg & HERMES_OFFSET_BUSY) + if (reg & HERMES_OFFSET_BUSY) { + DEBUG(0,"hermes_bap_seek: returning ETIMEDOUT...\n"); return -ETIMEDOUT; + } /* For some reason, seeking the BAP seems to randomly fail somewhere (firmware bug?). We retry a few times before giving up. */ diff -u --recursive --new-file v2.4.5/linux/drivers/net/wireless/hermes.h linux/drivers/net/wireless/hermes.h --- v2.4.5/linux/drivers/net/wireless/hermes.h Fri May 25 18:28:54 2001 +++ linux/drivers/net/wireless/hermes.h Tue Jun 5 18:03:33 2001 @@ -166,7 +166,6 @@ #define HERMES_RID_CNF_NICKNAME (0xfc0e) #define HERMES_RID_CNF_WEP_ON (0xfc20) #define HERMES_RID_CNF_MWO_ROBUST (0xfc25) -#define HERMES_RID_CNF_PRISM2_WEP_ON (0xfc28) #define HERMES_RID_CNF_MULTICAST_LIST (0xfc80) #define HERMES_RID_CNF_CREATEIBSS (0xfc81) #define HERMES_RID_CNF_FRAG_THRESH (0xfc82) @@ -177,6 +176,7 @@ #define HERMES_RID_CNF_TX_KEY (0xfcb1) #define HERMES_RID_CNF_TICKTIME (0xfce0) +#define HERMES_RID_CNF_PRISM2_WEP_ON (0xfc28) #define HERMES_RID_CNF_PRISM2_TX_KEY (0xfc23) #define HERMES_RID_CNF_PRISM2_KEY0 (0xfc24) #define HERMES_RID_CNF_PRISM2_KEY1 (0xfc25) diff -u --recursive --new-file v2.4.5/linux/drivers/net/wireless/orinoco.c linux/drivers/net/wireless/orinoco.c --- v2.4.5/linux/drivers/net/wireless/orinoco.c Fri May 25 18:28:54 2001 +++ linux/drivers/net/wireless/orinoco.c Tue Jun 5 18:03:33 2001 @@ -1,4 +1,4 @@ -/* orinoco.c 0.05 - (formerly known as dldwd_cs.c and orinoco_cs.c) +/* orinoco.c 0.06 - (formerly known as dldwd_cs.c and orinoco_cs.c) * * A driver for "Hermes" chipset based PCMCIA wireless adaptors, such * as the Lucent WavelanIEEE/Orinoco cards and their OEM (Cabletron/ @@ -144,10 +144,32 @@ * (note : the memcmp bug was mine - fixed) * o Remove set_retry stuff, no firmware support it (bloat--). * + * v0.05d -> v0.06 - 25/5/2001 - Jean II + * Original patch from "Hong Lin" , + * "Ian Kinner" + * and "David Smith" + * o Init of priv->tx_rate_ctrl in firmware specific section. + * o Prism2/Symbol rate, upto should be 0xF and not 0x15. Doh ! + * o Spectrum card always need cor_reset (for every reset) + * o Fix cor_reset to not loose bit 7 in the register + * o flush_stale_links to remove zombie Pcmcia instances + * o Ack previous hermes event before reset + * Me (with my little hands) + * o Allow orinoco.c to call cor_reset via priv->card_reset_handler + * o Add priv->need_card_reset to toggle this feature + * o Fix various buglets when setting WEP in Symbol firmware + * Now, encryption is fully functional on Symbol cards. Youpi ! + * + * v0.06 -> v0.06b - 25/5/2001 - Jean II + * o IBSS on Symbol use port_mode = 4. Please don't ask... + * + * v0.06b -> v0.06c - 29/5/2001 - Jean II + * o Show first spy address in /proc/net/wireless for IBSS mode as well + * * TODO - Jean II * o inline functions (lot's of candidate, need to reorder code) * o Test PrismII/Symbol cards & firmware versions - * o Mini-PCI support + * o Mini-PCI support (some people have reported success - JII) */ #include @@ -180,7 +202,7 @@ #include "hermes.h" #include "orinoco.h" -static char *version = "orinoco.c 0.05d (David Gibson and others)"; +static char *version = "orinoco.c 0.06c (David Gibson and others)"; /* Level of debugging. Used in the macros in orinoco.h */ #ifdef ORINOCO_DEBUG @@ -369,7 +391,11 @@ priv->port_type = 3; priv->allow_ibss = 0; } else { - priv->port_type = 1; + /* Symbol is different here */ + if (priv->firmware_type == FIRMWARE_TYPE_SYMBOL) + priv->port_type = 4; + else + priv->port_type = 1; priv->allow_ibss = 1; } break; @@ -441,10 +467,15 @@ TRACE_ENTER(priv->ndev.name); + /* Stop other people bothering us */ dldwd_lock(priv); - __dldwd_stop_irqs(priv); + /* Check if we need a card reset */ + if((priv->need_card_reset) && (priv->card_reset_handler != NULL)) + priv->card_reset_handler(priv); + + /* Do standard firmware reset if we can */ err = __dldwd_hw_reset(priv); if (err) goto out; @@ -594,7 +625,8 @@ { hermes_t *hw = &priv->hw; int err = 0; - int extra_wep_flag = 0; + int master_wep_flag; + int auth_flag; switch (priv->firmware_type) { case FIRMWARE_TYPE_LUCENT: /* Lucent style WEP */ @@ -614,24 +646,29 @@ case FIRMWARE_TYPE_PRISM2: /* Prism II style WEP */ case FIRMWARE_TYPE_SYMBOL: /* Symbol style WEP */ + master_wep_flag = 0; /* Off */ if (priv->wep_on) { char keybuf[LARGE_KEY_SIZE+1]; int keylen; int i; - + + /* Fudge around firmware weirdness */ + keylen = priv->keys[priv->tx_key].len; + /* Write all 4 keys */ for(i = 0; i < MAX_KEYS; i++) { - keylen = priv->keys[i].len; - keybuf[keylen] = '\0'; - memcpy(keybuf, priv->keys[i].data, keylen); + memset(keybuf, 0, sizeof(keybuf)); + memcpy(keybuf, priv->keys[i].data, + priv->keys[i].len); err = hermes_write_ltv(hw, USER_BAP, HERMES_RID_CNF_PRISM2_KEY0 + i, - HERMES_BYTES_TO_RECLEN(keylen + 1), - &keybuf); + HERMES_BYTES_TO_RECLEN(keylen), + keybuf); if (err) return err; } + /* Write the index of the key used in transmission */ err = hermes_write_wordrec(hw, USER_BAP, HERMES_RID_CNF_PRISM2_TX_KEY, priv->tx_key); if (err) @@ -642,30 +679,29 @@ if (priv->firmware_type == FIRMWARE_TYPE_SYMBOL) { /* Symbol cards : set the authentication : * 0 -> no encryption, 1 -> open, - * 2 -> shared key, 3 -> shared key 128bit */ - if(priv->wep_restrict) { - if(priv->keys[priv->tx_key].len > - SMALL_KEY_SIZE) - extra_wep_flag = 3; - else - extra_wep_flag = 2; - } else - extra_wep_flag = 1; - err = hermes_write_wordrec(hw, USER_BAP, HERMES_RID_CNF_SYMBOL_AUTH_TYPE, priv->wep_restrict); + * 2 -> shared key + * 3 -> shared key 128 -> AP only */ + if(priv->wep_restrict) + auth_flag = 2; + else + auth_flag = 1; + err = hermes_write_wordrec(hw, USER_BAP, HERMES_RID_CNF_SYMBOL_AUTH_TYPE, auth_flag); if (err) return err; + /* Master WEP setting is always 3 */ + master_wep_flag = 3; } else { /* Prism2 card : we need to modify master * WEP setting */ if(priv->wep_restrict) - extra_wep_flag = 2; + master_wep_flag = 3; else - extra_wep_flag = 0; + master_wep_flag = 1; } } /* Master WEP setting : on/off */ - err = hermes_write_wordrec(hw, USER_BAP, HERMES_RID_CNF_PRISM2_WEP_ON, (priv->wep_on | extra_wep_flag)); + err = hermes_write_wordrec(hw, USER_BAP, HERMES_RID_CNF_PRISM2_WEP_ON, master_wep_flag); if (err) return err; break; @@ -1182,9 +1218,11 @@ dldwd_lock(priv); + /* Do standard firmware reset */ err = hermes_reset(hw); if (err != 0) { - printk(KERN_ERR "%s: failed to reset hardware\n", dev->name); + printk(KERN_ERR "%s: failed to reset hardware (err = %d)\n", + dev->name, err); goto out; } @@ -1209,6 +1247,8 @@ /* Lucent MAC : 00:60:1D:* & 00:02:2D:* */ priv->firmware_type = FIRMWARE_TYPE_LUCENT; + priv->tx_rate_ctrl = 0x3; /* 11 Mb/s auto */ + priv->need_card_reset = 0; priv->broken_reset = 0; priv->broken_allocate = 0; priv->has_port3 = 1; /* Still works in 7.28 */ @@ -1229,6 +1269,8 @@ /* Some D-Link cards report vendor 0x02... */ priv->firmware_type = FIRMWARE_TYPE_PRISM2; + priv->tx_rate_ctrl = 0xF; /* 11 Mb/s auto */ + priv->need_card_reset = 0; priv->broken_reset = 0; priv->broken_allocate = 0; priv->has_port3 = 1; @@ -1248,9 +1290,12 @@ /* Intel MAC : 00:02:B3:* */ /* 3Com MAC : 00:50:DA:* */ - /* FIXME : probably need to use SYMBOL_***ARY_VER - * to get proper firmware version */ + /* FIXME : we need to get Symbol firmware revision. + * I tried to use SYMBOL_***ARY_VER, but it didn't + * returned anything proper... */ priv->firmware_type = FIRMWARE_TYPE_SYMBOL; + priv->tx_rate_ctrl = 0xF; /* 11 Mb/s auto */ + priv->need_card_reset = 1; priv->broken_reset = 0; priv->broken_allocate = 1; priv->has_port3 = 1; @@ -1268,6 +1313,8 @@ /* To check - Should cover Samsung & Compaq */ priv->firmware_type = FIRMWARE_TYPE_PRISM2; + priv->tx_rate_ctrl = 0xF; /* 11 Mb/s auto */ + priv->need_card_reset = 0; priv->broken_reset = 0; priv->broken_allocate = 0; priv->has_port3 = 1; @@ -1284,6 +1331,8 @@ /* D-Link MAC : 00:40:05:* */ priv->firmware_type = FIRMWARE_TYPE_PRISM2; + priv->tx_rate_ctrl = 0xF; /* 11 Mb/s auto */ + priv->need_card_reset = 0; priv->broken_reset = 0; priv->broken_allocate = 0; priv->has_port3 = 1; @@ -1300,6 +1349,8 @@ vendor_str = "UNKNOWN"; priv->firmware_type = 0; + priv->tx_rate_ctrl = 0x3; /* Hum... */ + priv->need_card_reset = 0; priv->broken_reset = 0; priv->broken_allocate = 0; priv->has_port3 = 0; @@ -1314,7 +1365,7 @@ printk(KERN_INFO "%s: Firmware ID %02X vendor 0x%x (%s) version %d.%02d\n", dev->name, priv->firmware_info.id, priv->firmware_info.vendor, vendor_str, priv->firmware_info.major, priv->firmware_info.minor); - + if (priv->has_port3) printk(KERN_INFO "%s: Ad-hoc demo mode supported.\n", dev->name); if (priv->has_ibss) @@ -1393,9 +1444,6 @@ goto out; } - /* Set initial bitrate control*/ - priv->tx_rate_ctrl = 3; - /* Power management setup */ if (priv->has_pm) { priv->pm_on = 0; @@ -1466,7 +1514,7 @@ dldwd_lock(priv); - if (priv->port_type == 3) { + if (priv->iw_mode == IW_MODE_ADHOC) { memset(&wstats->qual, 0, sizeof(wstats->qual)); #ifdef WIRELESS_SPY /* If a spy address is defined, we report stats of the @@ -1709,7 +1757,7 @@ { dldwd_priv_t *priv = dev->priv; int err = 0; - int ptype; + int mode; struct iw_range range; int numrates; int i, k; @@ -1723,7 +1771,7 @@ rrq->length = sizeof(range); dldwd_lock(priv); - ptype = priv->port_type; + mode = priv->iw_mode; dldwd_unlock(priv); memset(&range, 0, sizeof(range)); @@ -1755,7 +1803,7 @@ range.sensitivity = 3; - if ((ptype == 3) && (priv->spy_number == 0)){ + if ((mode == IW_MODE_ADHOC) && (priv->spy_number == 0)){ /* Quality stats meaningless in ad-hoc mode */ range.max_qual.qual = 0; range.max_qual.level = 0; @@ -2253,7 +2301,7 @@ switch(brate) { case 0: fixed = 0x0; - upto = 0x15; + upto = 0xF; break; case 2: fixed = 0x1; @@ -2269,7 +2317,7 @@ break; case 22: fixed = 0x8; - upto = 0x15; + upto = 0xF; break; default: fixed = 0x0; @@ -2881,6 +2929,7 @@ if (wrq->u.data.pointer) { struct iw_priv_args privtab[] = { { SIOCDEVPRIVATE + 0x0, 0, 0, "force_reset" }, + { SIOCDEVPRIVATE + 0x1, 0, 0, "card_reset" }, { SIOCDEVPRIVATE + 0x2, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_port3" }, @@ -2917,6 +2966,20 @@ dldwd_reset(priv); break; + case SIOCDEVPRIVATE + 0x1: /* card_reset */ + DEBUG(1, "%s: SIOCDEVPRIVATE + 0x1 (card_reset)\n", + dev->name); + if (! capable(CAP_NET_ADMIN)) { + err = -EPERM; + break; + } + + printk(KERN_DEBUG "%s: Forcing card reset!\n", dev->name); + if(priv->card_reset_handler != NULL) + priv->card_reset_handler(priv); + dldwd_reset(priv); + break; + case SIOCDEVPRIVATE + 0x2: /* set_port3 */ DEBUG(1, "%s: SIOCDEVPRIVATE + 0x2 (set_port3)\n", dev->name); @@ -3495,6 +3558,7 @@ ndev->priv = priv; /* Setup up default routines */ + priv->card_reset_handler = NULL; /* Caller may override */ ndev->init = dldwd_init; ndev->open = NULL; /* Caller *must* override */ ndev->stop = NULL; diff -u --recursive --new-file v2.4.5/linux/drivers/net/wireless/orinoco.h linux/drivers/net/wireless/orinoco.h --- v2.4.5/linux/drivers/net/wireless/orinoco.h Fri May 25 18:28:54 2001 +++ linux/drivers/net/wireless/orinoco.h Tue Jun 5 18:03:33 2001 @@ -44,6 +44,8 @@ typedef struct dldwd_priv { void* card; /* Pointer to card dependant structure */ + /* card dependant extra reset code (i.e. bus/interface specific */ + int (*card_reset_handler)(struct dldwd_priv *); spinlock_t lock; long state; @@ -72,7 +74,7 @@ int has_mwo; int has_pm; int has_preamble; - int broken_reset, broken_allocate; + int need_card_reset, broken_reset, broken_allocate; uint16_t channel_mask; /* Current configuration */ diff -u --recursive --new-file v2.4.5/linux/drivers/net/wireless/orinoco_cs.c linux/drivers/net/wireless/orinoco_cs.c --- v2.4.5/linux/drivers/net/wireless/orinoco_cs.c Fri May 25 18:28:54 2001 +++ linux/drivers/net/wireless/orinoco_cs.c Tue Jun 5 18:03:33 2001 @@ -1,4 +1,4 @@ -/* orinoco_cs.c 0.05 - (formerly known as dldwd_cs.c) +/* orinoco_cs.c 0.06 - (formerly known as dldwd_cs.c) * * A driver for "Hermes" chipset based PCMCIA wireless adaptors, such * as the Lucent WavelanIEEE/Orinoco cards and their OEM (Cabletron/ @@ -50,7 +50,7 @@ struct dldwd_priv priv; } dldwd_card_t; -static char *version = "orinoco_cs.c 0.05 (David Gibson and others)"; +static char *version = "orinoco_cs.c 0.06 (David Gibson and others)"; /*====================================================================*/ @@ -166,6 +166,70 @@ return 0; } +/* + * Do a soft reset of the Pcmcia card using the Configuration Option Register + * Can't do any harm, and actually may do some good on some cards... + * In fact, this seem necessary for Spectrum cards... + */ +static int +dldwd_cs_cor_reset(dldwd_priv_t *priv) +{ + dldwd_card_t* card = (dldwd_card_t *)priv->card; + dev_link_t *link = &card->link; + conf_reg_t reg; + u_long default_cor; + + TRACE_ENTER(priv->ndev.name); + + /* Doing it if hardware is gone is guaranteed crash */ + if(!priv->hw_ready) + return(0); + + /* Save original COR value */ + reg.Function = 0; + reg.Action = CS_READ; + reg.Offset = CISREG_COR; + reg.Value = 0; + CardServices(AccessConfigurationRegister, link->handle, ®); + default_cor = reg.Value; + + DEBUG(2, "dldwd : dldwd_cs_cor_reset() : cor=0x%lX\n", default_cor); + + /* Soft-Reset card */ + reg.Action = CS_WRITE; + reg.Offset = CISREG_COR; + reg.Value = (default_cor | COR_SOFT_RESET); + CardServices(AccessConfigurationRegister, link->handle, ®); + + /* Wait until the card has acknowledged our reset */ + mdelay(1); + + /* Restore original COR configuration index */ + reg.Value = (default_cor & ~COR_SOFT_RESET); + CardServices(AccessConfigurationRegister, link->handle, ®); + + /* Wait until the card has finished restarting */ + mdelay(1); + + TRACE_EXIT(priv->ndev.name); + + return(0); +} + +/* Remove zombie instances (card removed, detach pending) */ +static void +flush_stale_links(void) +{ + dev_link_t *link, *next; + TRACE_ENTER("dldwd"); + for (link = dev_list; link; link = next) { + next = link->next; + if (link->state & DEV_STALE_LINK) + dldwd_cs_detach(link); + } + TRACE_EXIT("dldwd"); +} + /*====================================================================== dldwd_cs_attach() creates an "instance" of the driver, allocating local data structures for one device. The device is registered @@ -187,6 +251,8 @@ int ret, i; TRACE_ENTER("dldwd"); + /* A bit of cleanup */ + flush_stale_links(); /* Allocate space for private device-specific data */ card = kmalloc(sizeof(*card), GFP_KERNEL); @@ -237,6 +303,7 @@ /* Overrides */ ndev->open = dldwd_cs_open; ndev->stop = dldwd_cs_stop; + priv->card_reset_handler = dldwd_cs_cor_reset; /* Register with Card Services */ link->next = dev_list; @@ -320,45 +387,6 @@ TRACE_EXIT("dldwd"); } /* dldwd_cs_detach */ -/* - * Do a soft reset of the Pcmcia card using the Configuration Option Register - * Can't do any harm, and actually may do some good on some cards... - */ -static int -dldwd_cs_cor_reset(dev_link_t *link) -{ - conf_reg_t reg; - u_long default_cor; - - /* Save original COR value */ - reg.Function = 0; - reg.Action = CS_READ; - reg.Offset = CISREG_COR; - reg.Value = 0; - CardServices(AccessConfigurationRegister, link->handle, ®); - default_cor = reg.Value; - - DEBUG(2, "dldwd : dldwd_cs_cor_reset() : cor=0x%lX\n", default_cor); - - /* Soft-Reset card */ - reg.Action = CS_WRITE; - reg.Offset = CISREG_COR; - reg.Value = (default_cor | COR_SOFT_RESET); - CardServices(AccessConfigurationRegister, link->handle, ®); - - /* Wait until the card has acknowledged our reset */ - mdelay(1); - - /* Restore original COR configuration index */ - reg.Value = (default_cor & COR_CONFIG_MASK); - CardServices(AccessConfigurationRegister, link->handle, ®); - - /* Wait until the card has finished restarting */ - mdelay(1); - - return(0); -} - /*====================================================================== dldwd_cs_config() is scheduled to run after a CARD_INSERTION event is received, to configure the PCMCIA socket, and to make the @@ -556,10 +584,6 @@ ndev->base_addr = link->io.BasePort1; ndev->irq = link->irq.AssignedIRQ; - /* Do a Pcmcia soft reset of the card (optional) */ - if(reset_cor) - dldwd_cs_cor_reset(link); - /* register_netdev will give us an ethX name */ ndev->name[0] = '\0'; /* Tell the stack we exist */ @@ -586,9 +610,6 @@ link->io.BasePort2 + link->io.NumPorts2 - 1); printk("\n"); - /* Allow /proc & ioctls to act */ - priv->hw_ready = 1; - /* And give us the proc nodes for debugging */ if (dldwd_proc_dev_init(priv) != 0) { printk(KERN_ERR "orinoco_cs: Failed to create /proc node for %s\n", @@ -599,6 +620,13 @@ /* Note to myself : this replace MOD_INC_USE_COUNT/MOD_DEC_USE_COUNT */ SET_MODULE_OWNER(ndev); + /* Allow cor_reset, /proc & ioctls to act */ + priv->hw_ready = 1; + + /* Do a Pcmcia soft reset of the card (optional) */ + if(reset_cor) + dldwd_cs_cor_reset(priv); + /* At this point, the dev_node_t structure(s) need to be initialized and arranged in a linked list at link->dev. diff -u --recursive --new-file v2.4.5/linux/drivers/parport/ChangeLog linux/drivers/parport/ChangeLog --- v2.4.5/linux/drivers/parport/ChangeLog Fri May 25 18:28:54 2001 +++ linux/drivers/parport/ChangeLog Tue Jun 5 18:04:14 2001 @@ -1,3 +1,9 @@ +2001-06-05 Tim Waugh + + * parport_pc.c (parport_pc_unregister_port): New exported function. + Do the opposite of parport_pc_probe_port. + (cleanup_module): Use it. + 2001-05-22 Juan Quintela * parport_amiga.c: Set printk levels. diff -u --recursive --new-file v2.4.5/linux/drivers/parport/parport_pc.c linux/drivers/parport/parport_pc.c --- v2.4.5/linux/drivers/parport/parport_pc.c Fri May 25 18:28:54 2001 +++ linux/drivers/parport/parport_pc.c Tue Jun 5 18:03:34 2001 @@ -2349,6 +2349,28 @@ return p; } +void parport_pc_unregister_port (struct parport *p) +{ + struct parport_pc_private *priv = p->private_data; + struct parport_operations *ops = p->ops; + if (p->dma != PARPORT_DMA_NONE) + free_dma(p->dma); + if (p->irq != PARPORT_IRQ_NONE) + free_irq(p->irq, p); + release_region(p->base, 3); + if (p->size > 3) + release_region(p->base + 3, p->size - 3); + if (p->modes & PARPORT_MODE_ECP) + release_region(p->base_hi, 3); + parport_proc_unregister(p); + if (priv->dma_buf) + pci_free_consistent(priv->dev, PAGE_SIZE, + priv->dma_buf, + priv->dma_handle); + kfree (p->private_data); + parport_unregister_port(p); + kfree (ops); /* hope no-one cached it */ +} #ifdef CONFIG_PCI /* Via support maintained by Jeff Garzik */ @@ -2816,6 +2838,7 @@ /* Exported symbols. */ EXPORT_SYMBOL (parport_pc_probe_port); +EXPORT_SYMBOL (parport_pc_unregister_port); #ifdef MODULE static int io[PARPORT_PC_MAX_PORTS+1] = { [0 ... PARPORT_PC_MAX_PORTS] = 0 }; @@ -2883,27 +2906,9 @@ while (p) { tmp = p->next; - if (p->modes & PARPORT_MODE_PCSPP) { - struct parport_pc_private *priv = p->private_data; - struct parport_operations *ops = p->ops; - if (p->dma != PARPORT_DMA_NONE) - free_dma(p->dma); - if (p->irq != PARPORT_IRQ_NONE) - free_irq(p->irq, p); - release_region(p->base, 3); - if (p->size > 3) - release_region(p->base + 3, p->size - 3); - if (p->modes & PARPORT_MODE_ECP) - release_region(p->base_hi, 3); - parport_proc_unregister(p); - if (priv->dma_buf) - pci_free_consistent(priv->dev, PAGE_SIZE, - priv->dma_buf, - priv->dma_handle); - kfree (p->private_data); - parport_unregister_port(p); - kfree (ops); /* hope no-one cached it */ - } + if (p->modes & PARPORT_MODE_PCSPP) + parport_pc_unregister_port (p); + p = tmp; } } diff -u --recursive --new-file v2.4.5/linux/drivers/parport/parport_sunbpp.c linux/drivers/parport/parport_sunbpp.c --- v2.4.5/linux/drivers/parport/parport_sunbpp.c Fri May 25 18:28:54 2001 +++ linux/drivers/parport/parport_sunbpp.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: parport_sunbpp.c,v 1.11 2001/02/13 01:16:58 davem Exp $ +/* $Id: parport_sunbpp.c,v 1.12 2001/05/26 03:01:42 davem Exp $ * Parallel-port routines for Sun architecture * * Author: Derrick J. Brashear diff -u --recursive --new-file v2.4.5/linux/drivers/sbus/audio/Makefile linux/drivers/sbus/audio/Makefile --- v2.4.5/linux/drivers/sbus/audio/Makefile Fri Dec 29 14:07:22 2000 +++ linux/drivers/sbus/audio/Makefile Tue Jun 5 18:11:43 2001 @@ -11,8 +11,8 @@ obj-$(CONFIG_SPARCAUDIO) += audio.o obj-$(CONFIG_SPARCAUDIO_AMD7930) += amd7930.o -obj-$(CONFIG_SPARCAUDIO_CS4231) += cs4231.o obj-$(CONFIG_SPARCAUDIO_DBRI) += dbri.o +obj-$(CONFIG_SPARCAUDIO_CS4231) += cs4231.o obj-$(CONFIG_SPARCAUDIO_DUMMY) += dmy.o include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.5/linux/drivers/sbus/audio/amd7930.c linux/drivers/sbus/audio/amd7930.c --- v2.4.5/linux/drivers/sbus/audio/amd7930.c Sun Feb 18 19:49:54 2001 +++ linux/drivers/sbus/audio/amd7930.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: amd7930.c,v 1.26 2001/02/13 01:16:59 davem Exp $ +/* $Id: amd7930.c,v 1.27 2001/05/21 01:25:22 davem Exp $ * drivers/sbus/audio/amd7930.c * * Copyright (C) 1996,1997 Thomas K. Dyas (tdyas@eden.rutgers.edu) @@ -107,7 +107,7 @@ static __u8 linear2mulaw(__u16 data); static __u16 mulaw2linear(__u8 data); -#if defined (AMD79C30_ISDN) && defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff +#if defined (AMD79C30_ISDN) #include "../../isdn/hisax/hisax.h" #include "../../isdn/hisax/isdnl1.h" #include "../../isdn/hisax/foreign.h" @@ -1131,7 +1131,7 @@ * */ -#if defined (AMD79C30_ISDN) && defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff +#if defined (AMD79C30_ISDN) static int amd7930_get_irqnum(int dev) { struct amd7930_info *info; @@ -1659,9 +1659,8 @@ return 0; } -#ifdef MODULE /* Detach from an amd7930 chip given the device structure. */ -static void amd7930_detach(struct sparcaudio_driver *drv) +static void __exit amd7930_detach(struct sparcaudio_driver *drv) { struct amd7930_info *info = (struct amd7930_info *)drv->private; @@ -1672,14 +1671,9 @@ sbus_iounmap(info->regs, info->regs_size); kfree(drv->private); } -#endif /* Probe for the amd7930 chip and then attach the driver. */ -#ifdef MODULE -int init_module(void) -#else -int __init amd7930_init(void) -#endif +static int __init amd7930_init(void) { struct sbus_bus *sbus; struct sbus_dev *sdev; @@ -1710,8 +1704,7 @@ return (num_drivers > 0) ? 0 : -EIO; } -#ifdef MODULE -void cleanup_module(void) +static void __exit amd7930_exit(void) { register int i; @@ -1720,8 +1713,9 @@ num_drivers--; } } -#endif +module_init(amd7930_init); +module_exit(amd7930_exit); /*************************************************************/ /* Audio format conversion */ diff -u --recursive --new-file v2.4.5/linux/drivers/sbus/audio/audio.c linux/drivers/sbus/audio/audio.c --- v2.4.5/linux/drivers/sbus/audio/audio.c Sun Feb 18 19:49:54 2001 +++ linux/drivers/sbus/audio/audio.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: audio.c,v 1.58 2001/02/13 01:16:59 davem Exp $ +/* $Id: audio.c,v 1.60 2001/05/21 09:05:05 davem Exp $ * drivers/sbus/audio/audio.c * * Copyright 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu) @@ -32,10 +32,11 @@ #include #include #include -#include #include #include +#include #include +#include #include @@ -73,24 +74,6 @@ static struct sparcaudio_driver *drivers[SPARCAUDIO_MAX_DEVICES]; static devfs_handle_t devfs_handle; -/* This crap to be pulled off into a local include file */ -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x20100 - -#define COPY_IN(arg, get) verify_area(VERIFY_READ, (void *)arg, sizeof(long)); memcpy_fromfs(&get, (long *)arg, sizeof(get)); -#define COPY_OUT(arg, ret) verify_area(VERIFY_WRITE, (void *)arg, sizeof(long)); memcpy_tofs((long *)arg, &ret, sizeof(ret)); -#define copy_to_user memcpy_tofs -#define copy_from_user memcpy_fromfs -#define signal_pending(x) (((x)->signal) & ~((x)->blocked)) - -#else - -#include -#include -#define COPY_IN(arg, get) get_user(get, (int *)arg) -#define COPY_OUT(arg, ret) put_user(ret, (int *)arg) -#define sparcaudio_select sparcaudio_poll - -#endif void sparcaudio_output_done(struct sparcaudio_driver * drv, int status) { @@ -215,37 +198,6 @@ * VFS layer interface */ -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x20100 -static int sparcaudio_select(struct inode * inode, struct file * file, - int sel_type, select_table * wait) -{ - struct sparcaudio_driver *drv = drivers[(MINOR(inode->i_rdev) >> - SPARCAUDIO_DEVICE_SHIFT)]; - - switch (sel_type) { - case SEL_IN: - if (((!file->f_flags & O_NONBLOCK) && drv->input_count) || - (drv->input_size > drv->buffer_size)) { - dprintk(("read ready: c%d o%d\n", - drv->input_count, drv->input_offset)); - return 1; - } - select_wait(&drv->input_read_wait, wait); - break; - case SEL_OUT: - dprintk(("sel out: c%d o%d p%d\n", - drv->output_count, drv->output_offset, drv->playing_count)); - if ((drv->output_count + drv->playing_count) < (drv->num_output_buffers)) - return 1; - select_wait(&drv->output_write_wait, wait); - break; - case SEL_EX: - break; - }; - - return 0; -} -#else static unsigned int sparcaudio_poll(struct file *file, poll_table * wait) { unsigned int mask = 0; @@ -264,29 +216,16 @@ } return mask; } -#endif -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x20100 -static int sparcaudio_lseek(struct inode * inode, struct file * file, - off_t offset, int origin) -#else -static loff_t sparcaudio_lseek(struct file * file, loff_t offset, int origin) -#endif +static loff_t sparcaudio_llseek(struct file * file, loff_t offset, int origin) { return -ESPIPE; } -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x20100 -static int sparcaudio_read(struct inode * inode, struct file * file, - char *buf, int count) -#else static ssize_t sparcaudio_read(struct file * file, char *buf, size_t count, loff_t *ppos) -#endif { -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff struct inode *inode = file->f_dentry->d_inode; -#endif struct sparcaudio_driver *drv = drivers[(MINOR(inode->i_rdev) >> SPARCAUDIO_DEVICE_SHIFT)]; int bytes_to_copy, bytes_read = 0, err; @@ -358,17 +297,10 @@ restore_flags(flags); } -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x20100 -static int sparcaudio_write(struct inode * inode, struct file * file, - const char *buf, int count) -#else static ssize_t sparcaudio_write(struct file * file, const char *buf, size_t count, loff_t *ppos) -#endif { -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff struct inode *inode = file->f_dentry->d_inode; -#endif struct sparcaudio_driver *drv = drivers[(MINOR(inode->i_rdev) >> SPARCAUDIO_DEVICE_SHIFT)]; int bytes_written = 0, bytes_to_copy, err; @@ -499,7 +431,7 @@ switch (cmd) { case SOUND_MIXER_WRITE_RECLEV: - if(COPY_IN(arg, k)) + if (get_user(k, (int *)arg)) return -EFAULT; iretry: oprintk(("setting input volume (0x%x)", k)); @@ -531,9 +463,9 @@ oprintk((" try 0x%x\n", k)); goto iretry; } - return COPY_OUT(arg, i); + return put_user(i, (int *)arg); case SOUND_MIXER_WRITE_VOLUME: - if(COPY_IN(arg, k)) + if (get_user(k, (int *)arg)) return -EFAULT; if (drv->ops->get_output_muted && drv->ops->set_output_muted) { i = drv->ops->get_output_muted(drv); @@ -546,9 +478,9 @@ if (drv->ops->get_output_muted) i = drv->ops->get_output_muted(drv); k = 0x6464 * (1 - i); - return COPY_OUT(arg, k); + return put_user(k, (int *)arg); case SOUND_MIXER_WRITE_PCM: - if(COPY_IN(arg, k)) + if (get_user(k, (int *)arg)) return -EFAULT; oretry: oprintk(("setting output volume (0x%x)\n", k)); @@ -582,25 +514,25 @@ oprintk((" try 0x%x\n", k)); goto oretry; } - return COPY_OUT(arg, i); + return put_user(i, (int *)arg); case SOUND_MIXER_READ_SPEAKER: k = OSS_PORT_AUDIO(drv, AUDIO_SPEAKER); - return COPY_OUT(arg, k); + return put_user(k, (int *)arg); case SOUND_MIXER_READ_MIC: k = OSS_IPORT_AUDIO(drv, AUDIO_MICROPHONE); - return COPY_OUT(arg, k); + return put_user(k, (int *)arg); case SOUND_MIXER_READ_CD: k = OSS_IPORT_AUDIO(drv, AUDIO_CD); - return COPY_OUT(arg, k); + return put_user(k, (int *)arg); case SOUND_MIXER_READ_LINE: k = OSS_IPORT_AUDIO(drv, AUDIO_LINE_IN); - return COPY_OUT(arg, k); + return put_user(k, (int *)arg); case SOUND_MIXER_READ_LINE1: k = OSS_PORT_AUDIO(drv, AUDIO_HEADPHONE); - return COPY_OUT(arg, k); + return put_user(k, (int *)arg); case SOUND_MIXER_READ_LINE2: k = OSS_PORT_AUDIO(drv, AUDIO_LINE_OUT); - return COPY_OUT(arg, k); + return put_user(k, (int *)arg); case SOUND_MIXER_WRITE_MIC: case SOUND_MIXER_WRITE_CD: @@ -608,7 +540,7 @@ case SOUND_MIXER_WRITE_LINE1: case SOUND_MIXER_WRITE_LINE2: case SOUND_MIXER_WRITE_SPEAKER: - if(COPY_IN(arg, k)) + if (get_user(k, (int *)arg)) return -EFAULT; OSS_TWIDDLE_IPORT(drv, cmd, SOUND_MIXER_WRITE_LINE, AUDIO_LINE_IN, k); OSS_TWIDDLE_IPORT(drv, cmd, SOUND_MIXER_WRITE_MIC, AUDIO_MICROPHONE, k); @@ -617,7 +549,7 @@ OSS_TWIDDLE_PORT(drv, cmd, SOUND_MIXER_WRITE_SPEAKER, AUDIO_SPEAKER, k); OSS_TWIDDLE_PORT(drv, cmd, SOUND_MIXER_WRITE_LINE1, AUDIO_HEADPHONE, k); OSS_TWIDDLE_PORT(drv, cmd, SOUND_MIXER_WRITE_LINE2, AUDIO_LINE_OUT, k); - return COPY_OUT(arg, k); + return put_user(k, (int *)arg); case SOUND_MIXER_READ_RECSRC: if (drv->ops->get_input_port) i = drv->ops->get_input_port(drv); @@ -627,11 +559,11 @@ if (i & AUDIO_LINE_IN) j = SOUND_MASK_LINE; if (i & AUDIO_MICROPHONE) j = SOUND_MASK_MIC; - return COPY_OUT(arg, j); + return put_user(j, (int *)arg); case SOUND_MIXER_WRITE_RECSRC: if (!drv->ops->set_input_port) return -EINVAL; - if(COPY_IN(arg, k)) + if (get_user(k, (int *)arg)) return -EFAULT; /* only one should ever be selected */ @@ -641,7 +573,7 @@ oprintk(("setting inport to %d\n", j)); i = drv->ops->set_input_port(drv, j); - return COPY_OUT(arg, i); + return put_user(i, (int *)arg); case SOUND_MIXER_READ_RECMASK: if (drv->ops->get_input_ports) i = drv->ops->get_input_ports(drv); @@ -650,10 +582,10 @@ if (i & AUDIO_LINE_IN) j |= SOUND_MASK_LINE; if (i & AUDIO_CD) j |= SOUND_MASK_CD; - return COPY_OUT(arg, j); + return put_user(j, (int *)arg); case SOUND_MIXER_READ_CAPS: /* mixer capabilities */ i = SOUND_CAP_EXCL_INPUT; - return COPY_OUT(arg, i); + return put_user(i, (int *)arg); case SOUND_MIXER_READ_DEVMASK: /* all supported devices */ if (drv->ops->get_input_ports) @@ -676,7 +608,7 @@ if (cmd == SOUND_MIXER_READ_STEREODEVS) j &= ~(MONO_DEVICES); - return COPY_OUT(arg, j); + return put_user(j, (int *)arg); default: return -EINVAL; }; @@ -742,7 +674,7 @@ case I_GETSIG: case I_GETSIG_SOLARIS: j = (int) lis_get_elist_ent(drv->sd_siglist,current->pid); - COPY_OUT(arg, j); + put_user(j, (int *)arg); retval = drv->input_count; break; @@ -773,7 +705,7 @@ * as its retval. (streamio(7I)) This should work. */ j = (drv->input_count > 0) ? drv->input_buffer_size : 0; - COPY_OUT(arg, j); + put_user(j, (int *)arg); retval = drv->input_count; break; @@ -859,11 +791,11 @@ if (drv->ops->get_output_pause(drv)) j |= PCM_ENABLE_OUTPUT; } - COPY_OUT(arg, j); + put_user(j, (int *)arg); break; case SNDCTL_DSP_GETBLKSIZE: j = drv->input_buffer_size; - COPY_OUT(arg, j); + put_user(j, (int *)arg); break; case SNDCTL_DSP_SPEED: if ((!drv->ops->set_output_rate) && @@ -871,12 +803,12 @@ retval = -EINVAL; break; } - COPY_IN(arg, i); + get_user(i, (int *)arg) tprintk(("setting speed to %d\n", i)); drv->ops->set_input_rate(drv, i); drv->ops->set_output_rate(drv, i); j = drv->ops->get_output_rate(drv); - COPY_OUT(arg, j); + put_user(j, (int *)arg); break; case SNDCTL_DSP_GETCAPS: /* All Sparc audio hardware is full duplex. @@ -884,19 +816,19 @@ * Pause functionality emulates trigger */ j = DSP_CAP_DUPLEX | DSP_CAP_TRIGGER | DSP_CAP_REALTIME; - COPY_OUT(arg, j); + put_user(j, (int *)arg); break; case SNDCTL_DSP_GETFMTS: if (drv->ops->get_formats) { j = drv->ops->get_formats(drv); - COPY_OUT(arg, j); + put_user(j, (int *)arg); } else { retval = -EINVAL; } break; case SNDCTL_DSP_SETFMT: /* need to decode into encoding, precision */ - COPY_IN(arg, i); + get_user(i, (int *)arg); /* handle special case here */ if (i == AFMT_QUERY) { @@ -926,7 +858,7 @@ break; }; } - COPY_OUT(arg, i); + put_user(i, (int *)arg); break; } @@ -991,7 +923,7 @@ dprintk(("setting format: failed\n")); return -EINVAL; } - COPY_OUT(arg, i); + put_user(i, (int *)arg); break; case SNDCTL_DSP_CHANNELS: if ((!drv->ops->set_output_channels) && @@ -999,11 +931,11 @@ retval = -EINVAL; break; } - COPY_IN(arg, i); + get_user(i, (int *)arg); drv->ops->set_input_channels(drv, i); drv->ops->set_output_channels(drv, i); i = drv->ops->get_output_channels(drv); - COPY_OUT(arg, i); + put_user(i, (int *)arg); break; case SNDCTL_DSP_STEREO: if ((!drv->ops->set_output_channels) && @@ -1011,11 +943,11 @@ retval = -EINVAL; break; } - COPY_IN(arg, i); + get_user(i, (int *)arg); drv->ops->set_input_channels(drv, (i + 1)); drv->ops->set_output_channels(drv, (i + 1)); i = ((drv->ops->get_output_channels(drv)) - 1); - COPY_OUT(arg, i); + put_user(i, (int *)arg); break; case SNDCTL_DSP_POST: case SNDCTL_DSP_SYNC: @@ -1761,14 +1693,14 @@ default: eprintk(("unknown minor device number\n")); retval = -EINVAL; - }; + } return retval; } static struct file_operations sparcaudioctl_fops = { owner: THIS_MODULE, - poll: sparcaudio_select, + poll: sparcaudio_poll, ioctl: sparcaudio_ioctl, }; @@ -1960,10 +1892,10 @@ static struct file_operations sparcaudio_fops = { owner: THIS_MODULE, - llseek: sparcaudio_lseek, + llseek: sparcaudio_llseek, read: sparcaudio_read, write: sparcaudio_write, - poll: sparcaudio_select, + poll: sparcaudio_poll, ioctl: sparcaudio_ioctl, open: sparcaudio_open, release: sparcaudio_release, @@ -2032,12 +1964,10 @@ * TODO: Make number of input/output buffers tunable parameters */ -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x202ff init_waitqueue_head(&drv->open_wait); init_waitqueue_head(&drv->output_write_wait); init_waitqueue_head(&drv->output_drain_wait); init_waitqueue_head(&drv->input_read_wait); -#endif drv->num_output_buffers = 8; drv->output_buffer_size = (4096 * 2); @@ -2204,20 +2134,6 @@ return -EIO; devfs_handle = devfs_mk_dir (NULL, "sound", NULL); - -#ifdef CONFIG_SPARCAUDIO_AMD7930 - amd7930_init(); -#endif -#ifdef CONFIG_SPARCAUDIO_DBRI - dbri_init(); -#endif -#ifdef CONFIG_SPARCAUDIO_CS4231 - cs4231_init(); -#endif -#ifdef CONFIG_SPARCAUDIO_DUMMY - dummy_init(); -#endif - return 0; } diff -u --recursive --new-file v2.4.5/linux/drivers/sbus/audio/cs4231.c linux/drivers/sbus/audio/cs4231.c --- v2.4.5/linux/drivers/sbus/audio/cs4231.c Sun Mar 25 18:14:20 2001 +++ linux/drivers/sbus/audio/cs4231.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: cs4231.c,v 1.45 2001/03/23 08:16:13 davem Exp $ +/* $Id: cs4231.c,v 1.46 2001/05/21 01:25:22 davem Exp $ * drivers/sbus/audio/cs4231.c * * Copyright 1996, 1997, 1998, 1999 Derrick J Brashear (shadow@andrew.cmu.edu) @@ -35,7 +35,7 @@ #include #include #include -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff && defined(CONFIG_PCI) +#ifdef CONFIG_PCI #define EB4231_SUPPORT #include #include @@ -2178,9 +2178,6 @@ static int cs4231_attach(struct sparcaudio_driver *drv, struct sbus_dev *sdev) { -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x20100 - struct linux_prom_irqs irq; -#endif struct cs4231_chip *cs4231_chip; int err; @@ -2367,12 +2364,32 @@ } #endif -/* Probe for the cs4231 chip and then attach the driver. */ -#ifdef MODULE -int init_module(void) -#else -int __init cs4231_init(void) +/* Detach from an cs4231 chip given the device structure. */ +static void __exit cs4231_detach(struct sparcaudio_driver *drv) +{ + struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private; + + cs4231_disable_interrupts(drv); + unregister_sparcaudio_driver(drv, 1); + disable_irq(cs4231_chip->irq); + free_irq(cs4231_chip->irq, drv); + if (!(cs4231_chip->status & CS_STATUS_IS_EBUS)) { + sbus_iounmap(cs4231_chip->regs, cs4231_chip->regs_size); + } else { +#ifdef EB4231_SUPPORT + iounmap(cs4231_chip->regs); + iounmap(cs4231_chip->eb2p); + iounmap(cs4231_chip->eb2c); + disable_irq(cs4231_chip->irq2); + free_irq(cs4231_chip->irq2, drv); #endif + } + kfree(drv->private); +} + + +/* Probe for the cs4231 chip and then attach the driver. */ +static int __init cs4231_init(void) { struct sbus_bus *sbus; struct sbus_dev *sdev; @@ -2414,31 +2431,7 @@ return (num_drivers > 0) ? 0 : -EIO; } -#ifdef MODULE -/* Detach from an cs4231 chip given the device structure. */ -static void cs4231_detach(struct sparcaudio_driver *drv) -{ - struct cs4231_chip *cs4231_chip = (struct cs4231_chip *) drv->private; - - cs4231_disable_interrupts(drv); - unregister_sparcaudio_driver(drv, 1); - disable_irq(cs4231_chip->irq); - free_irq(cs4231_chip->irq, drv); - if (!(cs4231_chip->status & CS_STATUS_IS_EBUS)) { - sbus_iounmap(cs4231_chip->regs, cs4231_chip->regs_size); - } else { -#ifdef EB4231_SUPPORT - iounmap(cs4231_chip->regs); - iounmap(cs4231_chip->eb2p); - iounmap(cs4231_chip->eb2c); - disable_irq(cs4231_chip->irq2); - free_irq(cs4231_chip->irq2, drv); -#endif - } - kfree(drv->private); -} - -void cleanup_module(void) +static void __exit cs4231_exit(void) { register int i; @@ -2447,8 +2440,9 @@ num_drivers--; } } -#endif +module_init(cs4231_init); +module_exit(cs4231_exit); /* * Overrides for Emacs so that we follow Linus's tabbing style. * Emacs will notice this stuff at the end of the file and automatically diff -u --recursive --new-file v2.4.5/linux/drivers/sbus/audio/dbri.c linux/drivers/sbus/audio/dbri.c --- v2.4.5/linux/drivers/sbus/audio/dbri.c Sun Feb 18 19:49:55 2001 +++ linux/drivers/sbus/audio/dbri.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: dbri.c,v 1.25 2001/02/13 01:16:59 davem Exp $ +/* $Id: dbri.c,v 1.26 2001/05/21 01:25:22 davem Exp $ * drivers/sbus/audio/dbri.c * * Copyright (C) 1997 Rudolf Koenig (rfkoenig@immd4.informatik.uni-erlangen.de) @@ -61,7 +61,7 @@ #include #include "dbri.h" -#if defined(DBRI_ISDN) && defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff +#if defined(DBRI_ISDN) #include "../../isdn/hisax/hisax.h" #include "../../isdn/hisax/isdnl1.h" #include "../../isdn/hisax/foreign.h" @@ -2227,7 +2227,7 @@ recv_on_pipe(dbri, 8+chan, buffer, size, callback, callback_arg); } -#if defined(DBRI_ISDN) && defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff +#if defined(DBRI_ISDN) struct foreign_interface dbri_foreign_interface = { dbri_get_irqnum, dbri_get_liu_state, @@ -2336,11 +2336,7 @@ } /* Probe for the dbri chip and then attach the driver. */ -#ifdef MODULE -int init_module(void) -#else -int __init dbri_init(void) -#endif +static int __init dbri_init(void) { struct sbus_bus *sbus; struct sbus_dev *sdev; @@ -2368,8 +2364,7 @@ return (num_drivers > 0) ? 0 : -EIO; } -#ifdef MODULE -void cleanup_module(void) +static void __exit dbri_exit(void) { register int i; @@ -2379,8 +2374,9 @@ num_drivers--; } } -#endif +module_init(dbri_init); +module_exit(dbri_exit); /* * Overrides for Emacs so that we follow Linus's tabbing style. * Emacs will notice this stuff at the end of the file and automatically diff -u --recursive --new-file v2.4.5/linux/drivers/sbus/audio/dmy.c linux/drivers/sbus/audio/dmy.c --- v2.4.5/linux/drivers/sbus/audio/dmy.c Sun Feb 18 19:49:55 2001 +++ linux/drivers/sbus/audio/dmy.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: dmy.c,v 1.7 2001/02/13 01:16:59 davem Exp $ +/* $Id: dmy.c,v 1.9 2001/05/22 23:16:10 davem Exp $ * drivers/sbus/audio/dummy.c * * Copyright 1998 Derrick J Brashear (shadow@andrew.cmu.edu) @@ -36,7 +36,7 @@ static int dummy_record_gain(struct sparcaudio_driver *drv, int value, unsigned char balance); static int dummy_output_muted(struct sparcaudio_driver *drv, int value); -static int dummy_attach(struct sparcaudio_driver *drv); +static int dummy_attach(struct sparcaudio_driver *drv) __init; static int dummy_set_output_encoding(struct sparcaudio_driver *drv, int value) @@ -710,25 +710,8 @@ dummy_get_formats, }; -/* Probe for the dummy chip and then attach the driver. */ -#ifdef MODULE -int init_module(void) -#else -int __init dummy_init(void) -#endif -{ - num_drivers = 0; - - /* Add support here for specifying multiple dummies to attach at once. */ - if (dummy_attach(&drivers[num_drivers]) == 0) - num_drivers++; - - /* Only return success if we found some dummy chips. */ - return (num_drivers > 0) ? 0 : -EIO; -} - /* Attach to an dummy chip given its PROM node. */ -static int dummy_attach(struct sparcaudio_driver *drv) +static int __init dummy_attach(struct sparcaudio_driver *drv) { struct dummy_chip *dummy_chip; int err; @@ -768,15 +751,27 @@ return 0; } -#ifdef MODULE /* Detach from an dummy chip given the device structure. */ -static void dummy_detach(struct sparcaudio_driver *drv) +static void __exit dummy_detach(struct sparcaudio_driver *drv) { unregister_sparcaudio_driver(drv, 2); kfree(drv->private); } -void cleanup_module(void) +/* Probe for the dummy chip and then attach the driver. */ +static int __init dummy_init(void) +{ + num_drivers = 0; + + /* Add support here for specifying multiple dummies to attach at once. */ + if (dummy_attach(&drivers[num_drivers]) == 0) + num_drivers++; + + /* Only return success if we found some dummy chips. */ + return (num_drivers > 0) ? 0 : -EIO; +} + +static void __exit dummy_exit(void) { int i; @@ -785,8 +780,9 @@ num_drivers--; } } -#endif +module_init(dummy_init); +module_exit(dummy_exit); /* * Overrides for Emacs so that we follow Linus's tabbing style. * Emacs will notice this stuff at the end of the file and automatically diff -u --recursive --new-file v2.4.5/linux/drivers/sbus/char/pcikbd.c linux/drivers/sbus/char/pcikbd.c --- v2.4.5/linux/drivers/sbus/char/pcikbd.c Fri May 25 18:28:54 2001 +++ linux/drivers/sbus/char/pcikbd.c Tue Jun 5 18:11:43 2001 @@ -1,4 +1,4 @@ -/* $Id: pcikbd.c,v 1.54 2001/05/11 07:46:28 davem Exp $ +/* $Id: pcikbd.c,v 1.57 2001/06/03 13:41:13 ecd Exp $ * pcikbd.c: Ultra/AX PC keyboard support. * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -54,6 +54,7 @@ static int pcikbd_mrcoffee = 0; #else #define pcikbd_mrcoffee 0 +extern void (*prom_keyboard)(void); #endif static unsigned long pcikbd_iobase = 0; @@ -66,6 +67,9 @@ static spinlock_t pcikbd_lock = SPIN_LOCK_UNLOCKED; +static void pcikbd_write(int address, int data); +static int pcikbd_wait_for_input(void); + unsigned char pckbd_read_mask = KBD_STAT_OBF; extern int pcikbd_init(void); @@ -239,7 +243,7 @@ e0_keys[scancode - 128]; } -int do_acknowledge(unsigned char scancode) +static int do_acknowledge(unsigned char scancode) { if(reply_expected) { if(scancode == KBD_REPLY_ACK) { @@ -255,10 +259,87 @@ return 1; } +#ifdef __sparc_v9__ +static void pcikbd_enter_prom(void) +{ + pcikbd_write(KBD_DATA_REG, KBD_CMD_DISABLE); + if(pcikbd_wait_for_input() != KBD_REPLY_ACK) + printk("Prom Enter: Disable keyboard: no ACK\n"); + + /* Disable PC scancode translation */ + pcikbd_write(KBD_CNTL_REG, KBD_CCMD_WRITE_MODE); + pcikbd_write(KBD_DATA_REG, KBD_MODE_SYS); + pcikbd_write(KBD_DATA_REG, KBD_CMD_ENABLE); + if (pcikbd_wait_for_input() != KBD_REPLY_ACK) + printk("Prom Enter: Enable Keyboard: no ACK\n"); +} +#endif + +static void ctrl_break(void) +{ + extern int stop_a_enabled; + unsigned long timeout; + int status, data; + int mode; + + if (!stop_a_enabled) + return; + + pcikbd_write(KBD_DATA_REG, KBD_CMD_DISABLE); + if(pcikbd_wait_for_input() != KBD_REPLY_ACK) + printk("Prom Enter: Disable keyboard: no ACK\n"); + + /* Save current mode register settings */ + pcikbd_write(KBD_CNTL_REG, KBD_CCMD_READ_MODE); + if ((mode = pcikbd_wait_for_input()) == -1) + printk("Prom Enter: Read Mode: no ACK\n"); + + /* Disable PC scancode translation */ + pcikbd_write(KBD_CNTL_REG, KBD_CCMD_WRITE_MODE); + pcikbd_write(KBD_DATA_REG, mode & ~(KBD_MODE_KCC)); + pcikbd_write(KBD_DATA_REG, KBD_CMD_ENABLE); + if (pcikbd_wait_for_input() != KBD_REPLY_ACK) + printk("Prom Enter: Enable Keyboard: no ACK\n"); + + /* Drop into OBP. + * Note that we must flush the user windows + * first before giving up control. + */ + flush_user_windows(); + prom_cmdline(); + + /* Read prom's key up event (use short timeout) */ + do { + timeout = 10; + do { + mdelay(1); + status = pcikbd_inb(pcikbd_iobase + KBD_STATUS_REG); + if (!(status & KBD_STAT_OBF)) + continue; + data = pcikbd_inb(pcikbd_iobase + KBD_DATA_REG); + if (status & (KBD_STAT_GTO | KBD_STAT_PERR)) + continue; + break; + } while (--timeout > 0); + } while (timeout > 0); + + /* Reenable PC scancode translation */ + pcikbd_write(KBD_DATA_REG, KBD_CMD_DISABLE); + if(pcikbd_wait_for_input() != KBD_REPLY_ACK) + printk("Prom Leave: Disable keyboard: no ACK\n"); + + pcikbd_write(KBD_CNTL_REG, KBD_CCMD_WRITE_MODE); + pcikbd_write(KBD_DATA_REG, mode); + pcikbd_write(KBD_DATA_REG, KBD_CMD_ENABLE); + if (pcikbd_wait_for_input() != KBD_REPLY_ACK) + printk("Prom Enter: Enable Keyboard: no ACK\n"); +} + int pcikbd_translate(unsigned char scancode, unsigned char *keycode, char raw_mode) { static int prev_scancode = 0; + int down = scancode & 0x80 ? 0 : 1; if (scancode == 0xe0 || scancode == 0xe1) { prev_scancode = scancode; @@ -297,6 +378,18 @@ } else *keycode = scancode; + + if (*keycode == E0_BREAK) { + if (down) + return 0; + + /* Handle ctrl-break event */ + ctrl_break(); + + /* Send ctrl up event to the keyboard driver */ + *keycode = 0x1d; + } + return 1; } @@ -338,11 +431,11 @@ int retries = 3; unsigned long flags; - spin_lock_irqsave(&pcikbd_lock, flags); - do { unsigned long timeout = 1000; + spin_lock_irqsave(&pcikbd_lock, flags); + kb_wait(); acknowledge = 0; @@ -350,24 +443,23 @@ reply_expected = 1; pcikbd_outb(data, pcikbd_iobase + KBD_DATA_REG); + + spin_unlock_irqrestore(&pcikbd_lock, flags); + do { if (acknowledge) - goto out_ack; + return 1; if (resend) break; mdelay(1); } while (--timeout); + if (timeout == 0) - goto out_timeout; + break; + } while (retries-- > 0); -out_timeout: - spin_unlock_irqrestore(&pcikbd_lock, flags); return 0; - -out_ack: - spin_unlock_irqrestore(&pcikbd_lock, flags); - return 1; } void pcikbd_leds(unsigned char leds) @@ -378,7 +470,7 @@ send_data(KBD_CMD_ENABLE); } -static int __init pcikbd_wait_for_input(void) +static int pcikbd_wait_for_input(void) { int status, data; unsigned long timeout = 1000; @@ -401,7 +493,7 @@ return -1; } -static void __init pcikbd_write(int address, int data) +static void pcikbd_write(int address, int data) { int status; @@ -664,6 +756,8 @@ kd_mksound = pcikbd_kd_mksound; printk("8042(speaker): iobase[%016lx]%s\n", pcibeep_iobase, edev ? "" : " (forced)"); + + prom_keyboard = pcikbd_enter_prom; #endif disable_irq(pcikbd_irq); diff -u --recursive --new-file v2.4.5/linux/drivers/sbus/char/sab82532.c linux/drivers/sbus/char/sab82532.c --- v2.4.5/linux/drivers/sbus/char/sab82532.c Thu Apr 19 08:38:49 2001 +++ linux/drivers/sbus/char/sab82532.c Tue Jun 5 18:11:43 2001 @@ -1,8 +1,11 @@ -/* $Id: sab82532.c,v 1.58 2001/04/17 06:30:36 davem Exp $ +/* $Id: sab82532.c,v 1.60 2001/05/29 05:56:06 ecd Exp $ * sab82532.c: ASYNC Driver for the SIEMENS SAB82532 DUSCC. * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) * + * Rewrote buffer handling to use CIRC(Circular Buffer) macros. + * Maxim Krasnyanskiy + * */ #include @@ -59,6 +62,7 @@ #undef SERIAL_DEBUG_WAIT_UNTIL_SENT #undef SERIAL_DEBUG_SEND_BREAK #undef SERIAL_DEBUG_INTR +#undef SERIAL_DEBUG_FIFO #define SERIAL_DEBUG_OVERFLOW 1 /* Trace things on serial device, useful for console debugging: */ @@ -209,22 +213,23 @@ save_flags(flags); cli(); - if (info->xmit_cnt <= 0) + if (info->xmit.head == info->xmit.tail) goto out; - if (!(readb(&info->regs->r.star) & SAB82532_STAR_XFW)) + if (!test_bit(SAB82532_XPR, &info->irqflags)) goto out; info->interrupt_mask1 &= ~(SAB82532_IMR1_ALLS); writeb(info->interrupt_mask1, &info->regs->w.imr1); - info->all_sent = 0; + clear_bit(SAB82532_ALLS, &info->irqflags); + clear_bit(SAB82532_XPR, &info->irqflags); for (i = 0; i < info->xmit_fifo_size; i++) { - u8 val = info->xmit_buf[info->xmit_tail++]; - writeb(val, &info->regs->w.xfifo[i]); - info->xmit_tail &= (SERIAL_XMIT_SIZE - 1); + writeb(info->xmit.buf[info->xmit.tail], + &info->regs->w.xfifo[i]); + info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1); info->icount.tx++; - if (--info->xmit_cnt <= 0) + if (info->xmit.head == info->xmit.tail) break; } @@ -397,20 +402,29 @@ if (stat->sreg.isr1 & SAB82532_ISR1_ALLS) { info->interrupt_mask1 |= SAB82532_IMR1_ALLS; writeb(info->interrupt_mask1, &info->regs->w.imr1); - info->all_sent = 1; + set_bit(SAB82532_ALLS, &info->irqflags); } if (!(stat->sreg.isr1 & SAB82532_ISR1_XPR)) return; + if (!(readb(&info->regs->r.star) & SAB82532_STAR_XFW)) { +#ifdef SERIAL_DEBUG_FIFO + printk("%s: XPR, but no XFW (???)\n", __FUNCTION__); +#endif + return; + } + + set_bit(SAB82532_XPR, &info->irqflags); + if (!info->tty) { info->interrupt_mask1 |= SAB82532_IMR1_XPR; writeb(info->interrupt_mask1, &info->regs->w.imr1); return; } - if ((info->xmit_cnt <= 0) || info->tty->stopped || - info->tty->hw_stopped) { + if ((info->xmit.head == info->xmit.tail) || + info->tty->stopped || info->tty->hw_stopped) { info->interrupt_mask1 |= SAB82532_IMR1_XPR; writeb(info->interrupt_mask1, &info->regs->w.imr1); return; @@ -418,15 +432,16 @@ info->interrupt_mask1 &= ~(SAB82532_IMR1_ALLS); writeb(info->interrupt_mask1, &info->regs->w.imr1); - info->all_sent = 0; + clear_bit(SAB82532_ALLS, &info->irqflags); /* Stuff 32 bytes into Transmit FIFO. */ + clear_bit(SAB82532_XPR, &info->irqflags); for (i = 0; i < info->xmit_fifo_size; i++) { - u8 val = info->xmit_buf[info->xmit_tail++]; - writeb(val, &info->regs->w.xfifo[i]); - info->xmit_tail &= (SERIAL_XMIT_SIZE - 1); + writeb(info->xmit.buf[info->xmit.tail], + &info->regs->w.xfifo[i]); + info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1); info->icount.tx++; - if (--info->xmit_cnt <= 0) + if (info->xmit.head == info->xmit.tail) break; } @@ -434,16 +449,12 @@ sab82532_cec_wait(info); writeb(SAB82532_CMDR_XF, &info->regs->w.cmdr); - if (info->xmit_cnt < WAKEUP_CHARS) + if (CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) < WAKEUP_CHARS) sab82532_sched_event(info, RS_EVENT_WRITE_WAKEUP); #ifdef SERIAL_DEBUG_INTR printk("THRE..."); #endif - if (info->xmit_cnt <= 0) { - info->interrupt_mask1 |= SAB82532_IMR1_XPR; - writeb(info->interrupt_mask1, &info->regs->w.imr1); - } } static void check_status(struct sab82532 *info, @@ -774,10 +785,10 @@ retval = -ENODEV; goto errout; } - if (info->xmit_buf) + if (info->xmit.buf) free_page(page); else - info->xmit_buf = (unsigned char *)page; + info->xmit.buf = (unsigned char *)page; #ifdef SERIAL_DEBUG_OPEN printk("starting up serial port %d...", info->line); @@ -812,11 +823,13 @@ SAB82532_IMR1_CSC | SAB82532_IMR1_XON | SAB82532_IMR1_XPR; writeb(info->interrupt_mask1, &info->regs->w.imr1); - info->all_sent = 1; + set_bit(SAB82532_ALLS, &info->irqflags); if (info->tty) clear_bit(TTY_IO_ERROR, &info->tty->flags); - info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; + info->xmit.head = info->xmit.tail = 0; + + set_bit(SAB82532_XPR, &info->irqflags); /* * and set the speed of the serial port @@ -856,9 +869,9 @@ */ wake_up_interruptible(&info->delta_msr_wait); - if (info->xmit_buf) { - free_page((unsigned long)info->xmit_buf); - info->xmit_buf = 0; + if (info->xmit.buf) { + free_page((unsigned long)info->xmit.buf); + info->xmit.buf = 0; } #ifdef CONFIG_SERIAL_CONSOLE @@ -886,9 +899,11 @@ writeb(info->interrupt_mask1, &info->regs->w.imr1); if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) { - writeb(readb(&info->regs->rw.mode) | SAB82532_MODE_FRTS, &info->regs->rw.mode); - writeb(readb(&info->regs->rw.mode) | SAB82532_MODE_RTS, &info->regs->rw.mode); - writeb(readb(&info->regs->rw.pvr) | info->pvr_dtr_bit, &info->regs->rw.pvr); + tmp = readb(&info->regs->r.mode); + tmp |= (SAB82532_MODE_FRTS | SAB82532_MODE_RTS); + writeb(tmp, &info->regs->rw.mode); + writeb(readb(&info->regs->rw.pvr) | info->pvr_dtr_bit, + &info->regs->rw.pvr); } /* Disable break condition */ @@ -1054,18 +1069,17 @@ if (serial_paranoia_check(info, tty->device, "sab82532_put_char")) return; - if (!tty || !info->xmit_buf) + if (!tty || !info->xmit.buf) return; save_flags(flags); cli(); - if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) { + if (!CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE)) { restore_flags(flags); return; } - info->xmit_buf[info->xmit_head++] = ch; - info->xmit_head &= SERIAL_XMIT_SIZE-1; - info->xmit_cnt++; + info->xmit.buf[info->xmit.head] = ch; + info->xmit.head = (info->xmit.head + 1) & (SERIAL_XMIT_SIZE-1); restore_flags(flags); } @@ -1077,8 +1091,8 @@ if (serial_paranoia_check(info, tty->device, "sab82532_flush_chars")) return; - if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || - !info->xmit_buf) + if ((info->xmit.head == info->xmit.tail) || + tty->stopped || tty->hw_stopped || !info->xmit.buf) return; save_flags(flags); cli(); @@ -1098,42 +1112,63 @@ if (serial_paranoia_check(info, tty->device, "sab82532_write")) return 0; - if (!tty || !info->xmit_buf || !tmp_buf) + if (!tty || !info->xmit.buf || !tmp_buf) return 0; - if (from_user) - down(&tmp_buf_sem); save_flags(flags); - while (1) { - cli(); - c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, - SERIAL_XMIT_SIZE - info->xmit_head)); - if (c <= 0) - break; + if (from_user) { + down(&tmp_buf_sem); + while (1) { + int c1; + c = CIRC_SPACE_TO_END(info->xmit.head, + info->xmit.tail, + SERIAL_XMIT_SIZE); + if (count < c) + c = count; + if (c <= 0) + break; - if (from_user) { c -= copy_from_user(tmp_buf, buf, c); if (!c) { if (!ret) ret = -EFAULT; break; } - c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, - SERIAL_XMIT_SIZE - info->xmit_head)); - memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c); - } else - memcpy(info->xmit_buf + info->xmit_head, buf, c); - info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1); - info->xmit_cnt += c; + cli(); + c1 = CIRC_SPACE_TO_END(info->xmit.head, + info->xmit.tail, + SERIAL_XMIT_SIZE); + if (c1 < c) + c = c1; + memcpy(info->xmit.buf + info->xmit.head, tmp_buf, c); + info->xmit.head = (info->xmit.head + c) & (SERIAL_XMIT_SIZE-1); + restore_flags(flags); + buf += c; + count -= c; + ret += c; + } + up(&tmp_buf_sem); + } else { + cli(); + while (1) { + c = CIRC_SPACE_TO_END(info->xmit.head, + info->xmit.tail, + SERIAL_XMIT_SIZE); + if (count < c) + c = count; + if (c <= 0) + break; + memcpy(info->xmit.buf + info->xmit.head, buf, c); + info->xmit.head = (info->xmit.head + c) & (SERIAL_XMIT_SIZE-1); + buf += c; + count -= c; + ret += c; + } restore_flags(flags); - buf += c; - count -= c; - ret += c; } - if (from_user) - up(&tmp_buf_sem); - if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) { + if ((info->xmit.head != info->xmit.tail) && + !tty->stopped && !tty->hw_stopped) { info->interrupt_mask1 &= ~(SAB82532_IMR1_XPR); writeb(info->interrupt_mask1, &info->regs->w.imr1); sab82532_start_tx(info); @@ -1146,14 +1181,11 @@ static int sab82532_write_room(struct tty_struct *tty) { struct sab82532 *info = (struct sab82532 *)tty->driver_data; - int ret; if (serial_paranoia_check(info, tty->device, "sab82532_write_room")) return 0; - ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1; - if (ret < 0) - ret = 0; - return ret; + + return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); } static int sab82532_chars_in_buffer(struct tty_struct *tty) @@ -1162,18 +1194,22 @@ if (serial_paranoia_check(info, tty->device, "sab82532_chars_in_buffer")) return 0; - return info->xmit_cnt; + + return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); } static void sab82532_flush_buffer(struct tty_struct *tty) { struct sab82532 *info = (struct sab82532 *)tty->driver_data; + unsigned long flags; if (serial_paranoia_check(info, tty->device, "sab82532_flush_buffer")) return; - cli(); - info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; - sti(); + + save_flags(flags); cli(); + info->xmit.head = info->xmit.tail = 0; + restore_flags(flags); + wake_up_interruptible(&tty->write_wait); if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) @@ -1221,6 +1257,12 @@ if (I_IXOFF(tty)) sab82532_send_xchar(tty, STOP_CHAR(tty)); + + if (tty->termios->c_cflag & CRTSCTS) { + u8 mode = readb(&info->regs->r.mode); + mode &= ~(SAB82532_MODE_FRTS | SAB82532_MODE_RTS); + writeb(mode, &info->regs->w.mode); + } } static void sab82532_unthrottle(struct tty_struct * tty) @@ -1242,6 +1284,13 @@ else sab82532_send_xchar(tty, START_CHAR(tty)); } + + if (tty->termios->c_cflag & CRTSCTS) { + u8 mode = readb(&info->regs->r.mode); + mode &= ~(SAB82532_MODE_RTS); + mode |= SAB82532_MODE_FRTS; + writeb(mode, &info->regs->w.mode); + } } /* @@ -1295,7 +1344,8 @@ { unsigned int result; - result = (!info->xmit_buf && info->all_sent) ? TIOCSER_TEMT : 0; + result = (!info->xmit.buf && test_bit(SAB82532_ALLS, &info->irqflags)) + ? TIOCSER_TEMT : 0; return put_user(result, value); } @@ -1523,8 +1573,12 @@ if (!(old_termios->c_cflag & CBAUD) && (tty->termios->c_cflag & CBAUD)) { writeb(readb(&info->regs->w.pvr) & ~(info->pvr_dtr_bit), &info->regs->w.pvr); - if (!tty->hw_stopped || - !(tty->termios->c_cflag & CRTSCTS)) { + if (tty->termios->c_cflag & CRTSCTS) { + writeb(readb(&info->regs->w.mode) & ~(SAB82532_MODE_RTS), &info->regs->w.mode); + writeb(readb(&info->regs->w.mode) | SAB82532_MODE_FRTS, &info->regs->w.mode); + } else if (test_bit(TTY_THROTTLED, &tty->flags)) { + writeb(readb(&info->regs->w.mode) & ~(SAB82532_MODE_FRTS | SAB82532_MODE_RTS), &info->regs->w.mode); + } else { writeb(readb(&info->regs->w.mode) & ~(SAB82532_MODE_FRTS), &info->regs->w.mode); writeb(readb(&info->regs->w.mode) | SAB82532_MODE_RTS, &info->regs->w.mode); } @@ -1654,7 +1708,6 @@ if (serial_paranoia_check(info,tty->device,"sab82532_wait_until_sent")) return; - orig_jiffies = jiffies; /* * Set the check interval to be 1/5 of the estimated time to * send a single character, and make it at least 1. The check @@ -1670,10 +1723,15 @@ if (timeout) char_time = MIN(char_time, timeout); #ifdef SERIAL_DEBUG_WAIT_UNTIL_SENT - printk("In sab82532_wait_until_sent(%d) check=%lu...", timeout, char_time); - printk("jiff=%lu...", jiffies); + printk("In sab82532_wait_until_sent(%d) check=%lu " + "xmit_cnt = %ld, alls = %d (jiff=%lu)...\n", + timeout, char_time, + CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE), + test_bit(SAB82532_ALLS, &info->irqflags), jiffies); #endif - while (info->xmit_cnt || !info->all_sent) { + orig_jiffies = jiffies; + while ((info->xmit.head != info->xmit.tail) || + !test_bit(SAB82532_ALLS, &info->irqflags)) { current->state = TASK_INTERRUPTIBLE; schedule_timeout(char_time); if (signal_pending(current)) @@ -1682,7 +1740,9 @@ break; } #ifdef SERIAL_DEBUG_WAIT_UNTIL_SENT - printk("xmit_cnt = %d, alls = %d (jiff=%lu)...done\n", info->xmit_cnt, info->all_sent, jiffies); + printk("xmit_cnt = %ld, alls = %d (jiff=%lu)...done\n", + CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE), + test_bit(SAB82532_ALLS, &info->irqflags), jiffies); #endif } @@ -2151,7 +2211,7 @@ static inline void __init show_serial_version(void) { - char *revision = "$Revision: 1.58 $"; + char *revision = "$Revision: 1.60 $"; char *version, *p; version = strchr(revision, ' '); diff -u --recursive --new-file v2.4.5/linux/drivers/scsi/osst.c linux/drivers/scsi/osst.c --- v2.4.5/linux/drivers/scsi/osst.c Thu Jan 4 13:00:55 2001 +++ linux/drivers/scsi/osst.c Wed Jun 6 10:42:45 2001 @@ -16,22 +16,21 @@ Copyright 1992 - 2000 Kai Makisara email Kai.Makisara@metla.fi - $Header: /home/cvsroot/Driver/osst.c,v 1.51 2000/12/22 20:48:27 garloff Exp $ + $Header: /home/cvsroot/Driver/osst.c,v 1.61 2001/06/03 21:55:12 riede Exp $ Microscopic alterations - Rik Ling, 2000/12/21 Last modified: Wed Feb 2 22:04:05 2000 by makisara@kai.makisara.local Some small formal changes - aeb, 950809 */ -static const char * cvsid = "$Id: osst.c,v 1.51 2000/12/22 20:48:27 garloff Exp $"; -const char * osst_version = "0.9.4.3"; +static const char * cvsid = "$Id: osst.c,v 1.61 2001/06/03 21:55:12 riede Exp $"; +const char * osst_version = "0.9.8"; /* The "failure to reconnect" firmware bug */ -#define OSST_FW_NEED_POLL_MIN 10602 /*(107A)*/ -#define OSST_FW_NEED_POLL_MAX 10708 /*(108D)*/ +#define OSST_FW_NEED_POLL_MIN 10601 /*(107A)*/ +#define OSST_FW_NEED_POLL_MAX 10704 /*(108D)*/ #define OSST_FW_NEED_POLL(x,d) ((x) >= OSST_FW_NEED_POLL_MIN && (x) <= OSST_FW_NEED_POLL_MAX && d->host->this_id != 7) -#include #include #include @@ -112,6 +111,8 @@ #if DEBUG static int debugging = 1; +/* uncomment define below to test error recovery */ +// #define OSST_INJECT_ERRORS 1 #endif #define MAX_RETRIES 0 @@ -172,7 +173,7 @@ static int osst_get_frame_position(OS_Scsi_Tape *STp, Scsi_Request ** aSRpnt); -static int osst_flush_write_buffer(OS_Scsi_Tape *STp, Scsi_Request ** aSRpnt, int file_blk); +static int osst_flush_write_buffer(OS_Scsi_Tape *STp, Scsi_Request ** aSRpnt); static int osst_write_error_recovery(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int pending); @@ -202,7 +203,7 @@ #if DEBUG if (debugging) { - printk(OSST_DEB_MSG "osst%d: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n", + printk(OSST_DEB_MSG "osst%d:D: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n", dev, result, SRpnt->sr_cmnd[0], SRpnt->sr_cmnd[1], SRpnt->sr_cmnd[2], SRpnt->sr_cmnd[3], SRpnt->sr_cmnd[4], SRpnt->sr_cmnd[5], @@ -222,16 +223,25 @@ SRpnt->sr_cmnd[0] != MODE_SENSE && SRpnt->sr_cmnd[0] != TEST_UNIT_READY)) { /* Abnormal conditions for tape */ if (driver_byte(result) & DRIVER_SENSE) { - printk(KERN_WARNING "osst%d: Error with sense data: ", dev); + printk(KERN_WARNING "osst%d:W: Error with sense data: ", dev); print_req_sense("osst", SRpnt); } - else + else { + static int notyetprinted = 1; + printk(KERN_WARNING - "osst%d: Error %x (sugg. bt 0x%x, driver bt 0x%x, host bt 0x%x).\n", + "osst%d:W: Error %x (sugg. bt 0x%x, driver bt 0x%x, host bt 0x%x).\n", dev, result, suggestion(result), driver_byte(result) & DRIVER_MASK, host_byte(result)); + if (notyetprinted) { + notyetprinted = 0; + printk(KERN_INFO + "osst%d:I: This error may be caused by your scsi controller,\n", dev); + printk(KERN_INFO + "osst%d:I: it has been reported with some Buslogic cards.\n", dev); + } + } } - if ((sense[0] & 0x70) == 0x70 && scode == RECOVERED_ERROR) { STp->recover_count++; @@ -244,7 +254,7 @@ stp = "write"; else stp = "ioctl"; - printk(OSST_DEB_MSG "osst%d: Recovered %s error (%d).\n", dev, stp, + printk(OSST_DEB_MSG "osst%d:D: Recovered %s error (%d).\n", dev, stp, os_scsi_tapes[dev]->recover_count); } #endif @@ -259,7 +269,6 @@ static void osst_sleep_done (Scsi_Cmnd * SCpnt) { unsigned int dev; - int remainder; OS_Scsi_Tape * STp; if ((dev = TAPE_NR(SCpnt->request.rq_dev)) < osst_template.nr_dev) { @@ -268,15 +277,7 @@ (SCpnt->sense_buffer[0] & 0x70) == 0x70 && (SCpnt->sense_buffer[2] & 0x40)) { /* EOM at write-behind, has all been written? */ - if ((SCpnt->sense_buffer[0] & 0x80) != 0) - remainder = (SCpnt->sense_buffer[3] << 24) | - (SCpnt->sense_buffer[4] << 16) | - (SCpnt->sense_buffer[5] << 8 ) | - SCpnt->sense_buffer[6]; - else - remainder = 0; - if ((SCpnt->sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW || - remainder > 0) + if ((SCpnt->sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW) (STp->buffer)->midlevel_result = SCpnt->result; /* Error */ else (STp->buffer)->midlevel_result = INT_MAX; /* OK */ @@ -293,7 +294,7 @@ } #if DEBUG else if (debugging) - printk(KERN_ERR "osst?: Illegal interrupt device %x\n", dev); + printk(OSST_DEB_MSG "osst?:D: Illegal interrupt device %x\n", dev); #endif } @@ -305,11 +306,13 @@ unsigned char *cmd, int bytes, int direction, int timeout, int retries, int do_wait) { unsigned char *bp; -//static int inject = 0; /* FIXME - take out inject occasional read errors */ -//static int repeat = 0; +#ifdef OSST_INJECT_ERRORS + static int inject = 0; + static int repeat = 0; +#endif if (SRpnt == NULL) { if ((SRpnt = scsi_allocate_request(STp->device)) == NULL) { - printk(KERN_ERR "osst%d: Can't get SCSI request.\n", TAPE_NR(STp->devt)); + printk(KERN_ERR "osst%d:E: Can't get SCSI request.\n", TAPE_NR(STp->devt)); if (signal_pending(current)) (STp->buffer)->syscall_result = (-EINTR); else @@ -341,12 +344,18 @@ down(SRpnt->sr_request.sem); SRpnt->sr_request.sem = NULL; STp->buffer->syscall_result = osst_chk_result(STp, SRpnt); -//if ((STp->buffer)->syscall_result == 0 && -// cmd[0] == READ_6 && cmd[4] && ( /* (++ inject % 83) == 29 || */ -// (STp->first_frame_position == 240 /* or STp->read_error_frame to fail again on the block calculated above */ && ++repeat < 3))) { -// printk(OSST_DEB_MSG "osst%d: injecting read error\n", TAPE_NR(STp->devt)); -// STp->buffer->last_result_fatal = 1; /* FIXME - take out inject occasional read errors */ -//} +#ifdef OSST_INJECT_ERRORS + if (STp->buffer->syscall_result == 0 && + cmd[0] == READ_6 && + cmd[4] && + ( (++ inject % 83) == 29 || + (STp->first_frame_position == 240 + /* or STp->read_error_frame to fail again on the block calculated above */ && + ++repeat < 3))) { + printk(OSST_DEB_MSG "osst%d:D: Injecting read error\n", TAPE_NR(STp->devt)); + STp->buffer->last_result_fatal = 1; + } +#endif } return SRpnt; } @@ -356,7 +365,6 @@ static void osst_write_behind_check(OS_Scsi_Tape *STp) { OSST_buffer * STbuffer; - ST_partstat * STps; STbuffer = STp->buffer; @@ -366,7 +374,6 @@ else STp->nbr_finished++; #endif - down(&(STp->sem)); (STp->buffer)->last_SRpnt->sr_request.sem = NULL; @@ -381,21 +388,9 @@ scsi_release_request((STp->buffer)->last_SRpnt); if (STbuffer->writing < STbuffer->buffer_bytes) -#if 0 - memcpy(STbuffer->b_data, - STbuffer->b_data + STbuffer->writing, - STbuffer->buffer_bytes - STbuffer->writing); -#else - printk(KERN_WARNING "osst: write_behind_check: something left in buffer!\n"); -#endif + printk(KERN_WARNING "osst:A: write_behind_check: something left in buffer!\n"); + STbuffer->buffer_bytes -= STbuffer->writing; - STps = &(STp->ps[STp->partition]); - if (STps->drv_block >= 0) { - if (STp->block_size == 0) - STps->drv_block++; - else - STps->drv_block += STbuffer->writing / STp->block_size; - } STbuffer->writing = 0; return; @@ -407,7 +402,8 @@ /* * Initialize the OnStream AUX */ -static void osst_init_aux(OS_Scsi_Tape * STp, int frame_type, int logical_blk_num) +static void osst_init_aux(OS_Scsi_Tape * STp, int frame_type, int frame_seq_number, + int logical_blk_num, int blk_sz, int blk_cnt) { os_aux_t *aux = STp->buffer->aux; os_partition_t *par = &aux->partition; @@ -441,9 +437,10 @@ dat->reserved1 = 0; dat->entry_cnt = 1; dat->reserved3 = 0; - dat->dat_list[0].blk_sz = htonl(frame_type==OS_FRAME_TYPE_DATA?STp->block_size:0); - dat->dat_list[0].blk_cnt = htons(1); - dat->dat_list[0].flags = frame_type==OS_FRAME_TYPE_MARKER?OS_DAT_FLAGS_MARK:OS_DAT_FLAGS_DATA; + dat->dat_list[0].blk_sz = htonl(blk_sz); + dat->dat_list[0].blk_cnt = htons(blk_cnt); + dat->dat_list[0].flags = frame_type==OS_FRAME_TYPE_MARKER? + OS_DAT_FLAGS_MARK:OS_DAT_FLAGS_DATA; dat->dat_list[0].reserved = 0; case OS_FRAME_TYPE_EOD: aux->update_frame_cntr = htonl(0); @@ -452,27 +449,28 @@ par->wrt_pass_cntr = htons(STp->wrt_pass_cntr); par->first_frame_ppos = htonl(STp->first_data_ppos); par->last_frame_ppos = htonl(STp->capacity); - aux->frame_seq_num = htonl(logical_blk_num); + aux->frame_seq_num = htonl(frame_seq_number); aux->logical_blk_num_high = htonl(0); aux->logical_blk_num = htonl(logical_blk_num); break; default: ; /* probably FILL */ } - aux->filemark_cnt = ntohl(STp->filemark_cnt); /* FIXME -- violates ADR spec */ + aux->filemark_cnt = ntohl(STp->filemark_cnt); aux->phys_fm = ntohl(0xffffffff); aux->last_mark_ppos = ntohl(STp->last_mark_ppos); + aux->last_mark_lbn = ntohl(STp->last_mark_lbn); } /* * Verify that we have the correct tape frame */ -static int osst_verify_frame(OS_Scsi_Tape * STp, int logical_blk_num, int quiet) +static int osst_verify_frame(OS_Scsi_Tape * STp, int frame_seq_number, int quiet) { os_aux_t * aux = STp->buffer->aux; os_partition_t * par = &(aux->partition); ST_partstat * STps = &(STp->ps[STp->partition]); - int i; int dev = TAPE_NR(STp->devt); + int blk_cnt, blk_sz, i; if (STp->raw) { if (STp->buffer->syscall_result) { @@ -483,55 +481,70 @@ return 1; } if (STp->buffer->syscall_result) { - printk(KERN_INFO "osst%d: Skipping frame, read error\n", dev); +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Skipping frame, read error\n", dev); +#endif return 0; } if (ntohl(aux->format_id) != 0) { - printk(KERN_INFO "osst%d: Skipping frame, format_id %u\n", dev, ntohl(aux->format_id)); - return 0; +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Skipping frame, format_id %u\n", dev, ntohl(aux->format_id)); +#endif + goto err_out; } if (memcmp(aux->application_sig, STp->application_sig, 4) != 0 && (memcmp(aux->application_sig, "LIN3", 4) != 0 || STp->linux_media_version != 4)) { - printk(KERN_INFO "osst%d: Skipping frame, incorrect application signature\n", dev); - return 0; +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Skipping frame, incorrect application signature\n", dev); +#endif + goto err_out; } if (par->partition_num != OS_DATA_PARTITION) { if (!STp->linux_media || STp->linux_media_version != 2) { - printk(KERN_INFO "osst%d: Skipping frame, partition num %d\n", dev, par->partition_num); return 0; +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Skipping frame, partition num %d\n", + dev, par->partition_num); +#endif + goto err_out; } } if (par->par_desc_ver != OS_PARTITION_VERSION) { - printk(KERN_INFO "osst%d: Skipping frame, partition version %d\n", dev, par->par_desc_ver); - return 0; +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Skipping frame, partition version %d\n", dev, par->par_desc_ver); +#endif + goto err_out; } if (ntohs(par->wrt_pass_cntr) != STp->wrt_pass_cntr) { - printk(KERN_INFO "osst%d: Skipping frame, wrt_pass_cntr %d (expected %d)\n", - dev, ntohs(par->wrt_pass_cntr), STp->wrt_pass_cntr); - return 0; - } - if (aux->frame_seq_num != aux->logical_blk_num) { - printk(KERN_INFO "osst%d: Skipping frame, seq != logical\n", dev); - return 0; +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Skipping frame, wrt_pass_cntr %d (expected %d)\n", + dev, ntohs(par->wrt_pass_cntr), STp->wrt_pass_cntr); +#endif + goto err_out; } if (aux->frame_type != OS_FRAME_TYPE_DATA && aux->frame_type != OS_FRAME_TYPE_EOD && aux->frame_type != OS_FRAME_TYPE_MARKER) { if (!quiet) - printk(KERN_INFO "osst%d: Skipping frame, frame type %x\n", dev, aux->frame_type); - return 0; +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Skipping frame, frame type %x\n", dev, aux->frame_type); +#endif + goto err_out; } if (aux->frame_type == OS_FRAME_TYPE_EOD && STp->first_frame_position < STp->eod_frame_ppos) { - printk(KERN_INFO "osst%d: Skipping premature EOD frame %d\n", dev, STp->first_frame_position); - return 0; + printk(KERN_INFO "osst%d:I: Skipping premature EOD frame %d\n", dev, + STp->first_frame_position); + goto err_out; } - STp->logical_blk_in_buffer = 1; + STp->frame_in_buffer = 1; - if (logical_blk_num != -1 && ntohl(aux->logical_blk_num) != logical_blk_num) { + if (frame_seq_number != -1 && ntohl(aux->frame_seq_num) != frame_seq_number) { if (!quiet) - printk(KERN_INFO "osst%d: Skipping frame, logical_blk_num %u (expected %d)\n", - dev, ntohl(aux->logical_blk_num), logical_blk_num); - return 0; +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Skipping frame, sequence number %u (expected %d)\n", + dev, ntohl(aux->frame_seq_num), frame_seq_number); +#endif + goto err_out; } if (aux->frame_type == OS_FRAME_TYPE_MARKER) { STps->eof = ST_FM_HIT; @@ -539,8 +552,8 @@ i = ntohl(aux->filemark_cnt); if (STp->header_cache != NULL && i < OS_FM_TAB_MAX && (i > STp->filemark_cnt || STp->first_frame_position - 1 != ntohl(STp->header_cache->dat_fm_tab.fm_tab_ent[i]))) { -#if 1 //DEBUG - printk(OSST_DEB_MSG "osst%i: %s filemark %d at frame %d\n", dev, +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: %s filemark %d at frame pos %d\n", dev, STp->header_cache->dat_fm_tab.fm_tab_ent[i] == 0?"Learned":"Corrected", i, STp->first_frame_position - 1); #endif @@ -553,9 +566,31 @@ STps->eof = ST_EOD_1; } if (aux->frame_type == OS_FRAME_TYPE_DATA) { + blk_cnt = ntohs(aux->dat.dat_list[0].blk_cnt); + blk_sz = ntohl(aux->dat.dat_list[0].blk_sz); + STp->buffer->buffer_bytes = blk_cnt * blk_sz; + STp->buffer->read_pointer = 0; + + /* See what block size was used to write file */ + if (STp->block_size != blk_sz && blk_sz > 0) { + printk(KERN_INFO + "osst%d:I: File was written with block size %d%c, currently %d%c, adjusted to match.\n", + dev, blk_sz<1024?blk_sz:blk_sz/1024,blk_sz<1024?'b':'k', + STp->block_size<1024?STp->block_size:STp->block_size/1024, + STp->block_size<1024?'b':'k'); + STp->block_size = blk_sz; + STp->buffer->buffer_blocks = OS_DATA_SIZE / blk_sz; + } STps->eof = ST_NOEOF; } + STp->frame_seq_number = ntohl(aux->frame_seq_num); + STp->logical_blk_num = ntohl(aux->logical_blk_num); return 1; + +err_out: + if (STp->read_error_frame == 0) + STp->read_error_frame = STp->first_frame_position - 1; + return 0; } /* @@ -570,7 +605,7 @@ int dbg = debugging; int dev = TAPE_NR(STp->devt); - printk(OSST_DEB_MSG "osst%d: Reached onstream wait ready\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Reached onstream wait ready\n", dev); #endif memset(cmd, 0, MAX_COMMAND_SIZE); @@ -585,8 +620,8 @@ (SRpnt->sr_sense_buffer[13] == 1 || SRpnt->sr_sense_buffer[13] == 8) ) { #if DEBUG if (debugging) { - printk(OSST_DEB_MSG "osst%d: Sleeping in onstream wait ready\n", dev); - printk(OSST_DEB_MSG "osst%d: Turning off debugging for a while\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Sleeping in onstream wait ready\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Turning off debugging for a while\n", dev); debugging = 0; } #endif @@ -605,15 +640,15 @@ if ( STp->buffer->syscall_result && osst_write_error_recovery(STp, aSRpnt, 0) ) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Abnormal exit from onstream wait ready\n", dev); -printk(OSST_DEB_MSG "osst%d: Result = %d, Sense: 0=%02x, 2=%02x, 12=%02x, 13=%02x\n", dev, -STp->buffer->syscall_result, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], -SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); + printk(OSST_DEB_MSG "osst%d:D: Abnormal exit from onstream wait ready\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Result = %d, Sense: 0=%02x, 2=%02x, 12=%02x, 13=%02x\n", dev, + STp->buffer->syscall_result, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], + SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif return (-EIO); } #if DEBUG - printk(OSST_DEB_MSG "osst%d: Normal exit from onstream wait ready\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Normal exit from onstream wait ready\n", dev); #endif return 0; } @@ -641,7 +676,7 @@ #if DEBUG int dev = TAPE_NR(STp->devt); - printk(OSST_DEB_MSG "osst%d: Reached onstream flush drive buffer (write filemark)\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Reached onstream flush drive buffer (write filemark)\n", dev); #endif memset(cmd, 0, MAX_COMMAND_SIZE); @@ -668,10 +703,8 @@ #if DEBUG char notyetprinted = 1; #endif - if ((minlast >= 0 && STp->ps[STp->partition].rw != ST_READING) || - (minlast < 0 && STp->ps[STp->partition].rw != ST_WRITING) ) - printk(KERN_ERR "osst%i: waiting for frame without having initialized %s!\n", - dev, minlast<0?"write":"read"); + if (minlast >= 0 && STp->ps[STp->partition].rw != ST_READING) + printk(KERN_ERR "osst%i:A: Waiting for frame without having initialized read!\n", dev); while (time_before (jiffies, startwait + to*HZ)) { @@ -690,7 +723,7 @@ #if DEBUG if (debugging || jiffies - startwait >= 2*HZ/OSST_POLL_PER_SEC) printk (OSST_DEB_MSG - "osst%i: Succ wait f fr %i (>%i): %i-%i %i (%i): %3li.%li s\n", + "osst%d:D: Succ wait f fr %i (>%i): %i-%i %i (%i): %3li.%li s\n", dev, curr, curr+minlast, STp->first_frame_position, STp->last_frame_position, STp->cur_frames, result, (jiffies-startwait)/HZ, @@ -701,7 +734,7 @@ #if DEBUG if (jiffies - startwait >= 2*HZ/OSST_POLL_PER_SEC && notyetprinted) { - printk (OSST_DEB_MSG "osst%i: Wait for frame %i (>%i): %i-%i %i (%i)\n", + printk (OSST_DEB_MSG "osst%d:D: Wait for frame %i (>%i): %i-%i %i (%i)\n", dev, curr, curr+minlast, STp->first_frame_position, STp->last_frame_position, STp->cur_frames, result); notyetprinted--; @@ -711,7 +744,7 @@ schedule_timeout (HZ / OSST_POLL_PER_SEC); } #if DEBUG - printk (OSST_DEB_MSG "osst%i: Fail wait f fr %i (>%i): %i-%i %i: %3li.%li s\n", + printk (OSST_DEB_MSG "osst%d:D: Fail wait f fr %i (>%i): %i-%i %i: %3li.%li s\n", dev, curr, curr+minlast, STp->first_frame_position, STp->last_frame_position, STp->cur_frames, (jiffies-startwait)/HZ, (((jiffies-startwait)%HZ)*10)/HZ); @@ -720,9 +753,9 @@ } /* - * Read the next OnStream tape block at the current location + * Read the next OnStream tape frame at the current location */ -static int osst_read_block(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int timeout) +static int osst_read_frame(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int timeout) { unsigned char cmd[MAX_COMMAND_SIZE]; Scsi_Request * SRpnt; @@ -746,7 +779,7 @@ #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%i: Reading block from OnStream tape\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Reading frame from OnStream tape\n", dev); #endif SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, OS_FRAME_SIZE, SCSI_DATA_READ, STp->timeout, MAX_RETRIES, TRUE); @@ -758,11 +791,13 @@ retval = 1; if (STp->read_error_frame == 0) { STp->read_error_frame = STp->first_frame_position; - printk(OSST_DEB_MSG "osst: recording read error at %d\n", STp->read_error_frame);/*FIXME*/ +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Recording read error at %d\n", dev, STp->read_error_frame); +#endif } #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n", + printk(OSST_DEB_MSG "osst%d:D: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n", dev, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[1], SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[3], @@ -774,16 +809,19 @@ STp->first_frame_position++; #if DEBUG if (debugging) { - printk(OSST_DEB_MSG "osst%i: AUX: %c%c%c%c UpdFrCt#%d %s FrSeq#%d LogBlk#%d\n", dev, + printk(OSST_DEB_MSG + "osst%d:D: AUX: %c%c%c%c UpdFrCt#%d Wpass#%d %s FrSeq#%d LogBlk#%d Qty=%d Sz=%d\n", dev, aux->application_sig[0], aux->application_sig[1], - aux->application_sig[2], aux->application_sig[3], ntohl(aux->update_frame_cntr), + aux->application_sig[2], aux->application_sig[3], + ntohl(aux->update_frame_cntr), ntohs(aux->partition.wrt_pass_cntr), aux->frame_type==1?"EOD":aux->frame_type==2?"MARK": aux->frame_type==8?"HEADR":aux->frame_type==0x80?"DATA":"FILL", - ntohl(aux->frame_seq_num), ntohl(aux->logical_blk_num) ); + ntohl(aux->frame_seq_num), ntohl(aux->logical_blk_num), + ntohs(aux->dat.dat_list[0].blk_cnt), ntohl(aux->dat.dat_list[0].blk_sz) ); if (aux->frame_type==2) - printk(OSST_DEB_MSG "osst%i: mark_cnt=%d, last_mark=%d, next_mark=%d\n", dev, - ntohl(aux->filemark_cnt), ntohl(aux->last_mark_ppos), ntohl(aux->next_mark_ppos)); - printk(OSST_DEB_MSG "osst%i: Exit read block from OnStream tape with code %d\n", dev, retval); + printk(OSST_DEB_MSG "osst%d:D: mark_cnt=%d, last_mark_ppos=%d, last_mark_lbn=%d\n", dev, + ntohl(aux->filemark_cnt), ntohl(aux->last_mark_ppos), ntohl(aux->last_mark_lbn)); + printk(OSST_DEB_MSG "osst%d:D: Exit read frame from OnStream tape with code %d\n", dev, retval); } #endif return (retval); @@ -801,22 +839,22 @@ if (STps->rw != ST_READING) { /* Initialize read operation */ if (STps->rw == ST_WRITING) { - osst_flush_write_buffer(STp, aSRpnt, 1); + osst_flush_write_buffer(STp, aSRpnt); osst_flush_drive_buffer(STp, aSRpnt); } STps->rw = ST_READING; - STp->logical_blk_in_buffer = 0; + STp->frame_in_buffer = 0; /* * Issue a read 0 command to get the OnStream drive - * read blocks into its buffer. + * read frames into its buffer. */ memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = READ_6; cmd[1] = 1; #if DEBUG - printk(OSST_DEB_MSG "osst%i: Start Read Ahead on OnStream tape\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Start Read Ahead on OnStream tape\n", dev); #endif SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, SCSI_DATA_NONE, STp->timeout, MAX_RETRIES, TRUE); *aSRpnt = SRpnt; @@ -826,7 +864,7 @@ return retval; } -static int osst_get_logical_blk(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int logical_blk_num, int quiet) +static int osst_get_logical_frame(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int frame_seq_number, int quiet) { ST_partstat * STps = &(STp->ps[STp->partition]); int dev = TAPE_NR(STp->devt); @@ -837,16 +875,16 @@ position; /* - * Search and wait for the next logical tape block + * Search and wait for the next logical tape frame */ while (1) { if (cnt++ > 400) { - printk(KERN_WARNING "osst%d: Couldn't find logical block %d, aborting\n", - dev, logical_blk_num); + printk(KERN_ERR "osst%d:E: Couldn't find logical frame %d, aborting\n", + dev, frame_seq_number); if (STp->read_error_frame) { osst_set_frame_position(STp, aSRpnt, STp->read_error_frame, 0); -#if 1 //DEBUG - printk(OSST_DEB_MSG "osst%d: Repositioning tape to bad block %d\n", +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Repositioning tape to bad frame %d\n", dev, STp->read_error_frame); #endif STp->read_error_frame = 0; @@ -855,16 +893,15 @@ } #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Looking for block %d, attempt %d\n", - dev, logical_blk_num, cnt); + printk(OSST_DEB_MSG "osst%d:D: Looking for frame %d, attempt %d\n", + dev, frame_seq_number, cnt); #endif if ( osst_initiate_read(STp, aSRpnt) - || ( (!STp->logical_blk_in_buffer) && osst_read_block(STp, aSRpnt, 30) ) ) { + || ( (!STp->frame_in_buffer) && osst_read_frame(STp, aSRpnt, 30) ) ) { position = osst_get_frame_position(STp, aSRpnt); if (position >= 0xbae && position < 0xbb8) position = 0xbb8; else if (position > STp->eod_frame_ppos || ++bad == 10) { -printk(OSST_DEB_MSG "osst%d: start again from pos %d, eod %d, bad %d\n", dev, position, STp->eod_frame_ppos, bad); /*FIXME*/ position = STp->read_error_frame - 1; } else { @@ -872,38 +909,40 @@ cnt += 20; } #if DEBUG - printk(OSST_DEB_MSG "osst%d: Bad block detected, positioning tape to block %d\n", + printk(OSST_DEB_MSG "osst%d:D: Bad frame detected, positioning tape to block %d\n", dev, position); #endif osst_set_frame_position(STp, aSRpnt, position, 0); continue; } - if (osst_verify_frame(STp, logical_blk_num, quiet)) + if (osst_verify_frame(STp, frame_seq_number, quiet)) break; if (osst_verify_frame(STp, -1, quiet)) { - x = ntohl(STp->buffer->aux->logical_blk_num); + x = ntohl(STp->buffer->aux->frame_seq_num); if (STp->fast_open) { -#if 1 //DEBUG - printk(OSST_DEB_MSG - "osst%d: Found logical block %d instead of %d after fast open\n", - dev, x, logical_blk_num); -#endif + printk(KERN_WARNING + "osst%d:W: Found logical frame %d instead of %d after fast open\n", + dev, x, frame_seq_number); STp->header_ok = 0; STp->read_error_frame = 0; return (-EIO); } - if (x > logical_blk_num) { + if (x > frame_seq_number) { if (++past > 3) { - /* positioning backwards did not bring us to the desired block */ + /* positioning backwards did not bring us to the desired frame */ position = STp->read_error_frame - 1; } - else + else { position = osst_get_frame_position(STp, aSRpnt) - + logical_blk_num - x - 1; -#if 1 //DEBUG + + frame_seq_number - x - 1; + + if (STp->first_frame_position >= 3000 && position < 3000) + position -= 10; + } +#if DEBUG printk(OSST_DEB_MSG - "osst%d: Found logical block %d while looking for %d: back up %d\n", - dev, x, logical_blk_num, + "osst%d:D: Found logical frame %d while looking for %d: back up %d\n", + dev, x, frame_seq_number, STp->first_frame_position - position); #endif osst_set_frame_position(STp, aSRpnt, position, 0); @@ -914,22 +953,26 @@ } if (osst_get_frame_position(STp, aSRpnt) == 0xbaf) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Skipping config partition\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Skipping config partition\n", dev); #endif osst_set_frame_position(STp, aSRpnt, 0xbb8, 0); cnt--; } - STp->logical_blk_in_buffer = 0; + STp->frame_in_buffer = 0; } if (cnt > 1) { STp->recover_count++; STp->recover_erreg++; + printk(KERN_WARNING "osst%d:I: Read error at position %d recovered\n", + dev, STp->read_error_frame); } - STp->logical_blk_num = ntohl(STp->buffer->aux->logical_blk_num); + STp->read_count++; #if DEBUG if (debugging || STps->eof) - printk(OSST_DEB_MSG "osst%i: Exit get logical block (%d=>%d) from OnStream tape with code %d\n", dev, logical_blk_num, STp->logical_blk_num, STps->eof); + printk(OSST_DEB_MSG + "osst%d:D: Exit get logical frame (%d=>%d) from OnStream tape with code %d\n", + dev, frame_seq_number, STp->frame_seq_number, STps->eof); #endif STp->fast_open = FALSE; STp->read_error_frame = 0; @@ -938,60 +981,195 @@ static int osst_seek_logical_blk(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int logical_blk_num) { - int estimate; - int retries = 0; - int dev = TAPE_NR(STp->devt); - + ST_partstat * STps = &(STp->ps[STp->partition]); + int dev = TAPE_NR(STp->devt); + int retries = 0; + int frame_seq_estimate, ppos_estimate, move; + if (logical_blk_num < 0) logical_blk_num = 0; - /* FIXME -- this may not be valid for foreign formats */ - if (logical_blk_num < 2980) estimate = logical_blk_num + 10; - else estimate = logical_blk_num + 20; - #if DEBUG - printk(OSST_DEB_MSG "osst%d: Seeking logical block %d (now at %d)\n", - dev, logical_blk_num, STp->logical_blk_num); + printk(OSST_DEB_MSG "osst%d:D: Seeking logical block %d (now at %d, size %d%c)\n", + dev, logical_blk_num, STp->logical_blk_num, + STp->block_size<1024?STp->block_size:STp->block_size/1024, + STp->block_size<1024?'b':'k'); #endif + /* Do we know where we are? */ + if (STps->drv_block >= 0) { + move = logical_blk_num - STp->logical_blk_num; + if (move < 0) move -= (OS_DATA_SIZE / STp->block_size) - 1; + move /= (OS_DATA_SIZE / STp->block_size); + frame_seq_estimate = STp->frame_seq_number + move; + } else + frame_seq_estimate = logical_blk_num * STp->block_size / OS_DATA_SIZE; + + if (frame_seq_estimate < 2980) ppos_estimate = frame_seq_estimate + 10; + else ppos_estimate = frame_seq_estimate + 20; while (++retries < 10) { - osst_set_frame_position(STp, aSRpnt, estimate, 0); - if (osst_get_logical_blk(STp, aSRpnt, logical_blk_num, 1) >= 0) - return 0; - if (osst_get_logical_blk(STp, aSRpnt, -1, 1) < 0) + if (ppos_estimate > STp->eod_frame_ppos-2) { + frame_seq_estimate += STp->eod_frame_ppos - 2 - ppos_estimate; + ppos_estimate = STp->eod_frame_ppos - 2; + } + if (frame_seq_estimate < 0) { + frame_seq_estimate = 0; + ppos_estimate = 10; + } + osst_set_frame_position(STp, aSRpnt, ppos_estimate, 0); + if (osst_get_logical_frame(STp, aSRpnt, frame_seq_estimate, 1) >= 0) { + /* we've located the estimated frame, now does it have our block? */ + if (logical_blk_num < STp->logical_blk_num || + logical_blk_num >= STp->logical_blk_num + ntohs(STp->buffer->aux->dat.dat_list[0].blk_cnt)) { + if (STps->eof == ST_FM_HIT) + move = logical_blk_num < STp->logical_blk_num? -2 : 1; + else { + move = logical_blk_num - STp->logical_blk_num; + if (move < 0) move -= (OS_DATA_SIZE / STp->block_size) - 1; + move /= (OS_DATA_SIZE / STp->block_size); + } +#if DEBUG + printk(OSST_DEB_MSG + "osst%d:D: Seek retry %d at ppos %d fsq %d (est %d) lbn %d (need %d) move %d\n", + dev, retries, ppos_estimate, STp->frame_seq_number, frame_seq_estimate, + STp->logical_blk_num, logical_blk_num, move); +#endif + frame_seq_estimate += move; + ppos_estimate += move; + continue; + } else { + STp->buffer->read_pointer = (logical_blk_num - STp->logical_blk_num) * STp->block_size; + STp->buffer->buffer_bytes -= STp->buffer->read_pointer; + STp->logical_blk_num = logical_blk_num; +#if DEBUG + printk(OSST_DEB_MSG + "osst%d:D: Seek success at ppos %d fsq %d in_buf %d, bytes %d, ptr %d*%d\n", + dev, ppos_estimate, STp->frame_seq_number, STp->frame_in_buffer, + STp->buffer->buffer_bytes, STp->buffer->read_pointer / STp->block_size, + STp->block_size); +#endif + STps->drv_file = ntohl(STp->buffer->aux->filemark_cnt); + if (STps->eof == ST_FM_HIT) { + STps->drv_file++; + STps->drv_block = 0; + } else { + STps->drv_block = ntohl(STp->buffer->aux->last_mark_lbn)? + STp->logical_blk_num - + (STps->drv_file ? ntohl(STp->buffer->aux->last_mark_lbn) + 1 : 0): + -1; + } + STps->eof = (STp->first_frame_position >= STp->eod_frame_ppos)?ST_EOD:ST_NOEOF; + return 0; + } + } + if (osst_get_logical_frame(STp, aSRpnt, -1, 1) < 0) goto error; - if (STp->logical_blk_num != logical_blk_num) - estimate += logical_blk_num - STp->logical_blk_num; + /* we are not yet at the estimated frame, adjust our estimate of its physical position */ +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Seek retry %d at ppos %d fsq %d (est %d) lbn %d (need %d)\n", + dev, retries, ppos_estimate, STp->frame_seq_number, frame_seq_estimate, + STp->logical_blk_num, logical_blk_num); +#endif + if (frame_seq_estimate != STp->frame_seq_number) + ppos_estimate += frame_seq_estimate - STp->frame_seq_number; else break; } error: - printk(KERN_WARNING "osst%d: Couldn't seek to logical block %d (at %d), %d retries\n", + printk(KERN_ERR "osst%d:E: Couldn't seek to logical block %d (at %d), %d retries\n", dev, logical_blk_num, STp->logical_blk_num, retries); return (-EIO); } -static int osst_seek_frame(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int frame) +/* The values below are based on the OnStream frame payload size of 32K == 2**15, + * that is, OSST_FRAME_SHIFT + OSST_SECTOR_SHIFT must be 15. With a minimum block + * size of 512 bytes, we need to be able to resolve 32K/512 == 64 == 2**6 positions + * inside each frame. Finaly, OSST_SECTOR_MASK == 2**OSST_FRAME_SHIFT - 1. + */ +#define OSST_FRAME_SHIFT 6 +#define OSST_SECTOR_SHIFT 9 +#define OSST_SECTOR_MASK 0x03F + +static int osst_get_sector(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt) +{ + int sector; +#if DEBUG + int dev = TAPE_NR(STp->devt); + + printk(OSST_DEB_MSG + "osst%d:D: Positioned at ppos %d, frame %d, lbn %d, file %d, blk %d, %cptr %d, eof %d\n", + dev, STp->first_frame_position, STp->frame_seq_number, STp->logical_blk_num, + STp->ps[STp->partition].drv_file, STp->ps[STp->partition].drv_block, + STp->ps[STp->partition].rw == ST_WRITING?'w':'r', + STp->ps[STp->partition].rw == ST_WRITING?STp->buffer->buffer_bytes: + STp->buffer->read_pointer, STp->ps[STp->partition].eof); +#endif + /* do we know where we are inside a file? */ + if (STp->ps[STp->partition].drv_block >= 0) { + sector = (STp->frame_in_buffer ? STp->first_frame_position-1 : + STp->first_frame_position) << OSST_FRAME_SHIFT; + if (STp->ps[STp->partition].rw == ST_WRITING) + sector |= (STp->buffer->buffer_bytes >> OSST_SECTOR_SHIFT) & OSST_SECTOR_MASK; + else + sector |= (STp->buffer->read_pointer >> OSST_SECTOR_SHIFT) & OSST_SECTOR_MASK; + } else { + sector = osst_get_frame_position(STp, aSRpnt); + if (sector > 0) + sector <<= OSST_FRAME_SHIFT; + } + return sector; +} + +static int osst_seek_sector(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int sector) { - ST_partstat * STps = &(STp->ps[STp->partition]); - int r; + ST_partstat * STps = &(STp->ps[STp->partition]); + int frame = sector >> OSST_FRAME_SHIFT, + offset = (sector & OSST_SECTOR_MASK) << OSST_SECTOR_SHIFT, + r; +#if DEBUG + int dev = TAPE_NR(STp->devt); + printk(OSST_DEB_MSG "osst%d:D: Seeking sector %d in frame %d at offset %d\n", + dev, sector, frame, offset); +#endif if (frame < 0 || frame >= STp->capacity) return (-ENXIO); if (frame <= STp->first_data_ppos) { - STp->logical_blk_num = STps->drv_file = STps->drv_block = 0; + STp->frame_seq_number = STp->logical_blk_num = STps->drv_file = STps->drv_block = 0; return (osst_set_frame_position(STp, aSRpnt, frame, 0)); } - r = osst_set_frame_position(STp, aSRpnt, frame-1, 0); + r = osst_set_frame_position(STp, aSRpnt, offset?frame:frame-1, 0); if (r < 0) return r; - r = osst_get_logical_blk(STp, aSRpnt, -1, 1); + r = osst_get_logical_frame(STp, aSRpnt, -1, 1); if (r < 0) return r; - if (osst_get_frame_position(STp, aSRpnt) != frame) return (-EIO); + if (osst_get_frame_position(STp, aSRpnt) != (offset?frame+1:frame)) return (-EIO); - STp->logical_blk_num++; - STp->logical_blk_in_buffer = 0; - STps->drv_file = htonl(STp->buffer->aux->filemark_cnt); - STps->drv_block = -1; - STps->eof = ST_NOEOF; + if (offset) { + STp->logical_blk_num += offset / STp->block_size; + STp->buffer->read_pointer = offset; + STp->buffer->buffer_bytes -= offset; + } else { + STp->frame_seq_number++; + STp->frame_in_buffer = 0; + STp->logical_blk_num += ntohs(STp->buffer->aux->dat.dat_list[0].blk_cnt); + STp->buffer->buffer_bytes = STp->buffer->read_pointer = 0; + } + STps->drv_file = ntohl(STp->buffer->aux->filemark_cnt); + if (STps->eof == ST_FM_HIT) { + STps->drv_file++; + STps->drv_block = 0; + } else { + STps->drv_block = ntohl(STp->buffer->aux->last_mark_lbn)? + STp->logical_blk_num - + (STps->drv_file ? ntohl(STp->buffer->aux->last_mark_lbn) + 1 : 0): + -1; + } + STps->eof = (STp->first_frame_position >= STp->eod_frame_ppos)?ST_EOD:ST_NOEOF; +#if DEBUG + printk(OSST_DEB_MSG + "osst%d:D: Now positioned at ppos %d, frame %d, lbn %d, file %d, blk %d, rptr %d, eof %d\n", + dev, STp->first_frame_position, STp->frame_seq_number, STp->logical_blk_num, + STps->drv_file, STps->drv_block, STp->buffer->read_pointer, STps->eof); +#endif return 0; } @@ -999,38 +1177,43 @@ * Read back the drive's internal buffer contents, as a part * of the write error recovery mechanism for old OnStream * firmware revisions. + * Precondition for this function to work: all frames in the + * drive's buffer must be of one type (DATA, MARK or EOD)! */ static int osst_read_back_buffer_and_rewrite(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, - unsigned int block, unsigned int skip, int pending) + unsigned int frame, unsigned int skip, int pending) { Scsi_Request * SRpnt = * aSRpnt; unsigned char * buffer, * p; unsigned char cmd[MAX_COMMAND_SIZE]; - int frames, flag, new_block, i, logical_blk_num; - int dev = TAPE_NR(STp->devt); - long startwait = jiffies; + int flag, new_frame, i; + int nframes = STp->cur_frames; + int blks_per_frame = ntohs(STp->buffer->aux->dat.dat_list[0].blk_cnt); + int frame_seq_number = ntohl(STp->buffer->aux->frame_seq_num) + - (nframes + pending - 1); + int logical_blk_num = ntohl(STp->buffer->aux->logical_blk_num) + - (nframes + pending - 1) * blks_per_frame; + int dev = TAPE_NR(STp->devt); + long startwait = jiffies; #if DEBUG - int dbg = debugging; + int dbg = debugging; #endif - frames = STp->cur_frames; - if ((buffer = (unsigned char *)vmalloc((frames + pending) * OS_DATA_SIZE)) == NULL) + if ((buffer = (unsigned char *)vmalloc((nframes + 1) * OS_DATA_SIZE)) == NULL) return (-EIO); - logical_blk_num = STp->logical_blk_num - frames - pending; - printk(KERN_INFO "osst%d: Reading back %d frames from drive buffer%s\n", - dev, frames, pending?" and one that was pending":""); - - if (pending) { - osst_copy_from_buffer(STp->buffer, (p = &buffer[frames * OS_DATA_SIZE])); -// memcpy((p = &buffer[frames * OS_DATA_SIZE]), STp->buffer->b_data, OS_DATA_SIZE); + printk(KERN_INFO "osst%d:I: Reading back %d frames from drive buffer%s\n", + dev, nframes, pending?" and one that was pending":""); + + osst_copy_from_buffer(STp->buffer, (p = &buffer[nframes * OS_DATA_SIZE])); #if DEBUG - if (debugging) - printk(OSST_DEB_MSG "osst%d: Pending logical block %d, data %x %x %x %x\n", - dev, logical_blk_num + frames, p[0], p[1], p[2], p[3]); + if (pending && debugging) + printk(OSST_DEB_MSG "osst%d:D: Pending frame %d (lblk %d), data %02x %02x %02x %02x\n", + dev, frame_seq_number + nframes, + logical_blk_num + nframes * blks_per_frame, + p[0], p[1], p[2], p[3]); #endif - } - for (i = 0, p = buffer; i < frames; i++, p += OS_DATA_SIZE) { + for (i = 0, p = buffer; i < nframes; i++, p += OS_DATA_SIZE) { memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = 0x3C; /* Buffer Read */ @@ -1041,63 +1224,63 @@ SRpnt = osst_do_scsi(SRpnt, STp, cmd, OS_FRAME_SIZE, SCSI_DATA_READ, STp->timeout, MAX_RETRIES, TRUE); - if ((STp->buffer)->syscall_result) { - printk(KERN_ERR "osst%d: Failed to read block back from OnStream buffer\n", dev); + if ((STp->buffer)->syscall_result || !SRpnt) { + printk(KERN_ERR "osst%d:E: Failed to read frame back from OnStream buffer\n", dev); vfree((void *)buffer); *aSRpnt = SRpnt; return (-EIO); } osst_copy_from_buffer(STp->buffer, p); -// memcpy(p, STp->buffer->b_data, OS_DATA_SIZE); #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Read back logical block %d, data %x %x %x %x\n", - dev, logical_blk_num + i, p[0], p[1], p[2], p[3]); + printk(OSST_DEB_MSG "osst%d:D: Read back logical frame %d, data %02x %02x %02x %02x\n", + dev, frame_seq_number + i, p[0], p[1], p[2], p[3]); #endif } *aSRpnt = SRpnt; osst_get_frame_position(STp, aSRpnt); #if DEBUG - printk(OSST_DEB_MSG "osst%d: Frames left in buffer: %d\n", dev, STp->cur_frames); + printk(OSST_DEB_MSG "osst%d:D: Frames left in buffer: %d\n", dev, STp->cur_frames); #endif /* Write synchronously so we can be sure we're OK again and don't have to recover recursively */ - /* In the header we don't actually re-write the blocks that fail, just the ones after them */ + /* In the header we don't actually re-write the frames that fail, just the ones after them */ - for (flag=1, new_block=block, p=buffer, i=0; i < frames + pending; ) { + for (flag=1, new_frame=frame, p=buffer, i=0; i < nframes + pending; ) { if (flag) { if (STp->write_type == OS_WRITE_HEADER) { i += skip; p += skip * OS_DATA_SIZE; } - else if (new_block < 2990 && new_block+skip+frames+pending >= 2990) - new_block = 3000-i; + else if (new_frame < 2990 && new_frame+skip+nframes+pending >= 2990) + new_frame = 3000-i; else - new_block += skip; + new_frame += skip; #if DEBUG - printk(OSST_DEB_MSG "osst%d: Position to frame %d, write lblk %d\n", - dev, new_block+i, logical_blk_num+i); /* FIXME var blk sz */ + printk(OSST_DEB_MSG "osst%d:D: Position to frame %d, write fseq %d\n", + dev, new_frame+i, frame_seq_number+i); #endif - osst_set_frame_position(STp, aSRpnt, new_block + i, 0); + osst_set_frame_position(STp, aSRpnt, new_frame + i, 0); osst_wait_ready(STp, aSRpnt, 60); osst_get_frame_position(STp, aSRpnt); SRpnt = * aSRpnt; - if (new_block > block + 1000) { - printk(KERN_ERR "osst%d: Failed to find valid tape media\n", dev); + if (new_frame > frame + 1000) { + printk(KERN_ERR "osst%d:E: Failed to find writable tape media\n", dev); vfree((void *)buffer); return (-EIO); } flag = 0; - if ( i >= frames + pending ) break; + if ( i >= nframes + pending ) break; } osst_copy_to_buffer(STp->buffer, p); -// memcpy(STp->buffer->b_data, p, OS_DATA_SIZE); /* * IMPORTANT: for error recovery to work, _never_ queue frames with mixed frame type! */ - osst_init_aux(STp, STp->buffer->aux->frame_type, logical_blk_num+i ); + osst_init_aux(STp, STp->buffer->aux->frame_type, frame_seq_number+i, + logical_blk_num + i*blks_per_frame, + ntohl(STp->buffer->aux->dat.dat_list[0].blk_sz), blks_per_frame); memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = WRITE_6; cmd[1] = 1; @@ -1105,7 +1288,10 @@ #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: About to attempt to write to frame %d\n", dev, new_block+i); + printk(OSST_DEB_MSG + "osst%d:D: About to write frame %d, seq %d, lbn %d, data %02x %02x %02x %02x\n", + dev, new_frame+i, frame_seq_number+i, logical_blk_num + i*blks_per_frame, + p[0], p[1], p[2], p[3]); #endif SRpnt = osst_do_scsi(SRpnt, STp, cmd, OS_FRAME_SIZE, SCSI_DATA_WRITE, STp->timeout, MAX_WRITE_RETRIES, TRUE); @@ -1116,9 +1302,9 @@ p += OS_DATA_SIZE; i++; /* if we just sent the last frame, wait till all successfully written */ - if ( i == frames + pending ) { + if ( i == nframes + pending ) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Check re-write successful\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Check re-write successful\n", dev); #endif memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = WRITE_FILEMARKS; @@ -1127,8 +1313,8 @@ STp->timeout, MAX_WRITE_RETRIES, TRUE); #if DEBUG if (debugging) { - printk(OSST_DEB_MSG "osst%d: Sleeping in re-write wait ready\n", dev); - printk(OSST_DEB_MSG "osst%d: Turning off debugging for a while\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Sleeping in re-write wait ready\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Turning off debugging for a while\n", dev); debugging = 0; } #endif @@ -1153,44 +1339,47 @@ } #if DEBUG debugging = dbg; - printk(OSST_DEB_MSG "osst%d: Wait re-write finished\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Wait re-write finished\n", dev); #endif } } + *aSRpnt = SRpnt; if (flag) { if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) == 13 && SRpnt->sr_sense_buffer[12] == 0 && SRpnt->sr_sense_buffer[13] == 2) { - printk(KERN_ERR "osst%d: Volume overflow in write error recovery\n", dev); + printk(KERN_ERR "osst%d:E: Volume overflow in write error recovery\n", dev); vfree((void *)buffer); return (-EIO); /* hit end of tape = fail */ } i = ((SRpnt->sr_sense_buffer[3] << 24) | (SRpnt->sr_sense_buffer[4] << 16) | (SRpnt->sr_sense_buffer[5] << 8) | - SRpnt->sr_sense_buffer[6] ) - new_block; + SRpnt->sr_sense_buffer[6] ) - new_frame; p = &buffer[i * OS_DATA_SIZE]; #if DEBUG - printk(OSST_DEB_MSG "osst%d: Additional write error at %d\n", dev, new_block+i); + printk(OSST_DEB_MSG "osst%d:D: Additional write error at %d\n", dev, new_frame+i); #endif osst_get_frame_position(STp, aSRpnt); #if DEBUG - printk(OSST_DEB_MSG "osst%d: reported frame positions: host = %d, tape = %d\n", + printk(OSST_DEB_MSG "osst%d:D: reported frame positions: host = %d, tape = %d\n", dev, STp->first_frame_position, STp->last_frame_position); #endif } - *aSRpnt = SRpnt; } + if (!pending) + osst_copy_to_buffer(STp->buffer, p); /* so buffer content == at entry in all cases */ vfree((void *)buffer); return 0; } static int osst_reposition_and_retry(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, - unsigned int block, unsigned int skip, int pending) + unsigned int frame, unsigned int skip, int pending) { unsigned char cmd[MAX_COMMAND_SIZE]; - Scsi_Request * SRpnt = * aSRpnt; + Scsi_Request * SRpnt; int dev = TAPE_NR(STp->devt); + int expected __attribute__ ((__unused__)); int attempts = 1000 / skip; int flag = 1; long startwait = jiffies; @@ -1203,23 +1392,24 @@ #if DEBUG debugging = dbg; #endif - if (block < 2990 && block+skip+STp->cur_frames+pending >= 2990) - block = 3000-skip; + if (frame < 2990 && frame+skip+STp->cur_frames+pending >= 2990) + frame = 3000-skip; + expected = frame+skip+STp->cur_frames+pending; #if DEBUG - printk(OSST_DEB_MSG "osst%d: Position to frame %d, re-write from lblk %d\n", - dev, block+skip, STp->logical_blk_num-STp->cur_frames-pending); + printk(OSST_DEB_MSG "osst%d:D: Position to fppos %d, re-write from fseq %d\n", + dev, frame+skip, STp->frame_seq_number-STp->cur_frames-pending); #endif - osst_set_frame_position(STp, aSRpnt, block + skip, 1); + osst_set_frame_position(STp, aSRpnt, frame + skip, 1); flag = 0; attempts--; } if (osst_get_frame_position(STp, aSRpnt) < 0) { /* additional write error */ #if DEBUG - printk(OSST_DEB_MSG "osst%d: Addl error, host %d, tape %d, buffer %d\n", + printk(OSST_DEB_MSG "osst%d:D: Addl error, host %d, tape %d, buffer %d\n", dev, STp->first_frame_position, STp->last_frame_position, STp->cur_frames); #endif - block = STp->last_frame_position; + frame = STp->last_frame_position; flag = 1; continue; } @@ -1230,19 +1420,19 @@ cmd[1] = 1; cmd[4] = 1; #if DEBUG - printk(OSST_DEB_MSG "osst%d: About to write pending lblk %d at frame %d\n", - dev, STp->logical_blk_num-1, STp->first_frame_position); + printk(OSST_DEB_MSG "osst%d:D: About to write pending fseq %d at fppos %d\n", + dev, STp->frame_seq_number-1, STp->first_frame_position); #endif - SRpnt = osst_do_scsi(SRpnt, STp, cmd, OS_FRAME_SIZE, SCSI_DATA_WRITE, - STp->timeout, MAX_WRITE_RETRIES, TRUE); + SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, OS_FRAME_SIZE, SCSI_DATA_WRITE, + STp->timeout, MAX_WRITE_RETRIES, TRUE); *aSRpnt = SRpnt; if (STp->buffer->syscall_result) { /* additional write error */ if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) == 13 && SRpnt->sr_sense_buffer[12] == 0 && SRpnt->sr_sense_buffer[13] == 2) { - printk(OSST_DEB_MSG - "osst%d: Volume overflow in write error recovery\n", + printk(KERN_ERR + "osst%d:E: Volume overflow in write error recovery\n", dev); break; /* hit end of tape = fail */ } @@ -1256,20 +1446,25 @@ if (STp->cur_frames == 0) { #if DEBUG debugging = dbg; - printk(OSST_DEB_MSG "osst%d: Wait re-write finished\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Wait re-write finished\n", dev); #endif + if (STp->first_frame_position != expected) { + printk(KERN_ERR "osst%d:A: Actual position %d - expected %d\n", + dev, STp->first_frame_position, expected); + return (-EIO); + } return 0; } #if DEBUG if (debugging) { - printk(OSST_DEB_MSG "osst%d: Sleeping in re-write wait ready\n", dev); - printk(OSST_DEB_MSG "osst%d: Turning off debugging for a while\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Sleeping in re-write wait ready\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Turning off debugging for a while\n", dev); debugging = 0; } #endif schedule_timeout(HZ / 10); } - printk(KERN_ERR "osst%d: Failed to find valid tape media\n", dev); + printk(KERN_ERR "osst%d:E: Failed to find valid tape media\n", dev); #if DEBUG debugging = dbg; #endif @@ -1287,7 +1482,7 @@ int dev = TAPE_NR(STp->devt); int retval = 0; int rw_state; - unsigned int block, skip; + unsigned int frame, skip; rw_state = STps->rw; @@ -1295,54 +1490,56 @@ || SRpnt->sr_sense_buffer[12] != 12 || SRpnt->sr_sense_buffer[13] != 0) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Write error recovery cannot handle %02x:%02x:%02x\n", - dev, SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); + printk(OSST_DEB_MSG "osst%d:D: Write error recovery cannot handle %02x:%02x:%02x\n", dev, + SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif return (-EIO); } - block = (SRpnt->sr_sense_buffer[3] << 24) | + frame = (SRpnt->sr_sense_buffer[3] << 24) | (SRpnt->sr_sense_buffer[4] << 16) | (SRpnt->sr_sense_buffer[5] << 8) | SRpnt->sr_sense_buffer[6]; skip = SRpnt->sr_sense_buffer[9]; #if DEBUG - printk(OSST_DEB_MSG "osst%d: Detected physical bad block at %u, advised to skip %d\n", dev, block, skip); + printk(OSST_DEB_MSG "osst%d:D: Detected physical bad frame at %u, advised to skip %d\n", dev, frame, skip); #endif osst_get_frame_position(STp, aSRpnt); #if DEBUG - printk(OSST_DEB_MSG "osst%d: reported frame positions: host = %d, tape = %d\n", + printk(OSST_DEB_MSG "osst%d:D: reported frame positions: host = %d, tape = %d\n", dev, STp->first_frame_position, STp->last_frame_position); #endif switch (STp->write_type) { case OS_WRITE_DATA: case OS_WRITE_EOD: case OS_WRITE_NEW_MARK: - printk(KERN_WARNING "osst%d: Relocating %d buffered logical blocks to physical block %u\n", - dev, STp->cur_frames, block + skip); + printk(KERN_WARNING + "osst%d:I: Relocating %d buffered logical frames from position %u to %u\n", + dev, STp->cur_frames, frame, (frame + skip > 3000 && frame < 3000)?3000:frame + skip); if (STp->os_fw_rev >= 10600) - retval = osst_reposition_and_retry(STp, aSRpnt, block, skip, pending); + retval = osst_reposition_and_retry(STp, aSRpnt, frame, skip, pending); else - retval = osst_read_back_buffer_and_rewrite(STp, aSRpnt, block, skip, pending); + retval = osst_read_back_buffer_and_rewrite(STp, aSRpnt, frame, skip, pending); + printk(KERN_WARNING "osst%d:I: Write error%srecovered\n", dev, retval?" not ":" "); break; case OS_WRITE_LAST_MARK: - printk(KERN_ERR "osst%d: Bad block in update last marker, fatal\n", dev); - osst_set_frame_position(STp, aSRpnt, block + STp->cur_frames + pending, 0); + printk(KERN_ERR "osst%d:E: Bad frame in update last marker, fatal\n", dev); + osst_set_frame_position(STp, aSRpnt, frame + STp->cur_frames + pending, 0); retval = -EIO; break; case OS_WRITE_HEADER: - printk(KERN_WARNING "osst%d: Bad block in header partition, skipped\n", dev); - retval = osst_read_back_buffer_and_rewrite(STp, aSRpnt, block, 1, pending); + printk(KERN_WARNING "osst%d:I: Bad frame in header partition, skipped\n", dev); + retval = osst_read_back_buffer_and_rewrite(STp, aSRpnt, frame, 1, pending); break; default: - printk(KERN_WARNING "osst%d: Bad block in filler, ignored\n", dev); - osst_set_frame_position(STp, aSRpnt, block + STp->cur_frames + pending, 0); + printk(KERN_INFO "osst%d:I: Bad frame in filler, ignored\n", dev); + osst_set_frame_position(STp, aSRpnt, frame + STp->cur_frames + pending, 0); } osst_get_frame_position(STp, aSRpnt); #if DEBUG - printk(KERN_ERR "osst%d: Positioning complete, cur_frames %d, pos %d, tape pos %d\n", + printk(OSST_DEB_MSG "osst%d:D: Positioning complete, cur_frames %d, pos %d, tape pos %d\n", dev, STp->cur_frames, STp->first_frame_position, STp->last_frame_position); - printk(OSST_DEB_MSG "osst%d: next logical block to write: %d\n", dev, STp->logical_blk_num); + printk(OSST_DEB_MSG "osst%d:D: next logical frame to write: %d\n", dev, STp->logical_blk_num); #endif if (retval == 0) { STp->recover_count++; @@ -1360,10 +1557,12 @@ int last_mark_ppos = -1; #if DEBUG - printk(OSST_DEB_MSG "osst%d: Reached space_over_filemarks_backwards %d %d\n", dev, mt_op, mt_count); + printk(OSST_DEB_MSG "osst%d:D: Reached space_over_filemarks_backwards %d %d\n", dev, mt_op, mt_count); +#endif + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Couldn't get logical blk num in space_filemarks_bwd\n", dev); #endif - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { - printk(KERN_INFO "osst%i: Couldn't get logical blk num in space_filemarks_bwd\n", dev); return -EIO; } if (STp->linux_media_version >= 4) { @@ -1379,12 +1578,12 @@ STp->header_cache->dat_fm_tab.fm_tab_ent[cnt-1] == STp->buffer->aux->last_mark_ppos) last_mark_ppos = ntohl(STp->header_cache->dat_fm_tab.fm_tab_ent[cnt - mt_count]); -#if 1 //DEBUG +#if DEBUG if (STp->header_cache == NULL || (cnt - mt_count) < 0 || (cnt - mt_count) >= OS_FM_TAB_MAX) - printk(OSST_DEB_MSG "osst%i: Filemark lookup fail due to %s\n", dev, + printk(OSST_DEB_MSG "osst%d:D: Filemark lookup fail due to %s\n", dev, STp->header_cache == NULL?"lack of header cache":"count out of range"); else - printk(OSST_DEB_MSG "osst%i: Filemark lookup: prev mark %d (%s), skip %d to %d\n", + printk(OSST_DEB_MSG "osst%d:D: Filemark lookup: prev mark %d (%s), skip %d to %d\n", dev, cnt, ((cnt == -1 && ntohl(STp->buffer->aux->last_mark_ppos) == -1) || (STp->header_cache->dat_fm_tab.fm_tab_ent[cnt-1] == @@ -1393,22 +1592,28 @@ #endif if (last_mark_ppos > 10 && last_mark_ppos < STp->eod_frame_ppos) { osst_set_frame_position(STp, aSRpnt, last_mark_ppos, 0); - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { - printk(KERN_INFO "osst%i: Couldn't get logical blk num in space_filemarks\n", dev); + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { +#if DEBUG + printk(OSST_DEB_MSG + "osst%d:D: Couldn't get logical blk num in space_filemarks\n", dev); +#endif return (-EIO); } if (STp->buffer->aux->frame_type != OS_FRAME_TYPE_MARKER) { - printk(KERN_INFO "osst%i: Expected to find marker at block %d, not found\n", + printk(KERN_WARNING "osst%d:W: Expected to find marker at ppos %d, not found\n", dev, last_mark_ppos); return (-EIO); } if (mt_op == MTBSFM) { - STp->logical_blk_num++; - STp->logical_blk_in_buffer = 0; + STp->frame_seq_number++; + STp->frame_in_buffer = 0; + STp->logical_blk_num += ntohs(STp->buffer->aux->dat.dat_list[0].blk_cnt); } return 0; } - printk(KERN_INFO "osst%i: Reverting to scan filemark backwards\n", dev); +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Reverting to scan filemark backwards\n", dev); +#endif } cnt = 0; while (cnt != mt_count) { @@ -1416,22 +1621,26 @@ if (last_mark_ppos == -1) return (-EIO); #if DEBUG - printk(OSST_DEB_MSG "osst%i: Positioning to last mark at %d\n", dev, last_mark_ppos); + printk(OSST_DEB_MSG "osst%d:D: Positioning to last mark at %d\n", dev, last_mark_ppos); #endif osst_set_frame_position(STp, aSRpnt, last_mark_ppos, 0); cnt++; - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { - printk(KERN_INFO "osst%i: Couldn't get logical blk num in space_filemarks\n", dev); + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Couldn't get logical blk num in space_filemarks\n", dev); +#endif return (-EIO); } if (STp->buffer->aux->frame_type != OS_FRAME_TYPE_MARKER) { - printk(KERN_INFO "osst%i: Expected to find marker at block %d, not found\n", dev, last_mark_ppos); + printk(KERN_WARNING "osst%d:W: Expected to find marker at ppos %d, not found\n", + dev, last_mark_ppos); return (-EIO); } } if (mt_op == MTBSFM) { - STp->logical_blk_num++; - STp->logical_blk_in_buffer = 0; + STp->frame_seq_number++; + STp->frame_in_buffer = 0; + STp->logical_blk_num += ntohs(STp->buffer->aux->dat.dat_list[0].blk_cnt); } return 0; } @@ -1444,30 +1653,34 @@ static int osst_space_over_filemarks_forward_slow(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int mt_op, int mt_count) { - int dev = TAPE_NR(STp->devt); int cnt = 0; +#if DEBUG + int dev = TAPE_NR(STp->devt); + printk(OSST_DEB_MSG "osst%d:D: Reached space_over_filemarks_forward_slow %d %d\n", dev, mt_op, mt_count); +#endif + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Reached space_over_filemarks_forward_slow %d %d\n", dev, mt_op, mt_count); + printk(OSST_DEB_MSG "osst%d:D: Couldn't get logical blk num in space_filemarks_fwd\n", dev); #endif - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { - printk(KERN_INFO "osst%i: Couldn't get logical blk num in space_filemarks_fwd\n", dev); return (-EIO); } while (1) { - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { - printk(KERN_INFO "osst%i: Couldn't get logical blk num in space_filemarks\n", dev); + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Couldn't get logical blk num in space_filemarks\n", dev); +#endif return (-EIO); } if (STp->buffer->aux->frame_type == OS_FRAME_TYPE_MARKER) cnt++; if (STp->buffer->aux->frame_type == OS_FRAME_TYPE_EOD) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: space_fwd: EOD reached\n", dev); + printk(OSST_DEB_MSG "osst%d:D: space_fwd: EOD reached\n", dev); #endif if (STp->first_frame_position > STp->eod_frame_ppos+1) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: EOD position corrected (%d=>%d)\n", + printk(OSST_DEB_MSG "osst%d:D: EOD position corrected (%d=>%d)\n", dev, STp->eod_frame_ppos, STp->first_frame_position-1); #endif STp->eod_frame_ppos = STp->first_frame_position-1; @@ -1476,11 +1689,12 @@ } if (cnt == mt_count) break; - STp->logical_blk_in_buffer = 0; + STp->frame_in_buffer = 0; } if (mt_op == MTFSF) { - STp->logical_blk_num++; - STp->logical_blk_in_buffer = 0; + STp->frame_seq_number++; + STp->frame_in_buffer = 0; + STp->logical_blk_num += ntohs(STp->buffer->aux->dat.dat_list[0].blk_cnt); } return 0; } @@ -1496,10 +1710,12 @@ next_mark_ppos = -1; #if DEBUG - printk(OSST_DEB_MSG "osst%d: Reached space_over_filemarks_forward_fast %d %d\n", dev, mt_op, mt_count); + printk(OSST_DEB_MSG "osst%d:D: Reached space_over_filemarks_forward_fast %d %d\n", dev, mt_op, mt_count); +#endif + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Couldn't get logical blk num in space_filemarks_fwd\n", dev); #endif - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { - printk(KERN_INFO "osst%i: Couldn't get logical blk num in space_filemarks_fwd\n", dev); return (-EIO); } @@ -1516,33 +1732,39 @@ (STp->header_cache->dat_fm_tab.fm_tab_ent[cnt] == STp->buffer->aux->last_mark_ppos))) next_mark_ppos = ntohl(STp->header_cache->dat_fm_tab.fm_tab_ent[cnt + mt_count]); -#if 1 //DEBUG +#if DEBUG if (STp->header_cache == NULL || (cnt + mt_count) >= OS_FM_TAB_MAX) - printk(OSST_DEB_MSG "osst%i: Filemark lookup fail due to %s\n", dev, + printk(OSST_DEB_MSG "osst%d:D: Filemark lookup fail due to %s\n", dev, STp->header_cache == NULL?"lack of header cache":"count out of range"); else - printk(OSST_DEB_MSG "osst%i: Filemark lookup: prev mark %d (%s), skip %d to %d\n", dev, cnt, + printk(OSST_DEB_MSG "osst%d:D: Filemark lookup: prev mark %d (%s), skip %d to %d\n", + dev, cnt, ((cnt == -1 && ntohl(STp->buffer->aux->last_mark_ppos) == -1) || (STp->header_cache->dat_fm_tab.fm_tab_ent[cnt] == STp->buffer->aux->last_mark_ppos))?"match":"error", mt_count, next_mark_ppos); #endif if (next_mark_ppos <= 10 || next_mark_ppos > STp->eod_frame_ppos) { - printk(KERN_INFO "osst%i: Reverting to slow filemark space\n", dev); +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Reverting to slow filemark space\n", dev); +#endif return osst_space_over_filemarks_forward_slow(STp, aSRpnt, mt_op, mt_count); } else { osst_set_frame_position(STp, aSRpnt, next_mark_ppos, 0); - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { - printk(KERN_INFO "osst%i: Couldn't get logical blk num in space_filemarks\n", dev); + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Couldn't get logical blk num in space_filemarks\n", + dev); +#endif return (-EIO); } if (STp->buffer->aux->frame_type != OS_FRAME_TYPE_MARKER) { - printk(KERN_INFO "osst%i: Expected to find marker at block %d, not found\n", + printk(KERN_WARNING "osst%d:W: Expected to find marker at ppos %d, not found\n", dev, next_mark_ppos); return (-EIO); } if (ntohl(STp->buffer->aux->filemark_cnt) != cnt + mt_count) { - printk(KERN_INFO "osst%i: Expected to find marker %d at block %d, not %d\n", + printk(KERN_WARNING "osst%d:W: Expected to find marker %d at ppos %d, not %d\n", dev, cnt+mt_count, next_mark_ppos, ntohl(STp->buffer->aux->filemark_cnt)); return (-EIO); @@ -1557,24 +1779,28 @@ break; if (STp->buffer->aux->frame_type == OS_FRAME_TYPE_EOD) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: space_fwd: EOD reached\n", dev); + printk(OSST_DEB_MSG "osst%d:D: space_fwd: EOD reached\n", dev); #endif return (-EIO); } if (ntohl(STp->buffer->aux->filemark_cnt) == 0) { if (STp->first_mark_ppos == -1) { - printk(KERN_INFO "osst%i: Reverting to slow filemark space\n", dev); +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Reverting to slow filemark space\n", dev); +#endif return osst_space_over_filemarks_forward_slow(STp, aSRpnt, mt_op, mt_count); } osst_set_frame_position(STp, aSRpnt, STp->first_mark_ppos, 0); - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { - printk(KERN_INFO - "osst%i: Couldn't get logical blk num in space_filemarks_fwd_fast\n", + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { +#if DEBUG + printk(OSST_DEB_MSG + "osst%d:D: Couldn't get logical blk num in space_filemarks_fwd_fast\n", dev); +#endif return (-EIO); } if (STp->buffer->aux->frame_type != OS_FRAME_TYPE_MARKER) { - printk(KERN_INFO "osst%i: Expected to find filemark at %d\n", + printk(KERN_WARNING "osst%d:W: Expected to find filemark at %d\n", dev, STp->first_mark_ppos); return (-EIO); } @@ -1588,28 +1814,35 @@ while (cnt != mt_count) { next_mark_ppos = ntohl(STp->buffer->aux->next_mark_ppos); if (!next_mark_ppos || next_mark_ppos > STp->eod_frame_ppos) { - printk(KERN_INFO "osst%i: Reverting to slow filemark space\n", dev); +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Reverting to slow filemark space\n", dev); +#endif return osst_space_over_filemarks_forward_slow(STp, aSRpnt, mt_op, mt_count - cnt); } #if DEBUG - else printk(OSST_DEB_MSG "osst%i: Positioning to next mark at %d\n", dev, next_mark_ppos); + else printk(OSST_DEB_MSG "osst%d:D: Positioning to next mark at %d\n", dev, next_mark_ppos); #endif osst_set_frame_position(STp, aSRpnt, next_mark_ppos, 0); cnt++; - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { - printk(KERN_INFO "osst%i: Couldn't get logical blk num in space_filemarks\n", dev); + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Couldn't get logical blk num in space_filemarks\n", + dev); +#endif return (-EIO); } if (STp->buffer->aux->frame_type != OS_FRAME_TYPE_MARKER) { - printk(KERN_INFO "osst%i: Expected to find marker at block %d, not found\n", + printk(KERN_WARNING "osst%d:W: Expected to find marker at ppos %d, not found\n", dev, next_mark_ppos); return (-EIO); } } } - if (mt_op == MTFSF) - STp->logical_blk_num++; - STp->logical_blk_in_buffer = 0; + if (mt_op == MTFSF) { + STp->frame_seq_number++; + STp->frame_in_buffer = 0; + STp->logical_blk_num += ntohs(STp->buffer->aux->dat.dat_list[0].blk_cnt); + } return 0; } @@ -1639,75 +1872,22 @@ (STp->buffer)->b_data[MODE_HEADER_LENGTH + 3] = retries; if (debugging) - printk(OSST_DEB_MSG "osst%i: Setting number of retries on OnStream tape to %d\n", dev, retries); + printk(OSST_DEB_MSG "osst%d:D: Setting number of retries on OnStream tape to %d\n", dev, retries); SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], SCSI_DATA_WRITE, STp->timeout, 0, TRUE); *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result) - printk (KERN_ERR "osst%d: Couldn't set retries to %d\n", dev, retries); + printk (KERN_ERR "osst%d:D: Couldn't set retries to %d\n", dev, retries); } #endif -#if 0 -static void osst_update_markers(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int last_mark_ppos, int this_mark_ppos) -{ - int dev = TAPE_NR(STp->devt); - int frame, - reslt; - - if (STp->raw) return; - - STp->last_mark_ppos = this_mark_ppos; - if (STp->header_cache != NULL && STp->filemark_cnt < OS_FM_TAB_MAX) - STp->header_cache->dat_fm_tab.fm_tab_ent[STp->filemark_cnt] = htonl(this_mark_ppos); - if (STp->filemark_cnt++ == 0) - STp->first_mark_ppos = this_mark_ppos; - - if (STp->linux_media_version >= 4) return; - if (last_mark_ppos == -1) return; - - STp->write_type = OS_WRITE_LAST_MARK; - frame = osst_get_frame_position(STp, aSRpnt); -#if DEBUG - printk(OSST_DEB_MSG "osst%i: Update last_marker at frame %d\n", dev, last_mark_addr); - printk(OSST_DEB_MSG "osst%i: current position %d, lblk %d, tape blk %d\n", - dev, frame, STp->logical_blk_num, STp->last_frame_position); -#endif - osst_set_frame_position(STp, aSRpnt, last_mark_ppos, 0); - osst_initiate_read (STp, aSRpnt); - reslt = osst_read_block(STp, aSRpnt, 180); - - if (reslt) { - printk(KERN_WARNING "osst%i: couldn't read last marker\n", dev); - osst_set_frame_position(STp, aSRpnt, frame, 0); - return; - } - if (STp->buffer->aux->frame_type != OS_FRAME_TYPE_MARKER) { - printk(KERN_WARNING "osst%i: expected marker at addr %d\n", dev, last_mark_ppos); - osst_set_frame_position(STp, aSRpnt, frame, 0); - return; - } -#if DEBUG - printk(OSST_DEB_MSG "osst%i: writing back marker\n", dev); -#endif - STp->buffer->aux->next_mark_ppos = htonl(this_mark_ppos); - osst_set_frame_position(STp, aSRpnt, last_mark_ppos, 0); - STp->dirty = 1; - if (osst_flush_write_buffer(STp, aSRpnt, 0) || - osst_flush_drive_buffer(STp, aSRpnt) ) { - printk(KERN_WARNING "osst%i: couldn't write marker back at addr %d\n", dev, last_mark_ppos); - } - osst_set_frame_position(STp, aSRpnt, frame, 0); - - return; /* FIXME -- errors should go back to user space */ -} -#endif static int osst_write_filemark(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt) { int result; - int this_mark_ppos; + int this_mark_ppos = STp->first_frame_position; + int this_mark_lbn = STp->logical_blk_num; #if DEBUG int dev = TAPE_NR(STp->devt); #endif @@ -1715,22 +1895,19 @@ if (STp->raw) return 0; STp->write_type = OS_WRITE_NEW_MARK; - this_mark_ppos = osst_get_frame_position(STp, aSRpnt); #if DEBUG - printk(OSST_DEB_MSG "osst%i: Writing Filemark %i at frame %d (lblk %d)\n", - dev, STp->filemark_cnt, this_mark_ppos, STp->logical_blk_num); + printk(OSST_DEB_MSG "osst%d:D: Writing Filemark %i at fppos %d (fseq %d, lblk %d)\n", + dev, STp->filemark_cnt, this_mark_ppos, STp->frame_seq_number, this_mark_lbn); #endif - osst_init_aux(STp, OS_FRAME_TYPE_MARKER, STp->logical_blk_num++); - STp->ps[STp->partition].rw = ST_WRITING; STp->dirty = 1; - result = osst_flush_write_buffer(STp, aSRpnt, 0); + result = osst_flush_write_buffer(STp, aSRpnt); result |= osst_flush_drive_buffer(STp, aSRpnt); STp->last_mark_ppos = this_mark_ppos; + STp->last_mark_lbn = this_mark_lbn; if (STp->header_cache != NULL && STp->filemark_cnt < OS_FM_TAB_MAX) STp->header_cache->dat_fm_tab.fm_tab_ent[STp->filemark_cnt] = htonl(this_mark_ppos); if (STp->filemark_cnt++ == 0) STp->first_mark_ppos = this_mark_ppos; -// osst_update_markers(STp, aSRpnt, STp->last_mark_addr, this_mark_addr); return result; } @@ -1744,71 +1921,67 @@ if (STp->raw) return 0; STp->write_type = OS_WRITE_EOD; - STp->eod_frame_ppos = osst_get_frame_position(STp, aSRpnt); + STp->eod_frame_ppos = STp->first_frame_position; #if DEBUG - printk(OSST_DEB_MSG "osst%i: Writing EOD at %d=>%d\n", dev, STp->logical_blk_num, STp->eod_frame_ppos); + printk(OSST_DEB_MSG "osst%d:D: Writing EOD at fppos %d (fseq %d, lblk %d)\n", dev, + STp->eod_frame_ppos, STp->frame_seq_number, STp->logical_blk_num); #endif - osst_init_aux(STp, OS_FRAME_TYPE_EOD, STp->logical_blk_num++); - STp->ps[STp->partition].rw = ST_WRITING; STp->dirty = 1; - result = osst_flush_write_buffer(STp, aSRpnt, 0); + result = osst_flush_write_buffer(STp, aSRpnt); result |= osst_flush_drive_buffer(STp, aSRpnt); - STp->eod_frame_lfa = --(STp->logical_blk_num); + STp->eod_frame_lfa = --(STp->frame_seq_number); return result; } -static int osst_write_filler(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int block, int count) +static int osst_write_filler(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int where, int count) { int dev = TAPE_NR(STp->devt); #if DEBUG - printk(OSST_DEB_MSG "osst%i: Reached onstream write filler group %d\n", dev, block); + printk(OSST_DEB_MSG "osst%d:D: Reached onstream write filler group %d\n", dev, where); #endif osst_wait_ready(STp, aSRpnt, 60 * 5); - osst_set_frame_position(STp, aSRpnt, block, 0); + osst_set_frame_position(STp, aSRpnt, where, 0); STp->write_type = OS_WRITE_FILLER; - osst_init_aux(STp, OS_FRAME_TYPE_FILL, 0); while (count--) { memcpy(STp->buffer->b_data, "Filler", 6); STp->buffer->buffer_bytes = 6; STp->dirty = 1; - if (osst_flush_write_buffer(STp, aSRpnt, 0)) { - printk(KERN_INFO "osst%i: Couldn't write filler frame\n", dev); + if (osst_flush_write_buffer(STp, aSRpnt)) { + printk(KERN_INFO "osst%i:I: Couldn't write filler frame\n", dev); return (-EIO); } } #if DEBUG - printk(OSST_DEB_MSG "osst%i: Exiting onstream write filler group\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Exiting onstream write filler group\n", dev); #endif return osst_flush_drive_buffer(STp, aSRpnt); } -static int __osst_write_header(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int block, int count) +static int __osst_write_header(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int where, int count) { int dev = TAPE_NR(STp->devt); int result; #if DEBUG - printk(OSST_DEB_MSG "osst%i: Reached onstream write header group %d\n", dev, block); + printk(OSST_DEB_MSG "osst%d:D: Reached onstream write header group %d\n", dev, where); #endif osst_wait_ready(STp, aSRpnt, 60 * 5); - osst_set_frame_position(STp, aSRpnt, block, 0); + osst_set_frame_position(STp, aSRpnt, where, 0); STp->write_type = OS_WRITE_HEADER; - STp->ps[STp->partition].rw = ST_WRITING; - osst_init_aux(STp, OS_FRAME_TYPE_HEADER, STp->logical_blk_num); while (count--) { osst_copy_to_buffer(STp->buffer, (unsigned char *)STp->header_cache); STp->buffer->buffer_bytes = sizeof(os_header_t); STp->dirty = 1; - if (osst_flush_write_buffer(STp, aSRpnt, 0)) { - printk(KERN_INFO "osst%i: Couldn't write header frame\n", dev); + if (osst_flush_write_buffer(STp, aSRpnt)) { + printk(KERN_INFO "osst%i:I: Couldn't write header frame\n", dev); return (-EIO); } } result = osst_flush_drive_buffer(STp, aSRpnt); #if DEBUG - printk(OSST_DEB_MSG "osst%i: Write onstream header group %s\n", dev, result?"failed":"done"); + printk(OSST_DEB_MSG "osst%d:D: Write onstream header group %s\n", dev, result?"failed":"done"); #endif return result; } @@ -1820,18 +1993,18 @@ int dev = TAPE_NR(STp->devt); #if DEBUG - printk(OSST_DEB_MSG "osst%i: Writing tape header\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Writing tape header\n", dev); #endif if (STp->raw) return 0; if (STp->header_cache == NULL) { if ((STp->header_cache = (os_header_t *)vmalloc(sizeof(os_header_t))) == NULL) { - printk(KERN_ERR "osst%i: Failed to allocate header cache\n", dev); + printk(KERN_ERR "osst%i:E: Failed to allocate header cache\n", dev); return (-ENOMEM); } memset(STp->header_cache, 0, sizeof(os_header_t)); #if DEBUG - printk(OSST_DEB_MSG "osst%d: Allocated and cleared memory for header cache\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Allocated and cleared memory for header cache\n", dev); #endif } if (STp->header_ok) STp->update_frame_cntr++; @@ -1872,12 +2045,12 @@ if (locate_eod) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: locating back to eod frame addr %d\n", dev, STp->eod_frame_ppos); + printk(OSST_DEB_MSG "osst%d:D: Locating back to eod frame addr %d\n", dev, STp->eod_frame_ppos); #endif osst_set_frame_position(STp, aSRpnt, STp->eod_frame_ppos, 0); } if (result) - printk(KERN_WARNING "osst%i: write header failed\n", dev); + printk(KERN_ERR "osst%i:E: Write header failed\n", dev); else { memcpy(STp->application_sig, "LIN4", 4); STp->linux_media = 1; @@ -1892,15 +2065,15 @@ if (STp->header_cache != NULL) memset(STp->header_cache, 0, sizeof(os_header_t)); - STp->logical_blk_num = 0; - STp->logical_blk_in_buffer = 0; + STp->logical_blk_num = STp->frame_seq_number = 0; + STp->frame_in_buffer = 0; STp->eod_frame_ppos = STp->first_data_ppos = 0x0000000A; STp->filemark_cnt = 0; - STp->first_mark_ppos = STp->last_mark_ppos = -1; + STp->first_mark_ppos = STp->last_mark_ppos = STp->last_mark_lbn = -1; return osst_write_header(STp, aSRpnt, 1); } -static int __osst_analyze_headers(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int block) +static int __osst_analyze_headers(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int ppos) { int dev = TAPE_NR(STp->devt); os_header_t * header; @@ -1912,17 +2085,17 @@ if (STp->raw) return 1; - if (block == 5 || block == 0xbae || STp->buffer->syscall_result) { - if (osst_set_frame_position(STp, aSRpnt, block, 0)) - printk(KERN_WARNING "osst%i: Couldn't position tape\n", dev); + if (ppos == 5 || ppos == 0xbae || STp->buffer->syscall_result) { + if (osst_set_frame_position(STp, aSRpnt, ppos, 0)) + printk(KERN_WARNING "osst%i:W: Couldn't position tape\n", dev); if (osst_initiate_read (STp, aSRpnt)) { - printk(KERN_WARNING "osst%i: Couldn't initiate read\n", dev); + printk(KERN_WARNING "osst%i:W: Couldn't initiate read\n", dev); return 0; } } - if (osst_read_block(STp, aSRpnt, 180)) { + if (osst_read_frame(STp, aSRpnt, 180)) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: Couldn't read header frame\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Couldn't read header frame\n", dev); #endif return 0; } @@ -1930,7 +2103,20 @@ aux = STp->buffer->aux; if (aux->frame_type != OS_FRAME_TYPE_HEADER) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: Skipping non-header frame (%d)\n", dev, block); + printk(OSST_DEB_MSG "osst%d:D: Skipping non-header frame (%d)\n", dev, ppos); +#endif + return 0; + } + if (ntohl(aux->frame_seq_num) != 0 || + ntohl(aux->logical_blk_num) != 0 || + aux->partition.partition_num != OS_CONFIG_PARTITION || + ntohl(aux->partition.first_frame_ppos) != 0 || + ntohl(aux->partition.last_frame_ppos) != 0xbb7 ) { +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Invalid header frame (%d,%d,%d,%d,%d)\n", dev, + ntohl(aux->frame_seq_num), ntohl(aux->logical_blk_num), + aux->partition.partition_num, ntohl(aux->partition.first_frame_ppos), + ntohl(aux->partition.last_frame_ppos)); #endif return 0; } @@ -1938,51 +2124,57 @@ strncmp(header->ident_str, "ADR-SEQ", 7) != 0) { strncpy(id_string, header->ident_str, 7); id_string[7] = 0; - printk(KERN_INFO "osst%i: Invalid header identification string %s\n", dev, id_string); +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Invalid header identification string %s\n", dev, id_string); +#endif return 0; } update_frame_cntr = ntohl(aux->update_frame_cntr); if (update_frame_cntr < STp->update_frame_cntr) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: Skipping frame %d with update_frame_counter %d<%d\n", - dev, block, update_frame_cntr, STp->update_frame_cntr); + printk(OSST_DEB_MSG "osst%d:D: Skipping frame %d with update_frame_counter %d<%d\n", + dev, ppos, update_frame_cntr, STp->update_frame_cntr); #endif return 0; } if (header->major_rev != 1 || header->minor_rev != 4 ) { - printk(KERN_INFO "osst%i: %s revision %d.%d detected (1.4 supported)\n", +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: %s revision %d.%d detected (1.4 supported)\n", dev, (header->major_rev != 1 || header->minor_rev < 2 || header->minor_rev > 4 )? "Invalid" : "Warning:", header->major_rev, header->minor_rev); +#endif if (header->major_rev != 1 || header->minor_rev < 2 || header->minor_rev > 4) return 0; } +#if DEBUG if (header->pt_par_num != 1) - printk(KERN_INFO "osst%i: Warning: %d partitions defined, only one supported\n", + printk(KERN_INFO "osst%i:W: %d partitions defined, only one supported\n", dev, header->pt_par_num); +#endif memcpy(id_string, aux->application_sig, 4); id_string[4] = 0; if (memcmp(id_string, "LIN", 3) == 0) { STp->linux_media = 1; linux_media_version = id_string[3] - '0'; if (linux_media_version != 4) - printk(KERN_INFO "osst%i: Linux media version %d detected (current 4)\n", + printk(KERN_INFO "osst%i:I: Linux media version %d detected (current 4)\n", dev, linux_media_version); } else { - printk(KERN_WARNING "osst%i: non Linux media detected (%s)\n", dev, id_string); + printk(KERN_WARNING "osst%i:W: Non Linux media detected (%s)\n", dev, id_string); return 0; } if (linux_media_version < STp->linux_media_version) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: Skipping frame %d with linux_media_version %d\n", - dev, block, linux_media_version); + printk(OSST_DEB_MSG "osst%d:D: Skipping frame %d with linux_media_version %d\n", + dev, ppos, linux_media_version); #endif return 0; } if (linux_media_version > STp->linux_media_version) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: Frame %d sets linux_media_version to %d\n", - dev, block, linux_media_version); + printk(OSST_DEB_MSG "osst%d:D: Frame %d sets linux_media_version to %d\n", + dev, ppos, linux_media_version); #endif memcpy(STp->application_sig, id_string, 5); STp->linux_media_version = linux_media_version; @@ -1990,16 +2182,16 @@ } if (update_frame_cntr > STp->update_frame_cntr) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: Frame %d sets update_frame_counter to %d\n", - dev, block, update_frame_cntr); + printk(OSST_DEB_MSG "osst%d:D: Frame %d sets update_frame_counter to %d\n", + dev, ppos, update_frame_cntr); #endif if (STp->header_cache == NULL) { if ((STp->header_cache = (os_header_t *)vmalloc(sizeof(os_header_t))) == NULL) { - printk(KERN_ERR "osst%i: Failed to allocate header cache\n", dev); + printk(KERN_ERR "osst%i:E: Failed to allocate header cache\n", dev); return 0; } #if DEBUG - printk(OSST_DEB_MSG "osst%d: Allocated memory for header cache\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Allocated memory for header cache\n", dev); #endif } osst_copy_from_buffer(STp->buffer, (unsigned char *)STp->header_cache); @@ -2012,19 +2204,22 @@ STp->filemark_cnt = ntohl(aux->filemark_cnt); STp->first_mark_ppos = ntohl(aux->next_mark_ppos); STp->last_mark_ppos = ntohl(aux->last_mark_ppos); + STp->last_mark_lbn = ntohl(aux->last_mark_lbn); STp->update_frame_cntr = update_frame_cntr; #if DEBUG - printk(OSST_DEB_MSG "osst%i: detected write pass %d, update frame counter %d, filemark counter %d\n", + printk(OSST_DEB_MSG "osst%d:D: Detected write pass %d, update frame counter %d, filemark counter %d\n", dev, STp->wrt_pass_cntr, STp->update_frame_cntr, STp->filemark_cnt); - printk(OSST_DEB_MSG "osst%i: first data frame on tape = %d, last = %d, eod frame = %d\n", dev, + printk(OSST_DEB_MSG "osst%d:D: first data frame on tape = %d, last = %d, eod frame = %d\n", dev, STp->first_data_ppos, ntohl(header->partition[0].last_frame_ppos), ntohl(header->partition[0].eod_frame_ppos)); - printk(OSST_DEB_MSG "osst%i: first mark on tape = %d, last = %d, eod frame = %d\n", + printk(OSST_DEB_MSG "osst%d:D: first mark on tape = %d, last = %d, eod frame = %d\n", dev, STp->first_mark_ppos, STp->last_mark_ppos, STp->eod_frame_ppos); #endif if (header->minor_rev < 4 && STp->linux_media_version == 4) { - printk(OSST_DEB_MSG "osst%i: Moving filemark list to ADR 1.4 location\n", dev); +#if DEBUG + printk(OSST_DEB_MSG "osst%i:D: Moving filemark list to ADR 1.4 location\n", dev); +#endif memcpy((void *)header->dat_fm_tab.fm_tab_ent, (void *)header->old_filemark_list, sizeof(header->dat_fm_tab.fm_tab_ent)); memset((void *)header->old_filemark_list, 0, sizeof(header->old_filemark_list)); @@ -2048,9 +2243,8 @@ header->dat_fm_tab.fm_tab_ent_sz != 4 || header->dat_fm_tab.fm_tab_ent_cnt != htons(STp->filemark_cntfilemark_cnt:OS_FM_TAB_MAX))) - printk(KERN_WARNING "osst%i: Failed consistency check ADR 1.4 format\n", dev); + printk(KERN_WARNING "osst%i:W: Failed consistency check ADR 1.4 format\n", dev); -// memcpy(STp->header_cache, header, sizeof(os_header_t)); } return 1; @@ -2058,7 +2252,7 @@ static int osst_analyze_headers(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt) { - int position, block; + int position, ppos; int first, last; int valid = 0; int dev = TAPE_NR(STp->devt); @@ -2073,37 +2267,37 @@ STp->header_ok = STp->linux_media = STp->linux_media_version = 0; STp->wrt_pass_cntr = STp->update_frame_cntr = -1; STp->eod_frame_ppos = STp->first_data_ppos = -1; - STp->first_mark_ppos = STp->last_mark_ppos = -1; + STp->first_mark_ppos = STp->last_mark_ppos = STp->last_mark_lbn = -1; #if DEBUG - printk(OSST_DEB_MSG "osst%i: Reading header\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Reading header\n", dev); #endif - /* optimization for speed - if we are positioned at block 10, read second group first */ + /* optimization for speed - if we are positioned at ppos 10, read second group first */ /* TODO try the ADR 1.1 locations for the second group if we have no valid one yet... */ first = position==10?0xbae: 5; last = position==10?0xbb3:10; - for (block = first; block < last; block++) - if (__osst_analyze_headers(STp, aSRpnt, block)) + for (ppos = first; ppos < last; ppos++) + if (__osst_analyze_headers(STp, aSRpnt, ppos)) valid = 1; first = position==10? 5:0xbae; last = position==10?10:0xbb3; - for (block = first; block < last; block++) - if (__osst_analyze_headers(STp, aSRpnt, block)) + for (ppos = first; ppos < last; ppos++) + if (__osst_analyze_headers(STp, aSRpnt, ppos)) valid = 1; if (!valid) { - printk(KERN_ERR "osst%i: Failed to find valid ADRL header, new media?\n", dev); + printk(KERN_ERR "osst%i:E: Failed to find valid ADRL header, new media?\n", dev); STp->eod_frame_ppos = STp->first_data_ppos = 0; osst_set_frame_position(STp, aSRpnt, 10, 0); return 0; } if (position <= STp->first_data_ppos) { position = STp->first_data_ppos; - STp->ps[0].drv_file = STp->ps[0].drv_block = STp->logical_blk_num = 0; + STp->ps[0].drv_file = STp->ps[0].drv_block = STp->frame_seq_number = STp->logical_blk_num = 0; } osst_set_frame_position(STp, aSRpnt, position, 0); STp->header_ok = 1; @@ -2114,18 +2308,21 @@ static int osst_verify_position(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt) { int frame_position = STp->first_frame_position; + int frame_seq_numbr = STp->frame_seq_number; int logical_blk_num = STp->logical_blk_num; + int halfway_frame = STp->frame_in_buffer; + int read_pointer = STp->buffer->read_pointer; int prev_mark_ppos = -1; int actual_mark_ppos, i, n; -#if 1 //DEBUG +#if DEBUG int dev = TAPE_NR(STp->devt); - printk(OSST_DEB_MSG "osst%i: Verify that the tape is really the one we think before writing\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Verify that the tape is really the one we think before writing\n", dev); #endif osst_set_frame_position(STp, aSRpnt, frame_position - 1, 0); - if (osst_get_logical_blk(STp, aSRpnt, -1, 0) < 0) { + if (osst_get_logical_frame(STp, aSRpnt, -1, 0) < 0) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: Couldn't get logical blk num in verify_position\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Couldn't get logical blk num in verify_position\n", dev); #endif return (-EIO); } @@ -2137,42 +2334,48 @@ prev_mark_ppos = frame_position - 1; /* usually - we don't really know */ actual_mark_ppos = STp->buffer->aux->frame_type == OS_FRAME_TYPE_MARKER ? frame_position - 1 : ntohl(STp->buffer->aux->last_mark_ppos); - if (frame_position != STp->first_frame_position || - logical_blk_num != STp->logical_blk_num + 1 || - prev_mark_ppos != actual_mark_ppos ) { -#if 1 //DEBUG - printk(OSST_DEB_MSG "osst%i: Block mismatch: frame %d-%d, lblk %d-%d, mark %d-%d\n", dev, - STp->first_frame_position, frame_position, STp->logical_blk_num + 1, - logical_blk_num, actual_mark_ppos, prev_mark_ppos); + if (frame_position != STp->first_frame_position || + frame_seq_numbr != STp->frame_seq_number + (halfway_frame?0:1) || + prev_mark_ppos != actual_mark_ppos ) { +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Block mismatch: fppos %d-%d, fseq %d-%d, mark %d-%d\n", dev, + STp->first_frame_position, frame_position, + STp->frame_seq_number + (halfway_frame?0:1), + frame_seq_numbr, actual_mark_ppos, prev_mark_ppos); #endif return (-EIO); } - STp->logical_blk_in_buffer = 0; - STp->logical_blk_num = logical_blk_num; + if (halfway_frame) { + /* prepare buffer for append and rewrite on top of original */ + osst_set_frame_position(STp, aSRpnt, frame_position - 1, 0); + STp->buffer->buffer_bytes = read_pointer; + STp->ps[STp->partition].rw = ST_WRITING; + STp->dirty = 1; + } + STp->frame_in_buffer = halfway_frame; + STp->frame_seq_number = frame_seq_numbr; + STp->logical_blk_num = logical_blk_num; return 0; } /* Acc. to OnStream, the vers. numbering is the following: * X.XX for released versions (X=digit), * XXXY for unreleased versions (Y=letter) - * Ordering 1.05 < 106A < 106a < 106B < ... < 1.06 + * Ordering 1.05 < 106A < 106B < ... < 106a < ... < 1.06 * This fn makes monoton numbers out of this scheme ... */ static unsigned int osst_parse_firmware_rev (const char * str) { - unsigned int rev; if (str[1] == '.') { - rev = (str[0]-0x30)*10000 - +(str[2]-0x30)*1000 - +(str[3]-0x30)*100; + return (str[0]-'0')*10000 + +(str[2]-'0')*1000 + +(str[3]-'0')*100; } else { - rev = (str[0]-0x30)*10000 - +(str[1]-0x30)*1000 - +(str[2]-0x30)*100 - 100; - rev += 2*(str[3] & 0x1f) - +(str[3] >= 0x60? 1: 0); + return (str[0]-'0')*10000 + +(str[1]-'0')*1000 + +(str[2]-'0')*100 - 100 + +(str[3]-'@'); } - return rev; } /* @@ -2180,9 +2383,9 @@ */ static int osst_configure_onstream(OS_Scsi_Tape *STp, Scsi_Request ** aSRpnt) { - int dev = TAPE_NR(STp->devt); unsigned char cmd[MAX_COMMAND_SIZE]; - Scsi_Request * SRpnt = * aSRpnt; + int dev = TAPE_NR(STp->devt); + Scsi_Request * SRpnt = * aSRpnt; osst_mode_parameter_header_t * header; osst_block_size_page_t * bs; osst_capabilities_page_t * cp; @@ -2191,21 +2394,19 @@ if (STp->ready != ST_READY) { #if DEBUG - printk(OSST_DEB_MSG "osst%i: Not Ready\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Not Ready\n", dev); #endif return (-EIO); } if (STp->os_fw_rev < 10600) { - printk("osst%i: Old OnStream firmware revision detected (%s)\n", - dev, STp->device->rev); - printk("osst%i: An upgrade to version 1.06 or above is recommended\n", - dev); + printk(KERN_INFO "osst%i:I: Old OnStream firmware revision detected (%s),\n", dev, STp->device->rev); + printk(KERN_INFO "osst%d:I: an upgrade to version 1.06 or above is recommended\n", dev); } /* * Configure 32.5KB (data+aux) frame size. - * Get the current block size from the block size mode page + * Get the current frame size from the block size mode page */ memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = MODE_SENSE; @@ -2216,13 +2417,13 @@ SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], SCSI_DATA_READ, STp->timeout, 0, TRUE); if (SRpnt == NULL) { #if DEBUG - printk(OSST_DEB_MSG "osst: Busy\n"); + printk(OSST_DEB_MSG "osst :D: Busy\n"); #endif return (-EBUSY); } *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result != 0) { - printk (KERN_ERR "osst%i: Can't get tape block size mode page\n", dev); + printk (KERN_ERR "osst%i:E: Can't get tape block size mode page\n", dev); return (-EIO); } @@ -2230,10 +2431,10 @@ bs = (osst_block_size_page_t *) ((STp->buffer)->b_data + sizeof(osst_mode_parameter_header_t) + header->bdl); #if DEBUG - printk(KERN_INFO "osst%i: 32KB play back: %s\n", dev, bs->play32 ? "Yes" : "No"); - printk(KERN_INFO "osst%i: 32.5KB play back: %s\n", dev, bs->play32_5 ? "Yes" : "No"); - printk(KERN_INFO "osst%i: 32KB record: %s\n", dev, bs->record32 ? "Yes" : "No"); - printk(KERN_INFO "osst%i: 32.5KB record: %s\n", dev, bs->record32_5 ? "Yes" : "No"); + printk(OSST_DEB_MSG "osst%d:D: 32KB play back: %s\n", dev, bs->play32 ? "Yes" : "No"); + printk(OSST_DEB_MSG "osst%d:D: 32.5KB play back: %s\n", dev, bs->play32_5 ? "Yes" : "No"); + printk(OSST_DEB_MSG "osst%d:D: 32KB record: %s\n", dev, bs->record32 ? "Yes" : "No"); + printk(OSST_DEB_MSG "osst%d:D: 32.5KB record: %s\n", dev, bs->record32_5 ? "Yes" : "No"); #endif /* @@ -2253,16 +2454,12 @@ SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], SCSI_DATA_WRITE, STp->timeout, 0, TRUE); *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result != 0) { - printk (KERN_ERR "osst%i: Couldn't set tape block size mode page\n", dev); + printk (KERN_ERR "osst%i:E: Couldn't set tape block size mode page\n", dev); return (-EIO); } - STp->block_size = (STp->raw) ? OS_FRAME_SIZE : OS_DATA_SIZE; - STp->min_block = OS_FRAME_SIZE; /* FIXME */ - STp->max_block = STp->block_size; - #if DEBUG - printk(KERN_INFO "osst%i: Block Size changed to 32.5K\n", dev); + printk(KERN_INFO "osst%d:D: Block Size changed to 32.5K\n", dev); /* * In debug mode, we want to see as many errors as possible * to test the error recovery mechanism. @@ -2298,7 +2495,7 @@ *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result != 0) { - printk (KERN_ERR "osst%i: Couldn't set vendor name to %s\n", dev, + printk (KERN_ERR "osst%i:E: Couldn't set vendor name to %s\n", dev, (char *) ((STp->buffer)->b_data + MODE_HEADER_LENGTH + 2)); return (-EIO); } @@ -2313,7 +2510,7 @@ *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result != 0) { - printk (KERN_ERR "osst%i: can't get capabilities page\n", dev); + printk (KERN_ERR "osst%i:E: Can't get capabilities page\n", dev); return (-EIO); } @@ -2333,7 +2530,7 @@ *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result != 0) { - printk (KERN_ERR "osst%i: can't get tape parameter page\n", dev); + printk (KERN_ERR "osst%i:E: Can't get tape parameter page\n", dev); return (-EIO); } @@ -2344,7 +2541,7 @@ STp->density = prm->density; STp->capacity = ntohs(prm->segtrk) * ntohs(prm->trks); #if DEBUG - printk(OSST_DEB_MSG "osst%d: Density %d, tape length: %dMB, drive buffer size: %dKB\n", + printk(OSST_DEB_MSG "osst%d:D: Density %d, tape length: %dMB, drive buffer size: %dKB\n", dev, STp->density, STp->capacity / 32, drive_buffer_size); #endif @@ -2362,7 +2559,7 @@ #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Stepping over filemark %s.\n", + printk(OSST_DEB_MSG "osst%d:D: Stepping over filemark %s.\n", dev, forward ? "forward" : "backward"); #endif @@ -2375,7 +2572,7 @@ result = osst_seek_logical_blk(STp, aSRpnt, STp->logical_blk_num - 1); if (result < 0) - printk(KERN_ERR "osst%d: Stepping over filemark %s failed.\n", + printk(KERN_WARNING "osst%d:W: Stepping over filemark %s failed.\n", dev, forward ? "forward" : "backward"); return result; @@ -2415,7 +2612,7 @@ result = ((SRpnt->sr_sense_buffer[2] & 0x0f) == 3) ? -EIO : -EINVAL; if (result == -EINVAL) - printk(KERN_ERR "osst%d: Can't read tape position.\n", dev); + printk(KERN_ERR "osst%d:E: Can't read tape position.\n", dev); else { if (result == -EIO) { /* re-read position */ @@ -2440,7 +2637,7 @@ STp->cur_frames = (STp->buffer)->b_data[15]; #if DEBUG if (debugging) { - printk(OSST_DEB_MSG "osst%d: Drive Positions: host %d, tape %d%s, buffer %d\n", dev, + printk(OSST_DEB_MSG "osst%d:D: Drive Positions: host %d, tape %d%s, buffer %d\n", dev, STp->first_frame_position, STp->last_frame_position, ((STp->buffer)->b_data[0]&0x80)?" (BOP)": ((STp->buffer)->b_data[0]&0x40)?" (EOP)":"", @@ -2449,7 +2646,7 @@ #endif if (STp->cur_frames == 0 && STp->first_frame_position != STp->last_frame_position) { #if DEBUG - printk(KERN_WARNING "osst%d: Correcting read position %d, %d, %d\n", dev, + printk(KERN_WARNING "osst%d:D: Correcting read position %d, %d, %d\n", dev, STp->first_frame_position, STp->last_frame_position, STp->cur_frames); #endif STp->first_frame_position = STp->last_frame_position; @@ -2462,55 +2659,61 @@ /* Set the tape block */ -static int osst_set_frame_position(OS_Scsi_Tape *STp, Scsi_Request ** aSRpnt, int block, int skip) +static int osst_set_frame_position(OS_Scsi_Tape *STp, Scsi_Request ** aSRpnt, int ppos, int skip) { unsigned char scmd[MAX_COMMAND_SIZE]; Scsi_Request * SRpnt; ST_partstat * STps; int result = 0; - int timeout; + int pp = (ppos == 3000 && !skip)? 0 : ppos; int dev = TAPE_NR(STp->devt); if (STp->ready != ST_READY) return (-EIO); - timeout = STp->long_timeout; STps = &(STp->ps[STp->partition]); - if (block < 0 || block > STp->capacity) { - printk(KERN_ERR "osst%d: Reposition request %d out of range\n", dev, block); - block = block < 0 ? 0 : (STp->capacity - 1); + if (ppos < 0 || ppos > STp->capacity) { + printk(KERN_WARNING "osst%d:W: Reposition request %d out of range\n", dev, ppos); + pp = ppos = ppos < 0 ? 0 : (STp->capacity - 1); result = (-EINVAL); } + + do { #if DEBUG - if (debugging) - printk(OSST_DEB_MSG "osst%d: Setting block to %d.\n", dev, block); + if (debugging) + printk(OSST_DEB_MSG "osst%d:D: Setting ppos to %d.\n", dev, pp); #endif - memset (scmd, 0, MAX_COMMAND_SIZE); - scmd[0] = SEEK_10; - scmd[1] = 1; - scmd[3] = (block >> 24); - scmd[4] = (block >> 16); - scmd[5] = (block >> 8); - scmd[6] = block; - if (skip) - scmd[9] = 0x80; + memset (scmd, 0, MAX_COMMAND_SIZE); + scmd[0] = SEEK_10; + scmd[1] = 1; + scmd[3] = (pp >> 24); + scmd[4] = (pp >> 16); + scmd[5] = (pp >> 8); + scmd[6] = pp; + if (skip) + scmd[9] = 0x80; - SRpnt = osst_do_scsi(*aSRpnt, STp, scmd, 0, SCSI_DATA_NONE, timeout, MAX_READY_RETRIES, TRUE); - if (!SRpnt) - return (-EBUSY); - *aSRpnt = SRpnt; + SRpnt = osst_do_scsi(*aSRpnt, STp, scmd, 0, SCSI_DATA_NONE, STp->long_timeout, + MAX_READY_RETRIES, TRUE); + if (!SRpnt) + return (-EBUSY); + *aSRpnt = SRpnt; - STp->first_frame_position = STp->last_frame_position = block; - STps->eof = ST_NOEOF; - if ((STp->buffer)->syscall_result != 0) { + if ((STp->buffer)->syscall_result != 0) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: SEEK command failed.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: SEEK command from %d to %d failed.\n", + dev, STp->first_frame_position, pp); #endif - result = (-EIO); - } + result = (-EIO); + } + if (pp != ppos) + osst_wait_ready(STp, aSRpnt, 5 * 60); + } while ((pp != ppos) && (pp = ppos)); + STp->first_frame_position = STp->last_frame_position = ppos; + STps->eof = ST_NOEOF; STps->at_sm = 0; STps->rw = ST_IDLE; - STp->logical_blk_in_buffer = 0; + STp->frame_in_buffer = 0; return result; } @@ -2519,7 +2722,7 @@ /* osst versions of st functions - augmented and stripped to suit OnStream only */ /* Flush the write buffer (never need to write if variable blocksize). */ -static int osst_flush_write_buffer(OS_Scsi_Tape *STp, Scsi_Request ** aSRpnt, int file_blk) +static int osst_flush_write_buffer(OS_Scsi_Tape *STp, Scsi_Request ** aSRpnt) { int offset, transfer, blks = 0; int result = 0; @@ -2532,19 +2735,19 @@ if (SRpnt == (STp->buffer)->last_SRpnt) #if DEBUG { printk(OSST_DEB_MSG - "osst%d: aSRpnt points to Scsi_Request that write_behind_check will release -- cleared\n", dev); + "osst%d:D: aSRpnt points to Scsi_Request that write_behind_check will release -- cleared\n", dev); #endif *aSRpnt = SRpnt = NULL; #if DEBUG } else if (SRpnt) printk(OSST_DEB_MSG - "osst%d: aSRpnt does not point to Scsi_Request that write_behind_check will release -- strange\n", dev); + "osst%d:D: aSRpnt does not point to Scsi_Request that write_behind_check will release -- strange\n", dev); #endif osst_write_behind_check(STp); if ((STp->buffer)->syscall_result) { #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Async write error (flush) %x.\n", + printk(OSST_DEB_MSG "osst%d:D: Async write error (flush) %x.\n", dev, (STp->buffer)->midlevel_result); #endif if ((STp->buffer)->midlevel_result == INT_MAX) @@ -2556,15 +2759,13 @@ result = 0; if (STp->dirty == 1) { + STp->write_count++; + STps = &(STp->ps[STp->partition]); + STps->rw = ST_WRITING; offset = STp->buffer->buffer_bytes; + blks = (offset + STp->block_size - 1) / STp->block_size; transfer = OS_FRAME_SIZE; - blks = 1; -#if DEBUG - if (debugging) - printk(OSST_DEB_MSG "osst%d: Flushing %d bytes, Tranfering %d bytes in %d blocks.\n", - dev, offset, transfer, blks); -#endif if (offset < OS_DATA_SIZE) osst_zero_buffer_tail(STp->buffer); @@ -2575,7 +2776,38 @@ memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = WRITE_6; cmd[1] = 1; - cmd[4] = blks; + cmd[4] = 1; + + switch (STp->write_type) { + case OS_WRITE_DATA: +#if DEBUG + if (debugging) + printk(OSST_DEB_MSG "osst%d:D: Writing %d blocks to frame %d, lblks %d-%d\n", + dev, blks, STp->frame_seq_number, + STp->logical_blk_num - blks, STp->logical_blk_num - 1); +#endif + osst_init_aux(STp, OS_FRAME_TYPE_DATA, STp->frame_seq_number++, + STp->logical_blk_num - blks, STp->block_size, blks); + break; + case OS_WRITE_EOD: + osst_init_aux(STp, OS_FRAME_TYPE_EOD, STp->frame_seq_number++, + STp->logical_blk_num, 0, 0); + break; + case OS_WRITE_NEW_MARK: + osst_init_aux(STp, OS_FRAME_TYPE_MARKER, STp->frame_seq_number++, + STp->logical_blk_num++, 0, blks=1); + break; + case OS_WRITE_HEADER: + osst_init_aux(STp, OS_FRAME_TYPE_HEADER, 0, 0, 0, blks=0); + break; + default: /* probably FILLER */ + osst_init_aux(STp, OS_FRAME_TYPE_FILL, 0, 0, 0, 0); + } +#if DEBUG + if (debugging) + printk(OSST_DEB_MSG "osst%d:D: Flushing %d bytes, Transfering %d bytes in %d lblocks.\n", + dev, offset, transfer, blks); +#endif SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, transfer, SCSI_DATA_WRITE, STp->timeout, MAX_WRITE_RETRIES, TRUE); @@ -2583,12 +2815,13 @@ if (!SRpnt) return (-EBUSY); - STps = &(STp->ps[STp->partition]); if ((STp->buffer)->syscall_result != 0) { +#if DEBUG printk(OSST_DEB_MSG - "osst%d: write sense [0]=0x%02x [2]=%02x [12]=%02x [13]=%02x\n", + "osst%d:D: write sense [0]=0x%02x [2]=%02x [12]=%02x [13]=%02x\n", dev, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); +#endif if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && (SRpnt->sr_sense_buffer[2] & 0x40) && /* FIXME - SC-30 drive doesn't assert EOM bit */ (SRpnt->sr_sense_buffer[2] & 0x0f) == NO_SENSE) { @@ -2598,22 +2831,20 @@ } else { if (osst_write_error_recovery(STp, aSRpnt, 1)) { - printk(KERN_ERR "osst%d: Error on flush.\n", dev); + printk(KERN_ERR "osst%d:E: Error on flush write.\n", dev); result = (-EIO); } } STps->drv_block = (-1); } else { - if (file_blk && STps->drv_block >= 0) - STps->drv_block += blks; - STp->first_frame_position += blks; + STp->first_frame_position++; STp->dirty = 0; (STp->buffer)->buffer_bytes = 0; } } #if DEBUG - printk(OSST_DEB_MSG "osst%d: Exit flush write buffer with code %d\n", dev, result); + printk(OSST_DEB_MSG "osst%d:D: Exit flush write buffer with code %d\n", dev, result); #endif return result; } @@ -2623,15 +2854,12 @@ seek_next is true. */ static int osst_flush_buffer(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int seek_next) { - int backspace, result; - OSST_buffer * STbuffer; - ST_partstat * STps; + ST_partstat * STps; + int backspace = 0, result = 0; #if DEBUG int dev = TAPE_NR(STp->devt); #endif - STbuffer = STp->buffer; - /* * If there was a bus reset, block further access * to this device. @@ -2644,19 +2872,23 @@ STps = &(STp->ps[STp->partition]); if (STps->rw == ST_WRITING) /* Writing */ - return osst_flush_write_buffer(STp, aSRpnt, 1); + return osst_flush_write_buffer(STp, aSRpnt); if (STp->block_size == 0) return 0; #if DEBUG - printk(OSST_DEB_MSG "osst%i: Reached flush (read) buffer\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Reached flush (read) buffer\n", dev); #endif - backspace = ((STp->buffer)->buffer_bytes + (STp->buffer)->read_pointer) / STp->block_size - - ((STp->buffer)->read_pointer + STp->block_size - 1 ) / STp->block_size ; - (STp->buffer)->buffer_bytes = 0; - (STp->buffer)->read_pointer = 0; - result = 0; + + if (!STp->can_bsr) { + backspace = ((STp->buffer)->buffer_bytes + (STp->buffer)->read_pointer) / STp->block_size - + ((STp->buffer)->read_pointer + STp->block_size - 1 ) / STp->block_size ; + (STp->buffer)->buffer_bytes = 0; + (STp->buffer)->read_pointer = 0; + STp->frame_in_buffer = 0; /* FIXME is this relevant w. OSST? */ + } + if (!seek_next) { if (STps->eof == ST_FM_HIT) { result = cross_eof(STp, aSRpnt, FALSE); /* Back over the EOF hit */ @@ -2681,6 +2913,88 @@ return result; } +static int osst_write_frame(OS_Scsi_Tape * STp, Scsi_Request ** aSRpnt, int synchronous) +{ + unsigned char cmd[MAX_COMMAND_SIZE]; + Scsi_Request * SRpnt; + int blks; +#if DEBUG + int dev = TAPE_NR(STp->devt); +#endif + + if ((!STp-> raw) && (STp->first_frame_position == 0xbae)) { /* _must_ preserve buffer! */ +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Reaching config partition.\n", dev); +#endif + if (osst_flush_drive_buffer(STp, aSRpnt) < 0) { + return (-EIO); + } + /* error recovery may have bumped us past the header partition */ + if (osst_get_frame_position(STp, aSRpnt) < 0xbb8) { +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Skipping over config partition.\n", dev); +#endif + osst_position_tape_and_confirm(STp, aSRpnt, 0xbb8); + } + } + + if (STp->poll) + osst_wait_frame (STp, aSRpnt, STp->first_frame_position, -50, 60); + /* TODO: Check for an error ! */ + +// osst_build_stats(STp, &SRpnt); + + STp->ps[STp->partition].rw = ST_WRITING; + STp->write_type = OS_WRITE_DATA; + + memset(cmd, 0, MAX_COMMAND_SIZE); + cmd[0] = WRITE_6; + cmd[1] = 1; + cmd[4] = 1; /* one frame at a time... */ + blks = STp->buffer->buffer_bytes / STp->block_size; +#if DEBUG + if (debugging) + printk(OSST_DEB_MSG "osst%d:D: Writing %d blocks to frame %d, lblks %d-%d\n", dev, blks, + STp->frame_seq_number, STp->logical_blk_num - blks, STp->logical_blk_num - 1); +#endif + osst_init_aux(STp, OS_FRAME_TYPE_DATA, STp->frame_seq_number++, + STp->logical_blk_num - blks, STp->block_size, blks); + +#if DEBUG + if (!synchronous) + STp->write_pending = 1; +#endif + SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, OS_FRAME_SIZE, SCSI_DATA_WRITE, STp->timeout, + MAX_WRITE_RETRIES, synchronous); + if (!SRpnt) + return (-EBUSY); + *aSRpnt = SRpnt; + + if (synchronous) { + if (STp->buffer->syscall_result != 0) { +#if DEBUG + if (debugging) + printk(OSST_DEB_MSG "osst%d:D: Error on write:\n", dev); +#endif + if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x40)) { + if ((SRpnt->sr_sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW) + return (-ENOSPC); + } + else { + if (osst_write_error_recovery(STp, aSRpnt, 1)) + return (-EIO); + } + } + else + STp->first_frame_position++; + } + + STp->write_count++; + + return 0; +} + /* Entry points to osst */ @@ -2692,7 +3006,6 @@ ssize_t i, do_count, blks, transfer; int write_threshold; int doing_write = 0; - unsigned char cmd[MAX_COMMAND_SIZE]; const char *b_point; Scsi_Request * SRpnt = NULL; OS_Scsi_Tape * STp; @@ -2748,7 +3061,7 @@ #if DEBUG if (!STp->in_use) { - printk(OSST_DEB_MSG "osst%d: Incorrect device.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Incorrect device.\n", dev); retval = (-EIO); goto out; } @@ -2761,14 +3074,15 @@ /* Write must be integral number of blocks */ if (STp->block_size != 0 && (count % STp->block_size) != 0) { - printk(KERN_WARNING "osst%d: Write (%ld bytes) not multiple of tape block size (32k).\n", - dev, (unsigned long)count); + printk(KERN_ERR "osst%d:E: Write (%ld bytes) not multiple of tape block size (%d%c).\n", + dev, (unsigned long)count, STp->block_size<1024? + STp->block_size:STp->block_size/1024, STp->block_size<1024?'b':'k'); retval = (-EINVAL); goto out; } - if (STp->first_frame_position >= STp->capacity - 164) { - printk(KERN_WARNING "osst%d: Write truncated at EOM early warning (frame %d).\n", + if (STp->first_frame_position >= STp->capacity - OSST_EOM_RESERVE) { + printk(KERN_ERR "osst%d:E: Write truncated at EOM early warning (frame %d).\n", dev, STp->first_frame_position); retval = (-ENOSPC); goto out; @@ -2789,46 +3103,49 @@ } else if (STps->rw != ST_WRITING) { /* Are we totally rewriting this tape? */ - if (!STp->header_ok || STp->first_frame_position == STp->first_data_ppos || - (STps->drv_file == 0 && STps->drv_block == 0)) { + if (!STp->header_ok || + (STp->first_frame_position == STp->first_data_ppos && STps->drv_block < 0) || + (STps->drv_file == 0 && STps->drv_block == 0)) { STp->wrt_pass_cntr++; #if DEBUG - printk(OSST_DEB_MSG "osst%d: Allocating next write pass counter: %d\n", + printk(OSST_DEB_MSG "osst%d:D: Allocating next write pass counter: %d\n", dev, STp->wrt_pass_cntr); #endif osst_reset_header(STp, &SRpnt); - STps->drv_file = STps->drv_block = STp->logical_blk_num = 0; + STps->drv_file = STps->drv_block = 0; } /* Do we know where we'll be writing on the tape? */ else { if ((STp->fast_open && osst_verify_position(STp, &SRpnt)) || STps->drv_file < 0 || STps->drv_block < 0) { - if (STp->first_frame_position == STp->eod_frame_ppos) { + if (STp->first_frame_position == STp->eod_frame_ppos) { /* at EOD */ STps->drv_file = STp->filemark_cnt; STps->drv_block = 0; } else { /* We have no idea where the tape is positioned - give up */ #if DEBUG - printk(OSST_DEB_MSG "osst%d: Cannot write at indeterminate position.\n", dev); + printk(OSST_DEB_MSG + "osst%d:D: Cannot write at indeterminate position.\n", dev); #endif retval = (-EIO); goto out; } } - if (STps->drv_file > 0 && STps->drv_file < STp->filemark_cnt) { + if ((STps->drv_file + STps->drv_block) > 0 && STps->drv_file < STp->filemark_cnt) { STp->filemark_cnt = STps->drv_file; - STp->last_mark_ppos = ntohl(STp->header_cache->dat_fm_tab.fm_tab_ent[STp->filemark_cnt-1]); + STp->last_mark_ppos = + ntohl(STp->header_cache->dat_fm_tab.fm_tab_ent[STp->filemark_cnt-1]); printk(KERN_WARNING - "osst%d: Overwriting file %d with old write pass counter %d\n", + "osst%d:W: Overwriting file %d with old write pass counter %d\n", dev, STps->drv_file, STp->wrt_pass_cntr); printk(KERN_WARNING - "osst%d: may lead to stale data being accepted on reading back!\n", + "osst%d:W: may lead to stale data being accepted on reading back!\n", dev); #if DEBUG printk(OSST_DEB_MSG - "osst%d: resetting filemark count to %d and last mark ppos to %d\n", - dev, STp->filemark_cnt, STp->last_mark_ppos); + "osst%d:D: resetting filemark count to %d and last mark ppos,lbn to %d,%d\n", + dev, STp->filemark_cnt, STp->last_mark_ppos, STp->last_mark_lbn); #endif } } @@ -2836,19 +3153,19 @@ } if (!STp->header_ok) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Write cannot proceed without valid headers\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Write cannot proceed without valid headers\n", dev); #endif retval = (-EIO); goto out; } if ((STp->buffer)->writing) { -if (SRpnt) printk(KERN_ERR "osst%d: Not supposed to have SRpnt at line %d\n", dev, __LINE__); +if (SRpnt) printk(KERN_ERR "osst%d:A: Not supposed to have SRpnt at line %d\n", dev, __LINE__); osst_write_behind_check(STp); if ((STp->buffer)->syscall_result) { #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Async write error (write) %x.\n", dev, + printk(OSST_DEB_MSG "osst%d:D: Async write error (write) %x.\n", dev, (STp->buffer)->midlevel_result); #endif if ((STp->buffer)->midlevel_result == INT_MAX) @@ -2875,10 +3192,6 @@ } if (!STm->do_buffer_writes) { -#if 0 - if (STp->block_size != 0 && (count % STp->block_size) != 0) - {retval=(-EIO);goto out;} /* Write must be integral number of blocks */ -#endif write_threshold = 1; } else @@ -2887,37 +3200,12 @@ write_threshold--; total = count; - - if ((!STp-> raw) && (STp->first_frame_position == 0xbae)) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Skipping over config partition.\n", dev); -#endif - if (osst_flush_drive_buffer(STp, &SRpnt) < 0) { - retval = (-EIO); - goto out; - } - /* error recovery may have bumped us past the header partition */ - if (osst_get_frame_position(STp, &SRpnt) < 0xbb8) - osst_position_tape_and_confirm(STp, &SRpnt, 0xbb8); - } - - if (STp->poll) - retval = osst_wait_frame (STp, &SRpnt, STp->first_frame_position, -50, 60); - /* TODO: Check for an error ! */ - - memset(cmd, 0, MAX_COMMAND_SIZE); - cmd[0] = WRITE_6; - cmd[1] = 1; - - STps->rw = ST_WRITING; - STp->write_type = OS_WRITE_DATA; - -#if DEBUG - printk(OSST_DEB_MSG "osst%d: Writing %d bytes to file %d block %d lblk %d frame %d\n", - dev, count, STps->drv_file, STps->drv_block, - STp->logical_blk_num, STp->first_frame_position); + if (debugging) + printk(OSST_DEB_MSG "osst%d:D: Writing %d bytes to file %d block %d lblk %d fseq %d fppos %d\n", + dev, count, STps->drv_file, STps->drv_block, + STp->logical_blk_num, STp->frame_seq_number, STp->first_frame_position); #endif - b_point = buf; while ((STp->buffer)->buffer_bytes + count > write_threshold) { @@ -2933,85 +3221,62 @@ goto out; } - transfer = OS_FRAME_SIZE; - blks = 1; - - osst_init_aux(STp, OS_FRAME_TYPE_DATA, STp->logical_blk_num++ ); - - cmd[2] = blks >> 16; - cmd[3] = blks >> 8; - cmd[4] = blks; - - SRpnt = osst_do_scsi(SRpnt, STp, cmd, transfer, SCSI_DATA_WRITE, - STp->timeout, MAX_WRITE_RETRIES, TRUE); - if (!SRpnt) { - retval = (STp->buffer)->syscall_result; - goto out; - } + blks = do_count / STp->block_size; + STp->logical_blk_num += blks; /* logical_blk_num is incremented as data is moved from user */ + + i = osst_write_frame(STp, &SRpnt, TRUE); - if ((STp->buffer)->syscall_result != 0) { -#if DEBUG - if (debugging) - printk(OSST_DEB_MSG "osst%d: Error on write:\n", dev); -#endif - if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && - (SRpnt->sr_sense_buffer[2] & 0x40)) { - if ((SRpnt->sr_sense_buffer[0] & 0x80) != 0) - transfer = (SRpnt->sr_sense_buffer[3] << 24) | - (SRpnt->sr_sense_buffer[4] << 16) | - (SRpnt->sr_sense_buffer[5] << 8) | - SRpnt->sr_sense_buffer[6]; - else - transfer = 0; - transfer *= STp->block_size; - if (transfer <= do_count) { - filp->f_pos += do_count - transfer; - count -= do_count - transfer; - if (STps->drv_block >= 0) { - STps->drv_block += (do_count - transfer) / STp->block_size; - } - STps->eof = ST_EOM_OK; - retval = (-ENOSPC); /* EOM within current request */ -#if DEBUG - if (debugging) - printk(OSST_DEB_MSG "osst%d: EOM with %d bytes unwritten.\n", - dev, transfer); -#endif + if (i == (-ENOSPC)) { + transfer = STp->buffer->writing; /* FIXME -- check this logic */ + if (transfer <= do_count) { + filp->f_pos += do_count - transfer; + count -= do_count - transfer; + if (STps->drv_block >= 0) { + STps->drv_block += (do_count - transfer) / STp->block_size; } - else { - STps->eof = ST_EOM_ERROR; - STps->drv_block = (-1); /* Too cautious? */ - retval = (-EIO); /* EOM for old data */ + STps->eof = ST_EOM_OK; + retval = (-ENOSPC); /* EOM within current request */ #if DEBUG - if (debugging) - printk(OSST_DEB_MSG "osst%d: EOM with lost data.\n", dev); + if (debugging) + printk(OSST_DEB_MSG "osst%d:D: EOM with %d bytes unwritten.\n", + dev, transfer); #endif - } } else { - if (osst_write_error_recovery(STp, &SRpnt, 1) == 0) goto ok; - STps->drv_block = (-1); /* Too cautious? */ - retval = (-EIO); + STps->eof = ST_EOM_ERROR; + STps->drv_block = (-1); /* Too cautious? */ + retval = (-EIO); /* EOM for old data */ +#if DEBUG + if (debugging) + printk(OSST_DEB_MSG "osst%d:D: EOM with lost data.\n", dev); +#endif } - - (STp->buffer)->buffer_bytes = 0; + } + else + retval = i; + + if (retval < 0) { + if (SRpnt != NULL) { + scsi_release_request(SRpnt); + SRpnt = NULL; + } + STp->buffer->buffer_bytes = 0; STp->dirty = 0; if (count < total) retval = total - count; goto out; } - STp->first_frame_position++; -ok: + filp->f_pos += do_count; b_point += do_count; count -= do_count; if (STps->drv_block >= 0) { STps->drv_block += blks; } - STp->first_frame_position += blks; - (STp->buffer)->buffer_bytes = 0; + STp->buffer->buffer_bytes = 0; STp->dirty = 0; - } + } /* end while write threshold exceeded */ + if (count != 0) { STp->dirty = 1; i = append_to_buffer(b_point, STp->buffer, count); @@ -3019,6 +3284,11 @@ retval = i; goto out; } + blks = count / STp->block_size; + STp->logical_blk_num += blks; + if (STps->drv_block >= 0) { + STps->drv_block += blks; + } filp->f_pos += count; count = 0; } @@ -3028,41 +3298,23 @@ goto out; } - if (STm->do_async_writes && - ((STp->buffer)->buffer_bytes >= STp->write_threshold && - (STp->buffer)->buffer_bytes >= OS_DATA_SIZE) ) { + if (STm->do_async_writes && ((STp->buffer)->buffer_bytes >= STp->write_threshold)) { /* Schedule an asynchronous write */ (STp->buffer)->writing = ((STp->buffer)->buffer_bytes / STp->block_size) * STp->block_size; STp->dirty = !((STp->buffer)->writing == (STp->buffer)->buffer_bytes); - transfer = OS_FRAME_SIZE; - blks = 1; - - osst_init_aux(STp, OS_FRAME_TYPE_DATA, STp->logical_blk_num++ ); - - cmd[2] = blks >> 16; - cmd[3] = blks >> 8; - cmd[4] = blks; -#if DEBUG - STp->write_pending = 1; -#endif - - SRpnt = osst_do_scsi(SRpnt, STp, cmd, transfer, SCSI_DATA_WRITE, - STp->timeout, MAX_WRITE_RETRIES, FALSE); - if (SRpnt == NULL) { - retval = (STp->buffer)->syscall_result; + i = osst_write_frame(STp, &SRpnt, FALSE); + if (i < 0) { + retval = (-EIO); goto out; } + SRpnt = NULL; /* Prevent releasing this request! */ } -// else if (SRpnt != NULL) { -// scsi_release_request(SRpnt); /* FIXME -- this relesae no longer in st - why? */ - SRpnt = NULL; /* Prevent releasing this request! */ -// } STps->at_sm &= (total == 0); if (total > 0) - STps->eof = ST_NOEOF; + STps->eof = ST_NOEOF; retval = total; @@ -3124,7 +3376,7 @@ } #if DEBUG if (!STp->in_use) { - printk(OSST_DEB_MSG "osst%d: Incorrect device.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Incorrect device.\n", dev); retval = (-EIO); goto out; } @@ -3135,13 +3387,6 @@ goto out; } - if ((count % STp->block_size) != 0) { - printk(KERN_WARNING "osst%d: Use multiple of %d bytes as block size (%ld requested)\n", - dev, STp->block_size, (unsigned long) count); - retval = (-EINVAL); /* Read must be integral number of blocks */ - goto out; - } - if (STp->do_auto_lock && STp->door_locked == ST_UNLOCKED && !osst_int_ioctl(STp, &SRpnt, MTLOCK, 0)) STp->door_locked = ST_LOCKED_AUTO; @@ -3154,9 +3399,15 @@ STps->rw = ST_IDLE; } + if ((count % STp->block_size) != 0) { + printk(KERN_WARNING + "osst%d:W: Read (%d bytes) not multiple of tape block size (%d%c).\n", dev, count, + STp->block_size<1024?STp->block_size:STp->block_size/1024, STp->block_size<1024?'b':'k'); + } + #if DEBUG if (debugging && STps->eof != ST_NOEOF) - printk(OSST_DEB_MSG "osst%d: EOF/EOM flag up (%d). Bytes %d\n", dev, + printk(OSST_DEB_MSG "osst%d:D: EOF/EOM flag up (%d). Bytes %d\n", dev, STps->eof, (STp->buffer)->buffer_bytes); #endif if ((STp->buffer)->buffer_bytes == 0 && @@ -3181,41 +3432,51 @@ } /* Loop until enough data in buffer or a special condition found */ - for (total = 0, special = 0; total < count && !special; ) { + for (total = 0, special = 0; total < count - STp->block_size + 1 && !special; ) { /* Get new data if the buffer is empty */ if ((STp->buffer)->buffer_bytes == 0) { - special = osst_get_logical_blk(STp, &SRpnt, STp->logical_blk_num, 0); - STp->buffer->buffer_bytes = special ? 0 : OS_DATA_SIZE; - STp->buffer->read_pointer = 0; - STp->logical_blk_num++; /* block to look for next time */ - STp->logical_blk_in_buffer = 0; + if (STps->eof == ST_FM_HIT) + break; + special = osst_get_logical_frame(STp, &SRpnt, STp->frame_seq_number, 0); if (special < 0) { /* No need to continue read */ + STp->frame_in_buffer = 0; retval = special; goto out; } - STps->drv_block++; } /* Move the data from driver buffer to user buffer */ if ((STp->buffer)->buffer_bytes > 0) { #if DEBUG if (debugging && STps->eof != ST_NOEOF) - printk(OSST_DEB_MSG "osst%d: EOF up (%d). Left %d, needed %d.\n", dev, + printk(OSST_DEB_MSG "osst%d:D: EOF up (%d). Left %d, needed %d.\n", dev, STps->eof, (STp->buffer)->buffer_bytes, count - total); #endif - transfer = (STp->buffer)->buffer_bytes < count - total ? - (STp->buffer)->buffer_bytes : count - total; + transfer = (((STp->buffer)->buffer_bytes < count - total ? + (STp->buffer)->buffer_bytes : count - total)/ + STp->block_size) * STp->block_size; /* force multiple of block size */ i = from_buffer(STp->buffer, buf, transfer); if (i) { retval = i; goto out; } - filp->f_pos += transfer; - buf += transfer; - total += transfer; + STp->logical_blk_num += transfer / STp->block_size; + STps->drv_block += transfer / STp->block_size; + filp->f_pos += transfer; + buf += transfer; + total += transfer; + } + + if ((STp->buffer)->buffer_bytes == 0) { +#if DEBUG + if (debugging) + printk(OSST_DEB_MSG "osst%d:D: Finished with frame %d\n", + dev, STp->frame_seq_number); +#endif + STp->frame_in_buffer = 0; + STp->frame_seq_number++; /* frame to look for next time */ } - } /* for (total = 0, special = 0; total < count && !special; ) */ /* Change the eof state if no data from tape or buffer */ @@ -3253,21 +3514,21 @@ static void osst_log_options(OS_Scsi_Tape *STp, ST_mode *STm, int dev) { printk(KERN_INFO -"osst%d: Mode %d options: buffer writes: %d, async writes: %d, read ahead: %d\n", +"osst%d:I: Mode %d options: buffer writes: %d, async writes: %d, read ahead: %d\n", dev, STp->current_mode, STm->do_buffer_writes, STm->do_async_writes, STm->do_read_ahead); printk(KERN_INFO -"osst%d: can bsr: %d, two FMs: %d, fast mteom: %d, auto lock: %d,\n", +"osst%d:I: can bsr: %d, two FMs: %d, fast mteom: %d, auto lock: %d,\n", dev, STp->can_bsr, STp->two_fm, STp->fast_mteom, STp->do_auto_lock); printk(KERN_INFO -"osst%d: defs for wr: %d, no block limits: %d, partitions: %d, s2 log: %d\n", +"osst%d:I: defs for wr: %d, no block limits: %d, partitions: %d, s2 log: %d\n", dev, STm->defaults_for_writes, STp->omit_blklims, STp->can_partitions, STp->scsi2_logical); printk(KERN_INFO -"osst%d: sysv: %d\n", dev, STm->sysv); +"osst%d:I: sysv: %d\n", dev, STm->sysv); #if DEBUG printk(KERN_INFO - "osst%d: debugging: %d\n", + "osst%d:D: debugging: %d\n", dev, debugging); #endif } @@ -3286,7 +3547,7 @@ modes_defined = TRUE; #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Initialized mode %d definition from mode 0\n", + printk(OSST_DEB_MSG "osst%d:D: Initialized mode %d definition from mode 0\n", dev, STp->current_mode); #endif } @@ -3347,23 +3608,28 @@ else if (code == MT_ST_WRITE_THRESHOLD) { value = (options & ~MT_ST_OPTIONS) * ST_KILOBYTE; if (value < 1 || value > osst_buffer_size) { - printk(KERN_WARNING "osst%d: Write threshold %d too small or too large.\n", + printk(KERN_WARNING "osst%d:W: Write threshold %d too small or too large.\n", dev, value); return (-EIO); } STp->write_threshold = value; - printk(KERN_INFO "osst%d: Write threshold set to %d bytes.\n", + printk(KERN_INFO "osst%d:I: Write threshold set to %d bytes.\n", dev, value); } else if (code == MT_ST_DEF_BLKSIZE) { value = (options & ~MT_ST_OPTIONS); if (value == ~MT_ST_OPTIONS) { STm->default_blksize = (-1); - printk(KERN_INFO "osst%d: Default block size disabled.\n", dev); + printk(KERN_INFO "osst%d:I: Default block size disabled.\n", dev); } else { + if (value < 512 || value > OS_DATA_SIZE || OS_DATA_SIZE % value) { + printk(KERN_WARNING "osst%d:W: Default block size cannot be set to %d.\n", + dev, value); + return (-EINVAL); + } STm->default_blksize = value; - printk(KERN_INFO "osst%d: Default block size set to %d bytes.\n", + printk(KERN_INFO "osst%d:I: Default block size set to %d bytes.\n", dev, STm->default_blksize); } } @@ -3371,12 +3637,12 @@ value = (options & ~MT_ST_OPTIONS); if ((value & MT_ST_SET_LONG_TIMEOUT) != 0) { STp->long_timeout = (value & ~MT_ST_SET_LONG_TIMEOUT) * HZ; - printk(KERN_INFO "osst%d: Long timeout set to %d seconds.\n", dev, + printk(KERN_INFO "osst%d:I: Long timeout set to %d seconds.\n", dev, (value & ~MT_ST_SET_LONG_TIMEOUT)); } else { STp->timeout = value * HZ; - printk(KERN_INFO "osst%d: Normal timeout set to %d seconds.\n", dev, value); + printk(KERN_INFO "osst%d:I: Normal timeout set to %d seconds.\n", dev, value); } } else if (code == MT_ST_DEF_OPTIONS) { @@ -3385,33 +3651,33 @@ if (code == MT_ST_DEF_DENSITY) { if (value == MT_ST_CLEAR_DEFAULT) { STm->default_density = (-1); - printk(KERN_INFO "osst%d: Density default disabled.\n", dev); + printk(KERN_INFO "osst%d:I: Density default disabled.\n", dev); } else { STm->default_density = value & 0xff; - printk(KERN_INFO "osst%d: Density default set to %x\n", + printk(KERN_INFO "osst%d:I: Density default set to %x\n", dev, STm->default_density); } } else if (code == MT_ST_DEF_DRVBUFFER) { if (value == MT_ST_CLEAR_DEFAULT) { STp->default_drvbuffer = 0xff; - printk(KERN_INFO "osst%d: Drive buffer default disabled.\n", dev); + printk(KERN_INFO "osst%d:I: Drive buffer default disabled.\n", dev); } else { STp->default_drvbuffer = value & 7; - printk(KERN_INFO "osst%d: Drive buffer default set to %x\n", + printk(KERN_INFO "osst%d:I: Drive buffer default set to %x\n", dev, STp->default_drvbuffer); } } else if (code == MT_ST_DEF_COMPRESSION) { if (value == MT_ST_CLEAR_DEFAULT) { STm->default_compression = ST_DONT_TOUCH; - printk(KERN_INFO "osst%d: Compression default disabled.\n", dev); + printk(KERN_INFO "osst%d:I: Compression default disabled.\n", dev); } else { STm->default_compression = (value & 1 ? ST_YES : ST_NO); - printk(KERN_INFO "osst%d: Compression default set to %x\n", + printk(KERN_INFO "osst%d:I: Compression default set to %x\n", dev, (value & 1)); } } @@ -3433,7 +3699,7 @@ unsigned char cmd[MAX_COMMAND_SIZE]; Scsi_Request * SRpnt = * aSRpnt; ST_partstat * STps; - int fileno, blkno, at_sm, logical_blk_num; + int fileno, blkno, at_sm, frame_seq_numbr, logical_blk_num; int datalen = 0, direction = SCSI_DATA_NONE; int dev = TAPE_NR(STp->devt); @@ -3448,6 +3714,7 @@ fileno = STps->drv_file; blkno = STps->drv_block; at_sm = STps->at_sm; + frame_seq_numbr = STp->frame_seq_number; logical_blk_num = STp->logical_blk_num; memset(cmd, 0, MAX_COMMAND_SIZE); @@ -3461,7 +3728,6 @@ ioctl_result = osst_space_over_filemarks_forward_fast(STp, &SRpnt, cmd_in, arg); else ioctl_result = osst_space_over_filemarks_forward_slow(STp, &SRpnt, cmd_in, arg); - logical_blk_num = STp->logical_blk_num; if (fileno >= 0) fileno += arg; blkno = 0; @@ -3474,7 +3740,6 @@ if (STp->raw) return (-EIO); ioctl_result = osst_space_over_filemarks_backward(STp, &SRpnt, cmd_in, arg); - logical_blk_num = STp->logical_blk_num; if (fileno >= 0) fileno -= arg; blkno = (-1); /* We can't know the block number */ @@ -3485,7 +3750,7 @@ case MTBSR: #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%i: Skipping %lu blocks %s from logical block %d\n", + printk(OSST_DEB_MSG "osst%d:D: Skipping %lu blocks %s from logical block %d\n", dev, arg, cmd_in==MTFSR?"forward":"backward", logical_blk_num); #endif if (cmd_in == MTFSR) { @@ -3496,8 +3761,9 @@ logical_blk_num -= arg; if (blkno >= 0) blkno -= arg; } - ioctl_result = osst_seek_logical_blk(STp, &SRpnt, logical_blk_num-1); - STp->logical_blk_in_buffer = 0; + ioctl_result = osst_seek_logical_blk(STp, &SRpnt, logical_blk_num); + fileno = STps->drv_file; + blkno = STps->drv_block; at_sm &= (arg == 0); goto os_bypass; @@ -3509,7 +3775,7 @@ cmd[4] = arg; #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Spacing tape forward %d setmarks.\n", dev, + printk(OSST_DEB_MSG "osst%d:D: Spacing tape forward %d setmarks.\n", dev, cmd[2] * 65536 + cmd[3] * 256 + cmd[4]); #endif if (arg != 0) { @@ -3528,33 +3794,32 @@ if (debugging) { if (cmd[2] & 0x80) ltmp = 0xff000000; - ltmp = ltmp | (cmd[2] << 16) | (cmd[3] << 8) | cmd[4]; - printk(OSST_DEB_MSG "osst%d: Spacing tape backward %ld setmarks.\n", + ltmp = ltmp | (cmd[2] << 16) | (cmd[3] << 8) | cmd[4]; + printk(OSST_DEB_MSG "osst%d:D: Spacing tape backward %ld setmarks.\n", dev, (-ltmp)); } #endif if (arg != 0) { blkno = fileno = (-1); - at_sm = 1; + at_sm = 1; } break; case MTWEOF: if ( STps->rw == ST_WRITING && !(STp->device)->was_reset) - ioctl_result = osst_flush_write_buffer(STp, &SRpnt, 1); + ioctl_result = osst_flush_write_buffer(STp, &SRpnt); else - ioctl_result = 0; + ioctl_result = 0; for (i=0; ilogical_blk_num; + ioctl_result |= osst_write_filemark(STp, &SRpnt); if (fileno >= 0) fileno += arg; if (blkno >= 0) blkno = 0; goto os_bypass; case MTWSM: if (STp->write_prot) - return (-EACCES); + return (-EACCES); if (!STp->raw) - return 0; + return 0; cmd[0] = WRITE_FILEMARKS; /* FIXME -- need OS version */ if (cmd_in == MTWSM) cmd[1] = 2; @@ -3564,16 +3829,16 @@ timeout = STp->timeout; #if DEBUG if (debugging) { - if (cmd_in == MTWEOF) - printk(OSST_DEB_MSG "osst%d: Writing %d filemarks.\n", dev, + if (cmd_in == MTWEOF) + printk(OSST_DEB_MSG "osst%d:D: Writing %d filemarks.\n", dev, cmd[2] * 65536 + cmd[3] * 256 + cmd[4]); - else - printk(OSST_DEB_MSG "osst%d: Writing %d setmarks.\n", dev, + else + printk(OSST_DEB_MSG "osst%d:D: Writing %d setmarks.\n", dev, cmd[2] * 65536 + cmd[3] * 256 + cmd[4]); } #endif if (fileno >= 0) - fileno += arg; + fileno += arg; blkno = 0; at_sm = (cmd_in == MTWSM); break; @@ -3594,50 +3859,49 @@ if (debugging) { switch (cmd_in) { case MTUNLOAD: - printk(OSST_DEB_MSG "osst%d: Unloading tape.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Unloading tape.\n", dev); break; case MTLOAD: - printk(OSST_DEB_MSG "osst%d: Loading tape.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Loading tape.\n", dev); break; case MTRETEN: - printk(OSST_DEB_MSG "osst%d: Retensioning tape.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Retensioning tape.\n", dev); break; case MTOFFL: - printk(OSST_DEB_MSG "osst%d: Ejecting tape.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Ejecting tape.\n", dev); break; } } #endif - fileno = blkno = at_sm = logical_blk_num = 0 ; + fileno = blkno = at_sm = frame_seq_numbr = logical_blk_num = 0 ; break; case MTNOP: #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: No op on tape.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: No-op on tape.\n", dev); #endif return 0; /* Should do something ? */ break; case MTEOM: #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Spacing to end of recorded medium.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Spacing to end of recorded medium.\n", dev); #endif osst_set_frame_position(STp, &SRpnt, STp->eod_frame_ppos, 0); - if (osst_get_logical_blk(STp, &SRpnt, -1, 0) < 0) { + if (osst_get_logical_frame(STp, &SRpnt, -1, 0) < 0) { ioctl_result = -EIO; goto os_bypass; } if (STp->buffer->aux->frame_type != OS_FRAME_TYPE_EOD) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: No EOD frame found where expected.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: No EOD frame found where expected.\n", dev); #endif ioctl_result = -EIO; goto os_bypass; } ioctl_result = osst_set_frame_position(STp, &SRpnt, STp->eod_frame_ppos, 0); - logical_blk_num = STp->logical_blk_num; - fileno = STp->filemark_cnt; - blkno = at_sm = 0; + fileno = STp->filemark_cnt; + blkno = at_sm = 0; goto os_bypass; case MTERASE: @@ -3648,7 +3912,7 @@ if (i < ioctl_result) ioctl_result = i; i = osst_position_tape_and_confirm(STp, &SRpnt, STp->eod_frame_ppos); if (i < ioctl_result) ioctl_result = i; - fileno = blkno = at_sm = logical_blk_num = 0 ; + fileno = blkno = at_sm = 0 ; goto os_bypass; case MTREW: @@ -3656,9 +3920,9 @@ cmd[1] = 1; #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Rewinding tape, Immed=%d.\n", dev, cmd[1]); + printk(OSST_DEB_MSG "osst%d:D: Rewinding tape, Immed=%d.\n", dev, cmd[1]); #endif - fileno = blkno = at_sm = logical_blk_num = 0 ; + fileno = blkno = at_sm = frame_seq_numbr = logical_blk_num = 0 ; break; case MTLOCK: @@ -3667,8 +3931,8 @@ cmd[4] = SCSI_REMOVAL_PREVENT; #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Locking drive door.\n", dev); -#endif; + printk(OSST_DEB_MSG "osst%d:D: Locking drive door.\n", dev); +#endif break; case MTUNLOCK: @@ -3677,8 +3941,8 @@ cmd[4] = SCSI_REMOVAL_ALLOW; #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Unlocking drive door.\n", dev); -#endif; + printk(OSST_DEB_MSG "osst%d:D: Unlocking drive door.\n", dev); +#endif break; case MTSETBLK: /* Set block length */ @@ -3693,10 +3957,10 @@ ((arg & MT_ST_BLKSIZE_MASK) < STp->min_block || (arg & MT_ST_BLKSIZE_MASK) > STp->max_block || (arg & MT_ST_BLKSIZE_MASK) > osst_buffer_size)) { - printk(KERN_WARNING "osst%d: Illegal block size.\n", dev); + printk(KERN_WARNING "osst%d:W: Illegal block size.\n", dev); return (-EINVAL); } - return 0; /* silently ignore if block size didn't change */ + return 0; /* FIXME silently ignore if block size didn't change */ default: return (-ENOSYS); @@ -3708,18 +3972,23 @@ if (!SRpnt) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Couldn't exec scsi cmd for IOCTL\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Couldn't exec scsi cmd for IOCTL\n", dev); #endif return ioctl_result; } + if (!ioctl_result) { /* SCSI command successful */ + STp->frame_seq_number = frame_seq_numbr; + STp->logical_blk_num = logical_blk_num; + } + os_bypass: #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: IOCTL (%d) Result=%d\n", dev, cmd_in, ioctl_result); + printk(OSST_DEB_MSG "osst%d:D: IOCTL (%d) Result=%d\n", dev, cmd_in, ioctl_result); #endif - if (!ioctl_result) { /* SCSI command successful */ + if (!ioctl_result) { if (cmd_in == MTFSFM) { fileno--; @@ -3732,7 +4001,6 @@ STps->drv_block = blkno; STps->drv_file = fileno; STps->at_sm = at_sm; - STp->logical_blk_num = logical_blk_num; if (cmd_in == MTLOCK) STp->door_locked = ST_LOCKED_EXPLICIT; @@ -3752,7 +4020,7 @@ /* STp->rew_at_close = (MINOR(inode->i_rdev) & 0x80) == 0; FIXME */ for (i=0; i < ST_NBR_PARTITIONS; i++) { STp->ps[i].rw = ST_IDLE; - STp->ps[i].last_block_valid = FALSE; + STp->ps[i].last_block_valid = FALSE;/* FIXME - where else is this field maintained? */ } STp->partition = 0; } @@ -3826,7 +4094,7 @@ if (STp->in_use) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Device already in use.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Device already in use.\n", dev); #endif return (-EBUSY); } @@ -3841,7 +4109,7 @@ if (mode != STp->current_mode) { #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Mode change from %d to %d.\n", + printk(OSST_DEB_MSG "osst%d:D: Mode change from %d to %d.\n", dev, STp->current_mode, mode); #endif new_session = TRUE; @@ -3863,7 +4131,7 @@ if (i >= osst_nbr_buffers) { STp->buffer = new_tape_buffer(FALSE, need_dma_buffer); if (STp->buffer == NULL) { - printk(KERN_WARNING "osst%d: Can't allocate tape buffer.\n", dev); + printk(KERN_WARNING "osst%d:W: Can't allocate tape buffer.\n", dev); retval = (-EBUSY); goto err_out; } @@ -3890,7 +4158,6 @@ STps->rw = ST_IDLE; } STp->ready = ST_READY; - STp->recover_count = 0; #if DEBUG STp->nbr_waits = STp->nbr_finished = 0; #endif @@ -3907,7 +4174,7 @@ (SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY && SRpnt->sr_sense_buffer[12] == 4 ) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: Unit not ready, cause %x\n", dev, SRpnt->sr_sense_buffer[13]); + printk(OSST_DEB_MSG "osst%d:D: Unit not ready, cause %x\n", dev, SRpnt->sr_sense_buffer[13]); #endif if (SRpnt->sr_sense_buffer[13] == 2) { /* initialize command required (LOAD) */ memset (cmd, 0, MAX_COMMAND_SIZE); @@ -3922,7 +4189,7 @@ if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && (SRpnt->sr_sense_buffer[2] & 0x0f) == UNIT_ATTENTION) { /* New media? */ #if DEBUG - printk(OSST_DEB_MSG "osst%d: Unit wants attention\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Unit wants attention\n", dev); #endif STp->header_ok = 0; @@ -3944,7 +4211,7 @@ STp->nbr_partitions = 1; /* This guess will be updated later if necessary */ for (i=0; i < ST_NBR_PARTITIONS; i++) { STps = &(STp->ps[i]); - STps->rw = ST_IDLE; + STps->rw = ST_IDLE; /* FIXME - seems to be redundant... */ STps->eof = ST_NOEOF; STps->at_sm = 0; STps->last_block_valid = FALSE; @@ -3952,6 +4219,7 @@ STps->drv_file = 0 ; } new_session = TRUE; + STp->recover_count = 0; } /* * if we have valid headers from before, and the drive/tape seem untouched, @@ -3974,7 +4242,7 @@ STp->buffer->b_data[MODE_HEADER_LENGTH + 4] != 'N' || STp->buffer->b_data[MODE_HEADER_LENGTH + 5] != '4' ) { #if DEBUG - printk(OSST_DEB_MSG "osst%d: signature was changed to %c%c%c%c\n", dev, + printk(OSST_DEB_MSG "osst%d:D: Signature was changed to %c%c%c%c\n", dev, STp->buffer->b_data[MODE_HEADER_LENGTH + 2], STp->buffer->b_data[MODE_HEADER_LENGTH + 3], STp->buffer->b_data[MODE_HEADER_LENGTH + 4], @@ -3986,17 +4254,23 @@ if (STp->header_ok && i == osst_get_frame_position(STp, &SRpnt)) { if (STp->door_locked == ST_UNLOCKED) { if (osst_int_ioctl(STp, &SRpnt, MTLOCK, 0)) - printk(KERN_WARNING "osst%d: Can't lock drive door\n", dev); + printk(KERN_INFO "osst%d:I: Can't lock drive door\n", dev); else STp->door_locked = ST_LOCKED_AUTO; } + if (!STp->frame_in_buffer) { + STp->block_size = (STp->raw) ? OS_FRAME_SIZE : ( + (STm->default_blksize > 0) ? STm->default_blksize : OS_DATA_SIZE); + STp->buffer->buffer_bytes = STp->buffer->read_pointer = 0; + } + STp->buffer->buffer_blocks = OS_DATA_SIZE / STp->block_size; STp->fast_open = TRUE; scsi_release_request(SRpnt); return 0; } #if DEBUG if (i != STp->first_frame_position) - printk(OSST_DEB_MSG "osst%d: tape position changed from %d to %d\n", + printk(OSST_DEB_MSG "osst%d:D: Tape position changed from %d to %d\n", dev, i, STp->first_frame_position); #endif STp->header_ok = 0; @@ -4020,8 +4294,8 @@ (STp->buffer)->b_data[MODE_HEADER_LENGTH + 2] = 2; (STp->buffer)->b_data[MODE_HEADER_LENGTH + 3] = 3; -#if 1 //DEBUG - printk(OSST_DEB_MSG "osst%i: Applying soft reset\n", dev); +#if DEBUG + printk(OSST_DEB_MSG "osst%d:D: Applying soft reset\n", dev); #endif SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], SCSI_DATA_WRITE, STp->timeout, 0, TRUE); @@ -4058,7 +4332,7 @@ } if (osst_wait_ready(STp, &SRpnt, 15 * 60)) /* FIXME - not allowed with NOBLOCK */ - printk(KERN_WARNING "osst%i: Device did not become Ready in open\n",dev); + printk(KERN_INFO "osst%i:I: Device did not become Ready in open\n",dev); if ((STp->buffer)->syscall_result != 0) { if ((STp->device)->scsi_level >= SCSI_2 && @@ -4087,7 +4361,7 @@ if (OS_FRAME_SIZE > (STp->buffer)->buffer_size && !enlarge_buffer(STp->buffer, OS_FRAME_SIZE, STp->restr_dma)) { - printk(KERN_NOTICE "osst%d: Framesize %d too large for buffer.\n", dev, + printk(KERN_NOTICE "osst%d:A: Framesize %d too large for buffer.\n", dev, OS_FRAME_SIZE); retval = (-EIO); goto err_out; @@ -4099,22 +4373,26 @@ b_size += STp->buffer->sg[i++].length); STp->buffer->aux = (os_aux_t *) (STp->buffer->sg[i].address + OS_DATA_SIZE - b_size); #if DEBUG - printk(OSST_DEB_MSG "osst%d: b_data points to %p in segment 0 at %p\n", dev, + printk(OSST_DEB_MSG "osst%d:D: b_data points to %p in segment 0 at %p\n", dev, STp->buffer->b_data, STp->buffer->sg[0].address); - printk(OSST_DEB_MSG "osst%d: AUX points to %p in segment %d at %p\n", dev, + printk(OSST_DEB_MSG "osst%d:D: AUX points to %p in segment %d at %p\n", dev, STp->buffer->aux, i, STp->buffer->sg[i].address); #endif } else STp->buffer->aux = NULL; /* this had better never happen! */ - (STp->buffer)->buffer_blocks = 1; - (STp->buffer)->buffer_bytes = - (STp->buffer)->read_pointer = - STp->logical_blk_in_buffer = 0; + STp->block_size = (STp->raw) ? OS_FRAME_SIZE : ( + (STm->default_blksize > 0) ? STm->default_blksize : OS_DATA_SIZE); + STp->min_block = 512; + STp->max_block = OS_DATA_SIZE; + STp->buffer->buffer_blocks = OS_DATA_SIZE / STp->block_size; + STp->buffer->buffer_bytes = + STp->buffer->read_pointer = + STp->frame_in_buffer = 0; #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Block size: %d, frame size: %d, buffer size: %d (%d blocks).\n", + printk(OSST_DEB_MSG "osst%d:D: Block size: %d, frame size: %d, buffer size: %d (%d blocks).\n", dev, STp->block_size, OS_FRAME_SIZE, (STp->buffer)->buffer_size, (STp->buffer)->buffer_blocks); #endif @@ -4123,7 +4401,7 @@ STp->write_prot = 1; #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Write protected\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Write protected\n", dev); #endif if ((flags & O_ACCMODE) == O_WRONLY || (flags & O_ACCMODE) == O_RDWR) { retval = (-EROFS); @@ -4134,7 +4412,7 @@ if (new_session) { /* Change the drive parameters for the new mode */ #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: New Session\n", dev); + printk(OSST_DEB_MSG "osst%d:D: New Session\n", dev); #endif STp->density_changed = STp->blksize_changed = FALSE; STp->compression_changed = FALSE; @@ -4145,7 +4423,7 @@ */ if (STp->door_locked == ST_UNLOCKED) { if (osst_int_ioctl(STp, &SRpnt, MTLOCK, 0)) - printk(KERN_WARNING "osst%d: Can't lock drive door\n", dev); + printk(KERN_INFO "osst%d:I: Can't lock drive door\n", dev); else STp->door_locked = ST_LOCKED_AUTO; } @@ -4197,18 +4475,17 @@ STps = &(STp->ps[STp->partition]); if ( STps->rw == ST_WRITING && !(STp->device)->was_reset) { - result = osst_flush_write_buffer(STp, &SRpnt, 1); + result = osst_flush_write_buffer(STp, &SRpnt); if (result != 0 && result != (-ENOSPC)) - goto out; + goto out; } - if ( STps->rw == ST_WRITING && !(STp->device)->was_reset) { #if DEBUG if (debugging) { - printk(OSST_DEB_MSG "osst%d: File length %ld bytes.\n", + printk(OSST_DEB_MSG "osst%d:D: File length %ld bytes.\n", dev, (long)(filp->f_pos)); - printk(OSST_DEB_MSG "osst%d: Async write waits %d, finished %d.\n", + printk(OSST_DEB_MSG "osst%d:D: Async write waits %d, finished %d.\n", dev, STp->nbr_waits, STp->nbr_finished); } #endif @@ -4229,7 +4506,7 @@ #if DEBUG if (debugging) - printk(OSST_DEB_MSG "osst%d: Buffer flushed, %d EOF(s) written\n", + printk(OSST_DEB_MSG "osst%d:D: Buffer flushed, %d EOF(s) written\n", dev, 1+STp->two_fm); #endif } @@ -4237,7 +4514,7 @@ STps = &(STp->ps[STp->partition]); if (!STm->sysv || STps->rw != ST_READING) { if (STp->can_bsr) - result = osst_flush_buffer(STp, &SRpnt, 0); + result = osst_flush_buffer(STp, &SRpnt, 0); /* this is the default path */ else if (STps->eof == ST_FM_HIT) { result = cross_eof(STp, &SRpnt, FALSE); if (result) { @@ -4263,12 +4540,24 @@ out: if (STp->rew_at_close) { result2 = osst_position_tape_and_confirm(STp, &SRpnt, STp->first_data_ppos); - STps->drv_file = STps->drv_block = STp->logical_blk_num = 0; - if (result == 0) + STps->drv_file = STps->drv_block = STp->frame_seq_number = STp->logical_blk_num = 0; + if (result == 0 && result2 < 0) result = result2; } if (SRpnt) scsi_release_request(SRpnt); + if (STp->recover_count) { + printk(KERN_INFO "osst%d:I: %d recovered errors in", dev, STp->recover_count); + if (STp->write_count) + printk(" %d frames written", STp->write_count); + if (STp->read_count) + printk(" %d frames read", STp->read_count); + printk("\n"); + STp->recover_count = 0; + } + STp->write_count = 0; + STp->read_count = 0; + return result; } @@ -4322,7 +4611,7 @@ #if DEBUG if (debugging && !STp->in_use) { - printk(OSST_DEB_MSG "osst%d: Incorrect device.\n", dev); + printk(OSST_DEB_MSG "osst%d:D: Incorrect device.\n", dev); retval = (-EIO); goto out; } @@ -4359,7 +4648,7 @@ } if (mtc.mt_op == MTSETDRVBUFFER && !capable(CAP_SYS_ADMIN)) { - printk(KERN_WARNING "osst%d: MTSETDRVBUFFER only allowed for root.\n", dev); + printk(KERN_WARNING "osst%d:W: MTSETDRVBUFFER only allowed for root.\n", dev); retval = (-EPERM); goto out; } @@ -4419,7 +4708,7 @@ if (STp->door_locked != ST_UNLOCKED && STp->door_locked != ST_LOCK_FAILS) { if (osst_int_ioctl(STp, &SRpnt, MTLOCK, 0)) { - printk(KERN_NOTICE "osst%d: Could not relock door after bus reset.\n", + printk(KERN_NOTICE "osst%d:I: Could not relock door after bus reset.\n", dev); STp->door_locked = ST_UNLOCKED; } @@ -4479,7 +4768,7 @@ } if (mtc.mt_op == MTSEEK) { - i = osst_seek_frame(STp, &SRpnt, mtc.mt_count); + i = osst_seek_sector(STp, &SRpnt, mtc.mt_count); if (!STp->can_partitions) STp->ps[0].rw = ST_IDLE; retval = i; @@ -4584,7 +4873,7 @@ retval = (-EINVAL); goto out; } - blk = osst_get_frame_position(STp, &SRpnt); + blk = osst_get_sector(STp, &SRpnt); if (blk < 0) { retval = blk; goto out; @@ -4687,7 +4976,7 @@ } } if (!tb) { - printk(KERN_NOTICE "osst: Can't allocate new tape buffer (nbr %d).\n", + printk(KERN_NOTICE "osst :I: Can't allocate new tape buffer (nbr %d).\n", osst_nbr_buffers); return NULL; } @@ -4697,10 +4986,10 @@ #if DEBUG if (debugging) { printk(OSST_DEB_MSG - "osst: Allocated tape buffer %d (%d bytes, %d segments, dma: %d, a: %p).\n", + "osst :D: Allocated tape buffer %d (%d bytes, %d segments, dma: %d, a: %p).\n", osst_nbr_buffers, got, tb->sg_segs, need_dma, tb->b_data); printk(OSST_DEB_MSG - "osst: segment sizes: first %d, last %d bytes.\n", + "osst :D: segment sizes: first %d, last %d bytes.\n", tb->sg[0].length, tb->sg[segs-1].length); } #endif @@ -4745,7 +5034,7 @@ order--; continue; } - printk(KERN_NOTICE "osst: Failed to enlarge buffer to %d bytes.\n", + printk(KERN_WARNING "osst :W: Failed to enlarge buffer to %d bytes.\n", new_size); #if DEBUG STbuffer->buffer_size = got; @@ -4764,10 +5053,10 @@ if (debugging) { for (nbr=0; osst_buffers[nbr] != STbuffer && nbr < osst_nbr_buffers; nbr++); printk(OSST_DEB_MSG - "osst: Expanded tape buffer %d (%d bytes, %d->%d segments, dma: %d, a: %p).\n", + "osst :D: Expanded tape buffer %d (%d bytes, %d->%d segments, dma: %d, a: %p).\n", nbr, got, STbuffer->orig_sg_segs, STbuffer->sg_segs, need_dma, STbuffer->b_data); printk(OSST_DEB_MSG - "osst: segment sizes: first %d, last %d bytes.\n", + "osst :D: segment sizes: first %d, last %d bytes.\n", STbuffer->sg[0].length, STbuffer->sg[segs-1].length); } #endif @@ -4792,7 +5081,7 @@ } #if DEBUG if (debugging && STbuffer->orig_sg_segs < STbuffer->sg_segs) - printk(OSST_DEB_MSG "osst: Buffer at %p normalized to %d bytes (segs %d).\n", + printk(OSST_DEB_MSG "osst :D: Buffer at %p normalized to %d bytes (segs %d).\n", STbuffer->b_data, STbuffer->buffer_size, STbuffer->sg_segs); #endif STbuffer->sg_segs = STbuffer->orig_sg_segs; @@ -4809,7 +5098,7 @@ i < st_bp->sg_segs && offset >= st_bp->sg[i].length; i++) offset -= st_bp->sg[i].length; if (i == st_bp->sg_segs) { /* Should never happen */ - printk(KERN_WARNING "osst: Append_to_buffer offset overflow.\n"); + printk(KERN_WARNING "osst :A: Append_to_buffer offset overflow.\n"); return (-EIO); } for ( ; i < st_bp->sg_segs && do_count > 0; i++) { @@ -4824,7 +5113,7 @@ offset = 0; } if (do_count) { /* Should never happen */ - printk(KERN_WARNING "osst: Append_to_buffer overflow (left %d).\n", + printk(KERN_WARNING "osst :A: Append_to_buffer overflow (left %d).\n", do_count); return (-EIO); } @@ -4842,7 +5131,7 @@ i < st_bp->sg_segs && offset >= st_bp->sg[i].length; i++) offset -= st_bp->sg[i].length; if (i == st_bp->sg_segs) { /* Should never happen */ - printk(KERN_WARNING "osst: From_buffer offset overflow.\n"); + printk(KERN_WARNING "osst :A: From_buffer offset overflow.\n"); return (-EIO); } for ( ; i < st_bp->sg_segs && do_count > 0; i++) { @@ -4858,7 +5147,7 @@ offset = 0; } if (do_count) { /* Should never happen */ - printk(KERN_WARNING "osst: From_buffer overflow (left %d).\n", do_count); + printk(KERN_WARNING "osst :A: From_buffer overflow (left %d).\n", do_count); return (-EIO); } return 0; @@ -4874,10 +5163,10 @@ i < st_bp->sg_segs && offset >= st_bp->sg[i].length; i++) offset -= st_bp->sg[i].length; if (i == st_bp->sg_segs) { /* Should never happen */ - printk(KERN_WARNING "osst: Zero_buffer offset overflow.\n"); + printk(KERN_WARNING "osst :A: Zero_buffer offset overflow.\n"); return (-EIO); } - for (do_count = OS_DATA_SIZE - st_bp->read_pointer; + for (do_count = OS_DATA_SIZE - st_bp->buffer_bytes; i < st_bp->sg_segs && do_count > 0; i++) { cnt = st_bp->sg[i].length - offset < do_count ? st_bp->sg[i].length - offset : do_count ; @@ -4886,13 +5175,13 @@ offset = 0; } if (do_count) { /* Should never happen */ - printk(KERN_WARNING "osst: Zero_buffer overflow (left %d).\n", do_count); + printk(KERN_WARNING "osst :A: Zero_buffer overflow (left %d).\n", do_count); return (-EIO); } return 0; } -/* Copy a osst 32K block of memory into the buffer. +/* Copy a osst 32K chunk of memory into the buffer. Returns zero (success) or negative error code. */ static int osst_copy_to_buffer(OSST_buffer *st_bp, unsigned char *ptr) { @@ -4906,14 +5195,14 @@ ptr += cnt; } if (do_count || i != st_bp->sg_segs-1) { /* Should never happen */ - printk(KERN_WARNING "osst: Copy_to_buffer overflow (left %d at sg %d).\n", + printk(KERN_WARNING "osst :A: Copy_to_buffer overflow (left %d at sg %d).\n", do_count, i); return (-EIO); } return 0; } -/* Copy a osst 32K block of memory from the buffer. +/* Copy a osst 32K chunk of memory from the buffer. Returns zero (success) or negative error code. */ static int osst_copy_from_buffer(OSST_buffer *st_bp, unsigned char *ptr) { @@ -4927,7 +5216,7 @@ ptr += cnt; } if (do_count || i != st_bp->sg_segs-1) { /* Should never happen */ - printk(KERN_WARNING "osst: Copy_from_buffer overflow (left %d at sg %d).\n", + printk(KERN_WARNING "osst :A: Copy_from_buffer overflow (left %d at sg %d).\n", do_count, i); return (-EIO); } @@ -4949,9 +5238,12 @@ osst_max_buffers = max_buffers; if (max_sg_segs >= OSST_FIRST_SG) osst_max_sg_segs = max_sg_segs; - printk(KERN_INFO "osst: bufsize %d, wrt %d, max buffers %d, s/g segs %d.\n", +#if DEBUG + printk(OSST_DEB_MSG "osst :D: bufsize %d, wrt %d, max buffers %d, s/g segs %d.\n", osst_buffer_size, osst_write_threshold, osst_max_buffers, osst_max_sg_segs); -//printk(OSST_DEB_MSG "osst: sizeof(header) = %d (%s)\n",sizeof(os_header_t),sizeof(os_header_t)==OS_DATA_SIZE?"ok":"error"); +//printk(OSST_DEB_MSG "osst :D: sizeof(header) = %d (%s)\n", +// sizeof(os_header_t),sizeof(os_header_t)==OS_DATA_SIZE?"ok":"error"); +#endif } #ifndef MODULE @@ -4980,7 +5272,7 @@ } } if (i >= sizeof(parms) / sizeof(struct osst_dev_parm)) - printk(KERN_WARNING "osst: illegal parameter in '%s'\n", + printk(KERN_INFO "osst :I: Illegal parameter in '%s'\n", stp); stp = strchr(stp, ','); if (stp) @@ -5038,7 +5330,7 @@ OS_Scsi_Tape * tpnt; ST_mode * STm; ST_partstat * STps; - int i; + int i, dev; #ifdef CONFIG_DEVFS_FS int mode; #endif @@ -5059,16 +5351,17 @@ tpnt = (OS_Scsi_Tape *)kmalloc(sizeof(OS_Scsi_Tape), GFP_ATOMIC); if (tpnt == NULL) { SDp->attached--; - printk(KERN_ERR "osst: Can't allocate device descriptor.\n"); + printk(KERN_WARNING "osst :W: Can't allocate device descriptor.\n"); return 1; } memset(tpnt, 0, sizeof(OS_Scsi_Tape)); os_scsi_tapes[i] = tpnt; + dev = i; tpnt->capacity = 0xfffff; /* allocate a buffer for this device */ if (!new_tape_buffer(TRUE, TRUE)) - printk(KERN_ERR "osst: Unable to allocate a tape buffer.\n"); + printk(KERN_ERR "osst :W: Unable to allocate a tape buffer.\n"); #ifdef CONFIG_DEVFS_FS for (mode = 0; mode < ST_NBR_MODES; ++mode) { @@ -5131,17 +5424,12 @@ tpnt->long_timeout = OSST_LONG_TIMEOUT; /* Recognize OnStream tapes */ - printk ("osst%i: Tape driver with OnStream support osst %s\nosst%i: %s\n", - i, osst_version, i, cvsid); /* We don't need to test for OnStream, as this has been done in detect () */ tpnt->os_fw_rev = osst_parse_firmware_rev (SDp->rev); -#if DEBUG - printk ("osst%i: OnStream tape drive recognized, Model %s\n", i, SDp->model); -#endif tpnt->omit_blklims = 1; tpnt->poll = (strncmp(SDp->model, "DI-", 3) == 0) || OSST_FW_NEED_POLL(tpnt->os_fw_rev,SDp); - tpnt->logical_blk_in_buffer = 0; + tpnt->frame_in_buffer = 0; tpnt->header_ok = 0; tpnt->linux_media = 0; tpnt->header_cache = NULL; @@ -5155,7 +5443,7 @@ STm->do_buffer_writes = OSST_BUFFER_WRITES; STm->do_read_ahead = OSST_READ_AHEAD; STm->default_compression = ST_DONT_TOUCH; - STm->default_blksize = 32 * ST_KILOBYTE; /* No forced size */ + STm->default_blksize = 512; STm->default_density = (-1); /* No forced density */ } @@ -5175,6 +5463,11 @@ init_MUTEX(&tpnt->lock); osst_template.nr_dev++; + + printk(KERN_INFO + "osst :I: Attached OnStream %.5s tape at scsi%d, channel %d, id %d, lun %d as osst%d\n", + SDp->model, SDp->host->host_no, SDp->channel, SDp->id, SDp->lun, dev); + return 0; }; @@ -5183,10 +5476,7 @@ if (SDp->type != TYPE_TAPE) return 0; if ( ! osst_supports(SDp) ) return 0; - printk(KERN_WARNING - "Detected OnStream scsi tape osst%d at scsi%d, channel %d, id %d, lun %d\n", - osst_template.dev_noticed++, - SDp->host->host_no, SDp->channel, SDp->id, SDp->lun); + osst_template.dev_noticed++; return 1; } @@ -5205,7 +5495,7 @@ #else if (register_chrdev(MAJOR_NR,"osst",&osst_fops)) { #endif - printk(KERN_ERR "osst: Unable to get major %d for OnStream tapes\n",MAJOR_NR); + printk(KERN_ERR "osst :W: Unable to get major %d for OnStream tapes\n",MAJOR_NR); return 1; } osst_registered++; @@ -5214,12 +5504,12 @@ if (os_scsi_tapes) return 0; osst_template.dev_max = OSST_MAX_TAPES; if (osst_template.dev_max > 128 / ST_NBR_MODES) - printk(KERN_INFO "osst: Only %d tapes accessible.\n", 128 / ST_NBR_MODES); + printk(KERN_INFO "osst :I: Only %d tapes accessible.\n", 128 / ST_NBR_MODES); os_scsi_tapes = (OS_Scsi_Tape **)kmalloc(osst_template.dev_max * sizeof(OS_Scsi_Tape *), GFP_ATOMIC); if (os_scsi_tapes == NULL) { - printk(KERN_ERR "osst: Unable to allocate array for OnStream SCSI tapes.\n"); + printk(KERN_ERR "osst :W: Unable to allocate array for OnStream SCSI tapes.\n"); #ifdef CONFIG_DEVFS_FS devfs_unregister_chrdev(MAJOR_NR, "osst"); #else @@ -5235,7 +5525,7 @@ (OSST_buffer **)kmalloc(osst_template.dev_max * sizeof(OSST_buffer *), GFP_ATOMIC); if (osst_buffers == NULL) { - printk(KERN_ERR "osst: Unable to allocate tape buffer pointers.\n"); + printk(KERN_ERR "osst :W: Unable to allocate tape buffer pointers.\n"); #ifdef CONFIG_DEVFS_FS devfs_unregister_chrdev(MAJOR_NR, "osst"); #else @@ -5246,8 +5536,10 @@ } osst_nbr_buffers = 0; + printk(KERN_INFO "osst :I: Tape driver with OnStream support version %s\nosst :I: %s\n", osst_version, cvsid); + #if DEBUG - printk(OSST_DEB_MSG "osst: Buffer size %d bytes, write threshold %d bytes.\n", + printk(OSST_DEB_MSG "osst :D: Buffer size %d bytes, write threshold %d bytes.\n", osst_buffer_size, osst_write_threshold); #endif return 0; @@ -5287,9 +5579,9 @@ static int __init init_osst(void) { - validate_options(); - osst_template.module = THIS_MODULE; - return scsi_register_module(MODULE_SCSI_DEV, &osst_template); + validate_options(); + osst_template.module = THIS_MODULE; + return scsi_register_module(MODULE_SCSI_DEV, &osst_template); } static void __exit exit_osst (void) @@ -5325,7 +5617,7 @@ } } osst_template.dev_max = 0; - printk(KERN_INFO "osst: Unloaded.\n"); + printk(KERN_INFO "osst :I: Unloaded.\n"); } module_init(init_osst); diff -u --recursive --new-file v2.4.5/linux/drivers/scsi/osst.h linux/drivers/scsi/osst.h --- v2.4.5/linux/drivers/scsi/osst.h Sat Dec 30 11:23:14 2000 +++ linux/drivers/scsi/osst.h Wed Jun 6 10:42:45 2001 @@ -1,5 +1,5 @@ /* - * $Header: /home/cvsroot/Driver/osst.h,v 1.9 2000/10/08 03:09:43 riede Exp $ + * $Header: /home/cvsroot/Driver/osst.h,v 1.11 2001/01/26 01:54:49 riede Exp $ */ #include @@ -440,7 +440,8 @@ * Linux specific fields: */ __u32 next_mark_ppos; /* when known, points to next marker */ - __u8 linux_specific[28]; + __u32 last_mark_lbn; /* storing log_blk_num of last mark is extends ADR spec */ + __u8 linux_specific[24]; __u8 reserved_256_511[256]; } os_aux_t; @@ -581,6 +582,8 @@ int min_block; int max_block; int recover_count; /* from tape opening */ + int write_count; + int read_count; int recover_erreg; /* from last status call */ /* * OnStream specific data @@ -588,8 +591,9 @@ int os_fw_rev; /* the firmware revision * 10000 */ unsigned char raw; /* flag OnStream raw access (32.5KB block size) */ unsigned char poll; /* flag that this drive needs polling (IDE|firmware) */ - unsigned char logical_blk_in_buffer; /* flag that the block as per logical_blk_num + unsigned char frame_in_buffer; /* flag that the frame as per frame_seq_number * has been read into STp->buffer and is valid */ + int frame_seq_number; /* logical frame number */ int logical_blk_num; /* logical block number */ unsigned first_frame_position; /* physical frame to be transfered to/from host */ unsigned last_frame_position; /* physical frame to be transferd to/from tape */ @@ -607,6 +611,7 @@ int filemark_cnt; int first_mark_ppos; int last_mark_ppos; + int last_mark_lbn; /* storing log_blk_num of last mark is extends ADR spec */ int first_data_ppos; int eod_frame_ppos; int eod_frame_lfa; diff -u --recursive --new-file v2.4.5/linux/drivers/scsi/osst_options.h linux/drivers/scsi/osst_options.h --- v2.4.5/linux/drivers/scsi/osst_options.h Sat Dec 30 11:23:14 2000 +++ linux/drivers/scsi/osst_options.h Wed Jun 6 10:42:45 2001 @@ -8,7 +8,7 @@ Changed (and renamed) for OnStream SCSI drives garloff@suse.de 2000-06-21 - $Header: /home/cvsroot/Driver/osst_options.h,v 1.4 2000/06/26 01:44:01 riede Exp $ + $Header: /home/cvsroot/Driver/osst_options.h,v 1.5 2001/01/07 22:19:15 riede Exp $ */ #ifndef _OSST_OPTIONS_H @@ -24,7 +24,7 @@ because of buffered reads. Should be set to zero to support also drives that can't space backwards over records. NOTE: The tape will be spaced backwards over an "accidentally" crossed filemark in any case. */ -#define OSST_IN_FILE_POS 0 +#define OSST_IN_FILE_POS 1 /* The tape driver buffer size in kilobytes. */ /* Don't change, as this is the HW blocksize */ @@ -33,7 +33,13 @@ /* The number of kilobytes of data in the buffer that triggers an asynchronous write in fixed block mode. See also OSST_ASYNC_WRITES below. */ -#define OSST_WRITE_THRESHOLD_BLOCKS 30 +#define OSST_WRITE_THRESHOLD_BLOCKS 32 + +/* OSST_EOM_RESERVE defines the number of frames are kept in reserve for + * * write error recovery when writing near end of medium. ENOSPC is returned + * * when write() is called and the tape write position is within this number + * * of blocks from the tape capacity. */ +#define OSST_EOM_RESERVE 300 /* The maximum number of tape buffers the driver allocates. The number is also constrained by the number of drives detected. Determines the @@ -64,7 +70,7 @@ /* If OSST_BUFFER_WRITES is non-zero, writes in fixed block mode are buffered until the driver buffer is full or asynchronous write is - triggered. May make detection of End-Of-Medium early enough fail. */ + triggered. */ #define OSST_BUFFER_WRITES 1 /* If OSST_ASYNC_WRITES is non-zero, the SCSI write command may be started diff -u --recursive --new-file v2.4.5/linux/drivers/scsi/qlogicpti.c linux/drivers/scsi/qlogicpti.c --- v2.4.5/linux/drivers/scsi/qlogicpti.c Fri Feb 9 11:30:23 2001 +++ linux/drivers/scsi/qlogicpti.c Tue Jun 5 18:11:44 2001 @@ -819,7 +819,8 @@ /* Is this a red snapper? */ if (strcmp(sdev->prom_name, "ptisp") && strcmp(sdev->prom_name, "PTI,ptisp") && - strcmp(sdev->prom_name, "QLGC,isp")) + strcmp(sdev->prom_name, "QLGC,isp") && + strcmp(sdev->prom_name, "SUNW,isp")) continue; /* Sometimes Antares cards come up not completely diff -u --recursive --new-file v2.4.5/linux/drivers/scsi/scsi_ioctl.c linux/drivers/scsi/scsi_ioctl.c --- v2.4.5/linux/drivers/scsi/scsi_ioctl.c Fri Apr 27 13:59:19 2001 +++ linux/drivers/scsi/scsi_ioctl.c Sun Jun 3 15:24:03 2001 @@ -312,17 +312,17 @@ /* * If there was an error condition, pass the info back to the user. */ + result = SRpnt->sr_result; if (SRpnt->sr_result) { int sb_len = sizeof(SRpnt->sr_sense_buffer); sb_len = (sb_len > OMAX_SB_LEN) ? OMAX_SB_LEN : sb_len; if (copy_to_user(cmd_in, SRpnt->sr_sense_buffer, sb_len)) - return -EFAULT; - } else + result = -EFAULT; + } else { if (copy_to_user(cmd_in, buf, outlen)) - return -EFAULT; - - result = SRpnt->sr_result; + result = -EFAULT; + } SDpnt = SRpnt->sr_device; scsi_release_request(SRpnt); diff -u --recursive --new-file v2.4.5/linux/drivers/sgi/char/linux_logo.h linux/drivers/sgi/char/linux_logo.h --- v2.4.5/linux/drivers/sgi/char/linux_logo.h Wed Dec 10 10:31:11 1997 +++ linux/drivers/sgi/char/linux_logo.h Wed Dec 31 16:00:00 1969 @@ -1,909 +0,0 @@ -/* This is a linux logo to be displayed on boot. - * - * You can put anything here, but: - * LINUX_LOGO_COLORS has to be less than 224 - * image size has to be 80x80 - * values have to start from0x20 - * (i.e. RGB(linux_logo_red[0], - * linux_logo_green[0], - * linux_logo_blue[0]) is color0x20) - */ - -#define LINUX_LOGO_COLORS 221 - -unsigned char linux_logo_red[] = { - 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, - 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xE5, - 0xF1, 0xED, 0xEE, 0xE6, 0xC6, 0xDA, 0xDD, 0xE5, - 0xD9, 0xC6, 0xE3, 0xD0, 0xC6, 0xBA, 0xB0, 0xB6, - 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xB0, 0xAD, - 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x9D, - 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, - 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, - 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x0D, 0x03, - 0x66, 0x44, 0x24, 0x08, 0xD6, 0xE6, 0xE9, 0xE6, - 0xE7, 0xCA, 0xDC, 0xDB, 0xD5, 0xD0, 0xC9, 0xE2, - 0xD5, 0xC6, 0xC4, 0xB3, 0xB2, 0xB9, 0xA9, 0x9A, - 0xB2, 0x9D, 0xE8, 0xEC, 0xF5, 0xF5, 0xF4, 0xF4, - 0xEC, 0xEE, 0xF0, 0xF5, 0xE0, 0xD6, 0xC5, 0xC2, - 0xD9, 0xD5, 0xD8, 0xD6, 0xF6, 0xF4, 0xED, 0xEC, - 0xEB, 0xF1, 0xF6, 0xF5, 0xF5, 0xEE, 0xEF, 0xEC, - 0xE7, 0xE3, 0xE6, 0xD6, 0xDD, 0xC3, 0xD6, 0xD7, - 0xCD, 0xCA, 0xC3, 0xAC, 0x95, 0x99, 0xB7, 0xA3, - 0x8B, 0x88, 0x95, 0x8A, 0x94, 0xD2, 0xCC, 0xC4, - 0xA8, 0x8E, 0x8F, 0xAE, 0xB8, 0xAC, 0xB6, 0xB4, - 0xAD, 0xA5, 0xA0, 0x9B, 0x8B, 0xA3, 0x94, 0x87, - 0x85, 0x89, 0x53, 0x80, 0x7D, 0x7C, 0x7A, 0x78, - 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, - 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, - 0x42, 0x0F, 0x75, 0x78, 0x7D, 0x72, 0x5F, 0x6E, - 0x7A, 0x75, 0x6A, 0x58, 0x48, 0x4F, 0x00, 0x2B, - 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x3B, 0x11, - 0x1D, 0x14, 0x06, 0x02, 0x00 -}; - -unsigned char linux_logo_green[] = { - 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, - 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xD3, - 0xDA, 0xD4, 0xD7, 0xCC, 0xC1, 0xCC, 0xCB, 0xC9, - 0xC5, 0xBC, 0xBC, 0xBB, 0xB7, 0xA5, 0xB0, 0xB6, - 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xAD, 0xAD, - 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x95, - 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, - 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, - 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x08, 0x02, - 0x53, 0x2E, 0x19, 0x06, 0xC6, 0xC8, 0xCF, 0xBD, - 0xB3, 0xB6, 0xB4, 0xAB, 0xA5, 0xA3, 0x9B, 0xB6, - 0xA7, 0x99, 0x92, 0xA4, 0x9E, 0x9D, 0x98, 0x8C, - 0x8A, 0x86, 0xCD, 0xCC, 0xC9, 0xD7, 0xCA, 0xC4, - 0xCA, 0xC3, 0xC7, 0xC3, 0xC8, 0xB4, 0x91, 0x8E, - 0x8A, 0x82, 0x87, 0x85, 0xBD, 0xBF, 0xB6, 0xBC, - 0xAE, 0xB7, 0xBC, 0xB8, 0xBF, 0xB6, 0xBC, 0xB5, - 0xAB, 0xA6, 0xAD, 0xB2, 0xA5, 0x87, 0x9C, 0x96, - 0x95, 0x8E, 0x87, 0x8F, 0x86, 0x86, 0x8E, 0x80, - 0x7A, 0x70, 0x7B, 0x78, 0x78, 0x7F, 0x77, 0x6F, - 0x70, 0x76, 0x59, 0x77, 0x68, 0x64, 0x7B, 0x7C, - 0x75, 0x6D, 0x77, 0x69, 0x65, 0x5F, 0x5B, 0x54, - 0x4F, 0x5B, 0x39, 0x80, 0x7D, 0x7C, 0x7A, 0x78, - 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, - 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, - 0x42, 0x0B, 0x69, 0x66, 0x64, 0x57, 0x4A, 0x4E, - 0x55, 0x4B, 0x46, 0x3B, 0x30, 0x33, 0x00, 0x2B, - 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x29, 0x0D, - 0x1D, 0x14, 0x06, 0x02, 0x00 -}; - -unsigned char linux_logo_blue[] = { - 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xEE, 0xE5, 0xDE, - 0xD7, 0xD3, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xB5, - 0xB0, 0xA6, 0xAC, 0x9B, 0xB5, 0xB5, 0xAE, 0x84, - 0x90, 0xA9, 0x81, 0x8D, 0x96, 0x86, 0xB0, 0xB6, - 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xA7, 0xAD, - 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA5, 0x87, - 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x9A, 0x9A, 0x99, - 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, - 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0xC8, 0xD7, - 0x9B, 0x8E, 0x8C, 0xB2, 0x77, 0x77, 0x4E, 0x77, - 0x69, 0x71, 0x78, 0x6B, 0x65, 0x66, 0x64, 0x59, - 0x5C, 0x5A, 0x48, 0x72, 0x7B, 0x6B, 0x67, 0x6E, - 0x42, 0x5B, 0x29, 0x36, 0x25, 0x10, 0x17, 0x14, - 0x19, 0x16, 0x13, 0x0E, 0x08, 0x2E, 0x2E, 0x3D, - 0x24, 0x24, 0x24, 0x24, 0x13, 0x12, 0x14, 0x14, - 0x0E, 0x08, 0x0D, 0x0F, 0x08, 0x0D, 0x0E, 0x08, - 0x08, 0x0C, 0x06, 0x06, 0x07, 0x16, 0x07, 0x0E, - 0x08, 0x0A, 0x07, 0x0D, 0x2D, 0x3E, 0x09, 0x4E, - 0x68, 0x52, 0x56, 0x58, 0x4B, 0x22, 0x20, 0x20, - 0x27, 0x39, 0x28, 0x19, 0x1E, 0x1E, 0x08, 0x06, - 0x07, 0x09, 0x08, 0x08, 0x05, 0x1D, 0x1F, 0x17, - 0x18, 0x06, 0x79, 0x80, 0x7D, 0x7C, 0x7A, 0x78, - 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x68, 0x65, 0x62, - 0x4B, 0x5B, 0x5F, 0x55, 0x56, 0x52, 0x4F, 0x46, - 0x42, 0x5A, 0x14, 0x23, 0x3D, 0x2B, 0x21, 0x14, - 0x06, 0x04, 0x03, 0x07, 0x09, 0x13, 0x2A, 0x3A, - 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x07, 0x09, - 0x1D, 0x14, 0x06, 0x02, 0x00 -}; - -unsigned char linux_logo[] = { - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, - 0x58, 0x58, 0x59, 0x5C, 0x5D, 0x5F, 0x60, 0x61, - 0x62, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x5E, 0x5E, - 0x5E, 0x5D, 0x5D, 0x5C, 0x5D, 0x5B, 0x58, 0x58, - 0x58, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, - 0x54, 0x56, 0x57, 0x67, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x67, 0x4C, - 0x4A, 0x49, 0x4A, 0x49, 0x4A, 0x49, 0x49, 0x4A, - 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x50, 0x51, 0x52, - 0x54, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, 0x58, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x58, 0x56, 0x56, 0x53, - 0x52, 0x53, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, - 0x4B, 0x4B, 0x4B, 0x4A, 0x49, 0x4A, 0x4A, 0x49, - 0x49, 0x49, 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4B, - 0x4C, 0x4D, 0x52, 0x54, 0x56, 0x55, 0x57, 0x58, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, - 0x50, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF0, 0xF4, 0xFB, - 0xFC, 0x67, 0x53, 0x50, 0x4D, 0x4C, 0x4C, 0x4C, - 0x4B, 0x4A, 0x4A, 0x48, 0x49, 0x48, 0x48, 0x49, - 0x49, 0x49, 0x4B, 0x4C, 0x50, 0x52, 0x53, 0x56, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x55, 0x54, 0x53, 0x51, 0x51, 0x50, 0x4C, 0x4D, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xD2, 0xD7, 0xF5, - 0xFC, 0xFC, 0x5D, 0x5D, 0x5C, 0x5C, 0x59, 0x58, - 0x58, 0x56, 0x52, 0x4C, 0x4B, 0x4A, 0x4A, 0x48, - 0x48, 0x48, 0x48, 0x48, 0x49, 0x4B, 0x4D, 0x51, - 0x54, 0x56, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x55, 0x54, - 0x53, 0x52, 0x51, 0x4D, 0x4D, 0x4D, 0x50, 0x50, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0x64, 0xD9, 0xF5, - 0xF9, 0xFC, 0xFC, 0x64, 0x63, 0x62, 0x61, 0x61, - 0x61, 0x60, 0x5E, 0x5B, 0x5A, 0x54, 0x52, 0x4C, - 0x4B, 0x49, 0x49, 0x47, 0x47, 0x48, 0x49, 0x4B, - 0x4C, 0x51, 0x53, 0x56, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x55, 0x53, 0x53, - 0x51, 0x50, 0x50, 0x50, 0x50, 0x50, 0x53, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xF5, 0xF9, 0xFC, - 0xFC, 0xFC, 0xFC, 0x64, 0x64, 0x64, 0x64, 0x64, - 0x64, 0x64, 0x64, 0x63, 0x61, 0x61, 0x5E, 0x59, - 0x55, 0x52, 0x4C, 0x4A, 0x49, 0x47, 0x48, 0x48, - 0x49, 0x4B, 0x4D, 0x51, 0x54, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x55, 0x54, 0x54, 0x52, 0x51, - 0x51, 0x51, 0x51, 0x51, 0x53, 0x54, 0x59, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0x60, 0x60, 0x60, 0x61, - 0x62, 0x63, 0x64, 0x64, 0x65, 0x65, 0x64, 0x63, - 0x61, 0x5E, 0x59, 0x56, 0x4D, 0x4B, 0x48, 0x48, - 0x48, 0x48, 0x49, 0x4B, 0x50, 0x53, 0x56, 0x56, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x56, 0x54, 0x53, 0x52, 0x51, 0x51, - 0x51, 0x52, 0x53, 0x55, 0x59, 0x5D, 0x5E, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0x4C, 0x4E, 0x51, 0x52, - 0x57, 0x5A, 0x5E, 0x60, 0x61, 0x63, 0x65, 0xCB, - 0x64, 0x64, 0x63, 0x60, 0x5C, 0x57, 0x50, 0x4B, - 0x48, 0x47, 0x47, 0x47, 0x4A, 0x4C, 0x52, 0x53, - 0x54, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x55, 0x54, 0x53, 0x53, 0x51, 0x52, 0x52, 0x53, - 0x53, 0x57, 0x5A, 0x5D, 0x5E, 0x5E, 0x60, 0xFC, - 0xFC, 0xFC, 0xFB, 0xF9, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFA, 0xF9, 0xF5, 0xFB, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x45, 0x3F, 0x3F, - 0x45, 0x48, 0x4B, 0x4D, 0x54, 0x5A, 0x5E, 0x61, - 0x63, 0xCB, 0xCB, 0x65, 0x64, 0x62, 0x5E, 0x57, - 0x50, 0x4B, 0x48, 0x47, 0x47, 0x48, 0x4B, 0x4D, - 0x51, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, - 0x54, 0x54, 0x53, 0x53, 0x52, 0x53, 0x54, 0x57, - 0x59, 0x5C, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0xFC, - 0xFC, 0xFA, 0xFC, 0xFA, 0xE0, 0xFC, 0xFC, 0xFC, - 0xFB, 0xFB, 0xFB, 0xDF, 0xD8, 0xF9, 0xE0, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x4C, 0x4A, 0x48, - 0x48, 0x3E, 0x44, 0x43, 0x3F, 0x47, 0x4B, 0x52, - 0x5A, 0x5E, 0x62, 0x64, 0xCB, 0xCB, 0x64, 0x61, - 0x5E, 0x57, 0x4D, 0x49, 0x47, 0x47, 0x48, 0x4A, - 0x4C, 0x52, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, - 0x54, 0x53, 0x53, 0x54, 0x54, 0x55, 0x58, 0x5B, - 0x5C, 0x5D, 0x5E, 0x5D, 0x5D, 0x5B, 0x58, 0xFC, - 0xFC, 0xD8, 0x4C, 0x60, 0xFC, 0xF5, 0xFC, 0xFC, - 0xFC, 0xF7, 0x5F, 0x48, 0x48, 0x2C, 0xF8, 0xF9, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x4A, 0x49, - 0x49, 0x49, 0x49, 0x47, 0x3E, 0x44, 0x42, 0x3F, - 0x3E, 0x4B, 0x54, 0x5C, 0x61, 0x64, 0xCB, 0xCB, - 0x64, 0x61, 0x5D, 0x53, 0x4B, 0x49, 0x47, 0x47, - 0x49, 0x4B, 0x50, 0x53, 0x56, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x55, 0x54, - 0x53, 0x53, 0x54, 0x56, 0x58, 0x5A, 0x5B, 0x5D, - 0x5D, 0x5D, 0x5C, 0x5A, 0x54, 0x52, 0x4C, 0xFC, - 0xF7, 0x4E, 0x2D, 0x29, 0x4E, 0xFC, 0xFC, 0xFC, - 0xFB, 0x5F, 0x26, 0x24, 0x20, 0x2E, 0x65, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x45, 0x3F, 0x45, - 0x3E, 0x47, 0x47, 0x47, 0x47, 0x47, 0x3E, 0x44, - 0x43, 0x40, 0x44, 0x49, 0x51, 0x5C, 0x62, 0x64, - 0xCB, 0xCB, 0x63, 0x60, 0x58, 0x50, 0x49, 0x48, - 0x48, 0x48, 0x4A, 0x4D, 0x53, 0x54, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, - 0x54, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x5C, 0x5D, - 0x5C, 0x5A, 0x54, 0x51, 0x4C, 0x4C, 0x54, 0xFC, - 0xF9, 0x23, 0xDB, 0x2D, 0x23, 0xFA, 0xFB, 0xFA, - 0xF5, 0x27, 0x21, 0xD9, 0xF8, 0x20, 0x21, 0xFB, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x5D, 0x58, 0x55, - 0x50, 0x48, 0x45, 0x43, 0x44, 0x44, 0x45, 0x45, - 0x3E, 0x3F, 0x43, 0x41, 0x3F, 0x48, 0x52, 0x5D, - 0x63, 0x65, 0xCB, 0x65, 0x61, 0x5D, 0x52, 0x4B, - 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, - 0x54, 0x58, 0x5A, 0x59, 0x5B, 0x5B, 0x5B, 0x5A, - 0x55, 0x52, 0x4D, 0x4D, 0x55, 0x5B, 0x5D, 0xFC, - 0xF1, 0xF9, 0xFC, 0xD4, 0x21, 0xCC, 0xF7, 0xF8, - 0xF2, 0x21, 0xD9, 0xFC, 0xF2, 0xFB, 0x21, 0x45, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xD1, 0xD0, 0xCD, - 0xCC, 0x63, 0x5E, 0x58, 0x50, 0x47, 0x43, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x40, 0x41, 0x3F, 0x4A, - 0x56, 0x5E, 0x64, 0xCB, 0x65, 0x63, 0x5E, 0x56, - 0x4C, 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, - 0x58, 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, - 0x57, 0x5A, 0x5A, 0x5C, 0x5B, 0x5A, 0x58, 0x54, - 0x51, 0x4C, 0x55, 0x5D, 0x5D, 0x5B, 0x54, 0xFC, - 0xF0, 0xF9, 0xFC, 0x65, 0x45, 0xCD, 0xFB, 0xFB, - 0xF8, 0x26, 0xFB, 0xFC, 0xFC, 0xFC, 0x21, 0x27, - 0xFB, 0xFC, 0xFC, 0xFC, 0xFB, 0xD7, 0x35, 0x34, - 0x2F, 0x35, 0x36, 0x2F, 0x2F, 0x36, 0x2F, 0x2F, - 0x36, 0x36, 0x35, 0x35, 0x43, 0x42, 0x41, 0x2E, - 0x45, 0x4C, 0x5B, 0x62, 0x65, 0xCC, 0x64, 0x60, - 0x58, 0x4D, 0x49, 0x47, 0x47, 0x49, 0x4C, 0x51, - 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x57, - 0x58, 0x5A, 0x5A, 0x5B, 0x5A, 0x55, 0x54, 0x51, - 0x53, 0x5C, 0x5D, 0x5D, 0x54, 0x4B, 0x4D, 0xFC, - 0xFC, 0x44, 0xFC, 0xFB, 0x7B, 0xAB, 0xA8, 0xAE, - 0xAB, 0x7F, 0xFC, 0xFC, 0xFB, 0xFB, 0x22, 0x2A, - 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x2F, 0x30, 0x30, - 0x32, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x2F, 0x2F, 0x40, 0x41, - 0x2E, 0x40, 0x48, 0x56, 0x5F, 0x64, 0xCC, 0x65, - 0x61, 0x59, 0x50, 0x49, 0x47, 0x47, 0x49, 0x4C, - 0x5A, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, - 0x5A, 0x5A, 0x5A, 0x58, 0x55, 0x52, 0x51, 0x5A, - 0x5D, 0x5D, 0x57, 0x4C, 0x51, 0x54, 0x5D, 0xFC, - 0xFC, 0x2A, 0xFC, 0xC9, 0xAA, 0x8B, 0x8A, 0x8C, - 0xAB, 0x8C, 0x8C, 0xFB, 0xFB, 0x23, 0x20, 0xF1, - 0xFC, 0xFC, 0xFC, 0x3B, 0x33, 0x33, 0x32, 0x32, - 0x31, 0x32, 0x30, 0x32, 0x32, 0x32, 0x32, 0x30, - 0x31, 0x31, 0x31, 0x32, 0x33, 0x33, 0x3C, 0x41, - 0x41, 0x2E, 0x2D, 0x45, 0x4D, 0x5D, 0x63, 0xCC, - 0x65, 0x62, 0x5D, 0x51, 0x49, 0x47, 0x47, 0x4A, - 0x59, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, - 0x5A, 0x5A, 0x58, 0x55, 0x53, 0x53, 0x5C, 0x5E, - 0x59, 0x51, 0x4E, 0x54, 0x59, 0x5E, 0x62, 0xFC, - 0xFC, 0xDB, 0xAA, 0xA1, 0x95, 0x9C, 0x8C, 0x88, - 0x82, 0x83, 0x83, 0x8C, 0x88, 0xAE, 0xB9, 0xFB, - 0xFC, 0xFC, 0xFC, 0x3C, 0x3B, 0x72, 0x38, 0x33, - 0x33, 0x33, 0x31, 0x33, 0x31, 0x31, 0x31, 0x31, - 0x33, 0x33, 0x38, 0x33, 0x72, 0x3B, 0x44, 0x2E, - 0x41, 0x2E, 0x2E, 0x2D, 0x43, 0x4B, 0x5B, 0x63, - 0xCB, 0xCC, 0x63, 0x5D, 0x51, 0x49, 0x47, 0x49, - 0x5C, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, - 0x58, 0x58, 0x57, 0x53, 0x58, 0x5D, 0x5E, 0x55, - 0x51, 0x53, 0x58, 0x5E, 0x60, 0x63, 0x64, 0xFC, - 0xFC, 0xC0, 0xA6, 0x9D, 0x8B, 0x9C, 0x8C, 0x8C, - 0x6E, 0x83, 0x88, 0x8C, 0x8C, 0x8C, 0x83, 0xE8, - 0xFB, 0xFC, 0xFC, 0xFC, 0x33, 0x70, 0x70, 0x6F, - 0x6F, 0x6F, 0x6F, 0x3A, 0x6F, 0x6D, 0x6F, 0x6F, - 0x70, 0x6F, 0x6F, 0x70, 0x6F, 0x32, 0x5A, 0x48, - 0x41, 0x2D, 0x2D, 0x2D, 0x2C, 0x41, 0x49, 0x5A, - 0x62, 0xCB, 0xCB, 0x63, 0x5D, 0x50, 0x49, 0x4A, - 0x5C, 0x58, 0x58, 0x57, 0x55, 0x57, 0x57, 0x57, - 0x57, 0x55, 0x56, 0x59, 0x5E, 0x5C, 0x52, 0x53, - 0x55, 0x5B, 0x5E, 0x61, 0x63, 0x64, 0x63, 0xFC, - 0xE8, 0xBF, 0xA4, 0x99, 0x9C, 0x8C, 0x88, 0x88, - 0x6E, 0x88, 0x8C, 0x8C, 0x8C, 0xC2, 0xA6, 0xC4, - 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x3A, 0x6F, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x37, 0x32, 0xCD, 0x5E, - 0x4C, 0x43, 0x2C, 0x2D, 0x2D, 0x2C, 0x2E, 0x47, - 0x57, 0x61, 0x65, 0xCC, 0x63, 0x5C, 0x50, 0x4D, - 0x5C, 0x5A, 0x57, 0x55, 0x55, 0x55, 0x58, 0x58, - 0x55, 0x54, 0x5B, 0x5E, 0x5D, 0x53, 0x53, 0x55, - 0x5D, 0x5E, 0x61, 0x61, 0x61, 0x61, 0x5E, 0xFC, - 0xEA, 0xBE, 0xA4, 0x9B, 0x8B, 0x85, 0x8C, 0x6E, - 0x8C, 0x8C, 0x8C, 0xA3, 0xAA, 0xA4, 0xA4, 0xE9, - 0xFB, 0xFC, 0xFC, 0xFC, 0x36, 0x6D, 0x70, 0x73, - 0x70, 0x70, 0x70, 0x73, 0x73, 0x73, 0x73, 0x70, - 0x70, 0x70, 0x73, 0x70, 0x37, 0x38, 0xD1, 0xCF, - 0x61, 0x4D, 0x44, 0x2C, 0x2D, 0x2E, 0x2C, 0x2E, - 0x3E, 0x56, 0x61, 0xCB, 0xCC, 0x62, 0x5B, 0x57, - 0x59, 0x58, 0x55, 0x54, 0x54, 0x55, 0x58, 0x58, - 0x58, 0x5B, 0x5E, 0x5B, 0x53, 0x55, 0x55, 0x5C, - 0x5E, 0x61, 0x61, 0x60, 0x5D, 0x5A, 0x4E, 0xFC, - 0xFC, 0xEA, 0xAA, 0x9C, 0x8A, 0x85, 0x82, 0x8C, - 0x8C, 0xA8, 0xEB, 0xA8, 0xA4, 0xA4, 0xAA, 0xFC, - 0xFC, 0xFC, 0x64, 0xFB, 0x39, 0x31, 0x72, 0x78, - 0x73, 0x78, 0x73, 0x74, 0x74, 0x74, 0x74, 0x73, - 0x78, 0x70, 0x73, 0x73, 0x33, 0xCC, 0xD2, 0xD1, - 0xCE, 0x62, 0x53, 0x3F, 0x2D, 0x2D, 0x41, 0x2C, - 0x2E, 0x3E, 0x56, 0x62, 0xCB, 0xCB, 0x61, 0x5D, - 0x54, 0x54, 0x54, 0x54, 0x56, 0x58, 0x58, 0x58, - 0x5C, 0x5E, 0x5A, 0x55, 0x58, 0x58, 0x5B, 0x5E, - 0x61, 0x5E, 0x5D, 0x5A, 0x52, 0x55, 0xCD, 0xFC, - 0xFC, 0x34, 0xC9, 0xE8, 0xA8, 0xAE, 0xC2, 0xE8, - 0xC3, 0xA6, 0xA7, 0xA6, 0xAA, 0x78, 0x2E, 0x42, - 0xFC, 0xFC, 0xD2, 0x64, 0xF8, 0x31, 0x72, 0x73, - 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x74, 0x73, - 0x73, 0x73, 0x73, 0x72, 0x33, 0x5C, 0x64, 0xD2, - 0xD1, 0xCF, 0x63, 0x54, 0x3F, 0x2C, 0x41, 0x41, - 0x2C, 0x2E, 0x47, 0x58, 0x63, 0xCB, 0xCB, 0x62, - 0x52, 0x53, 0x53, 0x56, 0x58, 0x58, 0x5A, 0x5B, - 0x5E, 0x5A, 0x57, 0x58, 0x58, 0x58, 0x60, 0x60, - 0x5D, 0x5A, 0x55, 0x4E, 0x64, 0xD2, 0xD1, 0xFC, - 0xFC, 0x41, 0x3E, 0xC1, 0xC0, 0xA3, 0xA6, 0xA7, - 0xA7, 0xA9, 0xAA, 0xB8, 0x2E, 0x3F, 0x2C, 0x41, - 0xFC, 0xFC, 0xF7, 0xCE, 0xCD, 0x36, 0x72, 0x73, - 0x74, 0x75, 0x78, 0x75, 0x75, 0x75, 0x74, 0x74, - 0x74, 0x74, 0x78, 0x72, 0x6D, 0x49, 0x59, 0xCB, - 0xD1, 0xD1, 0xD2, 0xCB, 0x56, 0x3F, 0x2C, 0x41, - 0x40, 0x2D, 0x2E, 0x49, 0x5B, 0x64, 0xCC, 0x64, - 0x51, 0x53, 0x53, 0x55, 0x58, 0x59, 0x5B, 0x5E, - 0x59, 0x58, 0x58, 0x58, 0x55, 0x60, 0x60, 0x5C, - 0x5A, 0x53, 0x5B, 0xD0, 0xD3, 0xD3, 0xD3, 0xFB, - 0xFC, 0x40, 0x41, 0x45, 0xC4, 0xC0, 0xBE, 0xBE, - 0xC1, 0xC0, 0x3C, 0x47, 0x2E, 0x21, 0x22, 0x20, - 0x65, 0xFC, 0xFC, 0xFC, 0xFC, 0x6D, 0x72, 0x75, - 0x78, 0x76, 0x75, 0x79, 0x76, 0x76, 0x76, 0x76, - 0x75, 0x75, 0x75, 0x72, 0x6D, 0x2E, 0x48, 0x5D, - 0xCE, 0xD1, 0xD4, 0xD3, 0xCB, 0x56, 0x43, 0x2C, - 0x42, 0x43, 0x2E, 0x2E, 0x4A, 0x5D, 0x64, 0x64, - 0x50, 0x52, 0x56, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, - 0x5A, 0x58, 0x58, 0x55, 0x61, 0x60, 0x58, 0x58, - 0x4E, 0x61, 0xD1, 0xD4, 0xD4, 0xD1, 0xEE, 0xFC, - 0xFC, 0x2B, 0x29, 0x2E, 0x3F, 0xB0, 0xAD, 0x81, - 0x46, 0x2D, 0x46, 0x2C, 0x24, 0x22, 0x22, 0x23, - 0x25, 0xFC, 0xFC, 0xFC, 0xFC, 0x6E, 0x73, 0x76, - 0x76, 0x79, 0x79, 0x79, 0x76, 0x76, 0x79, 0x76, - 0x79, 0x79, 0x79, 0x74, 0x3F, 0x41, 0x2C, 0x48, - 0x5F, 0xCF, 0xD5, 0xD7, 0xD6, 0xCD, 0x57, 0x40, - 0x2E, 0x3F, 0x44, 0x2E, 0x41, 0x4C, 0x60, 0x61, - 0x51, 0x53, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, 0x5C, - 0x58, 0x57, 0x54, 0x5F, 0x5E, 0x55, 0x55, 0x52, - 0x64, 0xD4, 0xD5, 0xD4, 0xD1, 0x5D, 0xFA, 0xFB, - 0xF4, 0x21, 0x24, 0x41, 0x40, 0x44, 0x2E, 0x2E, - 0x42, 0x41, 0x2A, 0x24, 0x22, 0x22, 0x22, 0x22, - 0x23, 0xD9, 0xFC, 0xFC, 0xFC, 0xFC, 0xE5, 0xB8, - 0x8F, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, - 0x8F, 0x8F, 0xB8, 0xE5, 0x3F, 0x3E, 0x43, 0x2C, - 0x48, 0x61, 0xD1, 0xD7, 0xD9, 0xD7, 0xD0, 0x57, - 0x41, 0x2E, 0x3E, 0x44, 0x2D, 0x40, 0x52, 0x5D, - 0x53, 0x55, 0x59, 0x5D, 0x5E, 0x5E, 0x5D, 0x5A, - 0x57, 0x53, 0x5E, 0x5E, 0x54, 0x53, 0x54, 0x65, - 0xD5, 0xD6, 0xD4, 0xCE, 0x53, 0xFB, 0xF9, 0xFC, - 0x24, 0x22, 0x23, 0x23, 0x41, 0x42, 0x2E, 0x40, - 0x2B, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x23, 0x23, 0xFC, 0xFC, 0xFC, 0xFC, 0xE7, 0xBD, - 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0xB5, 0xC6, 0xEB, 0x2D, 0x47, 0x4A, 0x47, - 0x2C, 0x3E, 0x61, 0xD4, 0xDC, 0xDC, 0xDA, 0xCF, - 0x54, 0x41, 0x41, 0x3E, 0x45, 0x2C, 0x3F, 0x4A, - 0x58, 0x5A, 0x5C, 0x5F, 0x60, 0x5E, 0x5D, 0x57, - 0x51, 0x5D, 0x5D, 0x51, 0x53, 0x53, 0xCB, 0xD5, - 0xD6, 0xD5, 0x63, 0x55, 0xFC, 0xFC, 0xFC, 0x2C, - 0x23, 0x22, 0x23, 0x22, 0x20, 0x2D, 0x2C, 0x26, - 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0xF0, 0xFC, 0xFC, 0xFC, 0xE2, 0xC6, - 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0xC7, 0xE3, 0x3E, 0x2E, 0x49, 0x52, - 0x4C, 0x41, 0x44, 0x62, 0xD6, 0xDE, 0xDE, 0xD9, - 0xD0, 0x51, 0x2E, 0x40, 0x47, 0x44, 0x2C, 0x42, - 0x5D, 0x5D, 0x5F, 0x60, 0x60, 0x5D, 0x57, 0x51, - 0x58, 0x5D, 0x4E, 0x52, 0x55, 0x64, 0xD5, 0xD6, - 0xD4, 0x61, 0x59, 0x6B, 0xFC, 0xFC, 0xFC, 0x21, - 0x23, 0x22, 0x23, 0x22, 0x23, 0x21, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0x24, 0xFC, 0xFC, 0xFC, 0xE2, 0xC7, - 0xB5, 0x90, 0x93, 0x93, 0x93, 0x90, 0x93, 0x93, - 0x90, 0xB5, 0xC8, 0xE4, 0x5F, 0x45, 0x2E, 0x4D, - 0x57, 0x57, 0x44, 0x43, 0x63, 0xDA, 0xDF, 0xDF, - 0xD9, 0xCE, 0x4C, 0x2C, 0x3F, 0x3E, 0x40, 0x40, - 0x60, 0x5E, 0x61, 0x61, 0x5E, 0x5B, 0x53, 0x52, - 0x5C, 0x52, 0x52, 0x55, 0x61, 0xD4, 0xD5, 0xD1, - 0x5E, 0x5B, 0x5C, 0xFB, 0xFC, 0xFC, 0x2A, 0x21, - 0x23, 0x22, 0x23, 0x22, 0x22, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0xFB, 0xFC, 0xFC, 0xB3, 0xC8, - 0xB5, 0x90, 0x92, 0xB5, 0x93, 0x93, 0xB5, 0x93, - 0x92, 0xB5, 0xC8, 0xB9, 0xD0, 0x5E, 0x44, 0x40, - 0x52, 0x58, 0x57, 0x48, 0x40, 0x63, 0xD9, 0xE0, - 0xE0, 0xD9, 0xCB, 0x49, 0x2D, 0x3F, 0x45, 0x3F, - 0x63, 0x61, 0x62, 0x60, 0x5E, 0x55, 0x4D, 0x59, - 0x53, 0x4E, 0x54, 0x5D, 0xD2, 0xD4, 0xD2, 0x5E, - 0x5C, 0x5D, 0xFC, 0xFC, 0xFC, 0xF8, 0x29, 0x23, - 0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x23, 0x22, 0x22, 0x23, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x22, 0x22, 0xF0, 0xFC, 0xFC, 0xB3, 0xC7, - 0xB5, 0x93, 0xB5, 0x93, 0x93, 0x91, 0x93, 0x93, - 0x91, 0xB5, 0xC7, 0xAD, 0xD6, 0xD2, 0x5E, 0x3F, - 0x3F, 0x57, 0x57, 0x58, 0x4A, 0x41, 0x64, 0xDC, - 0xF1, 0xDF, 0xDA, 0x61, 0x45, 0x2E, 0x43, 0x47, - 0xCB, 0x63, 0x62, 0x5F, 0x58, 0x51, 0x53, 0x54, - 0x4C, 0x52, 0x5C, 0xCD, 0xD3, 0xD2, 0x60, 0x5D, - 0x5D, 0xFB, 0xFC, 0xFC, 0xFC, 0xDB, 0x49, 0x24, - 0x21, 0x23, 0x23, 0x22, 0x26, 0x26, 0x2A, 0x24, - 0x22, 0x23, 0x22, 0x21, 0x24, 0x26, 0x26, 0x2A, - 0x29, 0x2B, 0x24, 0x25, 0xFC, 0xFC, 0xB3, 0xC5, - 0x91, 0x91, 0x92, 0x91, 0x92, 0x92, 0x93, 0x93, - 0x91, 0x93, 0xC6, 0xAD, 0xDC, 0xD9, 0xD4, 0x60, - 0x43, 0x45, 0x58, 0x58, 0x57, 0x4B, 0x43, 0xCC, - 0xDD, 0xF1, 0xD8, 0xD5, 0x5D, 0x43, 0x41, 0x47, - 0xCD, 0x63, 0x62, 0x5D, 0x54, 0x4C, 0x55, 0x4B, - 0x51, 0x58, 0x62, 0xD0, 0xD0, 0x62, 0x5D, 0x5D, - 0x67, 0xFC, 0xFC, 0xFC, 0xFC, 0x58, 0x4E, 0x28, - 0x2A, 0x20, 0x23, 0x22, 0x23, 0x2A, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x23, 0x25, 0x2A, 0x2E, 0x2D, - 0x2E, 0x2E, 0x2E, 0x23, 0xFA, 0xFC, 0xB2, 0xBD, - 0xB5, 0x90, 0x91, 0x93, 0x92, 0x90, 0x91, 0x93, - 0x92, 0x91, 0xBD, 0xAD, 0xDE, 0xE0, 0xD8, 0xD7, - 0x61, 0x40, 0x48, 0x58, 0x58, 0x58, 0x48, 0x44, - 0xCF, 0xDE, 0xE0, 0xDD, 0xD0, 0x52, 0x41, 0x45, - 0xCD, 0x63, 0x61, 0x58, 0x4D, 0x51, 0x4C, 0x4B, - 0x54, 0x5D, 0xCC, 0xCE, 0x63, 0x61, 0x5D, 0x5D, - 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x27, 0x21, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x24, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x20, - 0x27, 0x2B, 0x41, 0x2B, 0x23, 0xFC, 0xB2, 0xB6, - 0x93, 0x90, 0x92, 0xB5, 0x92, 0x90, 0xB5, 0x90, - 0x92, 0x93, 0xBC, 0xAD, 0xDC, 0xF1, 0xF3, 0xF0, - 0xD9, 0x61, 0x41, 0x4A, 0x58, 0x57, 0x57, 0x44, - 0x49, 0xD2, 0xDD, 0xD8, 0xDA, 0x63, 0x4A, 0x45, - 0xCC, 0x63, 0x5E, 0x52, 0x4B, 0x4C, 0x49, 0x51, - 0x5C, 0x61, 0xCD, 0x65, 0x63, 0x5E, 0x4E, 0xCF, - 0xFB, 0xFB, 0xF0, 0xFC, 0xD2, 0x2A, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x26, 0x41, 0x27, 0xF9, 0x81, 0xB7, - 0xB5, 0x91, 0x92, 0xB5, 0x91, 0xB5, 0x93, 0xB5, - 0x93, 0xB6, 0xB7, 0xB9, 0xCB, 0xD8, 0xF3, 0xF2, - 0xF2, 0xDB, 0x61, 0x2D, 0x51, 0x58, 0x57, 0x58, - 0x41, 0x51, 0xD4, 0xDB, 0xDC, 0xD1, 0x5B, 0x4C, - 0xCB, 0x62, 0x59, 0x4C, 0x4A, 0x49, 0x4B, 0x55, - 0x60, 0x64, 0xCC, 0x64, 0x5E, 0x55, 0x60, 0xE1, - 0xFB, 0xF8, 0xFC, 0xFC, 0x21, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x21, 0x24, 0x2D, 0x21, 0xB4, 0xBB, - 0xB6, 0xB5, 0xB6, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6, - 0xB6, 0xB6, 0xBB, 0xB9, 0x45, 0xCB, 0xDF, 0xF3, - 0xF3, 0xF3, 0xDB, 0x5E, 0x2C, 0x51, 0x58, 0x58, - 0x52, 0x2D, 0x5C, 0xD4, 0xD9, 0xD5, 0x63, 0x58, - 0x64, 0x60, 0x53, 0x49, 0x4A, 0x49, 0x52, 0x5C, - 0x63, 0xCD, 0xCD, 0x63, 0x5C, 0x4E, 0x65, 0xFC, - 0xFC, 0xF5, 0xFC, 0xD2, 0x23, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x21, 0x22, 0x25, 0x29, 0xB3, 0xC7, - 0xB5, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, - 0xB6, 0xB5, 0xC7, 0xAD, 0x57, 0x3F, 0xCB, 0xF0, - 0xF3, 0xF3, 0xF2, 0xD9, 0x58, 0x41, 0x4C, 0x58, - 0x57, 0x47, 0x42, 0x62, 0xD4, 0xD4, 0xCC, 0x60, - 0x63, 0x5D, 0x50, 0x47, 0x48, 0x4B, 0x58, 0x60, - 0xCC, 0xCE, 0xCD, 0x60, 0x53, 0x5C, 0x62, 0xFB, - 0xF9, 0xFC, 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x23, 0x23, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0x81, 0xC7, - 0xB7, 0xB7, 0xBC, 0xB7, 0xBC, 0xBC, 0xBC, 0xB7, - 0xB7, 0xB7, 0xC8, 0x80, 0x58, 0x57, 0x40, 0xCE, - 0xF3, 0xF2, 0xF2, 0xF0, 0xD5, 0x4C, 0x3F, 0x4B, - 0x52, 0x50, 0x2D, 0x4B, 0x64, 0xD2, 0xCC, 0x61, - 0x60, 0x58, 0x4A, 0x47, 0x47, 0x4C, 0x59, 0x64, - 0xD0, 0xD0, 0x64, 0x59, 0x49, 0x5D, 0xFB, 0xFC, - 0xD9, 0xFC, 0xD6, 0x23, 0x22, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x23, 0x21, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0xB4, 0xC8, - 0xBD, 0xB7, 0xBD, 0xBC, 0xBD, 0xC5, 0xBC, 0xC5, - 0xBC, 0xBD, 0xC7, 0xAC, 0x58, 0x57, 0x58, 0x2C, - 0xD1, 0xF0, 0xF3, 0xF3, 0xE0, 0xCD, 0x45, 0x3E, - 0x48, 0x4B, 0x3F, 0x41, 0x56, 0x64, 0x65, 0x62, - 0x5D, 0x52, 0x47, 0x48, 0x48, 0x53, 0x60, 0xCC, - 0xD2, 0xD0, 0x63, 0x52, 0x4E, 0x53, 0xFB, 0xFB, - 0xFC, 0xFC, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x23, 0x20, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, 0xB4, 0xC7, - 0xC5, 0xBC, 0xC5, 0xBD, 0xC5, 0xC5, 0xBD, 0xC5, - 0xBC, 0xC6, 0xC7, 0xB9, 0x58, 0x57, 0x58, 0x57, - 0x2D, 0xD4, 0xF1, 0xF2, 0xF0, 0xD9, 0x5D, 0x47, - 0x48, 0x3F, 0x42, 0x2C, 0x48, 0x5C, 0x5F, 0x60, - 0x58, 0x50, 0x47, 0x4A, 0x49, 0x55, 0x63, 0xD0, - 0xD2, 0xCD, 0x5D, 0x49, 0x4E, 0xE1, 0xFC, 0xF0, - 0xFC, 0xF8, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x20, 0x21, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, 0xC4, 0xC8, - 0xBD, 0xBD, 0xC6, 0xBD, 0xC6, 0xC6, 0xC5, 0xC6, - 0xBD, 0xC6, 0xC7, 0xE4, 0x54, 0x57, 0x58, 0x57, - 0x57, 0x43, 0xD7, 0xE0, 0xF1, 0xD8, 0xCD, 0x4B, - 0x4A, 0x47, 0x42, 0x2C, 0x3F, 0x4D, 0x58, 0x5C, - 0x52, 0x4B, 0x48, 0x4B, 0x4A, 0x58, 0xCB, 0xD3, - 0xD2, 0xCD, 0x58, 0x47, 0x4A, 0xFC, 0xFC, 0xFB, - 0xFC, 0x2B, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x26, 0x21, 0x21, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0xE5, 0xC8, - 0xBA, 0xC5, 0xC6, 0xC6, 0xC6, 0xC7, 0xC6, 0xC7, - 0xC5, 0xC6, 0xC8, 0xE5, 0x2E, 0x54, 0x58, 0x57, - 0x57, 0x4C, 0x4D, 0xDA, 0xD8, 0xD8, 0xD4, 0x5C, - 0x4B, 0x4B, 0x3F, 0x42, 0x44, 0x4A, 0x51, 0x58, - 0x4B, 0x48, 0x4B, 0x51, 0x4D, 0x5F, 0xD0, 0xD1, - 0xD0, 0x64, 0x51, 0x44, 0x6B, 0xFC, 0xFB, 0xFC, - 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x26, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0xE5, 0xED, - 0xE7, 0xBA, 0xC8, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7, - 0xC7, 0xE5, 0xED, 0xE6, 0x61, 0x41, 0x52, 0x58, - 0x58, 0x57, 0x45, 0x5E, 0xD7, 0xDD, 0xD5, 0x60, - 0x4B, 0x4C, 0x48, 0x4D, 0x4D, 0x50, 0x4D, 0x56, - 0x4A, 0x3E, 0x53, 0x53, 0x52, 0x63, 0xD3, 0xD0, - 0xCE, 0x60, 0x4A, 0x45, 0xFC, 0xFC, 0xF7, 0xFC, - 0xFC, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x21, 0x2A, 0x20, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x21, 0x23, 0xEB, 0xF6, - 0xF6, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, - 0xF6, 0xF6, 0xF6, 0xE6, 0xDB, 0x58, 0x45, 0x4B, - 0x58, 0x57, 0x4D, 0x4B, 0x64, 0xD4, 0xD0, 0x5C, - 0x48, 0x51, 0x4C, 0x5D, 0x5E, 0x5C, 0x56, 0x59, - 0x3E, 0x4A, 0x58, 0x54, 0x52, 0x65, 0xD3, 0xD0, - 0xCF, 0x5D, 0x48, 0xFC, 0xFC, 0xFC, 0xFA, 0xFC, - 0xFC, 0x21, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x21, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x21, 0x4F, 0xE6, 0xC6, - 0xC6, 0xBD, 0xC6, 0xBD, 0xBD, 0xBD, 0xBD, 0xC6, - 0xC5, 0xBA, 0xC7, 0xE6, 0xF2, 0xD4, 0x49, 0x4B, - 0x3E, 0x4D, 0x52, 0x3E, 0x52, 0x63, 0x64, 0x56, - 0x48, 0x54, 0x4D, 0x61, 0xCC, 0xCC, 0x60, 0x60, - 0x47, 0x4D, 0x5C, 0x53, 0x58, 0xCF, 0xD1, 0xCF, - 0xD0, 0x59, 0x45, 0xFC, 0xFC, 0xFC, 0xEF, 0xF9, - 0xFC, 0x21, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x23, 0x4F, 0xE4, 0xB9, - 0xAF, 0x80, 0x80, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, - 0x80, 0xB4, 0xB9, 0xE4, 0x7F, 0xDE, 0x61, 0x52, - 0x54, 0x48, 0x3F, 0x43, 0x4D, 0x56, 0x59, 0x4B, - 0x3E, 0x58, 0x53, 0x61, 0xD3, 0xD4, 0xCF, 0xCD, - 0x4C, 0x58, 0x5F, 0x53, 0x5E, 0xD3, 0xD0, 0xCE, - 0xCE, 0x52, 0x3F, 0xFC, 0xFC, 0xFC, 0xF7, 0x65, - 0xFA, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x21, 0x2A, 0x23, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x21, 0xB1, 0xE4, 0xE6, - 0x7C, 0xB1, 0x7C, 0xB1, 0xB2, 0xB2, 0xB3, 0x3D, - 0xB3, 0x3C, 0xE5, 0xB3, 0xB0, 0xF1, 0xD0, 0x58, - 0x5D, 0x4D, 0x40, 0x41, 0x48, 0x51, 0x4C, 0x3F, - 0x3F, 0x4D, 0x5A, 0x5A, 0xD5, 0xD9, 0xD7, 0xD4, - 0x57, 0x5E, 0x61, 0x4C, 0x63, 0xD4, 0xCF, 0xCE, - 0xCB, 0x4D, 0x4A, 0xFC, 0xFC, 0xFC, 0xFC, 0xF0, - 0xFB, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x23, 0x22, 0x23, 0x23, 0xB1, 0x81, 0x7D, - 0x39, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x7C, 0xB2, 0xB0, 0xDF, 0xD2, 0x57, - 0x60, 0x59, 0x5B, 0x59, 0x52, 0x4C, 0x4A, 0x40, - 0x42, 0x4A, 0x53, 0x4D, 0xD2, 0xDE, 0xDE, 0xD9, - 0x5E, 0x5E, 0x60, 0x4A, 0xCD, 0xD1, 0xCF, 0xCE, - 0x63, 0x49, 0x5C, 0xFB, 0xE8, 0x89, 0x9F, 0xFC, - 0xD6, 0x21, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x21, 0x2A, 0x22, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x7F, 0xB9, - 0x71, 0x6C, 0x38, 0x38, 0x33, 0x33, 0x33, 0x38, - 0x38, 0x71, 0xAD, 0xE4, 0xD3, 0xDA, 0xCC, 0x52, - 0x63, 0x60, 0xCE, 0xD4, 0xCF, 0x60, 0x4C, 0x40, - 0x3F, 0x45, 0x4B, 0x5A, 0xCB, 0xD8, 0xDE, 0xDC, - 0x5E, 0x5E, 0x5F, 0x4C, 0xD2, 0xD2, 0xCF, 0xCF, - 0x61, 0x45, 0x5E, 0xA7, 0x9D, 0x95, 0x8B, 0x99, - 0xFC, 0x41, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x2A, 0x23, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x77, 0x77, 0xF6, - 0xFC, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, - 0x7D, 0xFC, 0x47, 0x64, 0xD0, 0xD0, 0x5D, 0x4B, - 0x62, 0xCC, 0xD1, 0xDE, 0xDE, 0xD4, 0x5E, 0x43, - 0x3F, 0x3E, 0x48, 0x53, 0x58, 0xDB, 0xD8, 0xDC, - 0x5E, 0x5E, 0x5E, 0x53, 0xD4, 0xD2, 0xD0, 0xD0, - 0x5E, 0x49, 0xA7, 0xA6, 0x89, 0x95, 0x8B, 0x9C, - 0x9C, 0xFB, 0xD4, 0x22, 0x22, 0x22, 0x22, 0x23, - 0x22, 0x23, 0x23, 0x2A, 0x22, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x23, 0x22, 0x23, 0x23, 0x98, 0x8C, 0x8C, 0x88, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, - 0xE9, 0x9C, 0x48, 0x5C, 0xD0, 0xCB, 0x48, 0x49, - 0x5B, 0xCB, 0xCD, 0xE0, 0xF1, 0xDD, 0xD0, 0x4A, - 0x41, 0x47, 0x45, 0x4C, 0x48, 0xD7, 0xDE, 0xDC, - 0x5E, 0x5E, 0x5A, 0x58, 0xD1, 0xD0, 0xD0, 0xD2, - 0x5C, 0x55, 0xA7, 0xA6, 0x87, 0x86, 0x89, 0x94, - 0x9C, 0xA9, 0xFC, 0xF4, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x23, 0xA4, 0x89, 0x8C, 0xAA, - 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, - 0x85, 0x88, 0x8D, 0x59, 0x64, 0x63, 0x47, 0x3E, - 0x4C, 0x60, 0x61, 0xE0, 0xF0, 0xDF, 0xD9, 0x5D, - 0x2E, 0x3E, 0x3E, 0x47, 0x4D, 0xCD, 0xDE, 0xDC, - 0x5D, 0x5C, 0x51, 0x5D, 0xD1, 0xD2, 0xD2, 0xD4, - 0x5A, 0xBE, 0xA7, 0x98, 0x8A, 0x8A, 0xA0, 0x8B, - 0x86, 0x86, 0xF7, 0xFC, 0xF7, 0x26, 0x23, 0x23, - 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x21, 0x21, 0x21, 0xA1, 0x98, 0x9F, 0xBF, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xA7, - 0x8C, 0x86, 0x8D, 0x59, 0x5E, 0x5D, 0x3F, 0x3E, - 0x47, 0x53, 0x63, 0xD9, 0xF0, 0xF1, 0xDE, 0xD0, - 0x43, 0x3E, 0x47, 0x45, 0x4A, 0x5B, 0xDC, 0xDA, - 0x5D, 0x59, 0x49, 0x5F, 0xD1, 0xD2, 0xD3, 0xB9, - 0xA5, 0xA7, 0x98, 0x9B, 0x96, 0x9D, 0x89, 0x89, - 0x8B, 0x9C, 0x9D, 0xFC, 0xFC, 0xFC, 0x26, 0x22, - 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x29, 0x2D, 0x99, 0x99, 0xA2, 0xAA, - 0xC4, 0xFB, 0xFC, 0xFC, 0xFC, 0xF6, 0xBF, 0xA2, - 0x9C, 0x9C, 0x8E, 0xDC, 0xCD, 0x51, 0x41, 0x3E, - 0x45, 0x49, 0x58, 0xCD, 0xE0, 0xE0, 0xD8, 0xDA, - 0x4C, 0x4A, 0x45, 0x45, 0x48, 0x47, 0xDA, 0xDA, - 0x5C, 0x58, 0x44, 0x69, 0xA9, 0x98, 0xA4, 0xA6, - 0xA1, 0xA4, 0x99, 0x9E, 0x9D, 0x8B, 0x8A, 0x97, - 0x87, 0x9A, 0x8A, 0xC2, 0xFC, 0xFC, 0xFC, 0x4D, - 0x21, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, - 0x21, 0x22, 0x2D, 0x34, 0xA4, 0xA2, 0xA2, 0xA9, - 0xBF, 0xC0, 0xC3, 0xC1, 0xC0, 0xBE, 0xA6, 0x9D, - 0x99, 0x87, 0xA2, 0xF1, 0xDC, 0x64, 0x42, 0x45, - 0x47, 0x3E, 0x49, 0x4C, 0xDD, 0xDF, 0xD8, 0xDB, - 0x5E, 0x4C, 0x48, 0x45, 0x45, 0x41, 0xD1, 0xD6, - 0x5A, 0x55, 0x3F, 0xA7, 0xA1, 0x98, 0x9F, 0x99, - 0x9F, 0x9D, 0x9A, 0x95, 0x8B, 0x97, 0x89, 0x8A, - 0x88, 0x94, 0x9C, 0x8C, 0xFC, 0xFC, 0xFC, 0xFC, - 0xF4, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x23, 0x23, 0x2C, 0x2C, 0xA8, 0xA2, 0xA4, 0xA4, - 0xA9, 0xAA, 0xAA, 0xAA, 0xA9, 0xA6, 0x98, 0x9C, - 0x8B, 0x88, 0x98, 0x8D, 0xD8, 0xD6, 0x4E, 0x47, - 0x47, 0x49, 0x47, 0x3F, 0xDA, 0xDD, 0xDE, 0xDD, - 0xCC, 0x4A, 0x4B, 0x3E, 0x45, 0x43, 0x61, 0xD4, - 0x56, 0x51, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0x9A, - 0xA0, 0xA2, 0x98, 0x98, 0x8B, 0x8B, 0x98, 0x98, - 0x84, 0x8B, 0x94, 0x8A, 0xA4, 0xFC, 0xFC, 0xFC, - 0xFC, 0xF2, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x23, - 0x23, 0x22, 0x2C, 0x2D, 0xC0, 0xA4, 0xA2, 0xA4, - 0xA4, 0xA6, 0xA6, 0xA6, 0xA4, 0xA2, 0x9F, 0x89, - 0x8B, 0x9C, 0x9C, 0x8B, 0x68, 0xDB, 0x5F, 0x4B, - 0x3E, 0x49, 0x4B, 0x3E, 0xCC, 0xDA, 0xDC, 0xDD, - 0xD3, 0x49, 0x52, 0x48, 0x45, 0x45, 0x53, 0xD0, - 0x51, 0x4A, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0xA0, - 0x9B, 0x86, 0x89, 0x98, 0x89, 0x8A, 0x96, 0x8A, - 0x9C, 0x89, 0x89, 0x9C, 0x8C, 0xF6, 0xFC, 0xFC, - 0xFC, 0xFC, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, - 0x22, 0x21, 0x2B, 0x34, 0xC0, 0xA8, 0xA4, 0xA2, - 0xA2, 0x98, 0xA1, 0xA0, 0x98, 0x9F, 0x95, 0x8A, - 0x94, 0xA1, 0x8A, 0x84, 0x9B, 0x68, 0xCC, 0x49, - 0x4A, 0x47, 0x4C, 0x4B, 0x51, 0xD3, 0xDA, 0xDC, - 0xD5, 0x56, 0x56, 0x4A, 0x3E, 0x45, 0x48, 0x63, - 0x4A, 0x47, 0x3E, 0xA7, 0x98, 0x9D, 0x9E, 0x8B, - 0x95, 0x9B, 0x89, 0x86, 0x9B, 0x8B, 0x89, 0x84, - 0x9A, 0xA1, 0x95, 0x9A, 0x8C, 0xA4, 0xFC, 0xFC, - 0xFC, 0xFA, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, - 0x21, 0x23, 0x2C, 0xF6, 0xBF, 0xA9, 0xA2, 0x99, - 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9B, 0x87, 0x8B, - 0x9C, 0x86, 0x9C, 0x8A, 0x87, 0x87, 0x89, 0x51, - 0x54, 0x47, 0x4B, 0x50, 0x4B, 0xCF, 0xD6, 0xDC, - 0xD5, 0x60, 0x54, 0x52, 0x48, 0x45, 0x40, 0x5A, - 0x45, 0x43, 0x47, 0xA7, 0x98, 0x9B, 0x95, 0x95, - 0x9A, 0x87, 0x98, 0x98, 0x8A, 0x86, 0x87, 0x9E, - 0x9B, 0x95, 0x9D, 0x9D, 0x99, 0x85, 0xA6, 0xFA, - 0xF2, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x22, - 0x21, 0x24, 0xFB, 0xF7, 0xBF, 0xA6, 0xA2, 0x99, - 0x97, 0x89, 0x86, 0x89, 0x9C, 0x96, 0x9E, 0x94, - 0x89, 0x99, 0x98, 0x89, 0x9E, 0x9B, 0x89, 0x8B, - 0x58, 0x4B, 0x4A, 0x52, 0x48, 0xCC, 0xD3, 0xDA, - 0xD3, 0x65, 0x4C, 0x58, 0x49, 0x3E, 0x2E, 0x4D, - 0x40, 0x41, 0x45, 0xA9, 0xA1, 0x9B, 0x9E, 0x9C, - 0x95, 0x8A, 0x94, 0x89, 0x96, 0x87, 0x9C, 0x9A, - 0x84, 0x9D, 0x9C, 0x9E, 0x9A, 0x9C, 0x9D, 0xBB, - 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x23, 0x23, - 0x24, 0xFC, 0xFC, 0xF6, 0xBF, 0xA6, 0x9F, 0x99, - 0x89, 0x95, 0x87, 0x94, 0x9D, 0x9E, 0x97, 0x9E, - 0x95, 0x9B, 0x89, 0x95, 0x95, 0x9B, 0x89, 0x87, - 0x5D, 0x56, 0x3E, 0x51, 0x3E, 0x60, 0xCF, 0xD3, - 0xD2, 0xCD, 0x5C, 0x49, 0x4B, 0x3E, 0x2C, 0x48, - 0x3E, 0x43, 0x3E, 0xA9, 0xA1, 0x9B, 0x97, 0x94, - 0x95, 0x9A, 0x9C, 0x87, 0x87, 0x9B, 0x9C, 0x95, - 0x9D, 0x89, 0x9A, 0x89, 0x9E, 0x9E, 0x8C, 0xA6, - 0x20, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x20, 0x40, - 0xFC, 0xFC, 0xFC, 0xEC, 0xBE, 0xA4, 0x9F, 0x99, - 0x95, 0x9F, 0xA0, 0x88, 0x9D, 0x8B, 0x97, 0x95, - 0x87, 0x95, 0x96, 0x95, 0x97, 0x94, 0x94, 0x98, - 0xD3, 0x4C, 0x47, 0x4D, 0x42, 0x4C, 0x60, 0xCC, - 0xCE, 0xD0, 0x65, 0x4B, 0x47, 0x44, 0x2B, 0x45, - 0x4B, 0x47, 0x49, 0xA7, 0xA1, 0x9A, 0x97, 0x89, - 0x95, 0x97, 0x97, 0x9E, 0x89, 0x95, 0x89, 0x9C, - 0x87, 0x95, 0x97, 0x99, 0x95, 0x99, 0x9F, 0xA4, - 0xC4, 0x21, 0x21, 0x23, 0x21, 0x23, 0x23, 0x23, - 0x23, 0x23, 0x23, 0x23, 0x21, 0x20, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEA, 0xAA, 0xA6, 0xA2, 0x99, - 0x8B, 0x9A, 0x95, 0x9E, 0x9E, 0x9A, 0x94, 0x87, - 0x94, 0x94, 0x89, 0x94, 0x9B, 0x9B, 0xA7, 0xDC, - 0xDB, 0x65, 0x2E, 0x3E, 0x43, 0x44, 0x49, 0x58, - 0x63, 0xD3, 0xD3, 0x5E, 0x42, 0x42, 0x2D, 0x40, - 0x54, 0x4C, 0x4A, 0xA7, 0xA0, 0x99, 0x9B, 0x94, - 0xA0, 0x8A, 0x9B, 0x9D, 0x87, 0x95, 0x94, 0x8B, - 0x8A, 0x98, 0x9C, 0x8A, 0x9B, 0x99, 0xA2, 0xA6, - 0xBF, 0xEC, 0x2A, 0x20, 0x21, 0x23, 0x21, 0x20, - 0x20, 0x20, 0x20, 0x4C, 0xF9, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEB, 0xAA, 0xA4, 0x9F, 0x9C, - 0x8B, 0x9B, 0x88, 0x84, 0x9E, 0x9D, 0x96, 0x94, - 0x94, 0x9A, 0x9B, 0x9B, 0xA4, 0xD5, 0xCD, 0xDE, - 0xF1, 0xDA, 0x4C, 0x2D, 0x41, 0x2B, 0x42, 0x4C, - 0x5E, 0xD4, 0xD7, 0xCD, 0x49, 0x2E, 0x2E, 0x41, - 0x5E, 0x57, 0xA7, 0xA6, 0xA7, 0xA4, 0xA2, 0x98, - 0x9D, 0x9C, 0xA1, 0x99, 0x9D, 0x88, 0x8B, 0x9C, - 0x8A, 0x9C, 0x9C, 0x94, 0x9C, 0x89, 0xA0, 0xA6, - 0xAA, 0xEB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFB, 0xE9, 0xAA, 0xA6, 0xA2, 0x8B, - 0x8B, 0x8A, 0x86, 0x9B, 0x9C, 0x98, 0xA0, 0x9B, - 0x9B, 0x84, 0xA7, 0xB4, 0x61, 0xD1, 0xD2, 0xE0, - 0xF1, 0xDC, 0x61, 0x2D, 0x2E, 0x3F, 0x56, 0x62, - 0x5D, 0xD4, 0xD9, 0xD3, 0x54, 0x41, 0x41, 0x44, - 0xCB, 0x60, 0x52, 0xA9, 0xA9, 0xA9, 0xA7, 0xA6, - 0xA6, 0xA4, 0xA4, 0xA2, 0xA2, 0x9D, 0x95, 0x89, - 0x9C, 0x8A, 0x9E, 0x9C, 0x8A, 0x9E, 0xA0, 0xA8, - 0xC0, 0xE9, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xE9, 0xAA, 0xA6, 0xA0, 0x99, - 0x9C, 0x8B, 0x9A, 0x84, 0x9B, 0x9B, 0x98, 0x98, - 0xA9, 0xB9, 0x49, 0x57, 0xCB, 0xD4, 0xD3, 0xF1, - 0xD8, 0xDA, 0xCE, 0x3F, 0x41, 0x4B, 0x5D, 0xCB, - 0x5E, 0xD6, 0xDB, 0xD6, 0x5D, 0x43, 0x3F, 0x49, - 0xD1, 0xCC, 0x4F, 0xDD, 0xC3, 0xBB, 0xBF, 0xAA, - 0xAA, 0xA9, 0xAA, 0xA8, 0xA8, 0xA6, 0xA6, 0xA2, - 0x9C, 0x9F, 0x9B, 0x9A, 0x9D, 0xA2, 0xA8, 0xAA, - 0xC1, 0xEA, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEA, 0xC0, 0xAA, 0xA6, 0xA2, - 0xA2, 0x99, 0xA0, 0xA0, 0xA4, 0xA7, 0xA9, 0xC0, - 0x67, 0x49, 0x54, 0x60, 0xD0, 0xD4, 0xCC, 0xDF, - 0xD9, 0xD5, 0xD2, 0x3E, 0x47, 0x56, 0x60, 0xCD, - 0x5D, 0xD9, 0xD9, 0xD6, 0x61, 0x3F, 0x47, 0x52, - 0xD6, 0xD3, 0x62, 0x4D, 0x40, 0x4A, 0x57, 0xCA, - 0xC3, 0xC1, 0xC1, 0xC0, 0xBF, 0xBF, 0xAA, 0xAA, - 0xA6, 0xA4, 0xA4, 0xA4, 0xA6, 0xA8, 0xBE, 0xC1, - 0xC9, 0xEB, 0xFB, 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEB, 0xC3, 0xC0, 0xAA, 0xA8, - 0xA6, 0xA6, 0xA6, 0xA9, 0xAA, 0xC0, 0xE8, 0xD0, - 0xD2, 0x4C, 0x5E, 0x64, 0xD0, 0xD1, 0x5F, 0xD9, - 0xD5, 0xD1, 0xD0, 0x48, 0x52, 0x5C, 0x64, 0xCD, - 0x5C, 0xDC, 0xD7, 0xD5, 0x62, 0x3F, 0x4C, 0x53, - 0xDA, 0xD7, 0xCE, 0x56, 0x40, 0x4B, 0x52, 0x56, - 0xCE, 0xDF, 0x6A, 0xEB, 0xE9, 0xC9, 0xC3, 0xC0, - 0xC0, 0xBF, 0xBE, 0xAA, 0xBF, 0xC0, 0xC3, 0xC9, - 0xEA, 0xF6, 0xEE, 0x58, 0x57, 0x5E, 0xD6, 0xD0, - 0xD2, 0x61, 0xCB, 0xD6, 0xD6, 0xD4, 0xDF, 0xF3, - 0xF2, 0xDD, 0xD7, 0xEB, 0xC9, 0xC1, 0xC0, 0xBF, - 0xAA, 0xAA, 0xAA, 0xBE, 0xC3, 0xF0, 0xD2, 0xD2, - 0xD2, 0x51, 0x62, 0xCC, 0xD0, 0xCC, 0x61, 0xD3, - 0xCF, 0xCE, 0xD2, 0x48, 0x5A, 0x61, 0xCC, 0xCE, - 0x5F, 0xD9, 0xD5, 0xD1, 0x63, 0x44, 0x56, 0x56, - 0xDC, 0xD9, 0xD4, 0x5E, 0x42, 0x4A, 0x4C, 0x57, - 0x5D, 0xD8, 0xE0, 0xD8, 0xDC, 0xCB, 0x66, 0xEC, - 0xE8, 0xC3, 0xC3, 0xC3, 0xC3, 0xC9, 0xE8, 0xEA, - 0xF6, 0x50, 0x3E, 0x58, 0x57, 0x5A, 0xD6, 0xD4, - 0xCC, 0x4B, 0x53, 0x5C, 0x64, 0xD1, 0xDF, 0xF3, - 0xF1, 0xDE, 0xD9, 0xF6, 0xEB, 0xC9, 0xC1, 0xC1, - 0xC0, 0xC0, 0xC1, 0xC9, 0xF0, 0xD6, 0xCD, 0xD6, - 0xD3, 0x53, 0xCB, 0xCF, 0xCD, 0x5F, 0x5F, 0xCE, - 0xCF, 0xCD, 0xD0, 0x47, 0x5F, 0xCB, 0xCE, 0xCD, - 0x63, 0xD6, 0xD3, 0xD1, 0x63, 0x3F, 0x58, 0x58, - 0xDB, 0xDC, 0xDA, 0x65, 0x3E, 0x49, 0x49, 0x4D, - 0x49, 0xDC, 0xDF, 0xE0, 0xDE, 0xD5, 0x47, 0x47, - 0x46, 0x6B, 0xEB, 0xEA, 0xE9, 0xEA, 0xEB, 0xF6, - 0xD0, 0x57, 0x57, 0x47, 0x47, 0x5B, 0xD4, 0xD4, - 0xCD, 0x44, 0x3E, 0x4B, 0x50, 0x4B, 0x51, 0xD5, - 0xDB, 0xD8, 0xDE, 0x4B, 0xF6, 0xF6, 0xEA, 0xE9, - 0xE8, 0xEA, 0xEB, 0x67, 0x5E, 0xCC, 0xD6, 0xDC, - 0xD5, 0x58, 0xCE, 0xCE, 0x62, 0x50, 0xCC, 0xD3, - 0xD2, 0xCD, 0xCD, 0x4B, 0x64, 0xCE, 0xCE, 0x64, - 0xCC, 0xD3, 0xD2, 0xD2, 0x61, 0x47, 0x5D, 0x5C, - 0xDD, 0xDD, 0xD9, 0xD1, 0x4C, 0x47, 0x49, 0x4A, - 0x4B, 0xD1, 0xD8, 0xE0, 0xDF, 0xDD, 0x5D, 0x4A, - 0x48, 0x52, 0x51, 0x3F, 0xF6, 0xEC, 0xE0, 0xE0, - 0xD3, 0x5E, 0x5F, 0x50, 0x4B, 0x50, 0xCB, 0xCE, - 0x64, 0x45, 0x4C, 0x57, 0x57, 0x58, 0x52, 0xD6, - 0xD3, 0xDE, 0xDF, 0xD1, 0x3E, 0x4B, 0xF6, 0xF6, - 0xEC, 0x66, 0x53, 0x43, 0x56, 0xD1, 0xD9, 0xDE, - 0xD4, 0x5E, 0xCE, 0xCC, 0x5B, 0x2C, 0xD4, 0xD5, - 0xD2, 0xD0, 0x63, 0x5D, 0xCD, 0xD0, 0xCD, 0x5E, - 0xD0, 0xCF, 0xCE, 0xD2, 0x5E, 0x50, 0x60, 0x5D, - 0xDE, 0xDD, 0xDC, 0xD7, 0x5D, 0x45, 0x47, 0x3E, - 0x4B, 0x5E, 0xDE, 0xDF, 0xE0, 0xD8, 0xCF, 0x3E, - 0x45, 0x51, 0x58, 0x42, 0xCB, 0xDA, 0xDE, 0xD8, - 0xD2, 0x61, 0xCC, 0xCF, 0xD6, 0xDA, 0xDA, 0xD5, - 0xD0, 0x50, 0x44, 0x57, 0x57, 0x58, 0x45, 0xD1, - 0xD1, 0xD7, 0xDF, 0xDF, 0xD7, 0xCF, 0x64, 0x60, - 0xCE, 0xCE, 0xCE, 0x63, 0xCF, 0xDA, 0xDE, 0xD9, - 0xCF, 0x63, 0xCD, 0x63, 0x4D, 0x4B, 0xD6, 0xD5, - 0xCE, 0xD3, 0x60, 0xCB, 0xD0, 0xD0, 0x65, 0x47, - 0xD0, 0xCC, 0xCC, 0xD1, 0x59, 0x5D, 0x63, 0x5E, - 0xDD, 0xDD, 0xDE, 0xDC, 0xCB, 0x40, 0x48, 0x45, - 0x3E, 0x3E, 0xD9, 0xDF, 0xE0, 0xDF, 0xDA, 0x51, - 0x4C, 0x48, 0x56, 0x4C, 0x5B, 0xD2, 0xDA, 0xDB, - 0xCB, 0x5F, 0xD0, 0xCC, 0xDC, 0xF0, 0xF3, 0xE0, - 0xDD, 0xCC, 0x41, 0x50, 0x57, 0x57, 0x4B, 0x5D, - 0xD3, 0xD1, 0xDE, 0xDF, 0xDE, 0xD7, 0xD0, 0xD0, - 0xD5, 0xD6, 0xD6, 0xCE, 0xD7, 0xDC, 0xDA, 0xD5, - 0x60, 0x63, 0x64, 0x5E, 0x47, 0x61, 0xD5, 0xD2, - 0xCF, 0xD0, 0x59, 0xCD, 0xD1, 0xCF, 0x61, 0x4D, - 0xCC, 0xCE, 0xCD, 0xD0, 0x52, 0x61, 0x64, 0x60, - 0xDA, 0xDE, 0xDE, 0xDD, 0xD1, 0x4B, 0x4A, 0x45, - 0x3E, 0x41, 0xCD, 0xDE, 0xE0, 0xF1, 0xDE, 0x63, - 0x4A, 0x4A, 0x4A, 0x4B, 0x50, 0xCB, 0xD4, 0xD7, - 0x5E, 0x54, 0x62, 0xD3, 0xD4, 0xF0, 0xF3, 0xF3, - 0xF2, 0xDE, 0x61, 0x40, 0x49, 0x56, 0x4D, 0x3E, - 0x4B, 0xCE, 0xD9, 0xD8, 0xD9, 0xD5, 0xCF, 0xD2, - 0xD6, 0xD6, 0xD1, 0xD1, 0xD7, 0xD5, 0xCF, 0xD0, - 0x54, 0x64, 0x63, 0x56, 0x2C, 0xCB, 0xD1, 0xCC, - 0xD3, 0xCD, 0x54, 0xCF, 0xD1, 0xCE, 0x5E, 0x5C, - 0xCE, 0xCE, 0xCE, 0xCB, 0x4B, 0x63, 0xCC, 0x61, - 0xD4, 0xDC, 0xDE, 0xDE, 0xDA, 0x5D, 0x45, 0x45, - 0x48, 0x3F, 0x52, 0xD9, 0xD8, 0xDF, 0xDF, 0xD2, - 0x52, 0x4B, 0x3E, 0x2E, 0x47, 0x60, 0xCF, 0xD3, - 0x59, 0x48, 0x50, 0x5E, 0xCC, 0xDE, 0xF2, 0xF2, - 0xF3, 0xF3, 0xDD, 0x5D, 0x3E, 0x48, 0x47, 0x47, - 0x58, 0xD1, 0xDA, 0xDA, 0xD5, 0xD1, 0xCD, 0xD2, - 0xD3, 0xCF, 0xD3, 0xD1, 0xCD, 0xD3, 0xD2, 0x5E, - 0x52, 0x64, 0x60, 0x4B, 0x45, 0x61, 0xCD, 0xD3, - 0xD3, 0x64, 0x61, 0xD0, 0xD0, 0x64, 0x45, 0x63, - 0xD0, 0xCE, 0xD0, 0x60, 0x56, 0xCB, 0xCC, 0x62, - 0xCE, 0xDA, 0xDE, 0xD8, 0xDD, 0xCC, 0x45, 0x49, - 0x3E, 0x47, 0x42, 0xD1, 0xDC, 0xD8, 0xD8, 0xD3, - 0x5D, 0x4C, 0x49, 0x3F, 0x47, 0x59, 0xCD, 0xCF, - 0x59, 0x2E, 0x48, 0x47, 0x52, 0x63, 0xF0, 0xF2, - 0xF3, 0xF3, 0xF2, 0xDA, 0x52, 0x4B, 0x52, 0x58, - 0x5E, 0x63, 0xD0, 0xD0, 0xD0, 0xCF, 0xCE, 0xCE, - 0xCF, 0x65, 0x61, 0xD6, 0xD6, 0xD6, 0xCB, 0x4B, - 0x61, 0x62, 0x5D, 0x43, 0x4B, 0x61, 0xD0, 0xD4, - 0xD1, 0x61, 0xCE, 0xD2, 0xCD, 0x5E, 0x4A, 0xCE, - 0xD0, 0xCC, 0xD0, 0x59, 0x61, 0xCC, 0xCC, 0x62, - 0xD1, 0xD5, 0xDE, 0xD8, 0xDD, 0xCF, 0x4B, 0x4A, - 0x45, 0x3E, 0x2D, 0xCB, 0xDC, 0xDE, 0xD8, 0xD5, - 0x60, 0x54, 0x51, 0x4C, 0x4D, 0x5C, 0xCC, 0xCE, - 0x5A, 0x2C, 0x50, 0x53, 0x3E, 0x59, 0xD8, 0xF3, - 0xF2, 0xF3, 0xF3, 0xE0, 0x5E, 0x4A, 0x4C, 0x53, - 0x5E, 0x63, 0xCC, 0xCC, 0xCC, 0xCD, 0xCF, 0xD3, - 0x62, 0x53, 0xD6, 0xD6, 0xD6, 0xD6, 0x5B, 0x48, - 0x64, 0x63, 0x59, 0x44, 0x57, 0x63, 0xD2, 0xD3, - 0xD0, 0x5E, 0xD0, 0xD1, 0xCB, 0x58, 0x4C, 0xCF, - 0xCF, 0xCE, 0xCE, 0x57, 0x63, 0xCC, 0xCD, 0x57, -}; - diff -u --recursive --new-file v2.4.5/linux/drivers/usb/Config.in linux/drivers/usb/Config.in --- v2.4.5/linux/drivers/usb/Config.in Fri May 25 18:28:55 2001 +++ linux/drivers/usb/Config.in Mon Jun 4 16:02:56 2001 @@ -53,7 +53,7 @@ dep_tristate ' USB Kodak DC-2xx Camera support' CONFIG_USB_DC2XX $CONFIG_USB dep_tristate ' USB Mustek MDC800 Digital Camera support (EXPERIMENTAL)' CONFIG_USB_MDC800 $CONFIG_USB $CONFIG_EXPERIMENTAL dep_tristate ' USB Scanner support' CONFIG_USB_SCANNER $CONFIG_USB - dep_tristate ' Microtek X6USB scanner support (EXPERIMENTAL)' CONFIG_USB_MICROTEK $CONFIG_USB $CONFIG_SCSI $CONFIG_EXPERIMENTAL + dep_tristate ' Microtek X6USB scanner support' CONFIG_USB_MICROTEK $CONFIG_USB $CONFIG_SCSI comment 'USB Multimedia devices' dep_tristate ' USB IBM (Xirlink) C-it Camera support' CONFIG_USB_IBMCAM $CONFIG_USB $CONFIG_VIDEO_DEV diff -u --recursive --new-file v2.4.5/linux/drivers/usb/bluetooth.c linux/drivers/usb/bluetooth.c --- v2.4.5/linux/drivers/usb/bluetooth.c Fri May 25 18:28:55 2001 +++ linux/drivers/usb/bluetooth.c Mon Jun 4 16:04:08 2001 @@ -1,11 +1,20 @@ /* - * bluetooth.c Version 0.8 + * bluetooth.c Version 0.10 * * Copyright (c) 2000 Greg Kroah-Hartman * Copyright (c) 2000 Mark Douglas Corner * * USB Bluetooth driver, based on the Bluetooth Spec version 1.0B * + * (2001/05/28) Version 0.10 gkh + * - Fixed problem with using data from userspace in the bluetooth_write + * function as found by the CHECKER project. + * - Added a buffer to the write_urb_pool which reduces the number of + * buffers being created and destroyed for ever write. Also cleans + * up the logic a bit. + * - Added a buffer to the control_urb_pool which fixes a memory leak + * when the device is removed from the system. + * * (08/04/2001) gb * Identify version on module load. * @@ -97,7 +106,7 @@ /* * Version Information */ -#define DRIVER_VERSION "v0.8" +#define DRIVER_VERSION "v0.10" #define DRIVER_AUTHOR "Greg Kroah-Hartman, Mark Douglas Corner" #define DRIVER_DESC "USB Bluetooth driver" @@ -260,7 +269,7 @@ } -static int bluetooth_ctrl_msg (struct usb_bluetooth *bluetooth, int request, int value, void *buf, int len) +static int bluetooth_ctrl_msg (struct usb_bluetooth *bluetooth, int request, int value, const unsigned char *buf, int len) { struct urb *urb = NULL; devrequest *dr = NULL; @@ -282,11 +291,23 @@ return -ENOMEM; } - /* free up the last buffer that this urb used */ - if (urb->transfer_buffer != NULL) { - kfree(urb->transfer_buffer); - urb->transfer_buffer = NULL; + /* keep increasing the urb transfer buffer to fit the size of the message */ + if (urb->transfer_buffer == NULL) { + urb->transfer_buffer = kmalloc (len, GFP_KERNEL); + if (urb->transfer_buffer == NULL) { + err (__FUNCTION__" - out of memory"); + return -ENOMEM; + } + } + if (urb->transfer_buffer_length < len) { + kfree (urb->transfer_buffer); + urb->transfer_buffer = kmalloc (len, GFP_KERNEL); + if (urb->transfer_buffer == NULL) { + err (__FUNCTION__" - out of memory"); + return -ENOMEM; + } } + memcpy (urb->transfer_buffer, buf, len); dr->requesttype = BLUETOOTH_CONTROL_REQUEST_TYPE; dr->request = request; @@ -295,14 +316,14 @@ dr->length = cpu_to_le16p(&len); FILL_CONTROL_URB (urb, bluetooth->dev, usb_sndctrlpipe(bluetooth->dev, 0), - (unsigned char*)dr, buf, len, bluetooth_ctrl_callback, bluetooth); + (unsigned char*)dr, urb->transfer_buffer, len, bluetooth_ctrl_callback, bluetooth); /* send it down the pipe */ status = usb_submit_urb(urb); if (status) dbg(__FUNCTION__ " - usb_submit_urb(control) failed with status = %d", status); - return 0; + return status; } @@ -401,12 +422,13 @@ { struct usb_bluetooth *bluetooth = get_usb_bluetooth ((struct usb_bluetooth *)tty->driver_data, __FUNCTION__); struct urb *urb = NULL; - unsigned char *new_buffer; + unsigned char *temp_buffer = NULL; + const unsigned char *current_buffer; const unsigned char *current_position; - int status; int bytes_sent; int buffer_size; int i; + int retval = 0; if (!bluetooth) { return -ENODEV; @@ -436,38 +458,39 @@ printk ("\n"); #endif - switch (*buf) { + if (from_user) { + temp_buffer = kmalloc (count, GFP_KERNEL); + if (temp_buffer == NULL) { + err (__FUNCTION__ "- out of memory."); + retval = -ENOMEM; + goto exit; + } + copy_from_user (temp_buffer, buf, count); + current_buffer = temp_buffer; + } else { + current_buffer = buf; + } + + switch (*current_buffer) { /* First byte indicates the type of packet */ case CMD_PKT: /* dbg(__FUNCTION__ "- Send cmd_pkt len:%d", count);*/ if (in_interrupt()){ printk("cmd_pkt from interrupt!\n"); - return count; - } - - new_buffer = kmalloc (count-1, GFP_KERNEL); - - if (!new_buffer) { - err (__FUNCTION__ "- out of memory."); - return -ENOMEM; + retval = count; + goto exit; } - if (from_user) - copy_from_user (new_buffer, buf+1, count-1); - else - memcpy (new_buffer, buf+1, count-1); - - if (bluetooth_ctrl_msg (bluetooth, 0x00, 0x00, new_buffer, count-1) != 0) { - kfree (new_buffer); - return 0; + retval = bluetooth_ctrl_msg (bluetooth, 0x00, 0x00, ¤t_buffer[1], count-1); + if (retval) { + goto exit; } - - /* need to free new_buffer somehow... FIXME */ - return count; + retval = count; + break; case ACL_PKT: - current_position = buf; + current_position = current_buffer; ++current_position; --count; bytes_sent = 0; @@ -484,37 +507,25 @@ } if (urb == NULL) { dbg (__FUNCTION__ " - no free urbs"); - return bytes_sent; + retval = bytes_sent; + goto exit; } - /* free up the last buffer that this urb used */ - if (urb->transfer_buffer != NULL) { - kfree(urb->transfer_buffer); - urb->transfer_buffer = NULL; - } buffer_size = MIN (count, bluetooth->bulk_out_buffer_size); - - new_buffer = kmalloc (buffer_size, GFP_KERNEL); - if (new_buffer == NULL) { - err(__FUNCTION__" no more kernel memory..."); - return bytes_sent; - } - - if (from_user) - copy_from_user(new_buffer, current_position, buffer_size); - else - memcpy (new_buffer, current_position, buffer_size); + memcpy (urb->transfer_buffer, current_position, buffer_size); /* build up our urb */ FILL_BULK_URB (urb, bluetooth->dev, usb_sndbulkpipe(bluetooth->dev, bluetooth->bulk_out_endpointAddress), - new_buffer, buffer_size, bluetooth_write_bulk_callback, bluetooth); + urb->transfer_buffer, buffer_size, bluetooth_write_bulk_callback, bluetooth); urb->transfer_flags |= USB_QUEUE_BULK; /* send it down the pipe */ - status = usb_submit_urb(urb); - if (status) - dbg(__FUNCTION__ " - usb_submit_urb(write bulk) failed with status = %d", status); + retval = usb_submit_urb(urb); + if (retval) { + dbg(__FUNCTION__ " - usb_submit_urb(write bulk) failed with error = %d", retval); + goto exit; + } #ifdef BTBUGGYHARDWARE /* A workaround for the stalled data bug */ /* May or may not be needed...*/ @@ -527,13 +538,20 @@ count -= buffer_size; } - return bytes_sent + 1; + retval = bytes_sent + 1; + break; default : dbg(__FUNCTION__" - unsupported (at this time) write type"); + retval = -EINVAL; + break; } - return 0; +exit: + if (temp_buffer != NULL) + kfree (temp_buffer); + + return retval; } @@ -1114,7 +1132,11 @@ err("No free urbs available"); goto probe_error; } - urb->transfer_buffer = NULL; + urb->transfer_buffer = kmalloc (bluetooth->bulk_out_buffer_size, GFP_KERNEL); + if (urb->transfer_buffer == NULL) { + err("out of memory"); + goto probe_error; + } bluetooth->write_urb_pool[i] = urb; } @@ -1156,11 +1178,17 @@ if (bluetooth->interrupt_in_buffer) kfree (bluetooth->interrupt_in_buffer); for (i = 0; i < NUM_BULK_URBS; ++i) - if (bluetooth->write_urb_pool[i]) + if (bluetooth->write_urb_pool[i]) { + if (bluetooth->write_urb_pool[i]->transfer_buffer) + kfree (bluetooth->write_urb_pool[i]->transfer_buffer); usb_free_urb (bluetooth->write_urb_pool[i]); + } for (i = 0; i < NUM_CONTROL_URBS; ++i) - if (bluetooth->control_urb_pool[i]) + if (bluetooth->control_urb_pool[i]) { + if (bluetooth->control_urb_pool[i]->transfer_buffer) + kfree (bluetooth->control_urb_pool[i]->transfer_buffer); usb_free_urb (bluetooth->control_urb_pool[i]); + } bluetooth_table[minor] = NULL; diff -u --recursive --new-file v2.4.5/linux/drivers/usb/ov511.c linux/drivers/usb/ov511.c --- v2.4.5/linux/drivers/usb/ov511.c Fri May 25 18:28:55 2001 +++ linux/drivers/usb/ov511.c Mon Jun 4 16:02:56 2001 @@ -337,7 +337,7 @@ /* IMPORTANT: This output MUST be kept under PAGE_SIZE * or we need to get more sophisticated. */ - out += sprintf (out, "driver_version : %s\n", version); + out += sprintf (out, "driver_version : %s\n", DRIVER_VERSION); out += sprintf (out, "custom_id : %d\n", ov511->customid); out += sprintf (out, "model : %s\n", ov511->desc ? clist[ov511->desc].description : "unknown"); diff -u --recursive --new-file v2.4.5/linux/drivers/usb/pegasus.c linux/drivers/usb/pegasus.c --- v2.4.5/linux/drivers/usb/pegasus.c Fri May 25 18:28:55 2001 +++ linux/drivers/usb/pegasus.c Mon Jun 4 16:02:56 2001 @@ -127,8 +127,16 @@ static int get_registers(pegasus_t *pegasus, __u16 indx, __u16 size, void *data) { int ret; + unsigned char *buffer; DECLARE_WAITQUEUE(wait, current); + buffer = kmalloc(size,GFP_KERNEL); + if (!buffer) { + err("unable to allocate memory for configuration descriptors"); + return 0; + } + memcpy(buffer,data,size); + while ( pegasus->flags & ETH_REGS_CHANGED ) { pegasus->flags |= CTRL_URB_SLEEP; interruptible_sleep_on( &pegasus->ctrl_wait ); @@ -143,7 +151,7 @@ FILL_CONTROL_URB( &pegasus->ctrl_urb, pegasus->usb, usb_rcvctrlpipe(pegasus->usb,0), (char *)&pegasus->dr, - data, size, ctrl_callback, pegasus ); + buffer, size, ctrl_callback, pegasus ); add_wait_queue( &pegasus->ctrl_wait, &wait ); set_current_state( TASK_INTERRUPTIBLE ); @@ -157,6 +165,8 @@ schedule(); remove_wait_queue( &pegasus->ctrl_wait, &wait ); out: + memcpy(data,buffer,size); + kfree(buffer); return ret; } @@ -164,8 +174,16 @@ static int set_registers(pegasus_t *pegasus, __u16 indx, __u16 size, void *data) { int ret; + unsigned char *buffer; DECLARE_WAITQUEUE(wait, current); + buffer = kmalloc(size, GFP_KERNEL); + if (!buffer) { + err("unable to allocate memory for configuration descriptors"); + return 0; + } + memcpy(buffer, data, size); + while ( pegasus->flags & ETH_REGS_CHANGED ) { pegasus->flags |= CTRL_URB_SLEEP ; interruptible_sleep_on( &pegasus->ctrl_wait ); @@ -180,7 +198,7 @@ FILL_CONTROL_URB( &pegasus->ctrl_urb, pegasus->usb, usb_sndctrlpipe(pegasus->usb,0), (char *)&pegasus->dr, - data, size, ctrl_callback, pegasus ); + buffer, size, ctrl_callback, pegasus ); add_wait_queue( &pegasus->ctrl_wait, &wait ); set_current_state( TASK_INTERRUPTIBLE ); @@ -188,12 +206,14 @@ if ( (ret = usb_submit_urb( &pegasus->ctrl_urb )) ) { err( __FUNCTION__ " BAD CTRL %d", ret); + kfree(buffer); return ret; } schedule(); remove_wait_queue( &pegasus->ctrl_wait, &wait ); + kfree(buffer); return ret; } @@ -201,9 +221,17 @@ static int set_register( pegasus_t *pegasus, __u16 indx, __u8 data ) { int ret; + unsigned char *buffer; __u16 dat = data; DECLARE_WAITQUEUE(wait, current); + buffer = kmalloc(1, GFP_KERNEL); + if (!buffer) { + err("unable to allocate memory for configuration descriptors"); + return 0; + } + memcpy(buffer, &data, 1); + while ( pegasus->flags & ETH_REGS_CHANGED ) { pegasus->flags |= CTRL_URB_SLEEP; interruptible_sleep_on( &pegasus->ctrl_wait ); @@ -218,7 +246,7 @@ FILL_CONTROL_URB( &pegasus->ctrl_urb, pegasus->usb, usb_sndctrlpipe(pegasus->usb,0), (char *)&pegasus->dr, - &data, 1, ctrl_callback, pegasus ); + buffer, 1, ctrl_callback, pegasus ); add_wait_queue( &pegasus->ctrl_wait, &wait ); set_current_state( TASK_INTERRUPTIBLE ); @@ -226,12 +254,14 @@ if ( (ret = usb_submit_urb( &pegasus->ctrl_urb )) ) { err( __FUNCTION__ " BAD CTRL %d", ret); + kfree(buffer); return ret; } schedule(); remove_wait_queue( &pegasus->ctrl_wait, &wait ); + kfree(buffer); return ret; } diff -u --recursive --new-file v2.4.5/linux/drivers/usb/serial/ftdi_sio.c linux/drivers/usb/serial/ftdi_sio.c --- v2.4.5/linux/drivers/usb/serial/ftdi_sio.c Fri May 25 18:28:55 2001 +++ linux/drivers/usb/serial/ftdi_sio.c Tue Jun 5 18:11:42 2001 @@ -253,7 +253,7 @@ priv = serial->port->private = kmalloc(sizeof(struct ftdi_private), GFP_KERNEL); if (!priv){ - err(__FUNCTION__"- kmalloc(%d) failed.", sizeof(struct ftdi_private)); + err(__FUNCTION__"- kmalloc(%Zd) failed.", sizeof(struct ftdi_private)); return -ENOMEM; } @@ -271,7 +271,7 @@ priv = serial->port->private = kmalloc(sizeof(struct ftdi_private), GFP_KERNEL); if (!priv){ - err(__FUNCTION__"- kmalloc(%d) failed.", sizeof(struct ftdi_private)); + err(__FUNCTION__"- kmalloc(%Zd) failed.", sizeof(struct ftdi_private)); return -ENOMEM; } diff -u --recursive --new-file v2.4.5/linux/drivers/usb/serial/io_edgeport.c linux/drivers/usb/serial/io_edgeport.c --- v2.4.5/linux/drivers/usb/serial/io_edgeport.c Fri May 25 18:28:55 2001 +++ linux/drivers/usb/serial/io_edgeport.c Mon Jun 4 16:02:56 2001 @@ -944,7 +944,7 @@ } if (status) { - dbg(__FUNCTION__" - nonzero write bulk status received: %d", urb->status); + dbg(__FUNCTION__" - nonzero write bulk status received: %d", status); return; } diff -u --recursive --new-file v2.4.5/linux/drivers/usb/serial/visor.c linux/drivers/usb/serial/visor.c --- v2.4.5/linux/drivers/usb/serial/visor.c Fri May 25 18:28:55 2001 +++ linux/drivers/usb/serial/visor.c Mon Jun 4 16:02:56 2001 @@ -1,7 +1,7 @@ /* * USB HandSpring Visor driver * - * Copyright (C) 1999, 2000 + * Copyright (C) 1999 - 2001 * Greg Kroah-Hartman (greg@kroah.com) * * This program is free software; you can redistribute it and/or modify @@ -11,6 +11,9 @@ * * See Documentation/usb/usb-serial.txt for more information on using this driver * + * (05/28/2000) gkh + * Added initial support for the Palm m500 and Palm m505 devices. + * * (04/08/2001) gb * Identify version on module load. * @@ -109,7 +112,7 @@ /* * Version Information */ -#define DRIVER_VERSION "v1.0.0" +#define DRIVER_VERSION "v1.1" #define DRIVER_AUTHOR "Greg Kroah-Hartman " #define DRIVER_DESC "USB HandSpring Visor driver" @@ -131,8 +134,26 @@ static void visor_read_bulk_callback (struct urb *urb); +static __devinitdata struct usb_device_id visor_id_table [] = { + { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID) }, + { } /* Terminating entry */ +}; + +static __devinitdata struct usb_device_id palm_m500_id_table [] = { + { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID) }, + { } /* Terminating entry */ +}; + +static __devinitdata struct usb_device_id palm_m505_id_table [] = { + { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID) }, + { } /* Terminating entry */ +}; + + static __devinitdata struct usb_device_id id_table [] = { { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID) }, + { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID) }, + { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID) }, { } /* Terminating entry */ }; @@ -143,7 +164,33 @@ /* All of the device info needed for the Handspring Visor */ struct usb_serial_device_type handspring_device = { name: "Handspring Visor", - id_table: id_table, + id_table: visor_id_table, + needs_interrupt_in: MUST_HAVE_NOT, /* this device must not have an interrupt in endpoint */ + needs_bulk_in: MUST_HAVE, /* this device must have a bulk in endpoint */ + needs_bulk_out: MUST_HAVE, /* this device must have a bulk out endpoint */ + num_interrupt_in: 0, + num_bulk_in: 2, + num_bulk_out: 2, + num_ports: 2, + open: visor_open, + close: visor_close, + throttle: visor_throttle, + unthrottle: visor_unthrottle, + startup: visor_startup, + shutdown: visor_shutdown, + ioctl: visor_ioctl, + set_termios: visor_set_termios, + write: visor_write, + write_room: visor_write_room, + chars_in_buffer: visor_chars_in_buffer, + write_bulk_callback: visor_write_bulk_callback, + read_bulk_callback: visor_read_bulk_callback, +}; + +/* device info for the Palm M500 */ +struct usb_serial_device_type palm_m500_device = { + name: "Palm M500", + id_table: palm_m500_id_table, needs_interrupt_in: MUST_HAVE_NOT, /* this device must not have an interrupt in endpoint */ needs_bulk_in: MUST_HAVE, /* this device must have a bulk in endpoint */ needs_bulk_out: MUST_HAVE, /* this device must have a bulk out endpoint */ @@ -166,6 +213,31 @@ read_bulk_callback: visor_read_bulk_callback, }; +/* device info for the Palm M505 */ +struct usb_serial_device_type palm_m505_device = { + name: "Palm M505", + id_table: palm_m505_id_table, + needs_interrupt_in: MUST_HAVE_NOT, /* this device must not have an interrupt in endpoint */ + needs_bulk_in: MUST_HAVE, /* this device must have a bulk in endpoint */ + needs_bulk_out: MUST_HAVE, /* this device must have a bulk out endpoint */ + num_interrupt_in: 0, + num_bulk_in: 2, + num_bulk_out: 2, + num_ports: 2, + open: visor_open, + close: visor_close, + throttle: visor_throttle, + unthrottle: visor_unthrottle, + startup: visor_startup, + shutdown: visor_shutdown, + ioctl: visor_ioctl, + set_termios: visor_set_termios, + write: visor_write, + write_room: visor_write_room, + chars_in_buffer: visor_chars_in_buffer, + write_bulk_callback: visor_write_bulk_callback, + read_bulk_callback: visor_read_bulk_callback, +}; #define NUM_URBS 24 #define URB_TRANSFER_BUFFER_SIZE 768 @@ -496,6 +568,10 @@ return -ENOMEM; } + /* force debugging on for the palm devices for now */ + if (serial->dev->descriptor.idVendor == PALM_VENDOR_ID) + debug = 1; + dbg(__FUNCTION__); dbg(__FUNCTION__ " - Set config to 1"); @@ -537,6 +613,28 @@ } } + if (serial->dev->descriptor.idVendor == PALM_VENDOR_ID) { + /* Palm USB Hack */ + response = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0), + PALM_GET_SOME_UNKNOWN_INFORMATION, + 0xc2, 0x0000, 0x0000, transfer_buffer, + 0x14, 300); + if (response < 0) { + err(__FUNCTION__ " - error getting first unknown palm command"); + } else { + usb_serial_debug_data (__FILE__, __FUNCTION__, 0x14, transfer_buffer); + } + response = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0), + PALM_GET_SOME_UNKNOWN_INFORMATION, + 0xc2, 0x0000, 0x0000, transfer_buffer, + 0x14, 300); + if (response < 0) { + err(__FUNCTION__ " - error getting second unknown palm command"); + } else { + usb_serial_debug_data (__FILE__, __FUNCTION__, 0x14, transfer_buffer); + } + } + /* ask for the number of bytes available, but ignore the response as it is broken */ response = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0), VISOR_REQUEST_BYTES_AVAILABLE, 0xc2, 0x0000, 0x0005, transfer_buffer, 0x02, 300); @@ -645,6 +743,8 @@ int i; usb_serial_register (&handspring_device); + usb_serial_register (&palm_m500_device); + usb_serial_register (&palm_m505_device); /* create our write urb pool and transfer buffers */ spin_lock_init (&write_urb_pool_lock); @@ -677,6 +777,8 @@ unsigned long flags; usb_serial_deregister (&handspring_device); + usb_serial_deregister (&palm_m500_device); + usb_serial_deregister (&palm_m505_device); spin_lock_irqsave (&write_urb_pool_lock, flags); diff -u --recursive --new-file v2.4.5/linux/drivers/usb/serial/visor.h linux/drivers/usb/serial/visor.h --- v2.4.5/linux/drivers/usb/serial/visor.h Wed Apr 18 11:49:12 2001 +++ linux/drivers/usb/serial/visor.h Mon Jun 4 16:02:56 2001 @@ -1,7 +1,7 @@ /* * USB HandSpring Visor driver * - * Copyright (C) 1999, 2000 + * Copyright (C) 1999 - 2001 * Greg Kroah-Hartman (greg@kroah.com) * * This program is free software; you can redistribute it and/or modify @@ -20,6 +20,10 @@ #define HANDSPRING_VENDOR_ID 0x082d #define HANDSPRING_VISOR_ID 0x0100 +#define PALM_VENDOR_ID 0x0830 +#define PALM_M500_ID 0x0001 +#define PALM_M505_ID 0x0002 + /**************************************************************************** * Handspring Visor Vendor specific request codes (bRequest values) * A big thank you to Handspring for providing the following information. @@ -69,6 +73,13 @@ #define VISOR_FUNCTION_HOTSYNC 0x02 #define VISOR_FUNCTION_CONSOLE 0x03 #define VISOR_FUNCTION_REMOTE_FILE_SYS 0x04 + + +/**************************************************************************** + * PALM_GET_SOME_UNKNOWN_INFORMATION is sent by the host during enumeration to + * get some information from the M series devices, that is currently unknown. + ****************************************************************************/ +#define PALM_GET_SOME_UNKNOWN_INFORMATION 0x04 #endif diff -u --recursive --new-file v2.4.5/linux/drivers/usb/usb.c linux/drivers/usb/usb.c --- v2.4.5/linux/drivers/usb/usb.c Fri May 25 18:28:55 2001 +++ linux/drivers/usb/usb.c Mon Jun 4 16:02:56 2001 @@ -449,7 +449,7 @@ */ list_del(&bus->bus_list); - usbdevfs_remove_bus(bus); + usbdevfs_remove_bus(bus); clear_bit(bus->busnum, busmap.busmap); @@ -1869,6 +1869,7 @@ { int result; __u16 status; + unsigned char *buffer; int endp=usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7); /* @@ -1883,9 +1884,19 @@ if (result < 0) return result; + buffer = kmalloc(sizeof(status), GFP_KERNEL); + if (!buffer) { + err("unable to allocate memory for configuration descriptors"); + return -ENOMEM; + } + result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), USB_REQ_GET_STATUS, USB_DIR_IN | USB_RECIP_ENDPOINT, 0, endp, - &status, sizeof(status), HZ * SET_TIMEOUT); + buffer, sizeof(status), HZ * SET_TIMEOUT); + + memcpy(&status, buffer, sizeof(status)); + kfree(buffer); + if (result < 0) return result; @@ -1970,10 +1981,9 @@ { int result; unsigned int cfgno, length; - unsigned char buffer[8]; + unsigned char *buffer; unsigned char *bigbuffer; - struct usb_config_descriptor *desc = - (struct usb_config_descriptor *)buffer; + struct usb_config_descriptor *desc; if (dev->descriptor.bNumConfigurations > USB_MAXCONFIG) { warn("too many configurations"); @@ -2002,6 +2012,13 @@ return -ENOMEM; } + buffer = kmalloc(8, GFP_KERNEL); + if (!buffer) { + err("unable to allocate memory for configuration descriptors"); + return -ENOMEM; + } + desc = (struct usb_config_descriptor *)buffer; + for (cfgno = 0; cfgno < dev->descriptor.bNumConfigurations; cfgno++) { /* We grab the first 8 bytes so we know how long the whole */ /* configuration is */ @@ -2052,8 +2069,10 @@ } } + kfree(buffer); return 0; err: + kfree(buffer); dev->descriptor.bNumConfigurations = cfgno; return result; } diff -u --recursive --new-file v2.4.5/linux/drivers/video/atyfb.c linux/drivers/video/atyfb.c --- v2.4.5/linux/drivers/video/atyfb.c Fri May 25 18:28:55 2001 +++ linux/drivers/video/atyfb.c Tue Jun 5 18:11:44 2001 @@ -3213,7 +3213,7 @@ static void atyfb_save_palette(struct fb_info *fb, int enter) { struct fb_info_aty *info = (struct fb_info_aty *)fb; - int i, tmp, scale; + int i, tmp; for (i = 0; i < 256; i++) { tmp = aty_ld_8(DAC_CNTL, info) & 0xfc; @@ -3225,14 +3225,11 @@ aty_st_8(DAC_CNTL, tmp, info); aty_st_8(DAC_MASK, 0xff, info); - scale = ((Gx != GX_CHIP_ID) && (Gx != CX_CHIP_ID) && - (info->current_par.crtc.bpp == 16)) ? 3 : 0; - writeb(i << scale, &info->aty_cmap_regs->rindex); - + writeb(i, &info->aty_cmap_regs->rindex); atyfb_save.r[enter][i] = readb(&info->aty_cmap_regs->lut); atyfb_save.g[enter][i] = readb(&info->aty_cmap_regs->lut); atyfb_save.b[enter][i] = readb(&info->aty_cmap_regs->lut); - writeb(i << scale, &info->aty_cmap_regs->windex); + writeb(i, &info->aty_cmap_regs->windex); writeb(atyfb_save.r[1-enter][i], &info->aty_cmap_regs->lut); writeb(atyfb_save.g[1-enter][i], &info->aty_cmap_regs->lut); writeb(atyfb_save.b[1-enter][i], &info->aty_cmap_regs->lut); diff -u --recursive --new-file v2.4.5/linux/drivers/video/fbcon.c linux/drivers/video/fbcon.c --- v2.4.5/linux/drivers/video/fbcon.c Fri Feb 9 11:30:23 2001 +++ linux/drivers/video/fbcon.c Wed Jun 6 10:29:05 2001 @@ -2060,44 +2060,32 @@ if (!fb) return 0; - /* Set colors if visual is PSEUDOCOLOR and we have enough colors, or for - * DIRECTCOLOR */ - if ((p->visual == FB_VISUAL_PSEUDOCOLOR && depth >= 4) || - p->visual == FB_VISUAL_DIRECTCOLOR) { - int is_truecolor = (p->visual == FB_VISUAL_DIRECTCOLOR); - int use_256 = (!is_truecolor && depth >= 8) || - (is_truecolor && depth >= 24); - int first_col = use_256 ? 32 : depth > 4 ? 16 : 0; - int num_cols = use_256 ? LINUX_LOGO_COLORS : 16; - unsigned char *red, *green, *blue; - - if (use_256) { - red = linux_logo_red; - green = linux_logo_green; - blue = linux_logo_blue; - } - else { - red = linux_logo16_red; - green = linux_logo16_green; - blue = linux_logo16_blue; - } - - for( i = 0; i < num_cols; i += n ) { - n = num_cols - i; + /* + * Set colors if visual is PSEUDOCOLOR and we have enough colors, or for + * DIRECTCOLOR + * We don't have to set the colors for the 16-color logo, since that logo + * uses the standard VGA text console palette + */ + if ((p->visual == FB_VISUAL_PSEUDOCOLOR && depth >= 8) || + (p->visual == FB_VISUAL_DIRECTCOLOR && depth >= 24)) + for (i = 0; i < LINUX_LOGO_COLORS; i += n) { + n = LINUX_LOGO_COLORS - i; if (n > 16) /* palette_cmap provides space for only 16 colors at once */ n = 16; - palette_cmap.start = first_col + i; + palette_cmap.start = 32 + i; palette_cmap.len = n; for( j = 0; j < n; ++j ) { - palette_cmap.red[j] = (red[i+j] << 8) | red[i+j]; - palette_cmap.green[j] = (green[i+j] << 8) | green[i+j]; - palette_cmap.blue[j] = (blue[i+j] << 8) | blue[i+j]; + palette_cmap.red[j] = (linux_logo_red[i+j] << 8) | + linux_logo_red[i+j]; + palette_cmap.green[j] = (linux_logo_green[i+j] << 8) | + linux_logo_green[i+j]; + palette_cmap.blue[j] = (linux_logo_blue[i+j] << 8) | + linux_logo_blue[i+j]; } p->fb_info->fbops->fb_set_cmap(&palette_cmap, 1, fg_console, p->fb_info); } - } if (depth >= 8) { logo = linux_logo; @@ -2155,15 +2143,15 @@ } } } - else if (depth >= 15 && depth <= 23) { - /* have 5..7 bits per color, using 16 color image */ + else if (depth >= 12 && depth <= 23) { + /* have 4..7 bits per color, using 16 color image */ unsigned int pix; src = linux_logo16; bdepth = (depth+7)/8; for( y1 = 0; y1 < LOGO_H; y1++ ) { dst = fb + y1*line + x*bdepth; for( x1 = 0; x1 < LOGO_W/2; x1++, src++ ) { - pix = (*src >> 4) | 0x10; /* upper nibble */ + pix = *src >> 4; /* upper nibble */ val = (pix << redshift) | (pix << greenshift) | (pix << blueshift); @@ -2173,7 +2161,7 @@ for( i = bdepth-1; i >= 0; --i ) #endif fb_writeb (val >> (i*8), dst++); - pix = (*src & 0x0f) | 0x10; /* lower nibble */ + pix = *src & 0x0f; /* lower nibble */ val = (pix << redshift) | (pix << greenshift) | (pix << blueshift); @@ -2297,16 +2285,13 @@ } } - /* fill remaining planes - * special case for logo_depth == 4: we used color registers 16..31, - * so fill plane 4 with 1 bits instead of 0 */ + /* fill remaining planes */ if (depth > logo_depth) { for( y1 = 0; y1 < LOGO_H; y1++ ) { for( x1 = 0; x1 < LOGO_LINE; x1++ ) { dst = fb + y1*line + MAP_X(x/8+x1) + logo_depth*plane; for( i = logo_depth; i < depth; i++, dst += plane ) - *dst = (i == logo_depth && logo_depth == 4) - ? 0xff : 0x00; + *dst = 0x00; } } } diff -u --recursive --new-file v2.4.5/linux/drivers/video/matrox/matroxfb_base.c linux/drivers/video/matrox/matroxfb_base.c --- v2.4.5/linux/drivers/video/matrox/matroxfb_base.c Sun Feb 4 10:05:30 2001 +++ linux/drivers/video/matrox/matroxfb_base.c Sat May 26 01:11:43 2001 @@ -2483,7 +2483,7 @@ return 0; } -static int __init initialized = 0; +static int initialized __initdata = 0; int __init matroxfb_init(void) { diff -u --recursive --new-file v2.4.5/linux/fs/autofs4/expire.c linux/fs/autofs4/expire.c --- v2.4.5/linux/fs/autofs4/expire.c Fri Apr 20 22:57:51 2001 +++ linux/fs/autofs4/expire.c Tue Jun 5 16:55:22 2001 @@ -66,19 +66,11 @@ non-busy mounts */ static int check_vfsmnt(struct vfsmount *mnt, struct dentry *dentry) { - int ret = 0; - struct list_head *tmp; - - list_for_each(tmp, &dentry->d_vfsmnt) { - struct vfsmount *vfs = list_entry(tmp, struct vfsmount, - mnt_clash); - DPRINTK(("check_vfsmnt: mnt=%p, dentry=%p, tmp=%p, vfs=%p\n", - mnt, dentry, tmp, vfs)); - if (vfs->mnt_parent != mnt || /* don't care about busy-ness of other namespaces */ - !is_vfsmnt_tree_busy(vfs)) - ret++; - } + int ret = dentry->d_mounted; + struct vfsmount *vfs = lookup_mnt(mnt, dentry); + if (vfs && is_vfsmnt_tree_busy(vfs)) + ret--; DPRINTK(("check_vfsmnt: ret=%d\n", ret)); return ret; } diff -u --recursive --new-file v2.4.5/linux/fs/block_dev.c linux/fs/block_dev.c --- v2.4.5/linux/fs/block_dev.c Fri May 25 18:28:55 2001 +++ linux/fs/block_dev.c Tue Jun 5 21:31:51 2001 @@ -595,14 +595,15 @@ int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg) { - kdev_t rdev = to_kdev_t(bdev->bd_dev); struct inode inode_fake; int res; mm_segment_t old_fs = get_fs(); if (!bdev->bd_op->ioctl) return -EINVAL; - inode_fake.i_rdev=rdev; + memset(&inode_fake, 0, sizeof(inode_fake)); + inode_fake.i_rdev = to_kdev_t(bdev->bd_dev); + inode_fake.i_bdev = bdev; init_waitqueue_head(&inode_fake.i_wait); set_fs(KERNEL_DS); res = bdev->bd_op->ioctl(&inode_fake, NULL, cmd, arg); diff -u --recursive --new-file v2.4.5/linux/fs/buffer.c linux/fs/buffer.c --- v2.4.5/linux/fs/buffer.c Fri May 25 18:28:55 2001 +++ linux/fs/buffer.c Mon Jun 4 17:56:50 2001 @@ -61,7 +61,7 @@ #define BUFSIZE_INDEX(X) ((int) buffersize_index[(X)>>9]) #define MAX_BUF_PER_PAGE (PAGE_CACHE_SIZE / 512) -#define NR_RESERVED (2*MAX_BUF_PER_PAGE) +#define NR_RESERVED (10*MAX_BUF_PER_PAGE) #define MAX_UNUSED_BUFFERS NR_RESERVED+20 /* don't ever have more than this number of unused buffer heads */ @@ -1348,11 +1348,9 @@ */ run_task_queue(&tq_disk); - /* - * Set our state for sleeping, then check again for buffer heads. - * This ensures we won't miss a wake_up from an interrupt. - */ - wait_event(buffer_wait, nr_unused_buffer_heads >= MAX_BUF_PER_PAGE); + current->policy |= SCHED_YIELD; + __set_current_state(TASK_RUNNING); + schedule(); goto try_again; } diff -u --recursive --new-file v2.4.5/linux/fs/dcache.c linux/fs/dcache.c --- v2.4.5/linux/fs/dcache.c Fri May 25 18:28:55 2001 +++ linux/fs/dcache.c Tue Jun 5 16:55:22 2001 @@ -616,7 +616,7 @@ dentry->d_name.hash = name->hash; dentry->d_op = NULL; dentry->d_fsdata = NULL; - INIT_LIST_HEAD(&dentry->d_vfsmnt); + dentry->d_mounted = 0; INIT_LIST_HEAD(&dentry->d_hash); INIT_LIST_HEAD(&dentry->d_lru); INIT_LIST_HEAD(&dentry->d_subdirs); @@ -1283,6 +1283,7 @@ dcache_init(mempages); inode_init(mempages); + mnt_init(mempages); bdev_cache_init(); cdev_cache_init(); } diff -u --recursive --new-file v2.4.5/linux/fs/ext2/dir.c linux/fs/ext2/dir.c --- v2.4.5/linux/fs/ext2/dir.c Fri Dec 8 17:35:54 2000 +++ linux/fs/ext2/dir.c Sun Jun 3 17:42:16 2001 @@ -16,167 +16,567 @@ * * Big-endian to little-endian byte-swapping/bitmaps by * David S. Miller (davem@caip.rutgers.edu), 1995 + * + * All code that works with directory layout had been switched to pagecache + * and moved here. AV */ #include #include +#include -static unsigned char ext2_filetype_table[] = { - DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK -}; +typedef struct ext2_dir_entry_2 ext2_dirent; -static int ext2_readdir(struct file *, void *, filldir_t); +/* + * ext2 uses block-sized chunks. Arguably, sector-sized ones would be + * more robust, but we have what we have + */ +static inline unsigned ext2_chunk_size(struct inode *inode) +{ + return inode->i_sb->s_blocksize; +} -struct file_operations ext2_dir_operations = { - read: generic_read_dir, - readdir: ext2_readdir, - ioctl: ext2_ioctl, - fsync: ext2_sync_file, +static inline void ext2_put_page(struct page *page) +{ + kunmap(page); + page_cache_release(page); +} + +static inline unsigned long dir_pages(struct inode *inode) +{ + return (inode->i_size+PAGE_CACHE_SIZE-1)>>PAGE_CACHE_SHIFT; +} + +static int ext2_commit_chunk(struct page *page, unsigned from, unsigned to) +{ + struct inode *dir = (struct inode *)page->mapping->host; + int err = 0; + dir->i_version = ++event; + page->mapping->a_ops->commit_write(NULL, page, from, to); + if (IS_SYNC(dir)) + err = waitfor_one_page(page); + return err; +} + +static void ext2_check_page(struct page *page) +{ + struct inode *dir = (struct inode *)page->mapping->host; + struct super_block *sb = dir->i_sb; + unsigned chunk_size = ext2_chunk_size(dir); + char *kaddr = (char*)page_address(page); + u32 max_inumber = le32_to_cpu(sb->u.ext2_sb.s_es->s_inodes_count); + unsigned offs, rec_len; + unsigned limit = PAGE_CACHE_SIZE; + ext2_dirent *p; + char *error; + + if ((dir->i_size >> PAGE_CACHE_SHIFT) == page->index) { + limit = dir->i_size & ~PAGE_CACHE_MASK; + if (limit & (chunk_size - 1)) + goto Ebadsize; + for (offs = limit; offsrec_len = cpu_to_le16(chunk_size); + } + if (!limit) + goto out; + } + for (offs = 0; offs <= limit - EXT2_DIR_REC_LEN(1); offs += rec_len) { + p = (ext2_dirent *)(kaddr + offs); + rec_len = le16_to_cpu(p->rec_len); + + if (rec_len < EXT2_DIR_REC_LEN(1)) + goto Eshort; + if (rec_len & 3) + goto Ealign; + if (rec_len < EXT2_DIR_REC_LEN(p->name_len)) + goto Enamelen; + if (((offs + rec_len - 1) ^ offs) & ~(chunk_size-1)) + goto Espan; + if (le32_to_cpu(p->inode) > max_inumber) + goto Einumber; + } + if (offs != limit) + goto Eend; +out: + SetPageChecked(page); + return; + + /* Too bad, we had an error */ + +Ebadsize: + ext2_error(sb, "ext2_check_page", + "size of directory #%lu is not a multiple of chunk size", + dir->i_ino + ); + goto fail; +Eshort: + error = "rec_len is smaller than minimal"; + goto bad_entry; +Ealign: + error = "unaligned directory entry"; + goto bad_entry; +Enamelen: + error = "rec_len is too small for name_len"; + goto bad_entry; +Espan: + error = "directory entry across blocks"; + goto bad_entry; +Einumber: + error = "inode out of bounds"; +bad_entry: + ext2_error (sb, "ext2_check_page", "bad entry in directory #%lu: %s - " + "offset=%lu, inode=%lu, rec_len=%d, name_len=%d", + dir->i_ino, error, (page->index<inode), + rec_len, p->name_len); + goto fail; +Eend: + p = (ext2_dirent *)(kaddr + offs); + ext2_error (sb, "ext2_check_page", + "entry in directory #%lu spans the page boundary" + "offset=%lu, inode=%lu", + dir->i_ino, (page->index<inode)); +fail: + SetPageChecked(page); + SetPageError(page); +} + +static struct page * ext2_get_page(struct inode *dir, unsigned long n) +{ + struct address_space *mapping = dir->i_mapping; + struct page *page = read_cache_page(mapping, n, + (filler_t*)mapping->a_ops->readpage, NULL); + if (!IS_ERR(page)) { + wait_on_page(page); + kmap(page); + if (!Page_Uptodate(page)) + goto fail; + if (!PageChecked(page)) + ext2_check_page(page); + if (PageError(page)) + goto fail; + } + return page; + +fail: + ext2_put_page(page); + return ERR_PTR(-EIO); +} + +/* + * NOTE! unlike strncmp, ext2_match returns 1 for success, 0 for failure. + * + * len <= EXT2_NAME_LEN and de != NULL are guaranteed by caller. + */ +static inline int ext2_match (int len, const char * const name, + struct ext2_dir_entry_2 * de) +{ + if (len != de->name_len) + return 0; + if (!de->inode) + return 0; + return !memcmp(name, de->name, len); +} + +/* + * p is at least 6 bytes before the end of page + */ +static inline ext2_dirent *ext2_next_entry(ext2_dirent *p) +{ + return (ext2_dirent *)((char*)p + le16_to_cpu(p->rec_len)); +} + +static inline unsigned +ext2_validate_entry(char *base, unsigned offset, unsigned mask) +{ + ext2_dirent *de = (ext2_dirent*)(base + offset); + ext2_dirent *p = (ext2_dirent*)(base + (offset&mask)); + while ((char*)p < (char*)de) + p = ext2_next_entry(p); + return (char *)p - base; +} + +static unsigned char ext2_filetype_table[EXT2_FT_MAX] = { + [EXT2_FT_UNKNOWN] DT_UNKNOWN, + [EXT2_FT_REG_FILE] DT_REG, + [EXT2_FT_DIR] DT_DIR, + [EXT2_FT_CHRDEV] DT_CHR, + [EXT2_FT_BLKDEV] DT_BLK, + [EXT2_FT_FIFO] DT_FIFO, + [EXT2_FT_SOCK] DT_SOCK, + [EXT2_FT_SYMLINK] DT_LNK, }; -int ext2_check_dir_entry (const char * function, struct inode * dir, - struct ext2_dir_entry_2 * de, - struct buffer_head * bh, - unsigned long offset) -{ - const char * error_msg = NULL; - - if (le16_to_cpu(de->rec_len) < EXT2_DIR_REC_LEN(1)) - error_msg = "rec_len is smaller than minimal"; - else if (le16_to_cpu(de->rec_len) % 4 != 0) - error_msg = "rec_len % 4 != 0"; - else if (le16_to_cpu(de->rec_len) < EXT2_DIR_REC_LEN(de->name_len)) - error_msg = "rec_len is too small for name_len"; - else if (dir && ((char *) de - bh->b_data) + le16_to_cpu(de->rec_len) > - dir->i_sb->s_blocksize) - error_msg = "directory entry across blocks"; - else if (dir && le32_to_cpu(de->inode) > le32_to_cpu(dir->i_sb->u.ext2_sb.s_es->s_inodes_count)) - error_msg = "inode out of bounds"; - - if (error_msg != NULL) - ext2_error (dir->i_sb, function, "bad entry in directory #%lu: %s - " - "offset=%lu, inode=%lu, rec_len=%d, name_len=%d", - dir->i_ino, error_msg, offset, - (unsigned long) le32_to_cpu(de->inode), - le16_to_cpu(de->rec_len), de->name_len); - return error_msg == NULL ? 1 : 0; -} - -static int ext2_readdir(struct file * filp, - void * dirent, filldir_t filldir) -{ - int error = 0; - unsigned long offset, blk; - int i, num, stored; - struct buffer_head * bh, * tmp, * bha[16]; - struct ext2_dir_entry_2 * de; - struct super_block * sb; - int err; - struct inode *inode = filp->f_dentry->d_inode; +#define S_SHIFT 12 +static unsigned char ext2_type_by_mode[S_IFMT >> S_SHIFT] = { + [S_IFREG >> S_SHIFT] EXT2_FT_REG_FILE, + [S_IFDIR >> S_SHIFT] EXT2_FT_DIR, + [S_IFCHR >> S_SHIFT] EXT2_FT_CHRDEV, + [S_IFBLK >> S_SHIFT] EXT2_FT_BLKDEV, + [S_IFIFO >> S_SHIFT] EXT2_FT_FIFO, + [S_IFSOCK >> S_SHIFT] EXT2_FT_SOCK, + [S_IFLNK >> S_SHIFT] EXT2_FT_SYMLINK, +}; + +static inline void ext2_set_de_type(ext2_dirent *de, struct inode *inode) +{ + mode_t mode = inode->i_mode; + if (EXT2_HAS_INCOMPAT_FEATURE(inode->i_sb, EXT2_FEATURE_INCOMPAT_FILETYPE)) + de->file_type = ext2_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; + else + de->file_type = 0; +} - sb = inode->i_sb; +static int +ext2_readdir (struct file * filp, void * dirent, filldir_t filldir) +{ + loff_t pos = filp->f_pos; + struct inode *inode = filp->f_dentry->d_inode; + struct super_block *sb = inode->i_sb; + unsigned offset = pos & ~PAGE_CACHE_MASK; + unsigned long n = pos >> PAGE_CACHE_SHIFT; + unsigned long npages = dir_pages(inode); + unsigned chunk_mask = ~(ext2_chunk_size(inode)-1); + unsigned char *types = NULL; + int need_revalidate = (filp->f_version != inode->i_version); + + if (pos > inode->i_size - EXT2_DIR_REC_LEN(1)) + goto done; + + if (EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_FILETYPE)) + types = ext2_filetype_table; + + for ( ; n < npages; n++, offset = 0) { + char *kaddr, *limit; + ext2_dirent *de; + struct page *page = ext2_get_page(inode, n); - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); - - while (!error && !stored && filp->f_pos < inode->i_size) { - blk = (filp->f_pos) >> EXT2_BLOCK_SIZE_BITS(sb); - bh = ext2_bread (inode, blk, 0, &err); - if (!bh) { - ext2_error (sb, "ext2_readdir", - "directory #%lu contains a hole at offset %lu", - inode->i_ino, (unsigned long)filp->f_pos); - filp->f_pos += sb->s_blocksize - offset; + if (IS_ERR(page)) continue; + kaddr = (char *)page_address(page); + if (need_revalidate) { + offset = ext2_validate_entry(kaddr, offset, chunk_mask); + need_revalidate = 0; } + de = (ext2_dirent *)(kaddr+offset); + limit = kaddr + PAGE_CACHE_SIZE - EXT2_DIR_REC_LEN(1); + for ( ;(char*)de <= limit; de = ext2_next_entry(de)) + if (de->inode) { + int over; + unsigned char d_type = DT_UNKNOWN; - /* - * Do the readahead - */ - if (!offset) { - for (i = 16 >> (EXT2_BLOCK_SIZE_BITS(sb) - 9), num = 0; - i > 0; i--) { - tmp = ext2_getblk (inode, ++blk, 0, &err); - if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) - bha[num++] = tmp; - else - brelse (tmp); - } - if (num) { - ll_rw_block (READA, num, bha); - for (i = 0; i < num; i++) - brelse (bha[i]); - } - } - -revalidate: - /* If the dir block has changed since the last call to - * readdir(2), then we might be pointing to an invalid - * dirent right now. Scan from the start of the block - * to make sure. */ - if (filp->f_version != inode->i_version) { - for (i = 0; i < sb->s_blocksize && i < offset; ) { - de = (struct ext2_dir_entry_2 *) - (bh->b_data + i); - /* It's too expensive to do a full - * dirent test each time round this - * loop, but we do have to test at - * least that it is non-zero. A - * failure will be detected in the - * dirent test below. */ - if (le16_to_cpu(de->rec_len) < EXT2_DIR_REC_LEN(1)) - break; - i += le16_to_cpu(de->rec_len); + if (types && de->file_type < EXT2_FT_MAX) + d_type = types[de->file_type]; + + offset = (char *)de - kaddr; + over = filldir(dirent, de->name, de->name_len, + (n<inode), d_type); + if (over) { + ext2_put_page(page); + goto done; + } } - offset = i; - filp->f_pos = (filp->f_pos & ~(sb->s_blocksize - 1)) - | offset; - filp->f_version = inode->i_version; + ext2_put_page(page); + } + +done: + filp->f_pos = (n << PAGE_CACHE_SHIFT) | offset; + filp->f_version = inode->i_version; + UPDATE_ATIME(inode); + return 0; +} + +/* + * ext2_find_entry() + * + * finds an entry in the specified directory with the wanted name. It + * returns the page in which the entry was found, and the entry itself + * (as a parameter - res_dir). Page is returned mapped and unlocked. + * Entry is guaranteed to be valid. + */ +struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir, + struct dentry *dentry, struct page ** res_page) +{ + const char *name = dentry->d_name.name; + int namelen = dentry->d_name.len; + unsigned reclen = EXT2_DIR_REC_LEN(namelen); + unsigned long n; + unsigned long npages = dir_pages(dir); + struct page *page = NULL; + ext2_dirent * de; + + /* OFFSET_CACHE */ + *res_page = NULL; + + for (n = 0; n < npages; n++) { + char *kaddr; + page = ext2_get_page(dir, n); + if (IS_ERR(page)) + continue; + + kaddr = (char*)page_address(page); + de = (ext2_dirent *) kaddr; + kaddr += PAGE_CACHE_SIZE - reclen; + for ( ; (char *) de <= kaddr ; de = ext2_next_entry(de)) + if (ext2_match (namelen, name, de)) + goto found; + ext2_put_page(page); + } + return NULL; + +found: + *res_page = page; + return de; +} + +struct ext2_dir_entry_2 * ext2_dotdot (struct inode *dir, struct page **p) +{ + struct page *page = ext2_get_page(dir, 0); + ext2_dirent *de = NULL; + + if (!IS_ERR(page)) { + de = ext2_next_entry((ext2_dirent *) page_address(page)); + *p = page; + } + return de; +} + +ino_t ext2_inode_by_name(struct inode * dir, struct dentry *dentry) +{ + ino_t res = 0; + struct ext2_dir_entry_2 * de; + struct page *page; + + de = ext2_find_entry (dir, dentry, &page); + if (de) { + res = le32_to_cpu(de->inode); + kunmap(page); + page_cache_release(page); + } + return res; +} + +/* Releases the page */ +void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de, + struct page *page, struct inode *inode) +{ + unsigned from = (char *)de-(char*)page_address(page); + unsigned to = from + le16_to_cpu(de->rec_len); + int err; + + lock_page(page); + err = page->mapping->a_ops->prepare_write(NULL, page, from, to); + if (err) + BUG(); + de->inode = cpu_to_le32(inode->i_ino); + ext2_set_de_type (de, inode); + err = ext2_commit_chunk(page, from, to); + UnlockPage(page); + ext2_put_page(page); + dir->i_mtime = dir->i_ctime = CURRENT_TIME; + mark_inode_dirty(dir); +} + +/* + * Parent is locked. + */ +int ext2_add_link (struct dentry *dentry, struct inode *inode) +{ + struct inode *dir = dentry->d_parent->d_inode; + const char *name = dentry->d_name.name; + int namelen = dentry->d_name.len; + unsigned reclen = EXT2_DIR_REC_LEN(namelen); + unsigned short rec_len, name_len; + struct page *page = NULL; + ext2_dirent * de; + unsigned long npages = dir_pages(dir); + unsigned long n; + char *kaddr; + unsigned from, to; + int err; + + /* We take care of directory expansion in the same loop */ + for (n = 0; n <= npages; n++) { + page = ext2_get_page(dir, n); + err = PTR_ERR(page); + if (IS_ERR(page)) + goto out; + kaddr = (char*)page_address(page); + de = (ext2_dirent *)kaddr; + kaddr += PAGE_CACHE_SIZE - reclen; + while ((char *)de <= kaddr) { + err = -EEXIST; + if (ext2_match (namelen, name, de)) + goto out_page; + name_len = EXT2_DIR_REC_LEN(de->name_len); + rec_len = le16_to_cpu(de->rec_len); + if (!de->inode && rec_len >= reclen) + goto got_it; + if (rec_len >= name_len + reclen) + goto got_it; + de = (ext2_dirent *) ((char *) de + rec_len); } - - while (!error && filp->f_pos < inode->i_size - && offset < sb->s_blocksize) { - de = (struct ext2_dir_entry_2 *) (bh->b_data + offset); - if (!ext2_check_dir_entry ("ext2_readdir", inode, de, - bh, offset)) { - /* On error, skip the f_pos to the - next block. */ - filp->f_pos = (filp->f_pos | (sb->s_blocksize - 1)) - + 1; - brelse (bh); - return stored; - } - offset += le16_to_cpu(de->rec_len); - if (le32_to_cpu(de->inode)) { - /* We might block in the next section - * if the data destination is - * currently swapped out. So, use a - * version stamp to detect whether or - * not the directory has been modified - * during the copy operation. - */ - unsigned long version = filp->f_version; - unsigned char d_type = DT_UNKNOWN; + ext2_put_page(page); + } + BUG(); + return -EINVAL; - if (EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_FILETYPE) - && de->file_type < EXT2_FT_MAX) - d_type = ext2_filetype_table[de->file_type]; - error = filldir(dirent, de->name, - de->name_len, - filp->f_pos, le32_to_cpu(de->inode), - d_type); - if (error) - break; - if (version != filp->f_version) - goto revalidate; - stored ++; +got_it: + from = (char*)de - (char*)page_address(page); + to = from + rec_len; + lock_page(page); + err = page->mapping->a_ops->prepare_write(NULL, page, from, to); + if (err) + goto out_unlock; + if (de->inode) { + ext2_dirent *de1 = (ext2_dirent *) ((char *) de + name_len); + de1->rec_len = cpu_to_le16(rec_len - name_len); + de->rec_len = cpu_to_le16(name_len); + de = de1; + } + de->name_len = namelen; + memcpy (de->name, name, namelen); + de->inode = cpu_to_le32(inode->i_ino); + ext2_set_de_type (de, inode); + err = ext2_commit_chunk(page, from, to); + dir->i_mtime = dir->i_ctime = CURRENT_TIME; + mark_inode_dirty(dir); + /* OFFSET_CACHE */ +out_unlock: + UnlockPage(page); +out_page: + ext2_put_page(page); +out: + return err; +} + +/* + * ext2_delete_entry deletes a directory entry by merging it with the + * previous entry. Page is up-to-date. Releases the page. + */ +int ext2_delete_entry (struct ext2_dir_entry_2 * dir, struct page * page ) +{ + struct address_space *mapping = page->mapping; + struct inode *inode = (struct inode*)mapping->host; + char *kaddr = (char*)page_address(page); + unsigned from = ((char*)dir - kaddr) & ~(ext2_chunk_size(inode)-1); + unsigned to = ((char*)dir - kaddr) + le16_to_cpu(dir->rec_len); + ext2_dirent * pde = NULL; + ext2_dirent * de = (ext2_dirent *) (kaddr + from); + int err; + + while ((char*)de < (char*)dir) { + pde = de; + de = ext2_next_entry(de); + } + if (pde) + from = (char*)pde - (char*)page_address(page); + lock_page(page); + err = mapping->a_ops->prepare_write(NULL, page, from, to); + if (err) + BUG(); + if (pde) + pde->rec_len = cpu_to_le16(to-from); + dir->inode = 0; + err = ext2_commit_chunk(page, from, to); + UnlockPage(page); + ext2_put_page(page); + inode->i_ctime = inode->i_mtime = CURRENT_TIME; + mark_inode_dirty(inode); + return err; +} + +/* + * Set the first fragment of directory. + */ +int ext2_make_empty(struct inode *inode, struct inode *parent) +{ + struct address_space *mapping = inode->i_mapping; + struct page *page = grab_cache_page(mapping, 0); + unsigned chunk_size = ext2_chunk_size(inode); + struct ext2_dir_entry_2 * de; + char *base; + int err; + + if (!page) + return -ENOMEM; + err = mapping->a_ops->prepare_write(NULL, page, 0, chunk_size); + if (err) + goto fail; + + base = (char*)page_address(page); + + de = (struct ext2_dir_entry_2 *) base; + de->name_len = 1; + de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(1)); + memcpy (de->name, ".\0\0", 4); + de->inode = cpu_to_le32(inode->i_ino); + ext2_set_de_type (de, inode); + + de = (struct ext2_dir_entry_2 *) (base + EXT2_DIR_REC_LEN(1)); + de->name_len = 2; + de->rec_len = cpu_to_le16(chunk_size - EXT2_DIR_REC_LEN(1)); + de->inode = cpu_to_le32(parent->i_ino); + memcpy (de->name, "..\0", 4); + ext2_set_de_type (de, inode); + + err = ext2_commit_chunk(page, 0, chunk_size); +fail: + UnlockPage(page); + page_cache_release(page); + return err; +} + +/* + * routine to check that the specified directory is empty (for rmdir) + */ +int ext2_empty_dir (struct inode * inode) +{ + struct page *page = NULL; + unsigned long i, npages = dir_pages(inode); + + for (i = 0; i < npages; i++) { + char *kaddr; + ext2_dirent * de; + page = ext2_get_page(inode, i); + + if (IS_ERR(page)) + continue; + + kaddr = (char *)page_address(page); + de = (ext2_dirent *)kaddr; + kaddr += PAGE_CACHE_SIZE-EXT2_DIR_REC_LEN(1); + + while ((char *)de <= kaddr) { + if (de->inode != 0) { + /* check for . and .. */ + if (de->name[0] != '.') + goto not_empty; + if (de->name_len > 2) + goto not_empty; + if (de->name_len < 2) { + if (de->inode != + cpu_to_le32(inode->i_ino)) + goto not_empty; + } else if (de->name[1] != '.') + goto not_empty; } - filp->f_pos += le16_to_cpu(de->rec_len); + de = ext2_next_entry(de); } - offset = 0; - brelse (bh); + ext2_put_page(page); } - UPDATE_ATIME(inode); + return 1; + +not_empty: + ext2_put_page(page); return 0; } + +struct file_operations ext2_dir_operations = { + read: generic_read_dir, + readdir: ext2_readdir, + fsync: ext2_sync_file, +}; diff -u --recursive --new-file v2.4.5/linux/fs/ext2/ialloc.c linux/fs/ext2/ialloc.c --- v2.4.5/linux/fs/ext2/ialloc.c Fri Mar 23 12:15:07 2001 +++ linux/fs/ext2/ialloc.c Sun Jun 3 17:22:17 2001 @@ -199,10 +199,15 @@ lock_super (sb); es = sb->u.ext2_sb.s_es; - if (ino < EXT2_FIRST_INO(sb) || + is_directory = S_ISDIR(inode->i_mode); + + /* Do this BEFORE marking the inode not in use or returning an error */ + clear_inode (inode); + + if (ino < EXT2_FIRST_INO(sb) || ino > le32_to_cpu(es->s_inodes_count)) { - ext2_error (sb, "free_inode", - "reserved inode or nonexistent inode"); + ext2_error (sb, "ext2_free_inode", + "reserved or nonexistent inode %lu", ino); goto error_return; } block_group = (ino - 1) / EXT2_INODES_PER_GROUP(sb); @@ -210,13 +215,8 @@ bitmap_nr = load_inode_bitmap (sb, block_group); if (bitmap_nr < 0) goto error_return; - - bh = sb->u.ext2_sb.s_inode_bitmap[bitmap_nr]; - is_directory = S_ISDIR(inode->i_mode); - - /* Do this BEFORE marking the inode not in use */ - clear_inode (inode); + bh = sb->u.ext2_sb.s_inode_bitmap[bitmap_nr]; /* Ok, now we can actually update the inode bitmaps.. */ if (!ext2_clear_bit (bit, bh->b_data)) diff -u --recursive --new-file v2.4.5/linux/fs/ext2/inode.c linux/fs/ext2/inode.c --- v2.4.5/linux/fs/ext2/inode.c Thu Apr 26 10:44:10 2001 +++ linux/fs/ext2/inode.c Sun Jun 3 17:42:16 2001 @@ -230,11 +230,11 @@ * or when it reads all @depth-1 indirect blocks successfully and finds * the whole chain, all way to the data (returns %NULL, *err == 0). */ -static inline Indirect *ext2_get_branch(struct inode *inode, - int depth, - int *offsets, - Indirect chain[4], - int *err) +static Indirect *ext2_get_branch(struct inode *inode, + int depth, + int *offsets, + Indirect chain[4], + int *err) { kdev_t dev = inode->i_dev; int size = inode->i_sb->s_blocksize; @@ -574,82 +574,6 @@ goto reread; } -struct buffer_head * ext2_getblk(struct inode * inode, long block, int create, int * err) -{ - struct buffer_head dummy; - int error; - - dummy.b_state = 0; - dummy.b_blocknr = -1000; - error = ext2_get_block(inode, block, &dummy, create); - *err = error; - if (!error && buffer_mapped(&dummy)) { - struct buffer_head *bh; - bh = getblk(dummy.b_dev, dummy.b_blocknr, inode->i_sb->s_blocksize); - if (buffer_new(&dummy)) { - lock_buffer(bh); - memset(bh->b_data, 0, inode->i_sb->s_blocksize); - mark_buffer_uptodate(bh, 1); - unlock_buffer(bh); - mark_buffer_dirty_inode(bh, inode); - } - return bh; - } - return NULL; -} - -struct buffer_head * ext2_bread (struct inode * inode, int block, - int create, int *err) -{ - struct buffer_head * bh; - int prev_blocks; - - prev_blocks = inode->i_blocks; - - bh = ext2_getblk (inode, block, create, err); - if (!bh) - return bh; - - /* - * If the inode has grown, and this is a directory, then perform - * preallocation of a few more blocks to try to keep directory - * fragmentation down. - */ - if (create && - S_ISDIR(inode->i_mode) && - inode->i_blocks > prev_blocks && - EXT2_HAS_COMPAT_FEATURE(inode->i_sb, - EXT2_FEATURE_COMPAT_DIR_PREALLOC)) { - int i; - struct buffer_head *tmp_bh; - - for (i = 1; - i < EXT2_SB(inode->i_sb)->s_es->s_prealloc_dir_blocks; - i++) { - /* - * ext2_getblk will zero out the contents of the - * directory for us - */ - tmp_bh = ext2_getblk(inode, block+i, create, err); - if (!tmp_bh) { - brelse (bh); - return 0; - } - brelse (tmp_bh); - } - } - - if (buffer_uptodate(bh)) - return bh; - ll_rw_block (READ, 1, &bh); - wait_on_buffer (bh); - if (buffer_uptodate(bh)) - return bh; - brelse (bh); - *err = -EIO; - return NULL; -} - static int ext2_writepage(struct page *page) { return block_write_full_page(page,ext2_get_block); @@ -1067,6 +991,7 @@ } else if (S_ISDIR(inode->i_mode)) { inode->i_op = &ext2_dir_inode_operations; inode->i_fop = &ext2_dir_operations; + inode->i_mapping->a_ops = &ext2_aops; } else if (S_ISLNK(inode->i_mode)) { if (!inode->i_blocks) inode->i_op = &ext2_fast_symlink_inode_operations; diff -u --recursive --new-file v2.4.5/linux/fs/ext2/namei.c linux/fs/ext2/namei.c --- v2.4.5/linux/fs/ext2/namei.c Thu Feb 15 12:32:21 2001 +++ linux/fs/ext2/namei.c Sun Jun 3 17:42:16 2001 @@ -1,5 +1,18 @@ /* - * linux/fs/ext2/namei.c + * linux/fs/ext2/namei.c + * + * Rewrite to pagecache. Almost all code had been changed, so blame me + * if the things go wrong. Please, send bug reports to viro@math.psu.edu + * + * Stuff here is basically a glue between the VFS and generic UNIXish + * filesystem that keeps everything in pagecache. All knowledge of the + * directory layout is in fs/ext2/dir.c - it turned out to be easily separatable + * and it's easier to debug that way. In principle we might want to + * generalize that a bit and turn it into a library. Or not. + * + * The only non-static object here is ext2_dir_inode_operations. + * + * TODO: get rid of kmap() use, add readahead. * * Copyright (C) 1992, 1993, 1994, 1995 * Remy Card (card@masi.ibp.fr) @@ -14,344 +27,63 @@ * * Big-endian to little-endian byte-swapping/bitmaps by * David S. Miller (davem@caip.rutgers.edu), 1995 - * Directory entry file type support and forward compatibility hooks - * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998 */ #include #include -#include -#include - - +#include /* - * define how far ahead to read directories while searching them. + * Couple of helper functions - make the code slightly cleaner. */ -#define NAMEI_RA_CHUNKS 2 -#define NAMEI_RA_BLOCKS 4 -#define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) -#define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) -/* - * NOTE! unlike strncmp, ext2_match returns 1 for success, 0 for failure. - * - * `len <= EXT2_NAME_LEN' is guaranteed by caller. - * `de != NULL' is guaranteed by caller. - */ -static inline int ext2_match (int len, const char * const name, - struct ext2_dir_entry_2 * de) +static inline void ext2_inc_count(struct inode *inode) { - if (len != de->name_len) - return 0; - if (!de->inode) - return 0; - return !memcmp(name, de->name, len); + inode->i_nlink++; + mark_inode_dirty(inode); } -/* - * ext2_find_entry() - * - * finds an entry in the specified directory with the wanted name. It - * returns the cache buffer in which the entry was found, and the entry - * itself (as a parameter - res_dir). It does NOT read the inode of the - * entry - you'll have to do that yourself if you want to. - */ -static struct buffer_head * ext2_find_entry (struct inode * dir, - const char * const name, int namelen, - struct ext2_dir_entry_2 ** res_dir) -{ - struct super_block * sb; - struct buffer_head * bh_use[NAMEI_RA_SIZE]; - struct buffer_head * bh_read[NAMEI_RA_SIZE]; - unsigned long offset; - int block, toread, i, err; - - *res_dir = NULL; - sb = dir->i_sb; - - if (namelen > EXT2_NAME_LEN) - return NULL; - - memset (bh_use, 0, sizeof (bh_use)); - toread = 0; - for (block = 0; block < NAMEI_RA_SIZE; ++block) { - struct buffer_head * bh; - - if ((block << EXT2_BLOCK_SIZE_BITS (sb)) >= dir->i_size) - break; - bh = ext2_getblk (dir, block, 0, &err); - bh_use[block] = bh; - if (bh && !buffer_uptodate(bh)) - bh_read[toread++] = bh; - } - - for (block = 0, offset = 0; offset < dir->i_size; block++) { - struct buffer_head * bh; - struct ext2_dir_entry_2 * de; - char * dlimit; - - if ((block % NAMEI_RA_BLOCKS) == 0 && toread) { - ll_rw_block (READ, toread, bh_read); - toread = 0; - } - bh = bh_use[block % NAMEI_RA_SIZE]; - if (!bh) { -#if 0 - ext2_error (sb, "ext2_find_entry", - "directory #%lu contains a hole at offset %lu", - dir->i_ino, offset); -#endif - offset += sb->s_blocksize; - continue; - } - wait_on_buffer (bh); - if (!buffer_uptodate(bh)) { - /* - * read error: all bets are off - */ - break; - } - - de = (struct ext2_dir_entry_2 *) bh->b_data; - dlimit = bh->b_data + sb->s_blocksize; - while ((char *) de < dlimit) { - /* this code is executed quadratically often */ - /* do minimal checking `by hand' */ - int de_len; - - if ((char *) de + namelen <= dlimit && - ext2_match (namelen, name, de)) { - /* found a match - - just to be sure, do a full check */ - if (!ext2_check_dir_entry("ext2_find_entry", - dir, de, bh, offset)) - goto failure; - for (i = 0; i < NAMEI_RA_SIZE; ++i) { - if (bh_use[i] != bh) - brelse (bh_use[i]); - } - *res_dir = de; - return bh; - } - /* prevent looping on a bad block */ - de_len = le16_to_cpu(de->rec_len); - if (de_len <= 0) - goto failure; - offset += de_len; - de = (struct ext2_dir_entry_2 *) - ((char *) de + de_len); - } +static inline void ext2_dec_count(struct inode *inode) +{ + inode->i_nlink--; + mark_inode_dirty(inode); +} - brelse (bh); - if (((block + NAMEI_RA_SIZE) << EXT2_BLOCK_SIZE_BITS (sb)) >= - dir->i_size) - bh = NULL; - else - bh = ext2_getblk (dir, block + NAMEI_RA_SIZE, 0, &err); - bh_use[block % NAMEI_RA_SIZE] = bh; - if (bh && !buffer_uptodate(bh)) - bh_read[toread++] = bh; +static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode) +{ + int err = ext2_add_link(dentry, inode); + if (!err) { + d_instantiate(dentry, inode); + return 0; } - -failure: - for (i = 0; i < NAMEI_RA_SIZE; ++i) - brelse (bh_use[i]); - return NULL; + ext2_dec_count(inode); + iput(inode); + return err; } +/* + * Methods themselves. + */ + static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry) { struct inode * inode; - struct ext2_dir_entry_2 * de; - struct buffer_head * bh; - + ino_t ino; + if (dentry->d_name.len > EXT2_NAME_LEN) return ERR_PTR(-ENAMETOOLONG); - bh = ext2_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de); + ino = ext2_inode_by_name(dir, dentry); inode = NULL; - if (bh) { - unsigned long ino = le32_to_cpu(de->inode); - brelse (bh); + if (ino) { inode = iget(dir->i_sb, ino); - - if (!inode) + if (!inode) return ERR_PTR(-EACCES); } d_add(dentry, inode); return NULL; } -#define S_SHIFT 12 -static unsigned char ext2_type_by_mode[S_IFMT >> S_SHIFT] = { - [S_IFREG >> S_SHIFT] EXT2_FT_REG_FILE, - [S_IFDIR >> S_SHIFT] EXT2_FT_DIR, - [S_IFCHR >> S_SHIFT] EXT2_FT_CHRDEV, - [S_IFBLK >> S_SHIFT] EXT2_FT_BLKDEV, - [S_IFIFO >> S_SHIFT] EXT2_FT_FIFO, - [S_IFSOCK >> S_SHIFT] EXT2_FT_SOCK, - [S_IFLNK >> S_SHIFT] EXT2_FT_SYMLINK, -}; - -static inline void ext2_set_de_type(struct super_block *sb, - struct ext2_dir_entry_2 *de, - umode_t mode) { - if (EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = ext2_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; -} - -/* - * ext2_add_entry() - * - * adds a file entry to the specified directory. - */ -int ext2_add_entry (struct inode * dir, const char * name, int namelen, - struct inode *inode) -{ - unsigned long offset; - unsigned short rec_len; - struct buffer_head * bh; - struct ext2_dir_entry_2 * de, * de1; - struct super_block * sb; - int retval; - - sb = dir->i_sb; - - if (!namelen) - return -EINVAL; - bh = ext2_bread (dir, 0, 0, &retval); - if (!bh) - return retval; - rec_len = EXT2_DIR_REC_LEN(namelen); - offset = 0; - de = (struct ext2_dir_entry_2 *) bh->b_data; - while (1) { - if ((char *)de >= sb->s_blocksize + bh->b_data) { - brelse (bh); - bh = NULL; - bh = ext2_bread (dir, offset >> EXT2_BLOCK_SIZE_BITS(sb), 1, &retval); - if (!bh) - return retval; - if (dir->i_size <= offset) { - if (dir->i_size == 0) { - brelse(bh); - return -ENOENT; - } - - ext2_debug ("creating next block\n"); - - de = (struct ext2_dir_entry_2 *) bh->b_data; - de->inode = 0; - de->rec_len = le16_to_cpu(sb->s_blocksize); - dir->i_size = offset + sb->s_blocksize; - dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL; - mark_inode_dirty(dir); - } else { - - ext2_debug ("skipping to next block\n"); - - de = (struct ext2_dir_entry_2 *) bh->b_data; - } - } - if (!ext2_check_dir_entry ("ext2_add_entry", dir, de, bh, - offset)) { - brelse (bh); - return -ENOENT; - } - if (ext2_match (namelen, name, de)) { - brelse (bh); - return -EEXIST; - } - if ((le32_to_cpu(de->inode) == 0 && le16_to_cpu(de->rec_len) >= rec_len) || - (le16_to_cpu(de->rec_len) >= EXT2_DIR_REC_LEN(de->name_len) + rec_len)) { - offset += le16_to_cpu(de->rec_len); - if (le32_to_cpu(de->inode)) { - de1 = (struct ext2_dir_entry_2 *) ((char *) de + - EXT2_DIR_REC_LEN(de->name_len)); - de1->rec_len = cpu_to_le16(le16_to_cpu(de->rec_len) - - EXT2_DIR_REC_LEN(de->name_len)); - de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(de->name_len)); - de = de1; - } - de->file_type = EXT2_FT_UNKNOWN; - if (inode) { - de->inode = cpu_to_le32(inode->i_ino); - ext2_set_de_type(dir->i_sb, de, inode->i_mode); - } else - de->inode = 0; - de->name_len = namelen; - memcpy (de->name, name, namelen); - /* - * XXX shouldn't update any times until successful - * completion of syscall, but too many callers depend - * on this. - * - * XXX similarly, too many callers depend on - * ext2_new_inode() setting the times, but error - * recovery deletes the inode, so the worst that can - * happen is that the times are slightly out of date - * and/or different from the directory change time. - */ - dir->i_mtime = dir->i_ctime = CURRENT_TIME; - dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL; - mark_inode_dirty(dir); - dir->i_version = ++event; - mark_buffer_dirty_inode(bh, dir); - if (IS_SYNC(dir)) { - ll_rw_block (WRITE, 1, &bh); - wait_on_buffer (bh); - } - brelse(bh); - return 0; - } - offset += le16_to_cpu(de->rec_len); - de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); - } - brelse (bh); - return -ENOSPC; -} - -/* - * ext2_delete_entry deletes a directory entry by merging it with the - * previous entry - */ -static int ext2_delete_entry (struct inode * dir, - struct ext2_dir_entry_2 * de_del, - struct buffer_head * bh) -{ - struct ext2_dir_entry_2 * de, * pde; - int i; - - i = 0; - pde = NULL; - de = (struct ext2_dir_entry_2 *) bh->b_data; - while (i < bh->b_size) { - if (!ext2_check_dir_entry ("ext2_delete_entry", NULL, - de, bh, i)) - return -EIO; - if (de == de_del) { - if (pde) - pde->rec_len = - cpu_to_le16(le16_to_cpu(pde->rec_len) + - le16_to_cpu(de->rec_len)); - else - de->inode = 0; - dir->i_version = ++event; - mark_buffer_dirty_inode(bh, dir); - if (IS_SYNC(dir)) { - ll_rw_block (WRITE, 1, &bh); - wait_on_buffer (bh); - } - return 0; - } - i += le16_to_cpu(de->rec_len); - pde = de; - de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); - } - return -ENOENT; -} - /* * By the time this is called, we already have created * the directory cache entry for the new file, but it @@ -364,454 +96,245 @@ { struct inode * inode = ext2_new_inode (dir, mode); int err = PTR_ERR(inode); - if (IS_ERR(inode)) - return err; - - inode->i_op = &ext2_file_inode_operations; - inode->i_fop = &ext2_file_operations; - inode->i_mapping->a_ops = &ext2_aops; - inode->i_mode = mode; - mark_inode_dirty(inode); - err = ext2_add_entry (dir, dentry->d_name.name, dentry->d_name.len, - inode); - if (err) { - inode->i_nlink--; + if (!IS_ERR(inode)) { + inode->i_op = &ext2_file_inode_operations; + inode->i_fop = &ext2_file_operations; + inode->i_mapping->a_ops = &ext2_aops; mark_inode_dirty(inode); - iput (inode); - return err; + err = ext2_add_nondir(dentry, inode); } - d_instantiate(dentry, inode); - return 0; + return err; } static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev) { struct inode * inode = ext2_new_inode (dir, mode); int err = PTR_ERR(inode); - - if (IS_ERR(inode)) - return err; - - inode->i_uid = current->fsuid; - init_special_inode(inode, mode, rdev); - err = ext2_add_entry (dir, dentry->d_name.name, dentry->d_name.len, - inode); - if (err) - goto out_no_entry; - mark_inode_dirty(inode); - d_instantiate(dentry, inode); - return 0; - -out_no_entry: - inode->i_nlink--; - mark_inode_dirty(inode); - iput(inode); + if (!IS_ERR(inode)) { + init_special_inode(inode, mode, rdev); + mark_inode_dirty(inode); + err = ext2_add_nondir(dentry, inode); + } return err; } -static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) +static int ext2_symlink (struct inode * dir, struct dentry * dentry, + const char * symname) { + struct super_block * sb = dir->i_sb; + int err = -ENAMETOOLONG; + unsigned l = strlen(symname)+1; struct inode * inode; - struct buffer_head * dir_block; - struct ext2_dir_entry_2 * de; - int err; - if (dir->i_nlink >= EXT2_LINK_MAX) - return -EMLINK; + if (l > sb->s_blocksize) + goto out; - inode = ext2_new_inode (dir, S_IFDIR); + inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO); err = PTR_ERR(inode); if (IS_ERR(inode)) - return err; + goto out; - inode->i_op = &ext2_dir_inode_operations; - inode->i_fop = &ext2_dir_operations; - inode->i_size = inode->i_sb->s_blocksize; - inode->i_blocks = 0; - dir_block = ext2_bread (inode, 0, 1, &err); - if (!dir_block) { - inode->i_nlink--; /* is this nlink == 0? */ - mark_inode_dirty(inode); - iput (inode); - return err; + if (l > sizeof (inode->u.ext2_i.i_data)) { + /* slow symlink */ + inode->i_op = &page_symlink_inode_operations; + inode->i_mapping->a_ops = &ext2_aops; + err = block_symlink(inode, symname, l); + if (err) + goto out_fail; + } else { + /* fast symlink */ + inode->i_op = &ext2_fast_symlink_inode_operations; + memcpy((char*)&inode->u.ext2_i.i_data,symname,l); + inode->i_size = l-1; } - de = (struct ext2_dir_entry_2 *) dir_block->b_data; - de->inode = cpu_to_le32(inode->i_ino); - de->name_len = 1; - de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(de->name_len)); - strcpy (de->name, "."); - ext2_set_de_type(dir->i_sb, de, S_IFDIR); - de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); - de->inode = cpu_to_le32(dir->i_ino); - de->rec_len = cpu_to_le16(inode->i_sb->s_blocksize - EXT2_DIR_REC_LEN(1)); - de->name_len = 2; - strcpy (de->name, ".."); - ext2_set_de_type(dir->i_sb, de, S_IFDIR); - inode->i_nlink = 2; - mark_buffer_dirty_inode(dir_block, dir); - brelse (dir_block); - inode->i_mode = S_IFDIR | mode; - if (dir->i_mode & S_ISGID) - inode->i_mode |= S_ISGID; mark_inode_dirty(inode); - err = ext2_add_entry (dir, dentry->d_name.name, dentry->d_name.len, - inode); - if (err) - goto out_no_entry; - dir->i_nlink++; - dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL; - mark_inode_dirty(dir); - d_instantiate(dentry, inode); - return 0; -out_no_entry: - inode->i_nlink = 0; - mark_inode_dirty(inode); - iput (inode); + err = ext2_add_nondir(dentry, inode); +out: return err; -} -/* - * routine to check that the specified directory is empty (for rmdir) - */ -static int empty_dir (struct inode * inode) -{ - unsigned long offset; - struct buffer_head * bh; - struct ext2_dir_entry_2 * de, * de1; - struct super_block * sb; - int err; - - sb = inode->i_sb; - if (inode->i_size < EXT2_DIR_REC_LEN(1) + EXT2_DIR_REC_LEN(2) || - !(bh = ext2_bread (inode, 0, 0, &err))) { - ext2_warning (inode->i_sb, "empty_dir", - "bad directory (dir #%lu) - no data block", - inode->i_ino); - return 1; - } - de = (struct ext2_dir_entry_2 *) bh->b_data; - de1 = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); - if (le32_to_cpu(de->inode) != inode->i_ino || !le32_to_cpu(de1->inode) || - strcmp (".", de->name) || strcmp ("..", de1->name)) { - ext2_warning (inode->i_sb, "empty_dir", - "bad directory (dir #%lu) - no `.' or `..'", - inode->i_ino); - brelse (bh); - return 1; - } - offset = le16_to_cpu(de->rec_len) + le16_to_cpu(de1->rec_len); - de = (struct ext2_dir_entry_2 *) ((char *) de1 + le16_to_cpu(de1->rec_len)); - while (offset < inode->i_size ) { - if (!bh || (void *) de >= (void *) (bh->b_data + sb->s_blocksize)) { - brelse (bh); - bh = ext2_bread (inode, offset >> EXT2_BLOCK_SIZE_BITS(sb), 0, &err); - if (!bh) { -#if 0 - ext2_error (sb, "empty_dir", - "directory #%lu contains a hole at offset %lu", - inode->i_ino, offset); -#endif - offset += sb->s_blocksize; - continue; - } - de = (struct ext2_dir_entry_2 *) bh->b_data; - } - if (!ext2_check_dir_entry ("empty_dir", inode, de, bh, - offset)) { - brelse (bh); - return 1; - } - if (le32_to_cpu(de->inode)) { - brelse (bh); - return 0; - } - offset += le16_to_cpu(de->rec_len); - de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); - } - brelse (bh); - return 1; +out_fail: + ext2_dec_count(inode); + iput (inode); + goto out; } -static int ext2_rmdir (struct inode * dir, struct dentry *dentry) +static int ext2_link (struct dentry * old_dentry, struct inode * dir, + struct dentry *dentry) { - int retval; - struct inode * inode; - struct buffer_head * bh; - struct ext2_dir_entry_2 * de; + struct inode *inode = old_dentry->d_inode; - retval = -ENOENT; - bh = ext2_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de); - if (!bh) - goto end_rmdir; - - inode = dentry->d_inode; - DQUOT_INIT(inode); - - retval = -EIO; - if (le32_to_cpu(de->inode) != inode->i_ino) - goto end_rmdir; - - retval = -ENOTEMPTY; - if (!empty_dir (inode)) - goto end_rmdir; - - retval = ext2_delete_entry(dir, de, bh); - if (retval) - goto end_rmdir; - if (inode->i_nlink != 2) - ext2_warning (inode->i_sb, "ext2_rmdir", - "empty directory has nlink!=2 (%d)", - inode->i_nlink); - inode->i_version = ++event; - inode->i_nlink = 0; - inode->i_size = 0; - mark_inode_dirty(inode); - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; - dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL; - mark_inode_dirty(dir); - -end_rmdir: - brelse (bh); - return retval; -} + if (S_ISDIR(inode->i_mode)) + return -EPERM; -static int ext2_unlink(struct inode * dir, struct dentry *dentry) -{ - int retval; - struct inode * inode; - struct buffer_head * bh; - struct ext2_dir_entry_2 * de; + if (inode->i_nlink >= EXT2_LINK_MAX) + return -EMLINK; - retval = -ENOENT; - bh = ext2_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de); - if (!bh) - goto end_unlink; - - inode = dentry->d_inode; - DQUOT_INIT(inode); - - retval = -EIO; - if (le32_to_cpu(de->inode) != inode->i_ino) - goto end_unlink; - - if (!inode->i_nlink) { - ext2_warning (inode->i_sb, "ext2_unlink", - "Deleting nonexistent file (%lu), %d", - inode->i_ino, inode->i_nlink); - inode->i_nlink = 1; - } - retval = ext2_delete_entry(dir, de, bh); - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; - dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL; - mark_inode_dirty(dir); - inode->i_nlink--; - mark_inode_dirty(inode); - inode->i_ctime = dir->i_ctime; - retval = 0; + inode->i_ctime = CURRENT_TIME; + ext2_inc_count(inode); + atomic_inc(&inode->i_count); -end_unlink: - brelse (bh); - return retval; + return ext2_add_nondir(dentry, inode); } -static int ext2_symlink (struct inode * dir, struct dentry *dentry, const char * symname) +static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) { struct inode * inode; - int l, err; + int err = -EMLINK; - l = strlen(symname)+1; - if (l > dir->i_sb->s_blocksize) - return -ENAMETOOLONG; + if (dir->i_nlink >= EXT2_LINK_MAX) + goto out; + + ext2_inc_count(dir); - inode = ext2_new_inode (dir, S_IFLNK); + inode = ext2_new_inode (dir, S_IFDIR | mode); err = PTR_ERR(inode); if (IS_ERR(inode)) - return err; + goto out_dir; - inode->i_mode = S_IFLNK | S_IRWXUGO; + inode->i_op = &ext2_dir_inode_operations; + inode->i_fop = &ext2_dir_operations; + inode->i_mapping->a_ops = &ext2_aops; - if (l > sizeof (inode->u.ext2_i.i_data)) { - inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - err = block_symlink(inode, symname, l); - if (err) - goto out_no_entry; - } else { - inode->i_op = &ext2_fast_symlink_inode_operations; - memcpy((char*)&inode->u.ext2_i.i_data,symname,l); - inode->i_size = l-1; - } - mark_inode_dirty(inode); + ext2_inc_count(inode); - err = ext2_add_entry (dir, dentry->d_name.name, dentry->d_name.len, - inode); + err = ext2_make_empty(inode, dir); if (err) - goto out_no_entry; - d_instantiate(dentry, inode); - return 0; + goto out_fail; -out_no_entry: - inode->i_nlink--; - mark_inode_dirty(inode); - iput (inode); + err = ext2_add_link(dentry, inode); + if (err) + goto out_fail; + + d_instantiate(dentry, inode); +out: return err; + +out_fail: + ext2_dec_count(inode); + ext2_dec_count(inode); + iput(inode); +out_dir: + ext2_dec_count(dir); + goto out; } -static int ext2_link (struct dentry * old_dentry, - struct inode * dir, struct dentry *dentry) +static int ext2_unlink(struct inode * dir, struct dentry *dentry) { - struct inode *inode = old_dentry->d_inode; - int err; + struct inode * inode = dentry->d_inode; + struct ext2_dir_entry_2 * de; + struct page * page; + int err = -ENOENT; - if (S_ISDIR(inode->i_mode)) - return -EPERM; + de = ext2_find_entry (dir, dentry, &page); + if (!de) + goto out; - if (inode->i_nlink >= EXT2_LINK_MAX) - return -EMLINK; - - err = ext2_add_entry (dir, dentry->d_name.name, dentry->d_name.len, - inode); + err = ext2_delete_entry (de, page); if (err) - return err; + goto out; - inode->i_nlink++; - inode->i_ctime = CURRENT_TIME; - mark_inode_dirty(inode); - atomic_inc(&inode->i_count); - d_instantiate(dentry, inode); - return 0; + inode->i_ctime = dir->i_ctime; + ext2_dec_count(inode); + err = 0; +out: + return err; } -#define PARENT_INO(buffer) \ - ((struct ext2_dir_entry_2 *) ((char *) buffer + \ - le16_to_cpu(((struct ext2_dir_entry_2 *) buffer)->rec_len)))->inode - -/* - * Anybody can rename anything with this: the permission checks are left to the - * higher-level routines. - */ -static int ext2_rename (struct inode * old_dir, struct dentry *old_dentry, - struct inode * new_dir,struct dentry *new_dentry) +static int ext2_rmdir (struct inode * dir, struct dentry *dentry) { - struct inode * old_inode, * new_inode; - struct buffer_head * old_bh, * new_bh, * dir_bh; - struct ext2_dir_entry_2 * old_de, * new_de; - int retval; - - old_bh = new_bh = dir_bh = NULL; - - old_bh = ext2_find_entry (old_dir, old_dentry->d_name.name, old_dentry->d_name.len, &old_de); - /* - * Check for inode number is _not_ due to possible IO errors. - * We might rmdir the source, keep it as pwd of some process - * and merrily kill the link to whatever was created under the - * same name. Goodbye sticky bit ;-< - */ - old_inode = old_dentry->d_inode; - retval = -ENOENT; - if (!old_bh || le32_to_cpu(old_de->inode) != old_inode->i_ino) - goto end_rename; - - new_inode = new_dentry->d_inode; - new_bh = ext2_find_entry (new_dir, new_dentry->d_name.name, - new_dentry->d_name.len, &new_de); - if (new_bh) { - if (!new_inode) { - brelse (new_bh); - new_bh = NULL; - } else { - DQUOT_INIT(new_inode); + struct inode * inode = dentry->d_inode; + int err = -ENOTEMPTY; + + if (ext2_empty_dir(inode)) { + err = ext2_unlink(dir, dentry); + if (!err) { + inode->i_size = 0; + ext2_dec_count(inode); + ext2_dec_count(dir); } } + return err; +} + +static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, + struct inode * new_dir, struct dentry * new_dentry ) +{ + struct inode * old_inode = old_dentry->d_inode; + struct inode * new_inode = new_dentry->d_inode; + struct page * dir_page = NULL; + struct ext2_dir_entry_2 * dir_de = NULL; + struct page * old_page; + struct ext2_dir_entry_2 * old_de; + int err = -ENOENT; + + old_de = ext2_find_entry (old_dir, old_dentry, &old_page); + if (!old_de) + goto out; + if (S_ISDIR(old_inode->i_mode)) { - if (new_inode) { - retval = -ENOTEMPTY; - if (!empty_dir (new_inode)) - goto end_rename; - } - retval = -EIO; - dir_bh = ext2_bread (old_inode, 0, 0, &retval); - if (!dir_bh) - goto end_rename; - if (le32_to_cpu(PARENT_INO(dir_bh->b_data)) != old_dir->i_ino) - goto end_rename; - retval = -EMLINK; - if (!new_inode && new_dir!=old_dir && - new_dir->i_nlink >= EXT2_LINK_MAX) - goto end_rename; + err = -EIO; + dir_de = ext2_dotdot(old_inode, &dir_page); + if (!dir_de) + goto out_old; } - if (!new_bh) { - retval = ext2_add_entry (new_dir, new_dentry->d_name.name, - new_dentry->d_name.len, - old_inode); - if (retval) - goto end_rename; - } else { - new_de->inode = le32_to_cpu(old_inode->i_ino); - if (EXT2_HAS_INCOMPAT_FEATURE(new_dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - new_de->file_type = old_de->file_type; - new_dir->i_version = ++event; - mark_buffer_dirty_inode(new_bh, new_dir); - if (IS_SYNC(new_dir)) { - ll_rw_block (WRITE, 1, &new_bh); - wait_on_buffer (new_bh); - } - brelse(new_bh); - new_bh = NULL; - } - - /* - * Like most other Unix systems, set the ctime for inodes on a - * rename. - */ - old_inode->i_ctime = CURRENT_TIME; - mark_inode_dirty(old_inode); - - /* - * ok, that's it - */ - ext2_delete_entry(old_dir, old_de, old_bh); if (new_inode) { - new_inode->i_nlink--; + struct page *new_page; + struct ext2_dir_entry_2 *new_de; + + err = -ENOTEMPTY; + if (dir_de && !ext2_empty_dir (new_inode)) + goto out_dir; + + err = -ENOENT; + new_de = ext2_find_entry (new_dir, new_dentry, &new_page); + if (!new_de) + goto out_dir; + ext2_inc_count(old_inode); + ext2_set_link(new_dir, new_de, new_page, old_inode); new_inode->i_ctime = CURRENT_TIME; - mark_inode_dirty(new_inode); - } - old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; - old_dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL; - mark_inode_dirty(old_dir); - if (dir_bh) { - PARENT_INO(dir_bh->b_data) = le32_to_cpu(new_dir->i_ino); - mark_buffer_dirty_inode(dir_bh, old_inode); - old_dir->i_nlink--; - mark_inode_dirty(old_dir); - if (new_inode) { + if (dir_de) new_inode->i_nlink--; - mark_inode_dirty(new_inode); - } else { - new_dir->i_nlink++; - new_dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL; - mark_inode_dirty(new_dir); - } + ext2_dec_count(new_inode); + } else { + if (dir_de) { + err = -EMLINK; + if (new_dir->i_nlink >= EXT2_LINK_MAX) + goto out_dir; + } + ext2_inc_count(old_inode); + err = ext2_add_link(new_dentry, old_inode); + if (err) { + ext2_dec_count(old_inode); + goto out_dir; + } + if (dir_de) + ext2_inc_count(new_dir); + } + + ext2_delete_entry (old_de, old_page); + ext2_dec_count(old_inode); + + if (dir_de) { + ext2_set_link(old_inode, dir_de, dir_page, new_dir); + ext2_dec_count(old_dir); } + return 0; - retval = 0; -end_rename: - brelse (dir_bh); - brelse (old_bh); - brelse (new_bh); - return retval; +out_dir: + if (dir_de) { + kunmap(dir_page); + page_cache_release(dir_page); + } +out_old: + kunmap(old_page); + page_cache_release(old_page); +out: + return err; } -/* - * directories can handle most operations... - */ struct inode_operations ext2_dir_inode_operations = { create: ext2_create, lookup: ext2_lookup, diff -u --recursive --new-file v2.4.5/linux/fs/fat/inode.c linux/fs/fat/inode.c --- v2.4.5/linux/fs/fat/inode.c Fri May 25 18:28:55 2001 +++ linux/fs/fat/inode.c Tue Jun 5 18:11:42 2001 @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "msbuffer.h" diff -u --recursive --new-file v2.4.5/linux/fs/hpfs/anode.c linux/fs/hpfs/anode.c --- v2.4.5/linux/fs/hpfs/anode.c Tue Sep 5 14:07:29 2000 +++ linux/fs/hpfs/anode.c Fri Jun 8 13:17:08 2001 @@ -161,6 +161,7 @@ if ((a == node && fnod) || na == -1) return se; c2 = 0; while (up != -1) { + struct anode *new_anode; if (s->s_hpfs_chk) if (hpfs_stop_cycles(s, up, &c1, &c2, "hpfs_add_sector_to_btree #2")) return -1; if (up != node || !fnod) { @@ -194,7 +195,8 @@ mark_buffer_dirty(bh); brelse(bh); a = na; - if ((anode = hpfs_alloc_anode(s, a, &na, &bh))) { + if ((new_anode = hpfs_alloc_anode(s, a, &na, &bh))) { + anode = new_anode; /*anode->up = up != -1 ? up : ra;*/ anode->btree.internal = 1; anode->btree.n_used_nodes = 1; @@ -282,7 +284,7 @@ if (s->s_hpfs_chk) if (hpfs_stop_cycles(s, ano, &d1, &d2, "hpfs_remove_btree #1")) return; - anode = hpfs_map_anode(s, ano, &bh); + if (!(anode = hpfs_map_anode(s, ano, &bh))) return; btree1 = &anode->btree; level++; pos = 0; @@ -291,14 +293,14 @@ hpfs_free_sectors(s, btree1->u.external[i].disk_secno, btree1->u.external[i].length); go_up: if (!level) return; + brelse(bh); if (s->s_hpfs_chk) if (hpfs_stop_cycles(s, ano, &c1, &c2, "hpfs_remove_btree #2")) return; - brelse(bh); hpfs_free_sectors(s, ano, 1); oano = ano; ano = anode->up; if (--level) { - anode = hpfs_map_anode(s, ano, &bh); + if (!(anode = hpfs_map_anode(s, ano, &bh))) return; btree1 = &anode->btree; } else btree1 = btree; for (i = 0; i < btree1->n_used_nodes; i++) { diff -u --recursive --new-file v2.4.5/linux/fs/hpfs/dir.c linux/fs/hpfs/dir.c --- v2.4.5/linux/fs/hpfs/dir.c Fri Aug 11 14:29:01 2000 +++ linux/fs/hpfs/dir.c Fri Jun 8 13:17:08 2001 @@ -212,7 +212,7 @@ hpfs_lock_iget(dir->i_sb, de->directory || (de->ea_size && dir->i_sb->s_hpfs_eas) ? 1 : 2); if (!(result = iget(dir->i_sb, ino))) { hpfs_unlock_iget(dir->i_sb); - hpfs_error(result->i_sb, "hpfs_lookup: can't get inode"); + hpfs_error(dir->i_sb, "hpfs_lookup: can't get inode"); goto bail1; } if (!de->directory) result->i_hpfs_parent_dir = dir->i_ino; diff -u --recursive --new-file v2.4.5/linux/fs/hpfs/super.c linux/fs/hpfs/super.c --- v2.4.5/linux/fs/hpfs/super.c Tue Apr 17 23:16:39 2001 +++ linux/fs/hpfs/super.c Fri Jun 8 13:17:08 2001 @@ -212,6 +212,8 @@ return 0; } else if (!strcmp(p, "case")) { + if (!rhs || !*rhs) + return 0; if (!strcmp(rhs, "lower")) *lowercase = 1; else if (!strcmp(rhs, "asis")) @@ -220,6 +222,8 @@ return 0; } else if (!strcmp(p, "conv")) { + if (!rhs || !*rhs) + return 0; if (!strcmp(rhs, "binary")) *conv = CONV_BINARY; else if (!strcmp(rhs, "text")) @@ -230,6 +234,8 @@ return 0; } else if (!strcmp(p, "check")) { + if (!rhs || !*rhs) + return 0; if (!strcmp(rhs, "none")) *chk = 0; else if (!strcmp(rhs, "normal")) @@ -240,6 +246,8 @@ return 0; } else if (!strcmp(p, "errors")) { + if (!rhs || !*rhs) + return 0; if (!strcmp(rhs, "continue")) *errs = 0; else if (!strcmp(rhs, "remount-ro")) @@ -250,6 +258,8 @@ return 0; } else if (!strcmp(p, "eas")) { + if (!rhs || !*rhs) + return 0; if (!strcmp(rhs, "no")) *eas = 0; else if (!strcmp(rhs, "ro")) @@ -260,6 +270,8 @@ return 0; } else if (!strcmp(p, "chkdsk")) { + if (!rhs || !*rhs) + return 0; if (!strcmp(rhs, "no")) *chkdsk = 0; else if (!strcmp(rhs, "errors")) diff -u --recursive --new-file v2.4.5/linux/fs/inode.c linux/fs/inode.c --- v2.4.5/linux/fs/inode.c Fri May 25 18:28:55 2001 +++ linux/fs/inode.c Tue Jun 5 18:03:33 2001 @@ -1044,6 +1044,8 @@ inode->i_state|=I_FREEING; inodes_stat.nr_inodes--; spin_unlock(&inode_lock); + if (inode->i_data.nrpages) + truncate_inode_pages(&inode->i_data, 0); clear_inode(inode); } } diff -u --recursive --new-file v2.4.5/linux/fs/lockd/mon.c linux/fs/lockd/mon.c --- v2.4.5/linux/fs/lockd/mon.c Mon Oct 16 12:58:51 2000 +++ linux/fs/lockd/mon.c Sun Jun 3 19:07:28 2001 @@ -146,7 +146,7 @@ u32 addr = ntohl(argp->addr); dprintk("nsm: xdr_encode_mon(%08x, %d, %d, %d)\n", - htonl(argp->addr), htonl(argp->proc), + htonl(argp->addr), htonl(argp->prog), htonl(argp->vers), htonl(argp->proc)); /* diff -u --recursive --new-file v2.4.5/linux/fs/namei.c linux/fs/namei.c --- v2.4.5/linux/fs/namei.c Fri May 25 18:28:55 2001 +++ linux/fs/namei.c Tue Jun 5 16:55:22 2001 @@ -351,22 +351,17 @@ static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry) { - struct list_head *p; + struct vfsmount *mounted; + spin_lock(&dcache_lock); - p = (*dentry)->d_vfsmnt.next; - while (p != &(*dentry)->d_vfsmnt) { - struct vfsmount *tmp; - tmp = list_entry(p, struct vfsmount, mnt_clash); - if (tmp->mnt_parent == *mnt) { - *mnt = mntget(tmp); - spin_unlock(&dcache_lock); - mntput(tmp->mnt_parent); - /* tmp holds the mountpoint, so... */ - dput(*dentry); - *dentry = dget(tmp->mnt_root); - return 1; - } - p = p->next; + mounted = lookup_mnt(*mnt, *dentry); + if (mounted) { + *mnt = mntget(mounted); + spin_unlock(&dcache_lock); + dput(*dentry); + mntput(mounted->mnt_parent); + *dentry = dget(mounted->mnt_root); + return 1; } spin_unlock(&dcache_lock); return 0; diff -u --recursive --new-file v2.4.5/linux/fs/nfs/dir.c linux/fs/nfs/dir.c --- v2.4.5/linux/fs/nfs/dir.c Fri May 25 18:28:55 2001 +++ linux/fs/nfs/dir.c Tue Jun 5 18:03:33 2001 @@ -753,6 +753,8 @@ nfs_zap_caches(dir); error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); + if (!error) + dentry->d_inode->i_nlink = 0; return error; } @@ -870,6 +872,8 @@ error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); if (error < 0) goto out; + if (inode) + inode->i_nlink--; out_delete: /* diff -u --recursive --new-file v2.4.5/linux/fs/super.c linux/fs/super.c --- v2.4.5/linux/fs/super.c Fri May 25 18:28:55 2001 +++ linux/fs/super.c Tue Jun 5 18:11:42 2001 @@ -55,7 +55,6 @@ extern int root_mountflags; static int do_remount_sb(struct super_block *sb, int flags, char * data); -static int do_remount(const char *dir, int flags, char * data); /* this is initialized in init/main.c */ kdev_t ROOT_DEV; @@ -282,13 +281,25 @@ static LIST_HEAD(vfsmntlist); +static struct list_head *mount_hashtable; +static int hash_mask, hash_bits; +static kmem_cache_t *mnt_cache; + +static inline unsigned long hash(struct vfsmount *mnt, struct dentry *dentry) +{ + unsigned long tmp = ((unsigned long) mnt / L1_CACHE_BYTES); + tmp += ((unsigned long) dentry / L1_CACHE_BYTES); + tmp = tmp + (tmp >> hash_mask); + return tmp & hash_bits; +} + struct vfsmount *alloc_vfsmnt(void) { - struct vfsmount *mnt = kmalloc(sizeof(struct vfsmount), GFP_KERNEL); + struct vfsmount *mnt = kmem_cache_alloc(mnt_cache, GFP_KERNEL); if (mnt) { memset(mnt, 0, sizeof(struct vfsmount)); atomic_set(&mnt->mnt_count,1); - INIT_LIST_HEAD(&mnt->mnt_clash); + INIT_LIST_HEAD(&mnt->mnt_hash); INIT_LIST_HEAD(&mnt->mnt_child); INIT_LIST_HEAD(&mnt->mnt_mounts); INIT_LIST_HEAD(&mnt->mnt_list); @@ -297,6 +308,24 @@ return mnt; } +struct vfsmount *lookup_mnt(struct vfsmount *mnt, struct dentry *dentry) +{ + struct list_head * head = mount_hashtable + hash(mnt, dentry); + struct list_head * tmp = head; + struct vfsmount *p; + + for (;;) { + tmp = tmp->next; + p = NULL; + if (tmp == head) + break; + p = list_entry(tmp, struct vfsmount, mnt_hash); + if (p->mnt_parent == mnt && p->mnt_mountpoint == dentry) + break; + } + return p; +} + static void detach_mnt(struct vfsmount *mnt, struct nameidata *old_nd) { old_nd->dentry = mnt->mnt_mountpoint; @@ -304,15 +333,17 @@ mnt->mnt_parent = mnt; mnt->mnt_mountpoint = mnt->mnt_root; list_del_init(&mnt->mnt_child); - list_del_init(&mnt->mnt_clash); + list_del_init(&mnt->mnt_hash); + old_nd->dentry->d_mounted--; } static void attach_mnt(struct vfsmount *mnt, struct nameidata *nd) { mnt->mnt_parent = mntget(nd->mnt); mnt->mnt_mountpoint = dget(nd->dentry); - list_add(&mnt->mnt_clash, &nd->dentry->d_vfsmnt); + list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); + nd->dentry->d_mounted++; } /** @@ -331,9 +362,7 @@ * dentry (if any). */ -static struct vfsmount *add_vfsmnt(struct nameidata *nd, - struct dentry *root, - const char *dev_name) +static struct vfsmount *add_vfsmnt(struct dentry *root, const char *dev_name) { struct vfsmount *mnt; struct super_block *sb = root->d_inode->i_sb; @@ -352,18 +381,11 @@ } } mnt->mnt_sb = sb; - - spin_lock(&dcache_lock); - if (nd && !IS_ROOT(nd->dentry) && d_unhashed(nd->dentry)) - goto fail; mnt->mnt_root = dget(root); + mnt->mnt_mountpoint = mnt->mnt_root; + mnt->mnt_parent = mnt; - if (nd) { - attach_mnt(mnt, nd); - } else { - mnt->mnt_mountpoint = mnt->mnt_root; - mnt->mnt_parent = mnt; - } + spin_lock(&dcache_lock); list_add(&mnt->mnt_instances, &sb->s_mounts); list_add(&mnt->mnt_list, vfsmntlist.prev); spin_unlock(&dcache_lock); @@ -371,14 +393,63 @@ get_filesystem(sb->s_type); out: return mnt; +} + +static struct vfsmount *clone_mnt(struct vfsmount *old_mnt, struct dentry *root) +{ + char *name = old_mnt->mnt_devname; + struct vfsmount *mnt = alloc_vfsmnt(); + + if (!mnt) + goto out; + + if (name) { + mnt->mnt_devname = kmalloc(strlen(name)+1, GFP_KERNEL); + if (mnt->mnt_devname) + strcpy(mnt->mnt_devname, name); + } + mnt->mnt_sb = old_mnt->mnt_sb; + mnt->mnt_root = dget(root); + mnt->mnt_mountpoint = mnt->mnt_root; + mnt->mnt_parent = mnt; + + spin_lock(&dcache_lock); + list_add(&mnt->mnt_instances, &old_mnt->mnt_instances); + spin_unlock(&dcache_lock); +out: + return mnt; +} + +static int graft_tree(struct vfsmount *mnt, struct nameidata *nd) +{ + if (S_ISDIR(nd->dentry->d_inode->i_mode) != + S_ISDIR(mnt->mnt_root->d_inode->i_mode)) + return -ENOTDIR; + + down(&nd->dentry->d_inode->i_zombie); + if (IS_DEADDIR(nd->dentry->d_inode)) + goto fail1; + + spin_lock(&dcache_lock); + if (!IS_ROOT(nd->dentry) && d_unhashed(nd->dentry)) + goto fail; + + attach_mnt(mnt, nd); + list_add(&mnt->mnt_list, vfsmntlist.prev); + spin_unlock(&dcache_lock); + up(&nd->dentry->d_inode->i_zombie); + if (mnt->mnt_sb->s_type->fs_flags & FS_SINGLE) + get_filesystem(mnt->mnt_sb->s_type); + mntget(mnt); + return 0; fail: spin_unlock(&dcache_lock); - if (mnt->mnt_devname) - kfree(mnt->mnt_devname); - kfree(mnt); - return NULL; +fail1: + up(&nd->dentry->d_inode->i_zombie); + return -ENOENT; } +#ifdef CONFIG_BLK_DEV_INITRD static void move_vfsmnt(struct vfsmount *mnt, struct nameidata *nd, const char *dev_name) @@ -407,6 +478,7 @@ if (parent_nd.mnt != mnt) path_release(&parent_nd); } +#endif static void kill_super(struct super_block *); @@ -420,7 +492,7 @@ spin_unlock(&dcache_lock); if (mnt->mnt_devname) kfree(mnt->mnt_devname); - kfree(mnt); + kmem_cache_free(mnt_cache, mnt); kill_super(sb); } @@ -873,6 +945,7 @@ } spin_unlock(&dcache_lock); down_write(&sb->s_umount); + lock_kernel(); sb->s_root = NULL; /* Need to clean after the sucker */ if (fs->fs_flags & FS_LITTER) @@ -901,6 +974,7 @@ put_filesystem(fs); sb->s_type = NULL; unlock_super(sb); + unlock_kernel(); up_write(&sb->s_umount); if (bdev) { blkdev_put(bdev, BDEV_FS); @@ -921,6 +995,10 @@ if (!(flags & MS_RDONLY) && sb->s_dev && is_read_only(sb->s_dev)) return -EACCES; /*flags |= MS_RDONLY;*/ + if (flags & MS_RDONLY) + acct_auto_close(sb->s_dev); + shrink_dcache_sb(sb); + fsync_dev(sb->s_dev); /* If we are remounting RDONLY, make sure there are no rw files open */ if ((flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY)) if (!fs_may_remount_ro(sb)) @@ -954,13 +1032,13 @@ dev = get_unnamed_dev(); if (!dev) { - kfree(mnt); + kmem_cache_free(mnt_cache, mnt); return ERR_PTR(-EMFILE); } sb = read_super(dev, NULL, type, 0, NULL, 0); if (!sb) { put_unnamed_dev(dev); - kfree(mnt); + kmem_cache_free(mnt_cache, mnt); return ERR_PTR(-EINVAL); } mnt->mnt_sb = sb; @@ -1002,11 +1080,14 @@ * call reboot(9). Then init(8) could umount root and exec /reboot. */ if (mnt == current->fs->rootmnt) { + int retval = 0; /* * Special case for "unmounting" root ... * we just try to remount it readonly. */ - return do_remount("/", MS_RDONLY, NULL); + if (!(sb->s_flags & MS_RDONLY)) + retval = do_remount_sb(sb, MS_RDONLY, 0); + return retval; } spin_lock(&dcache_lock); @@ -1143,44 +1224,33 @@ /* * do loopback mount. */ -static int do_loopback(char *old_name, char *new_name) +static int do_loopback(struct nameidata *nd, char *old_name) { - struct nameidata old_nd, new_nd; - int err = 0; + struct nameidata old_nd; + struct vfsmount *mnt; + int err; + + err = mount_is_safe(nd); + if (err) + return err; + if (!old_name || !*old_name) return -EINVAL; - if (path_init(old_name, LOOKUP_POSITIVE, &old_nd)) + + if (path_init(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd)) err = path_walk(old_name, &old_nd); if (err) - goto out; - if (path_init(new_name, LOOKUP_POSITIVE, &new_nd)) - err = path_walk(new_name, &new_nd); - if (err) - goto out1; - err = mount_is_safe(&new_nd); - if (err) - goto out2; - err = -EINVAL; - if (S_ISDIR(new_nd.dentry->d_inode->i_mode) != - S_ISDIR(old_nd.dentry->d_inode->i_mode)) - goto out2; + return err; err = -ENOMEM; - - down(&mount_sem); - /* there we go */ - down(&new_nd.dentry->d_inode->i_zombie); - if (IS_DEADDIR(new_nd.dentry->d_inode)) - err = -ENOENT; - else if (add_vfsmnt(&new_nd, old_nd.dentry, old_nd.mnt->mnt_devname)) - err = 0; - up(&new_nd.dentry->d_inode->i_zombie); - up(&mount_sem); -out2: - path_release(&new_nd); -out1: + mnt = clone_mnt(old_nd.mnt, old_nd.dentry); + if (mnt) { + down(&mount_sem); + err = graft_tree(mnt, nd); + up(&mount_sem); + mntput(mnt); + } path_release(&old_nd); -out: return err; } @@ -1190,34 +1260,87 @@ * on it - tough luck. */ -static int do_remount(const char *dir,int flags,char *data) +static int do_remount(struct nameidata *nd, int flags, char *data) { - struct nameidata nd; + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + if (nd->dentry != nd->mnt->mnt_root) + return -EINVAL; + + return do_remount_sb(nd->mnt->mnt_sb, flags, data); +} + +static int do_add_mount(struct nameidata *nd, char *type, int flags, + char *name, void *data) +{ + struct file_system_type * fstype; + struct vfsmount *mnt = NULL; + struct super_block *sb; int retval = 0; + if (!type || !memchr(type, 0, PAGE_SIZE)) + return -EINVAL; + + /* we need capabilities... */ if (!capable(CAP_SYS_ADMIN)) return -EPERM; - if (path_init(dir, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd)) - retval = path_walk(dir, &nd); - if (!retval) { - struct super_block * sb = nd.dentry->d_inode->i_sb; - retval = -ENODEV; - if (sb) { - retval = -EINVAL; - if (nd.dentry == sb->s_root) { - /* - * Shrink the dcache and sync the device. - */ - shrink_dcache_sb(sb); - fsync_dev(sb->s_dev); - if (flags & MS_RDONLY) - acct_auto_close(sb->s_dev); - retval = do_remount_sb(sb, flags, data); - } - } - path_release(&nd); + /* ... filesystem driver... */ + fstype = get_fs_type(type); + if (!fstype) + return -ENODEV; + + /* ... allocated vfsmount... */ + retval = -ENOMEM; + mnt = alloc_vfsmnt(); + if (!mnt) + goto fs_out; + if (name) { + mnt->mnt_devname = kmalloc(strlen(name)+1, GFP_KERNEL); + if (mnt->mnt_devname) + strcpy(mnt->mnt_devname, name); + } + + /* get superblock, locks mount_sem on success */ + if (fstype->fs_flags & FS_NOMOUNT) + sb = ERR_PTR(-EINVAL); + else if (fstype->fs_flags & FS_REQUIRES_DEV) + sb = get_sb_bdev(fstype, name, flags, data); + else if (fstype->fs_flags & FS_SINGLE) + sb = get_sb_single(fstype, flags, data); + else + sb = get_sb_nodev(fstype, flags, data); + + retval = PTR_ERR(sb); + if (IS_ERR(sb)) { + if (mnt->mnt_devname) + kfree(mnt->mnt_devname); + kmem_cache_free(mnt_cache, mnt); + goto fs_out; } + + mnt->mnt_sb = sb; + mnt->mnt_root = dget(sb->s_root); + mnt->mnt_mountpoint = mnt->mnt_root; + mnt->mnt_parent = mnt; + spin_lock(&dcache_lock); + list_add(&mnt->mnt_instances, &sb->s_mounts); + spin_unlock(&dcache_lock); + + /* Something was mounted here while we slept */ + while(d_mountpoint(nd->dentry) && follow_down(&nd->mnt, &nd->dentry)) + ; + + /* Refuse the same filesystem on the same mount point */ + if (nd->mnt->mnt_sb == sb && nd->mnt->mnt_root == nd->dentry) + retval = -EBUSY; + else + retval = graft_tree(mnt, nd); + mntput(mnt); + up(&mount_sem); +fs_out: + put_filesystem(fstype); return retval; } @@ -1271,10 +1394,7 @@ long do_mount(char * dev_name, char * dir_name, char *type_page, unsigned long flags, void *data_page) { - struct file_system_type * fstype; struct nameidata nd; - struct vfsmount *mnt = NULL; - struct super_block *sb; int retval = 0; /* Discard magic */ @@ -1288,86 +1408,22 @@ if (dev_name && !memchr(dev_name, 0, PAGE_SIZE)) return -EINVAL; - /* OK, looks good, now let's see what do they want */ - - /* just change the flags? - capabilities are checked in do_remount() */ - if (flags & MS_REMOUNT) - return do_remount(dir_name, flags & ~MS_REMOUNT, - (char *) data_page); - - /* "mount --bind"? Equivalent to older "mount -t bind" */ - /* No capabilities? What if users do thousands of these? */ - if (flags & MS_BIND) - return do_loopback(dev_name, dir_name); - - /* For the rest we need the type */ - - if (!type_page || !memchr(type_page, 0, PAGE_SIZE)) - return -EINVAL; - - /* for the rest we _really_ need capabilities... */ - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; - - /* ... filesystem driver... */ - fstype = get_fs_type(type_page); - if (!fstype) - return -ENODEV; - - /* ... and mountpoint. Do the lookup first to force automounting. */ - if (path_init(dir_name, - LOOKUP_FOLLOW|LOOKUP_POSITIVE|LOOKUP_DIRECTORY, &nd)) + /* ... and get the mountpoint */ + if (path_init(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd)) retval = path_walk(dir_name, &nd); if (retval) - goto fs_out; + return retval; - /* get superblock, locks mount_sem on success */ - if (fstype->fs_flags & FS_NOMOUNT) - sb = ERR_PTR(-EINVAL); - else if (fstype->fs_flags & FS_REQUIRES_DEV) - sb = get_sb_bdev(fstype, dev_name, flags, data_page); - else if (fstype->fs_flags & FS_SINGLE) - sb = get_sb_single(fstype, flags, data_page); + if (flags & MS_REMOUNT) + retval = do_remount(&nd, flags&~MS_REMOUNT, + (char *)data_page); + else if (flags & MS_BIND) + retval = do_loopback(&nd, dev_name); else - sb = get_sb_nodev(fstype, flags, data_page); - - retval = PTR_ERR(sb); - if (IS_ERR(sb)) - goto dput_out; - - /* Something was mounted here while we slept */ - while(d_mountpoint(nd.dentry) && follow_down(&nd.mnt, &nd.dentry)) - ; - - /* Refuse the same filesystem on the same mount point */ - retval = -EBUSY; - if (nd.mnt && nd.mnt->mnt_sb == sb - && nd.mnt->mnt_root == nd.dentry) - goto fail; - - retval = -ENOENT; - if (!nd.dentry->d_inode) - goto fail; - down(&nd.dentry->d_inode->i_zombie); - if (!IS_DEADDIR(nd.dentry->d_inode)) { - retval = -ENOMEM; - mnt = add_vfsmnt(&nd, sb->s_root, dev_name); - } - up(&nd.dentry->d_inode->i_zombie); - if (!mnt) - goto fail; - retval = 0; -unlock_out: - up(&mount_sem); -dput_out: + retval = do_add_mount(&nd, type_page, flags, + dev_name, data_page); path_release(&nd); -fs_out: - put_filesystem(fstype); return retval; - -fail: - kill_super(sb); - goto unlock_out; } asmlinkage long sys_mount(char * dev_name, char * dir_name, char * type, @@ -1555,10 +1611,10 @@ devfs_mk_symlink (NULL, "root", DEVFS_FL_DEFAULT, path + 5 + path_start, NULL, NULL); memcpy (path + path_start, "/dev/", 5); - vfsmnt = add_vfsmnt(NULL, sb->s_root, path + path_start); + vfsmnt = add_vfsmnt(sb->s_root, path + path_start); } else - vfsmnt = add_vfsmnt(NULL, sb->s_root, "/dev/root"); + vfsmnt = add_vfsmnt(sb->s_root, "/dev/root"); /* FIXME: if something will try to umount us right now... */ if (vfsmnt) { set_fs_root(current->fs, vfsmnt, sb->s_root); @@ -1776,3 +1832,51 @@ } #endif + +void __init mnt_init(unsigned long mempages) +{ + struct list_head *d; + unsigned long order; + unsigned int nr_hash; + int i; + + mnt_cache = kmem_cache_create("mnt_cache", sizeof(struct vfsmount), + 0, SLAB_HWCACHE_ALIGN, NULL, NULL); + if (!mnt_cache) + panic("Cannot create vfsmount cache"); + + mempages >>= (16 - PAGE_SHIFT); + mempages *= sizeof(struct list_head); + for (order = 0; ((1UL << order) << PAGE_SHIFT) < mempages; order++) + ; + + do { + unsigned long tmp; + + nr_hash = (1UL << order) * PAGE_SIZE / + sizeof(struct list_head); + hash_mask = (nr_hash - 1); + + tmp = nr_hash; + hash_bits = 0; + while ((tmp >>= 1UL) != 0UL) + hash_bits++; + + mount_hashtable = (struct list_head *) + __get_free_pages(GFP_ATOMIC, order); + } while (mount_hashtable == NULL && --order >= 0); + + printk("Mount-cache hash table entries: %d (order: %ld, %ld bytes)\n", + nr_hash, order, (PAGE_SIZE << order)); + + if (!mount_hashtable) + panic("Failed to allocate mount hash table\n"); + + d = mount_hashtable; + i = nr_hash; + do { + INIT_LIST_HEAD(d); + d++; + i--; + } while (i); +} diff -u --recursive --new-file v2.4.5/linux/fs/udf/Makefile linux/fs/udf/Makefile --- v2.4.5/linux/fs/udf/Makefile Fri Dec 29 14:07:23 2000 +++ linux/fs/udf/Makefile Wed Jun 6 10:24:10 2001 @@ -9,9 +9,9 @@ O_TARGET := udf.o -obj-y := balloc.o dir.o file.o ialloc.o inode.o lowlevel.o namei.o \ +obj-y := balloc.o dir.o file.o ialloc.o inode.o lowlevel.o namei.o \ partition.o super.o truncate.o symlink.o fsync.o \ crc.o directory.o misc.o udftime.o unicode.o -obj-m := $(O_TARGET) +obj-m := $(O_TARGET) include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.5/linux/fs/udf/balloc.c linux/fs/udf/balloc.c --- v2.4.5/linux/fs/udf/balloc.c Tue Sep 5 14:07:30 2000 +++ linux/fs/udf/balloc.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -85,14 +85,14 @@ #define find_first_one_bit(addr, size)\ find_next_one_bit((addr), (size), 0) -static int read_block_bitmap(struct super_block * sb, Uint32 bitmap, - unsigned int block, unsigned long bitmap_nr) +static int read_block_bitmap(struct super_block * sb, + struct udf_bitmap *bitmap, unsigned int block, unsigned long bitmap_nr) { struct buffer_head *bh = NULL; int retval = 0; lb_addr loc; - loc.logicalBlockNum = bitmap; + loc.logicalBlockNum = bitmap->s_extPosition; loc.partitionReferenceNum = UDF_SB_PARTITION(sb); bh = udf_tread(sb, udf_get_lb_pblock(sb, loc, block), sb->s_blocksize); @@ -100,110 +100,50 @@ { retval = -EIO; } - UDF_SB_BLOCK_BITMAP_NUMBER(sb, bitmap_nr) = block; - UDF_SB_BLOCK_BITMAP(sb, bitmap_nr) = bh; + bitmap->s_block_bitmap[bitmap_nr] = bh; return retval; } -static int __load_block_bitmap(struct super_block * sb, Uint32 bitmap, - unsigned int block_group) +static int __load_block_bitmap(struct super_block * sb, + struct udf_bitmap *bitmap, unsigned int block_group) { - int i, j, retval = 0; - unsigned long block_bitmap_number; - struct buffer_head * block_bitmap = NULL; - int nr_groups = (UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb)) + - (sizeof(struct SpaceBitmapDesc) << 3) + (sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8); + int retval = 0; + int nr_groups = bitmap->s_nr_groups; if (block_group >= nr_groups) { udf_debug("block_group (%d) > nr_groups (%d)\n", block_group, nr_groups); } - if (nr_groups <= UDF_MAX_BLOCK_LOADED) + if (bitmap->s_block_bitmap[block_group]) + return block_group; + else { - if (UDF_SB_BLOCK_BITMAP(sb, block_group)) - { - if (UDF_SB_BLOCK_BITMAP_NUMBER(sb, block_group) == block_group) - return block_group; - } retval = read_block_bitmap(sb, bitmap, block_group, block_group); if (retval < 0) return retval; return block_group; } - - for (i=0; i0; j--) - { - UDF_SB_BLOCK_BITMAP_NUMBER(sb, j) = UDF_SB_BLOCK_BITMAP_NUMBER(sb, j-1); - UDF_SB_BLOCK_BITMAP(sb, j) = UDF_SB_BLOCK_BITMAP(sb, j-1); - } - UDF_SB_BLOCK_BITMAP_NUMBER(sb, 0) = block_bitmap_number; - UDF_SB_BLOCK_BITMAP(sb, 0) = block_bitmap; - - if (!block_bitmap) - retval = read_block_bitmap(sb, bitmap, block_group, 0); - } - else - { - if (UDF_SB_LOADED_BLOCK_BITMAPS(sb) < UDF_MAX_BLOCK_LOADED) - UDF_SB_LOADED_BLOCK_BITMAPS(sb) ++; - else - brelse(UDF_SB_BLOCK_BITMAP(sb, UDF_MAX_BLOCK_LOADED-1)); - for (j=UDF_SB_LOADED_BLOCK_BITMAPS(sb)-1; j>0; j--) - { - UDF_SB_BLOCK_BITMAP_NUMBER(sb, j) = UDF_SB_BLOCK_BITMAP_NUMBER(sb, j-1); - UDF_SB_BLOCK_BITMAP(sb, j) = UDF_SB_BLOCK_BITMAP(sb, j-1); - } - retval = read_block_bitmap(sb, bitmap, block_group, 0); - } - return retval; } -static inline int load_block_bitmap(struct super_block *sb, Uint32 bitmap, - unsigned int block_group) +static inline int load_block_bitmap(struct super_block *sb, + struct udf_bitmap *bitmap, unsigned int block_group) { int slot; - int nr_groups = (UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb)) + - (sizeof(struct SpaceBitmapDesc) << 3) + (sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8); - if (UDF_SB_LOADED_BLOCK_BITMAPS(sb) > 0 && - UDF_SB_BLOCK_BITMAP_NUMBER(sb, 0) == block_group && - UDF_SB_BLOCK_BITMAP(sb, block_group)) - { - return 0; - } - else if (nr_groups <= UDF_MAX_BLOCK_LOADED && - UDF_SB_BLOCK_BITMAP_NUMBER(sb, block_group) == block_group && - UDF_SB_BLOCK_BITMAP(sb, block_group)) - { - slot = block_group; - } - else - { - slot = __load_block_bitmap(sb, bitmap, block_group); - } + slot = __load_block_bitmap(sb, bitmap, block_group); if (slot < 0) return slot; - if (!UDF_SB_BLOCK_BITMAP(sb, slot)) + if (!bitmap->s_block_bitmap[slot]) return -EIO; return slot; } -static void udf_bitmap_free_blocks(const struct inode * inode, Uint32 bitmap, - lb_addr bloc, Uint32 offset, Uint32 count) +static void udf_bitmap_free_blocks(const struct inode * inode, + struct udf_bitmap *bitmap, lb_addr bloc, Uint32 offset, Uint32 count) { struct buffer_head * bh = NULL; unsigned long block; @@ -250,7 +190,7 @@ if (bitmap_nr < 0) goto error_return; - bh = UDF_SB_BLOCK_BITMAP(sb, bitmap_nr); + bh = bitmap->s_block_bitmap[bitmap_nr]; for (i=0; i < count; i++) { if (udf_set_bit(bit + i, bh->b_data)) @@ -283,8 +223,9 @@ return; } -static int udf_bitmap_prealloc_blocks(const struct inode * inode, Uint32 bitmap, - Uint16 partition, Uint32 first_block, Uint32 block_count) +static int udf_bitmap_prealloc_blocks(const struct inode * inode, + struct udf_bitmap *bitmap, Uint16 partition, Uint32 first_block, + Uint32 block_count) { int alloc_count = 0; int bit, block, block_group, group_start; @@ -303,6 +244,9 @@ if (first_block < 0 || first_block >= UDF_SB_PARTLEN(sb, partition)) goto out; + if (first_block + block_count > UDF_SB_PARTLEN(sb, partition)) + block_count = UDF_SB_PARTLEN(sb, partition) - first_block; + repeat: nr_groups = (UDF_SB_PARTLEN(sb, partition) + (sizeof(struct SpaceBitmapDesc) << 3) + (sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8); @@ -313,7 +257,7 @@ bitmap_nr = load_block_bitmap(sb, bitmap, block_group); if (bitmap_nr < 0) goto out; - bh = UDF_SB_BLOCK_BITMAP(sb, bitmap_nr); + bh = bitmap->s_block_bitmap[bitmap_nr]; bit = block % (sb->s_blocksize << 3); @@ -349,10 +293,10 @@ return alloc_count; } -static int udf_bitmap_new_block(const struct inode * inode, Uint32 bitmap, - Uint16 partition, Uint32 goal, int *err) +static int udf_bitmap_new_block(const struct inode * inode, + struct udf_bitmap *bitmap, Uint16 partition, Uint32 goal, int *err) { - int tmp, newbit, bit=0, block, block_group, group_start; + int newbit, bit=0, block, block_group, group_start; int end_goal, nr_groups, bitmap_nr, i; struct buffer_head *bh = NULL; struct super_block *sb; @@ -372,8 +316,7 @@ if (goal < 0 || goal >= UDF_SB_PARTLEN(sb, partition)) goal = 0; - nr_groups = (UDF_SB_PARTLEN(sb, partition) + - (sizeof(struct SpaceBitmapDesc) << 3) + (sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8); + nr_groups = bitmap->s_nr_groups; block = goal + (sizeof(struct SpaceBitmapDesc) << 3); block_group = block >> (sb->s_blocksize_bits + 3); group_start = block_group ? 0 : sizeof(struct SpaceBitmapDesc); @@ -381,7 +324,7 @@ bitmap_nr = load_block_bitmap(sb, bitmap, block_group); if (bitmap_nr < 0) goto error_return; - bh = UDF_SB_BLOCK_BITMAP(sb, bitmap_nr); + bh = bitmap->s_block_bitmap[bitmap_nr]; ptr = memscan((char *)bh->b_data + group_start, 0xFF, sb->s_blocksize - group_start); if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) @@ -421,7 +364,7 @@ bitmap_nr = load_block_bitmap(sb, bitmap, block_group); if (bitmap_nr < 0) goto error_return; - bh = UDF_SB_BLOCK_BITMAP(sb, bitmap_nr); + bh = bitmap->s_block_bitmap[bitmap_nr]; if (i < nr_groups) { ptr = memscan((char *)bh->b_data + group_start, 0xFF, sb->s_blocksize - group_start); @@ -471,7 +414,6 @@ newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) - (sizeof(struct SpaceBitmapDesc) << 3); - tmp = udf_get_pblock(sb, newblock, partition, 0); if (!udf_clear_bit(bit, bh->b_data)) { udf_debug("bit already cleared for block %d\n", bit); @@ -497,19 +439,479 @@ return 0; } +static void udf_table_free_blocks(const struct inode * inode, + struct inode * table, lb_addr bloc, Uint32 offset, Uint32 count) +{ + struct super_block * sb; + Uint32 start, end; + Uint32 nextoffset, oextoffset, elen; + lb_addr nbloc, obloc, eloc; + struct buffer_head *obh, *nbh; + char etype; + int i; + + udf_debug("ino=%ld, bloc=%d, offset=%d, count=%d\n", + inode->i_ino, bloc.logicalBlockNum, offset, count); + + sb = inode->i_sb; + if (!sb) + { + udf_debug("nonexistent device"); + return; + } + + if (table == NULL) + return; + + lock_super(sb); + if (bloc.logicalBlockNum < 0 || + (bloc.logicalBlockNum + count) > UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)) + { + udf_debug("%d < %d || %d + %d > %d\n", + bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, + UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)); + goto error_return; + } + + /* We do this up front - There are some error conditions that could occure, + but.. oh well */ + DQUOT_FREE_BLOCK(sb, inode, count); + if (UDF_SB_LVIDBH(sb)) + { + UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)] = + cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)])+count); + mark_buffer_dirty(UDF_SB_LVIDBH(sb)); + } + + start = bloc.logicalBlockNum + offset; + end = bloc.logicalBlockNum + offset + count - 1; + + oextoffset = nextoffset = sizeof(struct UnallocatedSpaceEntry); + elen = 0; + obloc = nbloc = UDF_I_LOCATION(table); + + obh = nbh = udf_tread(sb, udf_get_lb_pblock(sb, nbloc, 0), sb->s_blocksize); + atomic_inc(&nbh->b_count); + + while (count && (etype = + udf_next_aext(table, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) != -1) + { + if (((eloc.logicalBlockNum + (elen >> sb->s_blocksize_bits)) == + start)) + { + if ((0x3FFFFFFF - elen) < (count << sb->s_blocksize_bits)) + { + count -= ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); + start += ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); + elen = (etype << 30) | (0x40000000 - sb->s_blocksize); + } + else + { + elen = (etype << 30) | + (elen + (count << sb->s_blocksize_bits)); + start += count; + count = 0; + } + udf_write_aext(table, obloc, &oextoffset, eloc, elen, obh, 1); + } + else if (eloc.logicalBlockNum == (end + 1)) + { + if ((0x3FFFFFFF - elen) < (count << sb->s_blocksize_bits)) + { + count -= ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); + end -= ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); + eloc.logicalBlockNum -= + ((0x3FFFFFFF - elen) >> sb->s_blocksize_bits); + elen = (etype << 30) | (0x40000000 - sb->s_blocksize); + } + else + { + eloc.logicalBlockNum = start; + elen = (etype << 30) | + (elen + (count << sb->s_blocksize_bits)); + end -= count; + count = 0; + } + udf_write_aext(table, obloc, &oextoffset, eloc, elen, obh, 1); + } + + if (memcmp(&nbloc, &obloc, sizeof(lb_addr))) + { + i = -1; + obloc = nbloc; + udf_release_data(obh); + atomic_inc(&nbh->b_count); + obh = nbh; + oextoffset = 0; + } + else + oextoffset = nextoffset; + } + + if (count) + { + /* NOTE: we CANNOT use udf_add_aext here, as it can try to allocate + a new block, and since we hold the super block lock already + very bad things would happen :) + + We copy the behavior of udf_add_aext, but instead of + trying to allocate a new block close to the existing one, + we just steal a block from the extent we are trying to add. + + It would be nice if the blocks were close together, but it + isn't required. + */ + + int adsize; + short_ad *sad = NULL; + long_ad *lad = NULL; + struct AllocExtDesc *aed; + + eloc.logicalBlockNum = start; + elen = (EXTENT_RECORDED_ALLOCATED << 30) | + (count << sb->s_blocksize_bits); + + if (UDF_I_ALLOCTYPE(table) == ICB_FLAG_AD_SHORT) + adsize = sizeof(short_ad); + else if (UDF_I_ALLOCTYPE(table) == ICB_FLAG_AD_LONG) + adsize = sizeof(long_ad); + else + { + udf_release_data(obh); + udf_release_data(nbh); + goto error_return; + } + + if (nextoffset + (2 * adsize) > sb->s_blocksize) + { + char *sptr, *dptr; + int loffset; + + udf_release_data(obh); + obh = nbh; + obloc = nbloc; + oextoffset = nextoffset; + + /* Steal a block from the extent being free'd */ + nbloc.logicalBlockNum = eloc.logicalBlockNum; + eloc.logicalBlockNum ++; + elen -= sb->s_blocksize; + + if (!(nbh = udf_tread(sb, + udf_get_lb_pblock(sb, nbloc, 0), + sb->s_blocksize))) + { + udf_release_data(obh); + goto error_return; + } + aed = (struct AllocExtDesc *)(nbh->b_data); + aed->previousAllocExtLocation = cpu_to_le32(obloc.logicalBlockNum); + if (nextoffset + adsize > sb->s_blocksize) + { + loffset = nextoffset; + aed->lengthAllocDescs = cpu_to_le32(adsize); + sptr = (obh)->b_data + nextoffset - adsize; + dptr = nbh->b_data + sizeof(struct AllocExtDesc); + memcpy(dptr, sptr, adsize); + nextoffset = sizeof(struct AllocExtDesc) + adsize; + } + else + { + loffset = nextoffset + adsize; + aed->lengthAllocDescs = cpu_to_le32(0); + sptr = (obh)->b_data + nextoffset; + nextoffset = sizeof(struct AllocExtDesc); + + if (memcmp(&UDF_I_LOCATION(table), &obloc, sizeof(lb_addr))) + { + aed = (struct AllocExtDesc *)(obh)->b_data; + aed->lengthAllocDescs = + cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); + } + else + { + UDF_I_LENALLOC(table) += adsize; + mark_inode_dirty(table); + } + } + udf_new_tag(nbh->b_data, TID_ALLOC_EXTENT_DESC, 2, 1, + nbloc.logicalBlockNum, sizeof(tag)); + switch (UDF_I_ALLOCTYPE(table)) + { + case ICB_FLAG_AD_SHORT: + { + sad = (short_ad *)sptr; + sad->extLength = cpu_to_le32( + EXTENT_NEXT_EXTENT_ALLOCDECS << 30 | + sb->s_blocksize); + sad->extPosition = cpu_to_le32(nbloc.logicalBlockNum); + break; + } + case ICB_FLAG_AD_LONG: + { + lad = (long_ad *)sptr; + lad->extLength = cpu_to_le32( + EXTENT_NEXT_EXTENT_ALLOCDECS << 30 | + sb->s_blocksize); + lad->extLocation = cpu_to_lelb(nbloc); + break; + } + } + udf_update_tag(obh->b_data, loffset); + mark_buffer_dirty(obh); + } + + if (elen) /* It's possible that stealing the block emptied the extent */ + { + udf_write_aext(table, nbloc, &nextoffset, eloc, elen, nbh, 1); + + if (!memcmp(&UDF_I_LOCATION(table), &nbloc, sizeof(lb_addr))) + { + UDF_I_LENALLOC(table) += adsize; + mark_inode_dirty(table); + } + else + { + aed = (struct AllocExtDesc *)nbh->b_data; + aed->lengthAllocDescs = + cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); + udf_update_tag(nbh->b_data, nextoffset); + mark_buffer_dirty(nbh); + } + } + } + + udf_release_data(nbh); + udf_release_data(obh); + +error_return: + sb->s_dirt = 1; + unlock_super(sb); + return; +} + +static int udf_table_prealloc_blocks(const struct inode * inode, + struct inode *table, Uint16 partition, Uint32 first_block, + Uint32 block_count) +{ + struct super_block *sb; + int alloc_count = 0; + Uint32 extoffset, elen, adsize; + lb_addr bloc, eloc; + struct buffer_head *bh; + char etype = -1; + + udf_debug("ino=%ld, partition=%d, first_block=%d, block_count=%d\n", + inode->i_ino, partition, first_block, block_count); + + sb = inode->i_sb; + if (!sb) + { + udf_debug("nonexistent device\n"); + return 0; + } + + if (first_block < 0 || first_block >= UDF_SB_PARTLEN(sb, partition)) + return 0; + + if (table == NULL) + return 0; + + if (UDF_I_ALLOCTYPE(table) == ICB_FLAG_AD_SHORT) + adsize = sizeof(short_ad); + else if (UDF_I_ALLOCTYPE(table) == ICB_FLAG_AD_LONG) + adsize = sizeof(long_ad); + else + return 0; + + lock_super(sb); + + extoffset = sizeof(struct UnallocatedSpaceEntry); + bloc = UDF_I_LOCATION(table); + + bh = udf_tread(sb, udf_get_lb_pblock(sb, bloc, 0), sb->s_blocksize); + eloc.logicalBlockNum = 0xFFFFFFFF; + + while (first_block != eloc.logicalBlockNum && (etype = + udf_next_aext(table, &bloc, &extoffset, &eloc, &elen, &bh, 1)) != -1) + { + udf_debug("eloc=%d, elen=%d, first_block=%d\n", + eloc.logicalBlockNum, elen, first_block); + ; /* empty loop body */ + } + + if (first_block == eloc.logicalBlockNum) + { + extoffset -= adsize; + + alloc_count = (elen >> sb->s_blocksize_bits); + if (alloc_count > block_count) + { + alloc_count = block_count; + eloc.logicalBlockNum += alloc_count; + elen -= (alloc_count << sb->s_blocksize_bits); + udf_write_aext(table, bloc, &extoffset, eloc, (etype << 30) | elen, bh, 1); + } + else + udf_delete_aext(table, bloc, extoffset, eloc, (etype << 30) | elen, bh); + } + else + alloc_count = 0; + + udf_release_data(bh); + + if (alloc_count && UDF_SB_LVIDBH(sb)) + { + UDF_SB_LVID(sb)->freeSpaceTable[partition] = + cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition])-alloc_count); + mark_buffer_dirty(UDF_SB_LVIDBH(sb)); + } + sb->s_dirt = 1; + unlock_super(sb); + udf_debug("alloc_count=%d\n", alloc_count); + return alloc_count; +} + +static int udf_table_new_block(const struct inode * inode, + struct inode *table, Uint16 partition, Uint32 goal, int *err) +{ + struct super_block *sb; + Uint32 spread = 0xFFFFFFFF, nspread; + Uint32 newblock = 0, adsize; + Uint32 extoffset, goal_extoffset, elen, goal_elen = 0; + lb_addr bloc, goal_bloc, eloc, goal_eloc; + struct buffer_head *bh, *goal_bh; + char etype; + + udf_debug("ino=%ld, partition=%d, goal=%d\n", + inode->i_ino, partition, goal); + + *err = -ENOSPC; + sb = inode->i_sb; + if (!sb) + { + udf_debug("nonexistent device\n"); + return newblock; + } + + if (table == NULL) + return newblock; + + if (UDF_I_ALLOCTYPE(table) == ICB_FLAG_AD_SHORT) + adsize = sizeof(short_ad); + else if (UDF_I_ALLOCTYPE(table) == ICB_FLAG_AD_LONG) + adsize = sizeof(long_ad); + else + return newblock; + + lock_super(sb); + + if (goal < 0 || goal >= UDF_SB_PARTLEN(sb, partition)) + goal = 0; + + /* We search for the closest matching block to goal. If we find a exact hit, we stop. Otherwise we keep going till we run out of extents. + We store the buffer_head, bloc, and extoffset of the current closest + match and use that when we are done. + */ + + extoffset = sizeof(struct UnallocatedSpaceEntry); + bloc = UDF_I_LOCATION(table); + + goal_bh = bh = udf_tread(sb, udf_get_lb_pblock(sb, bloc, 0), sb->s_blocksize); + atomic_inc(&goal_bh->b_count); + + while (spread && (etype = + udf_next_aext(table, &bloc, &extoffset, &eloc, &elen, &bh, 1)) != -1) + { + if (goal >= eloc.logicalBlockNum) + { + if (goal < eloc.logicalBlockNum + (elen >> sb->s_blocksize_bits)) + nspread = 0; + else + nspread = goal - eloc.logicalBlockNum - + (elen >> sb->s_blocksize_bits); + } + else + nspread = eloc.logicalBlockNum - goal; + + if (nspread < spread) + { + spread = nspread; + if (goal_bh != bh) + { + udf_release_data(goal_bh); + goal_bh = bh; + atomic_inc(&goal_bh->b_count); + } + goal_bloc = bloc; + goal_extoffset = extoffset - adsize; + goal_eloc = eloc; + goal_elen = (etype << 30) | elen; + } + } + + udf_release_data(bh); + + if (spread == 0xFFFFFFFF) + { + udf_release_data(goal_bh); + unlock_super(sb); + return 0; + } + + /* Only allocate blocks from the beginning of the extent. + That way, we only delete (empty) extents, never have to insert an + extent because of splitting */ + /* This works, but very poorly.... */ + + newblock = goal_eloc.logicalBlockNum; + goal_eloc.logicalBlockNum ++; + goal_elen -= sb->s_blocksize; + + if (goal_elen) + udf_write_aext(table, goal_bloc, &goal_extoffset, goal_eloc, goal_elen, goal_bh, 1); + else + udf_delete_aext(table, goal_bloc, goal_extoffset, goal_eloc, goal_elen, goal_bh); + udf_release_data(goal_bh); + + if (UDF_SB_LVIDBH(sb)) + { + UDF_SB_LVID(sb)->freeSpaceTable[partition] = + cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition])-1); + mark_buffer_dirty(UDF_SB_LVIDBH(sb)); + } + + sb->s_dirt = 1; + unlock_super(sb); + *err = 0; + return newblock; +} + inline void udf_free_blocks(const struct inode * inode, lb_addr bloc, - Uint32 offset, Uint32 count) + Uint32 offset, Uint32 count) { if (UDF_SB_PARTFLAGS(inode->i_sb, bloc.partitionReferenceNum) & UDF_PART_FLAG_UNALLOC_BITMAP) { return udf_bitmap_free_blocks(inode, - UDF_SB_PARTMAPS(inode->i_sb)[bloc.partitionReferenceNum].s_uspace.bitmap, + UDF_SB_PARTMAPS(inode->i_sb)[bloc.partitionReferenceNum].s_uspace.s_bitmap, + bloc, offset, count); + } + else if (UDF_SB_PARTFLAGS(inode->i_sb, bloc.partitionReferenceNum) & UDF_PART_FLAG_UNALLOC_TABLE) + { + return udf_table_free_blocks(inode, + UDF_SB_PARTMAPS(inode->i_sb)[bloc.partitionReferenceNum].s_uspace.s_table, bloc, offset, count); } else if (UDF_SB_PARTFLAGS(inode->i_sb, bloc.partitionReferenceNum) & UDF_PART_FLAG_FREED_BITMAP) { return udf_bitmap_free_blocks(inode, - UDF_SB_PARTMAPS(inode->i_sb)[bloc.partitionReferenceNum].s_fspace.bitmap, + UDF_SB_PARTMAPS(inode->i_sb)[bloc.partitionReferenceNum].s_fspace.s_bitmap, + bloc, offset, count); + } + else if (UDF_SB_PARTFLAGS(inode->i_sb, bloc.partitionReferenceNum) & UDF_PART_FLAG_FREED_TABLE) + { + return udf_table_free_blocks(inode, + UDF_SB_PARTMAPS(inode->i_sb)[bloc.partitionReferenceNum].s_fspace.s_table, bloc, offset, count); } else @@ -522,13 +924,25 @@ if (UDF_SB_PARTFLAGS(inode->i_sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { return udf_bitmap_prealloc_blocks(inode, - UDF_SB_PARTMAPS(inode->i_sb)[partition].s_uspace.bitmap, + UDF_SB_PARTMAPS(inode->i_sb)[partition].s_uspace.s_bitmap, + partition, first_block, block_count); + } + else if (UDF_SB_PARTFLAGS(inode->i_sb, partition) & UDF_PART_FLAG_UNALLOC_TABLE) + { + return udf_table_prealloc_blocks(inode, + UDF_SB_PARTMAPS(inode->i_sb)[partition].s_uspace.s_table, partition, first_block, block_count); } else if (UDF_SB_PARTFLAGS(inode->i_sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { return udf_bitmap_prealloc_blocks(inode, - UDF_SB_PARTMAPS(inode->i_sb)[partition].s_fspace.bitmap, + UDF_SB_PARTMAPS(inode->i_sb)[partition].s_fspace.s_bitmap, + partition, first_block, block_count); + } + else if (UDF_SB_PARTFLAGS(inode->i_sb, partition) & UDF_PART_FLAG_FREED_TABLE) + { + return udf_table_prealloc_blocks(inode, + UDF_SB_PARTMAPS(inode->i_sb)[partition].s_fspace.s_table, partition, first_block, block_count); } else @@ -541,13 +955,25 @@ if (UDF_SB_PARTFLAGS(inode->i_sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { return udf_bitmap_new_block(inode, - UDF_SB_PARTMAPS(inode->i_sb)[partition].s_uspace.bitmap, + UDF_SB_PARTMAPS(inode->i_sb)[partition].s_uspace.s_bitmap, + partition, goal, err); + } + else if (UDF_SB_PARTFLAGS(inode->i_sb, partition) & UDF_PART_FLAG_UNALLOC_TABLE) + { + return udf_table_new_block(inode, + UDF_SB_PARTMAPS(inode->i_sb)[partition].s_uspace.s_table, partition, goal, err); } else if (UDF_SB_PARTFLAGS(inode->i_sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { return udf_bitmap_new_block(inode, - UDF_SB_PARTMAPS(inode->i_sb)[partition].s_fspace.bitmap, + UDF_SB_PARTMAPS(inode->i_sb)[partition].s_fspace.s_bitmap, + partition, goal, err); + } + else if (UDF_SB_PARTFLAGS(inode->i_sb, partition) & UDF_PART_FLAG_FREED_TABLE) + { + return udf_table_new_block(inode, + UDF_SB_PARTMAPS(inode->i_sb)[partition].s_fspace.s_table, partition, goal, err); } else @@ -556,4 +982,3 @@ return 0; } } - diff -u --recursive --new-file v2.4.5/linux/fs/udf/crc.c linux/fs/udf/crc.c --- v2.4.5/linux/fs/udf/crc.c Sat Sep 4 12:42:30 1999 +++ linux/fs/udf/crc.c Wed Jun 6 10:24:10 2001 @@ -17,7 +17,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public diff -u --recursive --new-file v2.4.5/linux/fs/udf/dir.c linux/fs/udf/dir.c --- v2.4.5/linux/fs/udf/dir.c Fri Feb 9 11:29:44 2001 +++ linux/fs/udf/dir.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -49,10 +49,10 @@ /* readdir and lookup functions */ struct file_operations udf_dir_operations = { - read: generic_read_dir, - readdir: udf_readdir, - ioctl: udf_ioctl, - fsync: udf_sync_file, + read: generic_read_dir, + readdir: udf_readdir, + ioctl: udf_ioctl, + fsync: udf_fsync_file, }; /* @@ -88,8 +88,9 @@ if ( filp->f_pos == 0 ) { - if (filldir(dirent, ".", 1, filp->f_pos, dir->i_ino, DT_DIR)) + if (filldir(dirent, ".", 1, filp->f_pos, dir->i_ino, DT_DIR) < 0) return 0; + filp->f_pos ++; } result = do_udf_readdir(dir, filp, filldir, dirent); @@ -104,19 +105,21 @@ struct FileIdentDesc *fi=NULL; struct FileIdentDesc cfi; int block, iblock; - loff_t nf_pos = filp->f_pos; + loff_t nf_pos = filp->f_pos - 1; int flen; char fname[255]; char *nameptr; Uint16 liu; Uint8 lfi; loff_t size = (udf_ext0_offset(dir) + dir->i_size) >> 2; - struct buffer_head * bh = NULL; + struct buffer_head * bh = NULL, * tmp, * bha[16]; lb_addr bloc, eloc; Uint32 extoffset, elen, offset; + int i, num; + unsigned int dt_type; if (nf_pos >= size) - return 1; + return 0; if (nf_pos == 0) nf_pos = (udf_ext0_offset(dir) >> 2); @@ -125,6 +128,7 @@ if (inode_bmap(dir, nf_pos >> (dir->i_sb->s_blocksize_bits - 2), &bloc, &extoffset, &eloc, &elen, &offset, &bh) == EXTENT_RECORDED_ALLOCATED) { + offset >>= dir->i_sb->s_blocksize_bits; block = udf_get_lb_pblock(dir->i_sb, eloc, offset); if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { @@ -139,18 +143,40 @@ else { udf_release_data(bh); - return 0; + return -ENOENT; } if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block, dir->i_sb->s_blocksize))) { udf_release_data(bh); - return 0; + return -EIO; + } + + if (!(offset & ((16 >> (dir->i_sb->s_blocksize_bits - 9))-1))) + { + i = 16 >> (dir->i_sb->s_blocksize_bits - 9); + if (i+offset > (elen >> dir->i_sb->s_blocksize_bits)) + i = (elen >> dir->i_sb->s_blocksize_bits)-offset; + for (num=0; i>0; i--) + { + block = udf_get_lb_pblock(dir->i_sb, eloc, offset+i); + tmp = udf_tgetblk(dir->i_sb, block, dir->i_sb->s_blocksize); + if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) + bha[num++] = tmp; + else + brelse(tmp); + } + if (num) + { + ll_rw_block(READA, num, bha); + for (i=0; if_pos = nf_pos; + filp->f_pos = nf_pos + 1; fi = udf_fileident_read(dir, &nf_pos, &fibh, &cfi, &bloc, &extoffset, &eloc, &elen, &offset, &bh); @@ -160,7 +186,7 @@ udf_release_data(fibh.ebh); udf_release_data(fibh.sbh); udf_release_data(bh); - return 1; + return -ENOENT; } liu = le16_to_cpu(cfi.lengthOfImpUse); @@ -196,44 +222,39 @@ continue; } - iblock = udf_get_lb_pblock(dir->i_sb, lelb_to_cpu(cfi.icb.extLocation), 0); - - if (!lfi) /* parent directory */ - { - if (filldir(dirent, "..", 2, filp->f_pos, filp->f_dentry->d_parent->d_inode->i_ino, DT_DIR)) + if ( cfi.fileCharacteristics & FILE_PARENT ) + { + iblock = udf_get_lb_pblock(dir->i_sb, UDF_I_LOCATION(filp->f_dentry->d_parent->d_inode), 0); + flen = 2; + memcpy(fname, "..", flen); + dt_type = DT_DIR; + } + else + { + iblock = udf_get_lb_pblock(dir->i_sb, lelb_to_cpu(cfi.icb.extLocation), 0); + flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi); + dt_type = DT_UNKNOWN; + } + + if (flen) + { + if (filldir(dirent, fname, flen, filp->f_pos, iblock, dt_type) < 0) { if (fibh.sbh != fibh.ebh) udf_release_data(fibh.ebh); udf_release_data(fibh.sbh); udf_release_data(bh); - return 1; - } - } - else - { - if ((flen = udf_get_filename(nameptr, fname, lfi))) - { - if (filldir(dirent, fname, flen, filp->f_pos, iblock, DT_UNKNOWN)) - { - if (fibh.sbh != fibh.ebh) - udf_release_data(fibh.ebh); - udf_release_data(fibh.sbh); - udf_release_data(bh); - return 1; /* halt enum */ - } + return 0; } } } /* end while */ - filp->f_pos = nf_pos; + filp->f_pos = nf_pos + 1; if (fibh.sbh != fibh.ebh) udf_release_data(fibh.ebh); udf_release_data(fibh.sbh); udf_release_data(bh); - if ( filp->f_pos >= size) - return 1; - else - return 0; + return 0; } diff -u --recursive --new-file v2.4.5/linux/fs/udf/directory.c linux/fs/udf/directory.c --- v2.4.5/linux/fs/udf/directory.c Thu Mar 2 11:17:32 2000 +++ linux/fs/udf/directory.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -92,7 +92,8 @@ Uint32 *offset, struct buffer_head **bh) { struct FileIdentDesc *fi; - int block; + int i, num, block; + struct buffer_head * tmp, * bha[16]; fibh->soffset = fibh->eoffset; @@ -119,6 +120,28 @@ if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block, dir->i_sb->s_blocksize))) return NULL; fibh->soffset = fibh->eoffset = 0; + + if (!(*offset & ((16 >> (dir->i_sb->s_blocksize_bits - 9))-1))) + { + i = 16 >> (dir->i_sb->s_blocksize_bits - 9); + if (i+*offset > (*elen >> dir->i_sb->s_blocksize_bits)) + i = (*elen >> dir->i_sb->s_blocksize_bits)-*offset; + for (num=0; i>0; i--) + { + block = udf_get_lb_pblock(dir->i_sb, *eloc, *offset+i); + tmp = udf_tgetblk(dir->i_sb, block, dir->i_sb->s_blocksize); + if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) + bha[num++] = tmp; + else + brelse(tmp); + } + if (num) + { + ll_rw_block(READA, num, bha); + for (i=0; isbh != fibh->ebh) { diff -u --recursive --new-file v2.4.5/linux/fs/udf/file.c linux/fs/udf/file.c --- v2.4.5/linux/fs/udf/file.c Sun Jan 28 13:28:09 2001 +++ linux/fs/udf/file.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -119,8 +119,8 @@ } struct address_space_operations udf_adinicb_aops = { - readpage: udf_adinicb_readpage, - writepage: udf_adinicb_writepage, + readpage: udf_adinicb_readpage, + writepage: udf_adinicb_writepage, sync_page: block_sync_page, prepare_write: udf_adinicb_prepare_write, commit_write: udf_adinicb_commit_write, @@ -208,7 +208,6 @@ { int result = -1; struct buffer_head *bh = NULL; - Uint16 ident; long_ad eaicb; Uint8 *ea = NULL; @@ -232,17 +231,28 @@ if ( (result == verify_area(VERIFY_WRITE, (char *)arg, 32)) == 0) result = copy_to_user((char *)arg, UDF_SB_VOLIDENT(inode->i_sb), 32); return result; + case UDF_RELOCATE_BLOCKS: + { + long old, new; + + if (!capable(CAP_SYS_ADMIN)) return -EACCES; + get_user(old, (long *)arg); + if ((result = udf_relocate_blocks(inode->i_sb, old, &new)) == 0) + result = put_user(new, (long *)arg); + return result; + } } /* ok, we need to read the inode */ - bh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 0, &ident); + bh = udf_tread(inode->i_sb, + udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0), + inode->i_sb->s_blocksize); - if (!bh || (ident != TID_FILE_ENTRY && ident != TID_EXTENDED_FILE_ENTRY)) + if (!bh) { - udf_debug("bread failed (ino=%ld) or ident (%d) != TID_(EXTENDED_)FILE_ENTRY", - inode->i_ino, ident); - return -EFAULT; + udf_debug("bread failed (inode=%ld)\n", inode->i_ino); + return -EIO; } if (UDF_I_EXTENDED_FE(inode) == 0) @@ -277,7 +287,6 @@ break; default: - udf_debug("ino=%ld, cmd=%d\n", inode->i_ino, cmd); break; } @@ -299,7 +308,8 @@ */ static int udf_release_file(struct inode * inode, struct file * filp) { - if (filp->f_mode & FMODE_WRITE) { + if (filp->f_mode & FMODE_WRITE) + { lock_kernel(); udf_discard_prealloc(inode); unlock_kernel(); @@ -322,21 +332,21 @@ */ static int udf_open_file(struct inode * inode, struct file * filp) { - if ((inode->i_size & 0xFFFFFFFF00000000ULL) && !(filp->f_flags & O_LARGEFILE)) + if ((inode->i_size & 0xFFFFFFFF80000000ULL) && !(filp->f_flags & O_LARGEFILE)) return -EFBIG; return 0; } struct file_operations udf_file_operations = { - read: generic_file_read, - ioctl: udf_ioctl, - open: udf_open_file, - mmap: generic_file_mmap, - write: udf_file_write, - release: udf_release_file, - fsync: udf_sync_file, + read: generic_file_read, + ioctl: udf_ioctl, + open: udf_open_file, + mmap: generic_file_mmap, + write: udf_file_write, + release: udf_release_file, + fsync: udf_fsync_file, }; struct inode_operations udf_file_inode_operations = { - truncate: udf_truncate, + truncate: udf_truncate, }; diff -u --recursive --new-file v2.4.5/linux/fs/udf/fsync.c linux/fs/udf/fsync.c --- v2.4.5/linux/fs/udf/fsync.c Thu Jun 29 16:23:11 2000 +++ linux/fs/udf/fsync.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -28,96 +28,28 @@ #include #include #include -#include -#include "udf_i.h" - -static int sync_extent_block (struct inode * inode, Uint32 block, int wait) -{ - struct buffer_head * bh; - - if (!block) - return 0; - bh = get_hash_table (inode->i_dev, block, inode->i_sb->s_blocksize); - if (!bh) - return 0; - if (wait && buffer_req(bh) && !buffer_uptodate(bh)) { - /* There can be a parallell read(2) that started read-I/O - on the buffer so we can't assume that there's been - an I/O error without first waiting I/O completation. */ - wait_on_buffer(bh); - if (!buffer_uptodate(bh)) - { - brelse (bh); - return -1; - } - } - if (wait || !buffer_uptodate(bh) || !buffer_dirty(bh)) { - if (wait) - /* when we return from fsync all the blocks - must be _just_ stored on disk */ - wait_on_buffer(bh); - brelse (bh); - return 0; - } - ll_rw_block (WRITE, 1, &bh); - atomic_dec(&bh->b_count); - return 0; -} - -static int sync_all_extents(struct inode * inode, int wait) -{ - lb_addr bloc, eloc; - Uint32 extoffset, lextoffset, elen, offset, block; - int err = 0, etype; - struct buffer_head *bh = NULL; - - if ((etype = inode_bmap(inode, 0, &bloc, &extoffset, &eloc, &elen, &offset, &bh)) != -1) - { - block = udf_get_lb_pblock(inode->i_sb, bloc, 0); - err |= sync_extent_block(inode, block, wait); - lextoffset = extoffset; - - while ((etype = udf_next_aext(inode, &bloc, &extoffset, &eloc, &elen, &bh, 1)) != -1) - { - if (lextoffset > extoffset) - { - block = udf_get_lb_pblock(inode->i_sb, bloc, 0); - err |= sync_extent_block(inode, block, wait); - } - lextoffset = extoffset; - } - } - udf_release_data(bh); - return err; -} /* * File may be NULL when we are called. Perhaps we shouldn't * even pass file to fsync ? */ -int udf_sync_file(struct file * file, struct dentry *dentry, int datasync) +int udf_fsync_file(struct file * file, struct dentry *dentry, int datasync) { - int wait, err = 0; struct inode *inode = dentry->d_inode; + return udf_fsync_inode(inode, datasync); +} + +int udf_fsync_inode(struct inode *inode, int datasync) +{ + int err; + + err = fsync_inode_buffers(inode); + if (!(inode->i_state & I_DIRTY)) + return err; + if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) + return err; - lock_kernel(); - if (S_ISLNK(inode->i_mode) && !(inode->i_blocks)) - { - /* - * Don't sync fast links! or ICB_FLAG_AD_IN_ICB - */ - goto skip; - } - - err = generic_buffer_fdatasync(inode, 0, ~0UL); - - for (wait=0; wait<=1; wait++) - { - err |= sync_all_extents (inode, wait); - } -skip: err |= udf_sync_inode (inode); - unlock_kernel(); return err ? -EIO : 0; } diff -u --recursive --new-file v2.4.5/linux/fs/udf/ialloc.c linux/fs/udf/ialloc.c --- v2.4.5/linux/fs/udf/ialloc.c Fri Nov 17 11:35:27 2000 +++ linux/fs/udf/ialloc.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -79,6 +79,7 @@ sb = dir->i_sb; inode = new_inode(sb); + if (!inode) { *err = -ENOMEM; @@ -114,7 +115,8 @@ } inode->i_mode = mode; inode->i_uid = current->fsuid; - if (dir->i_mode & S_ISGID) { + if (dir->i_mode & S_ISGID) + { inode->i_gid = dir->i_gid; if (S_ISDIR(mode)) mode |= S_ISGID; diff -u --recursive --new-file v2.4.5/linux/fs/udf/inode.c linux/fs/udf/inode.c --- v2.4.5/linux/fs/udf/inode.c Sun Jan 28 13:28:09 2001 +++ linux/fs/udf/inode.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -106,23 +106,27 @@ lock_kernel(); if (is_bad_inode(inode)) - { - clear_inode(inode); - goto out; - } + goto no_delete; inode->i_size = 0; udf_truncate(inode); udf_update_inode(inode, IS_SYNC(inode)); udf_free_inode(inode); -out: + unlock_kernel(); + return; +no_delete: + unlock_kernel(); + clear_inode(inode); } void udf_discard_prealloc(struct inode * inode) { - if (inode->i_size && UDF_I_ALLOCTYPE(inode) != ICB_FLAG_AD_IN_ICB) - udf_trunc(inode); + if (inode->i_size && inode->i_size != UDF_I_LENEXTENTS(inode) && + UDF_I_ALLOCTYPE(inode) != ICB_FLAG_AD_IN_ICB) + { + udf_truncate_extents(inode); + } } static int udf_writepage(struct page *page) @@ -146,18 +150,19 @@ } struct address_space_operations udf_aops = { - readpage: udf_readpage, - writepage: udf_writepage, + readpage: udf_readpage, + writepage: udf_writepage, sync_page: block_sync_page, prepare_write: udf_prepare_write, commit_write: generic_commit_write, - bmap: udf_bmap, + bmap: udf_bmap, }; void udf_expand_file_adinicb(struct inode * inode, int newsize, int * err) { struct buffer_head *bh = NULL; struct page *page; + char *kaddr; int block; /* from now on we have normal address_space methods */ @@ -182,7 +187,7 @@ PAGE_BUG(page); if (!Page_Uptodate(page)) { - char *kaddr = kmap(page); + kaddr = kmap(page); memset(kaddr + UDF_I_LENALLOC(inode), 0x00, PAGE_CACHE_SIZE - UDF_I_LENALLOC(inode)); memcpy(kaddr, bh->b_data + udf_file_entry_alloc_offset(inode), @@ -199,7 +204,7 @@ else UDF_I_ALLOCTYPE(inode) = ICB_FLAG_AD_LONG; inode->i_blocks = inode->i_sb->s_blocksize / 512; - mark_buffer_dirty(bh); + mark_buffer_dirty_inode(bh, inode); udf_release_data(bh); inode->i_data.a_ops->writepage(page); @@ -245,9 +250,14 @@ sbh = udf_tread(inode->i_sb, inode->i_ino, inode->i_sb->s_blocksize); if (!sbh) return NULL; - dbh = udf_tread(inode->i_sb, newblock, inode->i_sb->s_blocksize); + dbh = udf_tgetblk(inode->i_sb, newblock, inode->i_sb->s_blocksize); if (!dbh) return NULL; + lock_buffer(dbh); + memset(dbh->b_data, 0x00, inode->i_sb->s_blocksize); + mark_buffer_uptodate(dbh, 1); + unlock_buffer(dbh); + mark_buffer_dirty_inode(dbh, inode); sfibh.soffset = sfibh.eoffset = (f_pos & ((inode->i_sb->s_blocksize - 1) >> 2)) << 2; sfibh.sbh = sfibh.ebh = sbh; @@ -266,7 +276,7 @@ dfibh.soffset = dfibh.eoffset; dfibh.eoffset += (sfibh.eoffset - sfibh.soffset); dfi = (struct FileIdentDesc *)(dbh->b_data + dfibh.soffset); - if (udf_write_fi(sfi, dfi, &dfibh, sfi->impUse, + if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse, sfi->fileIdent + sfi->lengthOfImpUse)) { udf_release_data(sbh); @@ -274,7 +284,7 @@ return NULL; } } - mark_buffer_dirty(dbh); + mark_buffer_dirty_inode(dbh, inode); memset(sbh->b_data + udf_file_entry_alloc_offset(inode), 0, UDF_I_LENALLOC(inode)); @@ -288,6 +298,7 @@ eloc.logicalBlockNum = *block; eloc.partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum; elen = inode->i_size; + UDF_I_LENEXTENTS(inode) = elen; extoffset = udf_file_entry_alloc_offset(inode); udf_add_aext(inode, &bloc, &extoffset, eloc, elen, &sbh, 0); /* UniqueID stuff */ @@ -361,23 +372,21 @@ int create, int * err) { struct buffer_head dummy; - int error; dummy.b_state = 0; dummy.b_blocknr = -1000; - error = udf_get_block(inode, block, &dummy, create); - *err = error; - if (!error & buffer_mapped(&dummy)) + *err = udf_get_block(inode, block, &dummy, create); + if (!*err && buffer_mapped(&dummy)) { struct buffer_head *bh; bh = getblk(dummy.b_dev, dummy.b_blocknr, inode->i_sb->s_blocksize); if (buffer_new(&dummy)) { - if (!buffer_uptodate(bh)) - wait_on_buffer(bh); + lock_buffer(bh); memset(bh->b_data, 0x00, inode->i_sb->s_blocksize); mark_buffer_uptodate(bh, 1); - mark_buffer_dirty(bh); + unlock_buffer(bh); + mark_buffer_dirty_inode(bh, inode); } return bh; } @@ -387,22 +396,22 @@ static struct buffer_head * inode_getblk(struct inode * inode, long block, int *err, long *phys, int *new) { - struct buffer_head *pbh = NULL, *cbh = NULL, *result = NULL; + struct buffer_head *pbh = NULL, *cbh = NULL, *nbh = NULL, *result = NULL; long_ad laarr[EXTENT_MERGE_SIZE]; Uint32 pextoffset = 0, cextoffset = 0, nextoffset = 0; int count = 0, startnum = 0, endnum = 0; Uint32 elen = 0; - lb_addr eloc, pbloc = UDF_I_LOCATION(inode), cbloc = UDF_I_LOCATION(inode); + lb_addr eloc, pbloc, cbloc, nbloc; int c = 1; int lbcount = 0, b_off = 0, offset = 0; Uint32 newblocknum, newblock; - int etype; + char etype; int goal = 0, pgoal = UDF_I_LOCATION(inode).logicalBlockNum; char lastblock = 0; pextoffset = cextoffset = nextoffset = udf_file_entry_alloc_offset(inode); b_off = block << inode->i_sb->s_blocksize_bits; - pbloc = cbloc = UDF_I_LOCATION(inode); + pbloc = cbloc = nbloc = UDF_I_LOCATION(inode); /* find the extent which contains the block we are looking for. alternate between laarr[0] and laarr[1] for locations of the @@ -412,17 +421,25 @@ if (pbh != cbh) { udf_release_data(pbh); - pbh = cbh; atomic_inc(&cbh->b_count); - pbloc = cbloc; + pbh = cbh; + } + if (cbh != nbh) + { + udf_release_data(cbh); + atomic_inc(&nbh->b_count); + cbh = nbh; } lbcount += elen; + pbloc = cbloc; + cbloc = nbloc; + pextoffset = cextoffset; cextoffset = nextoffset; - if ((etype = udf_next_aext(inode, &cbloc, &nextoffset, &eloc, &elen, &cbh, 1)) == -1) + if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) == -1) break; c = !c; @@ -433,7 +450,7 @@ if (etype != EXTENT_NOT_RECORDED_NOT_ALLOCATED) pgoal = eloc.logicalBlockNum + ((elen + inode->i_sb->s_blocksize - 1) >> - inode->i_sb->s_blocksize); + inode->i_sb->s_blocksize_bits); count ++; } while (lbcount + elen <= b_off); @@ -451,10 +468,11 @@ elen = (EXTENT_RECORDED_ALLOCATED << 30) | ((elen + inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize - 1)); - etype = udf_write_aext(inode, cbloc, &cextoffset, eloc, elen, &cbh, 1); + etype = udf_write_aext(inode, nbloc, &cextoffset, eloc, elen, nbh, 1); } udf_release_data(pbh); udf_release_data(cbh); + udf_release_data(nbh); newblock = udf_get_lb_pblock(inode->i_sb, eloc, offset); *phys = newblock; return NULL; @@ -470,6 +488,9 @@ (((laarr[c].extLength & UDF_EXTENT_LENGTH_MASK) + inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize - 1)); + UDF_I_LENEXTENTS(inode) = + (UDF_I_LENEXTENTS(inode) + inode->i_sb->s_blocksize - 1) & + ~(inode->i_sb->s_blocksize - 1); } c = !c; laarr[c].extLength = (EXTENT_NOT_RECORDED_NOT_ALLOCATED << 30) | @@ -494,7 +515,7 @@ /* if the current block is located in a extent, read the next extent */ if (etype != -1) { - if ((etype = udf_next_aext(inode, &cbloc, &nextoffset, &eloc, &elen, &cbh, 0)) != -1) + if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 0)) != -1) { laarr[c+1].extLength = (etype << 30) | elen; laarr[c+1].extLocation = eloc; @@ -505,7 +526,11 @@ else lastblock = 1; } - udf_release_data(cbh); + udf_release_data(nbh); + if (!pbh) + pbh = cbh; + else + udf_release_data(cbh); /* if the current extent is not recorded but allocated, get the block in the extent corresponding to the requested block */ @@ -529,6 +554,7 @@ *err = -ENOSPC; return NULL; } + UDF_I_LENEXTENTS(inode) += inode->i_sb->s_blocksize; } /* if the extent the requsted block is located in contains multiple blocks, @@ -629,17 +655,24 @@ { int start, length = 0, currlength = 0, i; - if (*endnum >= (c+1) && !lastblock) - return; - - if ((laarr[c+1].extLength >> 30) == EXTENT_NOT_RECORDED_ALLOCATED) + if (*endnum >= (c+1)) { - start = c+1; - length = currlength = (((laarr[c+1].extLength & UDF_EXTENT_LENGTH_MASK) + - inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits); + if (!lastblock) + return; + else + start = c; } else - start = c; + { + if ((laarr[c+1].extLength >> 30) == EXTENT_NOT_RECORDED_ALLOCATED) + { + start = c+1; + length = currlength = (((laarr[c+1].extLength & UDF_EXTENT_LENGTH_MASK) + + inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits); + } + else + start = c; + } for (i=start+1; i<=*endnum; i++) { @@ -667,6 +700,7 @@ if (numalloc) { + UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits; if (start == (c+1)) laarr[start].extLength += (numalloc << inode->i_sb->s_blocksize_bits); @@ -784,7 +818,7 @@ { udf_next_aext(inode, &pbloc, &pextoffset, &tmploc, &tmplen, pbh, 0); udf_write_aext(inode, pbloc, &pextoffset, laarr[i].extLocation, - laarr[i].extLength, pbh, 1); + laarr[i].extLength, *pbh, 1); } } @@ -800,29 +834,6 @@ if (!bh) return NULL; -#if 0 - if (create && - S_ISDIR(inode->i_mode) && - inode->i_blocks > prev_blocks) - { - int i; - struct buffer_head *tmp_bh = NULL; - - for (i=1; - i < UDF_DEFAULT_PREALLOC_DIR_BLOCKS; - i++) - { - tmp_bh = udf_getblk(inode, block+i, create, err); - if (!tmp_bh) - { - udf_release_data(bh); - return 0; - } - udf_release_data(tmp_bh); - } - } -#endif - if (buffer_uptodate(bh)) return bh; ll_rw_block(READ, 1, &bh); @@ -834,6 +845,62 @@ return NULL; } +void udf_truncate(struct inode * inode) +{ + int offset; + struct buffer_head *bh; + int err; + + if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || + S_ISLNK(inode->i_mode))) + return; + if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + return; + + if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_IN_ICB) + { + if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) + + inode->i_size)) + { + udf_expand_file_adinicb(inode, inode->i_size, &err); + if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_IN_ICB) + { + inode->i_size = UDF_I_LENALLOC(inode); + return; + } + else + udf_truncate_extents(inode); + } + else + { + offset = (inode->i_size & (inode->i_sb->s_blocksize - 1)) + + udf_file_entry_alloc_offset(inode); + + if ((bh = udf_tread(inode->i_sb, + udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0), + inode->i_sb->s_blocksize))) + { + memset(bh->b_data + offset, 0x00, inode->i_sb->s_blocksize - offset); + mark_buffer_dirty(bh); + udf_release_data(bh); + } + UDF_I_LENALLOC(inode) = inode->i_size; + } + } + else + { + block_truncate_page(inode->i_mapping, inode->i_size, udf_get_block); + udf_truncate_extents(inode); + } + + inode->i_mtime = inode->i_ctime = CURRENT_TIME; + UDF_I_UMTIME(inode) = UDF_I_UCTIME(inode) = CURRENT_UTIME; + if (IS_SYNC(inode)) + udf_sync_inode (inode); + else + mark_inode_dirty(inode); +} + /* * udf_read_inode * @@ -891,7 +958,8 @@ return; } - if (ident != TID_FILE_ENTRY && ident != TID_EXTENDED_FILE_ENTRY) + if (ident != TID_FILE_ENTRY && ident != TID_EXTENDED_FILE_ENTRY && + ident != TID_UNALLOCATED_SPACE_ENTRY) { printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed ident=%d\n", inode->i_ino, ident); @@ -969,16 +1037,24 @@ fe = (struct FileEntry *)bh->b_data; efe = (struct ExtendedFileEntry *)bh->b_data; - if (fe->descTag.tagIdent == TID_EXTENDED_FILE_ENTRY) - UDF_I_EXTENDED_FE(inode) = 1; - else /* fe->descTag.tagIdent == TID_FILE_ENTRY */ - UDF_I_EXTENDED_FE(inode) = 0; - if (le16_to_cpu(fe->icbTag.strategyType) == 4) UDF_I_STRAT4096(inode) = 0; else /* if (le16_to_cpu(fe->icbTag.strategyType) == 4096) */ UDF_I_STRAT4096(inode) = 1; + UDF_I_ALLOCTYPE(inode) = le16_to_cpu(fe->icbTag.flags) & ICB_FLAG_ALLOC_MASK; + if (fe->descTag.tagIdent == TID_EXTENDED_FILE_ENTRY) + UDF_I_EXTENDED_FE(inode) = 1; + else if (fe->descTag.tagIdent == TID_FILE_ENTRY) + UDF_I_EXTENDED_FE(inode) = 0; + else if (fe->descTag.tagIdent == TID_UNALLOCATED_SPACE_ENTRY) + { + UDF_I_LENALLOC(inode) = + le32_to_cpu( + ((struct UnallocatedSpaceEntry *)bh->b_data)->lengthAllocDescs); + return; + } + inode->i_uid = le32_to_cpu(fe->uid); if ( inode->i_uid == -1 ) inode->i_uid = UDF_SB(inode->i_sb)->s_uid; @@ -990,6 +1066,7 @@ inode->i_nlink = 1; inode->i_size = le64_to_cpu(fe->informationLength); + UDF_I_LENEXTENTS(inode) = inode->i_size; inode->i_mode = udf_convert_permissions(fe); inode->i_mode &= ~UDF_SB(inode->i_sb)->s_umask; @@ -997,8 +1074,6 @@ UDF_I_NEXT_ALLOC_BLOCK(inode) = 0; UDF_I_NEXT_ALLOC_GOAL(inode) = 0; - UDF_I_ALLOCTYPE(inode) = le16_to_cpu(fe->icbTag.flags) & ICB_FLAG_ALLOC_MASK; - if (UDF_I_EXTENDED_FE(inode) == 0) { inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) << @@ -1171,11 +1246,11 @@ flags = le16_to_cpu(fe->icbTag.flags); mode = (( permissions ) & S_IRWXO) | - (( permissions >> 2 ) & S_IRWXG) | - (( permissions >> 4 ) & S_IRWXU) | - (( flags & ICB_FLAG_SETUID) ? S_ISUID : 0) | - (( flags & ICB_FLAG_SETGID) ? S_ISGID : 0) | - (( flags & ICB_FLAG_STICKY) ? S_ISVTX : 0); + (( permissions >> 2 ) & S_IRWXG) | + (( permissions >> 4 ) & S_IRWXU) | + (( flags & ICB_FLAG_SETUID) ? S_ISUID : 0) | + (( flags & ICB_FLAG_SETGID) ? S_ISGID : 0) | + (( flags & ICB_FLAG_STICKY) ? S_ISVTX : 0); return mode; } @@ -1221,8 +1296,9 @@ int err = 0; bh = udf_tread(inode->i_sb, - udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0), - inode->i_sb->s_blocksize); + udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0), + inode->i_sb->s_blocksize); + if (!bh) { udf_debug("bread failure\n"); @@ -1233,7 +1309,7 @@ if (UDF_I_NEW_INODE(inode) == 1) { if (UDF_I_EXTENDED_FE(inode) == 0) - memset(bh->b_data, 0x0, sizeof(struct FileEntry)); + memset(bh->b_data, 0x00, sizeof(struct FileEntry)); else memset(bh->b_data, 0x00, sizeof(struct ExtendedFileEntry)); memset(bh->b_data + udf_file_entry_alloc_offset(inode) + @@ -1242,20 +1318,41 @@ UDF_I_NEW_INODE(inode) = 0; } + if (fe->descTag.tagIdent == TID_UNALLOCATED_SPACE_ENTRY) + { + struct UnallocatedSpaceEntry *use = + (struct UnallocatedSpaceEntry *)bh->b_data; + + use->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode)); + crclen = sizeof(struct UnallocatedSpaceEntry) + UDF_I_LENALLOC(inode) - + sizeof(tag); + use->descTag.descCRCLength = cpu_to_le16(crclen); + use->descTag.descCRC = cpu_to_le16(udf_crc((char *)use + sizeof(tag), crclen, 0)); + + use->descTag.tagChecksum = 0; + for (i=0; i<16; i++) + if (i != 4) + use->descTag.tagChecksum += ((Uint8 *)&(use->descTag))[i]; + + mark_buffer_dirty(bh); + udf_release_data(bh); + return err; + } + if (inode->i_uid != UDF_SB(inode->i_sb)->s_uid) fe->uid = cpu_to_le32(inode->i_uid); if (inode->i_gid != UDF_SB(inode->i_sb)->s_gid) fe->gid = cpu_to_le32(inode->i_gid); - udfperms = ((inode->i_mode & S_IRWXO) ) | - ((inode->i_mode & S_IRWXG) << 2) | - ((inode->i_mode & S_IRWXU) << 4); - - udfperms |= (le32_to_cpu(fe->permissions) & - (PERM_O_DELETE | PERM_O_CHATTR | - PERM_G_DELETE | PERM_G_CHATTR | - PERM_U_DELETE | PERM_U_CHATTR)); + udfperms = ((inode->i_mode & S_IRWXO) ) | + ((inode->i_mode & S_IRWXG) << 2) | + ((inode->i_mode & S_IRWXU) << 4); + + udfperms |= (le32_to_cpu(fe->permissions) & + (PERM_O_DELETE | PERM_O_CHATTR | + PERM_G_DELETE | PERM_G_CHATTR | + PERM_U_DELETE | PERM_U_CHATTR)); fe->permissions = cpu_to_le32(udfperms); if (S_ISDIR(inode->i_mode)) @@ -1292,7 +1389,7 @@ eid->identSuffix[1] = UDF_OS_ID_LINUX; dsea->majorDeviceIdent = kdev_t_to_nr(inode->i_rdev) >> 8; dsea->minorDeviceIdent = kdev_t_to_nr(inode->i_rdev) & 0xFF; - mark_buffer_dirty(tbh); + mark_buffer_dirty_inode(tbh, inode); udf_release_data(tbh); } @@ -1305,7 +1402,10 @@ if (udf_time_to_stamp(&cpu_time, inode->i_atime, UDF_I_UATIME(inode))) fe->accessTime = cpu_to_lets(cpu_time); if (udf_time_to_stamp(&cpu_time, inode->i_mtime, UDF_I_UMTIME(inode))) + { fe->modificationTime = cpu_to_lets(cpu_time); + fe->attrTime = cpu_to_lets(cpu_time); + } memset(&(fe->impIdent), 0, sizeof(EntityID)); strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER); fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; @@ -1327,7 +1427,10 @@ if (udf_time_to_stamp(&cpu_time, inode->i_mtime, UDF_I_UMTIME(inode))) efe->modificationTime = cpu_to_lets(cpu_time); if (udf_time_to_stamp(&cpu_time, inode->i_ctime, UDF_I_UCTIME(inode))) + { efe->createTime = cpu_to_lets(cpu_time); + efe->attrTime = cpu_to_lets(cpu_time); + } memset(&(efe->impIdent), 0, sizeof(EntityID)); strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER); efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; @@ -1363,7 +1466,7 @@ else if (S_ISFIFO(inode->i_mode)) fe->icbTag.fileType = FILE_TYPE_FIFO; - icbflags = UDF_I_ALLOCTYPE(inode) | + icbflags = UDF_I_ALLOCTYPE(inode) | ((inode->i_mode & S_ISUID) ? ICB_FLAG_SETUID : 0) | ((inode->i_mode & S_ISGID) ? ICB_FLAG_SETGID : 0) | ((inode->i_mode & S_ISVTX) ? ICB_FLAG_STICKY : 0) | @@ -1444,12 +1547,19 @@ { memcpy(&UDF_I_LOCATION(inode), &ino, sizeof(lb_addr)); __udf_read_inode(inode); + if (is_bad_inode(inode)) + { + iput(inode); + return NULL; + } } if ( ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum) ) { udf_debug("block=%d, partition=%d out of range\n", ino.logicalBlockNum, ino.partitionReferenceNum); + make_bad_inode(inode); + iput(inode); return NULL; } @@ -1496,13 +1606,20 @@ { return -1; } - if (!(nbh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, + if (!(nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb, *bloc, 0), inode->i_sb->s_blocksize))) { return -1; } + lock_buffer(nbh); + memset(nbh->b_data, 0x00, inode->i_sb->s_blocksize); + mark_buffer_uptodate(nbh, 1); + unlock_buffer(nbh); + mark_buffer_dirty_inode(nbh, inode); + aed = (struct AllocExtDesc *)(nbh->b_data); - aed->previousAllocExtLocation = cpu_to_le32(obloc.logicalBlockNum); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) + aed->previousAllocExtLocation = cpu_to_le32(obloc.logicalBlockNum); if (*extoffset + adsize > inode->i_sb->s_blocksize) { loffset = *extoffset; @@ -1551,16 +1668,20 @@ EXTENT_NEXT_EXTENT_ALLOCDECS << 30 | inode->i_sb->s_blocksize); lad->extLocation = cpu_to_lelb(*bloc); + memset(lad->impUse, 0x00, sizeof(lad->impUse)); break; } } - udf_update_tag((*bh)->b_data, loffset); - mark_buffer_dirty(*bh); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) + udf_update_tag((*bh)->b_data, loffset); + else + udf_update_tag((*bh)->b_data, sizeof(struct AllocExtDesc)); + mark_buffer_dirty_inode(*bh, inode); udf_release_data(*bh); *bh = nbh; } - ret = udf_write_aext(inode, *bloc, extoffset, eloc, elen, bh, inc); + ret = udf_write_aext(inode, *bloc, extoffset, eloc, elen, *bh, inc); if (!memcmp(&UDF_I_LOCATION(inode), bloc, sizeof(lb_addr))) { @@ -1572,23 +1693,26 @@ aed = (struct AllocExtDesc *)(*bh)->b_data; aed->lengthAllocDescs = cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); - udf_update_tag((*bh)->b_data, *extoffset + (inc ? 0 : adsize)); - mark_buffer_dirty(*bh); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) + udf_update_tag((*bh)->b_data, *extoffset + (inc ? 0 : adsize)); + else + udf_update_tag((*bh)->b_data, sizeof(struct AllocExtDesc)); + mark_buffer_dirty_inode(*bh, inode); } return ret; } int udf_write_aext(struct inode *inode, lb_addr bloc, int *extoffset, - lb_addr eloc, Uint32 elen, struct buffer_head **bh, int inc) + lb_addr eloc, Uint32 elen, struct buffer_head *bh, int inc) { int adsize; short_ad *sad = NULL; long_ad *lad = NULL; - if (!(*bh)) + if (!(bh)) { - if (!(*bh = udf_tread(inode->i_sb, + if (!(bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, bloc, 0), inode->i_sb->s_blocksize))) { @@ -1597,6 +1721,8 @@ return -1; } } + else + atomic_inc(&bh->b_count); if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_SHORT) adsize = sizeof(short_ad); @@ -1609,39 +1735,47 @@ { case ICB_FLAG_AD_SHORT: { - sad = (short_ad *)((*bh)->b_data + *extoffset); + sad = (short_ad *)((bh)->b_data + *extoffset); sad->extLength = cpu_to_le32(elen); sad->extPosition = cpu_to_le32(eloc.logicalBlockNum); break; } case ICB_FLAG_AD_LONG: { - lad = (long_ad *)((*bh)->b_data + *extoffset); + lad = (long_ad *)((bh)->b_data + *extoffset); lad->extLength = cpu_to_le32(elen); lad->extLocation = cpu_to_lelb(eloc); + memset(lad->impUse, 0x00, sizeof(lad->impUse)); break; } } if (memcmp(&UDF_I_LOCATION(inode), &bloc, sizeof(lb_addr))) { - struct AllocExtDesc *aed = (struct AllocExtDesc *)(*bh)->b_data; - udf_update_tag((*bh)->b_data, - le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct AllocExtDesc)); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) + { + struct AllocExtDesc *aed = (struct AllocExtDesc *)(bh)->b_data; + udf_update_tag((bh)->b_data, + le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct AllocExtDesc)); + } + mark_buffer_dirty_inode(bh, inode); } else + { mark_inode_dirty(inode); - - mark_buffer_dirty(*bh); + mark_buffer_dirty(bh); + } if (inc) *extoffset += adsize; + udf_release_data(bh); return (elen >> 30); } int udf_next_aext(struct inode *inode, lb_addr *bloc, int *extoffset, lb_addr *eloc, Uint32 *elen, struct buffer_head **bh, int inc) { + Uint16 tagIdent; int pos, alen; Uint8 etype; @@ -1657,18 +1791,33 @@ } } + tagIdent = ((tag *)(*bh)->b_data)->tagIdent; + if (!memcmp(&UDF_I_LOCATION(inode), bloc, sizeof(lb_addr))) { - pos = udf_file_entry_alloc_offset(inode); - alen = UDF_I_LENALLOC(inode) + pos; + if (tagIdent == TID_FILE_ENTRY || tagIdent == TID_EXTENDED_FILE_ENTRY || + UDF_I_NEW_INODE(inode)) + { + pos = udf_file_entry_alloc_offset(inode); + alen = UDF_I_LENALLOC(inode) + pos; + } + else if (tagIdent == TID_UNALLOCATED_SPACE_ENTRY) + { + pos = sizeof(struct UnallocatedSpaceEntry); + alen = UDF_I_LENALLOC(inode) + pos; + } + else + return -1; } - else + else if (tagIdent == TID_ALLOC_EXTENT_DESC) { struct AllocExtDesc *aed = (struct AllocExtDesc *)(*bh)->b_data; pos = sizeof(struct AllocExtDesc); alen = le32_to_cpu(aed->lengthAllocDescs) + pos; } + else + return -1; if (!(*extoffset)) *extoffset = pos; @@ -1829,7 +1978,7 @@ } int udf_insert_aext(struct inode *inode, lb_addr bloc, int extoffset, - lb_addr neloc, Uint32 nelen, struct buffer_head *bh) + lb_addr neloc, Uint32 nelen, struct buffer_head *bh) { lb_addr oeloc; Uint32 oelen; @@ -1851,7 +2000,7 @@ while ((type = udf_next_aext(inode, &bloc, &extoffset, &oeloc, &oelen, &bh, 0)) != -1) { - udf_write_aext(inode, bloc, &extoffset, neloc, nelen, &bh, 1); + udf_write_aext(inode, bloc, &extoffset, neloc, nelen, bh, 1); neloc = oeloc; nelen = (type << 30) | oelen; @@ -1867,7 +2016,7 @@ struct buffer_head *obh; lb_addr obloc; int oextoffset, adsize; - int type; + char type; struct AllocExtDesc *aed; if (!(nbh)) @@ -1901,7 +2050,7 @@ while ((type = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) != -1) { - udf_write_aext(inode, obloc, &oextoffset, eloc, (type << 30) | elen, &obh, 1); + udf_write_aext(inode, obloc, &oextoffset, eloc, (type << 30) | elen, obh, 1); if (memcmp(&nbloc, &obloc, sizeof(lb_addr))) { obloc = nbloc; @@ -1917,8 +2066,8 @@ if (memcmp(&nbloc, &obloc, sizeof(lb_addr))) { udf_free_blocks(inode, nbloc, 0, 1); - udf_write_aext(inode, obloc, &oextoffset, eloc, elen, &obh, 1); - udf_write_aext(inode, obloc, &oextoffset, eloc, elen, &obh, 1); + udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1); + udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1); if (!memcmp(&UDF_I_LOCATION(inode), &obloc, sizeof(lb_addr))) { UDF_I_LENALLOC(inode) -= (adsize * 2); @@ -1929,13 +2078,16 @@ aed = (struct AllocExtDesc *)(obh)->b_data; aed->lengthAllocDescs = cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - (2*adsize)); - udf_update_tag((obh)->b_data, oextoffset - (2*adsize)); - mark_buffer_dirty(obh); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) + udf_update_tag((obh)->b_data, oextoffset - (2*adsize)); + else + udf_update_tag((obh)->b_data, sizeof(struct AllocExtDesc)); + mark_buffer_dirty_inode(obh, inode); } } else { - udf_write_aext(inode, obloc, &oextoffset, eloc, elen, &obh, 1); + udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1); if (!memcmp(&UDF_I_LOCATION(inode), &obloc, sizeof(lb_addr))) { UDF_I_LENALLOC(inode) -= adsize; @@ -1946,8 +2098,11 @@ aed = (struct AllocExtDesc *)(obh)->b_data; aed->lengthAllocDescs = cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - adsize); - udf_update_tag((obh)->b_data, oextoffset - adsize); - mark_buffer_dirty(obh); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) + udf_update_tag((obh)->b_data, oextoffset - adsize); + else + udf_update_tag((obh)->b_data, sizeof(struct AllocExtDesc)); + mark_buffer_dirty_inode(obh, inode); } } @@ -1959,7 +2114,8 @@ int inode_bmap(struct inode *inode, int block, lb_addr *bloc, Uint32 *extoffset, lb_addr *eloc, Uint32 *elen, Uint32 *offset, struct buffer_head **bh) { - int etype, lbcount = 0; + Uint64 lbcount = 0, bcount = block << inode->i_sb->s_blocksize_bits; + char etype; if (block < 0) { @@ -1980,31 +2136,34 @@ { if ((etype = udf_next_aext(inode, bloc, extoffset, eloc, elen, bh, 1)) == -1) { - *offset = block - lbcount; + *offset = bcount - lbcount; + UDF_I_LENEXTENTS(inode) = lbcount; return -1; } - lbcount += ((*elen + inode->i_sb->s_blocksize - 1) >> - inode->i_sb->s_blocksize_bits); - } while (lbcount <= block); + lbcount += *elen; + } while (lbcount <= bcount); - *offset = block + ((*elen + inode->i_sb->s_blocksize - 1) >> - inode->i_sb->s_blocksize_bits) - lbcount; + *offset = bcount + *elen - lbcount; return etype; } -long udf_locked_block_map(struct inode *inode, long block) +long udf_block_map(struct inode *inode, long block) { lb_addr eloc, bloc; Uint32 offset, extoffset, elen; struct buffer_head *bh = NULL; int ret; + lock_kernel(); + if (inode_bmap(inode, block, &bloc, &extoffset, &eloc, &elen, &offset, &bh) == EXTENT_RECORDED_ALLOCATED) - ret = udf_get_lb_pblock(inode->i_sb, eloc, offset); + ret = udf_get_lb_pblock(inode->i_sb, eloc, offset >> inode->i_sb->s_blocksize_bits); else ret = 0; + unlock_kernel(); + if (bh) udf_release_data(bh); @@ -2012,14 +2171,4 @@ return udf_fixed_to_variable(ret); else return ret; -} - -long udf_block_map(struct inode *inode, long block) -{ - int ret; - - lock_kernel(); - ret = udf_locked_block_map(inode, block); - unlock_kernel(); - return ret; } diff -u --recursive --new-file v2.4.5/linux/fs/udf/lowlevel.c linux/fs/udf/lowlevel.c --- v2.4.5/linux/fs/udf/lowlevel.c Mon Mar 20 08:17:43 2000 +++ linux/fs/udf/lowlevel.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public diff -u --recursive --new-file v2.4.5/linux/fs/udf/misc.c linux/fs/udf/misc.c --- v2.4.5/linux/fs/udf/misc.c Mon Mar 20 08:17:43 2000 +++ linux/fs/udf/misc.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -67,6 +67,15 @@ #if defined(__linux__) && defined(__KERNEL__) extern struct buffer_head * +udf_tgetblk(struct super_block *sb, int block, int size) +{ + if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV)) + return getblk(sb->s_dev, udf_fixed_to_variable(block), size); + else + return getblk(sb->s_dev, block, size); +} + +extern struct buffer_head * udf_tread(struct super_block *sb, int block, int size) { if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV)) @@ -309,7 +318,7 @@ if ( location != le32_to_cpu(tag_p->tagLocation) ) { - udf_debug("location mismatch block %d, tag %d != %d\n", + udf_debug("location mismatch block %u, tag %u != %u\n", block, le32_to_cpu(tag_p->tagLocation), location); goto error_out; } @@ -424,32 +433,35 @@ if ( size < udf_blocksize ) { - udf_errno=3; + udf_errno = 3; return -1; } - udf_errno=0; + udf_errno = 0; - offs=(long)block * udf_blocksize; - if ( lseek(fd, offs, SEEK_SET) != offs ) { - udf_errno=4; + offs = (long)block * udf_blocksize; + if ( lseek(fd, offs, SEEK_SET) != offs ) + { + udf_errno = 4; return -1; } - i=read(fd, buffer, udf_blocksize); - if ( i < udf_blocksize ) { - udf_errno=5; + i = read(fd, buffer, udf_blocksize); + if ( i < udf_blocksize ) + { + udf_errno = 5; return -1; } tag_p = (tag *)(buffer); /* Verify the tag location */ - if ((block-offset) != tag_p->tagLocation) { + if ((block-offset) != tag_p->tagLocation) + { #ifdef __KERNEL__ printk(KERN_ERR "udf: location mismatch block %d, tag %d\n", block, tag_p->tagLocation); #else - udf_errno=6; + udf_errno = 6; #endif goto error_out; } @@ -460,35 +472,38 @@ checksum += (Uint8)(buffer[i]); for (i = 5; i < 16; i++) checksum += (Uint8)(buffer[i]); - if (checksum != tag_p->tagChecksum) { + if (checksum != tag_p->tagChecksum) + { #ifdef __KERNEL__ printk(KERN_ERR "udf: tag checksum failed\n"); #else - udf_errno=7; + udf_errno = 7; #endif goto error_out; } /* Verify the tag version */ - if (tag_p->descVersion != 0x0002U) { + if (tag_p->descVersion != 0x0002U) + { #ifdef __KERNEL__ printk(KERN_ERR "udf: tag version 0x%04x != 0x0002U\n", tag_p->descVersion); #else - udf_errno=8; + udf_errno = 8; #endif goto error_out; } /* Verify the descriptor CRC */ - if (tag_p->descCRC == udf_crc(buffer + 16, tag_p->descCRCLength, 0)) { - udf_errno=0; + if (tag_p->descCRC == udf_crc(buffer + 16, tag_p->descCRCLength, 0)) + { + udf_errno = 0; return 0; } #ifdef __KERNEL__ printk(KERN_ERR "udf: crc failure in udf_read_tagged\n"); #else - udf_errno=9; + udf_errno = 9; #endif error_out: diff -u --recursive --new-file v2.4.5/linux/fs/udf/namei.c linux/fs/udf/namei.c --- v2.4.5/linux/fs/udf/namei.c Fri Feb 9 11:29:44 2001 +++ linux/fs/udf/namei.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include static inline int udf_match(int len, const char * const name, struct qstr *qs) @@ -42,8 +44,8 @@ return !memcmp(name, qs->name, len); } -int udf_write_fi(struct FileIdentDesc *cfi, struct FileIdentDesc *sfi, - struct udf_fileident_bh *fibh, +int udf_write_fi(struct inode *inode, struct FileIdentDesc *cfi, + struct FileIdentDesc *sfi, struct udf_fileident_bh *fibh, Uint8 *impuse, Uint8 *fileident) { Uint16 crclen = fibh->eoffset - fibh->soffset - sizeof(tag); @@ -56,7 +58,6 @@ int padlen = fibh->eoffset - fibh->soffset - liu - lfi - sizeof(struct FileIdentDesc); - offset = fibh->soffset + sizeof(struct FileIdentDesc); if (impuse) @@ -133,8 +134,8 @@ } if (fibh->sbh != fibh->ebh) - mark_buffer_dirty(fibh->ebh); - mark_buffer_dirty(fibh->sbh); + mark_buffer_dirty_inode(fibh->ebh, inode); + mark_buffer_dirty_inode(fibh->sbh, inode); return 0; } @@ -164,6 +165,7 @@ if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), &bloc, &extoffset, &eloc, &elen, &offset, &bh) == EXTENT_RECORDED_ALLOCATED) { + offset >>= dir->i_sb->s_blocksize_bits; block = udf_get_lb_pblock(dir->i_sb, eloc, offset); if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { @@ -238,7 +240,7 @@ if (!lfi) continue; - if ((flen = udf_get_filename(nameptr, fname, lfi))) + if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi))) { if (udf_match(flen, fname, &(dentry->d_name))) { @@ -348,28 +350,41 @@ if (dentry) { - if ( !(udf_char_to_ustr(&unifilename, dentry->d_name.name, dentry->d_name.len)) ) + if (!dentry->d_name.len) { - *err = -ENAMETOOLONG; + *err = -EINVAL; return NULL; } - if ( !(namelen = udf_UTF8toCS0(name, &unifilename, UDF_NAME_LEN)) ) + if ( !(udf_char_to_ustr(&unifilename, dentry->d_name.name, dentry->d_name.len)) ) { *err = -ENAMETOOLONG; return NULL; } + + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) + { + if ( !(namelen = udf_UTF8toCS0(name, &unifilename, UDF_NAME_LEN)) ) + { + *err = -ENAMETOOLONG; + return NULL; + } + } + else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) + { + if ( !(namelen = udf_NLStoCS0(UDF_SB(sb)->s_nls_map, name, &unifilename, UDF_NAME_LEN)) ) + { + *err = -ENAMETOOLONG; + return NULL; + } + } + else + return NULL; } - else if (dir->i_size != 0) - { - /* WTF??? */ - *err = -ENOENT; - return NULL; - } - else /* .. */ + else namelen = 0; - nfidlen = (sizeof(struct FileIdentDesc) + 0 + namelen + 3) & ~3; + nfidlen = (sizeof(struct FileIdentDesc) + namelen + 3) & ~3; f_pos = (udf_ext0_offset(dir) >> 2); @@ -377,6 +392,7 @@ if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), &bloc, &extoffset, &eloc, &elen, &offset, &bh) == EXTENT_RECORDED_ALLOCATED) { + offset >>= dir->i_sb->s_blocksize_bits; block = udf_get_lb_pblock(dir->i_sb, eloc, offset); if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { @@ -391,6 +407,7 @@ if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block, dir->i_sb->s_blocksize))) { udf_release_data(bh); + *err = -EIO; return NULL; } @@ -406,6 +423,7 @@ udf_release_data(fibh->ebh); udf_release_data(fibh->sbh); udf_release_data(bh); + *err = -EIO; return NULL; } @@ -440,18 +458,22 @@ cfi->fileCharacteristics = 0; cfi->lengthFileIdent = namelen; cfi->lengthOfImpUse = cpu_to_le16(0); - if (!udf_write_fi(cfi, fi, fibh, NULL, name)) + if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) return fi; else + { + *err = -EIO; return NULL; + } } } - + if (!lfi || !dentry) continue; - - if ((flen = udf_get_filename(nameptr, fname, lfi)) && - udf_match(flen, fname, &(dentry->d_name))) { + + if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi)) && + udf_match(flen, fname, &(dentry->d_name))) + { if (fibh->sbh != fibh->ebh) udf_release_data(fibh->ebh); udf_release_data(fibh->sbh); @@ -533,7 +555,6 @@ block = eloc.logicalBlockNum + ((elen - 1) >> dir->i_sb->s_blocksize_bits); - *err = -ENOSPC; if (!(fibh->ebh = udf_bread(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), 1, err))) { udf_release_data(bh); @@ -568,7 +589,7 @@ cfi->fileVersionNum = cpu_to_le16(1); cfi->lengthFileIdent = namelen; cfi->lengthOfImpUse = cpu_to_le16(0); - if (!udf_write_fi(cfi, fi, fibh, NULL, name)) + if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) { udf_release_data(bh); dir->i_size += nfidlen; @@ -584,16 +605,18 @@ if (fibh->sbh != fibh->ebh) udf_release_data(fibh->ebh); udf_release_data(fibh->sbh); + *err = -EIO; return NULL; } } -static int udf_delete_entry(struct FileIdentDesc *fi, - struct udf_fileident_bh *fibh, - struct FileIdentDesc *cfi) +static int udf_delete_entry(struct inode *inode, struct FileIdentDesc *fi, + struct udf_fileident_bh *fibh, struct FileIdentDesc *cfi) { cfi->fileCharacteristics |= FILE_DELETED; - return udf_write_fi(cfi, fi, fibh, NULL, NULL); + if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) + memset(&(cfi->icb), 0x00, sizeof(long_ad)); + return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); } static int udf_create(struct inode *dir, struct dentry *dentry, int mode) @@ -627,7 +650,7 @@ cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); *(Uint32 *)((struct ADImpUse *)cfi.icb.impUse)->impUse = cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); - udf_write_fi(&cfi, fi, &fibh, NULL, NULL); + udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); if (UDF_I_ALLOCTYPE(dir) == ICB_FLAG_AD_IN_ICB) { mark_inode_dirty(dir); @@ -665,7 +688,7 @@ cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); *(Uint32 *)((struct ADImpUse *)cfi.icb.impUse)->impUse = cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); - udf_write_fi(&cfi, fi, &fibh, NULL, NULL); + udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); if (UDF_I_ALLOCTYPE(dir) == ICB_FLAG_AD_IN_ICB) { mark_inode_dirty(dir); @@ -700,7 +723,6 @@ inode->i_op = &udf_dir_inode_operations; inode->i_fop = &udf_dir_operations; - inode->i_size = 0; if (!(fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err))) { inode->i_nlink--; @@ -714,7 +736,7 @@ *(Uint32 *)((struct ADImpUse *)cfi.icb.impUse)->impUse = cpu_to_le32(UDF_I_UNIQUE(dir) & 0x00000000FFFFFFFFUL); cfi.fileCharacteristics = FILE_DIRECTORY | FILE_PARENT; - udf_write_fi(&cfi, fi, &fibh, NULL, NULL); + udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL); udf_release_data(fibh.sbh); inode->i_mode = S_IFDIR | mode; if (dir->i_mode & S_ISGID) @@ -733,7 +755,7 @@ *(Uint32 *)((struct ADImpUse *)cfi.icb.impUse)->impUse = cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); cfi.fileCharacteristics |= FILE_DIRECTORY; - udf_write_fi(&cfi, fi, &fibh, NULL, NULL); + udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); dir->i_version = ++event; dir->i_nlink++; mark_inode_dirty(dir); @@ -763,6 +785,7 @@ if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), &bloc, &extoffset, &eloc, &elen, &offset, &bh) == EXTENT_RECORDED_ALLOCATED) { + offset >>= dir->i_sb->s_blocksize_bits; block = udf_get_lb_pblock(dir->i_sb, eloc, offset); if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { @@ -830,7 +853,7 @@ retval = -ENOTEMPTY; if (!empty_dir(inode)) goto end_rmdir; - retval = udf_delete_entry(fi, &fibh, &cfi); + retval = udf_delete_entry(dir, fi, &fibh, &cfi); dir->i_version = ++event; if (retval) goto end_rmdir; @@ -885,7 +908,7 @@ inode->i_ino, inode->i_nlink); inode->i_nlink = 1; } - retval = udf_delete_entry(fi, &fibh, &cfi); + retval = udf_delete_entry(dir, fi, &fibh, &cfi); if (retval) goto end_unlink; dir->i_ctime = dir->i_mtime = CURRENT_TIME; @@ -940,6 +963,7 @@ eloc.logicalBlockNum = block; eloc.partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum; elen = inode->i_sb->s_blocksize; + UDF_I_LENEXTENTS(inode) = elen; extoffset = udf_file_entry_alloc_offset(inode); udf_add_aext(inode, &bloc, &extoffset, eloc, elen, &bh, 0); udf_release_data(bh); @@ -947,11 +971,18 @@ inode->i_blocks = inode->i_sb->s_blocksize / 512; block = udf_get_pblock(inode->i_sb, block, UDF_I_LOCATION(inode).partitionReferenceNum, 0); + bh = udf_tread(inode->i_sb, block, inode->i_sb->s_blocksize); + lock_buffer(bh); + memset(bh->b_data, 0x00, inode->i_sb->s_blocksize); + mark_buffer_uptodate(bh, 1); + unlock_buffer(bh); + mark_buffer_dirty_inode(bh, inode); } else + { block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0); - - bh = udf_tread(inode->i_sb, block, inode->i_sb->s_blocksize); + bh = udf_tread(inode->i_sb, block, inode->i_sb->s_blocksize); + } ea = bh->b_data + udf_ext0_offset(inode); eoffset = inode->i_sb->s_blocksize - udf_ext0_offset(inode); @@ -1042,7 +1073,7 @@ lvhd->uniqueID = cpu_to_le64(uniqueID); mark_buffer_dirty(UDF_SB_LVIDBH(inode->i_sb)); } - udf_write_fi(&cfi, fi, &fibh, NULL, NULL); + udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); if (UDF_I_ALLOCTYPE(dir) == ICB_FLAG_AD_IN_ICB) { mark_inode_dirty(dir); @@ -1095,7 +1126,7 @@ lvhd->uniqueID = cpu_to_le64(uniqueID); mark_buffer_dirty(UDF_SB_LVIDBH(inode->i_sb)); } - udf_write_fi(&cfi, fi, &fibh, NULL, NULL); + udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); if (UDF_I_ALLOCTYPE(dir) == ICB_FLAG_AD_IN_ICB) { mark_inode_dirty(dir); @@ -1126,7 +1157,12 @@ int retval = -ENOENT; old_inode = old_dentry->d_inode; - ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi); + if ((ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi))) + { + if (ofibh.sbh != ofibh.ebh) + udf_release_data(ofibh.ebh); + udf_release_data(ofibh.sbh); + } if (!ofi || udf_get_lb_pblock(old_dir->i_sb, lelb_to_cpu(ocfi.icb.extLocation), 0) != old_inode->i_ino) { @@ -1197,9 +1233,11 @@ ncfi.fileVersionNum = ocfi.fileVersionNum; ncfi.fileCharacteristics = ocfi.fileCharacteristics; memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(long_ad)); - udf_write_fi(&ncfi, nfi, &nfibh, NULL, NULL); + udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL); - udf_delete_entry(ofi, &ofibh, &ocfi); + /* The old fid may have moved - find it again */ + ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi); + udf_delete_entry(old_dir, ofi, &ofibh, &ocfi); old_dir->i_version = ++event; if (new_inode) @@ -1216,15 +1254,15 @@ if (dir_bh) { dir_fi->icb.extLocation = lelb_to_cpu(UDF_I_LOCATION(new_dir)); - udf_update_tag((char *)dir_fi, sizeof(struct FileIdentDesc) + - cpu_to_le16(dir_fi->lengthOfImpUse)); + udf_update_tag((char *)dir_fi, (sizeof(struct FileIdentDesc) + + cpu_to_le16(dir_fi->lengthOfImpUse) + 3) & ~3); if (UDF_I_ALLOCTYPE(old_inode) == ICB_FLAG_AD_IN_ICB) { mark_inode_dirty(old_inode); old_inode->i_version = ++event; } else - mark_buffer_dirty(dir_bh); + mark_buffer_dirty_inode(dir_bh, old_inode); old_dir->i_nlink --; mark_inode_dirty(old_dir); if (new_inode) @@ -1239,16 +1277,17 @@ } } - retval = 0; - -end_rename: - udf_release_data(dir_bh); if (ofi) { if (ofibh.sbh != ofibh.ebh) udf_release_data(ofibh.ebh); udf_release_data(ofibh.sbh); } + + retval = 0; + +end_rename: + udf_release_data(dir_bh); if (nfi) { if (nfibh.sbh != nfibh.ebh) diff -u --recursive --new-file v2.4.5/linux/fs/udf/partition.c linux/fs/udf/partition.c --- v2.4.5/linux/fs/udf/partition.c Fri Apr 13 20:26:07 2001 +++ linux/fs/udf/partition.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -74,7 +74,7 @@ index = UDF_SB_TYPEVIRT(sb,partition).s_start_offset / sizeof(Uint32) + block; } - loc = udf_locked_block_map(UDF_SB_VAT(sb), newblock); + loc = udf_block_map(UDF_SB_VAT(sb), newblock); if (!(bh = bread(sb->s_dev, loc, sb->s_blocksize))) { @@ -103,135 +103,123 @@ Uint32 udf_get_pblock_spar15(struct super_block *sb, Uint32 block, Uint16 partition, Uint32 offset) { - Uint32 packet = (block + offset) >> UDF_SB_TYPESPAR(sb,partition).s_spar_pshift; - Uint32 index = 0; - - if (UDF_SB_TYPESPAR(sb,partition).s_spar_indexsize == 8) - index = UDF_SB_TYPESPAR(sb,partition).s_spar_remap.s_spar_remap8[packet]; - else if (UDF_SB_TYPESPAR(sb,partition).s_spar_indexsize == 16) - index = UDF_SB_TYPESPAR(sb,partition).s_spar_remap.s_spar_remap16[packet]; - else if (UDF_SB_TYPESPAR(sb,partition).s_spar_indexsize == 32) - index = UDF_SB_TYPESPAR(sb,partition).s_spar_remap.s_spar_remap32[packet]; - - if (index == ((1 << UDF_SB_TYPESPAR(sb,partition).s_spar_indexsize)-1)) - return UDF_SB_PARTROOT(sb,partition) + block + offset; - - packet = UDF_SB_TYPESPAR(sb,partition).s_spar_map[index]; - return packet + ((block + offset) & ((1 << UDF_SB_TYPESPAR(sb,partition).s_spar_pshift)-1)); -} - -void udf_fill_spartable(struct super_block *sb, struct udf_sparing_data *sdata, int partlen) -{ - Uint16 ident; - Uint32 spartable; int i; - struct buffer_head *bh; - struct SparingTable *st; + struct SparingTable *st = NULL; + Uint32 packet = (block + offset) & ~(UDF_SB_TYPESPAR(sb,partition).s_packet_len - 1); for (i=0; i<4; i++) { - if (!(spartable = sdata->s_spar_loc[i])) - continue; - - bh = udf_read_tagged(sb, spartable, spartable, &ident); - - if (!bh) + if (UDF_SB_TYPESPAR(sb,partition).s_spar_map[i] != NULL) { - sdata->s_spar_loc[i] = 0; - continue; + st = (struct SparingTable *)UDF_SB_TYPESPAR(sb,partition).s_spar_map[i]->b_data; + break; } + } - if (ident == 0) + if (st) + { + for (i=0; ireallocationTableLen; i++) { - st = (struct SparingTable *)bh->b_data; - if (!strncmp(st->sparingIdent.ident, UDF_ID_SPARING, strlen(UDF_ID_SPARING))) + if (le32_to_cpu(st->mapEntry[i].origLocation) >= 0xFFFFFFF0) + break; + else if (le32_to_cpu(st->mapEntry[i].origLocation) == packet) { - SparingEntry *se; - Uint16 rtl = le16_to_cpu(st->reallocationTableLen); - int index; + return le32_to_cpu(st->mapEntry[i].mappedLocation) + + ((block + offset) & (UDF_SB_TYPESPAR(sb,partition).s_packet_len - 1)); + } + else if (le32_to_cpu(st->mapEntry[i].origLocation) > packet) + break; + } + } + return UDF_SB_PARTROOT(sb,partition) + block + offset; +} - if (!sdata->s_spar_map) +int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) +{ + struct udf_sparing_data *sdata; + struct SparingTable *st = NULL; + SparingEntry mapEntry; + Uint32 packet; + int i, j, k, l; + + for (i=0; i UDF_SB_PARTROOT(sb,i) && + old_block < UDF_SB_PARTROOT(sb,i) + UDF_SB_PARTLEN(sb,i)) + { + sdata = &UDF_SB_TYPESPAR(sb,i); + packet = (old_block - UDF_SB_PARTROOT(sb,i)) & ~(sdata->s_packet_len - 1); + + for (j=0; j<4; j++) + { + if (UDF_SB_TYPESPAR(sb,i).s_spar_map[j] != NULL) { - int num = 1, mapsize; - sdata->s_spar_indexsize = 8; - while (rtl*sizeof(Uint32) >= (1 << sdata->s_spar_indexsize)) - { - num ++; - sdata->s_spar_indexsize <<= 1; - } - mapsize = (rtl * sizeof(Uint32)) + - ((partlen/(1 << sdata->s_spar_pshift)) * sizeof(Uint8) * num); - sdata->s_spar_map = kmalloc(mapsize, GFP_KERNEL); - if (!sdata->s_spar_map) { - printk("couldnt allocate UDF s_spar_map!\n"); - return; - } - sdata->s_spar_remap.s_spar_remap32 = &sdata->s_spar_map[rtl]; - memset(sdata->s_spar_map, 0xFF, mapsize); + st = (struct SparingTable *)sdata->s_spar_map[j]->b_data; + break; } + } + + if (!st) + return 1; - index = sizeof(struct SparingTable); - for (i=0; ireallocationTableLen; k++) + { + if (le32_to_cpu(st->mapEntry[k].origLocation) == 0xFFFFFFFF) { - if (index > sb->s_blocksize) + for (; j<4; j++) { - udf_release_data(bh); - bh = udf_tread(sb, ++spartable, sb->s_blocksize); - if (!bh) + if (sdata->s_spar_map[j]) { - sdata->s_spar_loc[i] = 0; - continue; + st = (struct SparingTable *)sdata->s_spar_map[j]->b_data; + st->mapEntry[k].origLocation = cpu_to_le32(packet); + udf_update_tag((char *)st, sizeof(struct SparingTable) + st->reallocationTableLen * sizeof(SparingEntry)); + mark_buffer_dirty(sdata->s_spar_map[j]); } - index = 0; } - se = (SparingEntry *)&(bh->b_data[index]); - index += sizeof(SparingEntry); - - if (sdata->s_spar_map[i] == 0xFFFFFFFF) - sdata->s_spar_map[i] = le32_to_cpu(se->mappedLocation); - else if (sdata->s_spar_map[i] != le32_to_cpu(se->mappedLocation)) - { - udf_debug("Found conflicting Sparing Data (%d vs %d for entry %d)\n", - sdata->s_spar_map[i], le32_to_cpu(se->mappedLocation), i); - } - - if (le32_to_cpu(se->origLocation) < 0xFFFFFFF0) + *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + + ((old_block - UDF_SB_PARTROOT(sb,i)) & (sdata->s_packet_len - 1)); + return 0; + } + else if (le32_to_cpu(st->mapEntry[k].origLocation) == packet) + { + *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + + ((old_block - UDF_SB_PARTROOT(sb,i)) & (sdata->s_packet_len - 1)); + return 0; + } + else if (le32_to_cpu(st->mapEntry[k].origLocation) > packet) + break; + } + for (l=k; lreallocationTableLen; l++) + { + if (le32_to_cpu(st->mapEntry[l].origLocation) == 0xFFFFFFFF) + { + for (; j<4; j++) { - int packet = le32_to_cpu(se->origLocation) >> sdata->s_spar_pshift; - if (sdata->s_spar_indexsize == 8) - { - if (sdata->s_spar_remap.s_spar_remap8[packet] == 0xFF) - sdata->s_spar_remap.s_spar_remap8[packet] = i; - else if (sdata->s_spar_remap.s_spar_remap8[packet] != i) - { - udf_debug("Found conflicting Sparing Data (%d vs %d)\n", - sdata->s_spar_remap.s_spar_remap8[packet], i); - } - } - else if (sdata->s_spar_indexsize == 16) + if (sdata->s_spar_map[j]) { - if (sdata->s_spar_remap.s_spar_remap16[packet] == 0xFFFF) - sdata->s_spar_remap.s_spar_remap16[packet] = i; - else if (sdata->s_spar_remap.s_spar_remap16[packet] != i) - { - udf_debug("Found conflicting Sparing Data (%d vs %d)\n", - sdata->s_spar_remap.s_spar_remap16[packet], i); - } - } - else if (sdata->s_spar_indexsize == 32) - { - if (sdata->s_spar_remap.s_spar_remap32[packet] == 0xFFFFFFFF) - sdata->s_spar_remap.s_spar_remap32[packet] = i; - else if (sdata->s_spar_remap.s_spar_remap32[packet] != i) - { - udf_debug("Found conflicting Sparing Data (%d vs %d)\n", - sdata->s_spar_remap.s_spar_remap32[packet], i); - } + st = (struct SparingTable *)sdata->s_spar_map[j]->b_data; + mapEntry = st->mapEntry[l]; + mapEntry.origLocation = cpu_to_le32(packet); + memmove(&st->mapEntry[k+1], &st->mapEntry[k], (l-k)*sizeof(SparingEntry)); + st->mapEntry[k] = mapEntry; + udf_update_tag((char *)st, sizeof(struct SparingTable) + st->reallocationTableLen * sizeof(SparingEntry)); + mark_buffer_dirty(sdata->s_spar_map[j]); } } + *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + + ((old_block - UDF_SB_PARTROOT(sb,i)) & (sdata->s_packet_len - 1)); + return 0; } } + return 1; } - udf_release_data(bh); } + if (i == UDF_SB_NUMPARTS(sb)) + { + /* outside of partitions */ + /* for now, fail =) */ + return 1; + } + + return 0; } diff -u --recursive --new-file v2.4.5/linux/fs/udf/super.c linux/fs/udf/super.c --- v2.4.5/linux/fs/udf/super.c Mon Apr 23 10:00:21 2001 +++ linux/fs/udf/super.c Wed Jun 6 10:24:10 2001 @@ -17,7 +17,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -71,7 +71,7 @@ #define VDS_POS_IMP_USE_VOL_DESC 4 #define VDS_POS_VOL_DESC_PTR 5 #define VDS_POS_TERMINATING_DESC 6 -#define VDS_POS_LENGTH 7 +#define VDS_POS_LENGTH 7 static char error_buf[1024]; @@ -125,6 +125,7 @@ mode_t umask; gid_t gid; uid_t uid; + struct nls_table *nls_map; }; static int __init init_udf_fs(void) @@ -139,6 +140,8 @@ unregister_filesystem(&udf_fstype); } +EXPORT_NO_SYMBOLS; + module_init(init_udf_fs) module_exit(exit_udf_fs) @@ -161,7 +164,8 @@ * noadinicb Don't embed data in the inode * shortad Use short ad's * longad Use long ad's (default) - * strict Set strict conformance (unused) + * strict Set strict conformance + * iocharset= Set the NLS character set * * The remaining are for debugging and disaster recovery: * @@ -209,6 +213,7 @@ uopt->volume = 0xFFFFFFFF; uopt->rootdir = 0xFFFFFFFF; uopt->fileset = 0xFFFFFFFF; + uopt->nls_map = NULL; if (!options) return 1; @@ -257,6 +262,15 @@ uopt->fileset = simple_strtoul(val, NULL, 0); else if (!strcmp(opt, "rootdir") && val) uopt->rootdir = simple_strtoul(val, NULL, 0); +#ifdef CONFIG_NLS + else if (!strcmp(opt, "iocharset") && val) + { + uopt->nls_map = load_nls(val); + uopt->flags |= (1 << UDF_FLAG_NLS_MAP); + } +#endif + else if (!strcmp(opt, "utf8") && !val) + uopt->flags |= (1 << UDF_FLAG_UTF8); else if (val) { printk(KERN_ERR "udf: bad mount option \"%s=%s\"\n", @@ -280,7 +294,7 @@ udf_open_lvid(sb); sb->s_dirt = 0; } - + static int udf_remount_fs(struct super_block *sb, int *flags, char *options) { @@ -299,7 +313,7 @@ UDF_SB(sb)->s_gid = uopt.gid; UDF_SB(sb)->s_umask = uopt.umask; -#if CONFIG_UDF_RW != 1 +#if UDFFS_RW != 1 *flags |= MS_RDONLY; #endif @@ -344,12 +358,14 @@ udf_set_blocksize(struct super_block *sb, int bsize) { /* Use specified block size if specified */ - sb->s_blocksize = get_hardsect_size(sb->s_dev); - if (bsize > sb->s_blocksize) + if (bsize) sb->s_blocksize = bsize; + if (get_hardsect_size(sb->s_dev) > sb->s_blocksize) + sb->s_blocksize = get_hardsect_size(sb->s_dev); /* Block size must be an even multiple of 512 */ - switch (sb->s_blocksize) { + switch (sb->s_blocksize) + { case 512: sb->s_blocksize_bits = 9; break; case 1024: sb->s_blocksize_bits = 10; break; case 2048: sb->s_blocksize_bits = 11; break; @@ -373,6 +389,7 @@ { struct VolStructDesc *vsd = NULL; int sector = 32768; + int sectorsize; struct buffer_head *bh = NULL; int iso9660=0; int nsr02=0; @@ -380,14 +397,19 @@ /* Block size must be a multiple of 512 */ if (sb->s_blocksize & 511) - return sector; + return 0; + + if (sb->s_blocksize < sizeof(struct VolStructDesc)) + sectorsize = sizeof(struct VolStructDesc); + else + sectorsize = sb->s_blocksize; sector += (UDF_SB_SESSION(sb) << sb->s_blocksize_bits); udf_debug("Starting at sector %u (%ld byte sectors)\n", (sector >> sb->s_blocksize_bits), sb->s_blocksize); /* Process the sequence (if applicable) */ - for (;!nsr02 && !nsr03; sector += 2048) + for (;!nsr02 && !nsr03; sector += sectorsize) { /* Read a block */ bh = udf_tread(sb, sector >> sb->s_blocksize_bits, sb->s_blocksize); @@ -479,9 +501,9 @@ { int varlastblock = udf_variable_to_fixed(lastblock); int last[] = { lastblock, lastblock - 2, - lastblock - 150, lastblock - 152, - varlastblock, varlastblock - 2, - varlastblock - 150, varlastblock - 152 }; + lastblock - 150, lastblock - 152, + varlastblock, varlastblock - 2, + varlastblock - 150, varlastblock - 152 }; struct buffer_head *bh = NULL; Uint16 ident; Uint32 location; @@ -504,7 +526,7 @@ for (i=0; (!lastblock && is_dev, last[i], sb->s_blocksize))) + if (last[i] < 0 || !(bh = bread(sb->s_dev, last[i], sb->s_blocksize))) { ident = location = 0; } @@ -777,7 +799,7 @@ struct PartitionDesc *p; int i; - p=(struct PartitionDesc *)bh->b_data; + p = (struct PartitionDesc *)bh->b_data; for (i=0; ipartitionLength); /* blocks */ UDF_SB_PARTROOT(sb,i) = le32_to_cpu(p->partitionStartingLocation) + UDF_SB_SESSION(sb); - if (UDF_SB_PARTTYPE(sb,i) == UDF_SPARABLE_MAP15) - udf_fill_spartable(sb, &UDF_SB_TYPESPAR(sb,i), UDF_SB_PARTLEN(sb,i)); - if (!strcmp(p->partitionContents.ident, PARTITION_CONTENTS_NSR02) || !strcmp(p->partitionContents.ident, PARTITION_CONTENTS_NSR03)) { @@ -798,26 +817,54 @@ phd = (struct PartitionHeaderDesc *)(p->partitionContentsUse); if (phd->unallocatedSpaceTable.extLength) - udf_debug("unallocatedSpaceTable (part %d)\n", i); + { + lb_addr loc = { le32_to_cpu(phd->unallocatedSpaceTable.extPosition), i }; + + UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table = + udf_iget(sb, loc); + UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_TABLE; + udf_debug("unallocatedSpaceTable (part %d) @ %ld\n", + i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table->i_ino); + } if (phd->unallocatedSpaceBitmap.extLength) { - UDF_SB_PARTMAPS(sb)[i].s_uspace.bitmap = - le32_to_cpu(phd->unallocatedSpaceBitmap.extPosition); - UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_BITMAP; - udf_debug("unallocatedSpaceBitmap (part %d) @ %d\n", - i, UDF_SB_PARTMAPS(sb)[i].s_uspace.bitmap); + UDF_SB_ALLOC_BITMAP(sb, i, s_uspace); + if (UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap != NULL) + { + UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extLength = + le32_to_cpu(phd->unallocatedSpaceBitmap.extLength); + UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition = + le32_to_cpu(phd->unallocatedSpaceBitmap.extPosition); + UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_BITMAP; + udf_debug("unallocatedSpaceBitmap (part %d) @ %d\n", + i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition); + } } if (phd->partitionIntegrityTable.extLength) udf_debug("partitionIntegrityTable (part %d)\n", i); if (phd->freedSpaceTable.extLength) - udf_debug("freedSpaceTable (part %d)\n", i); + { + lb_addr loc = { le32_to_cpu(phd->freedSpaceTable.extPosition), i }; + + UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table = + udf_iget(sb, loc); + UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_TABLE; + udf_debug("freedSpaceTable (part %d) @ %ld\n", + i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table->i_ino); + } if (phd->freedSpaceBitmap.extLength) { - UDF_SB_PARTMAPS(sb)[i].s_fspace.bitmap = - le32_to_cpu(phd->freedSpaceBitmap.extPosition); - UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_BITMAP; - udf_debug("freedSpaceBitmap (part %d) @ %d\n", - i, UDF_SB_PARTMAPS(sb)[i].s_fspace.bitmap); + UDF_SB_ALLOC_BITMAP(sb, i, s_fspace); + if (UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap != NULL) + { + UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extLength = + le32_to_cpu(phd->freedSpaceBitmap.extLength); + UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition = + le32_to_cpu(phd->freedSpaceBitmap.extPosition); + UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_BITMAP; + udf_debug("freedSpaceBitmap (part %d) @ %d\n", + i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition); + } } } break; @@ -844,15 +891,13 @@ lvd = (struct LogicalVolDesc *)bh->b_data; - UDF_SB_NUMPARTS(sb) = le32_to_cpu(lvd->numPartitionMaps); - UDF_SB_ALLOC_PARTMAPS(sb, UDF_SB_NUMPARTS(sb)); + UDF_SB_ALLOC_PARTMAPS(sb, le32_to_cpu(lvd->numPartitionMaps)); for (i=0,offset=0; imapTableLength); i++,offset+=((struct GenericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapLength) { type = ((struct GenericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapType; - udf_debug("Partition (%d) type %d\n", i, type); if (type == 1) { struct GenericPartitionMap1 *gpm1 = (struct GenericPartitionMap1 *)&(lvd->partitionMaps[offset]); @@ -879,16 +924,29 @@ } else if (!strncmp(upm2->partIdent.ident, UDF_ID_SPARABLE, strlen(UDF_ID_SPARABLE))) { - int plen; - + Uint32 loc; + Uint16 ident; + struct SparingTable *st; struct SparablePartitionMap *spm = (struct SparablePartitionMap *)&(lvd->partitionMaps[offset]); + UDF_SB_PARTTYPE(sb,i) = UDF_SPARABLE_MAP15; - plen = le16_to_cpu(spm->packetLength); - UDF_SB_TYPESPAR(sb,i).s_spar_pshift = 0; - while (plen >>= 1) - UDF_SB_TYPESPAR(sb,i).s_spar_pshift ++; + UDF_SB_TYPESPAR(sb,i).s_packet_len = le16_to_cpu(spm->packetLength); for (j=0; jnumSparingTables; j++) - UDF_SB_TYPESPAR(sb,i).s_spar_loc[j] = le32_to_cpu(spm->locSparingTable[j]); + { + loc = le32_to_cpu(spm->locSparingTable[j]); + UDF_SB_TYPESPAR(sb,i).s_spar_map[j] = + udf_read_tagged(sb, loc, loc, &ident); + if (UDF_SB_TYPESPAR(sb,i).s_spar_map[j] != NULL) + { + st = (struct SparingTable *)UDF_SB_TYPESPAR(sb,i).s_spar_map[j]->b_data; + if (ident != 0 || + strncmp(st->sparingIdent.ident, UDF_ID_SPARING, strlen(UDF_ID_SPARING))) + { + udf_release_data(UDF_SB_TYPESPAR(sb,i).s_spar_map[j]); + UDF_SB_TYPESPAR(sb,i).s_spar_map[j] = NULL; + } + } + } UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_spar15; } else @@ -899,6 +957,8 @@ UDF_SB_PARTVSN(sb,i) = le16_to_cpu(upm2->volSeqNum); UDF_SB_PARTNUM(sb,i) = le16_to_cpu(upm2->partitionNum); } + udf_debug("Partition (%d:%d) type %d on volume %d\n", + i, UDF_SB_PARTNUM(sb,i), type, UDF_SB_PARTVSN(sb,i)); } if (fileset) @@ -963,10 +1023,12 @@ struct buffer_head *bh = NULL; struct udf_vds_record vds[VDS_POS_LENGTH]; struct GenericDesc *gd; + struct VolDescPtr *vdp; int done=0; int i,j; Uint32 vdsn; Uint16 ident; + long next_s = 0, next_e = 0; memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH); @@ -995,6 +1057,12 @@ { vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum = vdsn; vds[VDS_POS_VOL_DESC_PTR].block = block; + + vdp = (struct VolDescPtr *)bh->b_data; + next_s = le32_to_cpu(vdp->nextVolDescSeqExt.extLocation); + next_e = le32_to_cpu(vdp->nextVolDescSeqExt.extLength); + next_e = next_e >> sb->s_blocksize_bits; + next_e += next_s; } break; case TID_IMP_USE_VOL_DESC: /* ISO 13346 3/10.4 */ @@ -1024,7 +1092,14 @@ break; case TID_TERMINATING_DESC: /* ISO 13346 3/10.9 */ vds[VDS_POS_TERMINATING_DESC].block = block; - done = 1; + if (next_e) + { + block = next_s; + lastblock = next_e; + next_s = next_e = 0; + } + else + done = 1; break; } udf_release_data(bh); @@ -1098,7 +1173,7 @@ for (i=0; ib_data; @@ -1155,10 +1230,10 @@ UDF_SB_PARTVSN(sb,i) == UDF_SB_PARTVSN(sb,j) && UDF_SB_PARTNUM(sb,i) == UDF_SB_PARTNUM(sb,j)) { - ino.partitionReferenceNum = j; - ino.logicalBlockNum = UDF_SB_LASTBLOCK(sb) - - UDF_SB_PARTROOT(sb,j); - break; + ino.partitionReferenceNum = j; + ino.logicalBlockNum = UDF_SB_LASTBLOCK(sb) - + UDF_SB_PARTROOT(sb,j); + break; } } @@ -1219,7 +1294,6 @@ ((Uint8 *)&(UDF_SB_LVID(sb)->descTag))[i]; mark_buffer_dirty(UDF_SB_LVIDBH(sb)); - sb->s_dirt = 0; } } @@ -1276,10 +1350,10 @@ static struct super_block * udf_read_super(struct super_block *sb, void *options, int silent) { + int i; struct inode *inode=NULL; struct udf_options uopt; lb_addr rootdir, fileset; - int i; uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB); uopt.uid = -1; @@ -1288,13 +1362,33 @@ memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info)); -#if CONFIG_UDF_RW != 1 +#if UDFFS_RW != 1 sb->s_flags |= MS_RDONLY; #endif if (!udf_parse_options((char *)options, &uopt)) goto error_out; + if (uopt.flags & (1 << UDF_FLAG_UTF8) && + uopt.flags & (1 << UDF_FLAG_NLS_MAP)) + { + udf_error(sb, "udf_read_super", + "utf8 cannot be combined with iocharset\n"); + goto error_out; + } +#ifdef CONFIG_NLS + if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map) + { + uopt.nls_map = load_nls_default(); + if (!uopt.nls_map) + uopt.flags &= ~(1 << UDF_FLAG_NLS_MAP); + else + udf_debug("Using default NLS map\n"); + } +#endif + if (!(uopt.flags & (1 << UDF_FLAG_NLS_MAP))) + uopt.flags |= (1 << UDF_FLAG_UTF8); + fileset.logicalBlockNum = 0xFFFFFFFF; fileset.partitionReferenceNum = 0xFFFF; @@ -1302,6 +1396,7 @@ UDF_SB(sb)->s_uid = uopt.uid; UDF_SB(sb)->s_gid = uopt.gid; UDF_SB(sb)->s_umask = uopt.umask; + UDF_SB(sb)->s_nls_map = uopt.nls_map; /* Set the block size for all transfers */ if (!udf_set_blocksize(sb, uopt.blocksize)) @@ -1335,13 +1430,6 @@ sb->s_dirt = 0; sb->s_magic = UDF_SUPER_MAGIC; - for (i=0; is_flags |= MS_RDONLY; } + UDF_SB_UDFREV(sb) = minUDFWriteRev; + if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE) UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE); if (minUDFReadRev >= UDF_VERS_USE_STREAMS) @@ -1387,8 +1477,8 @@ { timestamp ts; udf_time_to_stamp(&ts, UDF_SB_RECORDTIME(sb), 0); - udf_info("UDF %s (%s) Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n", - UDFFS_VERSION, UDFFS_DATE, + udf_info("UDF %s-%s (%s) Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n", + UDFFS_VERSION, UDFFS_RW ? "rw" : "ro", UDFFS_DATE, UDF_SB_VOLIDENT(sb), ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.typeAndTimezone); } @@ -1420,6 +1510,40 @@ error_out: if (UDF_SB_VAT(sb)) iput(UDF_SB_VAT(sb)); + if (UDF_SB_NUMPARTS(sb)) + { + if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) + iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); + if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) + iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); + if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) + { + for (i=0; is_nls_map); +#endif if (!(sb->s_flags & MS_RDONLY)) udf_close_lvid(sb); udf_release_data(UDF_SB_LVIDBH(sb)); @@ -1476,11 +1600,43 @@ if (UDF_SB_VAT(sb)) iput(UDF_SB_VAT(sb)); + if (UDF_SB_NUMPARTS(sb)) + { + if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) + iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); + if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) + iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); + if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) + { + for (i=0; is_nls_map); +#endif if (!(sb->s_flags & MS_RDONLY)) udf_close_lvid(sb); udf_release_data(UDF_SB_LVIDBH(sb)); - for (i=0; is_extPosition; + loc.partitionReferenceNum = UDF_SB_PARTITION(sb); + bh = udf_read_ptagged(sb, loc, 0, &ident); - if (bitmap != 0xFFFFFFFF) + if (!bh) + { + printk(KERN_ERR "udf: udf_count_free failed\n"); + return 0; + } + else if (ident != TID_SPACE_BITMAP_DESC) { - struct SpaceBitmapDesc *bm; - int block = 0, newblock, index; - Uint16 ident; - Uint32 bytes; - Uint8 value; - Uint8 * ptr; - - loc.logicalBlockNum = bitmap; - loc.partitionReferenceNum = UDF_SB_PARTITION(sb); - bh = udf_read_ptagged(sb, loc, 0, &ident); + udf_release_data(bh); + printk(KERN_ERR "udf: udf_count_free failed\n"); + return 0; + } - if (!bh) - { - printk(KERN_ERR "udf: udf_count_free failed\n"); - return 0; + bm = (struct SpaceBitmapDesc *)bh->b_data; + bytes = bm->numOfBytes; + index = sizeof(struct SpaceBitmapDesc); /* offset in first block only */ + ptr = (Uint8 *)bh->b_data; + + while ( bytes > 0 ) + { + while ((bytes > 0) && (index < sb->s_blocksize)) + { + value = ptr[index]; + accum += udf_bitmap_lookup[ value & 0x0f ]; + accum += udf_bitmap_lookup[ value >> 4 ]; + index++; + bytes--; } - else if (ident != TID_SPACE_BITMAP_DESC) + if ( bytes ) { udf_release_data(bh); - printk(KERN_ERR "udf: udf_count_free failed\n"); - return 0; - } - - bm = (struct SpaceBitmapDesc *)bh->b_data; - bytes = bm->numOfBytes; - index = sizeof(struct SpaceBitmapDesc); /* offset in first block only */ - ptr = (Uint8 *)bh->b_data; - - while ( bytes > 0 ) - { - while ((bytes > 0) && (index < sb->s_blocksize)) - { - value = ptr[index]; - accum += udf_bitmap_lookup[ value & 0x0f ]; - accum += udf_bitmap_lookup[ value >> 4 ]; - index++; - bytes--; - } - if ( bytes ) + newblock = udf_get_lb_pblock(sb, loc, ++block); + bh = udf_tread(sb, newblock, sb->s_blocksize); + if (!bh) { - udf_release_data(bh); - newblock = udf_get_lb_pblock(sb, loc, ++block); - bh = udf_tread(sb, newblock, sb->s_blocksize); - if (!bh) - { - udf_debug("read failed\n"); - return accum; - } - index = 0; - ptr = (Uint8 *)bh->b_data; + udf_debug("read failed\n"); + return accum; } + index = 0; + ptr = (Uint8 *)bh->b_data; } - udf_release_data(bh); } - else + udf_release_data(bh); + return accum; +} + +static unsigned int +udf_count_free_table(struct super_block *sb, struct inode * table) +{ + unsigned int accum = 0; + Uint32 extoffset, elen; + lb_addr bloc, eloc; + char etype; + struct buffer_head *bh = NULL; + + bloc = UDF_I_LOCATION(table); + extoffset = sizeof(struct UnallocatedSpaceEntry); + + while ((etype = udf_next_aext(table, &bloc, &extoffset, &eloc, &elen, &bh, 1)) != -1) { - if (UDF_SB_LVIDBH(sb)) + accum += (elen >> table->i_sb->s_blocksize_bits); + } + udf_release_data(bh); + return accum; +} + +static unsigned int +udf_count_free(struct super_block *sb) +{ + unsigned int accum = 0; + + if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) + { + accum += udf_count_free_bitmap(sb, + UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_bitmap); + } + if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) + { + accum += udf_count_free_bitmap(sb, + UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_bitmap); + } + if (accum) + return accum; + + if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) + { + accum += udf_count_free_table(sb, + UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); + } + if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) + { + accum += udf_count_free_table(sb, + UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); + } + if (accum) + return accum; + + if (UDF_SB_LVIDBH(sb)) + { + if (le32_to_cpu(UDF_SB_LVID(sb)->numOfPartitions) > UDF_SB_PARTITION(sb)) { - if (le32_to_cpu(UDF_SB_LVID(sb)->numOfPartitions) > UDF_SB_PARTITION(sb)) - accum = le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]); + accum = le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]); if (accum == 0xFFFFFFFF) accum = 0; } } - return accum; } diff -u --recursive --new-file v2.4.5/linux/fs/udf/symlink.c linux/fs/udf/symlink.c --- v2.4.5/linux/fs/udf/symlink.c Fri Feb 9 11:29:44 2001 +++ linux/fs/udf/symlink.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -126,5 +126,5 @@ * symlinks can't do much... */ struct address_space_operations udf_symlink_aops = { - readpage: udf_symlink_filler, + readpage: udf_symlink_filler, }; diff -u --recursive --new-file v2.4.5/linux/fs/udf/truncate.c linux/fs/udf/truncate.c --- v2.4.5/linux/fs/udf/truncate.c Tue Sep 5 14:07:30 2000 +++ linux/fs/udf/truncate.c Wed Jun 6 10:24:10 2001 @@ -7,7 +7,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -33,7 +33,7 @@ #include "udf_sb.h" static void extent_trunc(struct inode * inode, lb_addr bloc, int extoffset, - lb_addr eloc, Uint8 etype, Uint32 elen, struct buffer_head **bh, Uint32 nelen) + lb_addr eloc, Uint8 etype, Uint32 elen, struct buffer_head *bh, Uint32 nelen) { lb_addr neloc = { 0, 0 }; int blocks = inode->i_sb->s_blocksize / 512; @@ -62,7 +62,7 @@ } } -void udf_trunc(struct inode * inode) +void udf_truncate_extents(struct inode * inode) { lb_addr bloc, eloc, neloc = { 0, 0 }; Uint32 extoffset, elen, offset, nelen = 0, lelen = 0, lenalloc; @@ -79,12 +79,11 @@ adsize = 0; etype = inode_bmap(inode, first_block, &bloc, &extoffset, &eloc, &elen, &offset, &bh); - offset = (offset << inode->i_sb->s_blocksize_bits) | - (inode->i_size & (inode->i_sb->s_blocksize - 1)); + offset += (inode->i_size & (inode->i_sb->s_blocksize - 1)); if (etype != -1) { extoffset -= adsize; - extent_trunc(inode, bloc, extoffset, eloc, etype, elen, &bh, offset); + extent_trunc(inode, bloc, extoffset, eloc, etype, elen, bh, offset); extoffset += adsize; if (offset) @@ -101,7 +100,7 @@ { if (etype == EXTENT_NEXT_EXTENT_ALLOCDECS) { - udf_write_aext(inode, bloc, &extoffset, neloc, nelen, &bh, 0); + udf_write_aext(inode, bloc, &extoffset, neloc, nelen, bh, 0); extoffset = 0; if (lelen) { @@ -122,9 +121,12 @@ { struct AllocExtDesc *aed = (struct AllocExtDesc *)(bh->b_data); aed->lengthAllocDescs = cpu_to_le32(lenalloc); - udf_update_tag(bh->b_data, lenalloc + - sizeof(struct AllocExtDesc)); - mark_buffer_dirty(bh); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) + udf_update_tag(bh->b_data, lenalloc + + sizeof(struct AllocExtDesc)); + else + udf_update_tag(bh->b_data, sizeof(struct AllocExtDesc)); + mark_buffer_dirty_inode(bh, inode); } } @@ -140,7 +142,7 @@ } else { - extent_trunc(inode, bloc, extoffset, eloc, etype, elen, &bh, 0); + extent_trunc(inode, bloc, extoffset, eloc, etype, elen, bh, 0); extoffset += adsize; } } @@ -164,9 +166,12 @@ { struct AllocExtDesc *aed = (struct AllocExtDesc *)(bh->b_data); aed->lengthAllocDescs = cpu_to_le32(lenalloc); - udf_update_tag(bh->b_data, lenalloc + - sizeof(struct AllocExtDesc)); - mark_buffer_dirty(bh); + if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) + udf_update_tag(bh->b_data, lenalloc + + sizeof(struct AllocExtDesc)); + else + udf_update_tag(bh->b_data, sizeof(struct AllocExtDesc)); + mark_buffer_dirty_inode(bh, inode); } } } @@ -180,7 +185,7 @@ { extoffset -= adsize; elen = (EXTENT_NOT_RECORDED_NOT_ALLOCATED << 30) | (elen + offset); - udf_write_aext(inode, bloc, &extoffset, eloc, elen, &bh, 0); + udf_write_aext(inode, bloc, &extoffset, eloc, elen, bh, 0); } else if (etype == EXTENT_NOT_RECORDED_ALLOCATED) { @@ -189,7 +194,7 @@ nelen = (EXTENT_NOT_RECORDED_NOT_ALLOCATED << 30) | ((elen + offset + inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize - 1)); - udf_write_aext(inode, bloc, &extoffset, neloc, nelen, &bh, 1); + udf_write_aext(inode, bloc, &extoffset, neloc, nelen, bh, 1); udf_add_aext(inode, &bloc, &extoffset, eloc, (etype << 30) | elen, &bh, 1); } else @@ -200,7 +205,7 @@ elen = (EXTENT_RECORDED_ALLOCATED << 30) | ((elen + inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize - 1)); - udf_write_aext(inode, bloc, &extoffset, eloc, elen, &bh, 1); + udf_write_aext(inode, bloc, &extoffset, eloc, elen, bh, 1); } memset(&eloc, 0x00, sizeof(lb_addr)); elen = (EXTENT_NOT_RECORDED_NOT_ALLOCATED << 30) | offset; @@ -208,40 +213,7 @@ } } } + UDF_I_LENEXTENTS(inode) = inode->i_size; udf_release_data(bh); -} - -void udf_truncate(struct inode * inode) -{ - int err; - - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - - if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_IN_ICB) - { - if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) + - inode->i_size)) - { - udf_expand_file_adinicb(inode, inode->i_size, &err); - if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_IN_ICB) - { - inode->i_size = UDF_I_LENALLOC(inode); - return; - } - else - udf_trunc(inode); - } - else - UDF_I_LENALLOC(inode) = inode->i_size; - } - else - udf_trunc(inode); - - inode->i_mtime = inode->i_ctime = CURRENT_TIME; - mark_inode_dirty(inode); } diff -u --recursive --new-file v2.4.5/linux/fs/udf/udf_i.h linux/fs/udf/udf_i.h --- v2.4.5/linux/fs/udf/udf_i.h Thu Mar 2 11:17:32 2000 +++ linux/fs/udf/udf_i.h Wed Jun 6 10:24:10 2001 @@ -6,6 +6,7 @@ #define UDF_I_LOCATION(X) ( UDF_I(X)->i_location ) #define UDF_I_LENEATTR(X) ( UDF_I(X)->i_lenEAttr ) #define UDF_I_LENALLOC(X) ( UDF_I(X)->i_lenAlloc ) +#define UDF_I_LENEXTENTS(X) ( UDF_I(X)->i_lenExtents ) #define UDF_I_UNIQUE(X) ( UDF_I(X)->i_unique ) #define UDF_I_ALLOCTYPE(X) ( UDF_I(X)->i_alloc_type ) #define UDF_I_EXTENDED_FE(X)( UDF_I(X)->i_extended_fe ) diff -u --recursive --new-file v2.4.5/linux/fs/udf/udf_sb.h linux/fs/udf/udf_sb.h --- v2.4.5/linux/fs/udf/udf_sb.h Mon Mar 20 08:17:43 2000 +++ linux/fs/udf/udf_sb.h Wed Jun 6 10:24:10 2001 @@ -1,11 +1,11 @@ #ifndef __LINUX_UDF_SB_H #define __LINUX_UDF_SB_H -/* Since UDF 1.50 is ISO 13346 based... */ -#define UDF_SUPER_MAGIC 0x15013346 +/* Since UDF 2.01 is ISO 13346 based... */ +#define UDF_SUPER_MAGIC 0x15013346 -#define UDF_MAX_READ_VERSION 0x0200 -#define UDF_MAX_WRITE_VERSION 0x0200 +#define UDF_MAX_READ_VERSION 0x0201 +#define UDF_MAX_WRITE_VERSION 0x0201 #define UDF_FLAG_USE_EXTENDED_FE 0 #define UDF_VERS_USE_EXTENDED_FE 0x0200 @@ -14,16 +14,18 @@ #define UDF_FLAG_USE_SHORT_AD 2 #define UDF_FLAG_USE_AD_IN_ICB 3 #define UDF_FLAG_USE_FILE_CTIME_EA 4 -#define UDF_FLAG_STRICT 5 -#define UDF_FLAG_UNDELETE 6 -#define UDF_FLAG_UNHIDE 7 -#define UDF_FLAG_VARCONV 8 - -#define UDF_PART_FLAG_UNALLOC_BITMAP 0x0001 -#define UDF_PART_FLAG_UNALLOC_TABLE 0x0002 -#define UDF_PART_FLAG_FREED_BITMAP 0x0004 -#define UDF_PART_FLAG_FREED_TABLE 0x0008 - +#define UDF_FLAG_STRICT 5 +#define UDF_FLAG_UNDELETE 6 +#define UDF_FLAG_UNHIDE 7 +#define UDF_FLAG_VARCONV 8 +#define UDF_FLAG_NLS_MAP 9 +#define UDF_FLAG_UTF8 10 + +#define UDF_PART_FLAG_UNALLOC_BITMAP 0x0001 +#define UDF_PART_FLAG_UNALLOC_TABLE 0x0002 +#define UDF_PART_FLAG_FREED_BITMAP 0x0004 +#define UDF_PART_FLAG_FREED_TABLE 0x0008 + #define UDF_SB_FREE(X)\ {\ if (UDF_SB(X))\ @@ -37,11 +39,41 @@ #define UDF_SB_ALLOC_PARTMAPS(X,Y)\ {\ - UDF_SB_NUMPARTS(X) = Y;\ UDF_SB_PARTMAPS(X) = kmalloc(sizeof(struct udf_part_map) * Y, GFP_KERNEL);\ - memset(UDF_SB_PARTMAPS(X), 0x00, sizeof(struct udf_part_map) * Y);\ + if (UDF_SB_PARTMAPS(X) != NULL)\ + {\ + UDF_SB_NUMPARTS(X) = Y;\ + memset(UDF_SB_PARTMAPS(X), 0x00, sizeof(struct udf_part_map) * Y);\ + }\ + else\ + {\ + UDF_SB_NUMPARTS(X) = 0;\ + udf_error(X, __FUNCTION__, "Unable to allocate space for %d partition maps", Y);\ + }\ } +#define UDF_SB_ALLOC_BITMAP(X,Y,Z)\ +{\ + int nr_groups = ((UDF_SB_PARTLEN((X),(Y)) + (sizeof(struct SpaceBitmapDesc) << 3) +\ + ((X)->s_blocksize * 8) - 1) / ((X)->s_blocksize * 8));\ + UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap = kmalloc(sizeof(struct udf_bitmap) +\ + sizeof(struct buffer_head *) * nr_groups,\ + GFP_KERNEL);\ + if (UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap != NULL)\ + {\ + memset(UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap, 0x00,\ + sizeof(struct udf_bitmap) + sizeof(struct buffer_head *) * nr_groups);\ + UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_block_bitmap =\ + (struct buffer_head **)(UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap + 1);\ + UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_nr_groups = nr_groups;\ + }\ + else\ + {\ + udf_error(X, __FUNCTION__, "Unable to allocate space for bitmap and %d buffer_head pointers", nr_groups);\ + }\ +} + + #define UDF_QUERY_FLAG(X,Y) ( UDF_SB(X)->s_flags & ( 1 << (Y) ) ) #define UDF_SET_FLAG(X,Y) ( UDF_SB(X)->s_flags |= ( 1 << (Y) ) ) #define UDF_CLEAR_FLAG(X,Y) ( UDF_SB(X)->s_flags &= ~( 1 << (Y) ) ) @@ -58,6 +90,8 @@ #define UDF_SB_TYPEVIRT(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_type_specific.s_virtual ) #define UDF_SB_PARTFUNC(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_partition_func ) #define UDF_SB_PARTFLAGS(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_partition_flags ) +#define UDF_SB_BITMAP(X,Y,Z,I) ( UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_block_bitmap[I] ) +#define UDF_SB_BITMAP_NR_GROUPS(X,Y,Z) ( UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_nr_groups ) #define UDF_SB_VOLIDENT(X) ( UDF_SB(X)->s_volident ) #define UDF_SB_NUMPARTS(X) ( UDF_SB(X)->s_partitions ) @@ -69,9 +103,6 @@ #define UDF_SB_LVID(X) ( (struct LogicalVolIntegrityDesc *)UDF_SB_LVIDBH(X)->b_data ) #define UDF_SB_LVIDIU(X) ( (struct LogicalVolIntegrityDescImpUse *)&(UDF_SB_LVID(X)->impUse[UDF_SB_LVID(X)->numOfPartitions * 2 * sizeof(Uint32)/sizeof(Uint8)]) ) -#define UDF_SB_LOADED_BLOCK_BITMAPS(X) ( UDF_SB(X)->s_loaded_block_bitmaps ) -#define UDF_SB_BLOCK_BITMAP_NUMBER(X,Y) ( UDF_SB(X)->s_block_bitmap_number[(Y)] ) -#define UDF_SB_BLOCK_BITMAP(X,Y) ( UDF_SB(X)->s_block_bitmap[(Y)] ) #define UDF_SB_UMASK(X) ( UDF_SB(X)->s_umask ) #define UDF_SB_GID(X) ( UDF_SB(X)->s_gid ) #define UDF_SB_UID(X) ( UDF_SB(X)->s_uid ) diff -u --recursive --new-file v2.4.5/linux/fs/udf/udfdecl.h linux/fs/udf/udfdecl.h --- v2.4.5/linux/fs/udf/udfdecl.h Mon Dec 11 13:27:05 2000 +++ linux/fs/udf/udfdecl.h Wed Jun 6 10:24:10 2001 @@ -12,14 +12,6 @@ #include #include -#ifndef LINUX_VERSION_CODE -#include -#endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,7) -#error "The UDF Module Current Requires Kernel Version 2.3.7 or greater" -#endif - #include #if !defined(CONFIG_UDF_FS) && !defined(CONFIG_UDF_FS_MODULE) @@ -119,7 +111,7 @@ extern void udf_warning(struct super_block *, const char *, const char *, ...); /* namei.c */ -extern int udf_write_fi(struct FileIdentDesc *, struct FileIdentDesc *, struct udf_fileident_bh *, Uint8 *, Uint8 *); +extern int udf_write_fi(struct inode *inode, struct FileIdentDesc *, struct FileIdentDesc *, struct udf_fileident_bh *, Uint8 *, Uint8 *); /* file.c */ extern int udf_ioctl(struct inode *, struct file *, unsigned int, unsigned long); @@ -131,15 +123,15 @@ extern struct buffer_head * udf_expand_dir_adinicb(struct inode *, int *, int *); extern struct buffer_head * udf_getblk(struct inode *, long, int, int *); extern struct buffer_head * udf_bread(struct inode *, int, int, int *); +extern void udf_truncate(struct inode *); extern void udf_read_inode(struct inode *); extern void udf_put_inode(struct inode *); extern void udf_delete_inode(struct inode *); extern void udf_write_inode(struct inode *, int); -extern long udf_locked_block_map(struct inode *, long); extern long udf_block_map(struct inode *, long); extern int inode_bmap(struct inode *, int, lb_addr *, Uint32 *, lb_addr *, Uint32 *, Uint32 *, struct buffer_head **); extern int udf_add_aext(struct inode *, lb_addr *, int *, lb_addr, Uint32, struct buffer_head **, int); -extern int udf_write_aext(struct inode *, lb_addr, int *, lb_addr, Uint32, struct buffer_head **, int); +extern int udf_write_aext(struct inode *, lb_addr, int *, lb_addr, Uint32, struct buffer_head *, int); extern int udf_insert_aext(struct inode *, lb_addr, int, lb_addr, Uint32, struct buffer_head *); extern int udf_delete_aext(struct inode *, lb_addr, int, lb_addr, Uint32, struct buffer_head *); extern int udf_next_aext(struct inode *, lb_addr *, int *, lb_addr *, Uint32 *, struct buffer_head **, int); @@ -148,6 +140,7 @@ /* misc.c */ extern int udf_read_tagged_data(char *, int size, int fd, int block, int partref); +extern struct buffer_head *udf_tgetblk(struct super_block *, int, int); extern struct buffer_head *udf_tread(struct super_block *, int, int); extern struct GenericAttrFormat *udf_add_extendedattr(struct inode *, Uint32, Uint32, Uint8, struct buffer_head **); extern struct GenericAttrFormat *udf_get_extendedattr(struct inode *, Uint32, Uint8, struct buffer_head **); @@ -165,18 +158,17 @@ extern Uint32 udf_get_pblock_virt15(struct super_block *, Uint32, Uint16, Uint32); extern Uint32 udf_get_pblock_virt20(struct super_block *, Uint32, Uint16, Uint32); extern Uint32 udf_get_pblock_spar15(struct super_block *, Uint32, Uint16, Uint32); -extern void udf_fill_spartable(struct super_block *, struct udf_sparing_data *, int); +extern int udf_relocate_blocks(struct super_block *, long, long *); /* unicode.c */ -extern int udf_get_filename(Uint8 *, Uint8 *, int); +extern int udf_get_filename(struct super_block *, Uint8 *, Uint8 *, int); /* ialloc.c */ extern void udf_free_inode(struct inode *); extern struct inode * udf_new_inode (const struct inode *, int, int *); /* truncate.c */ -extern void udf_trunc(struct inode *); -extern void udf_truncate(struct inode *); +extern void udf_truncate_extents(struct inode *); /* balloc.c */ extern void udf_free_blocks(const struct inode *, lb_addr, Uint32, Uint32); @@ -184,7 +176,8 @@ extern int udf_new_block(const struct inode *, Uint16, Uint32, int *); /* fsync.c */ -extern int udf_sync_file(struct file *, struct dentry *, int); +extern int udf_fsync_file(struct file *, struct dentry *, int); +extern int udf_fsync_inode(struct inode *, int); /* directory.c */ extern Uint8 * udf_filead_read(struct inode *, Uint8 *, Uint8, lb_addr, int *, int *, struct buffer_head **, int *); @@ -206,6 +199,10 @@ extern int udf_build_ustr_exact(struct ustr *, dstring *, int); extern int udf_CS0toUTF8(struct ustr *, struct ustr *); extern int udf_UTF8toCS0(dstring *, struct ustr *, int); +#ifdef __KERNEL__ +extern int udf_CS0toNLS(struct nls_table *, struct ustr *, struct ustr *); +extern int udf_NLStoCS0(struct nls_table *, dstring *, struct ustr *, int); +#endif /* crc.c */ extern Uint16 udf_crc(Uint8 *, Uint32, Uint16); diff -u --recursive --new-file v2.4.5/linux/fs/udf/udfend.h linux/fs/udf/udfend.h --- v2.4.5/linux/fs/udf/udfend.h Mon Dec 11 13:27:05 2000 +++ linux/fs/udf/udfend.h Wed Jun 6 10:24:10 2001 @@ -80,6 +80,22 @@ return out; } +static inline short_ad lesa_to_cpu(short_ad in) +{ + short_ad out; + out.extLength = le32_to_cpu(in.extLength); + out.extPosition = le32_to_cpu(in.extPosition); + return out; +} + +static inline short_ad cpu_to_lesa(short_ad in) +{ + short_ad out; + out.extLength = cpu_to_le32(in.extLength); + out.extPosition = cpu_to_le32(in.extPosition); + return out; +} + static inline long_ad lela_to_cpu(long_ad in) { long_ad out; diff -u --recursive --new-file v2.4.5/linux/fs/udf/udftime.c linux/fs/udf/udftime.c --- v2.4.5/linux/fs/udf/udftime.c Thu Mar 2 11:17:32 2000 +++ linux/fs/udf/udftime.c Wed Jun 6 10:24:10 2001 @@ -105,6 +105,8 @@ offset = src.typeAndTimezone << 4; /* sign extent offset */ offset = (offset >> 4); + if (offset == -2047) /* unspecified offset */ + offset = 0; } else offset = 0; diff -u --recursive --new-file v2.4.5/linux/fs/udf/unicode.c linux/fs/udf/unicode.c --- v2.4.5/linux/fs/udf/unicode.c Mon Mar 20 08:17:43 2000 +++ linux/fs/udf/unicode.c Wed Jun 6 10:24:10 2001 @@ -14,7 +14,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team's mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -27,7 +27,9 @@ #ifdef __KERNEL__ #include #include /* for memset */ +#include #include +#include "udf_sb.h" #else #include #endif @@ -127,7 +129,7 @@ } /* - * udf_ocu_to_udf8 + * udf_ocu_to_utf8 * * PURPOSE * Convert OSTA Compressed Unicode to the UTF-8 equivalent. @@ -327,7 +329,88 @@ } #ifdef __KERNEL__ -int udf_get_filename(Uint8 *sname, Uint8 *dname, int flen) +int udf_CS0toNLS(struct nls_table *nls, struct ustr *utf_o, struct ustr *ocu_i) +{ + Uint8 *ocu; + Uint32 c; + Uint8 cmp_id, ocu_len; + int i; + + ocu = ocu_i->u_name; + + ocu_len = ocu_i->u_len; + cmp_id = ocu_i->u_cmpID; + utf_o->u_len = 0; + + if (ocu_len == 0) + { + memset(utf_o, 0, sizeof(struct ustr)); + utf_o->u_cmpID = 0; + utf_o->u_len = 0; + return 0; + } + + if ((cmp_id != 8) && (cmp_id != 16)) + { + printk(KERN_ERR "udf: unknown compression code (%d) stri=%s\n", cmp_id, ocu_i->u_name); + return 0; + } + + for (i = 0; (i < ocu_len) && (utf_o->u_len <= (UDF_NAME_LEN-3)) ;) + { + /* Expand OSTA compressed Unicode to Unicode */ + c = ocu[i++]; + if (cmp_id == 16) + c = (c << 8) | ocu[i++]; + + utf_o->u_len += nls->uni2char(c, &utf_o->u_name[utf_o->u_len], + UDF_NAME_LEN - utf_o->u_len); + } + utf_o->u_cmpID=8; + utf_o->u_hash=0L; + utf_o->padding=0; + + return utf_o->u_len; +} + +int udf_NLStoCS0(struct nls_table *nls, dstring *ocu, struct ustr *uni, int length) +{ + unsigned len, i, max_val; + Uint16 uni_char; + int uni_cnt; + int u_len = 0; + + memset(ocu, 0, sizeof(dstring) * length); + ocu[0] = 8; + max_val = 0xffU; + +try_again: + uni_char = 0U; + uni_cnt = 0U; + for (i = 0U; i < uni->u_len; i++) + { + len = nls->char2uni(&uni->u_name[i], uni->u_len-i, &uni_char); + + if (len == 2 && max_val == 0xff) + { + max_val = 0xffffU; + ocu[0] = (Uint8)0x10U; + goto try_again; + } + + if (max_val == 0xffffU) + { + ocu[++u_len] = (Uint8)(uni_char >> 8); + i++; + } + ocu[++u_len] = (Uint8)(uni_char & 0xffU); + } + + ocu[length - 1] = (Uint8)u_len + 1; + return u_len + 1; +} + +int udf_get_filename(struct super_block *sb, Uint8 *sname, Uint8 *dname, int flen) { struct ustr filename, unifilename; int len; @@ -337,11 +420,24 @@ return 0; } - if (!udf_CS0toUTF8(&filename, &unifilename) ) + if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { - udf_debug("Failed in udf_get_filename: sname = %s\n", sname); - return 0; + if (!udf_CS0toUTF8(&filename, &unifilename) ) + { + udf_debug("Failed in udf_get_filename: sname = %s\n", sname); + return 0; + } + } + else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) + { + if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, &filename, &unifilename) ) + { + udf_debug("Failed in udf_get_filename: sname = %s\n", sname); + return 0; + } } + else + return 0; if ((len = udf_translate_to_linux(dname, filename.u_name, filename.u_len, unifilename.u_name, unifilename.u_len))) diff -u --recursive --new-file v2.4.5/linux/include/asm-alpha/hardirq.h linux/include/asm-alpha/hardirq.h --- v2.4.5/linux/include/asm-alpha/hardirq.h Fri Aug 4 16:15:37 2000 +++ linux/include/asm-alpha/hardirq.h Tue Jun 5 16:53:23 2001 @@ -6,8 +6,7 @@ /* entry.S is sensitive to the offsets of these fields */ typedef struct { - unsigned int __softirq_active; - unsigned int __softirq_mask; + unsigned long __softirq_pending; unsigned int __local_irq_count; unsigned int __local_bh_count; unsigned int __syscall_count; diff -u --recursive --new-file v2.4.5/linux/include/asm-alpha/linux_logo.h linux/include/asm-alpha/linux_logo.h --- v2.4.5/linux/include/asm-alpha/linux_logo.h Thu Oct 1 10:02:22 1998 +++ linux/include/asm-alpha/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -23,26 +23,5 @@ #define linux_logo_banner "Linux/AXP version " UTS_RELEASE -#define LINUX_LOGO_COLORS 214 - -#ifdef INCLUDE_LINUX_LOGO_DATA - -#define INCLUDE_LINUX_LOGOBW -#define INCLUDE_LINUX_LOGO16 - #include -#else - -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; -extern unsigned char linux_logo16[]; - -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-alpha/softirq.h linux/include/asm-alpha/softirq.h --- v2.4.5/linux/include/asm-alpha/softirq.h Sun Aug 6 12:42:21 2000 +++ linux/include/asm-alpha/softirq.h Tue Jun 5 16:53:23 2001 @@ -18,8 +18,11 @@ } #define local_bh_enable() cpu_bh_enable(smp_processor_id()) +#define __local_bh_enable local_bh_enable #define local_bh_disable() cpu_bh_disable(smp_processor_id()) #define in_softirq() (local_bh_count(smp_processor_id()) != 0) + +#define __cpu_raise_softirq(cpu,nr) set_bit((nr), &softirq_pending(cpu)) #endif /* _ALPHA_SOFTIRQ_H */ diff -u --recursive --new-file v2.4.5/linux/include/asm-alpha/termios.h linux/include/asm-alpha/termios.h --- v2.4.5/linux/include/asm-alpha/termios.h Sat Feb 3 20:00:45 2001 +++ linux/include/asm-alpha/termios.h Tue Jun 5 18:11:41 2001 @@ -82,6 +82,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ /* eof=^D eol=\0 eol2=\0 erase=del diff -u --recursive --new-file v2.4.5/linux/include/asm-arm/linux_logo.h linux/include/asm-arm/linux_logo.h --- v2.4.5/linux/include/asm-arm/linux_logo.h Thu Feb 8 16:32:44 2001 +++ linux/include/asm-arm/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -15,26 +15,5 @@ #define linux_logo_banner "ARM Linux version " UTS_RELEASE -#define LINUX_LOGO_COLORS 214 - -#ifdef INCLUDE_LINUX_LOGO_DATA - -#define INCLUDE_LINUX_LOGOBW -#define INCLUDE_LINUX_LOGO16 - #include -#else - -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16[]; -extern unsigned char *linux_serial_image; - -extern int (*console_show_logo)(void); - -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-arm/termios.h linux/include/asm-arm/termios.h --- v2.4.5/linux/include/asm-arm/termios.h Sat Feb 3 20:00:45 2001 +++ linux/include/asm-arm/termios.h Tue Jun 5 18:11:41 2001 @@ -65,6 +65,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-i386/hardirq.h linux/include/asm-i386/hardirq.h --- v2.4.5/linux/include/asm-i386/hardirq.h Fri Apr 27 15:48:24 2001 +++ linux/include/asm-i386/hardirq.h Fri Jun 8 14:03:27 2001 @@ -5,10 +5,9 @@ #include #include -/* entry.S is sensitive to the offsets of these fields */ +/* assembly code in softirq.h is sensitive to the offsets of these fields */ typedef struct { - unsigned int __softirq_active; - unsigned int __softirq_mask; + unsigned int __softirq_pending; unsigned int __local_irq_count; unsigned int __local_bh_count; unsigned int __syscall_count; diff -u --recursive --new-file v2.4.5/linux/include/asm-i386/linux_logo.h linux/include/asm-i386/linux_logo.h --- v2.4.5/linux/include/asm-i386/linux_logo.h Fri Apr 27 15:50:20 2001 +++ linux/include/asm-i386/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -23,26 +23,5 @@ #define linux_logo_banner "Linux/ia32 version " UTS_RELEASE -#define LINUX_LOGO_COLORS 214 - -#ifdef INCLUDE_LINUX_LOGO_DATA - -#define INCLUDE_LINUX_LOGOBW -#define INCLUDE_LINUX_LOGO16 - #include -#else - -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; -extern unsigned char linux_logo16[]; - -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-i386/softirq.h linux/include/asm-i386/softirq.h --- v2.4.5/linux/include/asm-i386/softirq.h Fri Apr 27 15:48:26 2001 +++ linux/include/asm-i386/softirq.h Fri Jun 8 14:03:27 2001 @@ -4,12 +4,46 @@ #include #include -#define cpu_bh_disable(cpu) do { local_bh_count(cpu)++; barrier(); } while (0) -#define cpu_bh_enable(cpu) do { barrier(); local_bh_count(cpu)--; } while (0) +#define __cpu_bh_enable(cpu) \ + do { barrier(); local_bh_count(cpu)--; } while (0) +#define cpu_bh_disable(cpu) \ + do { local_bh_count(cpu)++; barrier(); } while (0) #define local_bh_disable() cpu_bh_disable(smp_processor_id()) -#define local_bh_enable() cpu_bh_enable(smp_processor_id()) +#define __local_bh_enable() __cpu_bh_enable(smp_processor_id()) +#define __cpu_raise_softirq(cpu,nr) set_bit((nr), &softirq_pending(cpu)); +#define raise_softirq(nr) __cpu_raise_softirq(smp_processor_id(), (nr)) #define in_softirq() (local_bh_count(smp_processor_id()) != 0) + +/* + * NOTE: this assembly code assumes: + * + * (char *)&local_bh_count - 8 == (char *)&softirq_pending + * + * If you change the offsets in irq_stat then you have to + * update this code as well. + */ +#define local_bh_enable() \ +do { \ + unsigned int *ptr = &local_bh_count(smp_processor_id()); \ + \ + if (!--*ptr) \ + __asm__ __volatile__ ( \ + "cmpl $0, -8(%0);" \ + "jnz 2f;" \ + "1:;" \ + \ + ".section .text.lock,\"ax\";" \ + "2: pushl %%eax; pushl %%ecx; pushl %%edx;" \ + "call do_softirq;" \ + "popl %%edx; popl %%ecx; popl %%eax;" \ + "jmp 1b;" \ + ".previous;" \ + \ + : /* no output */ \ + : "r" (ptr) \ + /* no registers clobbered */ ); \ +} while (0) #endif /* __ASM_SOFTIRQ_H */ diff -u --recursive --new-file v2.4.5/linux/include/asm-i386/termios.h linux/include/asm-i386/termios.h --- v2.4.5/linux/include/asm-i386/termios.h Sat Feb 3 20:00:45 2001 +++ linux/include/asm-i386/termios.h Tue Jun 5 18:11:41 2001 @@ -55,6 +55,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 /* synchronous PPP */ +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-ia64/linux_logo.h linux/include/asm-ia64/linux_logo.h --- v2.4.5/linux/include/asm-ia64/linux_logo.h Sun Feb 6 18:42:40 2000 +++ linux/include/asm-ia64/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -24,26 +24,5 @@ #define linux_logo_banner "Linux/ia64 version " UTS_RELEASE -#define LINUX_LOGO_COLORS 214 - -#ifdef INCLUDE_LINUX_LOGO_DATA - -#define INCLUDE_LINUX_LOGOBW -#define INCLUDE_LINUX_LOGO16 - #include -#else - -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; -extern unsigned char linux_logo16[]; - -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-ia64/termios.h linux/include/asm-ia64/termios.h --- v2.4.5/linux/include/asm-ia64/termios.h Sat Feb 3 20:00:45 2001 +++ linux/include/asm-ia64/termios.h Tue Jun 5 18:11:41 2001 @@ -62,6 +62,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS msgs */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 /* synchronous PPP */ +#define N_HCI 15 /* Bluetooth HCI UART */ # ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/amigahw.h linux/include/asm-m68k/amigahw.h --- v2.4.5/linux/include/asm-m68k/amigahw.h Mon Nov 27 17:57:34 2000 +++ linux/include/asm-m68k/amigahw.h Tue Jun 5 18:27:20 2001 @@ -106,6 +106,7 @@ AMIGAHW_DECLARE(ALICE_NTSC); /* NTSC Alice (8374) */ AMIGAHW_DECLARE(MAGIC_REKICK); /* A3000 Magic Hard Rekick */ AMIGAHW_DECLARE(PCMCIA); /* PCMCIA Slot */ + AMIGAHW_DECLARE(GG2_ISA); /* GG2 Zorro2ISA Bridge */ AMIGAHW_DECLARE(ZORRO); /* Zorro AutoConfig */ AMIGAHW_DECLARE(ZORRO3); /* Zorro III */ }; diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/amigayle.h linux/include/asm-m68k/amigayle.h --- v2.4.5/linux/include/asm-m68k/amigayle.h Thu Jul 30 11:08:20 1998 +++ linux/include/asm-m68k/amigayle.h Tue Jun 5 18:27:20 2001 @@ -17,8 +17,8 @@ #ifndef _M68K_AMIGAYLE_H_ #define _M68K_AMIGAYLE_H_ +#include #include -#include /* memory layout */ @@ -59,11 +59,13 @@ #define gayle_attribute ((volatile u_char *)(GAYLE_ATTRIBUTE)) +#if 0 #define gayle_inb(a) readb( GAYLE_IO+(a)+(((a)&1)*GAYLE_ODD) ) #define gayle_outb(v,a) writeb( v, GAYLE_IO+(a)+(((a)&1)*GAYLE_ODD) ) #define gayle_inw(a) readw( GAYLE_IO+(a) ) #define gayle_outw(v,a) writew( v, GAYLE_IO+(a) ) +#endif /* GAYLE_CARDSTATUS bit def */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/bitops.h linux/include/asm-m68k/bitops.h --- v2.4.5/linux/include/asm-m68k/bitops.h Sat Feb 3 11:26:44 2001 +++ linux/include/asm-m68k/bitops.h Tue Jun 5 18:27:20 2001 @@ -19,23 +19,23 @@ __constant_test_and_set_bit(nr, vaddr) : \ __generic_test_and_set_bit(nr, vaddr)) -extern __inline__ int __constant_test_and_set_bit(int nr,void * vaddr) +extern __inline__ int __constant_test_and_set_bit(int nr,volatile void * vaddr) { char retval; - __asm__ __volatile__ ("bset %1,%2; sne %0" - : "=d" (retval) - : "di" (nr & 7), "m" (((char *)vaddr)[(nr^31) >> 3])); + __asm__ __volatile__ ("bset %2,%1; sne %0" + : "=d" (retval), "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) + : "di" (nr & 7)); return retval; } -extern __inline__ int __generic_test_and_set_bit(int nr,void * vaddr) +extern __inline__ int __generic_test_and_set_bit(int nr,volatile void * vaddr) { char retval; __asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^31), "a" (vaddr)); + : "=d" (retval) : "d" (nr^31), "a" (vaddr) : "memory"); return retval; } @@ -45,16 +45,16 @@ __constant_set_bit(nr, vaddr) : \ __generic_set_bit(nr, vaddr)) -extern __inline__ void __constant_set_bit(int nr, void * vaddr) +extern __inline__ void __constant_set_bit(int nr, volatile void * vaddr) { - __asm__ __volatile__ ("bset %0,%1" - : : "di" (nr & 7), "m" (((char *)vaddr)[(nr^31) >> 3])); + __asm__ __volatile__ ("bset %1,%0" + : "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) : "di" (nr & 7)); } -extern __inline__ void __generic_set_bit(int nr, void * vaddr) +extern __inline__ void __generic_set_bit(int nr, volatile void * vaddr) { __asm__ __volatile__ ("bfset %1@{%0:#1}" - : : "d" (nr^31), "a" (vaddr)); + : : "d" (nr^31), "a" (vaddr) : "memory"); } #define test_and_clear_bit(nr,vaddr) \ @@ -62,23 +62,23 @@ __constant_test_and_clear_bit(nr, vaddr) : \ __generic_test_and_clear_bit(nr, vaddr)) -extern __inline__ int __constant_test_and_clear_bit(int nr, void * vaddr) +extern __inline__ int __constant_test_and_clear_bit(int nr, volatile void * vaddr) { char retval; - __asm__ __volatile__ ("bclr %1,%2; sne %0" - : "=d" (retval) - : "di" (nr & 7), "m" (((char *)vaddr)[(nr^31) >> 3])); + __asm__ __volatile__ ("bclr %2,%1; sne %0" + : "=d" (retval), "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) + : "di" (nr & 7)); return retval; } -extern __inline__ int __generic_test_and_clear_bit(int nr, void * vaddr) +extern __inline__ int __generic_test_and_clear_bit(int nr, volatile void * vaddr) { char retval; __asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^31), "a" (vaddr)); + : "=d" (retval) : "d" (nr^31), "a" (vaddr) : "memory"); return retval; } @@ -94,16 +94,16 @@ __constant_clear_bit(nr, vaddr) : \ __generic_clear_bit(nr, vaddr)) -extern __inline__ void __constant_clear_bit(int nr, void * vaddr) +extern __inline__ void __constant_clear_bit(int nr, volatile void * vaddr) { - __asm__ __volatile__ ("bclr %0,%1" - : : "di" (nr & 7), "m" (((char *)vaddr)[(nr^31) >> 3])); + __asm__ __volatile__ ("bclr %1,%0" + : "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) : "di" (nr & 7)); } -extern __inline__ void __generic_clear_bit(int nr, void * vaddr) +extern __inline__ void __generic_clear_bit(int nr, volatile void * vaddr) { __asm__ __volatile__ ("bfclr %1@{%0:#1}" - : : "d" (nr^31), "a" (vaddr)); + : : "d" (nr^31), "a" (vaddr) : "memory"); } #define test_and_change_bit(nr,vaddr) \ @@ -111,23 +111,26 @@ __constant_test_and_change_bit(nr, vaddr) : \ __generic_test_and_change_bit(nr, vaddr)) -extern __inline__ int __constant_test_and_change_bit(int nr, void * vaddr) +#define __test_and_change_bit(nr,vaddr) test_and_change_bit(nr,vaddr) +#define __change_bit(nr,vaddr) change_bit(nr,vaddr) + +extern __inline__ int __constant_test_and_change_bit(int nr, volatile void * vaddr) { char retval; - __asm__ __volatile__ ("bchg %1,%2; sne %0" - : "=d" (retval) - : "di" (nr & 7), "m" (((char *)vaddr)[(nr^31) >> 3])); + __asm__ __volatile__ ("bchg %2,%1; sne %0" + : "=d" (retval), "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) + : "di" (nr & 7)); return retval; } -extern __inline__ int __generic_test_and_change_bit(int nr, void * vaddr) +extern __inline__ int __generic_test_and_change_bit(int nr, volatile void * vaddr) { char retval; __asm__ __volatile__ ("bfchg %2@{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^31), "a" (vaddr)); + : "=d" (retval) : "d" (nr^31), "a" (vaddr) : "memory"); return retval; } @@ -137,21 +140,21 @@ __constant_change_bit(nr, vaddr) : \ __generic_change_bit(nr, vaddr)) -extern __inline__ void __constant_change_bit(int nr, void * vaddr) +extern __inline__ void __constant_change_bit(int nr, volatile void * vaddr) { - __asm__ __volatile__ ("bchg %0,%1" - : : "di" (nr & 7), "m" (((char *)vaddr)[(nr^31) >> 3])); + __asm__ __volatile__ ("bchg %1,%0" + : "+m" (((volatile char *)vaddr)[(nr^31) >> 3]) : "di" (nr & 7)); } -extern __inline__ void __generic_change_bit(int nr, void * vaddr) +extern __inline__ void __generic_change_bit(int nr, volatile void * vaddr) { __asm__ __volatile__ ("bfchg %1@{%0:#1}" - : : "d" (nr^31), "a" (vaddr)); + : : "d" (nr^31), "a" (vaddr) : "memory"); } -extern __inline__ int test_bit(int nr, const void * vaddr) +extern __inline__ int test_bit(int nr, const volatile void * vaddr) { - return ((1UL << (nr & 31)) & (((const unsigned int *) vaddr)[nr >> 5])) != 0; + return ((1UL << (nr & 31)) & (((const volatile unsigned int *) vaddr)[nr >> 5])) != 0; } extern __inline__ int find_first_zero_bit(void * vaddr, unsigned size) @@ -228,7 +231,7 @@ { int cnt; - asm ("bfffo %1{#0:#0},%0" : "=d" (cnt) : "dm" (x & -x)); + __asm__ __volatile__("bfffo %1{#0:#0},%0" : "=d" (cnt) : "dm" (x & -x)); return 32 - cnt; } @@ -268,12 +271,12 @@ } extern __inline__ int -minix_test_and_set_bit (int nr, void *vaddr) +minix_test_and_set_bit (int nr, volatile void *vaddr) { char retval; __asm__ __volatile__ ("bfset %2{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^15), "m" (*(char *)vaddr)); + : "=d" (retval) : "d" (nr^15), "m" (*(volatile char *)vaddr) : "memory"); return retval; } @@ -281,50 +284,50 @@ #define minix_set_bit(nr,addr) ((void)minix_test_and_set_bit(nr,addr)) extern __inline__ int -minix_test_and_clear_bit (int nr, void *vaddr) +minix_test_and_clear_bit (int nr, volatile void *vaddr) { char retval; __asm__ __volatile__ ("bfclr %2{%1:#1}; sne %0" - : "=d" (retval) : "d" (nr^15), "m" (*(char *) vaddr)); + : "=d" (retval) : "d" (nr^15), "m" (*(volatile char *) vaddr) : "memory"); return retval; } extern __inline__ int -minix_test_bit (int nr, const void *vaddr) +minix_test_bit (int nr, const volatile void *vaddr) { - return ((1U << (nr & 15)) & (((const unsigned short *) vaddr)[nr >> 4])) != 0; + return ((1U << (nr & 15)) & (((const volatile unsigned short *) vaddr)[nr >> 4])) != 0; } /* Bitmap functions for the ext2 filesystem. */ extern __inline__ int -ext2_set_bit (int nr, void *vaddr) +ext2_set_bit (int nr, volatile void *vaddr) { char retval; __asm__ __volatile__ ("bfset %2{%1,#1}; sne %0" - : "=d" (retval) : "d" (nr^7), "m" (*(char *) vaddr)); + : "=d" (retval) : "d" (nr^7), "m" (*(volatile char *) vaddr) : "memory"); return retval; } extern __inline__ int -ext2_clear_bit (int nr, void *vaddr) +ext2_clear_bit (int nr, volatile void *vaddr) { char retval; __asm__ __volatile__ ("bfclr %2{%1,#1}; sne %0" - : "=d" (retval) : "d" (nr^7), "m" (*(char *) vaddr)); + : "=d" (retval) : "d" (nr^7), "m" (*(volatile char *) vaddr) : "memory"); return retval; } extern __inline__ int -ext2_test_bit (int nr, const void *vaddr) +ext2_test_bit (int nr, const volatile void *vaddr) { - return ((1U << (nr & 7)) & (((const unsigned char *) vaddr)[nr >> 3])) != 0; + return ((1U << (nr & 7)) & (((const volatile unsigned char *) vaddr)[nr >> 3])) != 0; } extern __inline__ int diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/dvma.h linux/include/asm-m68k/dvma.h --- v2.4.5/linux/include/asm-m68k/dvma.h Fri Dec 29 14:07:23 2000 +++ linux/include/asm-m68k/dvma.h Tue Jun 5 18:27:20 2001 @@ -11,17 +11,37 @@ #include +#define DVMA_PAGE_SHIFT 13 +#define DVMA_PAGE_SIZE (1UL << DVMA_PAGE_SHIFT) +#define DVMA_PAGE_MASK (~(DVMA_PAGE_SIZE-1)) +#define DVMA_PAGE_ALIGN(addr) (((addr)+DVMA_PAGE_SIZE-1)&DVMA_PAGE_MASK) + +extern void dvma_init(void); +extern int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, + int len); + +#define dvma_malloc(x) dvma_malloc_align(x, 0) +#define dvma_map(x, y) dvma_map_align(x, y, 0) + +extern unsigned long dvma_map_align(unsigned long kaddr, int len, + int align); +extern void *dvma_malloc_align(unsigned long len, unsigned long align); + +extern void dvma_unmap(void *baddr); +extern void dvma_free(void *vaddr); + + #ifdef CONFIG_SUN3 /* sun3 dvma page support */ -#define DVMA_RESERVED_PMEGS 2 /* 256k of dvma */ - /* memory and pmegs potentially reserved for dvma */ #define DVMA_PMEG_START 10 #define DVMA_PMEG_END 16 -#define DVMA_START 0xff00000 -#define DVMA_END 0xffe0000 +#define DVMA_START 0xf00000 +#define DVMA_END 0xfe0000 #define DVMA_SIZE (DVMA_END-DVMA_START) +#define IOMMU_TOTAL_ENTRIES 128 +#define IOMMU_ENTRIES 120 /* empirical kludge -- dvma regions only seem to work right on 0x10000 byte boundries */ @@ -29,15 +49,40 @@ #define DVMA_ALIGN(addr) (((addr)+DVMA_REGION_SIZE-1) & \ ~(DVMA_REGION_SIZE-1)) - /* virt <-> phys conversions */ -#define sun3_dvma_vtop(x) ((unsigned long)(x) & 0xffffff) -#define sun3_dvma_ptov(x) ((unsigned long)(x) | 0xf000000) +#define dvma_vtop(x) ((unsigned long)(x) & 0xffffff) +#define dvma_ptov(x) ((unsigned long)(x) | 0xf000000) +#define dvma_vtob(x) dvma_vtop(x) +#define dvma_btov(x) dvma_ptov(x) + +extern inline int dvma_map_cpu(unsigned long kaddr, unsigned long vaddr, int len) +{ + return 0; +} + +extern unsigned long dvma_page(unsigned long kaddr, unsigned long vaddr); -extern void sun3_dvma_init(void); -extern void *sun3_dvma_malloc(int len); #else /* Sun3x */ +/* sun3x dvma page support */ + +#define DVMA_START 0x0 +#define DVMA_END 0xf00000 +#define DVMA_SIZE (DVMA_END-DVMA_START) +#define IOMMU_TOTAL_ENTRIES 2048 +/* the prom takes the top meg */ +#define IOMMU_ENTRIES (IOMMU_TOTAL_ENTRIES - 0x80) + +#define dvma_vtob(x) ((unsigned long)(x) & 0x00ffffff) +#define dvma_btov(x) ((unsigned long)(x) | 0xff000000) + +extern int dvma_map_cpu(unsigned long kaddr, unsigned long vaddr, int len); + + + +/* everything below this line is specific to dma used for the onboard + ESP scsi on sun3x */ + /* Structure to describe the current status of DMA registers on the Sparc */ struct sparc_dma_registers { __volatile__ unsigned long cond_reg; /* DMA condition register */ @@ -188,7 +233,7 @@ dma->running = 0; \ } while(0) -extern unsigned long dvma_alloc (unsigned long, unsigned long); -extern void dvma_free (unsigned long, unsigned long); + #endif /* !CONFIG_SUN3 */ + #endif /* !(__M68K_DVMA_H) */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/floppy.h linux/include/asm-m68k/floppy.h --- v2.4.5/linux/include/asm-m68k/floppy.h Thu Jan 4 13:00:55 2001 +++ linux/include/asm-m68k/floppy.h Tue Jun 5 18:27:20 2001 @@ -1,23 +1,58 @@ /* - * Q40 Architecture specific parts of the Floppy driver + * Implementation independent bits of the Floppy driver. + * + * much of this file is derived from what was originally the Q40 floppy driver. * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 1999 + * Copyright (C) 1999, 2000, 2001 + * + * Sun3x support added 2/4/2000 Sam Creasey (sammy@oh.verio.com) + * */ #include #include - asmlinkage void floppy_hardint(int irq, void *dev_id, struct pt_regs * regs); +/* constants... */ + #undef MAX_DMA_ADDRESS #define MAX_DMA_ADDRESS 0x00 /* nothing like that */ + +/* + * Again, the CMOS information doesn't work on m68k.. + */ +#define FLOPPY0_TYPE (MACH_IS_Q40 ? 6 : 4) +#define FLOPPY1_TYPE 0 + +#define FLOPPY_MOTOR_MASK 0xf0 + + +/* basically PC init + set use_virtual_dma */ +#define FDC1 m68k_floppy_init() +static int FDC2 = -1; + + +#define N_FDC 1 +#define N_DRIVE 8 + + +/* vdma globals adapted from asm-i386/floppy.h */ + +static int virtual_dma_count=0; +static int virtual_dma_residue=0; +static char *virtual_dma_addr=0; +static int virtual_dma_mode=0; +static int doing_pdma=0; + +#include + extern spinlock_t dma_spin_lock; static __inline__ unsigned long claim_dma_lock(void) @@ -33,23 +68,46 @@ } +static __inline__ unsigned char fd_inb(int port) +{ + if(MACH_IS_Q40) + return inb_p(port); + else if(MACH_IS_SUN3X) + return sun3x_82072_fd_inb(port); +} -#define fd_inb(port) inb_p(port) -#define fd_outb(port,value) outb_p(port,value) +static __inline__ void fd_outb(unsigned char value, int port) +{ + if(MACH_IS_Q40) + outb_p(value, port); + else if(MACH_IS_SUN3X) + sun3x_82072_fd_outb(value, port); +} -#define fd_request_dma() vdma_request_dma(FLOPPY_DMA,"floppy") -/*#define fd_free_dma() */ +static int fd_request_irq(void) +{ + if(MACH_IS_Q40) + return request_irq(FLOPPY_IRQ, floppy_hardint,SA_INTERRUPT, + "floppy", NULL); + else if(MACH_IS_SUN3X) + return sun3xflop_request_irq(); + +} +static void fd_free_irq(void) +{ + if(MACH_IS_Q40) + free_irq(FLOPPY_IRQ, NULL); +} +#define fd_request_dma() vdma_request_dma(FLOPPY_DMA,"floppy") #define fd_get_dma_residue() vdma_get_dma_residue(FLOPPY_DMA) #define fd_dma_mem_alloc(size) vdma_mem_alloc(size) #define fd_dma_setup(addr, size, mode, io) vdma_dma_setup(addr, size, mode, io) - #define fd_enable_irq() /* nothing... */ #define fd_disable_irq() /* nothing... */ -#define fd_free_irq() free_irq(FLOPPY_IRQ, NULL) #define fd_free_dma() /* nothing */ @@ -60,62 +118,71 @@ #define DMA_MODE_WRITE 0x48 -static int q40_floppy_init(void) +static int m68k_floppy_init(void) { use_virtual_dma =1; - /* FLOPPY_IRQ=6; */ - + can_use_virtual_dma = 1; + + if (MACH_IS_Q40) - return 0x3f0; + return 0x3f0; + else if(MACH_IS_SUN3X) + return sun3xflop_init(); else return -1; } +static int vdma_request_dma(unsigned int dmanr, const char * device_id) +{ + return 0; +} -/* - * Again, the CMOS information doesn't work on the Q40.. - */ -#define FLOPPY0_TYPE 6 -#define FLOPPY1_TYPE 0 - - - - -#define FLOPPY_MOTOR_MASK 0xf0 - - - +static int vdma_get_dma_residue(unsigned int dummy) +{ + return virtual_dma_count + virtual_dma_residue; +} -/* basically PC init + set use_virtual_dma */ -#define FDC1 q40_floppy_init() -static int FDC2 = -1; +static unsigned long vdma_mem_alloc(unsigned long size) +{ + return (unsigned long) vmalloc(size); -#define N_FDC 1 -#define N_DRIVE 8 +} +static void _fd_dma_mem_free(unsigned long addr, unsigned long size) +{ + vfree((void *)addr); +} +#define fd_dma_mem_free(addr,size) _fd_dma_mem_free(addr, size) -/* vdma stuff adapted from asm-i386/floppy.h */ +/* choose_dma_mode ???*/ -static int virtual_dma_count=0; -static int virtual_dma_residue=0; -static char *virtual_dma_addr=0; -static int virtual_dma_mode=0; -static int doing_pdma=0; +static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io) +{ + doing_pdma = 1; + virtual_dma_port = (MACH_IS_Q40 ? io : 0); + virtual_dma_mode = (mode == DMA_MODE_WRITE); + virtual_dma_addr = addr; + virtual_dma_count = size; + virtual_dma_residue = 0; + return 0; +} -static int fd_request_irq(void) +static void fd_disable_dma(void) { - return request_irq(FLOPPY_IRQ, floppy_hardint,SA_INTERRUPT, - "floppy", NULL); + doing_pdma = 0; + virtual_dma_residue += virtual_dma_count; + virtual_dma_count=0; } -/*#define SLOW_DOWN do{outb(0,0x80);}while(0)*/ -#define SLOW_DOWN do{int count=1;do{if(!jiffies)break;}while(count-->0);}while(0) + + +/* this is the only truly Q40 specific function */ asmlinkage void floppy_hardint(int irq, void *dev_id, struct pt_regs * regs) { @@ -185,55 +252,6 @@ if(!virtual_dma_count) dma_wait++; #endif -} - - - -static int vdma_request_dma(unsigned int dmanr, const char * device_id) -{ - return 0; -} - - -static int vdma_get_dma_residue(unsigned int dummy) -{ - return virtual_dma_count + virtual_dma_residue; -} - - -static unsigned long vdma_mem_alloc(unsigned long size) -{ - return (unsigned long) vmalloc(size); - -} - -static void _fd_dma_mem_free(unsigned long addr, unsigned long size) -{ - vfree((void *)addr); -} -#define fd_dma_mem_free(addr,size) _fd_dma_mem_free(addr, size) - - -/* choose_dma_mode ???*/ - -static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io) -{ - doing_pdma = 1; - virtual_dma_port = io; - virtual_dma_mode = (mode == DMA_MODE_WRITE); - virtual_dma_addr = addr; - virtual_dma_count = size; - virtual_dma_residue = 0; - return 0; -} - - - -static void fd_disable_dma(void) -{ - doing_pdma = 0; - virtual_dma_residue += virtual_dma_count; - virtual_dma_count=0; } diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/ide.h linux/include/asm-m68k/ide.h --- v2.4.5/linux/include/asm-m68k/ide.h Fri Dec 29 14:07:23 2000 +++ linux/include/asm-m68k/ide.h Tue Jun 5 18:27:20 2001 @@ -61,10 +61,6 @@ return 0; } -/* - * Can we do this in a generic manner?? - */ - /* * Set up a hw structure for a specified data port, control port and IRQ. @@ -160,219 +156,64 @@ #define SUPPORT_VLB_SYNC 0 /* this definition is used only on startup .. */ -#ifndef CONFIG_Q40 #undef HD_DATA #define HD_DATA NULL + + +/* get rid of defs from io.h - ide has its private and conflicting versions */ +#undef inb +#undef inw +#undef outb +#undef outw +#undef inb_p +#undef outb_p +#undef insw +#undef outsw +#undef insw_swapw +#undef outsw_swapw + +/* + * define IO method and translation, + * so far only Q40 has ide-if on ISA +*/ +#ifndef CONFIG_Q40 + +#define ADDR_TRANS_B(_addr_) (_addr_) +#define ADDR_TRANS_W(_addr_) (_addr_) + #else -#ifdef MACH_Q40_ONLY -#undef HD_DATA -#define HD_DATA ((ide_ioreg_t)0x1f0) -#else -#undef HD_DATA -#define HD_DATA (MACH_IS_Q40 ? (ide_ioreg_t)0x1f0 : 0) -#endif + +#define ADDR_TRANS_B(_addr_) (MACH_IS_Q40 ? ((unsigned char *)Q40_ISA_IO_B(_addr_)) : (_addr_)) +#define ADDR_TRANS_W(_addr_) (MACH_IS_Q40 ? ((unsigned char *)Q40_ISA_IO_W(_addr_)) : (_addr_)) #endif +#define inb(p) in_8(ADDR_TRANS_B(p)) +#define inb_p(p) in_8(ADDR_TRANS_B(p)) +#define inw(p) in_be16(ADDR_TRANS_W(p)) +#define outb(v,p) out_8(ADDR_TRANS_B(p),v) +#define outb_p(v,p) out_8(ADDR_TRANS_B(p),v) +#define outw(v,p) out_be16(ADDR_TRANS_W(p),v) + +#define insw(port, buf, nr) raw_insw(ADDR_TRANS_W(port), buf, nr) +#define outsw(port, buf, nr) raw_outsw(ADDR_TRANS_W(port), buf, nr) #define insl(data_reg, buffer, wcount) insw(data_reg, buffer, (wcount)<<1) #define outsl(data_reg, buffer, wcount) outsw(data_reg, buffer, (wcount)<<1) -#ifdef CONFIG_Q40 -#ifdef MACH_Q40_ONLY -#define ADDR_TRANS(_addr_) (Q40_ISA_IO_W(_addr_)) -#else -#define ADDR_TRANS(_addr_) (MACH_IS_Q40 ? ((unsigned char *)Q40_ISA_IO_W(_addr_)) : (_addr_)) -#endif -#else -#define ADDR_TRANS(_addr_) (_addr_) -#endif -#define insw(port, buf, nr) ({ \ - unsigned char *_port = (unsigned char *) ADDR_TRANS(port); \ - unsigned char *_buf = (buf); \ - int _nr = (nr); \ - unsigned long _tmp; \ - \ - if (_nr & 15) { \ - _tmp = (_nr & 15) - 1; \ - asm volatile ( \ - "1: movew %2@,%0@+; dbra %1,1b" \ - : "=a" (_buf), "=d" (_tmp) \ - : "a" (_port), "0" (_buf), \ - "1" (_tmp)); \ - } \ - if (_nr >> 4) { \ - _tmp = (_nr >> 4) - 1; \ - asm volatile ( \ - "1: " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "movew %2@,%0@+; " \ - "dbra %1,1b" \ - : "=a" (_buf), "=d" (_tmp) \ - : "a" (_port), "0" (_buf), \ - "1" (_tmp)); \ - } \ -}) - -#define outsw(port, buf, nr) ({ \ - unsigned char *_port = (unsigned char *) ADDR_TRANS(port); \ - unsigned char *_buf = (buf); \ - int _nr = (nr); \ - unsigned long _tmp; \ - \ - if (_nr & 15) { \ - _tmp = (_nr & 15) - 1; \ - asm volatile ( \ - "1: movew %0@+,%2@; dbra %1,1b" \ - : "=a" (_buf), "=d" (_tmp) \ - : "a" (_port), "0" (_buf), \ - "1" (_tmp)); \ - } \ - if (_nr >> 4) { \ - _tmp = (_nr >> 4) - 1; \ - asm volatile ( \ - "1: " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "movew %0@+,%2@; " \ - "dbra %1,1b" \ - : "=a" (_buf), "=d" (_tmp) \ - : "a" (_port), "0" (_buf), \ - "1" (_tmp)); \ - } \ -}) #if defined(CONFIG_ATARI) || defined(CONFIG_Q40) + #define insl_swapw(data_reg, buffer, wcount) \ insw_swapw(data_reg, buffer, (wcount)<<1) #define outsl_swapw(data_reg, buffer, wcount) \ outsw_swapw(data_reg, buffer, (wcount)<<1) -#define insw_swapw(port, buf, nr) \ - if ((nr) % 8) \ - __asm__ __volatile__ \ - ("movel %0,%/a0; \ - movel %1,%/a1; \ - movel %2,%/d6; \ - subql #1,%/d6; \ - 1:movew %/a0@,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a1@+; \ - dbra %/d6,1b" : \ - : "g" (ADDR_TRANS(port)), "g" (buf), "g" (nr) \ - : "d0", "a0", "a1", "d6"); \ - else \ - __asm__ __volatile__ \ - ("movel %0,%/a0; \ - movel %1,%/a1; \ - movel %2,%/d6; \ - lsrl #3,%/d6; \ - subql #1,%/d6; \ - 1:movew %/a0@,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a1@+; \ - movew %/a0@,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a1@+; \ - movew %/a0@,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a1@+; \ - movew %/a0@,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a1@+; \ - movew %/a0@,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a1@+; \ - movew %/a0@,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a1@+; \ - movew %/a0@,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a1@+; \ - movew %/a0@,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a1@+; \ - dbra %/d6,1b" : \ - : "g" (ADDR_TRANS(port)), "g" (buf), "g" (nr) \ - : "d0", "a0", "a1", "d6") - - -#define outsw_swapw(port, buf, nr) \ - if ((nr) % 8) \ - __asm__ __volatile__ \ - ("movel %0,%/a0; \ - movel %1,%/a1; \ - movel %2,%/d6; \ - subql #1,%/d6; \ - 1:movew %/a1@+,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a0@; \ - dbra %/d6,1b" : \ - : "g" (ADDR_TRANS(port)), "g" (buf), "g" (nr) \ - : "d0", "a0", "a1", "d6"); \ - else \ - __asm__ __volatile__ \ - ("movel %0,%/a0; \ - movel %1,%/a1; \ - movel %2,%/d6; \ - lsrl #3,%/d6; \ - subql #1,%/d6; \ - 1:movew %/a1@+,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a0@; \ - movew %/a1@+,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a0@; \ - movew %/a1@+,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a0@; \ - movew %/a1@+,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a0@; \ - movew %/a1@+,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a0@; \ - movew %/a1@+,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a0@; \ - movew %/a1@+,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a0@; \ - movew %/a1@+,%/d0; \ - rolw #8,%/d0; \ - movew %/d0,%/a0@; \ - dbra %/d6,1b" : \ - : "g" (ADDR_TRANS(port)), "g" (buf), "g" (nr) \ - : "d0", "a0", "a1", "d6") +#define insw_swapw(port, buf, nr) raw_insw_swapw(ADDR_TRANS_W(port), buf, nr) +#define outsw_swapw(port, buf, nr) raw_outsw_swapw(ADDR_TRANS_W(port),buf,nr) + +#endif /* CONFIG_ATARI || CONFIG_Q40 */ -#endif /* CONFIG_ATARI */ #define T_CHAR (0x0000) /* char: don't touch */ #define T_SHORT (0x4000) /* short: 12 -> 21 */ @@ -387,7 +228,15 @@ #define D_INT(cnt) (T_INT | (cnt)) #define D_TEXT(cnt) (T_TEXT | (cnt)) -#if defined(CONFIG_AMIGA) || defined (CONFIG_MAC) +/* Q40 and Atari have byteswapped IDE bus and since many interesting + * values in the identification string are text, chars and words they + * happened to be almost correct without swapping.. However *_capacity + * is needed for drives over 8 GB. RZ */ +#if defined(CONFIG_Q40) || defined(CONFIG_ATARI) +#define M68K_IDE_SWAPW (MACH_IS_Q40 || MACH_IS_ATARI) +#endif + +#if defined(CONFIG_AMIGA) || defined (CONFIG_MAC) || defined(M68K_IDE_SWAPW) static u_short driveid_types[] = { D_SHORT(10), /* config - vendor2 */ D_TEXT(20), /* serial_no */ @@ -402,7 +251,7 @@ D_INT(1), /* cur_capacity */ D_CHAR(2), /* multsect - multsect_valid */ D_INT(1), /* lba_capacity */ - D_SHORT(194) /* dma_1word - reservedyy */ + D_SHORT(194) /* dma_1word - reserved */ }; #define num_driveid_types (sizeof(driveid_types)/sizeof(*driveid_types)) @@ -410,13 +259,19 @@ static __inline__ void ide_fix_driveid(struct hd_driveid *id) { -#if defined(CONFIG_AMIGA) || defined (CONFIG_MAC) +#if defined(CONFIG_AMIGA) || defined (CONFIG_MAC) || defined(M68K_IDE_SWAPW) u_char *p = (u_char *)id; int i, j, cnt; u_char t; - if (!MACH_IS_AMIGA && !MACH_IS_MAC) + if (!MACH_IS_AMIGA && !MACH_IS_MAC && !MACH_IS_Q40 && !MACH_IS_ATARI) return; +#ifdef M68K_IDE_SWAPW + if (M68K_IDE_SWAPW) /* fix bus byteorder first */ + for (i=0; i < 512; i+=2) { + t = p[i]; p[i] = p[i+1]; p[i+1] = t; + } +#endif for (i = 0; i < num_driveid_types; i++) { cnt = driveid_types[i] & T_MASK_COUNT; switch (driveid_types[i] & T_MASK_TYPE) { @@ -425,28 +280,28 @@ break; case T_SHORT: for (j = 0; j < cnt; j++) { - t = p[0]; - p[0] = p[1]; - p[1] = t; + t = p[0]; + p[0] = p[1]; + p[1] = t; p += 2; } break; case T_INT: for (j = 0; j < cnt; j++) { - t = p[0]; - p[0] = p[3]; - p[3] = t; - t = p[1]; - p[1] = p[2]; - p[2] = t; + t = p[0]; + p[0] = p[3]; + p[3] = t; + t = p[1]; + p[1] = p[2]; + p[2] = t; p += 4; } break; case T_TEXT: for (j = 0; j < cnt; j += 2) { - t = p[0]; - p[0] = p[1]; - p[1] = t; + t = p[0]; + p[0] = p[1]; + p[1] = t; p += 2; } break; diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/intersil.h linux/include/asm-m68k/intersil.h --- v2.4.5/linux/include/asm-m68k/intersil.h Fri Dec 29 14:07:23 2000 +++ linux/include/asm-m68k/intersil.h Tue Jun 5 18:27:20 2001 @@ -25,21 +25,21 @@ #define INTERSIL_HZ_100_MASK 0x02 struct intersil_dt { - u_char csec; - u_char hour; - u_char minute; - u_char second; - u_char month; - u_char day; - u_char year; - u_char weekday; + unsigned char csec; + unsigned char hour; + unsigned char minute; + unsigned char second; + unsigned char month; + unsigned char day; + unsigned char year; + unsigned char weekday; }; struct intersil_7170 { struct intersil_dt counter; struct intersil_dt alarm; - u_char int_reg; - u_char cmd_reg; + unsigned char int_reg; + unsigned char cmd_reg; }; extern volatile char* clock_va; diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/io.h linux/include/asm-m68k/io.h --- v2.4.5/linux/include/asm-m68k/io.h Thu Jan 4 13:00:55 2001 +++ linux/include/asm-m68k/io.h Tue Jun 5 18:27:20 2001 @@ -1,57 +1,260 @@ -#ifndef _M68K_IO_H -#define _M68K_IO_H +/* + * linux/include/asm-m68k/io.h + * + * 4/1/00 RZ: - rewritten to avoid clashes between ISA/PCI and other + * IO access + * - added Q40 support + * - added skeleton for GG-II and Amiga PCMCIA + * 2/3/01 RZ: - moved a few more defs into raw_io.h + * + * inX/outX/readX/writeX should not be used by any driver unless it does + * ISA or PCI access. Other drivers should use function defined in raw_io.h + * or define its own macros on top of these. + * + * inX(),outX() are for PCI and ISA I/O + * readX(),writeX() are for PCI memory + * isa_readX(),isa_writeX() are for ISA memory + * + * moved mem{cpy,set}_*io inside CONFIG_PCI + */ + +#ifndef _IO_H +#define _IO_H #ifdef __KERNEL__ #include +#include +#include + #ifdef CONFIG_ATARI #include - -#define SLOW_DOWN_IO do { if (MACH_IS_ATARI) MFPDELAY(); } while (0) #endif -#include /* - * These are for PCI shared memory _only_ and should never be used - * on any other type of memory, including Zorro memory. They are meant to - * access the bus in the bus byte order which is little-endian!. - * - * readX/writeX() are used to access memory mapped devices. On some - * architectures the memory mapped IO stuff needs to be accessed - * differently. On the m68k architecture, we just read/write the - * memory location directly. + * IO/MEM definitions for various ISA bridges */ -/* ++roman: The assignments to temp. vars avoid that gcc sometimes generates - * two accesses to memory, which may be undesireable for some devices. + + +#ifdef CONFIG_Q40 + +#define q40_isa_io_base 0xff400000 +#define q40_isa_mem_base 0xff800000 + +#define Q40_ISA_IO_B(ioaddr) (q40_isa_io_base+1+4*((unsigned long)(ioaddr))) +#define Q40_ISA_IO_W(ioaddr) (q40_isa_io_base+ 4*((unsigned long)(ioaddr))) +#define Q40_ISA_MEM_B(madr) (q40_isa_mem_base+1+4*((unsigned long)(madr))) +#define Q40_ISA_MEM_W(madr) (q40_isa_mem_base+ 4*((unsigned long)(madr))) + +#define MACH_HAS_ISA 1 +#endif /* Q40 */ + +/* GG-II Zorro to ISA bridge */ +#ifdef CONFIG_GG2 + +extern unsigned long gg2_isa_base; +#define GG2_ISA_IO_B(ioaddr) (gg2_isa_base+1+((unsigned long)(ioaddr)*4)) +#define GG2_ISA_IO_W(ioaddr) (gg2_isa_base+ ((unsigned long)(ioaddr)*4)) +#define GG2_ISA_MEM_B(madr) (gg2_isa_base+1+(((unsigned long)(madr)*4) & 0xfffff)) +#define GG2_ISA_MEM_W(madr) (gg2_isa_base+ (((unsigned long)(madr)*4) & 0xfffff)) + +#ifndef MACH_HAS_ISA +#define MACH_HAS_ISA 1 +#else +#undef MACH_HAS_ISA +#define MACH_HAS_ISA m +#endif +#endif /* GG2 */ + +#ifdef CONFIG_AMIGA_PCMCIA +#include + +#define AG_ISA_IO_B(ioaddr) ( GAYLE_IO+(ioaddr)+(((ioaddr)&1)*GAYLE_ODD) ) +#define AG_ISA_IO_W(ioaddr) ( GAYLE_IO+(ioaddr) ) + +#ifndef MACH_HAS_ISA +#define MACH_HAS_ISA 1 +#else +#undef MACH_HAS_ISA +#define MACH_HAS_ISA m +#endif +#endif /* AMIGA_PCMCIA */ + + + +#ifdef MACH_HAS_ISA + +#define Q40_ISA (1) +#define GG2_ISA (2) +#define AG_ISA (3) + +#if defined(CONFIG_Q40) && MACH_HAS_ISA==1 +#define ISA_TYPE Q40_ISA +#define ISA_SEX 0 +#endif +#if defined(CONFIG_AMIGA_PCMCIA) && MACH_HAS_ISA==1 +#define ISA_TYPE AG_ISA +#define ISA_SEX 1 +#endif +#if defined(CONFIG_GG2) && MACH_HAS_ISA==1 +#define ISA_TYPE GG2_ISA +#define ISA_SEX 0 +#endif + +#ifdef CONFIG_ISA +extern int isa_type; +extern int isa_sex; + +#define ISA_TYPE isa_type +#define ISA_SEX isa_sex +#endif + +/* + * define inline addr translation functions. Normally only one variant will + * be compiled in so the case statement will be optimised away */ -#define readb(addr) \ - ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; }) -#define readw(addr) \ - ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; }) -#define readl(addr) \ - ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; }) - -#define writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b)) -#define writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b)) -#define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b)) - -#define memset_io(a,b,c) memset((void *)(a),(b),(c)) -#define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) -#define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) -#define inb_p(addr) readb(addr) -#define inb(addr) readb(addr) +static inline unsigned long isa_itb(long addr) +{ + switch(ISA_TYPE) + { +#ifdef CONFIG_Q40 + case Q40_ISA: return Q40_ISA_IO_B(addr); +#endif +#ifdef CONFIG_GG2 + case GG2_ISA: return GG2_ISA_IO_B(addr); +#endif +#ifdef CONFIG_AMIGA_PCMCIA + case AG_ISA: return AG_ISA_IO_B(addr); +#endif + default: return 0; /* avoid warnings, just in case */ + } +} +static inline unsigned long isa_itw(long addr) +{ + switch(ISA_TYPE) + { +#ifdef CONFIG_Q40 + case Q40_ISA: return Q40_ISA_IO_W(addr); +#endif +#ifdef CONFIG_GG2 + case GG2_ISA: return GG2_ISA_IO_W(addr); +#endif +#ifdef CONFIG_AMIGA_PCMCIA + case AG_ISA: return AG_ISA_IO_W(addr); +#endif + default: return 0; /* avoid warnings, just in case */ + } +} +static inline unsigned long isa_mtb(long addr) +{ + switch(ISA_TYPE) + { +#ifdef CONFIG_Q40 + case Q40_ISA: return Q40_ISA_MEM_B(addr); +#endif +#ifdef CONFIG_GG2 + case GG2_ISA: return GG2_ISA_MEM_B(addr); +#endif + /* FIXME: any ISA mem mapping for PCMCIA? */ + default: return 0; /* avoid warnings, just in case */ + } +} +static inline unsigned long isa_mtw(long addr) +{ + switch(ISA_TYPE) + { +#ifdef CONFIG_Q40 + case Q40_ISA: return Q40_ISA_MEM_W(addr); +#endif +#ifdef CONFIG_GG2 + case GG2_ISA: return GG2_ISA_MEM_W(addr); +#endif + default: return 0; /* avoid warnings, just in case */ + } +} -#define outb(x,addr) ((void) writeb(x,addr)) -#define outb_p(x,addr) outb(x,addr) -#ifndef CONFIG_SUN3 -#define IO_SPACE_LIMIT 0xffff +#define isa_inb(port) in_8(isa_itb(port)) +#define isa_inw(port) (ISA_SEX ? in_be16(isa_itw(port)) : in_le16(isa_itw(port))) +#define isa_outb(val,port) out_8(isa_itb(port),(val)) +#define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val))) + +#define isa_readb(p) in_8(isa_mtb(p)) +#define isa_readw(p) in_le16(isa_mtw(p)) +#define isa_writeb(val,p) out_8(isa_mtb(p),(val)) +#define isa_writew(val,p) out_le16(isa_mtw(p),(val)) + +#define isa_inb_p(p) ({unsigned char v=isa_inb(p);isa_outb(0,0x80);v;}) +#define isa_outb_p(v,p) ({isa_outb((v),(p));isa_outb(0,0x80);}) + +#define isa_insb(port, buf, nr) raw_insb(isa_itb(port), (buf), (nr)) +#define isa_outsb(port, buf, nr) raw_outsb(isa_itb(port), (buf), (nr)) + +#define isa_insw(port, buf, nr) \ + (ISA_SEX ? raw_insw(isa_itw(port), (buf), (nr)) : \ + raw_insw_swapw(isa_itw(port), (buf), (nr))) + +#define isa_outsw(port, buf, nr) \ + (ISA_SEX ? raw_outsw(isa_itw(port), (buf), (nr)) : \ + raw_outsw_swapw(isa_itw(port), (buf), (nr))) +#endif /* MACH_HAS_ISA */ + + +#if defined(CONFIG_ISA) && !defined(CONFIG_PCI) +#define inb isa_inb +#define inb_p isa_inb_p +#define outb isa_outb +#define outb_p isa_outb_p +#define inw isa_inw +#define outw isa_outw +#define inl isa_inw +#define outl isa_outw +#define insb isa_insb +#define insw isa_insw +#define outsb isa_outsb +#define outsw isa_outsw +#endif /* MACH_HAS_ISA */ + + +#if defined(CONFIG_PCI) + +#define inl(port) in_le32(port) +#define outl(val,port) out_le32((port),(val)) + +#define readb(addr) in_8(addr) +#define readw(addr) in_le16(addr) +#define readl(addr) in_le32(addr) + +#define writeb(val,addr) out_8((addr),(val)) +#define writew(val,addr) out_le16((addr),(val)) +#define writel(val,addr) out_le32((addr),(val)) + + +#ifndef CONFIG_ISA +#define inb(port) in_8(port) +#define outb(val,port) out_8((port),(val)) +#define inw(port) in_le16(port) +#define outw(val,port) out_le16((port),(val)) + #else -#define IO_SPACE_LIMIT 0x0fffffff +/* + * kernel with both ISA and PCI compiled in, those have + * conflicting defs for in/out. Simply consider port < 1024 + * ISA and everything else PCI + */ +#define inb(port) ((port)<1024 ? isa_inb(port) : in_8(port)) +#define inb_p(port) ((port)<1024 ? isa_inb_p(port) : in_8(port)) +#define inw(port) ((port)<1024 ? isa_inw(port) : in_le16(port)) + +#define outb(val,port) ((port)<1024 ? isa_outb((val),(port)) : out_8((port),(val))) +#define outb_p(val,port) ((port)<1024 ? isa_outb_p((val),(port)) : out_8((port),(val))) +#define outw(val,port) ((port)<1024 ? isa_outw((val),(port)) : out_le16((port),(val))) #endif +#endif /* CONFIG_PCI */ + /* Values for nocacheflag and cmode */ #define IOMAP_FULL_CACHING 0 @@ -59,7 +262,10 @@ #define IOMAP_NOCACHE_NONSER 2 #define IOMAP_WRITETHROUGH 3 -extern void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag); +extern void iounmap(void *addr); + +extern void *__ioremap(unsigned long physaddr, unsigned long size, + int cacheflag); extern void __iounmap(void *addr, unsigned long size); extern inline void *ioremap(unsigned long physaddr, unsigned long size) @@ -70,11 +276,13 @@ { return __ioremap(physaddr, size, IOMAP_NOCACHE_SER); } -extern inline void *ioremap_writethrough(unsigned long physaddr, unsigned long size) +extern inline void *ioremap_writethrough(unsigned long physaddr, + unsigned long size) { return __ioremap(physaddr, size, IOMAP_WRITETHROUGH); } -extern inline void *ioremap_fullcache(unsigned long physaddr, unsigned long size) +extern inline void *ioremap_fullcache(unsigned long physaddr, + unsigned long size) { return __ioremap(physaddr, size, IOMAP_FULL_CACHING); } @@ -87,6 +295,11 @@ #define dma_cache_wback(_start,_size) do { } while (0) #define dma_cache_wback_inv(_start,_size) do { } while (0) -#endif /* __KERNEL__ */ +#ifndef CONFIG_SUN3 +#define IO_SPACE_LIMIT 0xffff +#else +#define IO_SPACE_LIMIT 0x0fffffff +#endif -#endif /* _M68K_IO_H */ +#endif /* __KERNEL__ */ +#endif /* _IO_H */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/linux_logo.h linux/include/asm-m68k/linux_logo.h --- v2.4.5/linux/include/asm-m68k/linux_logo.h Mon Oct 5 13:54:39 1998 +++ linux/include/asm-m68k/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -900,9 +900,6 @@ extern unsigned char linux_logo_blue[]; extern unsigned char linux_logo[]; extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; extern unsigned char linux_logo16[]; #endif diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/mac_psc.h linux/include/asm-m68k/mac_psc.h --- v2.4.5/linux/include/asm-m68k/mac_psc.h Sat Sep 4 13:06:41 1999 +++ linux/include/asm-m68k/mac_psc.h Tue Jun 5 18:27:20 2001 @@ -51,6 +51,8 @@ * One-shot DMA control registers */ +#define PSC_MYSTERY 0x804 + #define PSC_CTL_BASE 0xC00 #define PSC_SCSI_CTL 0xC00 @@ -70,6 +72,9 @@ #define PSC_ADDR_BASE 0x1000 #define PSC_LEN_BASE 0x1004 #define PSC_CMD_BASE 0x1008 + +#define PSC_SET0 0x00 +#define PSC_SET1 0x10 #define PSC_SCSI_ADDR 0x1000 /* confirmed */ #define PSC_SCSI_LEN 0x1004 /* confirmed */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/mc146818rtc.h linux/include/asm-m68k/mc146818rtc.h --- v2.4.5/linux/include/asm-m68k/mc146818rtc.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-m68k/mc146818rtc.h Tue Jun 5 18:27:20 2001 @@ -0,0 +1,48 @@ +/* + * Machine dependent access functions for RTC registers. + */ +#ifndef _ASM_MC146818RTC_H +#define _ASM_MC146818RTC_H + +#include + +#ifdef CONFIG_ATARI +/* RTC in Atari machines */ + +#include +#include +#include +#define RTC_HAS_IRQ (ATARIHW_PRESENT(TT_MFP)) +#define RTC_IRQ IRQ_TT_MFP_RTC +#define RTC_IRQ_FLAGS IRQ_TYPE_FAST +#define RTC_PORT(x) (TT_RTC_BAS + 2*(x)) +#define RTC_ALWAYS_BCD 0 /* TOS uses binary mode, Linux should be able + * to deal with both modes */ + +#define RTC_CHECK_DRIVER_INIT() (MACH_IS_ATARI && ATARIHW_PRESENT(TT_CLK)) +#define RTC_MACH_INIT() \ + do { \ + epoch = atari_rtc_year_offset + 1900; \ + if (RTC_HAS_IRQ) \ + /* select RTC int on H->L edge */ \ + tt_mfp.active_edge &= ~0x40; \ + } while(0) +#define RTC_MACH_EXIT() + +/* On Atari, the year was stored with base 1970 in old TOS versions (before + * 3.06). Later, Atari recognized that this broke leap year recognition, and + * changed the base to 1968. Medusa and Hades always use the new version. */ +#define RTC_CENTURY_SWITCH -1 /* no century switch */ +#define RTC_MINYEAR epoch + +#define CMOS_READ(addr) ({ \ +outb_p((addr),RTC_PORT(0)); \ +inb_p(RTC_PORT(1)); \ +}) +#define CMOS_WRITE(val, addr) ({ \ +outb_p((addr),RTC_PORT(0)); \ +outb_p((val),RTC_PORT(1)); \ +}) +#endif /* CONFIG_ATARI */ + +#endif /* _ASM_MC146818RTC_H */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/motorola_pgalloc.h linux/include/asm-m68k/motorola_pgalloc.h --- v2.4.5/linux/include/asm-m68k/motorola_pgalloc.h Mon Apr 23 15:28:07 2001 +++ linux/include/asm-m68k/motorola_pgalloc.h Tue Jun 5 18:27:20 2001 @@ -21,6 +21,22 @@ extern pmd_t *get_pointer_table(void); extern int free_pointer_table(pmd_t *); + +extern inline void flush_tlb_kernel_page(unsigned long addr) +{ + if (CPU_IS_040_OR_060) { + mm_segment_t old_fs = get_fs(); + set_fs(KERNEL_DS); + __asm__ __volatile__(".chip 68040\n\t" + "pflush (%0)\n\t" + ".chip 68k" + : : "a" (addr)); + set_fs(old_fs); + } else + __asm__ __volatile__("pflush #4,#4,(%0)" : : "a" (addr)); +} + + extern inline pte_t *get_pte_fast(void) { unsigned long *ret; @@ -33,6 +49,29 @@ } return (pte_t *)ret; } +#define pte_alloc_one_fast(mm,addr) get_pte_fast() + +static inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address) +{ + pte_t *pte; + + pte = (pte_t *) __get_free_page(GFP_KERNEL); + if (pte) { + clear_page(pte); + __flush_page_to_ram((unsigned long)pte); + flush_tlb_kernel_page((unsigned long)pte); + nocache_page((unsigned long)pte); + } + + return pte; +} + + +extern __inline__ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) +{ + return get_pointer_table(); +} + extern inline void free_pte_fast(pte_t *pte) { @@ -59,6 +98,7 @@ } return (pmd_t *)ret; } +#define pmd_alloc_one_fast(mm,addr) get_pmd_fast() extern inline void free_pmd_fast(pmd_t *pmd) { @@ -94,46 +134,11 @@ free_pte_fast(pte); } -extern inline pte_t *pte_alloc(pmd_t *pmd, unsigned long address) -{ - address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); - if (pmd_none(*pmd)) { - pte_t *page = get_pte_fast(); - - if (!page) - return get_pte_slow(pmd, address); - pmd_set(pmd,page); - return page + address; - } - if (pmd_bad(*pmd)) { - __bad_pte(pmd); - return NULL; - } - return (pte_t *)__pmd_page(*pmd) + address; -} - extern inline void pmd_free(pmd_t *pmd) { free_pmd_fast(pmd); } -extern inline pmd_t *pmd_alloc(pgd_t *pgd, unsigned long address) -{ - address = (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); - if (pgd_none(*pgd)) { - pmd_t *page = get_pmd_fast(); - - if (!page) - return get_pmd_slow(pgd, address); - pgd_set(pgd, page); - return page + address; - } - if (pgd_bad(*pgd)) { - __bad_pmd(pgd); - return NULL; - } - return (pmd_t *)__pgd_page(*pgd) + address; -} extern inline void pte_free_kernel(pte_t *pte) { @@ -142,7 +147,7 @@ extern inline pte_t *pte_alloc_kernel(pmd_t *pmd, unsigned long address) { - return pte_alloc(pmd, address); + return pte_alloc(&init_mm,pmd, address); } extern inline void pmd_free_kernel(pmd_t *pmd) @@ -152,7 +157,7 @@ extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address) { - return pmd_alloc(pgd, address); + return pmd_alloc(&init_mm,pgd, address); } extern inline void pgd_free(pgd_t *pgd) @@ -168,6 +173,11 @@ return pgd; } + +#define pmd_populate(MM, PMD, PTE) pmd_set(PMD, PTE) +#define pgd_populate(MM, PGD, PMD) pgd_set(PGD, PMD) + + extern int do_check_pgt_cache(int, int); extern inline void set_pgdir(unsigned long address, pgd_t entry) @@ -238,19 +248,6 @@ __flush_tlb(); } -extern inline void flush_tlb_kernel_page(unsigned long addr) -{ - if (CPU_IS_040_OR_060) { - mm_segment_t old_fs = get_fs(); - set_fs(KERNEL_DS); - __asm__ __volatile__(".chip 68040\n\t" - "pflush (%0)\n\t" - ".chip 68k" - : : "a" (addr)); - set_fs(old_fs); - } else - __asm__ __volatile__("pflush #4,#4,(%0)" : : "a" (addr)); -} extern inline void flush_tlb_pgtables(struct mm_struct *mm, unsigned long start, unsigned long end) diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/openprom.h linux/include/asm-m68k/openprom.h --- v2.4.5/linux/include/asm-m68k/openprom.h Fri Nov 12 04:29:47 1999 +++ linux/include/asm-m68k/openprom.h Tue Jun 5 18:27:20 2001 @@ -89,7 +89,7 @@ int *fd_stdout; }; -#ifdef CONFIG_SUN3 +#if defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) struct linux_romvec { char *pv_initsp; int (*pv_startmon)(void); @@ -173,12 +173,15 @@ void (*pv_halt)(void); unsigned char *pv_memorybitmap; + +#ifdef CONFIG_SUN3 void (*pv_setctxt)(int ctxt, char *va, int pmeg); void (*pv_vector_cmd)(void); int dummy1z; int dummy2z; int dummy3z; int dummy4z; +#endif }; #else /* The top level PROM vector. */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/parport.h linux/include/asm-m68k/parport.h --- v2.4.5/linux/include/asm-m68k/parport.h Mon Nov 27 17:11:26 2000 +++ linux/include/asm-m68k/parport.h Tue Jun 5 18:27:20 2001 @@ -11,6 +11,9 @@ #ifndef _ASM_M68K_PARPORT_H #define _ASM_M68K_PARPORT_H 1 +#define insl(port,buf,len) isa_insb(port,buf,(len)<<2) +#define outsl(port,buf,len) isa_outsb(port,buf,(len)<<2) + /* no dma, or IRQ autoprobing */ static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma); static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma) diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/pgalloc.h linux/include/asm-m68k/pgalloc.h --- v2.4.5/linux/include/asm-m68k/pgalloc.h Tue Dec 5 12:43:48 2000 +++ linux/include/asm-m68k/pgalloc.h Tue Jun 5 18:27:20 2001 @@ -105,14 +105,14 @@ } /* Push the page at kernel virtual address and clear the icache */ +/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ #define flush_page_to_ram(page) __flush_page_to_ram((unsigned long) page_address(page)) extern inline void __flush_page_to_ram(unsigned long address) { if (CPU_IS_040_OR_060) { __asm__ __volatile__("nop\n\t" ".chip 68040\n\t" - "cpushp %%dc,(%0)\n\t" - "cinvp %%ic,(%0)\n\t" + "cpushp %%bc,(%0)\n\t" ".chip 68k" : : "a" (__pa((void *)address))); } else { @@ -128,6 +128,7 @@ #define flush_dcache_page(page) do { } while (0) /* Push n pages at kernel virtual address and clear the icache */ +/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */ extern inline void flush_icache_range (unsigned long address, unsigned long endaddr) { @@ -137,8 +138,7 @@ while (--n >= 0) { __asm__ __volatile__("nop\n\t" ".chip 68040\n\t" - "cpushp %%dc,(%0)\n\t" - "cinvp %%ic,(%0)\n\t" + "cpushp %%bc,(%0)\n\t" ".chip 68k" : : "a" (virt_to_phys((void *)address))); address += PAGE_SIZE; diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/q40_keyboard.h linux/include/asm-m68k/q40_keyboard.h --- v2.4.5/linux/include/asm-m68k/q40_keyboard.h Mon Nov 27 17:57:34 2000 +++ linux/include/asm-m68k/q40_keyboard.h Tue Jun 5 18:27:20 2001 @@ -1,11 +1,7 @@ /* * linux/include/asm-m68k/q40_keyboard.h * - * Created - */ - -/* - * This file contains the Q40 specific keyboard definitions + * Q40 specific keyboard definitions */ @@ -23,23 +19,12 @@ char raw_mode); extern char q40kbd_unexpected_up(unsigned char keycode); extern void q40kbd_leds(unsigned char leds); +extern int q40kbd_is_sysrq(unsigned char keycode); extern void q40kbd_init_hw(void); extern unsigned char q40kbd_sysrq_xlate[128]; -#if 0 -#define kbd_setkeycode q40kbd_setkeycode -#define kbd_getkeycode q40kbd_getkeycode -#define kbd_pretranslate q40kbd_pretranslate -#define kbd_translate q40kbd_translate -#define kbd_unexpected_up q40kbd_unexpected_up -#define kbd_leds q40kbd_leds -#define kbd_init_hw q40kbd_init_hw -#define kbd_sysrq_xlate q40kbd_sysrq_xlate - -#define SYSRQ_KEY 0x54 -#endif #endif /* __KERNEL__ */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/q40_master.h linux/include/asm-m68k/q40_master.h --- v2.4.5/linux/include/asm-m68k/q40_master.h Mon Nov 27 17:11:26 2000 +++ linux/include/asm-m68k/q40_master.h Tue Jun 5 18:27:20 2001 @@ -6,7 +6,7 @@ #ifndef _Q40_MASTER_H #define _Q40_MASTER_H -#include +#include #define q40_master_addr 0xff000000 @@ -17,6 +17,10 @@ #define KEYCODE_REG 0x1c /* value of received scancode */ #define DISPLAY_CONTROL_REG 0x18 #define FRAME_CLEAR_REG 0x24 +#define LED_REG 0x30 + +#define Q40_LED_ON() master_outb(1,LED_REG) +#define Q40_LED_OFF() master_outb(0,LED_REG) #define INTERRUPT_REG IIRQ_REG /* "native" ints */ #define KEY_IRQ_ENABLE_REG 0x08 /**/ @@ -35,13 +39,10 @@ #endif #define EXT_ENABLE_REG 0x10 /* ... rest of the ISA ints ... */ -#if 0 -#define master_inb(_reg_) (*(((unsigned char *)q40_master_addr)+_reg_)) -#define master_outb(_b_,_reg_) (*(((unsigned char *)q40_master_addr)+_reg_)=(_b_)) -#else -#define master_inb(_reg_) native_inb((unsigned char *)q40_master_addr+_reg_) -#define master_outb(_b_,_reg_) native_outb(_b_,(unsigned char *)q40_master_addr+_reg_) -#endif + +#define master_inb(_reg_) in_8((unsigned char *)q40_master_addr+_reg_) +#define master_outb(_b_,_reg_) out_8((unsigned char *)q40_master_addr+_reg_,_b_) + /* define some Q40 specific ints */ #include "q40ints.h" diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/raw_io.h linux/include/asm-m68k/raw_io.h --- v2.4.5/linux/include/asm-m68k/raw_io.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-m68k/raw_io.h Tue Jun 5 18:27:20 2001 @@ -0,0 +1,242 @@ +/* + * linux/include/asm-m68k/io_native.h + * + * 10/20/00 RZ: - created from bits of io.h and ide.h to cleanup namespace + * + */ + +#ifndef _RAW_IO_H +#define _RAW_IO_H + +#ifdef __KERNEL__ + + +/* ++roman: The assignments to temp. vars avoid that gcc sometimes generates + * two accesses to memory, which may be undesirable for some devices. + */ +#define in_8(addr) \ + ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; }) +#define in_be16(addr) \ + ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; }) +#define in_be32(addr) \ + ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; }) + +#define out_8(addr,b) (void)((*(volatile unsigned char *) (addr)) = (b)) +#define out_be16(addr,b) (void)((*(volatile unsigned short *) (addr)) = (b)) +#define out_be32(addr,b) (void)((*(volatile unsigned int *) (addr)) = (b)) + +#define raw_inb in_8 +#define raw_inw in_be16 +#define raw_inl in_be32 + +#define raw_outb(val,port) out_8((port),(val)) +#define raw_outw(val,port) out_be16((port),(val)) +#define raw_outl(val,port) out_be32((port),(val)) + +#define raw_insb(port, buf, len) ({ \ + volatile unsigned char *_port = (volatile unsigned char *) (port); \ + unsigned char *_buf =(unsigned char *)(buf); \ + unsigned int _i,_len=(unsigned int)(len); \ + for(_i=0; _i< _len; _i++) \ + *_buf++=in_8(_port); \ + }) + +#define raw_outsb(port, buf, len) ({ \ + volatile unsigned char *_port = (volatile unsigned char *) (port); \ + unsigned char *_buf =(unsigned char *)(buf); \ + unsigned int _i,_len=(unsigned int)(len); \ + for( _i=0; _i< _len; _i++) \ + out_8(_port,*_buf++); \ + }) + + +#define raw_insw(port, buf, nr) ({ \ + volatile unsigned char *_port = (volatile unsigned char *) (port); \ + unsigned char *_buf = (unsigned char *)(buf); \ + unsigned int _nr = (unsigned int)(nr); \ + unsigned long _tmp; \ + \ + if (_nr & 15) { \ + _tmp = (_nr & 15) - 1; \ + asm volatile ( \ + "1: movew %2@,%0@+; dbra %1,1b" \ + : "=a" (_buf), "=d" (_tmp) \ + : "a" (_port), "0" (_buf), \ + "1" (_tmp)); \ + } \ + if (_nr >> 4) { \ + _tmp = (_nr >> 4) - 1; \ + asm volatile ( \ + "1: " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "movew %2@,%0@+; " \ + "dbra %1,1b" \ + : "=a" (_buf), "=d" (_tmp) \ + : "a" (_port), "0" (_buf), \ + "1" (_tmp)); \ + } \ +}) + +#define raw_outsw(port, buf, nr) ({ \ + volatile unsigned char *_port = (volatile unsigned char *) (port); \ + unsigned char *_buf = (unsigned char *)(buf); \ + unsigned int _nr = (unsigned int)(nr); \ + unsigned long _tmp; \ + \ + if (_nr & 15) { \ + _tmp = (_nr & 15) - 1; \ + asm volatile ( \ + "1: movew %0@+,%2@; dbra %1,1b" \ + : "=a" (_buf), "=d" (_tmp) \ + : "a" (_port), "0" (_buf), \ + "1" (_tmp)); \ + } \ + if (_nr >> 4) { \ + _tmp = (_nr >> 4) - 1; \ + asm volatile ( \ + "1: " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "movew %0@+,%2@; " \ + "dbra %1,1b" \ + : "=a" (_buf), "=d" (_tmp) \ + : "a" (_port), "0" (_buf), \ + "1" (_tmp)); \ + } \ +}) + + +#define raw_insw_swapw(port, buf, nr) \ +({ if ((nr) % 8) \ + __asm__ __volatile__ \ + ("movel %0,%/a0; \ + movel %1,%/a1; \ + movel %2,%/d6; \ + subql #1,%/d6; \ + 1:movew %/a0@,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a1@+; \ + dbra %/d6,1b" \ + : \ + : "g" (port), "g" (buf), "g" (nr) \ + : "d0", "a0", "a1", "d6"); \ + else \ + __asm__ __volatile__ \ + ("movel %0,%/a0; \ + movel %1,%/a1; \ + movel %2,%/d6; \ + lsrl #3,%/d6; \ + subql #1,%/d6; \ + 1:movew %/a0@,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a1@+; \ + movew %/a0@,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a1@+; \ + movew %/a0@,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a1@+; \ + movew %/a0@,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a1@+; \ + movew %/a0@,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a1@+; \ + movew %/a0@,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a1@+; \ + movew %/a0@,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a1@+; \ + movew %/a0@,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a1@+; \ + dbra %/d6,1b" \ + : \ + : "g" (port), "g" (buf), "g" (nr) \ + : "d0", "a0", "a1", "d6"); \ +}) + + +#define raw_outsw_swapw(port, buf, nr) \ +({ if ((nr) % 8) \ + __asm__ __volatile__ \ + ("movel %0,%/a0; \ + movel %1,%/a1; \ + movel %2,%/d6; \ + subql #1,%/d6; \ + 1:movew %/a1@+,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a0@; \ + dbra %/d6,1b" \ + : \ + : "g" (port), "g" (buf), "g" (nr) \ + : "d0", "a0", "a1", "d6"); \ + else \ + __asm__ __volatile__ \ + ("movel %0,%/a0; \ + movel %1,%/a1; \ + movel %2,%/d6; \ + lsrl #3,%/d6; \ + subql #1,%/d6; \ + 1:movew %/a1@+,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a0@; \ + movew %/a1@+,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a0@; \ + movew %/a1@+,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a0@; \ + movew %/a1@+,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a0@; \ + movew %/a1@+,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a0@; \ + movew %/a1@+,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a0@; \ + movew %/a1@+,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a0@; \ + movew %/a1@+,%/d0; \ + rolw #8,%/d0; \ + movew %/d0,%/a0@; \ + dbra %/d6,1b" \ + : \ + : "g" (port), "g" (buf), "g" (nr) \ + : "d0", "a0", "a1", "d6"); \ +}) + + +#endif /* __KERNEL__ */ + +#endif /* _RAW_IO_H */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/rtc.h linux/include/asm-m68k/rtc.h --- v2.4.5/linux/include/asm-m68k/rtc.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-m68k/rtc.h Tue Jun 5 18:27:20 2001 @@ -0,0 +1,49 @@ +/* asm-m68k/rtc.h + * + * Copyright Richard Zidlicky + * implementation details for genrtc/q40rtc driver + */ +/* permission is hereby granted to copy, modify and redistribute this code + * in terms of the GNU Library General Public License, Version 2 or later, + * at your option. + */ + +#ifndef _ASM_RTC_H +#define _ASM_RTC_H + +#ifdef __KERNEL__ + +#include + +struct hwclk_time { + unsigned sec; /* 0..59 */ + unsigned min; /* 0..59 */ + unsigned hour; /* 0..23 */ + unsigned day; /* 1..31 */ + unsigned mon; /* 0..11 */ + unsigned year; /* 70... */ + int wday; /* 0..6, 0 is Sunday, -1 means unknown/don't set */ +}; + +/* a few implementation details for the emulation : */ + +extern unsigned gen_rtc_irq_flags; /* which sort(s) of interrupts caused int */ +extern unsigned gen_rtc_irq_ctrl; /* are enabled */ +extern short q40rtc_oldsecs; + +#define RTC_PIE 0x40 /* periodic interrupt enable */ +#define RTC_AIE 0x20 /* alarm interrupt enable */ +#define RTC_UIE 0x10 /* update-finished interrupt enable */ + +extern void gen_rtc_interrupt(unsigned long); + +/* some dummy definitions */ +#define RTC_SQWE 0x08 /* enable square-wave output */ +#define RTC_DM_BINARY 0x04 /* all time/date values are BCD if clear */ +#define RTC_24H 0x02 /* 24 hour mode - else hours bit 7 means pm */ +#define RTC_DST_EN 0x01 /* auto switch DST - works f. USA only */ + + +#endif /* __KERNEL__ */ + +#endif /* _ASM__RTC_H */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/sbus.h linux/include/asm-m68k/sbus.h --- v2.4.5/linux/include/asm-m68k/sbus.h Sat Sep 4 13:06:41 1999 +++ linux/include/asm-m68k/sbus.h Tue Jun 5 18:27:20 2001 @@ -17,4 +17,27 @@ #define ARCH_SUN4 0 +/* sbus IO functions stolen from include/asm-sparc/io.h for the serial driver */ +/* No SBUS on the Sun3, kludge -- sam */ + +extern inline void _sbus_writeb(unsigned char val, unsigned long addr) +{ + *(volatile unsigned char *)addr = val; +} + +extern inline unsigned char _sbus_readb(unsigned long addr) +{ + return *(volatile unsigned char *)addr; +} + +extern inline void _sbus_writel(unsigned long val, unsigned long addr) +{ + *(volatile unsigned long *)addr = val; + +} + +#define sbus_readb(a) _sbus_readb((unsigned long)a) +#define sbus_writeb(v, a) _sbus_writeb(v, (unsigned long)a) +#define sbus_writel(v, a) _sbus_writel(v, (unsigned long)a) + #endif diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/serial.h linux/include/asm-m68k/serial.h --- v2.4.5/linux/include/asm-m68k/serial.h Wed Apr 18 11:49:13 2001 +++ linux/include/asm-m68k/serial.h Tue Jun 5 18:27:20 2001 @@ -7,11 +7,6 @@ */ #include -#if 0 -#define rs_init serial_rs_init -#define register_serial serial_register_serial -#define unregister_serial serial_unregister_serial -#endif /* * This assumes you have a 1.8432 MHz clock for your UART. diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/string.h linux/include/asm-m68k/string.h --- v2.4.5/linux/include/asm-m68k/string.h Thu Apr 27 15:55:09 2000 +++ linux/include/asm-m68k/string.h Tue Jun 5 18:27:20 2001 @@ -80,8 +80,9 @@ return( (char *) s); } +#if 0 #define __HAVE_ARCH_STRPBRK -static inline char * strpbrk(const char * cs,const char * ct) +extern inline char * strpbrk(const char * cs,const char * ct) { const char *sc1,*sc2; @@ -91,7 +92,9 @@ return((char *) sc1); return( NULL ); } +#endif +#if 0 #define __HAVE_ARCH_STRSPN static inline size_t strspn(const char *s, const char *accept) { @@ -112,9 +115,11 @@ return count; } +#endif +#if 0 #define __HAVE_ARCH_STRTOK -static inline char * strtok(char * s,const char * ct) +extern inline char * strtok(char * s,const char * ct) { char *sbegin, *send; @@ -133,6 +138,7 @@ ___strtok = send; return (sbegin); } +#endif /* strstr !! */ @@ -318,7 +324,7 @@ #ifdef CPU_M68040_OR_M68060_ONLY if (((unsigned long) s) & 0x0f) - memset(s, c, count); + __memset_g(s, c, count); else{ *((unsigned long *)(s))++ = data; *((unsigned long *)(s))++ = data; @@ -356,6 +362,8 @@ return xs; } +extern void *memset(void *,int,__kernel_size_t); + #define __memset_const(s,c,count) \ ((count==PAGE_SIZE) ? \ __memset_page((s),(c),(count)) : \ @@ -364,7 +372,7 @@ #define memset(s, c, count) \ (__builtin_constant_p(count) ? \ __memset_const((s),(c),(count)) : \ - memset((s),(c),(count))) + __memset_g((s),(c),(count))) #define __HAVE_ARCH_MEMCPY /* @@ -541,5 +549,15 @@ (__builtin_constant_p(n) ? \ __builtin_memcmp((cs),(ct),(n)) : \ memcmp((cs),(ct),(n))) + +#define __HAVE_ARCH_MEMCHR +extern inline void * memchr(const void * cs, int c, size_t count) { + /* Someone else can optimize this, I don't care - tonym@mac.linux-m68k.org */ + unsigned char *ret = (unsigned char *)cs; + for(;count>0;count--,ret++) + if(*ret == c) return ret; + + return NULL; +} #endif /* _M68K_STRING_H_ */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/sun3_pgalloc.h linux/include/asm-m68k/sun3_pgalloc.h --- v2.4.5/linux/include/asm-m68k/sun3_pgalloc.h Mon Apr 23 15:28:07 2001 +++ linux/include/asm-m68k/sun3_pgalloc.h Tue Jun 5 18:27:21 2001 @@ -74,46 +74,30 @@ return (pmd_t *) pgd; } +#define pmd_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); }) +#define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); }) + extern inline void pte_free(pte_t * pte) { free_page((unsigned long) pte); } -extern inline pte_t * pte_alloc(pmd_t * pmd, unsigned long address) -{ - address = (address >> (PAGE_SHIFT-2)) & 4*(PTRS_PER_PTE - 1); - -repeat: - if (pmd_none(*pmd)) - goto getnew; - if (pmd_bad(*pmd)) - goto fix; - return (pte_t *) (__pmd_page(*pmd) + address); - -getnew: +static inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address) { unsigned long page = __get_free_page(GFP_KERNEL); - if (!pmd_none(*pmd)) - goto freenew; + if (!page) - goto oom; + return NULL; + memset((void *)page, 0, PAGE_SIZE); // pmd_val(*pmd) = SUN3_PMD_MAGIC + __pa(page); - pmd_val(*pmd) = __pa(page); - return (pte_t *) (page + address); -freenew: - free_page(page); - goto repeat; +/* pmd_val(*pmd) = __pa(page); */ + return (pte_t *) (page); } -fix: - printk(bad_pmd_string, pmd_val(*pmd)); - printk("in normal pgd offset %08x\n", (unsigned int)pmd); -oom: -// pmd_val(*pmd) = SUN3_PMD_MAGIC + __pa(BAD_PAGETABLE); - pmd_val(*pmd) = __pa(BAD_PAGETABLE); - return NULL; -} +#define pte_alloc_one_fast(mm,addr) pte_alloc_one(mm,addr) + +#define pmd_populate(mm, pmd, pte) (pmd_val(*pmd) = __pa((unsigned long)pte)) /* * allocating and freeing a pmd is trivial: the 1-entry pmd is @@ -124,11 +108,6 @@ pmd_val(*pmd) = 0; } -extern inline pmd_t * pmd_alloc(pgd_t * pgd, unsigned long address) -{ - return (pmd_t *) pgd; -} - extern inline void pgd_free(pgd_t * pgd) { free_page((unsigned long) pgd); @@ -143,6 +122,8 @@ memset(new_pgd, 0, (PAGE_OFFSET >> PGDIR_SHIFT)); return new_pgd; } + +#define pgd_populate(mm, pmd, pte) BUG() /* FIXME: the sun3 doesn't have a page table cache! (but the motorola routine should just return 0) */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/sun3_pgtable.h linux/include/asm-m68k/sun3_pgtable.h --- v2.4.5/linux/include/asm-m68k/sun3_pgtable.h Mon Nov 27 18:00:49 2000 +++ linux/include/asm-m68k/sun3_pgtable.h Tue Jun 5 18:27:21 2001 @@ -135,12 +135,13 @@ extern inline int pmd_bad2 (pmd_t *pmd) { return 0; } #define pmd_bad(pmd) pmd_bad2(&(pmd)) extern inline int pmd_present2 (pmd_t *pmd) { return pmd_val (*pmd) & SUN3_PMD_VALID; } -#define pmd_present(pmd) pmd_present2(&(pmd)) +/* #define pmd_present(pmd) pmd_present2(&(pmd)) */ +#define pmd_present(pmd) (!pmd_none2(&(pmd))) extern inline void pmd_clear (pmd_t *pmdp) { pmd_val (*pmdp) = 0; } extern inline int pgd_none (pgd_t pgd) { return 0; } extern inline int pgd_bad (pgd_t pgd) { return 0; } -extern inline int pgd_present (pgd_t pgd) { return 0; } +extern inline int pgd_present (pgd_t pgd) { return 1; } extern inline void pgd_clear (pgd_t *pgdp) {} diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/sun3ints.h linux/include/asm-m68k/sun3ints.h --- v2.4.5/linux/include/asm-m68k/sun3ints.h Fri Nov 12 04:29:47 1999 +++ linux/include/asm-m68k/sun3ints.h Tue Jun 5 18:27:21 2001 @@ -26,5 +26,15 @@ void (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id ); +extern void sun3_init_IRQ (void); +extern void (*sun3_default_handler[]) (int, void *, struct pt_regs *); +extern void (*sun3_inthandler[]) (int, void *, struct pt_regs *); +extern void sun3_free_irq (unsigned int irq, void *dev_id); +extern void sun3_enable_interrupts (void); +extern void sun3_disable_interrupts (void); +extern int sun3_get_irq_list(char *buf); +extern void sun3_process_int(int, struct pt_regs *); +extern volatile unsigned char* sun3_intreg; + #endif /* SUN3INTS_H */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/sun3x.h linux/include/asm-m68k/sun3x.h --- v2.4.5/linux/include/asm-m68k/sun3x.h Tue May 11 09:57:14 1999 +++ linux/include/asm-m68k/sun3x.h Tue Jun 5 18:27:21 2001 @@ -15,6 +15,9 @@ #define SUN3X_VIDEO_P4ID 0x50300000 #define SUN3X_ESP_BASE 0x66000000 #define SUN3X_ESP_DMA 0x66001000 +#define SUN3X_FDC 0x6e000000 +#define SUN3X_FDC_FCR 0x6e000400 +#define SUN3X_FDC_FVR 0x6e000800 /* some NVRAM addresses */ #define SUN3X_EEPROM_CONS (SUN3X_EEPROM + 0x1f) diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/sun3xflop.h linux/include/asm-m68k/sun3xflop.h --- v2.4.5/linux/include/asm-m68k/sun3xflop.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-m68k/sun3xflop.h Tue Jun 5 18:27:21 2001 @@ -0,0 +1,263 @@ +/* sun3xflop.h: Sun3/80 specific parts of the floppy driver. + * + * Derived partially from asm-sparc/floppy.h, which is: + * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) + * + * Sun3x version 2/4/2000 Sam Creasey (sammy@oh.verio.com) + */ + +#ifndef __ASM_SUN3X_FLOPPY_H +#define __ASM_SUN3X_FLOPPY_H + +#include +#include +#include +#include +#include + +/* default interrupt vector */ +#define SUN3X_FDC_IRQ 0x40 + +/* some constants */ +#define FCR_TC 0x1 +#define FCR_EJECT 0x2 +#define FCR_MTRON 0x4 +#define FCR_DSEL1 0x8 +#define FCR_DSEL0 0x10 + +/* We don't need no stinkin' I/O port allocation crap. */ +#undef release_region +#undef check_region +#undef request_region +#define release_region(X, Y) do { } while(0) +#define check_region(X, Y) (0) +#define request_region(X, Y, Z) (1) + +struct sun3xflop_private { + volatile unsigned char *status_r; + volatile unsigned char *data_r; + volatile unsigned char *fcr_r; + volatile unsigned char *fvr_r; + unsigned char fcr; +} sun3x_fdc; + +/* Super paranoid... */ +#undef HAVE_DISABLE_HLT + +/* Routines unique to each controller type on a Sun. */ +static unsigned char sun3x_82072_fd_inb(int port) +{ + static int once = 0; +// udelay(5); + switch(port & 7) { + default: + printk("floppy: Asked to read unknown port %d\n", port); + panic("floppy: Port bolixed."); + case 4: /* FD_STATUS */ + return (*sun3x_fdc.status_r) & ~STATUS_DMA; + case 5: /* FD_DATA */ + return (*sun3x_fdc.data_r); + case 7: /* FD_DIR */ + /* ugly hack, I can't find a way to actually detect the disk */ + if(!once) { + once = 1; + return 0x80; + } + return 0; + }; + panic("sun_82072_fd_inb: How did I get here?"); +} + +static void sun3x_82072_fd_outb(unsigned char value, int port) +{ +// udelay(5); + switch(port & 7) { + default: + printk("floppy: Asked to write to unknown port %d\n", port); + panic("floppy: Port bolixed."); + case 2: /* FD_DOR */ + /* Oh geese, 82072 on the Sun has no DOR register, + * so we make do with taunting the FCR. + * + * ASSUMPTIONS: There will only ever be one floppy + * drive attached to a Sun controller + * and it will be at drive zero. + */ + + { + unsigned char fcr = sun3x_fdc.fcr; + + if(value & 0x10) { + fcr |= (FCR_DSEL0 | FCR_MTRON); + } else + fcr &= ~(FCR_DSEL0 | FCR_MTRON); + + + if(fcr != sun3x_fdc.fcr) { + *(sun3x_fdc.fcr_r) = fcr; + sun3x_fdc.fcr = fcr; + } + } + break; + case 5: /* FD_DATA */ + *(sun3x_fdc.data_r) = value; + break; + case 7: /* FD_DCR */ + *(sun3x_fdc.status_r) = value; + break; + case 4: /* FD_STATUS */ + *(sun3x_fdc.status_r) = value; + break; + }; + return; +} + + +asmlinkage void sun3xflop_hardint(int irq, void *dev_id, struct pt_regs * regs) +{ + register unsigned char st; + +#undef TRACE_FLPY_INT +#define NO_FLOPPY_ASSEMBLER + +#ifdef TRACE_FLPY_INT + static int calls=0; + static int bytes=0; + static int dma_wait=0; +#endif + if(!doing_pdma) { + floppy_interrupt(irq, dev_id, regs); + return; + } + +// printk("doing pdma\n");// st %x\n", sun_fdc->status_82072); + +#ifdef TRACE_FLPY_INT + if(!calls) + bytes = virtual_dma_count; +#endif + + { + register int lcount; + register char *lptr; + + for(lcount=virtual_dma_count, lptr=virtual_dma_addr; + lcount; lcount--, lptr++) { +// st=fd_inb(virtual_dma_port+4) & 0x80 ; + st = *(sun3x_fdc.status_r); +// if(st != 0xa0) +// break; + + if((st & 0x80) == 0) { + virtual_dma_count = lcount; + virtual_dma_addr = lptr; + return; + } + + if((st & 0x20) == 0) + break; + + if(virtual_dma_mode) +// fd_outb(*lptr, virtual_dma_port+5); + *(sun3x_fdc.data_r) = *lptr; + else +// *lptr = fd_inb(virtual_dma_port+5); + *lptr = *(sun3x_fdc.data_r); + } + + virtual_dma_count = lcount; + virtual_dma_addr = lptr; +// st = fd_inb(virtual_dma_port+4); + st = *(sun3x_fdc.status_r); + } + +#ifdef TRACE_FLPY_INT + calls++; +#endif +// printk("st=%02x\n", st); + if(st == 0x20) + return; + if(!(st & 0x20)) { + virtual_dma_residue += virtual_dma_count; + virtual_dma_count=0; + doing_pdma = 0; + +#ifdef TRACE_FLPY_INT + printk("count=%x, residue=%x calls=%d bytes=%x dma_wait=%d\n", + virtual_dma_count, virtual_dma_residue, calls, bytes, + dma_wait); + calls = 0; + dma_wait=0; +#endif + + floppy_interrupt(irq, dev_id, regs); + return; + } + + +#ifdef TRACE_FLPY_INT + if(!virtual_dma_count) + dma_wait++; +#endif +} + +static int sun3xflop_request_irq(void) +{ + static int once = 0; + int error; + + if(!once) { + once = 1; + error = request_irq(FLOPPY_IRQ, sun3xflop_hardint, SA_INTERRUPT, "floppy", 0); + return ((error == 0) ? 0 : -1); + } else return 0; +} + +static void __init floppy_set_flags(int *ints,int param, int param2); + +static int sun3xflop_init(void) +{ + if(FLOPPY_IRQ < 0x40) + FLOPPY_IRQ = SUN3X_FDC_IRQ; + + sun3x_fdc.status_r = (volatile unsigned char *)SUN3X_FDC; + sun3x_fdc.data_r = (volatile unsigned char *)(SUN3X_FDC+1); + sun3x_fdc.fcr_r = (volatile unsigned char *)SUN3X_FDC_FCR; + sun3x_fdc.fvr_r = (volatile unsigned char *)SUN3X_FDC_FVR; + sun3x_fdc.fcr = 0; + + /* Last minute sanity check... */ + if(*sun3x_fdc.status_r == 0xff) { + return -1; + } + + *sun3x_fdc.fvr_r = FLOPPY_IRQ; + + *sun3x_fdc.fcr_r = FCR_TC; + udelay(10); + *sun3x_fdc.fcr_r = 0; + + /* Success... */ + floppy_set_flags(0, 1, FD_BROKEN_DCL); // I don't know how to detect this. + allowed_drive_mask = 0x01; + return (int) SUN3X_FDC; +} + +/* I'm not precisely sure this eject routine works */ +static int sun3x_eject(void) +{ + if(MACH_IS_SUN3X) { + + sun3x_fdc.fcr |= (FCR_DSEL0 | FCR_EJECT); + *(sun3x_fdc.fcr_r) = sun3x_fdc.fcr; + udelay(10); + sun3x_fdc.fcr &= ~(FCR_DSEL0 | FCR_EJECT); + *(sun3x_fdc.fcr_r) = sun3x_fdc.fcr; + } + + return 0; +} + +#define fd_eject(drive) sun3x_eject() + +#endif /* !(__ASM_SUN3X_FLOPPY_H) */ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/sun3xprom.h linux/include/asm-m68k/sun3xprom.h --- v2.4.5/linux/include/asm-m68k/sun3xprom.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-m68k/sun3xprom.h Tue Jun 5 18:27:21 2001 @@ -0,0 +1,43 @@ +/* Useful PROM locations */ + +#ifndef SUN3X_PROM_H +#define SUN3X_PROM_H + +extern void (*sun3x_putchar)(int); +extern int (*sun3x_getchar)(void); +extern int (*sun3x_mayget)(void); +extern int (*sun3x_mayput)(int); + +void sun3x_reboot(void); +void sun3x_abort(void); +void sun3x_prom_init(void); +unsigned long sun3x_prom_ptov(unsigned long pa, unsigned long size); + +/* interesting hardware locations */ +#define SUN3X_IOMMU 0x60000000 +#define SUN3X_ENAREG 0x61000000 +#define SUN3X_INTREG 0x61001400 +#define SUN3X_DIAGREG 0x61001800 +#define SUN3X_ZS1 0x62000000 +#define SUN3X_ZS2 0x62002000 +#define SUN3X_LANCE 0x65002000 +#define SUN3X_EEPROM 0x64000000 +#define SUN3X_IDPROM 0x640007d8 +#define SUN3X_VIDEO_BASE 0x50400000 +#define SUN3X_VIDEO_REGS 0x50300000 + +/* vector table */ +#define SUN3X_PROM_BASE 0xfefe0000 +#define SUN3X_P_GETCHAR (SUN3X_PROM_BASE + 20) +#define SUN3X_P_PUTCHAR (SUN3X_PROM_BASE + 24) +#define SUN3X_P_MAYGET (SUN3X_PROM_BASE + 28) +#define SUN3X_P_MAYPUT (SUN3X_PROM_BASE + 32) +#define SUN3X_P_REBOOT (SUN3X_PROM_BASE + 96) +#define SUN3X_P_SETLEDS (SUN3X_PROM_BASE + 144) +#define SUN3X_P_ABORT (SUN3X_PROM_BASE + 152) + +/* mapped area */ +#define SUN3X_MAP_START 0xfee00000 +#define SUN3X_MAP_END 0xff000000 + +#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/system.h linux/include/asm-m68k/system.h --- v2.4.5/linux/include/asm-m68k/system.h Mon Nov 27 18:00:49 2000 +++ linux/include/asm-m68k/system.h Tue Jun 5 18:27:21 2001 @@ -52,9 +52,9 @@ #define __sti() asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory") #else #include -#define __sti() ({ \ - if (!local_irq_count(smp_processor_id())) \ - asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory"); \ +#define __sti() ({ \ + if (MACH_IS_Q40 || !local_irq_count(smp_processor_id())) \ + asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory"); \ }) #endif #define __cli() asm volatile ("oriw #0x0700,%%sr": : : "memory") diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/termios.h linux/include/asm-m68k/termios.h --- v2.4.5/linux/include/asm-m68k/termios.h Sat Feb 3 20:00:45 2001 +++ linux/include/asm-m68k/termios.h Tue Jun 5 18:11:41 2001 @@ -65,6 +65,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-m68k/zorro.h linux/include/asm-m68k/zorro.h --- v2.4.5/linux/include/asm-m68k/zorro.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-m68k/zorro.h Tue Jun 5 18:27:21 2001 @@ -0,0 +1,18 @@ +#ifndef _ASM_ZORRO_H +#define _ASM_ZORRO_H +#include + +#define z_readb raw_inb +#define z_readw raw_inw +#define z_readl raw_inl + +#define z_writeb raw_outb +#define z_writew raw_outw +#define z_writel raw_outl + +#define z_memset_io(a,b,c) memset((void *)(a),(b),(c)) +#define z_memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) +#define z_memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) + + +#endif /* _ASM_ZORRO_H */ diff -u --recursive --new-file v2.4.5/linux/include/asm-mips/linux_logo.h linux/include/asm-mips/linux_logo.h --- v2.4.5/linux/include/asm-mips/linux_logo.h Sat May 13 08:31:25 2000 +++ linux/include/asm-mips/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -24,918 +24,897 @@ #define linux_logo_banner "Linux/MIPS version " UTS_RELEASE -#define LINUX_LOGO_COLORS 212 +#define __HAVE_ARCH_LINUX_LOGO + +#define LINUX_LOGO_COLORS 187 #ifdef INCLUDE_LINUX_LOGO_DATA unsigned char linux_logo_red[] __initdata = { - 0x03, 0x82, 0xE9, 0xBF, 0x42, 0xC9, 0x7E, 0xC0, - 0xE9, 0xE3, 0xC2, 0x24, 0xA4, 0x65, 0xEC, 0xC4, - 0x82, 0x9F, 0xF3, 0x12, 0x5F, 0xA0, 0xC2, 0xED, - 0x3E, 0xD5, 0xDB, 0xA0, 0x1C, 0xF4, 0xEB, 0xA4, - 0xCD, 0x0A, 0x9A, 0x51, 0xCC, 0xBE, 0xC0, 0xBA, - 0x74, 0xDC, 0xAA, 0xF6, 0xD3, 0xC5, 0xE6, 0x26, - 0xC2, 0x83, 0x38, 0xEA, 0x49, 0xB0, 0xED, 0xE5, - 0xF4, 0x96, 0x96, 0x1B, 0xFA, 0xCC, 0xF2, 0x0F, - 0xCD, 0xE5, 0xF4, 0xD3, 0x50, 0x7A, 0xB5, 0xDE, - 0xD5, 0xB6, 0x60, 0x0A, 0x6A, 0xEA, 0xD4, 0xEB, - 0xC1, 0xCA, 0xEA, 0xEC, 0x2A, 0x96, 0x95, 0xDC, - 0xE4, 0xCE, 0xEC, 0x1E, 0xDC, 0x8A, 0xD1, 0xF6, - 0x3C, 0x5E, 0xC6, 0xB4, 0xB2, 0xAC, 0xBA, 0x9E, - 0x0F, 0x59, 0xBA, 0xFA, 0xCC, 0xBF, 0x82, 0xCE, - 0xE6, 0x4F, 0xAA, 0x4C, 0xCA, 0x8E, 0x8E, 0xDF, - 0x2C, 0xB6, 0x3B, 0xDE, 0xCE, 0xEE, 0x46, 0x4A, - 0x6F, 0x7A, 0x82, 0xE4, 0xAA, 0x88, 0xE2, 0xCE, - 0xAE, 0xB6, 0x70, 0xC2, 0x9A, 0xDA, 0x35, 0x9E, - 0x95, 0xC0, 0x7E, 0x8C, 0xC2, 0xB6, 0xCE, 0xB9, - 0xD5, 0xAA, 0xC1, 0xF4, 0xC7, 0xB6, 0xB6, 0xA3, - 0xF2, 0x68, 0xDB, 0x76, 0xDC, 0x57, 0xD3, 0xA8, - 0xC0, 0xEF, 0x46, 0xF4, 0x2F, 0xD7, 0x53, 0x36, - 0xE6, 0xA7, 0xCA, 0xCB, 0x7E, 0xE4, 0x86, 0x9A, - 0xCE, 0x94, 0xB4, 0x1D, 0xDA, 0xCE, 0x6C, 0xE6, - 0x9E, 0xC6, 0xDA, 0x16, 0xFA, 0xAA, 0x56, 0xB6, - 0xFE, 0x6E, 0xEA, 0xCE, 0xE5, 0xCC, 0xDB, 0xD3, - 0xED, 0xDC, 0xF4, 0x72 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x65, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x76, 0x79, + 0x62, 0x36, 0x9a, 0xe2, 0xec, 0xe1, 0xb8, 0xd7, + 0xaf, 0x25, 0xbc, 0xc0, 0xef, 0xea, 0xe8, 0xe8, + 0xf5, 0xf1, 0xda, 0xd3, 0x79, 0xdb, 0xf4, 0xf6, + 0xf6, 0xf6, 0xe2, 0x3d, 0xb4, 0xce, 0xe6, 0xee, + 0xf6, 0x68, 0xd8, 0xec, 0xf5, 0xc6, 0xc8, 0x9c, + 0x89, 0xd2, 0xee, 0xcb, 0xb9, 0xd2, 0x66, 0x5e, + 0x8b, 0xbe, 0xa8, 0xd5, 0xca, 0xb6, 0xae, 0x9c, + 0xc5, 0xbe, 0xbe, 0xca, 0x90, 0xb2, 0x9a, 0xa8, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0x8d, + 0x12, 0x4a, 0x8e, 0xf2, 0xf6, 0xee, 0xb5, 0xe4, + 0xf1, 0x26, 0x9a, 0xea, 0xf6, 0xe0, 0xd2, 0x16, + 0x9a, 0x2e, 0x70, 0xd6, 0x46, 0x7c, 0xb4, 0x62, + 0xd6, 0xa3, 0x74, 0xa7, 0xa2, 0xca, 0xe0, 0xae, + 0xbe, 0xce, 0xa3, 0x8e, 0x6d, 0x8e, 0x32, 0xaf, + 0x50, 0x9e, 0x5b, 0x8a, 0x98, 0x82, 0x7a, 0x82, + 0x56, 0x7c, 0x8a, 0x56, 0x5e, 0x86, 0x6a, 0x52, + 0x59, 0x64, 0x5e, }; unsigned char linux_logo_green[] __initdata = { - 0x03, 0x82, 0xC4, 0x83, 0x42, 0xA2, 0x4A, 0xA4, - 0xE5, 0xA6, 0xC2, 0x24, 0xA4, 0x65, 0xB4, 0x94, - 0x66, 0x87, 0xB6, 0x12, 0x44, 0x6C, 0x96, 0xD4, - 0x36, 0x95, 0xB2, 0x92, 0x0E, 0xF4, 0xBC, 0x77, - 0xA5, 0x0A, 0x92, 0x52, 0xB4, 0x9A, 0x8C, 0xB2, - 0x74, 0xC2, 0x8E, 0xBD, 0xA2, 0xCA, 0xD2, 0x12, - 0xB6, 0x61, 0x24, 0xDA, 0x33, 0x79, 0xCB, 0xAC, - 0xDA, 0x84, 0x7A, 0x1B, 0xFA, 0x8D, 0xBE, 0x06, - 0x93, 0xBB, 0xBC, 0xAB, 0x44, 0x62, 0x83, 0xDA, - 0x9B, 0xA2, 0x4C, 0x04, 0x6A, 0xB6, 0xC8, 0xBD, - 0x8D, 0xB6, 0xAD, 0xEC, 0x2A, 0x68, 0x62, 0x9D, - 0xC4, 0xC4, 0xB4, 0x13, 0xA3, 0x8A, 0xD2, 0xD6, - 0x3C, 0x5D, 0x8C, 0x7E, 0x82, 0xAC, 0x96, 0x7E, - 0x0D, 0x5A, 0xBA, 0xBB, 0xCC, 0xBE, 0x76, 0xB6, - 0xDE, 0x4E, 0x9A, 0x3C, 0xBE, 0x8E, 0x6E, 0xCB, - 0x1C, 0xAA, 0x2E, 0xBE, 0xAA, 0xDE, 0x3E, 0x4B, - 0x4D, 0x7A, 0x54, 0xE4, 0x8E, 0x6E, 0xCA, 0x9B, - 0x70, 0x9E, 0x5A, 0xAA, 0x9A, 0xBE, 0x34, 0x9E, - 0x71, 0x9E, 0x7E, 0x5F, 0xAA, 0x8A, 0xBE, 0x91, - 0xCE, 0x88, 0x92, 0xDB, 0xC6, 0xAB, 0x8A, 0x72, - 0xE2, 0x44, 0xC3, 0x54, 0xAA, 0x45, 0xBB, 0x92, - 0xBA, 0xC4, 0x46, 0xCA, 0x2D, 0xD6, 0x3B, 0x1A, - 0xC2, 0x7E, 0xA6, 0xCB, 0x7A, 0xDC, 0x86, 0x72, - 0xB6, 0x94, 0xB4, 0x1C, 0xBC, 0xAE, 0x4C, 0xD6, - 0x62, 0x86, 0xD3, 0x16, 0xF6, 0x7A, 0x55, 0x79, - 0xFE, 0x6E, 0xC6, 0xC6, 0xAA, 0x93, 0xDC, 0x9D, - 0xAE, 0xA4, 0xD4, 0x56 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x62, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x62, 0x5c, + 0x4e, 0x26, 0x72, 0xaa, 0xba, 0xaf, 0x90, 0xae, + 0x92, 0x1a, 0xa4, 0x85, 0xb6, 0xbe, 0xc3, 0xc8, + 0xcf, 0xd0, 0xc2, 0xce, 0x57, 0xa2, 0xd6, 0xda, + 0xda, 0xd7, 0xb8, 0x2a, 0x7b, 0x91, 0xae, 0xca, + 0xda, 0x45, 0x9e, 0xb2, 0xd7, 0x9b, 0x90, 0x76, + 0x5c, 0xa2, 0xbe, 0xa6, 0x85, 0x96, 0x4e, 0x46, + 0x66, 0x92, 0x7a, 0x9a, 0x96, 0x9d, 0x9a, 0x6b, + 0x8a, 0x8e, 0xb2, 0xca, 0x90, 0xa6, 0x79, 0x7c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0x8d, + 0x0e, 0x36, 0x86, 0xba, 0xbe, 0xcc, 0x8e, 0xb8, + 0xc4, 0x1e, 0x8e, 0xae, 0xba, 0xb2, 0xa6, 0x12, + 0x7a, 0x20, 0x64, 0xaa, 0x2f, 0x70, 0x85, 0x46, + 0xa6, 0x6e, 0x51, 0x72, 0x92, 0xa2, 0xa6, 0x87, + 0x96, 0xa2, 0x85, 0x7a, 0x6a, 0x6e, 0x22, 0x76, + 0x36, 0x76, 0x3c, 0x6e, 0x63, 0x53, 0x66, 0x62, + 0x42, 0x50, 0x56, 0x42, 0x56, 0x56, 0x56, 0x3e, + 0x51, 0x52, 0x56, }; unsigned char linux_logo_blue[] __initdata = { - 0x04, 0x84, 0x10, 0x0C, 0x41, 0x14, 0x04, 0x78, - 0xC7, 0x0E, 0xC4, 0x24, 0xA4, 0x64, 0x0C, 0x0D, - 0x17, 0x24, 0x0D, 0x13, 0x11, 0x07, 0x40, 0x22, - 0x0C, 0x0C, 0x11, 0x78, 0x06, 0xF4, 0x0B, 0x0A, - 0x47, 0x0B, 0x7C, 0x54, 0x6C, 0x0C, 0x0D, 0x9C, - 0x73, 0x54, 0x14, 0x0C, 0x0F, 0xC7, 0x94, 0x04, - 0x94, 0x17, 0x0A, 0x6C, 0x08, 0x0F, 0x14, 0x0B, - 0x12, 0x68, 0x28, 0x11, 0xFA, 0x0A, 0x34, 0x09, - 0x0A, 0x2F, 0x15, 0x19, 0x14, 0x3C, 0x06, 0xC4, - 0x0B, 0x84, 0x24, 0x08, 0x69, 0x38, 0xBC, 0x15, - 0x1F, 0xA0, 0x0A, 0xEC, 0x2A, 0x0C, 0x0C, 0x0C, - 0x2C, 0xA0, 0x15, 0x07, 0x0B, 0x8C, 0xD3, 0x10, - 0x3B, 0x5C, 0x0C, 0x04, 0x3C, 0xAC, 0x54, 0x1C, - 0x0B, 0x5B, 0xBB, 0x0A, 0xC1, 0xBB, 0x5C, 0x3C, - 0xBC, 0x4D, 0x74, 0x10, 0x8C, 0x8C, 0x14, 0x91, - 0x0C, 0x74, 0x17, 0x0C, 0x48, 0x9C, 0x3C, 0x4C, - 0x09, 0x7C, 0x05, 0xE4, 0x34, 0x38, 0x6C, 0x11, - 0x08, 0x7C, 0x18, 0x2C, 0x9C, 0x4C, 0x34, 0x9C, - 0x29, 0x54, 0x7C, 0x0C, 0x78, 0x18, 0x9C, 0x14, - 0xBA, 0x30, 0x27, 0x31, 0xC2, 0x97, 0x24, 0x09, - 0xB4, 0x04, 0x87, 0x0C, 0x14, 0x1F, 0x7C, 0x64, - 0xB0, 0x0F, 0x45, 0x10, 0x2C, 0xD4, 0x0A, 0x04, - 0x44, 0x1F, 0x2C, 0xCC, 0x7C, 0xD8, 0x84, 0x0C, - 0x8C, 0x94, 0xB4, 0x1D, 0x20, 0x5C, 0x18, 0xB4, - 0x04, 0x09, 0xBC, 0x14, 0xF4, 0x08, 0x54, 0x07, - 0xFC, 0x6C, 0x24, 0xB4, 0x15, 0x18, 0xDB, 0x17, - 0x17, 0x18, 0x21, 0x24 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x01, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x06, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x59, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x2e, 0x08, + 0x0a, 0x06, 0x0a, 0x0b, 0x0b, 0x0f, 0x0c, 0x0f, + 0x3d, 0x09, 0x73, 0x09, 0x0d, 0x0a, 0x10, 0x1e, + 0x2d, 0x13, 0x86, 0xba, 0x19, 0x0a, 0x36, 0x3c, + 0x26, 0x14, 0x0d, 0x06, 0x07, 0x0a, 0x0b, 0x0f, + 0x4a, 0x06, 0x0a, 0x0c, 0x2b, 0x0a, 0x0b, 0x0a, + 0x06, 0x0a, 0x0a, 0x11, 0x0b, 0x0a, 0x0a, 0x1e, + 0x0f, 0x0d, 0x0a, 0x0b, 0x22, 0x6a, 0x72, 0x0b, + 0x0b, 0x22, 0x90, 0xca, 0x90, 0x92, 0x3c, 0x2c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0x8d, + 0x06, 0x0e, 0x6a, 0x0e, 0x0e, 0x5b, 0x2c, 0x3e, + 0x0e, 0x0a, 0x5a, 0x0d, 0x0e, 0x3e, 0x0a, 0x06, + 0x2e, 0x06, 0x4e, 0x36, 0x06, 0x58, 0x24, 0x06, + 0x3a, 0x08, 0x08, 0x07, 0x5e, 0x45, 0x0a, 0x32, + 0x2e, 0x2a, 0x43, 0x48, 0x5f, 0x2e, 0x06, 0x06, + 0x07, 0x24, 0x06, 0x32, 0x06, 0x06, 0x46, 0x2e, + 0x22, 0x06, 0x06, 0x1e, 0x4c, 0x06, 0x3a, 0x22, + 0x42, 0x34, 0x42, }; unsigned char linux_logo[] __initdata = { - 0xBC, 0xAC, 0x7D, 0x95, 0xAF, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0x95, 0x7D, 0x95, 0xAC, 0x2C, 0xAF, - 0x7D, 0x48, 0xB2, 0xAC, 0x85, 0xDA, 0xDA, 0x2C, - 0x7D, 0x48, 0x21, 0x2C, 0x8D, 0x2A, 0x8A, 0xDA, - 0x85, 0x2C, 0xD9, 0xAC, 0x2C, 0x2C, 0xD9, 0xD9, - 0xAF, 0x85, 0x85, 0x85, 0x8D, 0xBC, 0x2A, 0x2A, - 0xBC, 0x8C, 0xBC, 0xAC, 0x7D, 0x95, 0xAF, 0x85, - 0x2C, 0x2C, 0xAC, 0xD9, 0x95, 0x7D, 0x95, 0xAC, - 0x2C, 0xAF, 0x7D, 0x48, 0xB2, 0xAC, 0x85, 0xDA, - 0xDA, 0x2C, 0x7D, 0x48, 0x21, 0x2C, 0x8D, 0x2A, - 0xAF, 0xA1, 0x48, 0x7D, 0xAF, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0x95, 0x7D, 0x95, 0xAC, 0xD9, 0x7D, - 0x48, 0xE9, 0x21, 0xAF, 0xDA, 0xDA, 0x85, 0x2C, - 0xD9, 0xD9, 0xAC, 0xDA, 0x8A, 0xDA, 0x85, 0x2C, - 0x2C, 0xAC, 0xD9, 0xAC, 0xAF, 0xAF, 0x2C, 0x2C, - 0x2C, 0x85, 0x2C, 0x2C, 0x85, 0xDA, 0xDA, 0xDA, - 0xDA, 0xDA, 0xAF, 0xA1, 0x48, 0x7D, 0xAF, 0x2C, - 0x2C, 0xAC, 0xD9, 0xD9, 0x95, 0x7D, 0x95, 0xAC, - 0xD9, 0x7D, 0x48, 0xE9, 0x21, 0xAF, 0xDA, 0xDA, - 0x85, 0x2C, 0xD9, 0xD9, 0xAC, 0xDA, 0x8A, 0xDA, - 0x7D, 0x48, 0x48, 0x7D, 0x2C, 0x85, 0x2C, 0xAF, - 0xD9, 0xD9, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, 0x7D, - 0xB2, 0x21, 0xD9, 0x85, 0xDA, 0xDA, 0x85, 0x2C, - 0xAF, 0x2C, 0x2C, 0xDA, 0x85, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0xD9, 0xAF, 0xDA, 0x85, 0x2C, 0x2C, - 0x85, 0xDA, 0xDA, 0x85, 0x85, 0xDA, 0x85, 0x85, - 0x85, 0xAF, 0x7D, 0x48, 0x48, 0x7D, 0x2C, 0x85, - 0x2C, 0xAF, 0xD9, 0xD9, 0x7D, 0x95, 0xD9, 0xD9, - 0xD9, 0x7D, 0xB2, 0x21, 0xD9, 0x85, 0xDA, 0xDA, - 0x85, 0x2C, 0xAF, 0x2C, 0x2C, 0xDA, 0xDA, 0x85, - 0xA1, 0xE9, 0x48, 0x95, 0x85, 0xDA, 0x85, 0xAF, - 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0x95, 0x95, - 0xD9, 0xAC, 0x85, 0x85, 0xDA, 0xDA, 0x85, 0x2C, - 0xAC, 0xAC, 0x2C, 0x2C, 0x85, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0x2C, 0x91, 0x41, 0x20, 0x6B, 0x20, - 0x6B, 0x20, 0x6B, 0xAE, 0x2C, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0xA1, 0xE9, 0x48, 0x95, 0x85, 0xDA, - 0x85, 0xAF, 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, - 0x95, 0x95, 0xD9, 0xAC, 0x85, 0x85, 0xDA, 0xDA, - 0x85, 0x2C, 0xAC, 0xAC, 0x2C, 0x2C, 0x2C, 0x2C, - 0xA1, 0xA1, 0xD6, 0xAF, 0xDA, 0xDA, 0x85, 0x2C, - 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0xD9, - 0x2C, 0x2C, 0xDA, 0xDA, 0xDA, 0x85, 0x2C, 0xD9, - 0xD9, 0xD9, 0xD9, 0xAC, 0xAC, 0xAC, 0xAF, 0xAC, - 0x2C, 0xB2, 0x88, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6B, 0x80, 0x85, 0x2C, - 0xD9, 0xD6, 0xA1, 0xA1, 0xD6, 0xAF, 0xDA, 0xDA, - 0x85, 0x2C, 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, - 0xD9, 0xD9, 0x2C, 0x2C, 0xDA, 0xDA, 0xDA, 0x85, - 0x2C, 0xD9, 0xD9, 0xD9, 0xD9, 0xAF, 0xAF, 0xAF, - 0xD6, 0xD6, 0xD9, 0x2C, 0xDA, 0xDA, 0x2C, 0xAC, - 0xD9, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, 0xAF, 0x2C, - 0x85, 0x85, 0x85, 0x85, 0x2C, 0x2C, 0xAC, 0xD9, - 0xD9, 0xD9, 0xAF, 0xAF, 0x2C, 0x2C, 0xAF, 0xDA, - 0xAE, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xE3, 0x20, 0x6B, 0x48, - 0xAC, 0x95, 0xD6, 0xD6, 0xD9, 0x2C, 0xDA, 0xDA, - 0x2C, 0xAC, 0xD9, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, - 0xAF, 0x2C, 0x85, 0x85, 0x85, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0xD9, 0xD9, 0xAF, 0xAF, 0xAF, 0xAF, - 0xD9, 0xD9, 0xD9, 0x2C, 0x85, 0x85, 0x2C, 0xD9, - 0x7D, 0x21, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x2C, 0xAF, 0xAF, 0xAC, - 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x89, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x43, 0x80, 0x41, 0x20, - 0x9F, 0x2C, 0xD9, 0xD9, 0xD9, 0x2C, 0x85, 0x85, - 0x2C, 0xD9, 0x7D, 0x21, 0xD6, 0xD9, 0xAF, 0x2C, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x2C, 0xAF, - 0xAF, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0xD9, 0x7D, 0xD9, 0xAF, 0x85, 0x85, 0x2C, 0xD9, - 0xB2, 0x21, 0x7D, 0xD9, 0xAF, 0x2C, 0x85, 0x85, - 0x85, 0x2C, 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, - 0xAF, 0xAC, 0xAF, 0xAF, 0xAC, 0xAC, 0x85, 0x41, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xAE, 0x48, 0x89, 0x74, 0x41, - 0x6B, 0xD6, 0xD9, 0x7D, 0xD9, 0xAF, 0x85, 0x85, - 0x2C, 0xD9, 0xB2, 0x21, 0x7D, 0xD9, 0xAF, 0x2C, - 0x85, 0x85, 0x85, 0x2C, 0x2C, 0x2C, 0x2C, 0xAF, - 0xAF, 0xAC, 0xAF, 0xAC, 0xAC, 0x2C, 0xAF, 0xAC, - 0x2C, 0x7D, 0xD9, 0x2C, 0xDA, 0x85, 0x2C, 0x7D, - 0xB2, 0xD6, 0xD9, 0xAF, 0x85, 0x85, 0x85, 0x85, - 0xAF, 0xAC, 0xAC, 0xAF, 0xAF, 0xAC, 0xAC, 0xD9, - 0x95, 0x7D, 0x95, 0x95, 0xD9, 0xD9, 0x48, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6B, 0xAE, 0xE6, 0x80, 0x2B, 0x88, - 0x20, 0x33, 0xDA, 0x95, 0xD9, 0x2C, 0xDA, 0x85, - 0x2C, 0x7D, 0xB2, 0xD6, 0xD9, 0xAF, 0x85, 0x85, - 0x85, 0x85, 0xAF, 0xAC, 0xAC, 0xAF, 0xAF, 0xAC, - 0xAC, 0xD9, 0x95, 0x95, 0x7D, 0x95, 0x95, 0xD9, - 0x85, 0xD9, 0x2C, 0x85, 0xDA, 0xDA, 0xD9, 0x21, - 0xA1, 0xD9, 0xAF, 0x2C, 0x85, 0xDA, 0x85, 0xAF, - 0xD9, 0xD9, 0xAC, 0xAC, 0xAC, 0xD9, 0x7D, 0xD6, - 0xD6, 0x7D, 0x95, 0xD9, 0xD9, 0x85, 0xDB, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xDB, 0xE3, 0x6B, 0x20, 0x20, - 0x20, 0x20, 0xE9, 0xD9, 0x2C, 0x85, 0xDA, 0xDA, - 0xD9, 0x21, 0xA1, 0xD9, 0xAF, 0x2C, 0x85, 0xDA, - 0x85, 0xAF, 0xD9, 0xD9, 0xAC, 0xAC, 0xAC, 0xD9, - 0x7D, 0xD6, 0xD6, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, - 0xDA, 0x2C, 0x85, 0xDA, 0xDA, 0x85, 0x95, 0x21, - 0x21, 0xD9, 0x85, 0x85, 0x85, 0x2C, 0x2C, 0xD9, - 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, - 0xAC, 0xAC, 0x2C, 0xAF, 0x2C, 0x85, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x88, 0xDA, 0x85, 0xDA, 0xDA, 0x85, - 0x95, 0x21, 0x21, 0xD9, 0x85, 0x85, 0x85, 0x2C, - 0x2C, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0xD9, - 0xD9, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, - 0xDA, 0x2C, 0x85, 0x85, 0x2C, 0xD9, 0xD6, 0xB2, - 0x95, 0x2C, 0x85, 0x85, 0xAF, 0xAC, 0x95, 0x95, - 0x7D, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0x2C, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0xAC, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xAC, 0x85, 0x85, 0x2C, 0xD9, - 0xD6, 0xB2, 0x95, 0x2C, 0x85, 0x85, 0xAF, 0xAC, - 0x95, 0x95, 0x7D, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, - 0x2C, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x2C, 0x2C, 0x2C, 0xAC, 0x95, 0xD6, 0x7D, - 0xD9, 0x2C, 0x2C, 0xAF, 0x95, 0x7D, 0x7D, 0x95, - 0x95, 0xD9, 0xD9, 0x95, 0xD9, 0xD9, 0x2C, 0x85, - 0xDA, 0xDA, 0xDA, 0x85, 0x85, 0x21, 0x20, 0x20, - 0x6B, 0x41, 0xDB, 0x6B, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xDB, 0xDB, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xE6, 0x2C, 0x2C, 0xAC, 0x95, - 0xD6, 0x7D, 0xD9, 0x2C, 0x2C, 0xAF, 0x95, 0x7D, - 0x7D, 0x95, 0x95, 0xD9, 0xD9, 0x95, 0xD9, 0xD9, - 0x2C, 0x85, 0xDA, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, - 0x2C, 0xAF, 0xAC, 0xD9, 0x95, 0xD6, 0xD6, 0xD9, - 0x2C, 0x2C, 0x2C, 0xD9, 0xD6, 0xD6, 0xD9, 0xAF, - 0xAC, 0x95, 0xD6, 0x7D, 0x7D, 0xD9, 0x2C, 0x85, - 0xDA, 0xDA, 0x2C, 0xAF, 0xAF, 0x21, 0x20, 0x20, - 0x88, 0x2B, 0x88, 0x74, 0x20, 0x20, 0x20, 0x20, - 0x20, 0xAE, 0x2D, 0x2D, 0x74, 0x74, 0x88, 0x20, - 0x20, 0x20, 0x20, 0x80, 0xAC, 0xD9, 0x95, 0xD6, - 0xD6, 0xD9, 0x2C, 0x2C, 0x2C, 0xD9, 0xD6, 0xD6, - 0xD9, 0xAF, 0xAC, 0x95, 0xD6, 0x7D, 0x7D, 0xD9, - 0x2C, 0xDA, 0xDA, 0x85, 0x2C, 0xAF, 0xAF, 0xAF, - 0x2C, 0xAF, 0xD9, 0x95, 0xD6, 0xD6, 0x95, 0xAF, - 0x2C, 0x2C, 0xD9, 0x95, 0xD6, 0x95, 0xAF, 0x2C, - 0xAC, 0x7D, 0x21, 0x95, 0xD9, 0x2C, 0x85, 0x85, - 0x85, 0xAF, 0xD9, 0x95, 0xD9, 0x7D, 0x20, 0x33, - 0x7D, 0x8A, 0x7D, 0x5B, 0x6B, 0x20, 0x20, 0x6B, - 0xE6, 0xD9, 0x85, 0x2A, 0xDA, 0x2B, 0x41, 0x20, - 0x20, 0x20, 0x6B, 0x74, 0xD9, 0x95, 0xD6, 0xD6, - 0x95, 0xAF, 0x2C, 0x2C, 0xD9, 0x95, 0xD6, 0x95, - 0xAF, 0x2C, 0xAC, 0x7D, 0x21, 0x95, 0xD9, 0x2C, - 0x85, 0x85, 0x85, 0x2C, 0xD9, 0xD9, 0xD9, 0xD9, - 0x85, 0xD9, 0x7D, 0x21, 0x21, 0x7D, 0xAC, 0x2C, - 0x2C, 0xAC, 0xD9, 0x7D, 0xD9, 0xAF, 0x2C, 0x85, - 0xAC, 0x7D, 0x7D, 0xAC, 0x85, 0xDA, 0x8A, 0xDA, - 0x85, 0xAF, 0xD9, 0x7D, 0xD9, 0x95, 0x20, 0x91, - 0xBC, 0x73, 0xEE, 0x7D, 0x20, 0x20, 0x20, 0x80, - 0x4D, 0x3D, 0x73, 0x73, 0xA3, 0xD6, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2B, 0x7D, 0x21, 0x21, 0x7D, - 0xAC, 0x2C, 0x2C, 0xAC, 0xD9, 0x7D, 0xD9, 0xAF, - 0x2C, 0x85, 0xAC, 0x7D, 0x7D, 0xAC, 0x85, 0xDA, - 0x8A, 0x8A, 0x85, 0xAC, 0xD9, 0x7D, 0xD9, 0xAC, - 0x2C, 0xD9, 0xD6, 0xB2, 0xB2, 0x7D, 0xAF, 0x85, - 0x2C, 0xD9, 0x95, 0x95, 0xAF, 0x2C, 0x2C, 0x2C, - 0xD9, 0xD9, 0xAC, 0x85, 0x8D, 0x2A, 0x2A, 0xDA, - 0xAF, 0xD9, 0x95, 0x95, 0xD9, 0xAC, 0x20, 0xAF, - 0x2C, 0xE6, 0x8D, 0x73, 0xE3, 0x20, 0x20, 0x48, - 0x5C, 0xDA, 0x5B, 0x43, 0xBC, 0x73, 0x2B, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xD6, 0xB2, 0xB2, 0x7D, - 0xAF, 0x85, 0x2C, 0xD9, 0x95, 0x95, 0xAF, 0x2C, - 0x2C, 0x2C, 0xD9, 0xD9, 0xAC, 0x85, 0x8A, 0x2A, - 0x8D, 0xDA, 0xAF, 0xD9, 0x95, 0x95, 0xD9, 0xAF, - 0xAC, 0xD9, 0xD6, 0xB2, 0x21, 0xD9, 0x2C, 0x85, - 0x2C, 0xD9, 0x95, 0xD9, 0xAF, 0x2C, 0x2C, 0xAC, - 0xAC, 0xAF, 0x85, 0x8D, 0xBC, 0xBC, 0xDA, 0xD9, - 0xD6, 0xA1, 0xA1, 0x21, 0xD9, 0xAC, 0x20, 0x2A, - 0xCC, 0xAE, 0x9F, 0xE4, 0xAE, 0x5B, 0x74, 0xA1, - 0xE4, 0xAE, 0x20, 0x9F, 0x89, 0xE8, 0xE6, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xD6, 0xB2, 0x21, 0xD9, - 0x2C, 0x85, 0x2C, 0xD9, 0x95, 0xD9, 0xAF, 0x2C, - 0x2C, 0xAC, 0xAC, 0xAF, 0x85, 0x8D, 0xBC, 0x2A, - 0xDA, 0xD9, 0xD6, 0xA1, 0xA1, 0x21, 0xD9, 0xD9, - 0xD9, 0x95, 0x21, 0xA1, 0x21, 0xAC, 0x85, 0x85, - 0xAC, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0xAF, 0xAC, - 0xAF, 0x85, 0x8A, 0x2A, 0x2A, 0xDA, 0xD9, 0xA1, - 0x48, 0xE9, 0x48, 0x21, 0x95, 0xAC, 0x20, 0x2A, - 0xDB, 0x41, 0x74, 0xBC, 0x2B, 0x7B, 0x7B, 0x80, - 0x73, 0x41, 0x20, 0x6B, 0x2B, 0xE8, 0x2D, 0x20, - 0x20, 0x20, 0x20, 0x33, 0x21, 0xA1, 0x21, 0xAC, - 0x85, 0x85, 0xAC, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, - 0xAF, 0xAC, 0xAF, 0x85, 0x8A, 0xBC, 0x2A, 0xDA, - 0xD9, 0xA1, 0x48, 0xE9, 0x48, 0x21, 0xD9, 0xD9, - 0xA1, 0xB2, 0xB2, 0x48, 0xD6, 0xAC, 0x2C, 0x2C, - 0xD9, 0x95, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0x85, 0x8A, 0x8D, 0x8D, 0x85, 0x95, 0xA1, 0x6C, - 0x6C, 0x48, 0xD6, 0xD9, 0x2C, 0x85, 0x20, 0x2C, - 0x89, 0x20, 0x3C, 0xB9, 0xA7, 0x63, 0xD2, 0xB9, - 0xC6, 0x9A, 0x20, 0x20, 0x43, 0x5C, 0xE6, 0x20, - 0x20, 0x20, 0x20, 0x33, 0xB2, 0x48, 0xD6, 0xAC, - 0x2C, 0x2C, 0xD9, 0x95, 0xAF, 0x2C, 0x2C, 0x2C, - 0x2C, 0x2C, 0x85, 0x8A, 0x8D, 0x8D, 0x85, 0x95, - 0xA1, 0x6C, 0x6C, 0x48, 0xD6, 0xD9, 0xAF, 0xAC, - 0xA1, 0xD6, 0x7D, 0xB2, 0xD6, 0xAF, 0x85, 0x85, - 0xD9, 0x95, 0x2C, 0x85, 0xDA, 0x85, 0x85, 0x2C, - 0x85, 0x8A, 0x8D, 0xDA, 0xD9, 0x48, 0x81, 0x2D, - 0x48, 0xD6, 0xD9, 0xAC, 0x2C, 0x85, 0x20, 0x2D, - 0xEE, 0x93, 0xD1, 0xA7, 0x3E, 0x3E, 0x3A, 0x25, - 0x56, 0xAB, 0xAA, 0xC5, 0xEE, 0xEE, 0x33, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xD9, 0xB2, 0xD6, 0xAF, - 0x85, 0x85, 0xD9, 0x95, 0x2C, 0x85, 0xDA, 0x85, - 0x85, 0x2C, 0x85, 0x8A, 0x8D, 0xDA, 0xD9, 0x48, - 0x81, 0x2D, 0x48, 0xD6, 0xD9, 0xAF, 0x2C, 0x2C, - 0xAC, 0xAF, 0xD9, 0x7D, 0xD6, 0x2C, 0x85, 0x2C, - 0xD9, 0xD9, 0x2C, 0xDA, 0xDA, 0xDA, 0x2C, 0x2C, - 0x85, 0x8D, 0x8D, 0x2C, 0x21, 0x2D, 0x2D, 0xE9, - 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0xDA, 0x20, 0xE3, - 0xB4, 0xBE, 0xF1, 0x3E, 0x9B, 0x22, 0x56, 0xF2, - 0xBB, 0x7F, 0x56, 0xDC, 0x8F, 0x5A, 0x5F, 0x20, - 0x20, 0x20, 0x20, 0x6B, 0x2C, 0x7D, 0xD6, 0x2C, - 0x85, 0x2C, 0xD9, 0xD9, 0x2C, 0xDA, 0xDA, 0xDA, - 0x2C, 0x2C, 0x85, 0x8D, 0x8A, 0x85, 0x21, 0x2D, - 0x2D, 0xE9, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, - 0x2A, 0x85, 0xAC, 0x95, 0x95, 0x2C, 0x85, 0x85, - 0xAC, 0xAF, 0x85, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, - 0xDA, 0x8A, 0x8A, 0xAF, 0xA1, 0x2D, 0xE9, 0xD6, - 0xD9, 0xAC, 0x85, 0x85, 0x85, 0xDA, 0x20, 0x52, - 0x55, 0xED, 0x57, 0x3E, 0x22, 0x56, 0x37, 0xBB, - 0xBB, 0x58, 0x7F, 0x7F, 0x56, 0x5E, 0xC5, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2C, 0x95, 0x95, 0x2C, - 0x85, 0x85, 0xAC, 0xAF, 0x85, 0xDA, 0xDA, 0x85, - 0x2C, 0x2C, 0xDA, 0x8D, 0xDA, 0xAF, 0xA1, 0x2D, - 0xE9, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, 0x85, - 0xCD, 0xAF, 0xD9, 0x95, 0xD9, 0x2C, 0xDA, 0x85, - 0xAF, 0xD9, 0x85, 0xDA, 0x85, 0x2C, 0xAC, 0xAF, - 0x85, 0x8A, 0x85, 0xD9, 0x48, 0x48, 0xB2, 0x95, - 0x95, 0xAC, 0x2C, 0x85, 0xDA, 0xDA, 0x6B, 0xB3, - 0x46, 0x7C, 0x2E, 0x9B, 0x22, 0x56, 0xBB, 0x37, - 0x58, 0x58, 0xF2, 0x3A, 0x46, 0x63, 0x64, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2D, 0x95, 0xD9, 0x2C, - 0xDA, 0x85, 0xAF, 0xD9, 0x85, 0xDA, 0x85, 0x2C, - 0xAC, 0xAF, 0x85, 0xDA, 0x85, 0xD9, 0x48, 0x48, - 0xB2, 0x95, 0x95, 0xD9, 0x85, 0xDA, 0x85, 0x85, - 0xBC, 0xB2, 0xB2, 0x7D, 0xD9, 0x2C, 0xDA, 0x85, - 0xAF, 0xD9, 0x85, 0xDA, 0x85, 0x85, 0xAF, 0x2C, - 0x85, 0xDA, 0x2C, 0x7D, 0xA1, 0x48, 0xB2, 0x21, - 0xD6, 0xD9, 0x85, 0xDA, 0x85, 0xDA, 0x41, 0x51, - 0xB7, 0xEC, 0x2E, 0x22, 0x56, 0x37, 0xBB, 0xF2, - 0x37, 0xEA, 0x2F, 0x2F, 0x77, 0xA7, 0x38, 0x20, - 0x20, 0x6B, 0x20, 0x20, 0x5B, 0x2C, 0xD9, 0x2C, - 0xDA, 0x85, 0xAF, 0xD9, 0x85, 0xDA, 0x85, 0x85, - 0xAF, 0x2C, 0xDA, 0xDA, 0x2C, 0x7D, 0xA1, 0x48, - 0xB2, 0x21, 0xD6, 0xD9, 0x2C, 0xDA, 0x85, 0xAF, - 0x2C, 0x2D, 0x48, 0x7D, 0xAF, 0x2C, 0x85, 0x2C, - 0xD9, 0xAC, 0xAF, 0x85, 0x85, 0x2C, 0x2C, 0x2C, - 0x85, 0x2C, 0xD9, 0xD6, 0xA1, 0xA1, 0x48, 0xA1, - 0x21, 0x2C, 0xDA, 0xDA, 0x2C, 0x85, 0x41, 0x98, - 0xA2, 0xA7, 0x6F, 0xC9, 0x37, 0xF2, 0xF2, 0x9B, - 0xB7, 0x66, 0x60, 0x4C, 0xED, 0x84, 0x3C, 0x20, - 0x5B, 0x2D, 0x2B, 0x6B, 0x20, 0xAF, 0xAF, 0x2C, - 0x85, 0x2C, 0xD9, 0xAC, 0xAF, 0x85, 0x85, 0x2C, - 0x2C, 0x2C, 0x2C, 0x85, 0xD9, 0xD6, 0xA1, 0xA1, - 0x48, 0xA1, 0xD6, 0xAF, 0xDA, 0x8A, 0x2C, 0xD9, - 0xB2, 0x2D, 0x48, 0x95, 0x2C, 0x2C, 0x2C, 0x85, - 0xAC, 0xAC, 0xAF, 0x85, 0xDA, 0x85, 0xAF, 0xAC, - 0xAF, 0x2C, 0xD9, 0xD6, 0xD6, 0xD6, 0x21, 0xD6, - 0xD9, 0xDA, 0x8D, 0xDA, 0xAF, 0x2C, 0x20, 0x88, - 0x42, 0x51, 0x3F, 0x2F, 0x45, 0xB7, 0x66, 0x55, - 0x46, 0x60, 0x5D, 0x36, 0xD8, 0x71, 0x43, 0x20, - 0x20, 0x2D, 0xB2, 0x80, 0x20, 0x2D, 0x2C, 0x2C, - 0x2C, 0x85, 0xAC, 0xAC, 0xAF, 0x85, 0xDA, 0x85, - 0xAF, 0xAC, 0xAC, 0xAF, 0xD9, 0xD6, 0xD6, 0xD6, - 0x21, 0xD6, 0xD9, 0xDA, 0x8D, 0x8A, 0x2C, 0xD9, - 0xB2, 0x48, 0xD6, 0xAC, 0xAF, 0x2C, 0x2C, 0x85, - 0x2C, 0xAC, 0x2C, 0xDA, 0xDA, 0x85, 0xAF, 0xD9, - 0xD9, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xAC, - 0x85, 0x8D, 0xBC, 0xDA, 0xD9, 0xDA, 0x20, 0xE3, - 0xDA, 0x69, 0x96, 0xB5, 0xF1, 0x68, 0x5D, 0x82, - 0xE1, 0xBE, 0x27, 0x8D, 0x4D, 0xD3, 0x7D, 0x20, - 0x20, 0xDB, 0xA1, 0xCA, 0x20, 0x88, 0x85, 0x2C, - 0x2C, 0x85, 0x2C, 0xAC, 0x2C, 0xDA, 0xDA, 0x85, - 0xAF, 0xD9, 0xAC, 0xAF, 0xD9, 0xD9, 0xD9, 0xD9, - 0xD9, 0xAC, 0xDA, 0x8D, 0xBC, 0xDA, 0xD9, 0x95, - 0xD9, 0x95, 0xAC, 0x2C, 0x2C, 0x2C, 0x2C, 0x85, - 0x85, 0xAF, 0xAF, 0x85, 0x85, 0x2C, 0x2C, 0xAC, - 0xD9, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x85, - 0x8D, 0x2A, 0x2A, 0x85, 0xD9, 0x95, 0x20, 0xDB, - 0x8D, 0x8D, 0x99, 0xB0, 0x35, 0xE5, 0x3F, 0x35, - 0xB9, 0x50, 0x8A, 0x4D, 0x73, 0xE8, 0xA3, 0xCC, - 0x20, 0x20, 0x33, 0x6B, 0x20, 0x20, 0xCC, 0x85, - 0x2C, 0x85, 0x85, 0xAF, 0xAF, 0x85, 0x85, 0x85, - 0x2C, 0xD9, 0xD9, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, - 0x2C, 0x85, 0x8A, 0x2A, 0x8D, 0x2C, 0xD9, 0xD9, - 0xAF, 0xAF, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x85, - 0x2C, 0xAF, 0xAF, 0xAF, 0x2C, 0x2C, 0x2C, 0xAC, - 0xD9, 0xAC, 0xAF, 0x2C, 0x85, 0x85, 0xDA, 0xDA, - 0x8A, 0x8A, 0x85, 0xD9, 0x2C, 0x2B, 0x20, 0xAE, - 0xA3, 0xBC, 0x8D, 0xC8, 0xA9, 0xC7, 0x92, 0x47, - 0x8D, 0x8D, 0x7E, 0xE4, 0xE8, 0xE8, 0x5C, 0x2C, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6B, 0xAF, - 0x2C, 0x85, 0x2C, 0xAF, 0xAF, 0xAF, 0x2C, 0x2C, - 0x2C, 0xAF, 0xD9, 0xAC, 0x2C, 0x2C, 0x85, 0x85, - 0x85, 0xDA, 0x8D, 0x8A, 0x85, 0xAC, 0x95, 0xD9, - 0xAC, 0xAC, 0xAC, 0xAC, 0x2C, 0xAF, 0xAF, 0x2C, - 0x2C, 0xAF, 0xAF, 0xAC, 0x2C, 0xAF, 0x2C, 0xAF, - 0xD9, 0xAC, 0x2C, 0x2C, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x2C, 0xD9, 0xD9, 0x2D, 0x6B, 0x41, 0x2A, - 0xE8, 0xA3, 0xC8, 0x8D, 0x8A, 0x8A, 0x8A, 0x8D, - 0x4D, 0xA3, 0x3D, 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, - 0xAE, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xDB, - 0xDA, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, 0xAC, 0xAF, - 0x2C, 0xAC, 0xD9, 0xAC, 0x2C, 0x2C, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x2C, 0xD9, 0x95, 0x7D, 0xD9, - 0x7D, 0x7D, 0xD9, 0xAC, 0xAC, 0xAF, 0xAF, 0xAF, - 0x2C, 0x2C, 0xAC, 0xAC, 0xD9, 0xAC, 0xAC, 0xD9, - 0x95, 0xD9, 0xAC, 0xAF, 0xAF, 0xAC, 0xAF, 0xAC, - 0xD9, 0x7D, 0x7D, 0x7D, 0x33, 0x41, 0x2D, 0xE8, - 0xE8, 0x5C, 0xD3, 0x8D, 0x8D, 0x8D, 0x8D, 0x7E, - 0x3D, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xDA, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x81, 0x2C, 0x2C, 0x2C, 0xAC, 0xAC, 0xAC, 0xAC, - 0xAC, 0xD9, 0x95, 0x95, 0xAC, 0xAF, 0xAF, 0xAF, - 0xAF, 0xAC, 0xD9, 0x95, 0x7D, 0xD6, 0xD6, 0x7D, - 0x21, 0xD6, 0x95, 0xD9, 0xD9, 0xAC, 0xAF, 0xAF, - 0x2C, 0xAF, 0xAC, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, - 0x21, 0x21, 0x7D, 0x95, 0x95, 0x7D, 0xD6, 0x21, - 0xB2, 0xA1, 0x2C, 0x88, 0x20, 0xE3, 0xA3, 0xE8, - 0xE8, 0xE8, 0xE4, 0xEE, 0xD3, 0x7E, 0x73, 0x5C, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0x5C, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2C, 0xAF, 0xAF, 0xAC, 0xD9, 0xD9, 0xD9, - 0xD9, 0xD9, 0xD6, 0x21, 0x7D, 0x95, 0x95, 0x7D, - 0xD6, 0xB2, 0xA1, 0xA1, 0xB2, 0xD6, 0x21, 0x21, - 0x21, 0xD9, 0xD9, 0xD9, 0xAC, 0xAF, 0xAC, 0xAF, - 0x2C, 0x2C, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, 0x95, - 0x7D, 0xB2, 0xD6, 0x95, 0xD9, 0x95, 0xD6, 0xA1, - 0xA1, 0xAF, 0x5B, 0x20, 0x20, 0xD6, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0x48, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0xE3, 0x8A, 0x2C, 0xAC, 0xAC, 0xD9, 0xD9, - 0xD9, 0x95, 0xD6, 0xB2, 0xD6, 0x95, 0xD9, 0x95, - 0x21, 0xB2, 0xA1, 0xB2, 0xD6, 0xD6, 0xD6, 0xA1, - 0xD9, 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, 0xAF, - 0x2C, 0x2C, 0xAF, 0xAC, 0xD9, 0xAC, 0xD9, 0xD9, - 0xD9, 0x95, 0xAC, 0x2C, 0x2C, 0xAC, 0x95, 0x7D, - 0xD9, 0x91, 0x20, 0x20, 0xE3, 0xA3, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0x85, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2B, 0x8A, 0xAF, 0xAC, 0xD9, 0xAC, - 0xD9, 0xD9, 0xD9, 0x95, 0xAC, 0x2C, 0x2C, 0xAC, - 0x95, 0x7D, 0x95, 0x95, 0xD9, 0x95, 0x7D, 0x21, - 0x2C, 0xDA, 0xDA, 0x85, 0x2C, 0xAF, 0xAF, 0xAF, - 0xAF, 0xAF, 0x2C, 0xAF, 0xAF, 0xAC, 0xAC, 0xAC, - 0xD9, 0xAF, 0x85, 0x85, 0x2C, 0xAF, 0xD9, 0xAF, - 0x48, 0x20, 0x20, 0x20, 0xE6, 0xA3, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, - 0xE4, 0x73, 0x41, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2B, 0xDA, 0xAF, 0xAF, 0xAC, - 0xAC, 0xAF, 0xD9, 0x2C, 0x85, 0x85, 0x2C, 0xAF, - 0xD9, 0xD9, 0xAC, 0xAF, 0xAC, 0xD9, 0xD9, 0xD9, - 0x85, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, 0xAC, 0xAF, - 0xAF, 0xAF, 0xAF, 0x2C, 0xAF, 0xAF, 0xAC, 0xAC, - 0xAF, 0x2C, 0x2C, 0x2C, 0xAC, 0x95, 0x95, 0xA1, - 0x20, 0x20, 0x20, 0x20, 0xE9, 0x8C, 0x5C, 0xE8, - 0xE8, 0xE8, 0xE8, 0x3D, 0x73, 0x73, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE4, 0x73, 0x73, 0x73, 0xCD, - 0x7E, 0xA3, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x24, 0x85, 0xAF, 0xAF, - 0xAC, 0xAC, 0xAC, 0xAF, 0x85, 0x2C, 0xAC, 0x95, - 0x95, 0xD9, 0xAC, 0xAC, 0xAC, 0xD9, 0xAC, 0xAF, - 0x8A, 0x8A, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, 0x2C, - 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, 0xAF, 0xAC, - 0xAC, 0xAF, 0xAF, 0xD9, 0xD6, 0xD6, 0x2C, 0x88, - 0x20, 0x20, 0x20, 0x88, 0xB2, 0xDA, 0x7E, 0x73, - 0xE8, 0xE8, 0xE8, 0x3D, 0x73, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xA3, 0xCD, 0xD3, 0x2A, 0x2A, - 0x2A, 0x8C, 0x8D, 0x88, 0x20, 0xE3, 0x6B, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x41, 0x85, 0xAF, 0xAC, - 0xAC, 0xAC, 0xAC, 0xAF, 0xAC, 0xD9, 0x7D, 0xD6, - 0x7D, 0x7D, 0xD9, 0x95, 0xD9, 0xAC, 0xAC, 0xAF, - 0xD3, 0x8D, 0xDA, 0xDA, 0x85, 0x85, 0x2C, 0x2C, - 0x2C, 0xAF, 0xAF, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, - 0xAF, 0xAF, 0xAC, 0xD9, 0x95, 0x7D, 0xAC, 0x20, - 0x20, 0x20, 0x20, 0xDB, 0x2C, 0xA3, 0x5C, 0xE8, - 0xE8, 0xE8, 0xE8, 0x5C, 0x3D, 0x3D, 0xE8, 0xE8, - 0xE8, 0xE4, 0xE8, 0xE8, 0xE8, 0xE4, 0x73, 0xEE, - 0xD3, 0x2A, 0xEE, 0xAC, 0x20, 0x33, 0x2B, 0xE3, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x9F, 0xAF, 0xD9, - 0xD9, 0xAC, 0xAF, 0xAF, 0xAC, 0xD9, 0x95, 0x7D, - 0xD9, 0x95, 0x95, 0x95, 0x95, 0xD9, 0xAF, 0xAF, - 0x7E, 0x85, 0x85, 0x2C, 0x85, 0x85, 0x85, 0x2C, - 0x2C, 0x2C, 0xAF, 0xD9, 0xD9, 0x95, 0xD9, 0xAC, - 0xAC, 0xAF, 0xAF, 0xAC, 0xAC, 0xAC, 0x91, 0x20, - 0x33, 0xE3, 0x41, 0x48, 0x73, 0x5C, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xA3, 0xD6, 0x6C, 0x85, 0xE8, - 0xDA, 0xAE, 0xB2, 0xA3, 0x5C, 0xE8, 0xE8, 0xE8, - 0x3D, 0xEE, 0x4D, 0xA3, 0x24, 0x20, 0x6B, 0xDB, - 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x85, 0x95, - 0xD9, 0xD9, 0xAC, 0xAF, 0xAF, 0xAC, 0xD9, 0xAC, - 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xAC, 0xD9, 0xAC, - 0x8A, 0xD9, 0xAC, 0xD9, 0xAC, 0xAC, 0x2C, 0x2C, - 0xAF, 0xAF, 0xAF, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, - 0xAF, 0xAF, 0xAF, 0xAC, 0xAC, 0x85, 0x33, 0x20, - 0xCC, 0x20, 0xE3, 0xA3, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xA3, 0xD9, 0x81, 0xAC, 0xDA, 0x2D, 0x5C, - 0x48, 0x41, 0x88, 0x74, 0x21, 0xA3, 0xE8, 0xE8, - 0xE8, 0xE8, 0x73, 0x8C, 0x8A, 0x20, 0x20, 0x20, - 0xDB, 0x33, 0x20, 0x20, 0x20, 0x20, 0xE6, 0xD9, - 0xD9, 0xAC, 0xAC, 0xAF, 0xAC, 0xAF, 0xAC, 0xAF, - 0xAF, 0xAC, 0xD9, 0xAF, 0xD9, 0xAC, 0xAC, 0xAF, - 0x85, 0xD9, 0x95, 0xD9, 0x95, 0xD9, 0xD9, 0xAC, - 0xAF, 0xAC, 0xAF, 0xAF, 0x2C, 0xAF, 0x2C, 0x2C, - 0xAF, 0xAF, 0xAF, 0xAC, 0xAC, 0x2C, 0x20, 0x5B, - 0x33, 0x20, 0xD6, 0xE8, 0xE8, 0xE8, 0xE8, 0x73, - 0xAF, 0x2D, 0xD9, 0xDA, 0xB2, 0x81, 0x81, 0xE4, - 0xA1, 0x91, 0x2B, 0x88, 0x33, 0x80, 0xAF, 0x73, - 0xE8, 0xE8, 0xE8, 0x5C, 0xA3, 0x80, 0x41, 0xCC, - 0x2B, 0xCC, 0x20, 0x20, 0x20, 0x20, 0x88, 0xDA, - 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, 0xAC, 0xAF, - 0xAF, 0xAF, 0xAF, 0xAC, 0xAF, 0xAF, 0xAF, 0x2C, - 0x85, 0xD9, 0xD9, 0xD9, 0xD9, 0xAC, 0xAC, 0xD9, - 0xD9, 0xD9, 0xAC, 0x2C, 0x2C, 0x2C, 0x85, 0x85, - 0x85, 0x2C, 0x2C, 0xAF, 0x2C, 0x91, 0x20, 0xAE, - 0x20, 0xDB, 0x3D, 0xE8, 0xE8, 0x5C, 0xB2, 0x80, - 0xB2, 0xAF, 0x48, 0xB2, 0x48, 0x89, 0x89, 0x3D, - 0x21, 0x48, 0x6C, 0x2D, 0x2B, 0x41, 0xE3, 0xAE, - 0xD9, 0x5C, 0xE8, 0xE8, 0xE8, 0x95, 0x33, 0x80, - 0xAE, 0x33, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x95, - 0x85, 0x2C, 0x85, 0x2C, 0x2C, 0xAF, 0x2C, 0x2C, - 0x2C, 0xAF, 0xAC, 0xAF, 0xAF, 0x2C, 0x2C, 0x2C, - 0xDA, 0xAF, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0x2C, - 0xAC, 0xD9, 0xAC, 0xAF, 0x2C, 0x85, 0x2C, 0x85, - 0x85, 0x2C, 0x2C, 0x2C, 0x8A, 0x41, 0xDB, 0x33, - 0x20, 0x95, 0xE8, 0xE8, 0xE8, 0xA3, 0xDB, 0x88, - 0xDB, 0x80, 0xD6, 0x7E, 0x85, 0x2D, 0xE6, 0x5C, - 0x21, 0x48, 0xD9, 0x7E, 0xD6, 0x2B, 0xCC, 0xAC, - 0x85, 0xBC, 0xE8, 0xE8, 0xE8, 0xCD, 0x88, 0x5B, - 0x41, 0x20, 0xAE, 0x20, 0x20, 0x20, 0x20, 0x74, - 0xDA, 0x85, 0x85, 0x85, 0x2C, 0x2C, 0x2C, 0x2C, - 0xAF, 0xAC, 0xD9, 0xD9, 0xAC, 0xAC, 0xAC, 0xD9, - 0x8A, 0xAF, 0xAC, 0xAC, 0x2C, 0x85, 0x2C, 0xAF, - 0xD9, 0xD9, 0xAF, 0xAF, 0xAF, 0x2C, 0xAF, 0x2C, - 0x2C, 0x2C, 0x2C, 0xAF, 0x95, 0x20, 0x74, 0x20, - 0x33, 0xA3, 0xE8, 0xE8, 0xE8, 0xE4, 0x7D, 0xCC, - 0x6B, 0x33, 0xAE, 0x2C, 0x85, 0x2D, 0x9F, 0x73, - 0xA1, 0x2D, 0x2C, 0xDA, 0x89, 0x48, 0xD3, 0xD9, - 0x21, 0xA3, 0xE8, 0xE8, 0xE8, 0xE8, 0xE3, 0x20, - 0x20, 0x20, 0xDB, 0x41, 0x20, 0x20, 0x20, 0x20, - 0xDA, 0x2C, 0x2C, 0x2C, 0x2C, 0xAF, 0xAC, 0xAC, - 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0x95, 0x95, 0xD9, - 0x2C, 0xD9, 0xD9, 0xAC, 0x2C, 0x2C, 0x85, 0xAF, - 0xAF, 0xAF, 0xAC, 0xAC, 0xD9, 0xAC, 0xAF, 0xAC, - 0xAC, 0x95, 0xD6, 0x7D, 0xAE, 0x88, 0x2B, 0x20, - 0x6C, 0xE8, 0xE8, 0xE8, 0x73, 0xEE, 0x73, 0x2C, - 0x89, 0x2B, 0x41, 0x33, 0xCC, 0xCC, 0x80, 0x3D, - 0x2D, 0x74, 0x80, 0x48, 0x8D, 0x95, 0x48, 0x95, - 0xEE, 0x5C, 0x5C, 0xE8, 0xE8, 0xE8, 0x24, 0x20, - 0x20, 0x20, 0x5B, 0xDB, 0x20, 0x20, 0x20, 0x20, - 0xAF, 0xAC, 0xD9, 0x95, 0xD6, 0xD6, 0xD6, 0x7D, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0xD9, 0xAC, - 0xAC, 0xD9, 0xD9, 0xAC, 0x2C, 0x2C, 0x2C, 0xAF, - 0xAC, 0xAC, 0xAC, 0xAC, 0xD9, 0xAC, 0xAC, 0xD9, - 0xD6, 0x48, 0xE9, 0x95, 0x20, 0x2B, 0x41, 0x6B, - 0x8D, 0xE8, 0xE8, 0xCD, 0x2B, 0x2B, 0x2C, 0x73, - 0xCD, 0x48, 0xCA, 0x5B, 0x41, 0x5B, 0x74, 0xDA, - 0x80, 0xE6, 0xC8, 0x85, 0xA1, 0x7D, 0x8D, 0x3D, - 0x7E, 0xE9, 0x7D, 0xEE, 0xE8, 0xE8, 0x81, 0x20, - 0x20, 0x20, 0xE3, 0xE3, 0x20, 0x20, 0x20, 0x20, - 0x2D, 0xD9, 0xD6, 0x48, 0x6C, 0xE9, 0xA1, 0xD6, - 0xD9, 0xD9, 0xAC, 0xD9, 0xD9, 0x95, 0xAC, 0x2C, - 0x2C, 0x2C, 0x2C, 0xD9, 0xAC, 0x2C, 0x2C, 0x2C, - 0xAF, 0x2C, 0xAF, 0xD9, 0xAC, 0xAF, 0xAF, 0x95, - 0xB2, 0xE9, 0x21, 0x2B, 0x41, 0x2B, 0x20, 0x5B, - 0x3D, 0xE8, 0xE8, 0x8D, 0x2B, 0x88, 0x5B, 0xE6, - 0xBC, 0x73, 0x85, 0x89, 0x80, 0x5B, 0xE3, 0xAE, - 0x2C, 0x8A, 0xD6, 0xB2, 0x2C, 0xA3, 0xA3, 0xD9, - 0xA1, 0x2C, 0x85, 0x8D, 0xE8, 0xE8, 0x48, 0x20, - 0x20, 0x20, 0xE3, 0x88, 0x20, 0x20, 0x20, 0x20, - 0xAE, 0xD9, 0xB2, 0xE9, 0x6C, 0x48, 0xD6, 0xD9, - 0x2C, 0x85, 0x2C, 0xD9, 0x7D, 0xD9, 0x2C, 0x85, - 0x8D, 0x85, 0x2C, 0xAC, 0xAF, 0x2C, 0x2C, 0x85, - 0x2C, 0x2C, 0xAF, 0xAC, 0xAC, 0xAF, 0xAF, 0xD9, - 0xB2, 0x48, 0xB2, 0x20, 0x20, 0xCC, 0x20, 0x9F, - 0xE8, 0xE8, 0xE8, 0xCD, 0x48, 0x89, 0xDB, 0x88, - 0x2B, 0xE9, 0xCD, 0x2A, 0x48, 0x80, 0xAE, 0xAE, - 0x7D, 0x48, 0x21, 0xEE, 0x3D, 0x2C, 0x48, 0x85, - 0x2C, 0x95, 0x7D, 0x8C, 0xE8, 0xE8, 0xB2, 0x20, - 0x20, 0x20, 0xDB, 0x20, 0x20, 0x20, 0x20, 0x20, - 0xDB, 0x2C, 0xB2, 0x48, 0x48, 0x7D, 0xD9, 0xAF, - 0x85, 0x8A, 0x85, 0x7D, 0xB2, 0x95, 0x85, 0xDA, - 0xD3, 0x85, 0xAF, 0xAC, 0x2C, 0x85, 0x85, 0x2C, - 0xAC, 0xAC, 0xAC, 0xD9, 0xD9, 0xAC, 0x2C, 0x2C, - 0xD9, 0xAC, 0x5B, 0x20, 0x20, 0xAE, 0x20, 0x2D, - 0xE8, 0xE8, 0xE8, 0x7E, 0xD6, 0x48, 0xE9, 0xAE, - 0x88, 0x5B, 0x80, 0x6C, 0xAE, 0xCA, 0x91, 0xE9, - 0x43, 0x9F, 0xE6, 0x2C, 0x48, 0x21, 0xBC, 0x95, - 0x95, 0xD6, 0x21, 0x7E, 0xE8, 0xE8, 0x7D, 0x20, - 0x20, 0x20, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6B, 0xDA, 0xD9, 0x48, 0xB2, 0xD9, 0x2C, 0x85, - 0xDA, 0xDA, 0x2C, 0xA1, 0x48, 0xAC, 0xDA, 0x8D, - 0x2A, 0xAC, 0x7D, 0x95, 0xAF, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0x95, 0x7D, 0x95, 0xAC, 0x2C, 0xAF, - 0x7D, 0xD6, 0x20, 0x20, 0x88, 0x9F, 0x20, 0xA1, - 0xE8, 0xE8, 0xE8, 0xA3, 0xD6, 0x6C, 0xB2, 0x2C, - 0x89, 0xE3, 0x88, 0xDB, 0xCC, 0x24, 0x7D, 0xEE, - 0xB2, 0xCC, 0xAE, 0x2D, 0xDA, 0x2C, 0xD6, 0x2C, - 0xB2, 0x2D, 0xD6, 0xEE, 0xE8, 0xE8, 0x95, 0x20, - 0x20, 0x20, 0xDB, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6B, 0xDA, 0x95, 0xA1, 0xB2, 0xAC, 0x85, 0x85, - 0xDA, 0x2C, 0x95, 0xA1, 0x21, 0x2C, 0x8A, 0x2A, - 0xAF, 0xA1, 0x48, 0xD6, 0xAF, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0x95, 0x7D, 0x95, 0xAC, 0xD9, 0x7D, - 0x48, 0xE6, 0x20, 0x20, 0x33, 0x89, 0x6B, 0x95, - 0xE8, 0xE8, 0xE8, 0xA3, 0x21, 0x48, 0xAF, 0xAF, - 0x9F, 0xE9, 0x43, 0x33, 0x33, 0x2D, 0xDA, 0xCD, - 0xD6, 0xAE, 0x85, 0x2C, 0x7D, 0xD6, 0x91, 0xB8, - 0xD4, 0x48, 0x7D, 0xA3, 0xE8, 0xE8, 0x95, 0x20, - 0x20, 0x33, 0xE3, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2C, 0x48, 0x6C, 0xB2, 0xAF, 0xDA, 0xDA, - 0x85, 0xAF, 0xD9, 0x95, 0xAC, 0xDA, 0x8A, 0xDA, - 0x7D, 0x48, 0x48, 0x7D, 0x2C, 0x85, 0x2C, 0xAF, - 0xD9, 0xD9, 0x7D, 0x95, 0xD9, 0xD9, 0x95, 0xD6, - 0x21, 0x24, 0x20, 0x20, 0x20, 0x5B, 0xDB, 0xAC, - 0xE8, 0xE8, 0xE8, 0x3D, 0x7D, 0x48, 0xE6, 0x2D, - 0x85, 0x81, 0x81, 0x48, 0xAE, 0xCA, 0x89, 0xCC, - 0xAE, 0xDB, 0x2D, 0x95, 0x21, 0xCC, 0xDB, 0xAE, - 0x91, 0xE9, 0x7D, 0x73, 0xE8, 0xE8, 0x48, 0x20, - 0x6B, 0x74, 0x41, 0x88, 0x6B, 0x20, 0x20, 0x20, - 0x6B, 0x95, 0xB2, 0xD6, 0xD9, 0x85, 0xDA, 0xDA, - 0xDA, 0x2C, 0xAF, 0xAF, 0x2C, 0xDA, 0xDA, 0x85, - 0xA1, 0xE9, 0x48, 0x95, 0x85, 0xDA, 0x85, 0xAC, - 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0x95, - 0x95, 0x6C, 0x41, 0x93, 0x93, 0x41, 0xDB, 0x95, - 0xE8, 0xE8, 0xE8, 0x3D, 0x95, 0xD4, 0x6C, 0x21, - 0x2D, 0x95, 0xCD, 0x2C, 0xD6, 0xD9, 0x6C, 0x91, - 0x89, 0x7D, 0xAC, 0x2A, 0x8D, 0xE6, 0xCC, 0x88, - 0x74, 0x48, 0xD9, 0xE4, 0xE8, 0xE8, 0xE6, 0x88, - 0x2B, 0x88, 0x20, 0x33, 0xDB, 0x2B, 0xDB, 0x20, - 0x91, 0x7D, 0xD9, 0xD9, 0x85, 0x85, 0xDA, 0xDA, - 0x85, 0xAF, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, - 0xA1, 0xA1, 0xD6, 0xAF, 0x85, 0xDA, 0x85, 0x2C, - 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0xAC, - 0x2C, 0x47, 0x87, 0x3E, 0x3E, 0xA4, 0x7B, 0x80, - 0xA3, 0xE8, 0xE8, 0x5C, 0x7D, 0x48, 0xE6, 0xD9, - 0xBC, 0xEE, 0x7D, 0x43, 0xD6, 0x21, 0x43, 0x6C, - 0x43, 0x7D, 0x7D, 0xB2, 0x8A, 0xEE, 0x2C, 0xCA, - 0xAE, 0x48, 0x2C, 0xE4, 0xE8, 0x5C, 0xCC, 0x88, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x91, 0xE3, - 0x21, 0xD9, 0x2C, 0x2C, 0xDA, 0xDA, 0xDA, 0x85, - 0x2C, 0xAC, 0xD9, 0xD9, 0xAC, 0xAF, 0xAF, 0xAF, - 0xD6, 0x7D, 0xD9, 0x2C, 0xDA, 0xDA, 0x85, 0xAC, - 0xD9, 0x7D, 0x7D, 0xD9, 0xD9, 0xD9, 0x2C, 0x2C, - 0xB8, 0x9C, 0xEC, 0x62, 0x6F, 0x62, 0x70, 0x3C, - 0xAE, 0xCD, 0xE8, 0xE8, 0x8C, 0x7D, 0xC8, 0x3D, - 0x8A, 0xE9, 0x2D, 0x9E, 0xA1, 0xD6, 0x48, 0x73, - 0x81, 0xD6, 0xD6, 0xAE, 0x5B, 0x2D, 0xA3, 0xA3, - 0x21, 0x21, 0xCD, 0xE8, 0xC0, 0x56, 0x31, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0xCC, 0xDB, - 0x42, 0x85, 0x85, 0x85, 0x85, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0xD9, 0xD9, 0xAC, 0xAF, 0xAF, 0xAF, - 0xD9, 0x95, 0xAC, 0x2C, 0x85, 0x85, 0x2C, 0xD9, - 0x7D, 0xD6, 0xD6, 0xD9, 0xAC, 0xAF, 0x8A, 0xBC, - 0xC2, 0x68, 0x2E, 0x4B, 0xC9, 0x8B, 0x62, 0x87, - 0x3C, 0x74, 0xBC, 0xE8, 0xE8, 0xE4, 0xEE, 0xA1, - 0xE9, 0x21, 0xE6, 0x89, 0x48, 0x7D, 0xB2, 0x5C, - 0x6C, 0x7D, 0x21, 0x80, 0xE3, 0x33, 0xCC, 0x2C, - 0x3D, 0x3D, 0xE8, 0xE8, 0xEC, 0xCB, 0x5A, 0x6B, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x88, 0x41, 0x51, - 0x49, 0x28, 0x85, 0x85, 0x85, 0x85, 0x2C, 0xAF, - 0xAC, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0xD9, 0x95, 0xD9, 0x2C, 0x85, 0x85, 0x2C, 0xD9, - 0xB2, 0xB2, 0x2C, 0x2A, 0x79, 0x79, 0x97, 0x44, - 0xED, 0x29, 0x32, 0x62, 0x4B, 0x62, 0x6F, 0x22, - 0xF3, 0x6B, 0x33, 0x85, 0x73, 0xE4, 0x2D, 0x2B, - 0xCC, 0x9F, 0xDA, 0xBC, 0x48, 0xD6, 0xA1, 0xE4, - 0xE9, 0xD6, 0xD9, 0x2A, 0xB2, 0x2B, 0x2B, 0xA1, - 0xB8, 0xE8, 0xE8, 0xE8, 0xEC, 0x3E, 0x30, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6B, 0x54, 0xDC, - 0xC9, 0x53, 0xBC, 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, - 0xAF, 0xAC, 0xAF, 0xAC, 0xAC, 0x2C, 0xAF, 0xAC, - 0x2C, 0x7D, 0xD9, 0x2C, 0x85, 0xDA, 0xAF, 0x7D, - 0xB2, 0xAC, 0xC6, 0xBA, 0x4C, 0xEF, 0xA7, 0xEF, - 0xEC, 0x7A, 0x62, 0x4B, 0x62, 0x4B, 0x8B, 0x4B, - 0x3A, 0x52, 0x20, 0x6B, 0x21, 0x73, 0xAC, 0x2B, - 0x41, 0x33, 0x48, 0x67, 0xA1, 0xD6, 0xD6, 0x5C, - 0xE9, 0xD6, 0x2C, 0xEE, 0xB2, 0x9F, 0x8A, 0x95, - 0x4D, 0xE8, 0xE8, 0x3D, 0x7A, 0x57, 0xD1, 0x7B, - 0x20, 0x20, 0x20, 0x20, 0x6B, 0xCF, 0xBA, 0x3E, - 0x3E, 0xD0, 0xBC, 0xAC, 0xAC, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0x95, 0x95, 0x7D, 0x95, 0x95, 0xD9, - 0x85, 0xD9, 0xAF, 0xDA, 0xDA, 0x85, 0xAC, 0x21, - 0xB2, 0x2A, 0xBA, 0x57, 0x2E, 0x2E, 0x2E, 0x7A, - 0x32, 0x62, 0x8B, 0x4B, 0x8B, 0x4B, 0x4B, 0x4B, - 0xC9, 0x4A, 0x5F, 0x20, 0x20, 0x2D, 0xA3, 0xD9, - 0xCA, 0x88, 0xDB, 0x24, 0x48, 0x7D, 0xB2, 0xE4, - 0x2D, 0x7D, 0x7D, 0x81, 0xA1, 0xDA, 0x21, 0xDA, - 0xE4, 0xE8, 0xEE, 0xF1, 0x2E, 0x57, 0x82, 0x76, - 0x52, 0x4F, 0x4F, 0x98, 0xDE, 0xB5, 0xEC, 0x2E, - 0x3E, 0x6D, 0x85, 0x2C, 0xAC, 0xAC, 0xD9, 0xD9, - 0x95, 0xD6, 0x7D, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, - 0xDA, 0x2C, 0x85, 0xDA, 0xDA, 0x2C, 0x95, 0xB2, - 0x21, 0xB8, 0xED, 0x2E, 0x3E, 0x4B, 0xC9, 0x4B, - 0x8B, 0x62, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x22, 0x6F, 0xCE, 0x20, 0x20, 0x20, 0x80, 0xCD, - 0xDA, 0x2D, 0x2B, 0xDB, 0xE9, 0xD6, 0x95, 0x5C, - 0x2D, 0x7D, 0x7D, 0xAF, 0xAF, 0xAC, 0xEE, 0x5C, - 0xE8, 0xE8, 0xEB, 0x25, 0x7A, 0x57, 0x39, 0xE1, - 0x83, 0xA8, 0x55, 0x83, 0x82, 0x57, 0x32, 0x8B, - 0x62, 0x6D, 0xEB, 0x95, 0xD9, 0xD9, 0xD9, 0xD9, - 0xD9, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, - 0xDA, 0x2C, 0x85, 0x85, 0x85, 0xAC, 0xD6, 0x21, - 0x95, 0x6E, 0xED, 0x57, 0x62, 0x4B, 0x8B, 0x4B, - 0x4B, 0x62, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x62, - 0x62, 0x62, 0x25, 0x3C, 0x20, 0x20, 0x20, 0xE3, - 0x2A, 0xBC, 0x7D, 0xCA, 0x6C, 0xD6, 0x95, 0x3D, - 0x81, 0x7D, 0xD6, 0xD6, 0xDA, 0x73, 0xE8, 0xE8, - 0xE8, 0x4D, 0x94, 0xED, 0x72, 0x3A, 0xF1, 0xA7, - 0x39, 0xED, 0x39, 0xEF, 0x57, 0x32, 0x8B, 0x4B, - 0x62, 0x62, 0xA6, 0x2A, 0xD9, 0xD9, 0xD9, 0xD9, - 0x2C, 0x2C, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x2C, 0x2C, 0xAF, 0xAC, 0x95, 0x21, 0x7D, - 0xAC, 0x8C, 0x46, 0xC4, 0x62, 0x8B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x62, 0xC9, 0x30, 0x7B, 0x20, 0x20, 0x20, - 0x41, 0x4D, 0x3D, 0x85, 0x48, 0x21, 0xDA, 0x3D, - 0xE9, 0xD6, 0xD9, 0xCD, 0x5C, 0xE8, 0xE8, 0xE8, - 0xE8, 0x4D, 0x71, 0x46, 0xEC, 0x2E, 0x72, 0xEC, - 0x29, 0x29, 0x7C, 0x29, 0x2E, 0x4B, 0x4B, 0x62, - 0x62, 0x4B, 0x3A, 0xAD, 0xE2, 0xAF, 0xD9, 0xD9, - 0x2C, 0xDA, 0xDA, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, - 0x2C, 0xAF, 0xAC, 0xD9, 0x95, 0xD6, 0xD6, 0xD9, - 0x2C, 0x8C, 0xBA, 0x7C, 0x2E, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x62, 0xC9, 0xDC, 0x34, 0x20, 0x20, 0x20, - 0x20, 0xAC, 0xE8, 0x5C, 0x8C, 0xBC, 0xE4, 0xE8, - 0xEE, 0x2A, 0xA3, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE4, 0x7E, 0x65, 0x46, 0x29, 0x62, 0x62, 0x2E, - 0x2E, 0x72, 0x2E, 0x2E, 0x32, 0x4B, 0x4B, 0x62, - 0x4B, 0x4B, 0x4B, 0x32, 0x61, 0x9D, 0x2C, 0xD9, - 0x2C, 0x85, 0xDA, 0x85, 0x2C, 0xAF, 0xAF, 0xAF, - 0x2C, 0xAC, 0xD9, 0x95, 0xD6, 0x7D, 0x95, 0xAC, - 0x2C, 0xDA, 0x40, 0x7C, 0x2E, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x62, 0x62, 0x22, 0xB7, 0xCE, 0x20, 0x20, - 0x20, 0x95, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, - 0x3D, 0xE9, 0x9A, 0x46, 0x7C, 0x32, 0x8B, 0x62, - 0x4B, 0x8B, 0x8B, 0x4B, 0x4B, 0x4B, 0x4B, 0x62, - 0x4B, 0x4B, 0x4B, 0x4B, 0x62, 0x61, 0x4E, 0xDA, - 0x85, 0x85, 0x85, 0x2C, 0xD9, 0xD9, 0xD9, 0xD9, - 0x85, 0xD9, 0x7D, 0x21, 0x21, 0xD6, 0xAC, 0x2C, - 0x2C, 0xDA, 0xDD, 0x77, 0x8B, 0x62, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x3E, 0x8B, 0x32, 0xC9, 0x22, 0x68, 0x88, 0x33, - 0xA1, 0x73, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0x5C, 0x5C, 0x5C, 0x5C, 0x3D, - 0x89, 0x20, 0x54, 0x23, 0x29, 0x2E, 0x4B, 0x62, - 0x4B, 0x3E, 0x4B, 0x62, 0x4B, 0x4B, 0x4B, 0x8B, - 0x8B, 0xC9, 0x6F, 0x4B, 0x8B, 0x4B, 0x78, 0xE2, - 0x8A, 0x8A, 0x85, 0xAC, 0xD9, 0x7D, 0xD9, 0xAC, - 0x2C, 0xD9, 0xD6, 0xB2, 0x21, 0x7D, 0xAF, 0x85, - 0x2C, 0xDA, 0x40, 0xEF, 0x62, 0x62, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x8B, 0x4B, 0xC9, 0x63, 0xB4, 0x5C, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, 0x5C, 0xCD, 0xAE, - 0x20, 0x20, 0xCE, 0xE1, 0x57, 0x32, 0x4B, 0x4B, - 0x8B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x8B, 0x4B, 0x62, 0x4B, 0x62, 0x2E, 0x61, 0x28, - 0x8D, 0xDA, 0xAF, 0xD9, 0x95, 0x95, 0xD9, 0xAF, - 0xAF, 0xD9, 0xD6, 0xB2, 0x21, 0xD9, 0x2C, 0x85, - 0xAF, 0xEB, 0xE1, 0x57, 0x2E, 0x62, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x3E, 0x9B, 0x31, 0x6E, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0x5C, 0xE8, 0xE8, 0xE8, 0x3D, 0x7D, 0x33, 0x6B, - 0x20, 0x20, 0x34, 0x23, 0x29, 0x3E, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x3E, 0x62, 0x62, 0x2E, 0xC4, 0x49, 0xD5, - 0xDA, 0xD9, 0xD6, 0xA1, 0xA1, 0x21, 0xD9, 0xD9, - 0xD9, 0x95, 0x21, 0x48, 0xD6, 0xAC, 0x85, 0x85, - 0xAF, 0xB6, 0x5D, 0x2E, 0x32, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x62, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x62, 0x2E, 0x45, 0xDE, - 0xDA, 0x5C, 0xE8, 0x5C, 0xE8, 0xE8, 0x5C, 0xE8, - 0x5C, 0x5C, 0xA3, 0xAC, 0x2B, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x34, 0x23, 0x29, 0x62, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x62, 0x4B, 0x4B, 0x4B, - 0x4B, 0x3E, 0x3E, 0x63, 0x40, 0x97, 0x28, 0xDA, - 0xD9, 0xA1, 0x48, 0xE9, 0x48, 0x21, 0xD9, 0xD9, - 0xA1, 0xB2, 0xB2, 0xA1, 0x21, 0xAC, 0x85, 0x2C, - 0xDA, 0x36, 0x77, 0x72, 0x62, 0x8B, 0x62, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x3E, 0xEC, 0x2F, 0x51, - 0xE3, 0xAE, 0x48, 0x2C, 0xDA, 0xDA, 0x85, 0xAC, - 0x48, 0x9E, 0x88, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x41, 0xA0, 0x23, 0x72, 0x2E, 0x4B, 0x4B, - 0x4B, 0x62, 0x62, 0x4B, 0x4B, 0x4B, 0x2E, 0x8B, - 0xF0, 0x4C, 0x40, 0xC2, 0x90, 0x8D, 0x85, 0xD9, - 0xA1, 0x6C, 0x6C, 0x48, 0xD6, 0xD9, 0xAF, 0xAC, - 0xA1, 0xD6, 0xD6, 0xB2, 0xD6, 0xAC, 0x85, 0x85, - 0x4D, 0xBE, 0x39, 0x4C, 0x57, 0x2E, 0x2E, 0x2E, - 0x3E, 0x3E, 0x62, 0x3E, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x8B, 0x8B, 0x57, 0x60, 0x76, - 0x52, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0xA0, 0x23, 0x7C, 0x2E, 0x4B, 0x4B, - 0x8B, 0x62, 0x4B, 0x4B, 0x3E, 0x7A, 0xF0, 0x29, - 0x36, 0x97, 0xBC, 0x8A, 0x8D, 0xDA, 0xD9, 0x48, - 0x81, 0x2D, 0x48, 0xD6, 0xD9, 0xAF, 0x2C, 0x2C, - 0xAC, 0xAF, 0xD9, 0x7D, 0x7D, 0x2C, 0x85, 0x85, - 0x85, 0xB4, 0x66, 0x23, 0x46, 0x2F, 0x60, 0x68, - 0x77, 0x29, 0x29, 0xF0, 0x2E, 0x2E, 0x62, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x32, 0x7C, 0x83, 0xB3, - 0x54, 0x6B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6B, 0x7B, 0xC3, 0xE7, 0x39, 0x72, 0x62, 0x62, - 0x62, 0x62, 0x62, 0x2E, 0x29, 0x77, 0xA7, 0x36, - 0xB8, 0x85, 0x85, 0x8D, 0x8D, 0x85, 0xB2, 0x2D, - 0x2D, 0xE9, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, - 0x2A, 0x85, 0xAC, 0x95, 0x95, 0xAF, 0x85, 0x85, - 0xAF, 0x8C, 0xDF, 0xC6, 0xB1, 0xD1, 0xE5, 0xE7, - 0x83, 0x23, 0x5D, 0x60, 0x39, 0x77, 0xEC, 0x2E, - 0x2E, 0x32, 0x32, 0x2E, 0x7C, 0x5D, 0x35, 0xA2, - 0x54, 0x6B, 0x6B, 0x20, 0x6B, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6B, 0x88, 0xC1, 0x35, 0xE1, 0x77, 0x57, 0x2E, - 0x2E, 0x72, 0x29, 0x77, 0x60, 0xB5, 0x44, 0xE2, - 0x2C, 0x2C, 0xDA, 0x8A, 0xDA, 0xAF, 0xA1, 0x2D, - 0xE9, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, 0x85, - 0xEE, 0xAF, 0xD9, 0x7D, 0xD9, 0x2C, 0xDA, 0x85, - 0xAC, 0xAF, 0x85, 0xDA, 0x8A, 0x2A, 0xE2, 0x50, - 0x86, 0xD7, 0x75, 0x35, 0xA8, 0xE7, 0xE1, 0x5D, - 0x68, 0x7C, 0xF1, 0x68, 0xE1, 0xBF, 0xA2, 0xC1, - 0x52, 0x2B, 0x7D, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, - 0x2C, 0x85, 0x85, 0x85, 0x2C, 0x2C, 0x2C, 0x95, - 0xE9, 0x74, 0xCE, 0xE0, 0xE7, 0x60, 0x77, 0x77, - 0x7C, 0xEF, 0x5D, 0x23, 0x3F, 0xB6, 0x8A, 0x2C, - 0xAC, 0xAF, 0x85, 0x8A, 0x85, 0xD9, 0x48, 0x48, - 0xB2, 0x95, 0x95, 0xD9, 0x85, 0xDA, 0x85, 0x85, - 0xD3, 0xB2, 0x21, 0x7D, 0xAC, 0x2C, 0xDA, 0x85, - 0xAC, 0xAC, 0x85, 0x85, 0x85, 0x2C, 0xAF, 0x2C, - 0xDA, 0x8C, 0x79, 0xC7, 0xB0, 0x51, 0xB3, 0x35, - 0xBF, 0xE5, 0xE7, 0xA8, 0xE0, 0xA2, 0xC1, 0x34, - 0x7D, 0x85, 0xAC, 0xD9, 0xAC, 0xAF, 0xAC, 0xAC, - 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0x85, - 0xC8, 0xCD, 0x6A, 0x26, 0x35, 0x3F, 0x83, 0x23, - 0x23, 0xE7, 0xBF, 0x96, 0xEB, 0xDA, 0xDA, 0x2C, - 0x2C, 0x2C, 0x85, 0xDA, 0x2C, 0x7D, 0xA1, 0x48, - 0xB2, 0x21, 0xD6, 0xD9, 0x2C, 0xDA, 0x85, 0xAF, - 0xAF, 0x2D, 0xE9, 0x7D, 0xAC, 0x2C, 0x85, 0x2C, - 0xD9, 0xD9, 0xAF, 0x85, 0x85, 0x85, 0x2C, 0x2C, - 0x2C, 0x85, 0xD9, 0x21, 0xAC, 0x2C, 0xBD, 0xA5, - 0xC3, 0xA2, 0xA2, 0xA2, 0x26, 0xC1, 0xCE, 0x2A, - 0xAF, 0x95, 0xD9, 0x2C, 0x2C, 0x85, 0x2C, 0xAF, - 0xAC, 0x2C, 0x85, 0x2C, 0xAF, 0x2C, 0x85, 0xDA, - 0x8D, 0x2A, 0x85, 0x34, 0xC1, 0xB3, 0x76, 0x35, - 0xE0, 0x30, 0xA5, 0xB6, 0x2C, 0x85, 0x85, 0x85, - 0xAF, 0x2C, 0x85, 0x85, 0xD9, 0xD6, 0xA1, 0xA1, - 0x48, 0xA1, 0xD6, 0xAF, 0xDA, 0x8A, 0x2C, 0xD9, - 0xB2, 0x2D, 0x48, 0xD9, 0xAF, 0x2C, 0x2C, 0x85, - 0xAF, 0xAC, 0x2C, 0x85, 0x85, 0x85, 0xAF, 0xAC, - 0xAC, 0x2C, 0xD9, 0xD6, 0xD6, 0x21, 0xB2, 0x2C, - 0xC8, 0x3B, 0x65, 0xC5, 0xCE, 0x8E, 0xC8, 0x2C, - 0xD9, 0x95, 0xAC, 0x2C, 0x2C, 0x2C, 0xAF, 0xAC, - 0xAC, 0xAF, 0x2C, 0x85, 0x2C, 0x2C, 0x2C, 0x85, - 0xDA, 0x2C, 0xD6, 0xAF, 0x59, 0x65, 0xDE, 0xF3, - 0xF3, 0x59, 0xBC, 0xAC, 0xAF, 0x85, 0x85, 0x85, - 0xAF, 0xD9, 0xAF, 0x2C, 0xD9, 0xD6, 0xD6, 0xD6, - 0x21, 0xD6, 0xD9, 0xDA, 0x8D, 0x8A, 0x2C, 0xD9, - 0xB2, 0xA1, 0xD6, 0xAC, 0x2C, 0x2C, 0x2C, 0x85, - 0x2C, 0xAC, 0x2C, 0xDA, 0xDA, 0x85, 0xAF, 0xD9, - 0xD9, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xAC, - 0x85, 0x2A, 0x4D, 0xBC, 0x85, 0xAC, 0xAF, 0xAF, - 0xAC, 0xD9, 0xAF, 0x2C, 0xAF, 0xD9, 0xD9, 0xAC, - 0xAC, 0xAF, 0x85, 0x2C, 0x85, 0x2C, 0x2C, 0x2C, - 0x2C, 0xD9, 0xB2, 0xD4, 0xD6, 0x2C, 0x8A, 0xDA, - 0xC8, 0x85, 0x2C, 0xAC, 0x2C, 0xDA, 0xDA, 0x85, - 0xAF, 0xAC, 0xD9, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, - 0xD9, 0xAC, 0xDA, 0x8D, 0xBC, 0xDA, 0xD9, 0x95, - 0x95, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0x2C, 0x85, - 0x2C, 0xAF, 0xAF, 0x85, 0x85, 0x85, 0x2C, 0xAC, - 0xD9, 0xAF, 0xAF, 0xAF, 0x2C, 0x2C, 0x2C, 0x85, - 0x8A, 0x2A, 0x8D, 0x2C, 0xD9, 0x95, 0xAC, 0xAC, - 0xD9, 0xD9, 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xAF, - 0xAF, 0x2C, 0x85, 0x85, 0x85, 0x85, 0x85, 0x2C, - 0x85, 0x2C, 0xD9, 0xD9, 0xD9, 0x2C, 0x2C, 0x2C, - 0x2C, 0x85, 0x85, 0xAF, 0xAF, 0x85, 0x85, 0x85, - 0xAF, 0xD9, 0xD9, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, - 0x2C, 0x85, 0x8A, 0x2A, 0x8D, 0x2C, 0xD9, 0xD9, - 0x2C, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0x85, 0xAF, 0xAC, 0x2C, 0x2C, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0xAF, 0x85, 0x85, 0x85, 0xDA, 0xDA, - 0x8A, 0x8A, 0x85, 0xAC, 0xD9, 0xD9, 0xAC, 0xD9, - 0xD6, 0xD6, 0x7D, 0x95, 0x7D, 0xD9, 0xAF, 0xAF, - 0xAF, 0x2C, 0x85, 0x85, 0xDA, 0x85, 0x2C, 0x85, - 0x85, 0x2C, 0xAF, 0xAC, 0xAF, 0xAF, 0x2C, 0x2C, - 0x2C, 0x2C, 0x2C, 0xAF, 0xAC, 0x2C, 0x2C, 0x2C, - 0x2C, 0xAF, 0xD9, 0xAC, 0xAF, 0x2C, 0x85, 0x85, - 0x85, 0xDA, 0x8D, 0x8A, 0x85, 0xAC, 0x95, 0xD9 + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x26, 0x26, 0x25, 0x28, 0x23, 0x22, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x25, 0x2a, 0x2b, 0x2c, 0x2d, 0x2d, + 0x2d, 0x2e, 0x2c, 0x2b, 0x2a, 0x25, 0x28, 0x22, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x2a, 0x2c, 0x2f, 0x2c, 0x30, 0x30, 0x24, + 0x25, 0x27, 0x2b, 0x2c, 0x2f, 0x31, 0x32, 0x25, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x33, 0x34, 0x35, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x2b, 0x2f, 0x2c, + 0x30, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x2d, 0x27, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x31, + 0x2d, 0x32, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, 0x2a, 0x34, + 0x25, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x23, 0x32, 0x27, 0x21, 0x36, + 0x2a, 0x2d, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x26, 0x2c, 0x35, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2f, 0x37, 0x32, 0x22, + 0x36, 0x35, 0x31, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x22, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x26, 0x38, 0x38, 0x35, 0x25, + 0x36, 0x21, 0x2d, 0x2b, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x39, 0x39, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2b, 0x30, 0x28, 0x22, + 0x36, 0x36, 0x27, 0x34, 0x30, 0x23, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x26, 0x2d, 0x26, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x22, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2d, 0x33, 0x28, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2b, 0x2c, 0x25, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x36, 0x36, + 0x36, 0x21, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x21, 0x23, 0x22, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x28, 0x34, 0x27, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x21, 0x21, 0x24, 0x27, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x27, 0x22, 0x33, 0x24, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x2f, 0x2a, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x30, 0x3a, 0x38, 0x24, 0x24, 0x36, 0x36, 0x36, + 0x23, 0x2f, 0x3b, 0x3c, 0x3d, 0x30, 0x25, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x32, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x23, + 0x3e, 0x3f, 0x40, 0x3a, 0x22, 0x36, 0x36, 0x21, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x3e, 0x23, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x33, 0x28, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x2b, + 0x44, 0x40, 0x46, 0x47, 0x35, 0x36, 0x36, 0x26, + 0x43, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x34, 0x36, 0x4d, + 0x4e, 0x25, 0x2f, 0x46, 0x4a, 0x22, 0x23, 0x32, + 0x4f, 0x50, 0x21, 0x31, 0x51, 0x52, 0x53, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x21, 0x3a, + 0x4d, 0x21, 0x31, 0x54, 0x55, 0x28, 0x30, 0x2b, + 0x4b, 0x4d, 0x36, 0x23, 0x32, 0x50, 0x3f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x38, 0x23, 0x37, + 0x55, 0x36, 0x28, 0x3a, 0x56, 0x57, 0x57, 0x58, + 0x3c, 0x4d, 0x36, 0x36, 0x36, 0x40, 0x40, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x51, 0x23, 0x35, + 0x43, 0x25, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, + 0x5f, 0x60, 0x61, 0x36, 0x31, 0x47, 0x3b, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x2c, 0x25, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x22, + 0x40, 0x62, 0x63, 0x5d, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x66, 0x5e, 0x6a, 0x6b, 0x2a, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x2e, 0x26, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2f, 0x23, 0x36, + 0x6c, 0x63, 0x6d, 0x64, 0x5c, 0x66, 0x69, 0x6e, + 0x6f, 0x70, 0x71, 0x69, 0x69, 0x72, 0x6c, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x34, 0x27, 0x22, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x34, 0x26, 0x73, + 0x74, 0x75, 0x76, 0x64, 0x65, 0x77, 0x69, 0x78, + 0x70, 0x71, 0x71, 0x71, 0x72, 0x5f, 0x5e, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x25, 0x38, 0x2a, 0x23, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x33, 0x79, + 0x63, 0x7a, 0x7b, 0x5c, 0x66, 0x69, 0x6e, 0x7c, + 0x71, 0x71, 0x69, 0x7d, 0x7e, 0x7a, 0x7f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x51, 0x2b, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x32, 0x24, + 0x80, 0x81, 0x64, 0x82, 0x77, 0x69, 0x71, 0x71, + 0x69, 0x83, 0x84, 0x85, 0x7a, 0x85, 0x86, 0x36, + 0x21, 0x2b, 0x23, 0x36, 0x36, 0x39, 0x2e, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2d, 0x33, 0x21, + 0x87, 0x88, 0x89, 0x72, 0x67, 0x66, 0x5f, 0x89, + 0x8a, 0x63, 0x85, 0x8b, 0x8c, 0x8d, 0x41, 0x36, + 0x36, 0x2d, 0x3a, 0x35, 0x36, 0x24, 0x51, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x33, 0x21, + 0x55, 0x8e, 0x8f, 0x8a, 0x7d, 0x5e, 0x90, 0x7e, + 0x75, 0x75, 0x90, 0x62, 0x40, 0x3f, 0x49, 0x23, + 0x36, 0x24, 0x3a, 0x3a, 0x24, 0x36, 0x2e, 0x31, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x33, 0x37, 0x25, 0x22, + 0x3b, 0x50, 0x8e, 0x8f, 0x90, 0x7e, 0x90, 0x63, + 0x74, 0x91, 0x92, 0x42, 0x93, 0x4b, 0x45, 0x2c, + 0x36, 0x36, 0x33, 0x39, 0x21, 0x36, 0x22, 0x51, + 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x27, 0x2e, 0x2e, 0x36, 0x21, + 0x94, 0x3f, 0x50, 0x95, 0x96, 0x8f, 0x8f, 0x97, + 0x8e, 0x42, 0x50, 0x43, 0x47, 0x48, 0x48, 0x98, + 0x21, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, + 0x2e, 0x27, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x2b, 0x38, 0x28, 0x36, 0x32, + 0x4c, 0x4b, 0x50, 0x50, 0x50, 0x42, 0x42, 0x50, + 0x50, 0x40, 0x45, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x23, + 0x2f, 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x32, 0x51, 0x32, 0x28, 0x21, 0x98, + 0x48, 0x47, 0x9a, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x9a, 0x4f, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x93, 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2f, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x23, 0x30, 0x2e, 0x2c, 0x36, 0x21, 0x51, 0x9b, + 0x48, 0x48, 0x52, 0x3f, 0x50, 0x50, 0x40, 0x4b, + 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2d, 0x31, 0x27, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x2c, 0x2d, 0x21, 0x36, 0x28, 0x44, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x46, 0x4f, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x9c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x28, 0x51, 0x39, 0x26, 0x22, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x35, 0x51, 0x28, 0x36, 0x36, 0x9d, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x9b, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4f, 0x28, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x38, 0x2b, 0x25, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x51, 0x25, 0x36, 0x36, 0x23, 0x40, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x9b, 0x99, 0x2b, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x2f, 0x33, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x23, 0x30, 0x34, + 0x27, 0x36, 0x36, 0x36, 0x2a, 0x40, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x99, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x47, 0x52, + 0x46, 0x4f, 0x37, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x30, 0x34, 0x2a, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, 0x39, 0x2c, + 0x36, 0x36, 0x36, 0x21, 0x31, 0x4e, 0x9a, 0x4c, + 0x47, 0x9b, 0x9b, 0x52, 0x46, 0x4f, 0x52, 0x9b, + 0x9b, 0x9b, 0x47, 0x4f, 0x45, 0x9a, 0x93, 0x93, + 0x3f, 0x93, 0x98, 0x28, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x28, + 0x36, 0x36, 0x36, 0x22, 0x38, 0x98, 0x44, 0x99, + 0x9b, 0x48, 0x48, 0x9b, 0x4c, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x52, 0x46, 0x43, 0x93, + 0x40, 0x40, 0x43, 0x53, 0x21, 0x23, 0x33, 0x23, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x2f, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x2b, 0x31, 0x36, + 0x36, 0x22, 0x36, 0x24, 0x9e, 0x4f, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x47, + 0x4f, 0x9a, 0x3f, 0x46, 0x38, 0x36, 0x21, 0x30, + 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, + 0x25, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2e, 0x33, 0x36, + 0x25, 0x25, 0x36, 0x4d, 0x52, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x4f, 0x3e, 0x4d, 0x49, 0x48, + 0x98, 0x2b, 0x55, 0x4f, 0x9b, 0x48, 0x48, 0x48, + 0x48, 0x47, 0x44, 0x93, 0x43, 0x23, 0x36, 0x36, + 0x26, 0x24, 0x36, 0x36, 0x36, 0x36, 0x28, 0x2f, + 0x2a, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x51, 0x24, 0x36, + 0x2a, 0x36, 0x28, 0x44, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4f, 0x54, 0x38, 0x3d, 0x98, 0x37, 0x9b, + 0x3a, 0x22, 0x23, 0x2a, 0x55, 0x4f, 0x48, 0x48, + 0x48, 0x48, 0x9b, 0x4b, 0x44, 0x37, 0x36, 0x23, + 0x28, 0x30, 0x22, 0x36, 0x36, 0x36, 0x36, 0x2d, + 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x2b, 0x34, 0x36, 0x25, + 0x24, 0x36, 0x4a, 0x48, 0x48, 0x48, 0x48, 0x52, + 0x53, 0x37, 0x54, 0x98, 0x55, 0x38, 0x38, 0x47, + 0x4a, 0x2d, 0x30, 0x23, 0x28, 0x39, 0x53, 0x52, + 0x48, 0x48, 0x48, 0x9b, 0x52, 0x3f, 0x21, 0x30, + 0x35, 0x25, 0x30, 0x36, 0x36, 0x36, 0x36, 0x32, + 0x2d, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x26, 0x2e, 0x35, 0x36, 0x2a, + 0x36, 0x24, 0x4f, 0x48, 0x48, 0x9b, 0x55, 0x39, + 0x55, 0x53, 0x3a, 0x55, 0x3a, 0x51, 0x51, 0x47, + 0x55, 0x3a, 0x4d, 0x37, 0x30, 0x22, 0x24, 0x2b, + 0x54, 0x9b, 0x48, 0x48, 0x48, 0x47, 0x32, 0x30, + 0x2a, 0x23, 0x30, 0x23, 0x36, 0x36, 0x36, 0x21, + 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x2a, 0x51, 0x28, 0x28, 0x25, + 0x36, 0x3a, 0x48, 0x48, 0x48, 0x4f, 0x26, 0x23, + 0x26, 0x39, 0x3e, 0x43, 0x49, 0x37, 0x2f, 0x9b, + 0x55, 0x3a, 0x54, 0x43, 0x3e, 0x30, 0x32, 0x3d, + 0x49, 0x3f, 0x48, 0x48, 0x48, 0x48, 0x38, 0x21, + 0x36, 0x36, 0x22, 0x27, 0x36, 0x36, 0x36, 0x36, + 0x2e, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x25, 0x2c, 0x34, 0x36, 0x30, 0x21, + 0x23, 0x43, 0x48, 0x48, 0x48, 0x47, 0x3b, 0x32, + 0x21, 0x28, 0x2b, 0x9e, 0x49, 0x37, 0x2e, 0x52, + 0x4a, 0x37, 0x9e, 0x98, 0x51, 0x3a, 0x93, 0x54, + 0x55, 0x4f, 0x48, 0x48, 0x48, 0x48, 0x94, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2e, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x2a, 0x51, 0x25, 0x21, 0x2a, 0x36, + 0x2e, 0x9b, 0x48, 0x48, 0x52, 0x4b, 0x52, 0x9e, + 0x51, 0x30, 0x22, 0x28, 0x32, 0x32, 0x39, 0x47, + 0x37, 0x2a, 0x39, 0x3a, 0x50, 0x9f, 0x3a, 0x9f, + 0x4b, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x98, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x22, 0x2f, 0x30, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x25, 0x2c, 0x34, 0x36, 0x24, 0x28, 0x36, + 0x54, 0x48, 0x48, 0x45, 0x30, 0x30, 0x9e, 0x52, + 0x45, 0x3a, 0x31, 0x25, 0x22, 0x25, 0x2a, 0x98, + 0x39, 0x2f, 0x42, 0x49, 0x4a, 0x3b, 0x50, 0x47, + 0x43, 0x9d, 0x3b, 0x4b, 0x48, 0x48, 0x9a, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x36, 0x36, 0x36, 0x36, + 0x21, 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x32, 0x2f, 0x28, 0x36, 0x27, 0x22, 0x21, + 0x43, 0x48, 0x48, 0x50, 0x30, 0x23, 0x25, 0x2f, + 0x3f, 0x52, 0x49, 0x51, 0x39, 0x25, 0x24, 0x2b, + 0x9e, 0x42, 0x3e, 0x55, 0x9e, 0x4f, 0x4f, 0x54, + 0x4a, 0x9e, 0x49, 0x50, 0x48, 0x48, 0x4b, 0x21, + 0x36, 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x25, 0x2c, 0x39, 0x36, 0x36, 0x30, 0x22, 0x25, + 0x52, 0x48, 0x48, 0x45, 0x3a, 0x51, 0x26, 0x23, + 0x30, 0x9d, 0x45, 0x40, 0x3a, 0x39, 0x2b, 0x2b, + 0x3b, 0x3a, 0x55, 0x4b, 0x47, 0x9e, 0x3a, 0x49, + 0x9e, 0x9f, 0x3b, 0x9a, 0x48, 0x48, 0x4f, 0x21, + 0x36, 0x36, 0x22, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x30, 0x2d, 0x21, 0x36, 0x36, 0x32, 0x23, 0x2a, + 0x47, 0x48, 0x48, 0x43, 0x3e, 0x3a, 0x9d, 0x2b, + 0x23, 0x25, 0x39, 0x4d, 0x2b, 0x31, 0x2d, 0x9d, + 0x34, 0x2e, 0x2f, 0x9e, 0x3a, 0x55, 0x3f, 0x9f, + 0x9f, 0x3e, 0x55, 0x43, 0x48, 0x48, 0x4c, 0x22, + 0x36, 0x36, 0x24, 0x23, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0x2e, 0x36, 0x36, 0x23, 0x31, 0x27, 0x39, + 0x9b, 0x48, 0x48, 0x4f, 0x3e, 0x4d, 0x55, 0x9e, + 0x51, 0x24, 0x23, 0x26, 0x32, 0x2c, 0x3b, 0x4b, + 0x55, 0x32, 0x2b, 0x37, 0x98, 0x9e, 0x3e, 0x9e, + 0x55, 0x37, 0x3e, 0x4b, 0x48, 0x48, 0x4c, 0x23, + 0x36, 0x36, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x2b, 0x39, 0x36, 0x36, 0x36, 0x26, 0x32, 0x31, + 0x9b, 0x48, 0x48, 0x4f, 0x55, 0x3a, 0x53, 0x53, + 0x2e, 0x9d, 0x34, 0x28, 0x28, 0x37, 0x98, 0x45, + 0x3e, 0x2b, 0x49, 0x9e, 0x3b, 0x3e, 0x2d, 0x6b, + 0x4a, 0x3a, 0x3b, 0x4f, 0x48, 0x48, 0x46, 0x22, + 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x39, 0x36, 0x36, 0x36, 0x36, 0x26, 0x2d, + 0x9b, 0x48, 0x48, 0x47, 0x3b, 0x3a, 0x2f, 0x37, + 0x49, 0x38, 0x38, 0x3a, 0x2b, 0x31, 0x51, 0x32, + 0x2b, 0x26, 0x37, 0x9f, 0x55, 0x32, 0x26, 0x2b, + 0x2d, 0x9d, 0x3b, 0x52, 0x48, 0x48, 0x9a, 0x36, + 0x24, 0x27, 0xa0, 0x24, 0x25, 0x28, 0x21, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x25, + 0x39, 0x4d, 0xa1, 0x84, 0x81, 0x57, 0x21, 0x39, + 0x52, 0x48, 0x48, 0x47, 0x9f, 0x4a, 0x4d, 0x55, + 0x37, 0x9f, 0x45, 0x9e, 0x3e, 0x54, 0x4d, 0x2d, + 0x51, 0x3b, 0x3d, 0x40, 0x50, 0x2f, 0x32, 0x23, + 0x2a, 0x3a, 0x54, 0x47, 0x48, 0x48, 0x53, 0x28, + 0x23, 0x36, 0x36, 0x36, 0x21, 0x28, 0x2c, 0x30, + 0x21, 0x38, 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x28, 0x30, + 0x2d, 0xa2, 0x7a, 0xa3, 0xa4, 0xa4, 0x7f, 0x22, + 0x51, 0x52, 0x48, 0x9b, 0x3b, 0x3a, 0x2f, 0x54, + 0x3f, 0x4b, 0x3b, 0x34, 0x3e, 0x55, 0x34, 0x4d, + 0x34, 0x3b, 0x3b, 0x55, 0x42, 0x4b, 0x9e, 0x31, + 0x2b, 0x3a, 0x9e, 0x47, 0xa5, 0xa5, 0xa6, 0x61, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x30, 0x32, + 0x25, 0x4d, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x24, 0x26, 0x30, 0x33, 0x31, + 0x4d, 0x91, 0x5b, 0xa3, 0xa4, 0xa4, 0xa4, 0x5a, + 0x21, 0x2e, 0x46, 0x48, 0x9a, 0x3b, 0x42, 0x47, + 0x42, 0x9d, 0x37, 0x39, 0x4a, 0x3e, 0x3a, 0x52, + 0x38, 0x3e, 0x3e, 0x2b, 0x25, 0x37, 0x4f, 0x4f, + 0x55, 0x55, 0x45, 0xa7, 0xa8, 0x69, 0x66, 0xa9, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x26, 0x25, + 0x83, 0xaa, 0x2c, 0x25, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x30, 0x35, 0x2d, 0x2f, 0x37, 0x4a, + 0x60, 0x85, 0xab, 0xac, 0xa4, 0xa4, 0xa4, 0x82, + 0x86, 0x36, 0x32, 0x3f, 0x48, 0x47, 0x4b, 0x4a, + 0x9d, 0x55, 0x2f, 0x51, 0x3a, 0x3b, 0x55, 0x9b, + 0x4d, 0x3b, 0x55, 0x39, 0x24, 0x28, 0x32, 0x9e, + 0x47, 0x47, 0x48, 0xad, 0xa3, 0xa8, 0xae, 0xaf, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x57, + 0x77, 0x66, 0x34, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x23, 0x30, 0x31, 0xb0, 0x91, 0x7e, 0x90, 0x90, + 0x8b, 0x5b, 0xa3, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0x5d, 0xb1, 0x36, 0x24, 0x53, 0x47, 0x37, 0x30, + 0x32, 0x2e, 0x98, 0x3f, 0x3a, 0x3e, 0x4a, 0x47, + 0x9d, 0x3e, 0x54, 0x40, 0x55, 0x30, 0x30, 0x4a, + 0x6b, 0x9b, 0x99, 0xad, 0x64, 0x5c, 0x8b, 0xb1, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x73, 0x5d, + 0x82, 0x5c, 0xb2, 0x2a, 0x23, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x24, 0x2b, 0xb0, 0x8b, 0x5b, 0x76, 0x5b, 0x5b, + 0x7b, 0xa3, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa8, 0x5e, 0x22, 0x36, 0x21, 0x3a, 0x3d, 0x30, + 0x22, 0x28, 0x3a, 0x44, 0x4a, 0x3e, 0x3e, 0x9b, + 0x9d, 0x3e, 0x9e, 0x4b, 0x55, 0x2e, 0x42, 0x9f, + 0x93, 0x4f, 0x3f, 0xb3, 0x7b, 0x7b, 0x85, 0x80, + 0xa0, 0x36, 0x36, 0x36, 0x21, 0xb4, 0x7e, 0x7b, + 0x64, 0x64, 0xb5, 0x35, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x31, 0xb6, 0x5b, 0x64, 0xa3, 0xa3, 0xac, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0x66, 0xb7, 0x36, 0x36, 0x36, 0x2c, 0x54, + 0x31, 0x23, 0x26, 0x2c, 0x3a, 0x3b, 0x55, 0x47, + 0x37, 0x3b, 0x3b, 0x38, 0x4a, 0x98, 0x55, 0x98, + 0x47, 0x9a, 0x3f, 0xb8, 0x76, 0x76, 0x7a, 0x63, + 0xb9, 0xba, 0x86, 0xba, 0xbb, 0x90, 0x5b, 0x64, + 0xa3, 0xa3, 0xbc, 0x2d, 0x27, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x26, 0x2d, 0x91, 0x5b, 0x64, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa8, 0x83, 0xaf, 0x36, 0x36, 0x36, 0x30, + 0x98, 0x37, 0x30, 0x26, 0x9d, 0x3e, 0x9f, 0x9b, + 0x37, 0x3b, 0x3b, 0x53, 0x53, 0x3d, 0x4b, 0x48, + 0x9b, 0x9a, 0x3f, 0xbd, 0x5b, 0x7b, 0xbe, 0x85, + 0x7e, 0x90, 0x63, 0x90, 0x85, 0x5b, 0xa3, 0xa4, + 0xa4, 0xac, 0x5d, 0xb5, 0x39, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xbf, 0xbe, 0x64, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa8, 0x88, 0x36, 0x36, 0x36, 0x36, + 0x2d, 0x3f, 0x3b, 0x31, 0x4d, 0x3e, 0x9f, 0x47, + 0x38, 0x3b, 0x3e, 0x3e, 0x98, 0x52, 0x48, 0x48, + 0x9b, 0x45, 0x3f, 0xc0, 0x6d, 0x7b, 0xab, 0xbe, + 0x7a, 0x8b, 0x8b, 0x7a, 0x5b, 0x64, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa3, 0xc1, 0x37, 0x35, 0x26, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2e, 0xbf, 0x7a, 0x7b, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa8, 0x72, 0x73, 0x36, 0x36, 0x36, + 0x24, 0x52, 0x47, 0x49, 0x3a, 0x55, 0x98, 0x47, + 0x9d, 0x3e, 0x54, 0x45, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x46, 0x42, 0xb6, 0x7a, 0x7b, 0x64, 0x7b, + 0x76, 0x5b, 0x5b, 0x76, 0x7b, 0xa3, 0xa4, 0xa4, + 0xa4, 0xa4, 0xac, 0x64, 0xc1, 0x4d, 0x2c, 0x27, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xc2, 0x8b, 0x7b, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa8, 0x89, 0xa0, 0x36, 0x36, + 0x32, 0x47, 0x48, 0x9b, 0x9a, 0x3f, 0x47, 0x48, + 0x4b, 0x40, 0x4f, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4b, 0x2f, 0x8f, 0x7a, 0x7b, 0xa3, 0xac, + 0xa3, 0x64, 0x64, 0xa3, 0xa3, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0x5d, 0xc3, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xc2, 0x85, 0x7b, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0x66, 0x57, 0x27, 0x4d, + 0x4b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x99, 0x34, 0xa0, 0xb9, 0x7a, 0x7b, 0xa3, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xc2, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xc2, 0x85, 0x7b, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa8, 0x5f, 0x92, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x44, + 0x35, 0x36, 0xaf, 0xbb, 0x7a, 0x7b, 0xac, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xac, 0xa3, 0xc0, + 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x30, 0x2f, 0xb6, 0x8b, 0x7b, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0x66, 0x89, 0x45, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x4e, 0x25, + 0x36, 0x36, 0x61, 0xb9, 0x6d, 0x64, 0xac, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xac, 0x7b, 0xbe, 0xc3, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xc4, 0x63, 0xbe, 0xa3, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0x72, 0x81, 0xc5, + 0x46, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x3f, 0x2c, 0x36, 0x36, + 0x36, 0x36, 0xc6, 0x8f, 0x6d, 0x64, 0xac, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa3, 0xab, 0x8b, 0xb0, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x96, 0x75, 0xab, 0xa3, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xac, 0x7b, 0x81, 0xb9, + 0x73, 0x3b, 0x44, 0x9b, 0x48, 0x48, 0x48, 0x9b, + 0x99, 0x43, 0x94, 0x2c, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x73, 0xb9, 0x7a, 0x7b, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0x64, 0x76, 0x7a, 0x91, 0xb5, 0x31, 0x30, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x39, 0x97, 0x75, 0xbe, 0x7b, 0x64, 0xa3, 0xa3, + 0xac, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0x7b, 0x7a, 0xc7, + 0xc8, 0x36, 0x21, 0x26, 0x2b, 0x39, 0x33, 0x30, + 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xc8, 0xbb, 0x8b, 0x7b, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0x64, 0x64, + 0x76, 0x85, 0xbf, 0xb5, 0x34, 0x2b, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xc9, 0x63, 0x7e, 0x7a, 0x6d, 0xbe, 0x5b, + 0x76, 0x7b, 0x64, 0x64, 0xa3, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xac, 0x76, 0x85, 0xb9, + 0x79, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xca, 0xbb, 0x75, 0x76, 0xa3, 0xa4, + 0xa4, 0xa4, 0xac, 0xa3, 0x64, 0x76, 0xbe, 0x8b, + 0xb6, 0xb5, 0x2f, 0x35, 0x30, 0x24, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x31, 0xcb, 0xc9, 0xbb, 0x74, 0x63, 0x90, + 0x7e, 0x75, 0x8b, 0x6d, 0xbe, 0x76, 0x64, 0xa3, + 0xac, 0xac, 0xac, 0xac, 0x64, 0x7a, 0x84, 0xcc, + 0x79, 0xa0, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xc8, 0xcc, 0x63, 0x6d, 0x7b, 0x64, + 0xac, 0xa3, 0x64, 0x7b, 0xbe, 0x75, 0x63, 0x96, + 0x38, 0x39, 0x2a, 0x24, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x27, 0x35, 0x2d, 0x41, 0xb5, 0xc5, 0x8f, + 0xb9, 0xbb, 0xc7, 0x74, 0x84, 0x90, 0x85, 0x6d, + 0x5b, 0x7b, 0x7b, 0xab, 0x6d, 0x90, 0xb9, 0xcd, + 0xca, 0x22, 0x36, 0x36, 0x28, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x25, 0x36, + 0x36, 0x21, 0xb4, 0x80, 0xc7, 0x7e, 0x6d, 0x76, + 0xab, 0x76, 0x6d, 0x85, 0x63, 0xb9, 0xb5, 0x34, + 0x33, 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x24, 0x27, 0x2a, 0x35, 0x2e, 0x2f, + 0x41, 0xce, 0xcf, 0x6c, 0x80, 0xcc, 0xb9, 0x74, + 0x84, 0x90, 0x75, 0x7e, 0x74, 0x8f, 0xcd, 0x79, + 0xc6, 0x2b, 0x9d, 0x41, 0x2f, 0x34, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x34, 0x2f, 0x38, + 0x4d, 0x37, 0xd0, 0xd1, 0x8f, 0x74, 0x63, 0x7e, + 0x75, 0x7e, 0x63, 0xc7, 0x88, 0xc4, 0x31, 0x2a, + 0x24, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x22, 0x23, 0x24, 0x26, 0x30, + 0x33, 0x39, 0x2e, 0x51, 0x41, 0xb2, 0x6c, 0xd1, + 0x80, 0xcc, 0xcc, 0xcc, 0xd2, 0xd1, 0xb7, 0xd3, + 0x41, 0x34, 0x35, 0x32, 0x30, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x30, 0x2a, + 0x2b, 0x34, 0xd4, 0xca, 0xd5, 0x8f, 0xbb, 0xc7, + 0xc7, 0xbb, 0xcc, 0x6c, 0x41, 0x39, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, + 0x28, 0x24, 0x26, 0x2a, 0x33, 0x2c, 0x2f, 0x41, + 0xd6, 0xb7, 0x79, 0x79, 0x79, 0xca, 0xd7, 0x51, + 0x39, 0x30, 0x24, 0x23, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0x22, 0x23, + 0x24, 0x2a, 0x31, 0xd8, 0xc8, 0x79, 0xd1, 0x80, + 0xd5, 0xba, 0xd9, 0x2f, 0x35, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x28, 0x25, 0x30, 0x2b, + 0x31, 0x2f, 0xd4, 0xd8, 0xd8, 0x2f, 0x2e, 0x33, + 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x27, 0x35, 0x34, 0xd8, 0xd8, 0xd8, + 0xda, 0xd4, 0x2e, 0x33, 0x25, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x23, 0x28, + 0x26, 0x30, 0x32, 0x2b, 0x33, 0x2a, 0x26, 0x28, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x25, 0x30, 0x33, 0x35, 0x35, + 0x2b, 0x2a, 0x26, 0x28, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x21, 0x22, 0x23, 0x28, 0x28, 0x23, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x23, 0x28, 0x24, 0x24, + 0x28, 0x23, 0x22, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }; -#define INCLUDE_LINUX_LOGOBW -#define INCLUDE_LINUX_LOGO16 -#include - -#else +#endif /* INCLUDE_LINUX_LOGO_DATA */ -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; -extern unsigned char linux_logo16[]; +#include -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-mips/termios.h linux/include/asm-mips/termios.h --- v2.4.5/linux/include/asm-mips/termios.h Sat Feb 3 20:00:45 2001 +++ linux/include/asm-mips/termios.h Tue Jun 5 18:11:41 2001 @@ -101,6 +101,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 /* synchronous PPP */ +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-mips64/linux_logo.h linux/include/asm-mips64/linux_logo.h --- v2.4.5/linux/include/asm-mips64/linux_logo.h Sat May 13 08:31:25 2000 +++ linux/include/asm-mips64/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -24,918 +24,897 @@ #define linux_logo_banner "Linux/MIPS64 version " UTS_RELEASE -#define LINUX_LOGO_COLORS 212 +#define __HAVE_ARCH_LINUX_LOGO + +#define LINUX_LOGO_COLORS 187 #ifdef INCLUDE_LINUX_LOGO_DATA unsigned char linux_logo_red[] __initdata = { - 0x03, 0x82, 0xE9, 0xBF, 0x42, 0xC9, 0x7E, 0xC0, - 0xE9, 0xE3, 0xC2, 0x24, 0xA4, 0x65, 0xEC, 0xC4, - 0x82, 0x9F, 0xF3, 0x12, 0x5F, 0xA0, 0xC2, 0xED, - 0x3E, 0xD5, 0xDB, 0xA0, 0x1C, 0xF4, 0xEB, 0xA4, - 0xCD, 0x0A, 0x9A, 0x51, 0xCC, 0xBE, 0xC0, 0xBA, - 0x74, 0xDC, 0xAA, 0xF6, 0xD3, 0xC5, 0xE6, 0x26, - 0xC2, 0x83, 0x38, 0xEA, 0x49, 0xB0, 0xED, 0xE5, - 0xF4, 0x96, 0x96, 0x1B, 0xFA, 0xCC, 0xF2, 0x0F, - 0xCD, 0xE5, 0xF4, 0xD3, 0x50, 0x7A, 0xB5, 0xDE, - 0xD5, 0xB6, 0x60, 0x0A, 0x6A, 0xEA, 0xD4, 0xEB, - 0xC1, 0xCA, 0xEA, 0xEC, 0x2A, 0x96, 0x95, 0xDC, - 0xE4, 0xCE, 0xEC, 0x1E, 0xDC, 0x8A, 0xD1, 0xF6, - 0x3C, 0x5E, 0xC6, 0xB4, 0xB2, 0xAC, 0xBA, 0x9E, - 0x0F, 0x59, 0xBA, 0xFA, 0xCC, 0xBF, 0x82, 0xCE, - 0xE6, 0x4F, 0xAA, 0x4C, 0xCA, 0x8E, 0x8E, 0xDF, - 0x2C, 0xB6, 0x3B, 0xDE, 0xCE, 0xEE, 0x46, 0x4A, - 0x6F, 0x7A, 0x82, 0xE4, 0xAA, 0x88, 0xE2, 0xCE, - 0xAE, 0xB6, 0x70, 0xC2, 0x9A, 0xDA, 0x35, 0x9E, - 0x95, 0xC0, 0x7E, 0x8C, 0xC2, 0xB6, 0xCE, 0xB9, - 0xD5, 0xAA, 0xC1, 0xF4, 0xC7, 0xB6, 0xB6, 0xA3, - 0xF2, 0x68, 0xDB, 0x76, 0xDC, 0x57, 0xD3, 0xA8, - 0xC0, 0xEF, 0x46, 0xF4, 0x2F, 0xD7, 0x53, 0x36, - 0xE6, 0xA7, 0xCA, 0xCB, 0x7E, 0xE4, 0x86, 0x9A, - 0xCE, 0x94, 0xB4, 0x1D, 0xDA, 0xCE, 0x6C, 0xE6, - 0x9E, 0xC6, 0xDA, 0x16, 0xFA, 0xAA, 0x56, 0xB6, - 0xFE, 0x6E, 0xEA, 0xCE, 0xE5, 0xCC, 0xDB, 0xD3, - 0xED, 0xDC, 0xF4, 0x72 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x65, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x76, 0x79, + 0x62, 0x36, 0x9a, 0xe2, 0xec, 0xe1, 0xb8, 0xd7, + 0xaf, 0x25, 0xbc, 0xc0, 0xef, 0xea, 0xe8, 0xe8, + 0xf5, 0xf1, 0xda, 0xd3, 0x79, 0xdb, 0xf4, 0xf6, + 0xf6, 0xf6, 0xe2, 0x3d, 0xb4, 0xce, 0xe6, 0xee, + 0xf6, 0x68, 0xd8, 0xec, 0xf5, 0xc6, 0xc8, 0x9c, + 0x89, 0xd2, 0xee, 0xcb, 0xb9, 0xd2, 0x66, 0x5e, + 0x8b, 0xbe, 0xa8, 0xd5, 0xca, 0xb6, 0xae, 0x9c, + 0xc5, 0xbe, 0xbe, 0xca, 0x90, 0xb2, 0x9a, 0xa8, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0x8d, + 0x12, 0x4a, 0x8e, 0xf2, 0xf6, 0xee, 0xb5, 0xe4, + 0xf1, 0x26, 0x9a, 0xea, 0xf6, 0xe0, 0xd2, 0x16, + 0x9a, 0x2e, 0x70, 0xd6, 0x46, 0x7c, 0xb4, 0x62, + 0xd6, 0xa3, 0x74, 0xa7, 0xa2, 0xca, 0xe0, 0xae, + 0xbe, 0xce, 0xa3, 0x8e, 0x6d, 0x8e, 0x32, 0xaf, + 0x50, 0x9e, 0x5b, 0x8a, 0x98, 0x82, 0x7a, 0x82, + 0x56, 0x7c, 0x8a, 0x56, 0x5e, 0x86, 0x6a, 0x52, + 0x59, 0x64, 0x5e, }; unsigned char linux_logo_green[] __initdata = { - 0x03, 0x82, 0xC4, 0x83, 0x42, 0xA2, 0x4A, 0xA4, - 0xE5, 0xA6, 0xC2, 0x24, 0xA4, 0x65, 0xB4, 0x94, - 0x66, 0x87, 0xB6, 0x12, 0x44, 0x6C, 0x96, 0xD4, - 0x36, 0x95, 0xB2, 0x92, 0x0E, 0xF4, 0xBC, 0x77, - 0xA5, 0x0A, 0x92, 0x52, 0xB4, 0x9A, 0x8C, 0xB2, - 0x74, 0xC2, 0x8E, 0xBD, 0xA2, 0xCA, 0xD2, 0x12, - 0xB6, 0x61, 0x24, 0xDA, 0x33, 0x79, 0xCB, 0xAC, - 0xDA, 0x84, 0x7A, 0x1B, 0xFA, 0x8D, 0xBE, 0x06, - 0x93, 0xBB, 0xBC, 0xAB, 0x44, 0x62, 0x83, 0xDA, - 0x9B, 0xA2, 0x4C, 0x04, 0x6A, 0xB6, 0xC8, 0xBD, - 0x8D, 0xB6, 0xAD, 0xEC, 0x2A, 0x68, 0x62, 0x9D, - 0xC4, 0xC4, 0xB4, 0x13, 0xA3, 0x8A, 0xD2, 0xD6, - 0x3C, 0x5D, 0x8C, 0x7E, 0x82, 0xAC, 0x96, 0x7E, - 0x0D, 0x5A, 0xBA, 0xBB, 0xCC, 0xBE, 0x76, 0xB6, - 0xDE, 0x4E, 0x9A, 0x3C, 0xBE, 0x8E, 0x6E, 0xCB, - 0x1C, 0xAA, 0x2E, 0xBE, 0xAA, 0xDE, 0x3E, 0x4B, - 0x4D, 0x7A, 0x54, 0xE4, 0x8E, 0x6E, 0xCA, 0x9B, - 0x70, 0x9E, 0x5A, 0xAA, 0x9A, 0xBE, 0x34, 0x9E, - 0x71, 0x9E, 0x7E, 0x5F, 0xAA, 0x8A, 0xBE, 0x91, - 0xCE, 0x88, 0x92, 0xDB, 0xC6, 0xAB, 0x8A, 0x72, - 0xE2, 0x44, 0xC3, 0x54, 0xAA, 0x45, 0xBB, 0x92, - 0xBA, 0xC4, 0x46, 0xCA, 0x2D, 0xD6, 0x3B, 0x1A, - 0xC2, 0x7E, 0xA6, 0xCB, 0x7A, 0xDC, 0x86, 0x72, - 0xB6, 0x94, 0xB4, 0x1C, 0xBC, 0xAE, 0x4C, 0xD6, - 0x62, 0x86, 0xD3, 0x16, 0xF6, 0x7A, 0x55, 0x79, - 0xFE, 0x6E, 0xC6, 0xC6, 0xAA, 0x93, 0xDC, 0x9D, - 0xAE, 0xA4, 0xD4, 0x56 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x62, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x62, 0x5c, + 0x4e, 0x26, 0x72, 0xaa, 0xba, 0xaf, 0x90, 0xae, + 0x92, 0x1a, 0xa4, 0x85, 0xb6, 0xbe, 0xc3, 0xc8, + 0xcf, 0xd0, 0xc2, 0xce, 0x57, 0xa2, 0xd6, 0xda, + 0xda, 0xd7, 0xb8, 0x2a, 0x7b, 0x91, 0xae, 0xca, + 0xda, 0x45, 0x9e, 0xb2, 0xd7, 0x9b, 0x90, 0x76, + 0x5c, 0xa2, 0xbe, 0xa6, 0x85, 0x96, 0x4e, 0x46, + 0x66, 0x92, 0x7a, 0x9a, 0x96, 0x9d, 0x9a, 0x6b, + 0x8a, 0x8e, 0xb2, 0xca, 0x90, 0xa6, 0x79, 0x7c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0x8d, + 0x0e, 0x36, 0x86, 0xba, 0xbe, 0xcc, 0x8e, 0xb8, + 0xc4, 0x1e, 0x8e, 0xae, 0xba, 0xb2, 0xa6, 0x12, + 0x7a, 0x20, 0x64, 0xaa, 0x2f, 0x70, 0x85, 0x46, + 0xa6, 0x6e, 0x51, 0x72, 0x92, 0xa2, 0xa6, 0x87, + 0x96, 0xa2, 0x85, 0x7a, 0x6a, 0x6e, 0x22, 0x76, + 0x36, 0x76, 0x3c, 0x6e, 0x63, 0x53, 0x66, 0x62, + 0x42, 0x50, 0x56, 0x42, 0x56, 0x56, 0x56, 0x3e, + 0x51, 0x52, 0x56, }; unsigned char linux_logo_blue[] __initdata = { - 0x04, 0x84, 0x10, 0x0C, 0x41, 0x14, 0x04, 0x78, - 0xC7, 0x0E, 0xC4, 0x24, 0xA4, 0x64, 0x0C, 0x0D, - 0x17, 0x24, 0x0D, 0x13, 0x11, 0x07, 0x40, 0x22, - 0x0C, 0x0C, 0x11, 0x78, 0x06, 0xF4, 0x0B, 0x0A, - 0x47, 0x0B, 0x7C, 0x54, 0x6C, 0x0C, 0x0D, 0x9C, - 0x73, 0x54, 0x14, 0x0C, 0x0F, 0xC7, 0x94, 0x04, - 0x94, 0x17, 0x0A, 0x6C, 0x08, 0x0F, 0x14, 0x0B, - 0x12, 0x68, 0x28, 0x11, 0xFA, 0x0A, 0x34, 0x09, - 0x0A, 0x2F, 0x15, 0x19, 0x14, 0x3C, 0x06, 0xC4, - 0x0B, 0x84, 0x24, 0x08, 0x69, 0x38, 0xBC, 0x15, - 0x1F, 0xA0, 0x0A, 0xEC, 0x2A, 0x0C, 0x0C, 0x0C, - 0x2C, 0xA0, 0x15, 0x07, 0x0B, 0x8C, 0xD3, 0x10, - 0x3B, 0x5C, 0x0C, 0x04, 0x3C, 0xAC, 0x54, 0x1C, - 0x0B, 0x5B, 0xBB, 0x0A, 0xC1, 0xBB, 0x5C, 0x3C, - 0xBC, 0x4D, 0x74, 0x10, 0x8C, 0x8C, 0x14, 0x91, - 0x0C, 0x74, 0x17, 0x0C, 0x48, 0x9C, 0x3C, 0x4C, - 0x09, 0x7C, 0x05, 0xE4, 0x34, 0x38, 0x6C, 0x11, - 0x08, 0x7C, 0x18, 0x2C, 0x9C, 0x4C, 0x34, 0x9C, - 0x29, 0x54, 0x7C, 0x0C, 0x78, 0x18, 0x9C, 0x14, - 0xBA, 0x30, 0x27, 0x31, 0xC2, 0x97, 0x24, 0x09, - 0xB4, 0x04, 0x87, 0x0C, 0x14, 0x1F, 0x7C, 0x64, - 0xB0, 0x0F, 0x45, 0x10, 0x2C, 0xD4, 0x0A, 0x04, - 0x44, 0x1F, 0x2C, 0xCC, 0x7C, 0xD8, 0x84, 0x0C, - 0x8C, 0x94, 0xB4, 0x1D, 0x20, 0x5C, 0x18, 0xB4, - 0x04, 0x09, 0xBC, 0x14, 0xF4, 0x08, 0x54, 0x07, - 0xFC, 0x6C, 0x24, 0xB4, 0x15, 0x18, 0xDB, 0x17, - 0x17, 0x18, 0x21, 0x24 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x01, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x06, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x59, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x2e, 0x08, + 0x0a, 0x06, 0x0a, 0x0b, 0x0b, 0x0f, 0x0c, 0x0f, + 0x3d, 0x09, 0x73, 0x09, 0x0d, 0x0a, 0x10, 0x1e, + 0x2d, 0x13, 0x86, 0xba, 0x19, 0x0a, 0x36, 0x3c, + 0x26, 0x14, 0x0d, 0x06, 0x07, 0x0a, 0x0b, 0x0f, + 0x4a, 0x06, 0x0a, 0x0c, 0x2b, 0x0a, 0x0b, 0x0a, + 0x06, 0x0a, 0x0a, 0x11, 0x0b, 0x0a, 0x0a, 0x1e, + 0x0f, 0x0d, 0x0a, 0x0b, 0x22, 0x6a, 0x72, 0x0b, + 0x0b, 0x22, 0x90, 0xca, 0x90, 0x92, 0x3c, 0x2c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0x8d, + 0x06, 0x0e, 0x6a, 0x0e, 0x0e, 0x5b, 0x2c, 0x3e, + 0x0e, 0x0a, 0x5a, 0x0d, 0x0e, 0x3e, 0x0a, 0x06, + 0x2e, 0x06, 0x4e, 0x36, 0x06, 0x58, 0x24, 0x06, + 0x3a, 0x08, 0x08, 0x07, 0x5e, 0x45, 0x0a, 0x32, + 0x2e, 0x2a, 0x43, 0x48, 0x5f, 0x2e, 0x06, 0x06, + 0x07, 0x24, 0x06, 0x32, 0x06, 0x06, 0x46, 0x2e, + 0x22, 0x06, 0x06, 0x1e, 0x4c, 0x06, 0x3a, 0x22, + 0x42, 0x34, 0x42, }; unsigned char linux_logo[] __initdata = { - 0xBC, 0xAC, 0x7D, 0x95, 0xAF, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0x95, 0x7D, 0x95, 0xAC, 0x2C, 0xAF, - 0x7D, 0x48, 0xB2, 0xAC, 0x85, 0xDA, 0xDA, 0x2C, - 0x7D, 0x48, 0x21, 0x2C, 0x8D, 0x2A, 0x8A, 0xDA, - 0x85, 0x2C, 0xD9, 0xAC, 0x2C, 0x2C, 0xD9, 0xD9, - 0xAF, 0x85, 0x85, 0x85, 0x8D, 0xBC, 0x2A, 0x2A, - 0xBC, 0x8C, 0xBC, 0xAC, 0x7D, 0x95, 0xAF, 0x85, - 0x2C, 0x2C, 0xAC, 0xD9, 0x95, 0x7D, 0x95, 0xAC, - 0x2C, 0xAF, 0x7D, 0x48, 0xB2, 0xAC, 0x85, 0xDA, - 0xDA, 0x2C, 0x7D, 0x48, 0x21, 0x2C, 0x8D, 0x2A, - 0xAF, 0xA1, 0x48, 0x7D, 0xAF, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0x95, 0x7D, 0x95, 0xAC, 0xD9, 0x7D, - 0x48, 0xE9, 0x21, 0xAF, 0xDA, 0xDA, 0x85, 0x2C, - 0xD9, 0xD9, 0xAC, 0xDA, 0x8A, 0xDA, 0x85, 0x2C, - 0x2C, 0xAC, 0xD9, 0xAC, 0xAF, 0xAF, 0x2C, 0x2C, - 0x2C, 0x85, 0x2C, 0x2C, 0x85, 0xDA, 0xDA, 0xDA, - 0xDA, 0xDA, 0xAF, 0xA1, 0x48, 0x7D, 0xAF, 0x2C, - 0x2C, 0xAC, 0xD9, 0xD9, 0x95, 0x7D, 0x95, 0xAC, - 0xD9, 0x7D, 0x48, 0xE9, 0x21, 0xAF, 0xDA, 0xDA, - 0x85, 0x2C, 0xD9, 0xD9, 0xAC, 0xDA, 0x8A, 0xDA, - 0x7D, 0x48, 0x48, 0x7D, 0x2C, 0x85, 0x2C, 0xAF, - 0xD9, 0xD9, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, 0x7D, - 0xB2, 0x21, 0xD9, 0x85, 0xDA, 0xDA, 0x85, 0x2C, - 0xAF, 0x2C, 0x2C, 0xDA, 0x85, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0xD9, 0xAF, 0xDA, 0x85, 0x2C, 0x2C, - 0x85, 0xDA, 0xDA, 0x85, 0x85, 0xDA, 0x85, 0x85, - 0x85, 0xAF, 0x7D, 0x48, 0x48, 0x7D, 0x2C, 0x85, - 0x2C, 0xAF, 0xD9, 0xD9, 0x7D, 0x95, 0xD9, 0xD9, - 0xD9, 0x7D, 0xB2, 0x21, 0xD9, 0x85, 0xDA, 0xDA, - 0x85, 0x2C, 0xAF, 0x2C, 0x2C, 0xDA, 0xDA, 0x85, - 0xA1, 0xE9, 0x48, 0x95, 0x85, 0xDA, 0x85, 0xAF, - 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0x95, 0x95, - 0xD9, 0xAC, 0x85, 0x85, 0xDA, 0xDA, 0x85, 0x2C, - 0xAC, 0xAC, 0x2C, 0x2C, 0x85, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0x2C, 0x91, 0x41, 0x20, 0x6B, 0x20, - 0x6B, 0x20, 0x6B, 0xAE, 0x2C, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0xA1, 0xE9, 0x48, 0x95, 0x85, 0xDA, - 0x85, 0xAF, 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, - 0x95, 0x95, 0xD9, 0xAC, 0x85, 0x85, 0xDA, 0xDA, - 0x85, 0x2C, 0xAC, 0xAC, 0x2C, 0x2C, 0x2C, 0x2C, - 0xA1, 0xA1, 0xD6, 0xAF, 0xDA, 0xDA, 0x85, 0x2C, - 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0xD9, - 0x2C, 0x2C, 0xDA, 0xDA, 0xDA, 0x85, 0x2C, 0xD9, - 0xD9, 0xD9, 0xD9, 0xAC, 0xAC, 0xAC, 0xAF, 0xAC, - 0x2C, 0xB2, 0x88, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6B, 0x80, 0x85, 0x2C, - 0xD9, 0xD6, 0xA1, 0xA1, 0xD6, 0xAF, 0xDA, 0xDA, - 0x85, 0x2C, 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, - 0xD9, 0xD9, 0x2C, 0x2C, 0xDA, 0xDA, 0xDA, 0x85, - 0x2C, 0xD9, 0xD9, 0xD9, 0xD9, 0xAF, 0xAF, 0xAF, - 0xD6, 0xD6, 0xD9, 0x2C, 0xDA, 0xDA, 0x2C, 0xAC, - 0xD9, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, 0xAF, 0x2C, - 0x85, 0x85, 0x85, 0x85, 0x2C, 0x2C, 0xAC, 0xD9, - 0xD9, 0xD9, 0xAF, 0xAF, 0x2C, 0x2C, 0xAF, 0xDA, - 0xAE, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xE3, 0x20, 0x6B, 0x48, - 0xAC, 0x95, 0xD6, 0xD6, 0xD9, 0x2C, 0xDA, 0xDA, - 0x2C, 0xAC, 0xD9, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, - 0xAF, 0x2C, 0x85, 0x85, 0x85, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0xD9, 0xD9, 0xAF, 0xAF, 0xAF, 0xAF, - 0xD9, 0xD9, 0xD9, 0x2C, 0x85, 0x85, 0x2C, 0xD9, - 0x7D, 0x21, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x2C, 0xAF, 0xAF, 0xAC, - 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x89, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x74, 0x43, 0x80, 0x41, 0x20, - 0x9F, 0x2C, 0xD9, 0xD9, 0xD9, 0x2C, 0x85, 0x85, - 0x2C, 0xD9, 0x7D, 0x21, 0xD6, 0xD9, 0xAF, 0x2C, - 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x2C, 0xAF, - 0xAF, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0xD9, 0x7D, 0xD9, 0xAF, 0x85, 0x85, 0x2C, 0xD9, - 0xB2, 0x21, 0x7D, 0xD9, 0xAF, 0x2C, 0x85, 0x85, - 0x85, 0x2C, 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, - 0xAF, 0xAC, 0xAF, 0xAF, 0xAC, 0xAC, 0x85, 0x41, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xAE, 0x48, 0x89, 0x74, 0x41, - 0x6B, 0xD6, 0xD9, 0x7D, 0xD9, 0xAF, 0x85, 0x85, - 0x2C, 0xD9, 0xB2, 0x21, 0x7D, 0xD9, 0xAF, 0x2C, - 0x85, 0x85, 0x85, 0x2C, 0x2C, 0x2C, 0x2C, 0xAF, - 0xAF, 0xAC, 0xAF, 0xAC, 0xAC, 0x2C, 0xAF, 0xAC, - 0x2C, 0x7D, 0xD9, 0x2C, 0xDA, 0x85, 0x2C, 0x7D, - 0xB2, 0xD6, 0xD9, 0xAF, 0x85, 0x85, 0x85, 0x85, - 0xAF, 0xAC, 0xAC, 0xAF, 0xAF, 0xAC, 0xAC, 0xD9, - 0x95, 0x7D, 0x95, 0x95, 0xD9, 0xD9, 0x48, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6B, 0xAE, 0xE6, 0x80, 0x2B, 0x88, - 0x20, 0x33, 0xDA, 0x95, 0xD9, 0x2C, 0xDA, 0x85, - 0x2C, 0x7D, 0xB2, 0xD6, 0xD9, 0xAF, 0x85, 0x85, - 0x85, 0x85, 0xAF, 0xAC, 0xAC, 0xAF, 0xAF, 0xAC, - 0xAC, 0xD9, 0x95, 0x95, 0x7D, 0x95, 0x95, 0xD9, - 0x85, 0xD9, 0x2C, 0x85, 0xDA, 0xDA, 0xD9, 0x21, - 0xA1, 0xD9, 0xAF, 0x2C, 0x85, 0xDA, 0x85, 0xAF, - 0xD9, 0xD9, 0xAC, 0xAC, 0xAC, 0xD9, 0x7D, 0xD6, - 0xD6, 0x7D, 0x95, 0xD9, 0xD9, 0x85, 0xDB, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xDB, 0xE3, 0x6B, 0x20, 0x20, - 0x20, 0x20, 0xE9, 0xD9, 0x2C, 0x85, 0xDA, 0xDA, - 0xD9, 0x21, 0xA1, 0xD9, 0xAF, 0x2C, 0x85, 0xDA, - 0x85, 0xAF, 0xD9, 0xD9, 0xAC, 0xAC, 0xAC, 0xD9, - 0x7D, 0xD6, 0xD6, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, - 0xDA, 0x2C, 0x85, 0xDA, 0xDA, 0x85, 0x95, 0x21, - 0x21, 0xD9, 0x85, 0x85, 0x85, 0x2C, 0x2C, 0xD9, - 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, - 0xAC, 0xAC, 0x2C, 0xAF, 0x2C, 0x85, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x88, 0xDA, 0x85, 0xDA, 0xDA, 0x85, - 0x95, 0x21, 0x21, 0xD9, 0x85, 0x85, 0x85, 0x2C, - 0x2C, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0xD9, - 0xD9, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, - 0xDA, 0x2C, 0x85, 0x85, 0x2C, 0xD9, 0xD6, 0xB2, - 0x95, 0x2C, 0x85, 0x85, 0xAF, 0xAC, 0x95, 0x95, - 0x7D, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0x2C, 0x85, - 0x85, 0x85, 0x85, 0x85, 0x85, 0xAC, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xAC, 0x85, 0x85, 0x2C, 0xD9, - 0xD6, 0xB2, 0x95, 0x2C, 0x85, 0x85, 0xAF, 0xAC, - 0x95, 0x95, 0x7D, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, - 0x2C, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x2C, 0x2C, 0x2C, 0xAC, 0x95, 0xD6, 0x7D, - 0xD9, 0x2C, 0x2C, 0xAF, 0x95, 0x7D, 0x7D, 0x95, - 0x95, 0xD9, 0xD9, 0x95, 0xD9, 0xD9, 0x2C, 0x85, - 0xDA, 0xDA, 0xDA, 0x85, 0x85, 0x21, 0x20, 0x20, - 0x6B, 0x41, 0xDB, 0x6B, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xDB, 0xDB, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xE6, 0x2C, 0x2C, 0xAC, 0x95, - 0xD6, 0x7D, 0xD9, 0x2C, 0x2C, 0xAF, 0x95, 0x7D, - 0x7D, 0x95, 0x95, 0xD9, 0xD9, 0x95, 0xD9, 0xD9, - 0x2C, 0x85, 0xDA, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, - 0x2C, 0xAF, 0xAC, 0xD9, 0x95, 0xD6, 0xD6, 0xD9, - 0x2C, 0x2C, 0x2C, 0xD9, 0xD6, 0xD6, 0xD9, 0xAF, - 0xAC, 0x95, 0xD6, 0x7D, 0x7D, 0xD9, 0x2C, 0x85, - 0xDA, 0xDA, 0x2C, 0xAF, 0xAF, 0x21, 0x20, 0x20, - 0x88, 0x2B, 0x88, 0x74, 0x20, 0x20, 0x20, 0x20, - 0x20, 0xAE, 0x2D, 0x2D, 0x74, 0x74, 0x88, 0x20, - 0x20, 0x20, 0x20, 0x80, 0xAC, 0xD9, 0x95, 0xD6, - 0xD6, 0xD9, 0x2C, 0x2C, 0x2C, 0xD9, 0xD6, 0xD6, - 0xD9, 0xAF, 0xAC, 0x95, 0xD6, 0x7D, 0x7D, 0xD9, - 0x2C, 0xDA, 0xDA, 0x85, 0x2C, 0xAF, 0xAF, 0xAF, - 0x2C, 0xAF, 0xD9, 0x95, 0xD6, 0xD6, 0x95, 0xAF, - 0x2C, 0x2C, 0xD9, 0x95, 0xD6, 0x95, 0xAF, 0x2C, - 0xAC, 0x7D, 0x21, 0x95, 0xD9, 0x2C, 0x85, 0x85, - 0x85, 0xAF, 0xD9, 0x95, 0xD9, 0x7D, 0x20, 0x33, - 0x7D, 0x8A, 0x7D, 0x5B, 0x6B, 0x20, 0x20, 0x6B, - 0xE6, 0xD9, 0x85, 0x2A, 0xDA, 0x2B, 0x41, 0x20, - 0x20, 0x20, 0x6B, 0x74, 0xD9, 0x95, 0xD6, 0xD6, - 0x95, 0xAF, 0x2C, 0x2C, 0xD9, 0x95, 0xD6, 0x95, - 0xAF, 0x2C, 0xAC, 0x7D, 0x21, 0x95, 0xD9, 0x2C, - 0x85, 0x85, 0x85, 0x2C, 0xD9, 0xD9, 0xD9, 0xD9, - 0x85, 0xD9, 0x7D, 0x21, 0x21, 0x7D, 0xAC, 0x2C, - 0x2C, 0xAC, 0xD9, 0x7D, 0xD9, 0xAF, 0x2C, 0x85, - 0xAC, 0x7D, 0x7D, 0xAC, 0x85, 0xDA, 0x8A, 0xDA, - 0x85, 0xAF, 0xD9, 0x7D, 0xD9, 0x95, 0x20, 0x91, - 0xBC, 0x73, 0xEE, 0x7D, 0x20, 0x20, 0x20, 0x80, - 0x4D, 0x3D, 0x73, 0x73, 0xA3, 0xD6, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2B, 0x7D, 0x21, 0x21, 0x7D, - 0xAC, 0x2C, 0x2C, 0xAC, 0xD9, 0x7D, 0xD9, 0xAF, - 0x2C, 0x85, 0xAC, 0x7D, 0x7D, 0xAC, 0x85, 0xDA, - 0x8A, 0x8A, 0x85, 0xAC, 0xD9, 0x7D, 0xD9, 0xAC, - 0x2C, 0xD9, 0xD6, 0xB2, 0xB2, 0x7D, 0xAF, 0x85, - 0x2C, 0xD9, 0x95, 0x95, 0xAF, 0x2C, 0x2C, 0x2C, - 0xD9, 0xD9, 0xAC, 0x85, 0x8D, 0x2A, 0x2A, 0xDA, - 0xAF, 0xD9, 0x95, 0x95, 0xD9, 0xAC, 0x20, 0xAF, - 0x2C, 0xE6, 0x8D, 0x73, 0xE3, 0x20, 0x20, 0x48, - 0x5C, 0xDA, 0x5B, 0x43, 0xBC, 0x73, 0x2B, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xD6, 0xB2, 0xB2, 0x7D, - 0xAF, 0x85, 0x2C, 0xD9, 0x95, 0x95, 0xAF, 0x2C, - 0x2C, 0x2C, 0xD9, 0xD9, 0xAC, 0x85, 0x8A, 0x2A, - 0x8D, 0xDA, 0xAF, 0xD9, 0x95, 0x95, 0xD9, 0xAF, - 0xAC, 0xD9, 0xD6, 0xB2, 0x21, 0xD9, 0x2C, 0x85, - 0x2C, 0xD9, 0x95, 0xD9, 0xAF, 0x2C, 0x2C, 0xAC, - 0xAC, 0xAF, 0x85, 0x8D, 0xBC, 0xBC, 0xDA, 0xD9, - 0xD6, 0xA1, 0xA1, 0x21, 0xD9, 0xAC, 0x20, 0x2A, - 0xCC, 0xAE, 0x9F, 0xE4, 0xAE, 0x5B, 0x74, 0xA1, - 0xE4, 0xAE, 0x20, 0x9F, 0x89, 0xE8, 0xE6, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xD6, 0xB2, 0x21, 0xD9, - 0x2C, 0x85, 0x2C, 0xD9, 0x95, 0xD9, 0xAF, 0x2C, - 0x2C, 0xAC, 0xAC, 0xAF, 0x85, 0x8D, 0xBC, 0x2A, - 0xDA, 0xD9, 0xD6, 0xA1, 0xA1, 0x21, 0xD9, 0xD9, - 0xD9, 0x95, 0x21, 0xA1, 0x21, 0xAC, 0x85, 0x85, - 0xAC, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0xAF, 0xAC, - 0xAF, 0x85, 0x8A, 0x2A, 0x2A, 0xDA, 0xD9, 0xA1, - 0x48, 0xE9, 0x48, 0x21, 0x95, 0xAC, 0x20, 0x2A, - 0xDB, 0x41, 0x74, 0xBC, 0x2B, 0x7B, 0x7B, 0x80, - 0x73, 0x41, 0x20, 0x6B, 0x2B, 0xE8, 0x2D, 0x20, - 0x20, 0x20, 0x20, 0x33, 0x21, 0xA1, 0x21, 0xAC, - 0x85, 0x85, 0xAC, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, - 0xAF, 0xAC, 0xAF, 0x85, 0x8A, 0xBC, 0x2A, 0xDA, - 0xD9, 0xA1, 0x48, 0xE9, 0x48, 0x21, 0xD9, 0xD9, - 0xA1, 0xB2, 0xB2, 0x48, 0xD6, 0xAC, 0x2C, 0x2C, - 0xD9, 0x95, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0x85, 0x8A, 0x8D, 0x8D, 0x85, 0x95, 0xA1, 0x6C, - 0x6C, 0x48, 0xD6, 0xD9, 0x2C, 0x85, 0x20, 0x2C, - 0x89, 0x20, 0x3C, 0xB9, 0xA7, 0x63, 0xD2, 0xB9, - 0xC6, 0x9A, 0x20, 0x20, 0x43, 0x5C, 0xE6, 0x20, - 0x20, 0x20, 0x20, 0x33, 0xB2, 0x48, 0xD6, 0xAC, - 0x2C, 0x2C, 0xD9, 0x95, 0xAF, 0x2C, 0x2C, 0x2C, - 0x2C, 0x2C, 0x85, 0x8A, 0x8D, 0x8D, 0x85, 0x95, - 0xA1, 0x6C, 0x6C, 0x48, 0xD6, 0xD9, 0xAF, 0xAC, - 0xA1, 0xD6, 0x7D, 0xB2, 0xD6, 0xAF, 0x85, 0x85, - 0xD9, 0x95, 0x2C, 0x85, 0xDA, 0x85, 0x85, 0x2C, - 0x85, 0x8A, 0x8D, 0xDA, 0xD9, 0x48, 0x81, 0x2D, - 0x48, 0xD6, 0xD9, 0xAC, 0x2C, 0x85, 0x20, 0x2D, - 0xEE, 0x93, 0xD1, 0xA7, 0x3E, 0x3E, 0x3A, 0x25, - 0x56, 0xAB, 0xAA, 0xC5, 0xEE, 0xEE, 0x33, 0x20, - 0x20, 0x20, 0x20, 0x41, 0xD9, 0xB2, 0xD6, 0xAF, - 0x85, 0x85, 0xD9, 0x95, 0x2C, 0x85, 0xDA, 0x85, - 0x85, 0x2C, 0x85, 0x8A, 0x8D, 0xDA, 0xD9, 0x48, - 0x81, 0x2D, 0x48, 0xD6, 0xD9, 0xAF, 0x2C, 0x2C, - 0xAC, 0xAF, 0xD9, 0x7D, 0xD6, 0x2C, 0x85, 0x2C, - 0xD9, 0xD9, 0x2C, 0xDA, 0xDA, 0xDA, 0x2C, 0x2C, - 0x85, 0x8D, 0x8D, 0x2C, 0x21, 0x2D, 0x2D, 0xE9, - 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0xDA, 0x20, 0xE3, - 0xB4, 0xBE, 0xF1, 0x3E, 0x9B, 0x22, 0x56, 0xF2, - 0xBB, 0x7F, 0x56, 0xDC, 0x8F, 0x5A, 0x5F, 0x20, - 0x20, 0x20, 0x20, 0x6B, 0x2C, 0x7D, 0xD6, 0x2C, - 0x85, 0x2C, 0xD9, 0xD9, 0x2C, 0xDA, 0xDA, 0xDA, - 0x2C, 0x2C, 0x85, 0x8D, 0x8A, 0x85, 0x21, 0x2D, - 0x2D, 0xE9, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, - 0x2A, 0x85, 0xAC, 0x95, 0x95, 0x2C, 0x85, 0x85, - 0xAC, 0xAF, 0x85, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, - 0xDA, 0x8A, 0x8A, 0xAF, 0xA1, 0x2D, 0xE9, 0xD6, - 0xD9, 0xAC, 0x85, 0x85, 0x85, 0xDA, 0x20, 0x52, - 0x55, 0xED, 0x57, 0x3E, 0x22, 0x56, 0x37, 0xBB, - 0xBB, 0x58, 0x7F, 0x7F, 0x56, 0x5E, 0xC5, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2C, 0x95, 0x95, 0x2C, - 0x85, 0x85, 0xAC, 0xAF, 0x85, 0xDA, 0xDA, 0x85, - 0x2C, 0x2C, 0xDA, 0x8D, 0xDA, 0xAF, 0xA1, 0x2D, - 0xE9, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, 0x85, - 0xCD, 0xAF, 0xD9, 0x95, 0xD9, 0x2C, 0xDA, 0x85, - 0xAF, 0xD9, 0x85, 0xDA, 0x85, 0x2C, 0xAC, 0xAF, - 0x85, 0x8A, 0x85, 0xD9, 0x48, 0x48, 0xB2, 0x95, - 0x95, 0xAC, 0x2C, 0x85, 0xDA, 0xDA, 0x6B, 0xB3, - 0x46, 0x7C, 0x2E, 0x9B, 0x22, 0x56, 0xBB, 0x37, - 0x58, 0x58, 0xF2, 0x3A, 0x46, 0x63, 0x64, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2D, 0x95, 0xD9, 0x2C, - 0xDA, 0x85, 0xAF, 0xD9, 0x85, 0xDA, 0x85, 0x2C, - 0xAC, 0xAF, 0x85, 0xDA, 0x85, 0xD9, 0x48, 0x48, - 0xB2, 0x95, 0x95, 0xD9, 0x85, 0xDA, 0x85, 0x85, - 0xBC, 0xB2, 0xB2, 0x7D, 0xD9, 0x2C, 0xDA, 0x85, - 0xAF, 0xD9, 0x85, 0xDA, 0x85, 0x85, 0xAF, 0x2C, - 0x85, 0xDA, 0x2C, 0x7D, 0xA1, 0x48, 0xB2, 0x21, - 0xD6, 0xD9, 0x85, 0xDA, 0x85, 0xDA, 0x41, 0x51, - 0xB7, 0xEC, 0x2E, 0x22, 0x56, 0x37, 0xBB, 0xF2, - 0x37, 0xEA, 0x2F, 0x2F, 0x77, 0xA7, 0x38, 0x20, - 0x20, 0x6B, 0x20, 0x20, 0x5B, 0x2C, 0xD9, 0x2C, - 0xDA, 0x85, 0xAF, 0xD9, 0x85, 0xDA, 0x85, 0x85, - 0xAF, 0x2C, 0xDA, 0xDA, 0x2C, 0x7D, 0xA1, 0x48, - 0xB2, 0x21, 0xD6, 0xD9, 0x2C, 0xDA, 0x85, 0xAF, - 0x2C, 0x2D, 0x48, 0x7D, 0xAF, 0x2C, 0x85, 0x2C, - 0xD9, 0xAC, 0xAF, 0x85, 0x85, 0x2C, 0x2C, 0x2C, - 0x85, 0x2C, 0xD9, 0xD6, 0xA1, 0xA1, 0x48, 0xA1, - 0x21, 0x2C, 0xDA, 0xDA, 0x2C, 0x85, 0x41, 0x98, - 0xA2, 0xA7, 0x6F, 0xC9, 0x37, 0xF2, 0xF2, 0x9B, - 0xB7, 0x66, 0x60, 0x4C, 0xED, 0x84, 0x3C, 0x20, - 0x5B, 0x2D, 0x2B, 0x6B, 0x20, 0xAF, 0xAF, 0x2C, - 0x85, 0x2C, 0xD9, 0xAC, 0xAF, 0x85, 0x85, 0x2C, - 0x2C, 0x2C, 0x2C, 0x85, 0xD9, 0xD6, 0xA1, 0xA1, - 0x48, 0xA1, 0xD6, 0xAF, 0xDA, 0x8A, 0x2C, 0xD9, - 0xB2, 0x2D, 0x48, 0x95, 0x2C, 0x2C, 0x2C, 0x85, - 0xAC, 0xAC, 0xAF, 0x85, 0xDA, 0x85, 0xAF, 0xAC, - 0xAF, 0x2C, 0xD9, 0xD6, 0xD6, 0xD6, 0x21, 0xD6, - 0xD9, 0xDA, 0x8D, 0xDA, 0xAF, 0x2C, 0x20, 0x88, - 0x42, 0x51, 0x3F, 0x2F, 0x45, 0xB7, 0x66, 0x55, - 0x46, 0x60, 0x5D, 0x36, 0xD8, 0x71, 0x43, 0x20, - 0x20, 0x2D, 0xB2, 0x80, 0x20, 0x2D, 0x2C, 0x2C, - 0x2C, 0x85, 0xAC, 0xAC, 0xAF, 0x85, 0xDA, 0x85, - 0xAF, 0xAC, 0xAC, 0xAF, 0xD9, 0xD6, 0xD6, 0xD6, - 0x21, 0xD6, 0xD9, 0xDA, 0x8D, 0x8A, 0x2C, 0xD9, - 0xB2, 0x48, 0xD6, 0xAC, 0xAF, 0x2C, 0x2C, 0x85, - 0x2C, 0xAC, 0x2C, 0xDA, 0xDA, 0x85, 0xAF, 0xD9, - 0xD9, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xAC, - 0x85, 0x8D, 0xBC, 0xDA, 0xD9, 0xDA, 0x20, 0xE3, - 0xDA, 0x69, 0x96, 0xB5, 0xF1, 0x68, 0x5D, 0x82, - 0xE1, 0xBE, 0x27, 0x8D, 0x4D, 0xD3, 0x7D, 0x20, - 0x20, 0xDB, 0xA1, 0xCA, 0x20, 0x88, 0x85, 0x2C, - 0x2C, 0x85, 0x2C, 0xAC, 0x2C, 0xDA, 0xDA, 0x85, - 0xAF, 0xD9, 0xAC, 0xAF, 0xD9, 0xD9, 0xD9, 0xD9, - 0xD9, 0xAC, 0xDA, 0x8D, 0xBC, 0xDA, 0xD9, 0x95, - 0xD9, 0x95, 0xAC, 0x2C, 0x2C, 0x2C, 0x2C, 0x85, - 0x85, 0xAF, 0xAF, 0x85, 0x85, 0x2C, 0x2C, 0xAC, - 0xD9, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x85, - 0x8D, 0x2A, 0x2A, 0x85, 0xD9, 0x95, 0x20, 0xDB, - 0x8D, 0x8D, 0x99, 0xB0, 0x35, 0xE5, 0x3F, 0x35, - 0xB9, 0x50, 0x8A, 0x4D, 0x73, 0xE8, 0xA3, 0xCC, - 0x20, 0x20, 0x33, 0x6B, 0x20, 0x20, 0xCC, 0x85, - 0x2C, 0x85, 0x85, 0xAF, 0xAF, 0x85, 0x85, 0x85, - 0x2C, 0xD9, 0xD9, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, - 0x2C, 0x85, 0x8A, 0x2A, 0x8D, 0x2C, 0xD9, 0xD9, - 0xAF, 0xAF, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x85, - 0x2C, 0xAF, 0xAF, 0xAF, 0x2C, 0x2C, 0x2C, 0xAC, - 0xD9, 0xAC, 0xAF, 0x2C, 0x85, 0x85, 0xDA, 0xDA, - 0x8A, 0x8A, 0x85, 0xD9, 0x2C, 0x2B, 0x20, 0xAE, - 0xA3, 0xBC, 0x8D, 0xC8, 0xA9, 0xC7, 0x92, 0x47, - 0x8D, 0x8D, 0x7E, 0xE4, 0xE8, 0xE8, 0x5C, 0x2C, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6B, 0xAF, - 0x2C, 0x85, 0x2C, 0xAF, 0xAF, 0xAF, 0x2C, 0x2C, - 0x2C, 0xAF, 0xD9, 0xAC, 0x2C, 0x2C, 0x85, 0x85, - 0x85, 0xDA, 0x8D, 0x8A, 0x85, 0xAC, 0x95, 0xD9, - 0xAC, 0xAC, 0xAC, 0xAC, 0x2C, 0xAF, 0xAF, 0x2C, - 0x2C, 0xAF, 0xAF, 0xAC, 0x2C, 0xAF, 0x2C, 0xAF, - 0xD9, 0xAC, 0x2C, 0x2C, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x2C, 0xD9, 0xD9, 0x2D, 0x6B, 0x41, 0x2A, - 0xE8, 0xA3, 0xC8, 0x8D, 0x8A, 0x8A, 0x8A, 0x8D, - 0x4D, 0xA3, 0x3D, 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, - 0xAE, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xDB, - 0xDA, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, 0xAC, 0xAF, - 0x2C, 0xAC, 0xD9, 0xAC, 0x2C, 0x2C, 0x85, 0x85, - 0x85, 0x85, 0x85, 0x2C, 0xD9, 0x95, 0x7D, 0xD9, - 0x7D, 0x7D, 0xD9, 0xAC, 0xAC, 0xAF, 0xAF, 0xAF, - 0x2C, 0x2C, 0xAC, 0xAC, 0xD9, 0xAC, 0xAC, 0xD9, - 0x95, 0xD9, 0xAC, 0xAF, 0xAF, 0xAC, 0xAF, 0xAC, - 0xD9, 0x7D, 0x7D, 0x7D, 0x33, 0x41, 0x2D, 0xE8, - 0xE8, 0x5C, 0xD3, 0x8D, 0x8D, 0x8D, 0x8D, 0x7E, - 0x3D, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xDA, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x81, 0x2C, 0x2C, 0x2C, 0xAC, 0xAC, 0xAC, 0xAC, - 0xAC, 0xD9, 0x95, 0x95, 0xAC, 0xAF, 0xAF, 0xAF, - 0xAF, 0xAC, 0xD9, 0x95, 0x7D, 0xD6, 0xD6, 0x7D, - 0x21, 0xD6, 0x95, 0xD9, 0xD9, 0xAC, 0xAF, 0xAF, - 0x2C, 0xAF, 0xAC, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, - 0x21, 0x21, 0x7D, 0x95, 0x95, 0x7D, 0xD6, 0x21, - 0xB2, 0xA1, 0x2C, 0x88, 0x20, 0xE3, 0xA3, 0xE8, - 0xE8, 0xE8, 0xE4, 0xEE, 0xD3, 0x7E, 0x73, 0x5C, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0x5C, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2C, 0xAF, 0xAF, 0xAC, 0xD9, 0xD9, 0xD9, - 0xD9, 0xD9, 0xD6, 0x21, 0x7D, 0x95, 0x95, 0x7D, - 0xD6, 0xB2, 0xA1, 0xA1, 0xB2, 0xD6, 0x21, 0x21, - 0x21, 0xD9, 0xD9, 0xD9, 0xAC, 0xAF, 0xAC, 0xAF, - 0x2C, 0x2C, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, 0x95, - 0x7D, 0xB2, 0xD6, 0x95, 0xD9, 0x95, 0xD6, 0xA1, - 0xA1, 0xAF, 0x5B, 0x20, 0x20, 0xD6, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0x48, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0xE3, 0x8A, 0x2C, 0xAC, 0xAC, 0xD9, 0xD9, - 0xD9, 0x95, 0xD6, 0xB2, 0xD6, 0x95, 0xD9, 0x95, - 0x21, 0xB2, 0xA1, 0xB2, 0xD6, 0xD6, 0xD6, 0xA1, - 0xD9, 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, 0xAF, - 0x2C, 0x2C, 0xAF, 0xAC, 0xD9, 0xAC, 0xD9, 0xD9, - 0xD9, 0x95, 0xAC, 0x2C, 0x2C, 0xAC, 0x95, 0x7D, - 0xD9, 0x91, 0x20, 0x20, 0xE3, 0xA3, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0x85, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2B, 0x8A, 0xAF, 0xAC, 0xD9, 0xAC, - 0xD9, 0xD9, 0xD9, 0x95, 0xAC, 0x2C, 0x2C, 0xAC, - 0x95, 0x7D, 0x95, 0x95, 0xD9, 0x95, 0x7D, 0x21, - 0x2C, 0xDA, 0xDA, 0x85, 0x2C, 0xAF, 0xAF, 0xAF, - 0xAF, 0xAF, 0x2C, 0xAF, 0xAF, 0xAC, 0xAC, 0xAC, - 0xD9, 0xAF, 0x85, 0x85, 0x2C, 0xAF, 0xD9, 0xAF, - 0x48, 0x20, 0x20, 0x20, 0xE6, 0xA3, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, - 0xE4, 0x73, 0x41, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2B, 0xDA, 0xAF, 0xAF, 0xAC, - 0xAC, 0xAF, 0xD9, 0x2C, 0x85, 0x85, 0x2C, 0xAF, - 0xD9, 0xD9, 0xAC, 0xAF, 0xAC, 0xD9, 0xD9, 0xD9, - 0x85, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, 0xAC, 0xAF, - 0xAF, 0xAF, 0xAF, 0x2C, 0xAF, 0xAF, 0xAC, 0xAC, - 0xAF, 0x2C, 0x2C, 0x2C, 0xAC, 0x95, 0x95, 0xA1, - 0x20, 0x20, 0x20, 0x20, 0xE9, 0x8C, 0x5C, 0xE8, - 0xE8, 0xE8, 0xE8, 0x3D, 0x73, 0x73, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE4, 0x73, 0x73, 0x73, 0xCD, - 0x7E, 0xA3, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x24, 0x85, 0xAF, 0xAF, - 0xAC, 0xAC, 0xAC, 0xAF, 0x85, 0x2C, 0xAC, 0x95, - 0x95, 0xD9, 0xAC, 0xAC, 0xAC, 0xD9, 0xAC, 0xAF, - 0x8A, 0x8A, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, 0x2C, - 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, 0xAF, 0xAC, - 0xAC, 0xAF, 0xAF, 0xD9, 0xD6, 0xD6, 0x2C, 0x88, - 0x20, 0x20, 0x20, 0x88, 0xB2, 0xDA, 0x7E, 0x73, - 0xE8, 0xE8, 0xE8, 0x3D, 0x73, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xA3, 0xCD, 0xD3, 0x2A, 0x2A, - 0x2A, 0x8C, 0x8D, 0x88, 0x20, 0xE3, 0x6B, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x41, 0x85, 0xAF, 0xAC, - 0xAC, 0xAC, 0xAC, 0xAF, 0xAC, 0xD9, 0x7D, 0xD6, - 0x7D, 0x7D, 0xD9, 0x95, 0xD9, 0xAC, 0xAC, 0xAF, - 0xD3, 0x8D, 0xDA, 0xDA, 0x85, 0x85, 0x2C, 0x2C, - 0x2C, 0xAF, 0xAF, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, - 0xAF, 0xAF, 0xAC, 0xD9, 0x95, 0x7D, 0xAC, 0x20, - 0x20, 0x20, 0x20, 0xDB, 0x2C, 0xA3, 0x5C, 0xE8, - 0xE8, 0xE8, 0xE8, 0x5C, 0x3D, 0x3D, 0xE8, 0xE8, - 0xE8, 0xE4, 0xE8, 0xE8, 0xE8, 0xE4, 0x73, 0xEE, - 0xD3, 0x2A, 0xEE, 0xAC, 0x20, 0x33, 0x2B, 0xE3, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x9F, 0xAF, 0xD9, - 0xD9, 0xAC, 0xAF, 0xAF, 0xAC, 0xD9, 0x95, 0x7D, - 0xD9, 0x95, 0x95, 0x95, 0x95, 0xD9, 0xAF, 0xAF, - 0x7E, 0x85, 0x85, 0x2C, 0x85, 0x85, 0x85, 0x2C, - 0x2C, 0x2C, 0xAF, 0xD9, 0xD9, 0x95, 0xD9, 0xAC, - 0xAC, 0xAF, 0xAF, 0xAC, 0xAC, 0xAC, 0x91, 0x20, - 0x33, 0xE3, 0x41, 0x48, 0x73, 0x5C, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xA3, 0xD6, 0x6C, 0x85, 0xE8, - 0xDA, 0xAE, 0xB2, 0xA3, 0x5C, 0xE8, 0xE8, 0xE8, - 0x3D, 0xEE, 0x4D, 0xA3, 0x24, 0x20, 0x6B, 0xDB, - 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x85, 0x95, - 0xD9, 0xD9, 0xAC, 0xAF, 0xAF, 0xAC, 0xD9, 0xAC, - 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xAC, 0xD9, 0xAC, - 0x8A, 0xD9, 0xAC, 0xD9, 0xAC, 0xAC, 0x2C, 0x2C, - 0xAF, 0xAF, 0xAF, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, - 0xAF, 0xAF, 0xAF, 0xAC, 0xAC, 0x85, 0x33, 0x20, - 0xCC, 0x20, 0xE3, 0xA3, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xA3, 0xD9, 0x81, 0xAC, 0xDA, 0x2D, 0x5C, - 0x48, 0x41, 0x88, 0x74, 0x21, 0xA3, 0xE8, 0xE8, - 0xE8, 0xE8, 0x73, 0x8C, 0x8A, 0x20, 0x20, 0x20, - 0xDB, 0x33, 0x20, 0x20, 0x20, 0x20, 0xE6, 0xD9, - 0xD9, 0xAC, 0xAC, 0xAF, 0xAC, 0xAF, 0xAC, 0xAF, - 0xAF, 0xAC, 0xD9, 0xAF, 0xD9, 0xAC, 0xAC, 0xAF, - 0x85, 0xD9, 0x95, 0xD9, 0x95, 0xD9, 0xD9, 0xAC, - 0xAF, 0xAC, 0xAF, 0xAF, 0x2C, 0xAF, 0x2C, 0x2C, - 0xAF, 0xAF, 0xAF, 0xAC, 0xAC, 0x2C, 0x20, 0x5B, - 0x33, 0x20, 0xD6, 0xE8, 0xE8, 0xE8, 0xE8, 0x73, - 0xAF, 0x2D, 0xD9, 0xDA, 0xB2, 0x81, 0x81, 0xE4, - 0xA1, 0x91, 0x2B, 0x88, 0x33, 0x80, 0xAF, 0x73, - 0xE8, 0xE8, 0xE8, 0x5C, 0xA3, 0x80, 0x41, 0xCC, - 0x2B, 0xCC, 0x20, 0x20, 0x20, 0x20, 0x88, 0xDA, - 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0xAC, 0xAC, 0xAF, - 0xAF, 0xAF, 0xAF, 0xAC, 0xAF, 0xAF, 0xAF, 0x2C, - 0x85, 0xD9, 0xD9, 0xD9, 0xD9, 0xAC, 0xAC, 0xD9, - 0xD9, 0xD9, 0xAC, 0x2C, 0x2C, 0x2C, 0x85, 0x85, - 0x85, 0x2C, 0x2C, 0xAF, 0x2C, 0x91, 0x20, 0xAE, - 0x20, 0xDB, 0x3D, 0xE8, 0xE8, 0x5C, 0xB2, 0x80, - 0xB2, 0xAF, 0x48, 0xB2, 0x48, 0x89, 0x89, 0x3D, - 0x21, 0x48, 0x6C, 0x2D, 0x2B, 0x41, 0xE3, 0xAE, - 0xD9, 0x5C, 0xE8, 0xE8, 0xE8, 0x95, 0x33, 0x80, - 0xAE, 0x33, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x95, - 0x85, 0x2C, 0x85, 0x2C, 0x2C, 0xAF, 0x2C, 0x2C, - 0x2C, 0xAF, 0xAC, 0xAF, 0xAF, 0x2C, 0x2C, 0x2C, - 0xDA, 0xAF, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0x2C, - 0xAC, 0xD9, 0xAC, 0xAF, 0x2C, 0x85, 0x2C, 0x85, - 0x85, 0x2C, 0x2C, 0x2C, 0x8A, 0x41, 0xDB, 0x33, - 0x20, 0x95, 0xE8, 0xE8, 0xE8, 0xA3, 0xDB, 0x88, - 0xDB, 0x80, 0xD6, 0x7E, 0x85, 0x2D, 0xE6, 0x5C, - 0x21, 0x48, 0xD9, 0x7E, 0xD6, 0x2B, 0xCC, 0xAC, - 0x85, 0xBC, 0xE8, 0xE8, 0xE8, 0xCD, 0x88, 0x5B, - 0x41, 0x20, 0xAE, 0x20, 0x20, 0x20, 0x20, 0x74, - 0xDA, 0x85, 0x85, 0x85, 0x2C, 0x2C, 0x2C, 0x2C, - 0xAF, 0xAC, 0xD9, 0xD9, 0xAC, 0xAC, 0xAC, 0xD9, - 0x8A, 0xAF, 0xAC, 0xAC, 0x2C, 0x85, 0x2C, 0xAF, - 0xD9, 0xD9, 0xAF, 0xAF, 0xAF, 0x2C, 0xAF, 0x2C, - 0x2C, 0x2C, 0x2C, 0xAF, 0x95, 0x20, 0x74, 0x20, - 0x33, 0xA3, 0xE8, 0xE8, 0xE8, 0xE4, 0x7D, 0xCC, - 0x6B, 0x33, 0xAE, 0x2C, 0x85, 0x2D, 0x9F, 0x73, - 0xA1, 0x2D, 0x2C, 0xDA, 0x89, 0x48, 0xD3, 0xD9, - 0x21, 0xA3, 0xE8, 0xE8, 0xE8, 0xE8, 0xE3, 0x20, - 0x20, 0x20, 0xDB, 0x41, 0x20, 0x20, 0x20, 0x20, - 0xDA, 0x2C, 0x2C, 0x2C, 0x2C, 0xAF, 0xAC, 0xAC, - 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0x95, 0x95, 0xD9, - 0x2C, 0xD9, 0xD9, 0xAC, 0x2C, 0x2C, 0x85, 0xAF, - 0xAF, 0xAF, 0xAC, 0xAC, 0xD9, 0xAC, 0xAF, 0xAC, - 0xAC, 0x95, 0xD6, 0x7D, 0xAE, 0x88, 0x2B, 0x20, - 0x6C, 0xE8, 0xE8, 0xE8, 0x73, 0xEE, 0x73, 0x2C, - 0x89, 0x2B, 0x41, 0x33, 0xCC, 0xCC, 0x80, 0x3D, - 0x2D, 0x74, 0x80, 0x48, 0x8D, 0x95, 0x48, 0x95, - 0xEE, 0x5C, 0x5C, 0xE8, 0xE8, 0xE8, 0x24, 0x20, - 0x20, 0x20, 0x5B, 0xDB, 0x20, 0x20, 0x20, 0x20, - 0xAF, 0xAC, 0xD9, 0x95, 0xD6, 0xD6, 0xD6, 0x7D, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0xD9, 0xAC, - 0xAC, 0xD9, 0xD9, 0xAC, 0x2C, 0x2C, 0x2C, 0xAF, - 0xAC, 0xAC, 0xAC, 0xAC, 0xD9, 0xAC, 0xAC, 0xD9, - 0xD6, 0x48, 0xE9, 0x95, 0x20, 0x2B, 0x41, 0x6B, - 0x8D, 0xE8, 0xE8, 0xCD, 0x2B, 0x2B, 0x2C, 0x73, - 0xCD, 0x48, 0xCA, 0x5B, 0x41, 0x5B, 0x74, 0xDA, - 0x80, 0xE6, 0xC8, 0x85, 0xA1, 0x7D, 0x8D, 0x3D, - 0x7E, 0xE9, 0x7D, 0xEE, 0xE8, 0xE8, 0x81, 0x20, - 0x20, 0x20, 0xE3, 0xE3, 0x20, 0x20, 0x20, 0x20, - 0x2D, 0xD9, 0xD6, 0x48, 0x6C, 0xE9, 0xA1, 0xD6, - 0xD9, 0xD9, 0xAC, 0xD9, 0xD9, 0x95, 0xAC, 0x2C, - 0x2C, 0x2C, 0x2C, 0xD9, 0xAC, 0x2C, 0x2C, 0x2C, - 0xAF, 0x2C, 0xAF, 0xD9, 0xAC, 0xAF, 0xAF, 0x95, - 0xB2, 0xE9, 0x21, 0x2B, 0x41, 0x2B, 0x20, 0x5B, - 0x3D, 0xE8, 0xE8, 0x8D, 0x2B, 0x88, 0x5B, 0xE6, - 0xBC, 0x73, 0x85, 0x89, 0x80, 0x5B, 0xE3, 0xAE, - 0x2C, 0x8A, 0xD6, 0xB2, 0x2C, 0xA3, 0xA3, 0xD9, - 0xA1, 0x2C, 0x85, 0x8D, 0xE8, 0xE8, 0x48, 0x20, - 0x20, 0x20, 0xE3, 0x88, 0x20, 0x20, 0x20, 0x20, - 0xAE, 0xD9, 0xB2, 0xE9, 0x6C, 0x48, 0xD6, 0xD9, - 0x2C, 0x85, 0x2C, 0xD9, 0x7D, 0xD9, 0x2C, 0x85, - 0x8D, 0x85, 0x2C, 0xAC, 0xAF, 0x2C, 0x2C, 0x85, - 0x2C, 0x2C, 0xAF, 0xAC, 0xAC, 0xAF, 0xAF, 0xD9, - 0xB2, 0x48, 0xB2, 0x20, 0x20, 0xCC, 0x20, 0x9F, - 0xE8, 0xE8, 0xE8, 0xCD, 0x48, 0x89, 0xDB, 0x88, - 0x2B, 0xE9, 0xCD, 0x2A, 0x48, 0x80, 0xAE, 0xAE, - 0x7D, 0x48, 0x21, 0xEE, 0x3D, 0x2C, 0x48, 0x85, - 0x2C, 0x95, 0x7D, 0x8C, 0xE8, 0xE8, 0xB2, 0x20, - 0x20, 0x20, 0xDB, 0x20, 0x20, 0x20, 0x20, 0x20, - 0xDB, 0x2C, 0xB2, 0x48, 0x48, 0x7D, 0xD9, 0xAF, - 0x85, 0x8A, 0x85, 0x7D, 0xB2, 0x95, 0x85, 0xDA, - 0xD3, 0x85, 0xAF, 0xAC, 0x2C, 0x85, 0x85, 0x2C, - 0xAC, 0xAC, 0xAC, 0xD9, 0xD9, 0xAC, 0x2C, 0x2C, - 0xD9, 0xAC, 0x5B, 0x20, 0x20, 0xAE, 0x20, 0x2D, - 0xE8, 0xE8, 0xE8, 0x7E, 0xD6, 0x48, 0xE9, 0xAE, - 0x88, 0x5B, 0x80, 0x6C, 0xAE, 0xCA, 0x91, 0xE9, - 0x43, 0x9F, 0xE6, 0x2C, 0x48, 0x21, 0xBC, 0x95, - 0x95, 0xD6, 0x21, 0x7E, 0xE8, 0xE8, 0x7D, 0x20, - 0x20, 0x20, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6B, 0xDA, 0xD9, 0x48, 0xB2, 0xD9, 0x2C, 0x85, - 0xDA, 0xDA, 0x2C, 0xA1, 0x48, 0xAC, 0xDA, 0x8D, - 0x2A, 0xAC, 0x7D, 0x95, 0xAF, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0x95, 0x7D, 0x95, 0xAC, 0x2C, 0xAF, - 0x7D, 0xD6, 0x20, 0x20, 0x88, 0x9F, 0x20, 0xA1, - 0xE8, 0xE8, 0xE8, 0xA3, 0xD6, 0x6C, 0xB2, 0x2C, - 0x89, 0xE3, 0x88, 0xDB, 0xCC, 0x24, 0x7D, 0xEE, - 0xB2, 0xCC, 0xAE, 0x2D, 0xDA, 0x2C, 0xD6, 0x2C, - 0xB2, 0x2D, 0xD6, 0xEE, 0xE8, 0xE8, 0x95, 0x20, - 0x20, 0x20, 0xDB, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6B, 0xDA, 0x95, 0xA1, 0xB2, 0xAC, 0x85, 0x85, - 0xDA, 0x2C, 0x95, 0xA1, 0x21, 0x2C, 0x8A, 0x2A, - 0xAF, 0xA1, 0x48, 0xD6, 0xAF, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0x95, 0x7D, 0x95, 0xAC, 0xD9, 0x7D, - 0x48, 0xE6, 0x20, 0x20, 0x33, 0x89, 0x6B, 0x95, - 0xE8, 0xE8, 0xE8, 0xA3, 0x21, 0x48, 0xAF, 0xAF, - 0x9F, 0xE9, 0x43, 0x33, 0x33, 0x2D, 0xDA, 0xCD, - 0xD6, 0xAE, 0x85, 0x2C, 0x7D, 0xD6, 0x91, 0xB8, - 0xD4, 0x48, 0x7D, 0xA3, 0xE8, 0xE8, 0x95, 0x20, - 0x20, 0x33, 0xE3, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2C, 0x48, 0x6C, 0xB2, 0xAF, 0xDA, 0xDA, - 0x85, 0xAF, 0xD9, 0x95, 0xAC, 0xDA, 0x8A, 0xDA, - 0x7D, 0x48, 0x48, 0x7D, 0x2C, 0x85, 0x2C, 0xAF, - 0xD9, 0xD9, 0x7D, 0x95, 0xD9, 0xD9, 0x95, 0xD6, - 0x21, 0x24, 0x20, 0x20, 0x20, 0x5B, 0xDB, 0xAC, - 0xE8, 0xE8, 0xE8, 0x3D, 0x7D, 0x48, 0xE6, 0x2D, - 0x85, 0x81, 0x81, 0x48, 0xAE, 0xCA, 0x89, 0xCC, - 0xAE, 0xDB, 0x2D, 0x95, 0x21, 0xCC, 0xDB, 0xAE, - 0x91, 0xE9, 0x7D, 0x73, 0xE8, 0xE8, 0x48, 0x20, - 0x6B, 0x74, 0x41, 0x88, 0x6B, 0x20, 0x20, 0x20, - 0x6B, 0x95, 0xB2, 0xD6, 0xD9, 0x85, 0xDA, 0xDA, - 0xDA, 0x2C, 0xAF, 0xAF, 0x2C, 0xDA, 0xDA, 0x85, - 0xA1, 0xE9, 0x48, 0x95, 0x85, 0xDA, 0x85, 0xAC, - 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0x95, - 0x95, 0x6C, 0x41, 0x93, 0x93, 0x41, 0xDB, 0x95, - 0xE8, 0xE8, 0xE8, 0x3D, 0x95, 0xD4, 0x6C, 0x21, - 0x2D, 0x95, 0xCD, 0x2C, 0xD6, 0xD9, 0x6C, 0x91, - 0x89, 0x7D, 0xAC, 0x2A, 0x8D, 0xE6, 0xCC, 0x88, - 0x74, 0x48, 0xD9, 0xE4, 0xE8, 0xE8, 0xE6, 0x88, - 0x2B, 0x88, 0x20, 0x33, 0xDB, 0x2B, 0xDB, 0x20, - 0x91, 0x7D, 0xD9, 0xD9, 0x85, 0x85, 0xDA, 0xDA, - 0x85, 0xAF, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, - 0xA1, 0xA1, 0xD6, 0xAF, 0x85, 0xDA, 0x85, 0x2C, - 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xD9, 0xD9, 0xAC, - 0x2C, 0x47, 0x87, 0x3E, 0x3E, 0xA4, 0x7B, 0x80, - 0xA3, 0xE8, 0xE8, 0x5C, 0x7D, 0x48, 0xE6, 0xD9, - 0xBC, 0xEE, 0x7D, 0x43, 0xD6, 0x21, 0x43, 0x6C, - 0x43, 0x7D, 0x7D, 0xB2, 0x8A, 0xEE, 0x2C, 0xCA, - 0xAE, 0x48, 0x2C, 0xE4, 0xE8, 0x5C, 0xCC, 0x88, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x91, 0xE3, - 0x21, 0xD9, 0x2C, 0x2C, 0xDA, 0xDA, 0xDA, 0x85, - 0x2C, 0xAC, 0xD9, 0xD9, 0xAC, 0xAF, 0xAF, 0xAF, - 0xD6, 0x7D, 0xD9, 0x2C, 0xDA, 0xDA, 0x85, 0xAC, - 0xD9, 0x7D, 0x7D, 0xD9, 0xD9, 0xD9, 0x2C, 0x2C, - 0xB8, 0x9C, 0xEC, 0x62, 0x6F, 0x62, 0x70, 0x3C, - 0xAE, 0xCD, 0xE8, 0xE8, 0x8C, 0x7D, 0xC8, 0x3D, - 0x8A, 0xE9, 0x2D, 0x9E, 0xA1, 0xD6, 0x48, 0x73, - 0x81, 0xD6, 0xD6, 0xAE, 0x5B, 0x2D, 0xA3, 0xA3, - 0x21, 0x21, 0xCD, 0xE8, 0xC0, 0x56, 0x31, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0xCC, 0xDB, - 0x42, 0x85, 0x85, 0x85, 0x85, 0x85, 0x2C, 0x2C, - 0xAC, 0xD9, 0xD9, 0xD9, 0xAC, 0xAF, 0xAF, 0xAF, - 0xD9, 0x95, 0xAC, 0x2C, 0x85, 0x85, 0x2C, 0xD9, - 0x7D, 0xD6, 0xD6, 0xD9, 0xAC, 0xAF, 0x8A, 0xBC, - 0xC2, 0x68, 0x2E, 0x4B, 0xC9, 0x8B, 0x62, 0x87, - 0x3C, 0x74, 0xBC, 0xE8, 0xE8, 0xE4, 0xEE, 0xA1, - 0xE9, 0x21, 0xE6, 0x89, 0x48, 0x7D, 0xB2, 0x5C, - 0x6C, 0x7D, 0x21, 0x80, 0xE3, 0x33, 0xCC, 0x2C, - 0x3D, 0x3D, 0xE8, 0xE8, 0xEC, 0xCB, 0x5A, 0x6B, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x88, 0x41, 0x51, - 0x49, 0x28, 0x85, 0x85, 0x85, 0x85, 0x2C, 0xAF, - 0xAC, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0xD9, 0x95, 0xD9, 0x2C, 0x85, 0x85, 0x2C, 0xD9, - 0xB2, 0xB2, 0x2C, 0x2A, 0x79, 0x79, 0x97, 0x44, - 0xED, 0x29, 0x32, 0x62, 0x4B, 0x62, 0x6F, 0x22, - 0xF3, 0x6B, 0x33, 0x85, 0x73, 0xE4, 0x2D, 0x2B, - 0xCC, 0x9F, 0xDA, 0xBC, 0x48, 0xD6, 0xA1, 0xE4, - 0xE9, 0xD6, 0xD9, 0x2A, 0xB2, 0x2B, 0x2B, 0xA1, - 0xB8, 0xE8, 0xE8, 0xE8, 0xEC, 0x3E, 0x30, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6B, 0x54, 0xDC, - 0xC9, 0x53, 0xBC, 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, - 0xAF, 0xAC, 0xAF, 0xAC, 0xAC, 0x2C, 0xAF, 0xAC, - 0x2C, 0x7D, 0xD9, 0x2C, 0x85, 0xDA, 0xAF, 0x7D, - 0xB2, 0xAC, 0xC6, 0xBA, 0x4C, 0xEF, 0xA7, 0xEF, - 0xEC, 0x7A, 0x62, 0x4B, 0x62, 0x4B, 0x8B, 0x4B, - 0x3A, 0x52, 0x20, 0x6B, 0x21, 0x73, 0xAC, 0x2B, - 0x41, 0x33, 0x48, 0x67, 0xA1, 0xD6, 0xD6, 0x5C, - 0xE9, 0xD6, 0x2C, 0xEE, 0xB2, 0x9F, 0x8A, 0x95, - 0x4D, 0xE8, 0xE8, 0x3D, 0x7A, 0x57, 0xD1, 0x7B, - 0x20, 0x20, 0x20, 0x20, 0x6B, 0xCF, 0xBA, 0x3E, - 0x3E, 0xD0, 0xBC, 0xAC, 0xAC, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0x95, 0x95, 0x7D, 0x95, 0x95, 0xD9, - 0x85, 0xD9, 0xAF, 0xDA, 0xDA, 0x85, 0xAC, 0x21, - 0xB2, 0x2A, 0xBA, 0x57, 0x2E, 0x2E, 0x2E, 0x7A, - 0x32, 0x62, 0x8B, 0x4B, 0x8B, 0x4B, 0x4B, 0x4B, - 0xC9, 0x4A, 0x5F, 0x20, 0x20, 0x2D, 0xA3, 0xD9, - 0xCA, 0x88, 0xDB, 0x24, 0x48, 0x7D, 0xB2, 0xE4, - 0x2D, 0x7D, 0x7D, 0x81, 0xA1, 0xDA, 0x21, 0xDA, - 0xE4, 0xE8, 0xEE, 0xF1, 0x2E, 0x57, 0x82, 0x76, - 0x52, 0x4F, 0x4F, 0x98, 0xDE, 0xB5, 0xEC, 0x2E, - 0x3E, 0x6D, 0x85, 0x2C, 0xAC, 0xAC, 0xD9, 0xD9, - 0x95, 0xD6, 0x7D, 0x7D, 0x95, 0xD9, 0xD9, 0xD9, - 0xDA, 0x2C, 0x85, 0xDA, 0xDA, 0x2C, 0x95, 0xB2, - 0x21, 0xB8, 0xED, 0x2E, 0x3E, 0x4B, 0xC9, 0x4B, - 0x8B, 0x62, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x22, 0x6F, 0xCE, 0x20, 0x20, 0x20, 0x80, 0xCD, - 0xDA, 0x2D, 0x2B, 0xDB, 0xE9, 0xD6, 0x95, 0x5C, - 0x2D, 0x7D, 0x7D, 0xAF, 0xAF, 0xAC, 0xEE, 0x5C, - 0xE8, 0xE8, 0xEB, 0x25, 0x7A, 0x57, 0x39, 0xE1, - 0x83, 0xA8, 0x55, 0x83, 0x82, 0x57, 0x32, 0x8B, - 0x62, 0x6D, 0xEB, 0x95, 0xD9, 0xD9, 0xD9, 0xD9, - 0xD9, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, - 0xDA, 0x2C, 0x85, 0x85, 0x85, 0xAC, 0xD6, 0x21, - 0x95, 0x6E, 0xED, 0x57, 0x62, 0x4B, 0x8B, 0x4B, - 0x4B, 0x62, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x62, - 0x62, 0x62, 0x25, 0x3C, 0x20, 0x20, 0x20, 0xE3, - 0x2A, 0xBC, 0x7D, 0xCA, 0x6C, 0xD6, 0x95, 0x3D, - 0x81, 0x7D, 0xD6, 0xD6, 0xDA, 0x73, 0xE8, 0xE8, - 0xE8, 0x4D, 0x94, 0xED, 0x72, 0x3A, 0xF1, 0xA7, - 0x39, 0xED, 0x39, 0xEF, 0x57, 0x32, 0x8B, 0x4B, - 0x62, 0x62, 0xA6, 0x2A, 0xD9, 0xD9, 0xD9, 0xD9, - 0x2C, 0x2C, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, - 0x85, 0x2C, 0x2C, 0xAF, 0xAC, 0x95, 0x21, 0x7D, - 0xAC, 0x8C, 0x46, 0xC4, 0x62, 0x8B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x62, 0xC9, 0x30, 0x7B, 0x20, 0x20, 0x20, - 0x41, 0x4D, 0x3D, 0x85, 0x48, 0x21, 0xDA, 0x3D, - 0xE9, 0xD6, 0xD9, 0xCD, 0x5C, 0xE8, 0xE8, 0xE8, - 0xE8, 0x4D, 0x71, 0x46, 0xEC, 0x2E, 0x72, 0xEC, - 0x29, 0x29, 0x7C, 0x29, 0x2E, 0x4B, 0x4B, 0x62, - 0x62, 0x4B, 0x3A, 0xAD, 0xE2, 0xAF, 0xD9, 0xD9, - 0x2C, 0xDA, 0xDA, 0xDA, 0xDA, 0x85, 0x2C, 0x2C, - 0x2C, 0xAF, 0xAC, 0xD9, 0x95, 0xD6, 0xD6, 0xD9, - 0x2C, 0x8C, 0xBA, 0x7C, 0x2E, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x62, 0xC9, 0xDC, 0x34, 0x20, 0x20, 0x20, - 0x20, 0xAC, 0xE8, 0x5C, 0x8C, 0xBC, 0xE4, 0xE8, - 0xEE, 0x2A, 0xA3, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE4, 0x7E, 0x65, 0x46, 0x29, 0x62, 0x62, 0x2E, - 0x2E, 0x72, 0x2E, 0x2E, 0x32, 0x4B, 0x4B, 0x62, - 0x4B, 0x4B, 0x4B, 0x32, 0x61, 0x9D, 0x2C, 0xD9, - 0x2C, 0x85, 0xDA, 0x85, 0x2C, 0xAF, 0xAF, 0xAF, - 0x2C, 0xAC, 0xD9, 0x95, 0xD6, 0x7D, 0x95, 0xAC, - 0x2C, 0xDA, 0x40, 0x7C, 0x2E, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x62, 0x62, 0x22, 0xB7, 0xCE, 0x20, 0x20, - 0x20, 0x95, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, - 0x3D, 0xE9, 0x9A, 0x46, 0x7C, 0x32, 0x8B, 0x62, - 0x4B, 0x8B, 0x8B, 0x4B, 0x4B, 0x4B, 0x4B, 0x62, - 0x4B, 0x4B, 0x4B, 0x4B, 0x62, 0x61, 0x4E, 0xDA, - 0x85, 0x85, 0x85, 0x2C, 0xD9, 0xD9, 0xD9, 0xD9, - 0x85, 0xD9, 0x7D, 0x21, 0x21, 0xD6, 0xAC, 0x2C, - 0x2C, 0xDA, 0xDD, 0x77, 0x8B, 0x62, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x3E, 0x8B, 0x32, 0xC9, 0x22, 0x68, 0x88, 0x33, - 0xA1, 0x73, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0x5C, 0x5C, 0x5C, 0x5C, 0x3D, - 0x89, 0x20, 0x54, 0x23, 0x29, 0x2E, 0x4B, 0x62, - 0x4B, 0x3E, 0x4B, 0x62, 0x4B, 0x4B, 0x4B, 0x8B, - 0x8B, 0xC9, 0x6F, 0x4B, 0x8B, 0x4B, 0x78, 0xE2, - 0x8A, 0x8A, 0x85, 0xAC, 0xD9, 0x7D, 0xD9, 0xAC, - 0x2C, 0xD9, 0xD6, 0xB2, 0x21, 0x7D, 0xAF, 0x85, - 0x2C, 0xDA, 0x40, 0xEF, 0x62, 0x62, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x8B, 0x4B, 0xC9, 0x63, 0xB4, 0x5C, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0xE8, 0xE8, 0xE8, 0xE8, 0x5C, 0x5C, 0xCD, 0xAE, - 0x20, 0x20, 0xCE, 0xE1, 0x57, 0x32, 0x4B, 0x4B, - 0x8B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x8B, 0x4B, 0x62, 0x4B, 0x62, 0x2E, 0x61, 0x28, - 0x8D, 0xDA, 0xAF, 0xD9, 0x95, 0x95, 0xD9, 0xAF, - 0xAF, 0xD9, 0xD6, 0xB2, 0x21, 0xD9, 0x2C, 0x85, - 0xAF, 0xEB, 0xE1, 0x57, 0x2E, 0x62, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x3E, 0x9B, 0x31, 0x6E, - 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, - 0x5C, 0xE8, 0xE8, 0xE8, 0x3D, 0x7D, 0x33, 0x6B, - 0x20, 0x20, 0x34, 0x23, 0x29, 0x3E, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x3E, 0x62, 0x62, 0x2E, 0xC4, 0x49, 0xD5, - 0xDA, 0xD9, 0xD6, 0xA1, 0xA1, 0x21, 0xD9, 0xD9, - 0xD9, 0x95, 0x21, 0x48, 0xD6, 0xAC, 0x85, 0x85, - 0xAF, 0xB6, 0x5D, 0x2E, 0x32, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x62, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x62, 0x2E, 0x45, 0xDE, - 0xDA, 0x5C, 0xE8, 0x5C, 0xE8, 0xE8, 0x5C, 0xE8, - 0x5C, 0x5C, 0xA3, 0xAC, 0x2B, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x34, 0x23, 0x29, 0x62, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x62, 0x4B, 0x4B, 0x4B, - 0x4B, 0x3E, 0x3E, 0x63, 0x40, 0x97, 0x28, 0xDA, - 0xD9, 0xA1, 0x48, 0xE9, 0x48, 0x21, 0xD9, 0xD9, - 0xA1, 0xB2, 0xB2, 0xA1, 0x21, 0xAC, 0x85, 0x2C, - 0xDA, 0x36, 0x77, 0x72, 0x62, 0x8B, 0x62, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x3E, 0xEC, 0x2F, 0x51, - 0xE3, 0xAE, 0x48, 0x2C, 0xDA, 0xDA, 0x85, 0xAC, - 0x48, 0x9E, 0x88, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x41, 0xA0, 0x23, 0x72, 0x2E, 0x4B, 0x4B, - 0x4B, 0x62, 0x62, 0x4B, 0x4B, 0x4B, 0x2E, 0x8B, - 0xF0, 0x4C, 0x40, 0xC2, 0x90, 0x8D, 0x85, 0xD9, - 0xA1, 0x6C, 0x6C, 0x48, 0xD6, 0xD9, 0xAF, 0xAC, - 0xA1, 0xD6, 0xD6, 0xB2, 0xD6, 0xAC, 0x85, 0x85, - 0x4D, 0xBE, 0x39, 0x4C, 0x57, 0x2E, 0x2E, 0x2E, - 0x3E, 0x3E, 0x62, 0x3E, 0x4B, 0x4B, 0x4B, 0x4B, - 0x4B, 0x4B, 0x4B, 0x8B, 0x8B, 0x57, 0x60, 0x76, - 0x52, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0xA0, 0x23, 0x7C, 0x2E, 0x4B, 0x4B, - 0x8B, 0x62, 0x4B, 0x4B, 0x3E, 0x7A, 0xF0, 0x29, - 0x36, 0x97, 0xBC, 0x8A, 0x8D, 0xDA, 0xD9, 0x48, - 0x81, 0x2D, 0x48, 0xD6, 0xD9, 0xAF, 0x2C, 0x2C, - 0xAC, 0xAF, 0xD9, 0x7D, 0x7D, 0x2C, 0x85, 0x85, - 0x85, 0xB4, 0x66, 0x23, 0x46, 0x2F, 0x60, 0x68, - 0x77, 0x29, 0x29, 0xF0, 0x2E, 0x2E, 0x62, 0x4B, - 0x4B, 0x4B, 0x4B, 0x4B, 0x32, 0x7C, 0x83, 0xB3, - 0x54, 0x6B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6B, 0x7B, 0xC3, 0xE7, 0x39, 0x72, 0x62, 0x62, - 0x62, 0x62, 0x62, 0x2E, 0x29, 0x77, 0xA7, 0x36, - 0xB8, 0x85, 0x85, 0x8D, 0x8D, 0x85, 0xB2, 0x2D, - 0x2D, 0xE9, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, - 0x2A, 0x85, 0xAC, 0x95, 0x95, 0xAF, 0x85, 0x85, - 0xAF, 0x8C, 0xDF, 0xC6, 0xB1, 0xD1, 0xE5, 0xE7, - 0x83, 0x23, 0x5D, 0x60, 0x39, 0x77, 0xEC, 0x2E, - 0x2E, 0x32, 0x32, 0x2E, 0x7C, 0x5D, 0x35, 0xA2, - 0x54, 0x6B, 0x6B, 0x20, 0x6B, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6B, 0x88, 0xC1, 0x35, 0xE1, 0x77, 0x57, 0x2E, - 0x2E, 0x72, 0x29, 0x77, 0x60, 0xB5, 0x44, 0xE2, - 0x2C, 0x2C, 0xDA, 0x8A, 0xDA, 0xAF, 0xA1, 0x2D, - 0xE9, 0xD6, 0xD9, 0xAF, 0x2C, 0x85, 0x85, 0x85, - 0xEE, 0xAF, 0xD9, 0x7D, 0xD9, 0x2C, 0xDA, 0x85, - 0xAC, 0xAF, 0x85, 0xDA, 0x8A, 0x2A, 0xE2, 0x50, - 0x86, 0xD7, 0x75, 0x35, 0xA8, 0xE7, 0xE1, 0x5D, - 0x68, 0x7C, 0xF1, 0x68, 0xE1, 0xBF, 0xA2, 0xC1, - 0x52, 0x2B, 0x7D, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, - 0x2C, 0x85, 0x85, 0x85, 0x2C, 0x2C, 0x2C, 0x95, - 0xE9, 0x74, 0xCE, 0xE0, 0xE7, 0x60, 0x77, 0x77, - 0x7C, 0xEF, 0x5D, 0x23, 0x3F, 0xB6, 0x8A, 0x2C, - 0xAC, 0xAF, 0x85, 0x8A, 0x85, 0xD9, 0x48, 0x48, - 0xB2, 0x95, 0x95, 0xD9, 0x85, 0xDA, 0x85, 0x85, - 0xD3, 0xB2, 0x21, 0x7D, 0xAC, 0x2C, 0xDA, 0x85, - 0xAC, 0xAC, 0x85, 0x85, 0x85, 0x2C, 0xAF, 0x2C, - 0xDA, 0x8C, 0x79, 0xC7, 0xB0, 0x51, 0xB3, 0x35, - 0xBF, 0xE5, 0xE7, 0xA8, 0xE0, 0xA2, 0xC1, 0x34, - 0x7D, 0x85, 0xAC, 0xD9, 0xAC, 0xAF, 0xAC, 0xAC, - 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0xAF, 0xAF, 0x85, - 0xC8, 0xCD, 0x6A, 0x26, 0x35, 0x3F, 0x83, 0x23, - 0x23, 0xE7, 0xBF, 0x96, 0xEB, 0xDA, 0xDA, 0x2C, - 0x2C, 0x2C, 0x85, 0xDA, 0x2C, 0x7D, 0xA1, 0x48, - 0xB2, 0x21, 0xD6, 0xD9, 0x2C, 0xDA, 0x85, 0xAF, - 0xAF, 0x2D, 0xE9, 0x7D, 0xAC, 0x2C, 0x85, 0x2C, - 0xD9, 0xD9, 0xAF, 0x85, 0x85, 0x85, 0x2C, 0x2C, - 0x2C, 0x85, 0xD9, 0x21, 0xAC, 0x2C, 0xBD, 0xA5, - 0xC3, 0xA2, 0xA2, 0xA2, 0x26, 0xC1, 0xCE, 0x2A, - 0xAF, 0x95, 0xD9, 0x2C, 0x2C, 0x85, 0x2C, 0xAF, - 0xAC, 0x2C, 0x85, 0x2C, 0xAF, 0x2C, 0x85, 0xDA, - 0x8D, 0x2A, 0x85, 0x34, 0xC1, 0xB3, 0x76, 0x35, - 0xE0, 0x30, 0xA5, 0xB6, 0x2C, 0x85, 0x85, 0x85, - 0xAF, 0x2C, 0x85, 0x85, 0xD9, 0xD6, 0xA1, 0xA1, - 0x48, 0xA1, 0xD6, 0xAF, 0xDA, 0x8A, 0x2C, 0xD9, - 0xB2, 0x2D, 0x48, 0xD9, 0xAF, 0x2C, 0x2C, 0x85, - 0xAF, 0xAC, 0x2C, 0x85, 0x85, 0x85, 0xAF, 0xAC, - 0xAC, 0x2C, 0xD9, 0xD6, 0xD6, 0x21, 0xB2, 0x2C, - 0xC8, 0x3B, 0x65, 0xC5, 0xCE, 0x8E, 0xC8, 0x2C, - 0xD9, 0x95, 0xAC, 0x2C, 0x2C, 0x2C, 0xAF, 0xAC, - 0xAC, 0xAF, 0x2C, 0x85, 0x2C, 0x2C, 0x2C, 0x85, - 0xDA, 0x2C, 0xD6, 0xAF, 0x59, 0x65, 0xDE, 0xF3, - 0xF3, 0x59, 0xBC, 0xAC, 0xAF, 0x85, 0x85, 0x85, - 0xAF, 0xD9, 0xAF, 0x2C, 0xD9, 0xD6, 0xD6, 0xD6, - 0x21, 0xD6, 0xD9, 0xDA, 0x8D, 0x8A, 0x2C, 0xD9, - 0xB2, 0xA1, 0xD6, 0xAC, 0x2C, 0x2C, 0x2C, 0x85, - 0x2C, 0xAC, 0x2C, 0xDA, 0xDA, 0x85, 0xAF, 0xD9, - 0xD9, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xAC, - 0x85, 0x2A, 0x4D, 0xBC, 0x85, 0xAC, 0xAF, 0xAF, - 0xAC, 0xD9, 0xAF, 0x2C, 0xAF, 0xD9, 0xD9, 0xAC, - 0xAC, 0xAF, 0x85, 0x2C, 0x85, 0x2C, 0x2C, 0x2C, - 0x2C, 0xD9, 0xB2, 0xD4, 0xD6, 0x2C, 0x8A, 0xDA, - 0xC8, 0x85, 0x2C, 0xAC, 0x2C, 0xDA, 0xDA, 0x85, - 0xAF, 0xAC, 0xD9, 0xAC, 0xD9, 0xD9, 0xD9, 0xD9, - 0xD9, 0xAC, 0xDA, 0x8D, 0xBC, 0xDA, 0xD9, 0x95, - 0x95, 0xD9, 0xD9, 0xAF, 0x2C, 0x2C, 0x2C, 0x85, - 0x2C, 0xAF, 0xAF, 0x85, 0x85, 0x85, 0x2C, 0xAC, - 0xD9, 0xAF, 0xAF, 0xAF, 0x2C, 0x2C, 0x2C, 0x85, - 0x8A, 0x2A, 0x8D, 0x2C, 0xD9, 0x95, 0xAC, 0xAC, - 0xD9, 0xD9, 0xD9, 0xD9, 0x95, 0x95, 0xD9, 0xAF, - 0xAF, 0x2C, 0x85, 0x85, 0x85, 0x85, 0x85, 0x2C, - 0x85, 0x2C, 0xD9, 0xD9, 0xD9, 0x2C, 0x2C, 0x2C, - 0x2C, 0x85, 0x85, 0xAF, 0xAF, 0x85, 0x85, 0x85, - 0xAF, 0xD9, 0xD9, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, - 0x2C, 0x85, 0x8A, 0x2A, 0x8D, 0x2C, 0xD9, 0xD9, - 0x2C, 0xAC, 0xAF, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0x85, 0xAF, 0xAC, 0x2C, 0x2C, 0x2C, 0x2C, 0xAC, - 0xD9, 0xD9, 0xAF, 0x85, 0x85, 0x85, 0xDA, 0xDA, - 0x8A, 0x8A, 0x85, 0xAC, 0xD9, 0xD9, 0xAC, 0xD9, - 0xD6, 0xD6, 0x7D, 0x95, 0x7D, 0xD9, 0xAF, 0xAF, - 0xAF, 0x2C, 0x85, 0x85, 0xDA, 0x85, 0x2C, 0x85, - 0x85, 0x2C, 0xAF, 0xAC, 0xAF, 0xAF, 0x2C, 0x2C, - 0x2C, 0x2C, 0x2C, 0xAF, 0xAC, 0x2C, 0x2C, 0x2C, - 0x2C, 0xAF, 0xD9, 0xAC, 0xAF, 0x2C, 0x85, 0x85, - 0x85, 0xDA, 0x8D, 0x8A, 0x85, 0xAC, 0x95, 0xD9 + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x26, 0x26, 0x25, 0x28, 0x23, 0x22, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x25, 0x2a, 0x2b, 0x2c, 0x2d, 0x2d, + 0x2d, 0x2e, 0x2c, 0x2b, 0x2a, 0x25, 0x28, 0x22, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x2a, 0x2c, 0x2f, 0x2c, 0x30, 0x30, 0x24, + 0x25, 0x27, 0x2b, 0x2c, 0x2f, 0x31, 0x32, 0x25, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x33, 0x34, 0x35, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x2b, 0x2f, 0x2c, + 0x30, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x2d, 0x27, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x31, + 0x2d, 0x32, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, 0x2a, 0x34, + 0x25, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x23, 0x32, 0x27, 0x21, 0x36, + 0x2a, 0x2d, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x26, 0x2c, 0x35, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2f, 0x37, 0x32, 0x22, + 0x36, 0x35, 0x31, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x22, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x26, 0x38, 0x38, 0x35, 0x25, + 0x36, 0x21, 0x2d, 0x2b, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x39, 0x39, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2b, 0x30, 0x28, 0x22, + 0x36, 0x36, 0x27, 0x34, 0x30, 0x23, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x26, 0x2d, 0x26, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x22, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2d, 0x33, 0x28, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2b, 0x2c, 0x25, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x36, 0x36, + 0x36, 0x21, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x21, 0x23, 0x22, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x28, 0x34, 0x27, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x21, 0x21, 0x24, 0x27, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x27, 0x22, 0x33, 0x24, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x2f, 0x2a, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x30, 0x3a, 0x38, 0x24, 0x24, 0x36, 0x36, 0x36, + 0x23, 0x2f, 0x3b, 0x3c, 0x3d, 0x30, 0x25, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x32, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x23, + 0x3e, 0x3f, 0x40, 0x3a, 0x22, 0x36, 0x36, 0x21, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x3e, 0x23, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x33, 0x28, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x2b, + 0x44, 0x40, 0x46, 0x47, 0x35, 0x36, 0x36, 0x26, + 0x43, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x34, 0x36, 0x4d, + 0x4e, 0x25, 0x2f, 0x46, 0x4a, 0x22, 0x23, 0x32, + 0x4f, 0x50, 0x21, 0x31, 0x51, 0x52, 0x53, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x21, 0x3a, + 0x4d, 0x21, 0x31, 0x54, 0x55, 0x28, 0x30, 0x2b, + 0x4b, 0x4d, 0x36, 0x23, 0x32, 0x50, 0x3f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x38, 0x23, 0x37, + 0x55, 0x36, 0x28, 0x3a, 0x56, 0x57, 0x57, 0x58, + 0x3c, 0x4d, 0x36, 0x36, 0x36, 0x40, 0x40, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x51, 0x23, 0x35, + 0x43, 0x25, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, + 0x5f, 0x60, 0x61, 0x36, 0x31, 0x47, 0x3b, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x2c, 0x25, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x22, + 0x40, 0x62, 0x63, 0x5d, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x66, 0x5e, 0x6a, 0x6b, 0x2a, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x2e, 0x26, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2f, 0x23, 0x36, + 0x6c, 0x63, 0x6d, 0x64, 0x5c, 0x66, 0x69, 0x6e, + 0x6f, 0x70, 0x71, 0x69, 0x69, 0x72, 0x6c, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x34, 0x27, 0x22, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x34, 0x26, 0x73, + 0x74, 0x75, 0x76, 0x64, 0x65, 0x77, 0x69, 0x78, + 0x70, 0x71, 0x71, 0x71, 0x72, 0x5f, 0x5e, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x25, 0x38, 0x2a, 0x23, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x33, 0x79, + 0x63, 0x7a, 0x7b, 0x5c, 0x66, 0x69, 0x6e, 0x7c, + 0x71, 0x71, 0x69, 0x7d, 0x7e, 0x7a, 0x7f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x51, 0x2b, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x32, 0x24, + 0x80, 0x81, 0x64, 0x82, 0x77, 0x69, 0x71, 0x71, + 0x69, 0x83, 0x84, 0x85, 0x7a, 0x85, 0x86, 0x36, + 0x21, 0x2b, 0x23, 0x36, 0x36, 0x39, 0x2e, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2d, 0x33, 0x21, + 0x87, 0x88, 0x89, 0x72, 0x67, 0x66, 0x5f, 0x89, + 0x8a, 0x63, 0x85, 0x8b, 0x8c, 0x8d, 0x41, 0x36, + 0x36, 0x2d, 0x3a, 0x35, 0x36, 0x24, 0x51, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x33, 0x21, + 0x55, 0x8e, 0x8f, 0x8a, 0x7d, 0x5e, 0x90, 0x7e, + 0x75, 0x75, 0x90, 0x62, 0x40, 0x3f, 0x49, 0x23, + 0x36, 0x24, 0x3a, 0x3a, 0x24, 0x36, 0x2e, 0x31, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x33, 0x37, 0x25, 0x22, + 0x3b, 0x50, 0x8e, 0x8f, 0x90, 0x7e, 0x90, 0x63, + 0x74, 0x91, 0x92, 0x42, 0x93, 0x4b, 0x45, 0x2c, + 0x36, 0x36, 0x33, 0x39, 0x21, 0x36, 0x22, 0x51, + 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x27, 0x2e, 0x2e, 0x36, 0x21, + 0x94, 0x3f, 0x50, 0x95, 0x96, 0x8f, 0x8f, 0x97, + 0x8e, 0x42, 0x50, 0x43, 0x47, 0x48, 0x48, 0x98, + 0x21, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, + 0x2e, 0x27, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x2b, 0x38, 0x28, 0x36, 0x32, + 0x4c, 0x4b, 0x50, 0x50, 0x50, 0x42, 0x42, 0x50, + 0x50, 0x40, 0x45, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x23, + 0x2f, 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x32, 0x51, 0x32, 0x28, 0x21, 0x98, + 0x48, 0x47, 0x9a, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x9a, 0x4f, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x93, 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2f, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x23, 0x30, 0x2e, 0x2c, 0x36, 0x21, 0x51, 0x9b, + 0x48, 0x48, 0x52, 0x3f, 0x50, 0x50, 0x40, 0x4b, + 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2d, 0x31, 0x27, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x2c, 0x2d, 0x21, 0x36, 0x28, 0x44, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x46, 0x4f, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x9c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x28, 0x51, 0x39, 0x26, 0x22, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x35, 0x51, 0x28, 0x36, 0x36, 0x9d, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x9b, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4f, 0x28, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x38, 0x2b, 0x25, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x51, 0x25, 0x36, 0x36, 0x23, 0x40, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x9b, 0x99, 0x2b, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x2f, 0x33, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x23, 0x30, 0x34, + 0x27, 0x36, 0x36, 0x36, 0x2a, 0x40, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x99, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x47, 0x52, + 0x46, 0x4f, 0x37, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x30, 0x34, 0x2a, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, 0x39, 0x2c, + 0x36, 0x36, 0x36, 0x21, 0x31, 0x4e, 0x9a, 0x4c, + 0x47, 0x9b, 0x9b, 0x52, 0x46, 0x4f, 0x52, 0x9b, + 0x9b, 0x9b, 0x47, 0x4f, 0x45, 0x9a, 0x93, 0x93, + 0x3f, 0x93, 0x98, 0x28, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x28, + 0x36, 0x36, 0x36, 0x22, 0x38, 0x98, 0x44, 0x99, + 0x9b, 0x48, 0x48, 0x9b, 0x4c, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x52, 0x46, 0x43, 0x93, + 0x40, 0x40, 0x43, 0x53, 0x21, 0x23, 0x33, 0x23, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x2f, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x2b, 0x31, 0x36, + 0x36, 0x22, 0x36, 0x24, 0x9e, 0x4f, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x47, + 0x4f, 0x9a, 0x3f, 0x46, 0x38, 0x36, 0x21, 0x30, + 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, + 0x25, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2e, 0x33, 0x36, + 0x25, 0x25, 0x36, 0x4d, 0x52, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x4f, 0x3e, 0x4d, 0x49, 0x48, + 0x98, 0x2b, 0x55, 0x4f, 0x9b, 0x48, 0x48, 0x48, + 0x48, 0x47, 0x44, 0x93, 0x43, 0x23, 0x36, 0x36, + 0x26, 0x24, 0x36, 0x36, 0x36, 0x36, 0x28, 0x2f, + 0x2a, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x51, 0x24, 0x36, + 0x2a, 0x36, 0x28, 0x44, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4f, 0x54, 0x38, 0x3d, 0x98, 0x37, 0x9b, + 0x3a, 0x22, 0x23, 0x2a, 0x55, 0x4f, 0x48, 0x48, + 0x48, 0x48, 0x9b, 0x4b, 0x44, 0x37, 0x36, 0x23, + 0x28, 0x30, 0x22, 0x36, 0x36, 0x36, 0x36, 0x2d, + 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x2b, 0x34, 0x36, 0x25, + 0x24, 0x36, 0x4a, 0x48, 0x48, 0x48, 0x48, 0x52, + 0x53, 0x37, 0x54, 0x98, 0x55, 0x38, 0x38, 0x47, + 0x4a, 0x2d, 0x30, 0x23, 0x28, 0x39, 0x53, 0x52, + 0x48, 0x48, 0x48, 0x9b, 0x52, 0x3f, 0x21, 0x30, + 0x35, 0x25, 0x30, 0x36, 0x36, 0x36, 0x36, 0x32, + 0x2d, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x26, 0x2e, 0x35, 0x36, 0x2a, + 0x36, 0x24, 0x4f, 0x48, 0x48, 0x9b, 0x55, 0x39, + 0x55, 0x53, 0x3a, 0x55, 0x3a, 0x51, 0x51, 0x47, + 0x55, 0x3a, 0x4d, 0x37, 0x30, 0x22, 0x24, 0x2b, + 0x54, 0x9b, 0x48, 0x48, 0x48, 0x47, 0x32, 0x30, + 0x2a, 0x23, 0x30, 0x23, 0x36, 0x36, 0x36, 0x21, + 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x2a, 0x51, 0x28, 0x28, 0x25, + 0x36, 0x3a, 0x48, 0x48, 0x48, 0x4f, 0x26, 0x23, + 0x26, 0x39, 0x3e, 0x43, 0x49, 0x37, 0x2f, 0x9b, + 0x55, 0x3a, 0x54, 0x43, 0x3e, 0x30, 0x32, 0x3d, + 0x49, 0x3f, 0x48, 0x48, 0x48, 0x48, 0x38, 0x21, + 0x36, 0x36, 0x22, 0x27, 0x36, 0x36, 0x36, 0x36, + 0x2e, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x25, 0x2c, 0x34, 0x36, 0x30, 0x21, + 0x23, 0x43, 0x48, 0x48, 0x48, 0x47, 0x3b, 0x32, + 0x21, 0x28, 0x2b, 0x9e, 0x49, 0x37, 0x2e, 0x52, + 0x4a, 0x37, 0x9e, 0x98, 0x51, 0x3a, 0x93, 0x54, + 0x55, 0x4f, 0x48, 0x48, 0x48, 0x48, 0x94, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2e, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x2a, 0x51, 0x25, 0x21, 0x2a, 0x36, + 0x2e, 0x9b, 0x48, 0x48, 0x52, 0x4b, 0x52, 0x9e, + 0x51, 0x30, 0x22, 0x28, 0x32, 0x32, 0x39, 0x47, + 0x37, 0x2a, 0x39, 0x3a, 0x50, 0x9f, 0x3a, 0x9f, + 0x4b, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x98, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x22, 0x2f, 0x30, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x25, 0x2c, 0x34, 0x36, 0x24, 0x28, 0x36, + 0x54, 0x48, 0x48, 0x45, 0x30, 0x30, 0x9e, 0x52, + 0x45, 0x3a, 0x31, 0x25, 0x22, 0x25, 0x2a, 0x98, + 0x39, 0x2f, 0x42, 0x49, 0x4a, 0x3b, 0x50, 0x47, + 0x43, 0x9d, 0x3b, 0x4b, 0x48, 0x48, 0x9a, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x36, 0x36, 0x36, 0x36, + 0x21, 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x32, 0x2f, 0x28, 0x36, 0x27, 0x22, 0x21, + 0x43, 0x48, 0x48, 0x50, 0x30, 0x23, 0x25, 0x2f, + 0x3f, 0x52, 0x49, 0x51, 0x39, 0x25, 0x24, 0x2b, + 0x9e, 0x42, 0x3e, 0x55, 0x9e, 0x4f, 0x4f, 0x54, + 0x4a, 0x9e, 0x49, 0x50, 0x48, 0x48, 0x4b, 0x21, + 0x36, 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x25, 0x2c, 0x39, 0x36, 0x36, 0x30, 0x22, 0x25, + 0x52, 0x48, 0x48, 0x45, 0x3a, 0x51, 0x26, 0x23, + 0x30, 0x9d, 0x45, 0x40, 0x3a, 0x39, 0x2b, 0x2b, + 0x3b, 0x3a, 0x55, 0x4b, 0x47, 0x9e, 0x3a, 0x49, + 0x9e, 0x9f, 0x3b, 0x9a, 0x48, 0x48, 0x4f, 0x21, + 0x36, 0x36, 0x22, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x30, 0x2d, 0x21, 0x36, 0x36, 0x32, 0x23, 0x2a, + 0x47, 0x48, 0x48, 0x43, 0x3e, 0x3a, 0x9d, 0x2b, + 0x23, 0x25, 0x39, 0x4d, 0x2b, 0x31, 0x2d, 0x9d, + 0x34, 0x2e, 0x2f, 0x9e, 0x3a, 0x55, 0x3f, 0x9f, + 0x9f, 0x3e, 0x55, 0x43, 0x48, 0x48, 0x4c, 0x22, + 0x36, 0x36, 0x24, 0x23, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0x2e, 0x36, 0x36, 0x23, 0x31, 0x27, 0x39, + 0x9b, 0x48, 0x48, 0x4f, 0x3e, 0x4d, 0x55, 0x9e, + 0x51, 0x24, 0x23, 0x26, 0x32, 0x2c, 0x3b, 0x4b, + 0x55, 0x32, 0x2b, 0x37, 0x98, 0x9e, 0x3e, 0x9e, + 0x55, 0x37, 0x3e, 0x4b, 0x48, 0x48, 0x4c, 0x23, + 0x36, 0x36, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x2b, 0x39, 0x36, 0x36, 0x36, 0x26, 0x32, 0x31, + 0x9b, 0x48, 0x48, 0x4f, 0x55, 0x3a, 0x53, 0x53, + 0x2e, 0x9d, 0x34, 0x28, 0x28, 0x37, 0x98, 0x45, + 0x3e, 0x2b, 0x49, 0x9e, 0x3b, 0x3e, 0x2d, 0x6b, + 0x4a, 0x3a, 0x3b, 0x4f, 0x48, 0x48, 0x46, 0x22, + 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x39, 0x36, 0x36, 0x36, 0x36, 0x26, 0x2d, + 0x9b, 0x48, 0x48, 0x47, 0x3b, 0x3a, 0x2f, 0x37, + 0x49, 0x38, 0x38, 0x3a, 0x2b, 0x31, 0x51, 0x32, + 0x2b, 0x26, 0x37, 0x9f, 0x55, 0x32, 0x26, 0x2b, + 0x2d, 0x9d, 0x3b, 0x52, 0x48, 0x48, 0x9a, 0x36, + 0x24, 0x27, 0xa0, 0x24, 0x25, 0x28, 0x21, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x25, + 0x39, 0x4d, 0xa1, 0x84, 0x81, 0x57, 0x21, 0x39, + 0x52, 0x48, 0x48, 0x47, 0x9f, 0x4a, 0x4d, 0x55, + 0x37, 0x9f, 0x45, 0x9e, 0x3e, 0x54, 0x4d, 0x2d, + 0x51, 0x3b, 0x3d, 0x40, 0x50, 0x2f, 0x32, 0x23, + 0x2a, 0x3a, 0x54, 0x47, 0x48, 0x48, 0x53, 0x28, + 0x23, 0x36, 0x36, 0x36, 0x21, 0x28, 0x2c, 0x30, + 0x21, 0x38, 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x28, 0x30, + 0x2d, 0xa2, 0x7a, 0xa3, 0xa4, 0xa4, 0x7f, 0x22, + 0x51, 0x52, 0x48, 0x9b, 0x3b, 0x3a, 0x2f, 0x54, + 0x3f, 0x4b, 0x3b, 0x34, 0x3e, 0x55, 0x34, 0x4d, + 0x34, 0x3b, 0x3b, 0x55, 0x42, 0x4b, 0x9e, 0x31, + 0x2b, 0x3a, 0x9e, 0x47, 0xa5, 0xa5, 0xa6, 0x61, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x30, 0x32, + 0x25, 0x4d, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x24, 0x26, 0x30, 0x33, 0x31, + 0x4d, 0x91, 0x5b, 0xa3, 0xa4, 0xa4, 0xa4, 0x5a, + 0x21, 0x2e, 0x46, 0x48, 0x9a, 0x3b, 0x42, 0x47, + 0x42, 0x9d, 0x37, 0x39, 0x4a, 0x3e, 0x3a, 0x52, + 0x38, 0x3e, 0x3e, 0x2b, 0x25, 0x37, 0x4f, 0x4f, + 0x55, 0x55, 0x45, 0xa7, 0xa8, 0x69, 0x66, 0xa9, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x26, 0x25, + 0x83, 0xaa, 0x2c, 0x25, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x30, 0x35, 0x2d, 0x2f, 0x37, 0x4a, + 0x60, 0x85, 0xab, 0xac, 0xa4, 0xa4, 0xa4, 0x82, + 0x86, 0x36, 0x32, 0x3f, 0x48, 0x47, 0x4b, 0x4a, + 0x9d, 0x55, 0x2f, 0x51, 0x3a, 0x3b, 0x55, 0x9b, + 0x4d, 0x3b, 0x55, 0x39, 0x24, 0x28, 0x32, 0x9e, + 0x47, 0x47, 0x48, 0xad, 0xa3, 0xa8, 0xae, 0xaf, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x57, + 0x77, 0x66, 0x34, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x23, 0x30, 0x31, 0xb0, 0x91, 0x7e, 0x90, 0x90, + 0x8b, 0x5b, 0xa3, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0x5d, 0xb1, 0x36, 0x24, 0x53, 0x47, 0x37, 0x30, + 0x32, 0x2e, 0x98, 0x3f, 0x3a, 0x3e, 0x4a, 0x47, + 0x9d, 0x3e, 0x54, 0x40, 0x55, 0x30, 0x30, 0x4a, + 0x6b, 0x9b, 0x99, 0xad, 0x64, 0x5c, 0x8b, 0xb1, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x73, 0x5d, + 0x82, 0x5c, 0xb2, 0x2a, 0x23, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x24, 0x2b, 0xb0, 0x8b, 0x5b, 0x76, 0x5b, 0x5b, + 0x7b, 0xa3, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa8, 0x5e, 0x22, 0x36, 0x21, 0x3a, 0x3d, 0x30, + 0x22, 0x28, 0x3a, 0x44, 0x4a, 0x3e, 0x3e, 0x9b, + 0x9d, 0x3e, 0x9e, 0x4b, 0x55, 0x2e, 0x42, 0x9f, + 0x93, 0x4f, 0x3f, 0xb3, 0x7b, 0x7b, 0x85, 0x80, + 0xa0, 0x36, 0x36, 0x36, 0x21, 0xb4, 0x7e, 0x7b, + 0x64, 0x64, 0xb5, 0x35, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x31, 0xb6, 0x5b, 0x64, 0xa3, 0xa3, 0xac, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0x66, 0xb7, 0x36, 0x36, 0x36, 0x2c, 0x54, + 0x31, 0x23, 0x26, 0x2c, 0x3a, 0x3b, 0x55, 0x47, + 0x37, 0x3b, 0x3b, 0x38, 0x4a, 0x98, 0x55, 0x98, + 0x47, 0x9a, 0x3f, 0xb8, 0x76, 0x76, 0x7a, 0x63, + 0xb9, 0xba, 0x86, 0xba, 0xbb, 0x90, 0x5b, 0x64, + 0xa3, 0xa3, 0xbc, 0x2d, 0x27, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x26, 0x2d, 0x91, 0x5b, 0x64, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa8, 0x83, 0xaf, 0x36, 0x36, 0x36, 0x30, + 0x98, 0x37, 0x30, 0x26, 0x9d, 0x3e, 0x9f, 0x9b, + 0x37, 0x3b, 0x3b, 0x53, 0x53, 0x3d, 0x4b, 0x48, + 0x9b, 0x9a, 0x3f, 0xbd, 0x5b, 0x7b, 0xbe, 0x85, + 0x7e, 0x90, 0x63, 0x90, 0x85, 0x5b, 0xa3, 0xa4, + 0xa4, 0xac, 0x5d, 0xb5, 0x39, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xbf, 0xbe, 0x64, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa8, 0x88, 0x36, 0x36, 0x36, 0x36, + 0x2d, 0x3f, 0x3b, 0x31, 0x4d, 0x3e, 0x9f, 0x47, + 0x38, 0x3b, 0x3e, 0x3e, 0x98, 0x52, 0x48, 0x48, + 0x9b, 0x45, 0x3f, 0xc0, 0x6d, 0x7b, 0xab, 0xbe, + 0x7a, 0x8b, 0x8b, 0x7a, 0x5b, 0x64, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa3, 0xc1, 0x37, 0x35, 0x26, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2e, 0xbf, 0x7a, 0x7b, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa8, 0x72, 0x73, 0x36, 0x36, 0x36, + 0x24, 0x52, 0x47, 0x49, 0x3a, 0x55, 0x98, 0x47, + 0x9d, 0x3e, 0x54, 0x45, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x46, 0x42, 0xb6, 0x7a, 0x7b, 0x64, 0x7b, + 0x76, 0x5b, 0x5b, 0x76, 0x7b, 0xa3, 0xa4, 0xa4, + 0xa4, 0xa4, 0xac, 0x64, 0xc1, 0x4d, 0x2c, 0x27, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xc2, 0x8b, 0x7b, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa8, 0x89, 0xa0, 0x36, 0x36, + 0x32, 0x47, 0x48, 0x9b, 0x9a, 0x3f, 0x47, 0x48, + 0x4b, 0x40, 0x4f, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4b, 0x2f, 0x8f, 0x7a, 0x7b, 0xa3, 0xac, + 0xa3, 0x64, 0x64, 0xa3, 0xa3, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0x5d, 0xc3, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xc2, 0x85, 0x7b, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0x66, 0x57, 0x27, 0x4d, + 0x4b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x99, 0x34, 0xa0, 0xb9, 0x7a, 0x7b, 0xa3, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xc2, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xc2, 0x85, 0x7b, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa8, 0x5f, 0x92, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x44, + 0x35, 0x36, 0xaf, 0xbb, 0x7a, 0x7b, 0xac, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xac, 0xa3, 0xc0, + 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x30, 0x2f, 0xb6, 0x8b, 0x7b, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0x66, 0x89, 0x45, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x4e, 0x25, + 0x36, 0x36, 0x61, 0xb9, 0x6d, 0x64, 0xac, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xac, 0x7b, 0xbe, 0xc3, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xc4, 0x63, 0xbe, 0xa3, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0x72, 0x81, 0xc5, + 0x46, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x3f, 0x2c, 0x36, 0x36, + 0x36, 0x36, 0xc6, 0x8f, 0x6d, 0x64, 0xac, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa3, 0xab, 0x8b, 0xb0, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x96, 0x75, 0xab, 0xa3, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xac, 0x7b, 0x81, 0xb9, + 0x73, 0x3b, 0x44, 0x9b, 0x48, 0x48, 0x48, 0x9b, + 0x99, 0x43, 0x94, 0x2c, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x73, 0xb9, 0x7a, 0x7b, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0x64, 0x76, 0x7a, 0x91, 0xb5, 0x31, 0x30, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x39, 0x97, 0x75, 0xbe, 0x7b, 0x64, 0xa3, 0xa3, + 0xac, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0x7b, 0x7a, 0xc7, + 0xc8, 0x36, 0x21, 0x26, 0x2b, 0x39, 0x33, 0x30, + 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xc8, 0xbb, 0x8b, 0x7b, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0x64, 0x64, + 0x76, 0x85, 0xbf, 0xb5, 0x34, 0x2b, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xc9, 0x63, 0x7e, 0x7a, 0x6d, 0xbe, 0x5b, + 0x76, 0x7b, 0x64, 0x64, 0xa3, 0xac, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xac, 0x76, 0x85, 0xb9, + 0x79, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xca, 0xbb, 0x75, 0x76, 0xa3, 0xa4, + 0xa4, 0xa4, 0xac, 0xa3, 0x64, 0x76, 0xbe, 0x8b, + 0xb6, 0xb5, 0x2f, 0x35, 0x30, 0x24, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x31, 0xcb, 0xc9, 0xbb, 0x74, 0x63, 0x90, + 0x7e, 0x75, 0x8b, 0x6d, 0xbe, 0x76, 0x64, 0xa3, + 0xac, 0xac, 0xac, 0xac, 0x64, 0x7a, 0x84, 0xcc, + 0x79, 0xa0, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xc8, 0xcc, 0x63, 0x6d, 0x7b, 0x64, + 0xac, 0xa3, 0x64, 0x7b, 0xbe, 0x75, 0x63, 0x96, + 0x38, 0x39, 0x2a, 0x24, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x27, 0x35, 0x2d, 0x41, 0xb5, 0xc5, 0x8f, + 0xb9, 0xbb, 0xc7, 0x74, 0x84, 0x90, 0x85, 0x6d, + 0x5b, 0x7b, 0x7b, 0xab, 0x6d, 0x90, 0xb9, 0xcd, + 0xca, 0x22, 0x36, 0x36, 0x28, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x25, 0x36, + 0x36, 0x21, 0xb4, 0x80, 0xc7, 0x7e, 0x6d, 0x76, + 0xab, 0x76, 0x6d, 0x85, 0x63, 0xb9, 0xb5, 0x34, + 0x33, 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x24, 0x27, 0x2a, 0x35, 0x2e, 0x2f, + 0x41, 0xce, 0xcf, 0x6c, 0x80, 0xcc, 0xb9, 0x74, + 0x84, 0x90, 0x75, 0x7e, 0x74, 0x8f, 0xcd, 0x79, + 0xc6, 0x2b, 0x9d, 0x41, 0x2f, 0x34, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x34, 0x2f, 0x38, + 0x4d, 0x37, 0xd0, 0xd1, 0x8f, 0x74, 0x63, 0x7e, + 0x75, 0x7e, 0x63, 0xc7, 0x88, 0xc4, 0x31, 0x2a, + 0x24, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x22, 0x23, 0x24, 0x26, 0x30, + 0x33, 0x39, 0x2e, 0x51, 0x41, 0xb2, 0x6c, 0xd1, + 0x80, 0xcc, 0xcc, 0xcc, 0xd2, 0xd1, 0xb7, 0xd3, + 0x41, 0x34, 0x35, 0x32, 0x30, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x30, 0x2a, + 0x2b, 0x34, 0xd4, 0xca, 0xd5, 0x8f, 0xbb, 0xc7, + 0xc7, 0xbb, 0xcc, 0x6c, 0x41, 0x39, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, + 0x28, 0x24, 0x26, 0x2a, 0x33, 0x2c, 0x2f, 0x41, + 0xd6, 0xb7, 0x79, 0x79, 0x79, 0xca, 0xd7, 0x51, + 0x39, 0x30, 0x24, 0x23, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0x22, 0x23, + 0x24, 0x2a, 0x31, 0xd8, 0xc8, 0x79, 0xd1, 0x80, + 0xd5, 0xba, 0xd9, 0x2f, 0x35, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x28, 0x25, 0x30, 0x2b, + 0x31, 0x2f, 0xd4, 0xd8, 0xd8, 0x2f, 0x2e, 0x33, + 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x27, 0x35, 0x34, 0xd8, 0xd8, 0xd8, + 0xda, 0xd4, 0x2e, 0x33, 0x25, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x23, 0x28, + 0x26, 0x30, 0x32, 0x2b, 0x33, 0x2a, 0x26, 0x28, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x25, 0x30, 0x33, 0x35, 0x35, + 0x2b, 0x2a, 0x26, 0x28, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x21, 0x22, 0x23, 0x28, 0x28, 0x23, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x23, 0x28, 0x24, 0x24, + 0x28, 0x23, 0x22, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }; -#define INCLUDE_LINUX_LOGOBW -#define INCLUDE_LINUX_LOGO16 -#include - -#else +#endif /* INCLUDE_LINUX_LOGO_DATA */ -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; -extern unsigned char linux_logo16[]; +#include -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-mips64/termios.h linux/include/asm-mips64/termios.h --- v2.4.5/linux/include/asm-mips64/termios.h Sat Feb 3 20:00:45 2001 +++ linux/include/asm-mips64/termios.h Tue Jun 5 18:11:41 2001 @@ -101,6 +101,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 /* synchronous PPP */ +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-parisc/linux_logo.h linux/include/asm-parisc/linux_logo.h --- v2.4.5/linux/include/asm-parisc/linux_logo.h Tue Dec 5 12:29:39 2000 +++ linux/include/asm-parisc/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -23,26 +23,5 @@ #define linux_logo_banner "Linux/PA-RISC version " UTS_RELEASE -#define LINUX_LOGO_COLORS 214 - -#ifdef INCLUDE_LINUX_LOGO_DATA - -#define INCLUDE_LINUX_LOGOBW -#define INCLUDE_LINUX_LOGO16 - #include -#else - -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; -extern unsigned char linux_logo16[]; - -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-parisc/termios.h linux/include/asm-parisc/termios.h --- v2.4.5/linux/include/asm-parisc/termios.h Sat Feb 3 20:00:45 2001 +++ linux/include/asm-parisc/termios.h Tue Jun 5 18:11:41 2001 @@ -53,6 +53,7 @@ #define N_PROFIBUS_FDL 10 /* Reserved for Profibus */ #define N_IRDA 11 /* Linux IR - http://irda.sourceforge.net/ */ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-ppc/bitops.h linux/include/asm-ppc/bitops.h --- v2.4.5/linux/include/asm-ppc/bitops.h Fri May 25 18:28:55 2001 +++ linux/include/asm-ppc/bitops.h Thu Jun 7 00:16:57 2001 @@ -1,5 +1,5 @@ /* - * BK Id: SCCS/s.bitops.h 1.7 05/17/01 18:14:24 cort + * BK Id: SCCS/s.bitops.h 1.9 05/26/01 14:48:14 paulus */ /* * bitops.h: Bit string operations on the ppc @@ -24,12 +24,9 @@ #define SMP_MB #endif /* CONFIG_SMP */ -#define __INLINE_BITOPS 1 - -#if __INLINE_BITOPS /* * These used to be if'd out here because using : "cc" as a constraint - * resulted in errors from egcs. Things may be OK with gcc-2.95. + * resulted in errors from egcs. Things appear to be OK with gcc-2.95. */ static __inline__ void set_bit(int nr, volatile void * addr) { @@ -80,6 +77,17 @@ : "cc"); } +/* + * non-atomic version + */ +static __inline__ void __clear_bit(int nr, volatile void *addr) +{ + unsigned long mask = 1 << (nr & 0x1f); + unsigned long *p = ((unsigned long *)addr) + (nr >> 5); + + *p &= ~mask; +} + static __inline__ void change_bit(int nr, volatile void *addr) { unsigned long old; @@ -97,6 +105,17 @@ } /* + * non-atomic version + */ +static __inline__ void __change_bit(int nr, volatile void *addr) +{ + unsigned long mask = 1 << (nr & 0x1f); + unsigned long *p = ((unsigned long *)addr) + (nr >> 5); + + *p ^= mask; +} + +/* * test_and_*_bit do imply a memory barrier (?) */ static __inline__ int test_and_set_bit(int nr, volatile void *addr) @@ -181,16 +200,19 @@ return (old & mask) != 0; } -#else /* __INLINE_BITOPS */ -extern void set_bit(int nr, volatile void *addr); -extern void clear_bit(int nr, volatile void *addr); -extern void change_bit(int nr, volatile void *addr); -extern int test_and_set_bit(int nr, volatile void *addr); -extern int test_and_clear_bit(int nr, volatile void *addr); -extern int test_and_change_bit(int nr, volatile void *addr); +/* + * non-atomic version + */ +static __inline__ int __test_and_change_bit(int nr, volatile void *addr) +{ + unsigned long mask = 1 << (nr & 0x1f); + unsigned long *p = ((unsigned long *)addr) + (nr >> 5); + unsigned long old = *p; -#endif /* __INLINE_BITOPS */ + *p = old ^ mask; + return (old & mask) != 0; +} static __inline__ int test_bit(int nr, __const__ volatile void *addr) { @@ -283,8 +305,6 @@ return result + ffz(tmp); } - -#define _EXT2_HAVE_ASM_BITOPS_ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-ppc/linux_logo.h linux/include/asm-ppc/linux_logo.h --- v2.4.5/linux/include/asm-ppc/linux_logo.h Fri May 25 18:28:55 2001 +++ linux/include/asm-ppc/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -21,23 +21,7 @@ #define LINUX_LOGO_HEIGHT 80 #define LINUX_LOGO_WIDTH 80 -#define LINUX_LOGO_COLORS 214 -#ifdef INCLUDE_LINUX_LOGO_DATA - -#define INCLUDE_LINUX_LOGOBW -#define INCLUDE_LINUX_LOGO16 #include -#else - -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16[]; - -#endif #endif /* __KERNEL__ */ diff -u --recursive --new-file v2.4.5/linux/include/asm-ppc/softirq.h linux/include/asm-ppc/softirq.h --- v2.4.5/linux/include/asm-ppc/softirq.h Fri May 25 18:28:55 2001 +++ linux/include/asm-ppc/softirq.h Thu Jun 7 00:16:57 2001 @@ -1,5 +1,5 @@ /* - * BK Id: SCCS/s.softirq.h 1.5 05/17/01 18:14:25 cort + * BK Id: SCCS/s.softirq.h 1.8 06/06/01 22:33:09 paulus */ #ifdef __KERNEL__ #ifndef __ASM_SOFTIRQ_H @@ -8,8 +8,26 @@ #include #include -#define local_bh_disable() do { local_bh_count(smp_processor_id())++; barrier(); } while (0) -#define local_bh_enable() do { barrier(); local_bh_count(smp_processor_id())--; } while (0) +#define local_bh_disable() \ +do { \ + local_bh_count(smp_processor_id())++; \ + barrier(); \ +} while (0) + +#define __local_bh_enable() \ +do { \ + barrier(); \ + local_bh_count(smp_processor_id())--; \ +} while (0) + +#define local_bh_enable() \ +do { \ + if (!--local_bh_count(smp_processor_id()) \ + && softirq_pending(smp_processor_id())) { \ + do_softirq(); \ + __sti(); \ + } \ +} while (0) #define in_softirq() (local_bh_count(smp_processor_id()) != 0) diff -u --recursive --new-file v2.4.5/linux/include/asm-ppc/termios.h linux/include/asm-ppc/termios.h --- v2.4.5/linux/include/asm-ppc/termios.h Fri May 25 18:28:55 2001 +++ linux/include/asm-ppc/termios.h Tue Jun 5 18:11:41 2001 @@ -193,6 +193,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-s390/termios.h linux/include/asm-s390/termios.h --- v2.4.5/linux/include/asm-s390/termios.h Tue Feb 13 14:13:44 2001 +++ linux/include/asm-s390/termios.h Tue Jun 5 18:11:41 2001 @@ -63,6 +63,7 @@ #define N_IRDA 11 /* Linux IR - http://irda.sourceforge.net/ */ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-s390x/termios.h linux/include/asm-s390x/termios.h --- v2.4.5/linux/include/asm-s390x/termios.h Wed Apr 11 19:02:29 2001 +++ linux/include/asm-s390x/termios.h Tue Jun 5 18:11:41 2001 @@ -63,6 +63,7 @@ #define N_IRDA 11 /* Linux IR - http://irda.sourceforge.net/ */ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ +#define N_BT 15 /* bluetooth */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-sh/linux_logo.h linux/include/asm-sh/linux_logo.h --- v2.4.5/linux/include/asm-sh/linux_logo.h Mon Jun 19 17:59:38 2000 +++ linux/include/asm-sh/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -23,26 +23,5 @@ #define linux_logo_banner "Linux/SuperH version " UTS_RELEASE -#define LINUX_LOGO_COLORS 214 - -#ifdef INCLUDE_LINUX_LOGO_DATA - -#define INCLUDE_LINUX_LOGOBW -#define INCLUDE_LINUX_LOGO16 - #include -#else - -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; -extern unsigned char linux_logo16[]; - -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-sh/termios.h linux/include/asm-sh/termios.h --- v2.4.5/linux/include/asm-sh/termios.h Sat Feb 3 20:00:45 2001 +++ linux/include/asm-sh/termios.h Tue Jun 5 18:11:41 2001 @@ -55,6 +55,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-sparc/audioio.h linux/include/asm-sparc/audioio.h --- v2.4.5/linux/include/asm-sparc/audioio.h Tue Oct 10 10:33:52 2000 +++ linux/include/asm-sparc/audioio.h Tue Jun 5 18:11:44 2001 @@ -428,9 +428,6 @@ extern int unregister_sparcaudio_driver(struct sparcaudio_driver *, int); extern void sparcaudio_output_done(struct sparcaudio_driver *, int); extern void sparcaudio_input_done(struct sparcaudio_driver *, int); -extern int amd7930_init(void); -extern int cs4231_init(void); -extern int dbri_init(void); #endif diff -u --recursive --new-file v2.4.5/linux/include/asm-sparc/linux_logo.h linux/include/asm-sparc/linux_logo.h --- v2.4.5/linux/include/asm-sparc/linux_logo.h Wed Sep 30 14:16:33 1998 +++ linux/include/asm-sparc/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -23,1025 +23,912 @@ #define linux_logo_banner "Linux/SPARC version " UTS_RELEASE -#define LINUX_LOGO_COLORS 219 +#define __HAVE_ARCH_LINUX_LOGO +#define __HAVE_ARCH_LINUX_LOGO16 + +#define LINUX_LOGO_COLORS 221 #ifdef INCLUDE_LINUX_LOGO_DATA unsigned char linux_logo_red[] __initdata = { - 0x03, 0x9E, 0xEC, 0xEE, 0xC4, 0xDA, 0x50, 0xC9, - 0xC5, 0xED, 0x65, 0xE3, 0xE3, 0xF4, 0x24, 0xA4, - 0xEC, 0xEE, 0x94, 0xE5, 0xE3, 0x6A, 0xA6, 0xC4, - 0xDC, 0xE5, 0x13, 0xF3, 0xD1, 0xFD, 0xE2, 0xDB, - 0xA0, 0xC2, 0xEC, 0xB8, 0xC2, 0xD5, 0xF2, 0xF4, - 0xC5, 0x3E, 0xF1, 0x1B, 0x55, 0xF5, 0xCF, 0xF7, - 0xA9, 0xB4, 0xEB, 0x6C, 0x0A, 0x74, 0xB4, 0xF7, - 0xF0, 0xF5, 0xD4, 0xF2, 0xCE, 0xF5, 0xC7, 0x26, - 0x5B, 0xF4, 0xBC, 0x7F, 0xAB, 0x82, 0x94, 0xE5, - 0xFC, 0x3A, 0xF2, 0xFD, 0xF0, 0x1C, 0xEF, 0xD4, - 0xF3, 0x0F, 0xED, 0xF7, 0xC9, 0x49, 0xC3, 0xBA, - 0xC8, 0xD4, 0xE7, 0xF3, 0xF5, 0xA7, 0xEC, 0xF9, - 0xFA, 0x0A, 0xF5, 0xCF, 0xFC, 0xEA, 0xE1, 0xA6, - 0xD6, 0xBC, 0xF8, 0xF7, 0xB4, 0xEB, 0xDC, 0x84, - 0xCE, 0xBA, 0x45, 0xD6, 0x86, 0x50, 0x96, 0xC6, - 0x8C, 0x6E, 0xE8, 0x60, 0x3C, 0x70, 0xF0, 0x93, - 0x7C, 0xDA, 0xDA, 0x9C, 0xBA, 0x6D, 0x4D, 0x2B, - 0x2F, 0x8B, 0xE0, 0xCC, 0xDA, 0x5C, 0x3D, 0xEE, - 0xDB, 0x46, 0xAC, 0x96, 0xCE, 0xD1, 0xE3, 0xF1, - 0x96, 0x7A, 0x80, 0xB2, 0xBA, 0xB6, 0xD2, 0x1E, - 0x7E, 0xAA, 0xC4, 0xF0, 0x96, 0x65, 0x9E, 0xC2, - 0xAA, 0xF5, 0xF2, 0xE9, 0xE6, 0xD1, 0x35, 0xC7, - 0xF6, 0xB6, 0xE8, 0x82, 0xBE, 0xC2, 0xF2, 0x9E, - 0xC7, 0xB4, 0x0F, 0xF7, 0xE8, 0xD8, 0xCC, 0x9C, - 0xD8, 0xD8, 0xA0, 0xEA, 0xC6, 0xA8, 0xE0, 0xEC, - 0xD1, 0xF7, 0xF4, 0xFC, 0x75, 0xBD, 0xDC, 0xDD, - 0xCC, 0xE1, 0xFA, 0xEE, 0xAA, 0xEC, 0xF2, 0xB8, - 0xE2, 0xCD, 0x87 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x65, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x76, 0x79, + 0x62, 0x36, 0x9a, 0xe2, 0xec, 0xe1, 0xb8, 0xd7, + 0xaf, 0x25, 0xbc, 0xc0, 0xef, 0xea, 0xe8, 0xe8, + 0xf5, 0xf1, 0xda, 0xd3, 0x79, 0xdb, 0xf4, 0xf6, + 0xf6, 0xf6, 0xe2, 0x3d, 0xb4, 0xce, 0xe6, 0xee, + 0xf6, 0x68, 0xd8, 0xec, 0xf5, 0xc6, 0xc8, 0x9c, + 0x89, 0xd2, 0xee, 0xcb, 0xb9, 0xd2, 0x66, 0x5e, + 0x8b, 0xbe, 0xa8, 0xd5, 0xca, 0xb6, 0xae, 0x9c, + 0xc5, 0xbe, 0xbe, 0xca, 0x90, 0xb2, 0x9a, 0xa8, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0xfe, + 0xf6, 0xec, 0xfe, 0xd2, 0xea, 0xf5, 0xf2, 0xf2, + 0xe9, 0xee, 0xf6, 0xf2, 0xee, 0xf6, 0xda, 0xd4, + 0xfa, 0xca, 0xf2, 0xf6, 0xfe, 0xf2, 0xda, 0xe4, + 0xf6, 0xdd, 0xf2, 0xee, 0xfa, 0xf0, 0x12, 0x4a, + 0xd6, 0xf2, 0x8e, 0xf2, 0xf6, 0xf6, 0xb5, 0xf1, + 0x26, 0x9a, 0xea, 0xf6, 0xe0, 0xd2, 0x16, 0x9a, + 0x2e, 0xd2, 0x70, 0xd6, 0x46, 0x7c, 0xb4, 0x62, + 0xda, 0xee, 0xd6, 0xa3, 0x74, 0xa7, 0xa2, 0xe0, + 0xae, 0xbe, 0xce, 0xe2, 0xa3, 0x8e, 0x6d, 0x8e, + 0x32, 0xaf, 0x50, 0x9e, 0x5b, 0x8a, 0x98, 0x82, + 0x7a, 0x82, 0x56, 0x7c, 0x8a, 0x56, 0x5e, 0x86, + 0x6a, 0x52, 0x59, 0x64, 0x5e, }; unsigned char linux_logo_green[] __initdata = { - 0x03, 0x88, 0xC4, 0xE2, 0x85, 0xC2, 0x44, 0xA3, - 0xA9, 0xD3, 0x65, 0xA6, 0xC5, 0xF3, 0x24, 0xA4, - 0xB4, 0xD6, 0x63, 0xD5, 0xB7, 0x44, 0x86, 0x94, - 0xC2, 0xE4, 0x14, 0xB6, 0xD2, 0xFB, 0xD4, 0xB2, - 0x73, 0x96, 0xDB, 0x92, 0xC2, 0x95, 0xC2, 0xDA, - 0xA4, 0x36, 0xD4, 0x0E, 0x55, 0xF4, 0xC4, 0xE9, - 0x75, 0xB4, 0xBC, 0x52, 0x0A, 0x74, 0x84, 0xEB, - 0xDC, 0xDA, 0xA2, 0xD6, 0x9B, 0xBD, 0xB7, 0x12, - 0x44, 0xCA, 0x8C, 0x65, 0x7B, 0x54, 0x94, 0xAB, - 0xF4, 0x25, 0xC4, 0xFD, 0xE4, 0x1C, 0xDD, 0xAB, - 0xBD, 0x06, 0xCB, 0xD6, 0xCA, 0x33, 0x8C, 0xA2, - 0x92, 0x9C, 0xBC, 0xDB, 0xCD, 0x6E, 0xEC, 0xEE, - 0xBC, 0x03, 0xDA, 0xCE, 0xF4, 0xB6, 0xDB, 0x92, - 0xAD, 0xBC, 0xDE, 0xD5, 0x7B, 0xAE, 0x9D, 0x84, - 0xB6, 0x96, 0x44, 0xBA, 0x6E, 0x3C, 0x7A, 0xB2, - 0x8C, 0x4C, 0xCE, 0x4C, 0x3C, 0x5A, 0xCA, 0x6D, - 0x7C, 0xCE, 0xDA, 0x9C, 0xAA, 0x6D, 0x4D, 0x2B, - 0x1B, 0x5E, 0xCB, 0xAC, 0xBE, 0x5C, 0x2E, 0xDC, - 0xBD, 0x3E, 0xAC, 0x82, 0xB6, 0xBE, 0xD3, 0xBD, - 0x72, 0x62, 0x6C, 0x82, 0x92, 0x9E, 0xB0, 0x13, - 0x4A, 0x8E, 0xBE, 0xCE, 0x86, 0x45, 0x6B, 0xAA, - 0x9A, 0xC5, 0xC6, 0xDA, 0xC5, 0xC4, 0x34, 0x9B, - 0xCC, 0xAC, 0xC4, 0x76, 0x9A, 0x9E, 0xEE, 0x62, - 0xC6, 0x76, 0x0D, 0xE4, 0xDA, 0xD5, 0xA5, 0x92, - 0xCD, 0xB2, 0x7C, 0xCC, 0xBE, 0x7E, 0xDC, 0xD6, - 0xB9, 0xE3, 0xD4, 0xF6, 0x55, 0x82, 0xA4, 0xAA, - 0x8D, 0xBB, 0xCE, 0xD5, 0x8A, 0xDB, 0xD4, 0x8B, - 0xCA, 0x93, 0x63 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x62, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x62, 0x5c, + 0x4e, 0x26, 0x72, 0xaa, 0xba, 0xaf, 0x90, 0xae, + 0x92, 0x1a, 0xa4, 0x85, 0xb6, 0xbe, 0xc3, 0xc8, + 0xcf, 0xd0, 0xc2, 0xce, 0x57, 0xa2, 0xd6, 0xda, + 0xda, 0xd7, 0xb8, 0x2a, 0x7b, 0x91, 0xae, 0xca, + 0xda, 0x45, 0x9e, 0xb2, 0xd7, 0x9b, 0x90, 0x76, + 0x5c, 0xa2, 0xbe, 0xa6, 0x85, 0x96, 0x4e, 0x46, + 0x66, 0x92, 0x7a, 0x9a, 0x96, 0x9d, 0x9a, 0x6b, + 0x8a, 0x8e, 0xb2, 0xca, 0x90, 0xa6, 0x79, 0x7c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0xfa, + 0xea, 0xd7, 0xf6, 0xbc, 0xda, 0xde, 0xda, 0xe6, + 0xca, 0xd8, 0xea, 0xe0, 0xcc, 0xf2, 0xce, 0xb2, + 0xee, 0xa2, 0xd6, 0xe6, 0xf6, 0xd7, 0xc5, 0xb8, + 0xc6, 0xb9, 0xce, 0xde, 0xce, 0xc6, 0x0e, 0x36, + 0xae, 0xbe, 0x86, 0xba, 0xbe, 0xe6, 0x8e, 0xc4, + 0x1e, 0x8e, 0xae, 0xba, 0xb2, 0xa6, 0x12, 0x7a, + 0x20, 0xc6, 0x64, 0xaa, 0x2f, 0x70, 0x85, 0x46, + 0xce, 0xd6, 0xa6, 0x6e, 0x51, 0x72, 0x92, 0xa6, + 0x87, 0x96, 0xa2, 0xd6, 0x85, 0x7a, 0x6a, 0x6e, + 0x22, 0x76, 0x36, 0x76, 0x3c, 0x6e, 0x63, 0x53, + 0x66, 0x62, 0x42, 0x50, 0x56, 0x42, 0x56, 0x56, + 0x56, 0x3e, 0x51, 0x52, 0x56, }; unsigned char linux_logo_blue[] __initdata = { - 0x04, 0x28, 0x10, 0x8C, 0x0B, 0x84, 0x14, 0x1A, - 0x77, 0x1F, 0x64, 0x0E, 0x85, 0xD2, 0x24, 0xA4, - 0x0F, 0x54, 0x0C, 0x7C, 0x3F, 0x04, 0x20, 0x0D, - 0x54, 0xDF, 0x14, 0x0D, 0xD1, 0xE9, 0xB0, 0x11, - 0x0A, 0x40, 0x57, 0x14, 0xC3, 0x0C, 0x04, 0x12, - 0x50, 0x0C, 0x7D, 0x05, 0x55, 0xF2, 0xBA, 0xC7, - 0x09, 0xB4, 0x0E, 0x24, 0x0B, 0x74, 0x0C, 0xB6, - 0x80, 0x48, 0x10, 0x34, 0x0F, 0x0C, 0xA0, 0x04, - 0x19, 0x10, 0x0E, 0x14, 0x0E, 0x05, 0x94, 0x0E, - 0xCA, 0x0B, 0x46, 0xFB, 0xB4, 0x1C, 0x9B, 0x1A, - 0x21, 0x09, 0x14, 0x4D, 0xCB, 0x08, 0x11, 0x7C, - 0x20, 0x10, 0x24, 0x66, 0x79, 0x07, 0xEA, 0xC9, - 0x0C, 0x08, 0x38, 0xC4, 0xD8, 0x24, 0xBE, 0x6C, - 0x51, 0xBB, 0x8C, 0x36, 0x0A, 0x0F, 0x0C, 0x84, - 0x3C, 0x54, 0x44, 0x7C, 0x28, 0x0E, 0x28, 0x7F, - 0x8C, 0x0F, 0x54, 0x24, 0x3C, 0x18, 0x54, 0x17, - 0x7C, 0x9C, 0xDA, 0x9C, 0x7C, 0x6C, 0x4D, 0x2C, - 0x09, 0x0E, 0x8A, 0x50, 0x4C, 0x5B, 0x14, 0xAC, - 0x19, 0x3C, 0xAC, 0x5C, 0x64, 0x97, 0x94, 0x37, - 0x29, 0x3C, 0x44, 0x3C, 0x2C, 0x7C, 0x70, 0x07, - 0x04, 0x29, 0xB2, 0x64, 0x74, 0x07, 0x07, 0x2C, - 0x74, 0x2E, 0x6C, 0xA4, 0x29, 0x9E, 0x34, 0x27, - 0x2F, 0x98, 0x48, 0x5C, 0x0C, 0x5C, 0xE8, 0x04, - 0xC2, 0x0C, 0x0A, 0xB2, 0x74, 0xCB, 0x46, 0x78, - 0xB4, 0x5C, 0x18, 0x80, 0x8C, 0x24, 0xD9, 0xAC, - 0x87, 0x99, 0x1D, 0xE8, 0x14, 0x0D, 0x10, 0x17, - 0x0A, 0x67, 0x3C, 0x68, 0x3C, 0x69, 0x90, 0x22, - 0x6C, 0x0D, 0x17 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x01, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x06, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x59, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x2e, 0x08, + 0x0a, 0x06, 0x0a, 0x0b, 0x0b, 0x0f, 0x0c, 0x0f, + 0x3d, 0x09, 0x73, 0x09, 0x0d, 0x0a, 0x10, 0x1e, + 0x2d, 0x13, 0x86, 0xba, 0x19, 0x0a, 0x36, 0x3c, + 0x26, 0x14, 0x0d, 0x06, 0x07, 0x0a, 0x0b, 0x0f, + 0x4a, 0x06, 0x0a, 0x0c, 0x2b, 0x0a, 0x0b, 0x0a, + 0x06, 0x0a, 0x0a, 0x11, 0x0b, 0x0a, 0x0a, 0x1e, + 0x0f, 0x0d, 0x0a, 0x0b, 0x22, 0x6a, 0x72, 0x0b, + 0x0b, 0x22, 0x90, 0xca, 0x90, 0x92, 0x3c, 0x2c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0xea, + 0xb6, 0x7c, 0xda, 0x8e, 0xa6, 0x87, 0x66, 0xb6, + 0x81, 0x6a, 0xc6, 0x9a, 0x5b, 0xd2, 0xb6, 0x6a, + 0xca, 0x45, 0x92, 0xb2, 0xca, 0x52, 0x8a, 0x3e, + 0x2e, 0x66, 0x66, 0xae, 0x3e, 0x47, 0x06, 0x0e, + 0x52, 0x36, 0x6a, 0x0e, 0x0e, 0xbe, 0x2c, 0x0e, + 0x0a, 0x5a, 0x0d, 0x0e, 0x3e, 0x0a, 0x06, 0x2e, + 0x06, 0x9e, 0x4e, 0x36, 0x06, 0x58, 0x24, 0x06, + 0x9e, 0xae, 0x3a, 0x08, 0x08, 0x07, 0x5e, 0x0a, + 0x32, 0x2e, 0x2a, 0xb2, 0x43, 0x48, 0x5f, 0x2e, + 0x06, 0x06, 0x07, 0x24, 0x06, 0x32, 0x06, 0x06, + 0x46, 0x2e, 0x22, 0x06, 0x06, 0x1e, 0x4c, 0x06, + 0x3a, 0x22, 0x42, 0x34, 0x42, }; unsigned char linux_logo[] __initdata = { - 0xD8, 0xA3, 0x98, 0x98, 0xA3, 0xB2, 0x2F, 0x2F, - 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, 0x2F, 0xA3, - 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, 0x51, 0x2F, - 0x98, 0x55, 0x8F, 0x2F, 0x89, 0x44, 0x89, 0x51, - 0xB2, 0x2F, 0x66, 0xA3, 0x2F, 0x2F, 0x66, 0x66, - 0xA3, 0xB2, 0xB2, 0xB2, 0x89, 0xD8, 0x44, 0x44, - 0xD8, 0x83, 0xD8, 0xA3, 0x98, 0x98, 0xA3, 0xB2, - 0x2F, 0x2F, 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, - 0x2F, 0xA3, 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, - 0x51, 0x2F, 0x98, 0x55, 0x8F, 0x2F, 0x89, 0x44, - 0xA3, 0x55, 0x55, 0x98, 0x2F, 0x2F, 0x2F, 0xA3, - 0x66, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x98, - 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, 0xB2, 0x2F, - 0x66, 0x66, 0xA3, 0x51, 0x89, 0x51, 0xB2, 0x2F, - 0x2F, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, - 0xB2, 0xB2, 0x2F, 0x2F, 0xB2, 0x51, 0x51, 0x51, - 0x51, 0x51, 0xA3, 0x55, 0x55, 0x98, 0x2F, 0x2F, - 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x98, 0x66, 0x66, - 0x66, 0x98, 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, - 0xB2, 0x2F, 0x66, 0x66, 0xA3, 0x51, 0x89, 0x51, - 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, 0x2F, 0xA3, - 0x66, 0x66, 0x98, 0x8F, 0x66, 0x66, 0x66, 0x98, - 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, 0xB2, 0x2F, - 0xA3, 0xA3, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, - 0xA3, 0x66, 0x98, 0xA3, 0x51, 0xB2, 0x2F, 0xA3, - 0xB2, 0x51, 0x51, 0xB2, 0xB2, 0x51, 0xB2, 0xB2, - 0xB2, 0x2F, 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, - 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x8F, 0x66, 0x66, - 0x66, 0x98, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, - 0xB2, 0x2F, 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0xA0, 0xA5, 0x55, 0x66, 0xB2, 0x51, 0xB2, 0xA3, - 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x98, 0x98, - 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, 0xB2, 0xA3, - 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, - 0x66, 0x98, 0xB2, 0x4C, 0x54, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xCE, 0x2F, 0xB2, 0x2F, 0x2F, - 0xA3, 0x98, 0xA0, 0xA5, 0x55, 0x66, 0xB2, 0x51, - 0xB2, 0xA3, 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, - 0x98, 0x98, 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, - 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0xA0, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0xB2, 0x2F, - 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, - 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0xA3, - 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0x2F, 0xA0, 0xDA, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x9C, 0xB2, 0xA3, - 0x66, 0x98, 0xA0, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, - 0xB2, 0x2F, 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, - 0x66, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, - 0x2F, 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0xA3, - 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, - 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x2F, 0x2F, - 0xB2, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, 0xA3, 0x66, - 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xB2, - 0x9C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xDA, 0x3A, 0x20, 0x54, 0x55, - 0xA3, 0x98, 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, - 0xB2, 0xA3, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, - 0x2F, 0x2F, 0xB2, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, - 0xA3, 0x66, 0x66, 0x66, 0x2F, 0xA3, 0x2F, 0x2F, - 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x66, - 0x8F, 0x8F, 0x8F, 0x66, 0xA3, 0xA3, 0xB2, 0xB2, - 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, - 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xAD, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xA7, 0x4C, 0xCE, 0xDA, 0x20, - 0xA6, 0x2F, 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, - 0x2F, 0x66, 0x8F, 0x8F, 0x8F, 0x66, 0xA3, 0xA3, - 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0xB2, 0x2F, 0x98, - 0x8F, 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, - 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x51, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xCE, 0x55, 0xAD, 0xA7, 0x54, - 0x20, 0x8F, 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0xB2, - 0x2F, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0xA3, 0xB2, - 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, - 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0x8F, 0x66, 0x2F, 0xB2, 0x51, 0x2F, 0x98, - 0xA0, 0x8F, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0x66, - 0x98, 0x98, 0x98, 0x66, 0x98, 0x66, 0x55, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xCE, 0x4C, 0x9C, 0x2E, 0xDA, - 0x20, 0xDA, 0x51, 0x8F, 0x66, 0x2F, 0xB2, 0x51, - 0x2F, 0x98, 0xA0, 0x8F, 0x66, 0xA3, 0x2F, 0x51, - 0x51, 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, - 0x66, 0x66, 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, - 0x51, 0x66, 0x2F, 0xB2, 0x51, 0xB2, 0xA3, 0xA0, - 0xA0, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0xA3, - 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x66, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x66, 0x66, 0xB2, 0x6D, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6D, 0x3A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0xA5, 0x66, 0x2F, 0xB2, 0x51, 0xB2, - 0xA3, 0xA0, 0xA0, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, - 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x66, - 0x98, 0x98, 0x8F, 0x98, 0x66, 0x66, 0x66, 0x66, - 0x51, 0x2F, 0xB2, 0x51, 0x51, 0x2F, 0x66, 0xA0, - 0x8F, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x2F, 0x66, - 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x2F, 0xA3, 0x2F, 0x2F, 0x51, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0xDA, 0x51, 0xB2, 0x51, 0x51, 0x2F, - 0x66, 0xA0, 0x8F, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, - 0x2F, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0x51, 0x2F, 0xB2, 0x51, 0x2F, 0xA3, 0x8F, 0x8F, - 0x98, 0xA3, 0xB2, 0xB2, 0x2F, 0xA3, 0x98, 0x66, - 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x2F, - 0xB2, 0xB2, 0x51, 0xB2, 0xB2, 0x66, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xA3, 0xB2, 0x51, 0x2F, 0xA3, - 0x8F, 0x8F, 0x98, 0xA3, 0xB2, 0xB2, 0x2F, 0xA3, - 0x98, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, - 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0xA3, 0x2F, 0x66, 0x98, 0x8F, 0x98, - 0xA3, 0x2F, 0x2F, 0xA3, 0x98, 0x98, 0x98, 0x98, - 0x66, 0x98, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0xB2, - 0x51, 0x51, 0x51, 0xB2, 0xB2, 0x8F, 0x20, 0x20, - 0x20, 0x54, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x6D, 0x6D, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x4C, 0xA3, 0x2F, 0x66, 0x98, - 0x8F, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, 0x98, 0x98, - 0x98, 0x98, 0x66, 0x98, 0x66, 0x98, 0x66, 0xA3, - 0x2F, 0xB2, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x98, - 0x2F, 0x2F, 0x2F, 0x66, 0x8F, 0x8F, 0x98, 0xA3, - 0x66, 0x66, 0x8F, 0x98, 0x98, 0x66, 0x2F, 0xB2, - 0x51, 0xB2, 0x2F, 0xA3, 0xA3, 0xA0, 0x20, 0x20, - 0xDA, 0x2E, 0x3A, 0xA7, 0x20, 0x20, 0x20, 0x20, - 0x20, 0xCE, 0x2A, 0x2A, 0x2E, 0xA7, 0xDA, 0x20, - 0x20, 0x20, 0x20, 0x9C, 0xA3, 0x66, 0x98, 0x98, - 0x8F, 0x98, 0x2F, 0x2F, 0x2F, 0x66, 0x8F, 0x8F, - 0x98, 0xA3, 0x66, 0x66, 0x8F, 0x98, 0x98, 0x66, - 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, 0xA3, 0xA3, - 0xB2, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x66, 0xA3, - 0x2F, 0x2F, 0x66, 0x98, 0x98, 0x66, 0x2F, 0x2F, - 0xA3, 0x98, 0x8F, 0x98, 0x66, 0x2F, 0xB2, 0xB2, - 0xB2, 0xA3, 0x66, 0x66, 0x66, 0x98, 0x20, 0x3A, - 0x98, 0x89, 0x8F, 0x6D, 0x20, 0x20, 0x20, 0x20, - 0x4C, 0x66, 0x51, 0x44, 0x51, 0x2E, 0x54, 0x20, - 0x20, 0x20, 0x20, 0xA7, 0x66, 0x98, 0x8F, 0x8F, - 0x66, 0xA3, 0x2F, 0x2F, 0x66, 0x98, 0x98, 0x66, - 0x2F, 0x2F, 0xA3, 0x98, 0x8F, 0x98, 0x66, 0x2F, - 0xB2, 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0x2F, 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0x2F, - 0x2F, 0xA3, 0x66, 0x98, 0x98, 0xA3, 0x2F, 0xB2, - 0xA3, 0x8F, 0x98, 0xA3, 0xB2, 0x51, 0x89, 0x89, - 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x98, 0x20, 0xA6, - 0x44, 0x39, 0xE6, 0x98, 0x20, 0x20, 0x20, 0x9C, - 0x74, 0xD6, 0x7E, 0xD6, 0x39, 0x8F, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2E, 0x98, 0x8F, 0x8F, 0x98, - 0x66, 0x2F, 0x2F, 0xA3, 0x66, 0x98, 0x98, 0xA3, - 0x2F, 0xB2, 0x66, 0x98, 0x8F, 0xA3, 0xB2, 0x51, - 0x89, 0x89, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x66, - 0x2F, 0x66, 0x8F, 0xA0, 0x8F, 0x98, 0xA3, 0xB2, - 0x2F, 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, - 0x66, 0x98, 0xA3, 0xB2, 0x89, 0x44, 0x89, 0x51, - 0x2F, 0x66, 0x98, 0x98, 0xA3, 0x66, 0x20, 0x2F, - 0x2F, 0xAD, 0x89, 0xD6, 0x3A, 0x20, 0x20, 0x55, - 0x6B, 0x51, 0x6D, 0x4C, 0xD8, 0xD6, 0x2E, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x8F, 0xA0, 0x8F, 0x98, - 0xA3, 0xB2, 0x2F, 0x66, 0x66, 0x66, 0xA3, 0x2F, - 0xB2, 0x2F, 0x66, 0x66, 0xA3, 0xB2, 0x89, 0x44, - 0x89, 0x51, 0x2F, 0x66, 0x98, 0x98, 0xA3, 0xA3, - 0xA3, 0x66, 0x8F, 0xA0, 0x8F, 0x66, 0x2F, 0xB2, - 0xA3, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, - 0xA3, 0x2F, 0xB2, 0x89, 0xD8, 0xD8, 0x51, 0x66, - 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0xA3, 0x20, 0x44, - 0xA7, 0xCE, 0xA6, 0x4D, 0xCE, 0x6D, 0xA7, 0xA0, - 0x6B, 0xA7, 0x20, 0x92, 0xAD, 0x6B, 0x4C, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x98, 0xA0, 0x8F, 0x66, - 0x2F, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0xA3, 0x2F, - 0x2F, 0xA3, 0xA3, 0xA3, 0xB2, 0x89, 0xD8, 0xD8, - 0x51, 0x66, 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0x66, - 0x66, 0x66, 0x8F, 0x55, 0x8F, 0xA3, 0xB2, 0xB2, - 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, - 0xA3, 0xB2, 0x89, 0x44, 0x44, 0x51, 0x66, 0xA0, - 0x55, 0xA5, 0x55, 0x8F, 0x66, 0xA3, 0x20, 0x44, - 0x6D, 0x54, 0xA7, 0x74, 0x2E, 0x4B, 0xBF, 0x9C, - 0x7E, 0xDA, 0x20, 0x54, 0x2E, 0x6B, 0x2A, 0x20, - 0x20, 0x20, 0x20, 0x3A, 0x8F, 0x55, 0x8F, 0xA3, - 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0x2F, - 0xA3, 0xA3, 0xA3, 0xB2, 0x89, 0x44, 0x44, 0x51, - 0x66, 0xA0, 0xA5, 0xA5, 0x55, 0x8F, 0x66, 0x66, - 0xA0, 0xA0, 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0xB2, - 0x66, 0x98, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, 0x2F, - 0xB2, 0x51, 0x89, 0x89, 0xB2, 0x98, 0xA0, 0x2A, - 0xA5, 0x55, 0x98, 0x66, 0xA3, 0xB2, 0x20, 0x2F, - 0x4C, 0x20, 0x4B, 0xBB, 0xCF, 0x6F, 0x27, 0x36, - 0x93, 0xCE, 0x20, 0x20, 0xA6, 0x3D, 0x4C, 0x20, - 0x20, 0x20, 0x20, 0xDA, 0xA0, 0xA0, 0x8F, 0xA3, - 0x2F, 0xB2, 0x66, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, - 0x2F, 0x2F, 0xB2, 0x51, 0x89, 0x89, 0xB2, 0x98, - 0xA0, 0x2A, 0xA5, 0xA0, 0x8F, 0x66, 0xA3, 0xA3, - 0xA0, 0x8F, 0x8F, 0xA0, 0x8F, 0xA3, 0xB2, 0x2F, - 0x66, 0x98, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, - 0xB2, 0x89, 0x44, 0x51, 0x66, 0x55, 0xAD, 0x2A, - 0x55, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0x20, 0x2A, - 0xE6, 0x95, 0xE5, 0x5A, 0x52, 0x52, 0x3F, 0x27, - 0x22, 0xC7, 0x9D, 0x60, 0xA2, 0xA2, 0x3A, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x66, 0xA0, 0x8F, 0xA3, - 0xB2, 0x2F, 0x66, 0x98, 0x2F, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0xB2, 0x89, 0x44, 0x51, 0x66, 0x55, - 0x2A, 0x2A, 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0x2F, - 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x2F, 0xB2, 0xB2, - 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0x2F, 0x2F, - 0x51, 0x89, 0x89, 0x2F, 0x8F, 0x2A, 0x2A, 0xA5, - 0x8F, 0x66, 0xA3, 0xB2, 0x2F, 0x51, 0x20, 0x6D, - 0x77, 0xF7, 0xEE, 0x30, 0xB0, 0x72, 0x72, 0x5B, - 0x82, 0xEA, 0x72, 0xB0, 0x90, 0x96, 0x71, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, 0x98, 0x2F, - 0xB2, 0xB2, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0xB2, 0x2F, 0x51, 0x89, 0x89, 0x2F, 0x8F, 0x2A, - 0xAD, 0xA5, 0x98, 0x66, 0xA3, 0xB2, 0x2F, 0xB2, - 0xD8, 0xB2, 0xA3, 0x98, 0x98, 0x2F, 0xB2, 0xB2, - 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, 0x2F, 0xA3, - 0x51, 0x89, 0x89, 0xA3, 0xA0, 0x2A, 0xA5, 0x8F, - 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x51, 0x20, 0x69, - 0x64, 0xF9, 0x3F, 0x52, 0x52, 0x72, 0x29, 0x82, - 0x47, 0x47, 0x47, 0x8B, 0x72, 0xB7, 0x60, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, 0x98, 0x2F, - 0xB2, 0xB2, 0xA3, 0xA3, 0xB2, 0x89, 0x51, 0x2F, - 0x2F, 0xA3, 0x51, 0x89, 0x89, 0xA3, 0xA0, 0x2A, - 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0xDD, 0xA3, 0x66, 0x98, 0x66, 0x2F, 0xB2, 0xB2, - 0xA3, 0xA3, 0xB2, 0x51, 0xB2, 0x2F, 0xA3, 0x2F, - 0xB2, 0x89, 0xB2, 0x66, 0xA0, 0xA5, 0x8F, 0x98, - 0x66, 0x66, 0xB2, 0x51, 0x51, 0x51, 0x81, 0xFA, - 0x62, 0xEE, 0x30, 0x52, 0x22, 0x72, 0x82, 0x82, - 0x47, 0x47, 0xEA, 0x3F, 0x37, 0x6F, 0x26, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2A, 0x98, 0x66, 0x2F, - 0x51, 0xB2, 0xA3, 0x66, 0xB2, 0x51, 0x51, 0xB2, - 0xA3, 0x2F, 0xB2, 0x89, 0xB2, 0x66, 0x55, 0x55, - 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, - 0x74, 0xA0, 0x8F, 0x98, 0x66, 0xB2, 0xB2, 0xB2, - 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x2F, 0xA3, 0x2F, - 0xB2, 0x51, 0xA3, 0x98, 0xA0, 0x55, 0xA0, 0xA0, - 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0x51, 0x54, 0xA9, - 0x62, 0xEF, 0x52, 0x22, 0x72, 0x29, 0xEA, 0xEA, - 0x29, 0x22, 0x37, 0x37, 0x8E, 0xCF, 0x49, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6D, 0x2F, 0x66, 0x2F, - 0x51, 0xB2, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0x2F, - 0xA3, 0x2F, 0xB2, 0x51, 0x2F, 0x98, 0xA0, 0x55, - 0xA0, 0xA0, 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0xA3, - 0xA3, 0x2A, 0xA5, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, - 0x66, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, - 0xB2, 0x2F, 0xA3, 0x8F, 0xA0, 0xA0, 0xA0, 0xA0, - 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xB2, 0x54, 0xA8, - 0x65, 0x5C, 0x52, 0x22, 0x29, 0x29, 0x29, 0xB0, - 0x62, 0x56, 0xF9, 0x79, 0xF9, 0xBB, 0x4B, 0x20, - 0x6D, 0xA5, 0x2E, 0x20, 0x20, 0xA3, 0xA3, 0x2F, - 0xB2, 0x2F, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, - 0x2F, 0x2F, 0xB2, 0x2F, 0x66, 0x8F, 0xA0, 0xA0, - 0x55, 0xA0, 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xA3, - 0xA0, 0x2A, 0x55, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, - 0xA3, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, 0xA3, 0x66, - 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, 0xA0, 0x98, - 0xA3, 0x51, 0x89, 0x89, 0xA3, 0x2F, 0x20, 0x54, - 0xDF, 0xFA, 0x40, 0x37, 0xD4, 0x43, 0x56, 0x64, - 0x76, 0xF9, 0x78, 0x41, 0x5E, 0x5E, 0x4C, 0x20, - 0x20, 0xAD, 0x8F, 0x9C, 0x20, 0xA5, 0xA3, 0x2F, - 0x2F, 0x2F, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, - 0xA3, 0x66, 0xA3, 0x2F, 0x66, 0x8F, 0x8F, 0x8F, - 0x8F, 0x8F, 0xA3, 0x51, 0x89, 0x51, 0xA3, 0x66, - 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0x2F, 0xA3, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x66, - 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, - 0xB2, 0x89, 0xD8, 0x51, 0x66, 0x51, 0x20, 0x6D, - 0x51, 0x77, 0x9F, 0xF7, 0xEE, 0x8E, 0xF9, 0xF0, - 0x24, 0xF7, 0x77, 0x5E, 0x74, 0xD8, 0x98, 0x20, - 0x20, 0x2E, 0x55, 0x92, 0x20, 0x54, 0x51, 0x2F, - 0x2F, 0xB2, 0xB2, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0xA3, 0xA3, 0x66, 0xA3, 0x66, 0x66, 0x66, 0x66, - 0x66, 0xA3, 0xB2, 0x89, 0xD8, 0x51, 0xA3, 0x98, - 0x98, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0xB2, 0x2F, 0x2F, 0xB2, 0xB2, 0x2F, 0x2F, 0x66, - 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0x89, 0xD8, 0x89, 0xB2, 0x66, 0x66, 0x20, 0x6D, - 0x89, 0xC2, 0xA4, 0x96, 0xC6, 0x64, 0x50, 0x40, - 0xF4, 0x97, 0x89, 0x74, 0x7E, 0x6B, 0x39, 0xA7, - 0x20, 0x20, 0x3A, 0x54, 0x20, 0x20, 0xA7, 0x51, - 0x2F, 0xB2, 0xB2, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, - 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, - 0x2F, 0xB2, 0x89, 0xD8, 0x44, 0x2F, 0x66, 0x66, - 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, - 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, - 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0x51, 0x51, - 0x89, 0x89, 0xB2, 0x66, 0x2F, 0x6D, 0x20, 0xCE, - 0x39, 0x74, 0x89, 0x5E, 0xBD, 0x87, 0xC8, 0xD1, - 0x89, 0x44, 0x3C, 0x4D, 0x6B, 0x6B, 0x6B, 0x2F, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xA3, - 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0x2F, 0xA3, 0x66, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, - 0x51, 0x51, 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66, - 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, - 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0x2F, 0xA3, - 0x66, 0x66, 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0x66, 0x66, 0x2A, 0x20, 0x54, 0x44, - 0x6B, 0x39, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0xD8, 0x39, 0x4D, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, - 0x9C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6D, - 0x51, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, - 0xA3, 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0xB2, 0xB2, 0xB2, 0x2F, 0x66, 0x98, 0x98, 0x66, - 0x98, 0x98, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0x66, - 0x98, 0x66, 0x66, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, - 0x66, 0x98, 0x98, 0x98, 0x3A, 0x54, 0x2A, 0x6B, - 0x6B, 0x6B, 0x83, 0x44, 0x89, 0x89, 0x44, 0x3C, - 0xD6, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0xB2, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0xAD, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0x66, 0x66, 0x98, 0x66, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x8F, 0x98, - 0x8F, 0x98, 0x98, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, - 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x8F, 0x8F, 0x8F, 0x98, 0x98, 0x98, 0x8F, 0xA0, - 0xA0, 0xA0, 0xA3, 0xDA, 0x20, 0x3A, 0x39, 0x6B, - 0x6B, 0x6B, 0x4D, 0xA2, 0x74, 0x3C, 0x7E, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x98, 0x98, 0x98, - 0x8F, 0xA0, 0xA0, 0xA0, 0x8F, 0x8F, 0x8F, 0xA0, - 0x8F, 0x66, 0x66, 0xA3, 0x66, 0xA3, 0xA3, 0x2F, - 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x98, - 0x98, 0xA0, 0x98, 0x66, 0x66, 0x98, 0x8F, 0xA0, - 0xA0, 0xA3, 0x2E, 0x20, 0x20, 0x8F, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x55, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3A, 0x51, 0x2F, 0xA3, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0x98, - 0x8F, 0xA0, 0xA0, 0x8F, 0x8F, 0x8F, 0x8F, 0xA0, - 0x66, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, - 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0x66, 0x66, - 0x66, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, 0x66, 0x8F, - 0x66, 0xA6, 0x20, 0x20, 0x6D, 0x39, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0xB2, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2E, 0x89, 0xA3, 0xA3, 0x66, 0x66, - 0x66, 0x66, 0x98, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, - 0x66, 0x8F, 0x98, 0x98, 0x66, 0x98, 0x98, 0x8F, - 0x2F, 0x51, 0xB2, 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x66, 0x2F, - 0x55, 0x20, 0x20, 0x20, 0x4C, 0x39, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x4D, 0x7E, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2E, 0x51, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0xA3, - 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x66, - 0xB2, 0x51, 0x51, 0xB2, 0xB2, 0xA3, 0x2F, 0xA3, - 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, - 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x98, 0x98, 0xA0, - 0x20, 0x20, 0x20, 0x20, 0xA5, 0x83, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0x4D, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x4D, 0x4D, 0xD6, 0x7E, 0xDD, - 0x3C, 0x39, 0xA7, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x92, 0xB2, 0xA3, 0xA3, - 0xA3, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, 0x98, - 0x98, 0x66, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0x89, 0x89, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x2F, 0xDA, - 0x20, 0x20, 0x20, 0xDA, 0xA0, 0x51, 0x3C, 0x7E, - 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x7E, 0x3C, 0xD8, 0x44, 0xD8, - 0x44, 0x83, 0x89, 0xDA, 0x20, 0x3A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0xB2, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, - 0x98, 0x98, 0x98, 0x98, 0x66, 0xA3, 0xA3, 0x2F, - 0x3C, 0x89, 0x89, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, - 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0xA3, 0xA3, 0xA3, 0x66, 0x98, 0x98, 0xA3, 0x20, - 0x20, 0x20, 0x20, 0x6D, 0x2F, 0xE6, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0xD6, 0x3D, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0xA2, - 0x74, 0x44, 0xA2, 0xA3, 0x20, 0x3A, 0x2E, 0x6D, - 0x20, 0x20, 0x20, 0x20, 0x20, 0xA6, 0xA3, 0x66, - 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0x66, 0x66, 0x98, - 0x66, 0x66, 0x98, 0x98, 0x98, 0x66, 0xA3, 0xA3, - 0x83, 0xB2, 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, - 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x98, 0x66, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA6, 0x20, - 0x3A, 0x3A, 0x54, 0x55, 0x7E, 0x6B, 0x6B, 0x6B, - 0x4D, 0x3D, 0x6B, 0x6B, 0x6B, 0x57, 0x33, 0xEB, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x4D, 0xA2, 0x74, 0x39, 0x92, 0x20, 0x20, 0x6D, - 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, - 0x98, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x66, 0xA3, - 0x89, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, - 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xB2, 0x3A, 0x20, - 0xA7, 0x20, 0x3A, 0x39, 0x6B, 0x6B, 0x6B, 0x6B, - 0xB5, 0xCB, 0x6B, 0x6B, 0x3D, 0x8A, 0x42, 0x3D, - 0x6B, 0x6B, 0x6B, 0x84, 0x6C, 0x4D, 0x6B, 0x6B, - 0x6B, 0x6B, 0x7E, 0x83, 0x51, 0x20, 0x20, 0x20, - 0x6D, 0x3A, 0x20, 0x20, 0x20, 0x20, 0xAD, 0x66, - 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, - 0xB2, 0x98, 0x66, 0x66, 0x98, 0x66, 0x66, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x20, 0x6D, - 0x3A, 0x20, 0x98, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0xAA, 0x33, 0x6B, 0x6B, 0x3D, 0xF5, 0x7B, 0x3D, - 0x6B, 0x6B, 0x4F, 0x4A, 0x58, 0x3D, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x7E, 0x7E, 0x9C, 0x54, 0xA7, - 0x2E, 0xA7, 0x20, 0x20, 0x20, 0x20, 0x54, 0x51, - 0x2F, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, - 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, - 0xB2, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x66, 0xA3, - 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, 0xB2, - 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xA6, 0x20, 0xCE, - 0x20, 0x6D, 0x4D, 0x6B, 0xD6, 0x7E, 0x6B, 0x6B, - 0x6E, 0x9A, 0x57, 0x6B, 0x2D, 0x7B, 0x7B, 0x3D, - 0x6B, 0x84, 0xF5, 0x7B, 0x84, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x98, 0x3A, 0x9C, - 0xCE, 0x3A, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x98, - 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0x89, 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, - 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, 0xB2, 0xB2, - 0xB2, 0x2F, 0x2F, 0x2F, 0x89, 0x54, 0x6D, 0x3A, - 0x20, 0x98, 0x6B, 0x6B, 0xE0, 0xB4, 0x6B, 0x6B, - 0x2D, 0x9E, 0x4A, 0x3D, 0x84, 0xF5, 0xF5, 0x84, - 0x6B, 0x6E, 0x59, 0x6C, 0x6B, 0x6B, 0x6B, 0x6B, - 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0xDD, 0xDA, 0x6D, - 0x54, 0x20, 0xCE, 0x20, 0x20, 0x20, 0x20, 0xA7, - 0x51, 0xB2, 0xB2, 0xB2, 0x2F, 0xB2, 0x2F, 0x2F, - 0x2F, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, - 0x89, 0xA3, 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, - 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0x2F, - 0xB2, 0x2F, 0x2F, 0xA3, 0x98, 0x20, 0xA7, 0x20, - 0x3A, 0x7E, 0x6B, 0x6B, 0x7F, 0xDE, 0xF6, 0x3D, - 0x6B, 0xDB, 0x8A, 0xDB, 0xE9, 0xF3, 0xF3, 0xDB, - 0x68, 0xF3, 0x73, 0x7F, 0x6B, 0x6B, 0x57, 0x58, - 0xDC, 0x2D, 0x6B, 0x6B, 0x6B, 0x6B, 0x3A, 0x20, - 0x20, 0x20, 0x6D, 0x54, 0x20, 0x20, 0x20, 0x20, - 0x51, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0x66, - 0xA3, 0x66, 0x98, 0x98, 0x66, 0x98, 0x98, 0x66, - 0x2F, 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, - 0x66, 0x98, 0x8F, 0x98, 0xCE, 0xDA, 0x2E, 0x20, - 0x2A, 0x6B, 0x6B, 0x6B, 0x6B, 0x2C, 0x34, 0xCB, - 0xEB, 0x6C, 0x31, 0x59, 0x82, 0x82, 0x8B, 0x82, - 0xF3, 0x73, 0xE9, 0x6B, 0x3D, 0x6E, 0xF3, 0x4A, - 0x4F, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x92, 0x20, - 0x20, 0x20, 0x6D, 0x6D, 0x20, 0x20, 0x20, 0x20, - 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x8F, 0x98, - 0x98, 0x98, 0x98, 0x66, 0x98, 0x66, 0x66, 0xA3, - 0xA3, 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, - 0xA3, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0x66, - 0x8F, 0x55, 0xA5, 0x98, 0x20, 0x2E, 0x54, 0x54, - 0x89, 0x6B, 0x6B, 0x6B, 0x6B, 0x84, 0xE3, 0x4A, - 0x58, 0x42, 0x5B, 0x8B, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x59, 0x58, 0x57, 0x57, 0x59, 0x7B, 0x84, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0xAD, 0x20, - 0x20, 0x20, 0x3A, 0x3A, 0x20, 0x20, 0x20, 0x20, - 0x2A, 0x66, 0x8F, 0x55, 0xA5, 0xA5, 0xA0, 0x8F, - 0x66, 0xA3, 0xA3, 0x66, 0x98, 0x66, 0x66, 0x2F, - 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0x66, - 0x8F, 0xA5, 0x8F, 0x2E, 0x20, 0x2E, 0x20, 0x3A, - 0x4D, 0x6B, 0xE6, 0x84, 0x3D, 0x6B, 0xEB, 0x4A, - 0xC9, 0x8B, 0x8B, 0x31, 0x59, 0x82, 0x59, 0x59, - 0x5B, 0x82, 0x59, 0x73, 0x7B, 0xDC, 0x57, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x55, 0x20, - 0x20, 0x20, 0x6D, 0xDA, 0x20, 0x20, 0x20, 0x20, - 0x9C, 0x66, 0x8F, 0xA5, 0xA5, 0x55, 0x8F, 0x66, - 0x2F, 0xB2, 0x2F, 0x66, 0x98, 0x98, 0x2F, 0x51, - 0x89, 0xB2, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, - 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, - 0x8F, 0xA5, 0x8F, 0x20, 0x20, 0xA7, 0x20, 0xA6, - 0x6B, 0x6B, 0xE4, 0x48, 0x2C, 0xDB, 0x4F, 0x9E, - 0xD0, 0xD0, 0x8B, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x59, 0x82, 0x82, 0x73, 0x7B, 0x68, 0x6B, 0x3D, - 0x68, 0x68, 0x84, 0x3D, 0x6B, 0x6B, 0xA0, 0x20, - 0x20, 0x20, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6D, 0x2F, 0xA0, 0xA5, 0x55, 0x98, 0x66, 0xA3, - 0xB2, 0x89, 0xB2, 0x98, 0x8F, 0x98, 0x2F, 0x51, - 0x74, 0xB2, 0xA3, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, - 0xA3, 0xA3, 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0xA3, - 0x98, 0xA3, 0x6D, 0x20, 0x20, 0xCE, 0x20, 0x2A, - 0x6B, 0x6B, 0xEB, 0x2C, 0xE1, 0xF1, 0x7C, 0xD0, - 0x8B, 0x8B, 0x82, 0x82, 0x82, 0x82, 0x82, 0x59, - 0x82, 0x82, 0x42, 0x82, 0x31, 0x57, 0x4F, 0x7B, - 0x7B, 0xF5, 0xF6, 0xDB, 0x6B, 0x6B, 0x98, 0x20, - 0x20, 0x20, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x51, 0x66, 0xA0, 0xA0, 0x66, 0x2F, 0xB2, - 0xB2, 0x51, 0x2F, 0xA0, 0x55, 0xA3, 0x51, 0x89, - 0x44, 0xA3, 0x98, 0x98, 0x2F, 0x2F, 0x2F, 0xA3, - 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, 0x2F, 0x2F, - 0x98, 0x8F, 0x20, 0x20, 0x3A, 0xA6, 0x20, 0xA0, - 0x6B, 0x6B, 0x6B, 0x6B, 0x7F, 0x7F, 0xC3, 0xC9, - 0xD0, 0xD0, 0x29, 0x59, 0x82, 0x73, 0x82, 0x73, - 0x59, 0x59, 0x59, 0x59, 0x59, 0x58, 0xAF, 0xF5, - 0x8A, 0x68, 0xEB, 0x6B, 0x6B, 0x6B, 0x98, 0x20, - 0x20, 0x20, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x51, 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, - 0x51, 0x2F, 0x98, 0x55, 0x8F, 0xB2, 0x89, 0x44, - 0xA3, 0x55, 0x55, 0x98, 0xA3, 0xB2, 0x2F, 0xA3, - 0x66, 0x66, 0x98, 0x8F, 0x66, 0xA3, 0x66, 0x98, - 0x55, 0x4C, 0x20, 0x20, 0xDA, 0xAD, 0x20, 0x98, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x9A, 0xD0, - 0xF2, 0x8B, 0x8B, 0x8B, 0x73, 0x82, 0x5B, 0x82, - 0x82, 0x59, 0x59, 0x73, 0x73, 0x58, 0x3D, 0x3D, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x66, 0x20, - 0x20, 0x3A, 0x3A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2F, 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, - 0xB2, 0xA3, 0x66, 0x66, 0xA3, 0xB2, 0x89, 0x51, - 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, 0xB2, 0xA3, - 0x66, 0x66, 0x98, 0x98, 0x98, 0x66, 0x66, 0x8F, - 0x8F, 0x92, 0x20, 0x20, 0x20, 0x6D, 0x6D, 0xA3, - 0x6B, 0x6B, 0xEB, 0x7F, 0x4F, 0xDB, 0xD2, 0xC9, - 0xC9, 0xD0, 0x8B, 0x8B, 0x73, 0x82, 0x59, 0x8B, - 0x59, 0x82, 0x59, 0x59, 0x73, 0xF5, 0xEB, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x55, 0x20, - 0x20, 0xA7, 0x54, 0xDA, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x98, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, - 0x51, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0x51, 0xB2, - 0xA0, 0xA5, 0x55, 0x66, 0x2F, 0x51, 0x2F, 0xA3, - 0x66, 0x66, 0x66, 0x98, 0x66, 0x66, 0x98, 0x98, - 0x98, 0x2A, 0x54, 0x95, 0x95, 0x71, 0x2E, 0x98, - 0x6B, 0x6B, 0x4D, 0x28, 0xDE, 0x88, 0xB7, 0x70, - 0xC9, 0xC9, 0xD0, 0xF2, 0x8B, 0x8B, 0x8B, 0x59, - 0x59, 0x59, 0x59, 0x5B, 0x59, 0xF3, 0x57, 0xE9, - 0xDB, 0x84, 0x6B, 0x6B, 0x6B, 0x6B, 0x4C, 0xDA, - 0x2E, 0xDA, 0x20, 0xDA, 0x2E, 0x2E, 0x6D, 0x20, - 0x4C, 0x98, 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, - 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0xA0, 0xA0, 0x8F, 0x2F, 0xB2, 0x89, 0xB2, 0xA3, - 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0xA3, - 0x2F, 0xD1, 0xE2, 0x52, 0x52, 0xF4, 0xBF, 0x9C, - 0x39, 0x6B, 0x6B, 0x6B, 0x7F, 0x4F, 0xE3, 0x6A, - 0xD0, 0xC9, 0xC9, 0xD0, 0xD0, 0x8B, 0x8B, 0x82, - 0x5B, 0x5B, 0x73, 0x8B, 0x59, 0x23, 0x6E, 0x31, - 0x59, 0x7B, 0xDB, 0x84, 0x68, 0x7F, 0xAE, 0x54, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0xA6, 0x3A, - 0xA0, 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, - 0x2F, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, - 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, - 0x66, 0x98, 0x98, 0x66, 0x66, 0xA3, 0x2F, 0x2F, - 0x3C, 0x88, 0x8D, 0x52, 0x52, 0x5D, 0xF7, 0xBF, - 0xCE, 0xA2, 0x6B, 0x6B, 0x6B, 0x6B, 0x7F, 0x85, - 0x70, 0xC9, 0xC9, 0xC9, 0xD0, 0xEA, 0x8B, 0x5B, - 0x82, 0xEA, 0x82, 0x82, 0x42, 0x57, 0x3D, 0x68, - 0x68, 0x57, 0x4A, 0x34, 0x22, 0xCC, 0x21, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0xDA, 0xA7, 0x6D, - 0xDF, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, - 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, - 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x66, - 0x8F, 0x8F, 0x8F, 0x98, 0xA3, 0xA3, 0x89, 0xD8, - 0x25, 0x5C, 0x3B, 0x5D, 0x52, 0x80, 0x70, 0x36, - 0x71, 0xA7, 0x44, 0x6B, 0x84, 0xCB, 0xAA, 0xF3, - 0xC9, 0xC9, 0xC9, 0xC9, 0xD0, 0x8B, 0x5B, 0x5B, - 0x5B, 0xEA, 0x82, 0x47, 0x7B, 0x68, 0x3D, 0x3D, - 0x6B, 0x3D, 0x6C, 0x2B, 0x80, 0x61, 0x96, 0x81, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0xDA, 0x63, - 0xAC, 0x6C, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, - 0xA3, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x66, 0x98, 0x66, 0xA3, 0xB2, 0xB2, 0x2F, 0x66, - 0x8F, 0x8F, 0x2F, 0xD8, 0xE4, 0xCD, 0xAA, 0xB4, - 0x78, 0x2B, 0x3B, 0x70, 0x46, 0x5D, 0x5D, 0x52, - 0x9D, 0x81, 0x3A, 0xA3, 0xCD, 0x48, 0xBE, 0x4F, - 0xC3, 0xC9, 0xD0, 0xD0, 0xD0, 0xEA, 0x5B, 0x8B, - 0x5B, 0x82, 0x8B, 0x59, 0x4A, 0xF3, 0x33, 0x7F, - 0x3D, 0x6B, 0x4F, 0x6F, 0x5D, 0x52, 0x63, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x85, - 0x72, 0xDC, 0xD8, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0x51, 0xA3, 0x98, - 0xA0, 0xA3, 0x93, 0xCF, 0x79, 0x27, 0x5C, 0x79, - 0x2B, 0x30, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, - 0x3F, 0x69, 0x20, 0x20, 0x2A, 0xD6, 0x3D, 0x6B, - 0x84, 0xE3, 0x34, 0xB7, 0xC9, 0xD0, 0xD0, 0xF2, - 0xD0, 0x8B, 0x31, 0x68, 0x68, 0x6E, 0x31, 0x33, - 0x7F, 0x7E, 0xA1, 0x6F, 0x52, 0x8D, 0xE5, 0xBF, - 0x20, 0x20, 0x20, 0x20, 0x81, 0xA8, 0x78, 0x52, - 0x52, 0xD2, 0xD8, 0xA3, 0xA3, 0x2F, 0x2F, 0xA3, - 0xA3, 0x66, 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, - 0x51, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, 0xA0, - 0xA0, 0x44, 0x78, 0xEF, 0x52, 0x30, 0x30, 0x30, - 0x3B, 0x70, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, - 0x46, 0xC1, 0x71, 0x20, 0x81, 0xB1, 0xDD, 0x3D, - 0xA1, 0xE7, 0xDB, 0xCA, 0xD2, 0x6A, 0x6A, 0x6A, - 0xF3, 0xE9, 0xDB, 0x8A, 0x84, 0x3D, 0x84, 0xDC, - 0x25, 0x44, 0xB5, 0xEE, 0x30, 0xEF, 0xF0, 0x32, - 0x69, 0x5F, 0x4B, 0xA8, 0x99, 0x56, 0x67, 0x30, - 0x30, 0x34, 0xB2, 0x2F, 0xA3, 0xA3, 0x66, 0x66, - 0x98, 0x8F, 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, - 0x51, 0x2F, 0xB2, 0x51, 0x51, 0x2F, 0x66, 0xA0, - 0x8F, 0xE0, 0xF9, 0x8D, 0x52, 0x5D, 0x46, 0x5D, - 0x80, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x52, 0x52, 0x60, 0x81, 0x20, 0x20, 0x6D, 0xD1, - 0x48, 0xE7, 0x6B, 0x33, 0xF6, 0x7F, 0x7F, 0xDB, - 0x84, 0x6B, 0x6C, 0x6A, 0xF3, 0xEB, 0x6B, 0x3D, - 0x4F, 0xD8, 0xCD, 0x79, 0x30, 0x67, 0xF9, 0x24, - 0xED, 0xD9, 0x8C, 0xED, 0x37, 0x2B, 0x3B, 0x5D, - 0x80, 0x85, 0x4E, 0x98, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0x51, 0x2F, 0xB2, 0xB2, 0xB2, 0xA3, 0x8F, 0x8F, - 0x98, 0xE0, 0xF0, 0x67, 0x5D, 0x80, 0x80, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, - 0x5D, 0x70, 0x27, 0x4B, 0x20, 0x81, 0x71, 0x3A, - 0xB5, 0xEB, 0x3D, 0xF1, 0xE1, 0x84, 0x84, 0xF1, - 0xE3, 0x3D, 0x6B, 0x6C, 0x34, 0xE7, 0x6B, 0x6B, - 0xD6, 0x74, 0x5E, 0x78, 0x67, 0x30, 0xEE, 0x5C, - 0xF9, 0xF9, 0x45, 0x5C, 0x2B, 0x3B, 0x5D, 0x5D, - 0x5D, 0x5D, 0xF8, 0x44, 0x66, 0x66, 0x66, 0x66, - 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, 0x98, 0x8F, 0x98, - 0x66, 0x83, 0x76, 0x67, 0x30, 0x80, 0x5D, 0x80, - 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x80, 0x5D, 0x22, 0xFA, 0x20, 0x81, 0x20, 0x20, - 0xA5, 0x6B, 0x6B, 0xE8, 0xBE, 0x3D, 0x6B, 0x2C, - 0xE1, 0xEB, 0x6B, 0x3D, 0x3E, 0xA1, 0x6B, 0x6B, - 0x4D, 0x74, 0xE8, 0x62, 0x67, 0x30, 0x8D, 0x67, - 0xEE, 0xEE, 0xEE, 0x67, 0x30, 0x80, 0x5D, 0x5D, - 0x52, 0x5D, 0x85, 0xAC, 0x3E, 0xA3, 0x66, 0x66, - 0x2F, 0x51, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x66, - 0x2F, 0x83, 0xBC, 0xEE, 0x5D, 0x5D, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, - 0x5D, 0x5D, 0x22, 0xB0, 0xAE, 0x81, 0x20, 0x20, - 0x4C, 0x3D, 0xEB, 0x39, 0x57, 0x6B, 0x6B, 0x3E, - 0x97, 0x3D, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, - 0x3D, 0x3C, 0xBA, 0x62, 0xEE, 0x5D, 0x5D, 0x30, - 0x30, 0x8D, 0x8D, 0x30, 0x52, 0x5D, 0x5D, 0x80, - 0x5D, 0x5D, 0x5D, 0x85, 0xB0, 0x6E, 0x2F, 0x66, - 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, 0xA3, 0xA3, - 0xB2, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x98, 0xA3, - 0x2F, 0x51, 0xDE, 0x8E, 0x30, 0x5D, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x52, 0x80, 0x5D, 0x22, 0x43, 0x4B, 0x20, 0x6D, - 0x44, 0x6B, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x4D, - 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x6B, - 0x4D, 0x2A, 0xAE, 0x76, 0xEE, 0x30, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x80, - 0x5D, 0x5D, 0x80, 0x80, 0x5D, 0x7A, 0xB6, 0x51, - 0xB2, 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0x2F, 0x66, 0x98, 0x8F, 0xA0, 0x98, 0xA3, 0x2F, - 0x2F, 0x51, 0xAB, 0x8E, 0x5D, 0x5D, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, - 0x5D, 0x80, 0x5D, 0x52, 0x52, 0x94, 0x2F, 0x7E, - 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x7E, - 0xAD, 0x54, 0xAE, 0x24, 0x2B, 0x3B, 0x5D, 0x52, - 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x80, - 0x5D, 0x52, 0x52, 0x5D, 0x5D, 0x5D, 0xD2, 0x3E, - 0x89, 0x89, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x66, - 0x2F, 0x66, 0x8F, 0x8F, 0xA0, 0x98, 0xA3, 0xB2, - 0x2F, 0x51, 0xDE, 0x79, 0x5D, 0x80, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x5D, 0x5D, 0x80, 0x5D, 0x52, 0x6F, 0xA4, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0xA2, 0xCE, - 0x20, 0x20, 0x95, 0x24, 0x67, 0x3B, 0x80, 0x80, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x30, 0xB0, 0x86, - 0x89, 0x51, 0x2F, 0x66, 0x98, 0x98, 0xA3, 0xA3, - 0xA3, 0x66, 0x8F, 0xA0, 0x8F, 0x66, 0x2F, 0xB2, - 0x2F, 0x4E, 0x76, 0x2B, 0x30, 0x5D, 0x5D, 0x5D, - 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x5D, 0x46, 0x52, 0x21, 0x74, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x7E, 0x98, 0x3A, 0x20, - 0x20, 0x81, 0x60, 0xED, 0x2B, 0x52, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x80, - 0x22, 0x5D, 0x5D, 0x5D, 0x8D, 0x2B, 0x38, 0x39, - 0x51, 0x66, 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0x66, - 0x66, 0x66, 0x8F, 0x55, 0x8F, 0xA3, 0xB2, 0xB2, - 0xA3, 0xE8, 0xF9, 0x30, 0x3B, 0x80, 0x5D, 0x5D, - 0x5D, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x52, 0x30, 0xD4, 0x99, - 0x51, 0x4D, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0x6B, - 0x6B, 0x6B, 0x7E, 0xA3, 0x2E, 0x20, 0x20, 0x20, - 0x20, 0x81, 0xC5, 0xED, 0x2B, 0x3B, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x80, - 0x5D, 0x52, 0x52, 0x6F, 0xDE, 0x2C, 0x39, 0x51, - 0x66, 0xA0, 0xA5, 0xA5, 0x55, 0x8F, 0x66, 0x66, - 0xA0, 0xA0, 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0x2F, - 0x51, 0xD5, 0x45, 0x8D, 0x3B, 0x5D, 0x80, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x5D, 0x52, 0x67, 0x37, 0xA9, - 0x3A, 0xCE, 0xA0, 0x2F, 0x51, 0x51, 0xB2, 0xA3, - 0xA5, 0x9C, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x54, 0x99, 0xED, 0x67, 0x30, 0x5D, 0x5D, - 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x3B, 0x80, - 0x8D, 0x79, 0x48, 0x2C, 0x39, 0x44, 0xB2, 0x66, - 0xA0, 0x2A, 0xA5, 0xA0, 0x8F, 0x66, 0xA3, 0xA3, - 0xA0, 0x8F, 0x8F, 0xA0, 0x8F, 0xA3, 0xB2, 0xB2, - 0xD8, 0xBC, 0x45, 0xEE, 0x67, 0x8D, 0x30, 0x30, - 0x52, 0x52, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, - 0x5D, 0x5D, 0x5D, 0x80, 0x3B, 0x67, 0xF9, 0x32, - 0x69, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0xBF, 0xEC, 0xED, 0x2B, 0x30, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x5D, 0x52, 0x30, 0x67, 0x2B, - 0xCF, 0xAA, 0xD8, 0x89, 0x89, 0x51, 0x66, 0x55, - 0x2A, 0x2A, 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0x2F, - 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x2F, 0xB2, 0x2F, - 0xD1, 0x28, 0x56, 0xED, 0x62, 0x37, 0x5C, 0x79, - 0x8E, 0x2B, 0x2B, 0x30, 0x30, 0x30, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x80, 0x3B, 0xEE, 0x56, 0xA9, - 0x75, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5F, 0x99, 0xD9, 0x45, 0x8D, 0x3B, 0x5D, - 0x5D, 0x3B, 0x5D, 0x8D, 0x2B, 0x79, 0x79, 0x41, - 0x83, 0xB2, 0xB2, 0x89, 0x89, 0x2F, 0xA0, 0x2A, - 0xAD, 0xA5, 0x98, 0x66, 0xA3, 0xB2, 0x2F, 0xB2, - 0xD8, 0xB2, 0xA3, 0x98, 0x98, 0x2F, 0x51, 0xB2, - 0xA3, 0x83, 0x3E, 0x25, 0xD5, 0xE5, 0x50, 0x8C, - 0xED, 0x24, 0x24, 0xF0, 0x45, 0x8E, 0x2B, 0x30, - 0x30, 0x5D, 0x3B, 0x30, 0xEE, 0xF0, 0xC6, 0x65, - 0x75, 0x71, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x4B, 0xC5, 0x7D, 0x24, 0xEE, 0x67, 0x30, - 0x30, 0x8D, 0x67, 0x8E, 0xF9, 0xF7, 0x97, 0xDD, - 0x2F, 0x2F, 0x51, 0x89, 0x89, 0x2F, 0x55, 0x2A, - 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0xDD, 0xA3, 0x66, 0x98, 0x66, 0x2F, 0xB2, 0xB2, - 0xA3, 0xA3, 0xB2, 0x51, 0x89, 0x44, 0xE0, 0x5E, - 0x91, 0x9F, 0x9F, 0x7D, 0x7D, 0xD9, 0x24, 0xF0, - 0x79, 0x8E, 0xEE, 0x8E, 0x24, 0x40, 0x65, 0x35, - 0x69, 0x2E, 0x98, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0x98, - 0xA5, 0xA7, 0x95, 0xD7, 0x8C, 0xF0, 0x8E, 0x8E, - 0xEE, 0x79, 0xF0, 0xED, 0x50, 0xE8, 0x89, 0x2F, - 0xA3, 0xA3, 0xB2, 0x89, 0xB2, 0x66, 0xA0, 0x55, - 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, - 0x74, 0xA0, 0xA0, 0x98, 0x66, 0xB2, 0xB2, 0xB2, - 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0xA3, 0x2F, - 0x51, 0x83, 0xE4, 0x87, 0xB8, 0xFA, 0xA9, 0xC6, - 0x40, 0x64, 0x64, 0x50, 0xD7, 0x65, 0x35, 0x60, - 0x98, 0xB2, 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0xA3, - 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xB2, - 0x89, 0xDD, 0x9B, 0xC0, 0x7D, 0x50, 0x8C, 0xED, - 0xED, 0x8C, 0x40, 0x9F, 0x4E, 0x51, 0xB2, 0x2F, - 0x2F, 0x2F, 0xB2, 0x51, 0xA3, 0x98, 0xA0, 0x55, - 0xA0, 0xA0, 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0xA3, - 0xA3, 0x2A, 0x55, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, - 0x66, 0x66, 0x2F, 0xB2, 0xD1, 0x2F, 0x2F, 0xA3, - 0xB2, 0xB2, 0xA3, 0x8F, 0xA3, 0x2F, 0xD1, 0x94, - 0xEC, 0x65, 0x65, 0xC0, 0xC0, 0x35, 0x95, 0xC2, - 0xA3, 0x98, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, - 0xA3, 0x2F, 0xB2, 0x2F, 0x2F, 0x2F, 0x2F, 0x51, - 0x89, 0x44, 0xD1, 0x60, 0x35, 0xA9, 0x32, 0xC6, - 0xD7, 0x32, 0x94, 0x44, 0x2F, 0xB2, 0xB2, 0xB2, - 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x8F, 0xA0, 0xA0, - 0x55, 0xA0, 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xA3, - 0x8F, 0x2A, 0x55, 0x66, 0xA3, 0x2F, 0x2F, 0xB2, - 0xA3, 0x66, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x66, - 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, 0xA0, 0x2F, - 0x5E, 0xDF, 0xB9, 0x60, 0x95, 0xD3, 0x89, 0x2F, - 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0xA3, - 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, - 0x51, 0x2F, 0x8F, 0x2F, 0xC4, 0xB9, 0x9B, 0xEC, - 0x53, 0xB3, 0x4E, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0xA3, 0x66, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, - 0x8F, 0x8F, 0xA3, 0x51, 0x89, 0x51, 0xA3, 0x66, - 0xA0, 0x55, 0x8F, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0x2F, 0xA3, 0x2F, 0x51, 0x51, 0xB2, 0xA3, 0x66, - 0x66, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, - 0xB2, 0xC2, 0x74, 0xD8, 0xB2, 0xA3, 0xA3, 0xA3, - 0x66, 0x66, 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x66, - 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xB2, - 0x2F, 0x66, 0xA0, 0x55, 0x98, 0x2F, 0x89, 0x89, - 0x89, 0xB2, 0x2F, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0x2F, 0x66, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, - 0x66, 0xA3, 0xB2, 0x89, 0xD8, 0x51, 0xA3, 0x98, - 0x66, 0x98, 0x66, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, - 0xB2, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, - 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0x89, 0xD8, 0x89, 0x2F, 0x66, 0x66, 0xA3, 0xA3, - 0x98, 0x98, 0x66, 0x66, 0x98, 0x98, 0x66, 0xA3, - 0x2F, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, - 0xB2, 0x2F, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0x2F, - 0x2F, 0xB2, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0x2F, - 0x2F, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, - 0x2F, 0xB2, 0x89, 0xD8, 0x44, 0x2F, 0x66, 0x66, - 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, - 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0x51, 0x51, - 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66, 0xA3, 0x66, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, 0xA3, 0x2F, - 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0x2F, 0xB2, 0xB2, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0x2F, 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0x51, 0x51, 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66 -}; - -unsigned char linux_logo_bw[] __initdata = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, - 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC3, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFB, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xCF, 0xC3, 0xF8, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x81, 0xF9, - 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7, - 0x99, 0xF9, 0xC2, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xF3, 0xBC, 0xF9, 0x90, 0x00, 0x1F, 0xFF, - 0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xA0, 0x00, - 0x8F, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9, - 0x83, 0xE0, 0x2F, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, - 0x19, 0xF0, 0x1F, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x03, 0xF0, 0x3F, 0xF7, 0x8F, 0xFF, - 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0x7F, 0xF7, - 0xC7, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, - 0x6F, 0xF7, 0xE7, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, - 0x01, 0xF8, 0x7F, 0xF7, 0xE7, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x21, 0xD8, 0x7F, 0xE7, 0xEF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0x7B, 0xFF, - 0xEF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4, - 0x7B, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, - 0xC0, 0x7C, 0x79, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, - 0xE3, 0x80, 0x00, 0x7C, 0x7C, 0xFF, 0xCF, 0xFF, - 0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0x77, 0xFF, - 0xDF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F, - 0x3F, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, - 0x00, 0x3F, 0xBF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, - 0x1E, 0x00, 0x00, 0x1F, 0x9F, 0xFF, 0x3F, 0xFF, - 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1F, 0x9F, 0xFF, - 0x7F, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1F, - 0x8F, 0xFE, 0x7F, 0xFF, 0xFF, 0xFC, 0x7C, 0x00, - 0x00, 0x0F, 0xC7, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, - 0xF8, 0x00, 0x00, 0x0F, 0xF7, 0xF9, 0xFF, 0xFF, - 0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x07, 0xFB, 0xF3, - 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x07, - 0xFD, 0xE7, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00, - 0x00, 0x03, 0xFE, 0x8F, 0xFF, 0xFF, 0xFF, 0xF1, - 0xF0, 0x00, 0x00, 0x03, 0xFE, 0x1F, 0xFF, 0xFF, - 0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0xFF, 0xBF, - 0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x00, 0x00, - 0xFE, 0xBF, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00, - 0x00, 0x00, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xC7, - 0xC0, 0x00, 0x00, 0x01, 0xFE, 0xBF, 0xFF, 0xFF, - 0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFE, 0x9F, - 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x00, 0x01, - 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, - 0x00, 0x01, 0xFE, 0x87, 0xFF, 0xFF, 0xFF, 0x9F, - 0x80, 0x00, 0x00, 0x01, 0xFD, 0x33, 0xFF, 0xFF, - 0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0xF3, - 0xFF, 0xFF, 0xFF, 0x9E, 0x80, 0x00, 0x00, 0x03, - 0x8B, 0xF9, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00, - 0x00, 0x02, 0x27, 0xF8, 0xFF, 0xFF, 0xFF, 0x99, - 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0xFF, 0xFF, - 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0x8F, 0xF8, - 0xFF, 0xFF, 0xFE, 0x20, 0x60, 0x00, 0x00, 0x00, - 0xE3, 0xF8, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00, - 0x00, 0x00, 0xF8, 0x78, 0xFF, 0xFF, 0xC0, 0x40, - 0x38, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xFF, - 0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x20, - 0x7F, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00, - 0x78, 0x10, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, - 0x07, 0xC0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, - 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x04, - 0x7F, 0xFF, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x10, - 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01, 0x80, - 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x00, 0x01, 0x4F, 0xFF, - 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, - 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x03, 0xF0, - 0x00, 0x00, 0x8F, 0xFF, 0x80, 0x00, 0x00, 0x40, - 0x0F, 0xF0, 0x00, 0x04, 0x1F, 0xFF, 0x80, 0x00, - 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x10, 0x1F, 0xFF, - 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x40, - 0xFF, 0xFF, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xF0, - 0x00, 0x83, 0xFF, 0xFF, 0x81, 0xE0, 0x01, 0xFF, - 0xFF, 0xF8, 0x02, 0x07, 0xFF, 0xFF, 0x80, 0x3F, - 0x07, 0xE0, 0x00, 0x1C, 0x0C, 0x1F, 0xFF, 0xFF, - 0xF8, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0x78, 0x1F, - 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0x00, 0x07, 0x0F, - 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x0C, 0x07, - 0xFF, 0x83, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x26, 0x26, 0x25, 0x28, 0x23, 0x22, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x25, 0x2a, 0x2b, 0x2c, 0x2d, 0x2d, + 0x2d, 0x2e, 0x2c, 0x2b, 0x2a, 0x25, 0x28, 0x22, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x2a, 0x2c, 0x2f, 0x2c, 0x30, 0x30, 0x24, + 0x25, 0x27, 0x2b, 0x2c, 0x2f, 0x31, 0x32, 0x25, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x33, 0x34, 0x35, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x2b, 0x2f, 0x2c, + 0x30, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x2d, 0x27, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x31, + 0x2d, 0x32, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, 0x2a, 0x34, + 0x25, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x23, 0x32, 0x27, 0x21, 0x36, + 0x2a, 0x2d, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x26, 0x2c, 0x35, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2f, 0x37, 0x32, 0x22, + 0x36, 0x35, 0x31, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x22, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x26, 0x38, 0x38, 0x35, 0x25, + 0x36, 0x21, 0x2d, 0x2b, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x39, 0x39, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2b, 0x30, 0x28, 0x22, + 0x36, 0x36, 0x27, 0x34, 0x30, 0x23, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x26, 0x2d, 0x26, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x22, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2d, 0x33, 0x28, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2b, 0x2c, 0x25, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x36, 0x36, + 0x36, 0x21, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x21, 0x23, 0x22, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x28, 0x34, 0x27, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x21, 0x21, 0x24, 0x27, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x27, 0x22, 0x33, 0x24, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x2f, 0x2a, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x30, 0x3a, 0x38, 0x24, 0x24, 0x36, 0x36, 0x36, + 0x23, 0x2f, 0x3b, 0x3c, 0x3d, 0x30, 0x25, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x32, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x23, + 0x3e, 0x3f, 0x40, 0x3a, 0x22, 0x36, 0x36, 0x21, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x3e, 0x23, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x33, 0x28, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x2b, + 0x44, 0x40, 0x46, 0x47, 0x35, 0x36, 0x36, 0x26, + 0x43, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x34, 0x36, 0x4d, + 0x4e, 0x25, 0x2f, 0x46, 0x4a, 0x22, 0x23, 0x32, + 0x4f, 0x50, 0x21, 0x31, 0x51, 0x52, 0x53, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x21, 0x3a, + 0x4d, 0x21, 0x31, 0x54, 0x55, 0x28, 0x30, 0x2b, + 0x4b, 0x4d, 0x36, 0x23, 0x32, 0x50, 0x3f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x38, 0x23, 0x37, + 0x55, 0x36, 0x28, 0x3a, 0x56, 0x57, 0x57, 0x58, + 0x3c, 0x4d, 0x36, 0x36, 0x36, 0x40, 0x40, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x51, 0x23, 0x35, + 0x43, 0x25, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, + 0x5f, 0x60, 0x61, 0x36, 0x31, 0x47, 0x3b, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x2c, 0x25, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x22, + 0x40, 0x62, 0x63, 0x5d, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x66, 0x5e, 0x6a, 0x6b, 0x2a, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x2e, 0x26, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2f, 0x23, 0x36, + 0x6c, 0x63, 0x6d, 0x64, 0x5c, 0x66, 0x69, 0x6e, + 0x6f, 0x70, 0x71, 0x69, 0x69, 0x72, 0x6c, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x34, 0x27, 0x22, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x34, 0x26, 0x73, + 0x74, 0x75, 0x76, 0x64, 0x65, 0x77, 0x69, 0x78, + 0x70, 0x71, 0x71, 0x71, 0x72, 0x5f, 0x5e, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x25, 0x38, 0x2a, 0x23, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x33, 0x79, + 0x63, 0x7a, 0x7b, 0x5c, 0x66, 0x69, 0x6e, 0x7c, + 0x71, 0x71, 0x69, 0x7d, 0x7e, 0x7a, 0x7f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x51, 0x2b, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x32, 0x24, + 0x80, 0x81, 0x64, 0x82, 0x77, 0x69, 0x71, 0x71, + 0x69, 0x83, 0x84, 0x85, 0x7a, 0x85, 0x86, 0x36, + 0x21, 0x2b, 0x23, 0x36, 0x36, 0x39, 0x2e, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2d, 0x33, 0x21, + 0x87, 0x88, 0x89, 0x72, 0x67, 0x66, 0x5f, 0x89, + 0x8a, 0x63, 0x85, 0x8b, 0x8c, 0x8d, 0x41, 0x36, + 0x36, 0x2d, 0x3a, 0x35, 0x36, 0x24, 0x51, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x33, 0x21, + 0x55, 0x8e, 0x8f, 0x8a, 0x7d, 0x5e, 0x90, 0x7e, + 0x75, 0x75, 0x90, 0x62, 0x40, 0x3f, 0x49, 0x23, + 0x36, 0x24, 0x3a, 0x3a, 0x24, 0x36, 0x2e, 0x31, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x33, 0x37, 0x25, 0x22, + 0x3b, 0x50, 0x8e, 0x8f, 0x90, 0x7e, 0x90, 0x63, + 0x74, 0x91, 0x92, 0x42, 0x93, 0x4b, 0x45, 0x2c, + 0x36, 0x36, 0x33, 0x39, 0x21, 0x36, 0x22, 0x51, + 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x27, 0x2e, 0x2e, 0x36, 0x21, + 0x94, 0x3f, 0x50, 0x95, 0x96, 0x8f, 0x8f, 0x97, + 0x8e, 0x42, 0x50, 0x43, 0x47, 0x48, 0x48, 0x98, + 0x21, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, + 0x2e, 0x27, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x2b, 0x38, 0x28, 0x36, 0x32, + 0x4c, 0x4b, 0x50, 0x50, 0x50, 0x42, 0x42, 0x50, + 0x50, 0x40, 0x45, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x23, + 0x2f, 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x32, 0x51, 0x32, 0x28, 0x21, 0x98, + 0x48, 0x47, 0x9a, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x9a, 0x4f, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x93, 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2f, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x23, 0x30, 0x2e, 0x2c, 0x36, 0x21, 0x51, 0x9b, + 0x48, 0x48, 0x52, 0x3f, 0x50, 0x50, 0x40, 0x4b, + 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2d, 0x31, 0x27, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x2c, 0x2d, 0x21, 0x36, 0x28, 0x44, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x46, 0x4f, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x9c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x28, 0x51, 0x39, 0x26, 0x22, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x35, 0x51, 0x28, 0x36, 0x36, 0x9d, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x9b, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4f, 0x28, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x38, 0x2b, 0x25, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x51, 0x25, 0x36, 0x36, 0x23, 0x40, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x9b, 0x99, 0x2b, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x2f, 0x33, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x23, 0x30, 0x34, + 0x27, 0x36, 0x36, 0x36, 0x2a, 0x40, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x99, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x47, 0x52, + 0x46, 0x4f, 0x37, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x30, 0x34, 0x2a, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, 0x39, 0x2c, + 0x36, 0x36, 0x36, 0x21, 0x31, 0x4e, 0x9a, 0x4c, + 0x47, 0x9b, 0x9b, 0x52, 0x46, 0x4f, 0x52, 0x9b, + 0x9b, 0x9b, 0x47, 0x4f, 0x45, 0x9a, 0x93, 0x93, + 0x3f, 0x93, 0x98, 0x28, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x28, + 0x36, 0x36, 0x36, 0x22, 0x38, 0x98, 0x44, 0x99, + 0x9b, 0x48, 0x48, 0x9b, 0x4c, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x52, 0x46, 0x43, 0x93, + 0x40, 0x40, 0x43, 0x53, 0x21, 0x23, 0x33, 0x23, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x2f, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x2b, 0x31, 0x36, + 0x36, 0x22, 0x36, 0x24, 0x9e, 0x4f, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x9f, 0x52, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x47, + 0x4f, 0x9a, 0x3f, 0x46, 0x38, 0x36, 0x21, 0x30, + 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, + 0x25, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2e, 0x33, 0x36, + 0x25, 0x25, 0x36, 0x4d, 0x52, 0x48, 0x48, 0x48, + 0x47, 0x9f, 0x48, 0x48, 0x48, 0xa0, 0xa1, 0xa2, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x47, 0x44, 0x93, 0x43, 0x23, 0x36, 0x36, + 0x26, 0x24, 0x36, 0x36, 0x36, 0x36, 0x28, 0x2f, + 0x2a, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x51, 0x24, 0x36, + 0x2a, 0x36, 0x28, 0x44, 0x48, 0x48, 0x48, 0x48, + 0xa3, 0xa4, 0x48, 0x48, 0x9f, 0xa5, 0xa6, 0x9f, + 0x48, 0x48, 0x48, 0xa2, 0xa7, 0x47, 0x48, 0x48, + 0x48, 0x48, 0x9b, 0x4b, 0x44, 0x37, 0x36, 0x23, + 0x28, 0x30, 0x22, 0x36, 0x36, 0x36, 0x36, 0x2d, + 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x2b, 0x34, 0x36, 0x25, + 0x24, 0x36, 0x4a, 0x48, 0x48, 0x48, 0x48, 0x48, + 0xa8, 0xa1, 0x48, 0x48, 0x9f, 0xa9, 0xa6, 0x9f, + 0x48, 0x48, 0xaa, 0xa1, 0xa5, 0x9f, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x52, 0x3f, 0x21, 0x30, + 0x35, 0x25, 0x30, 0x36, 0x36, 0x36, 0x36, 0x32, + 0x2d, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x26, 0x2e, 0x35, 0x36, 0x2a, + 0x36, 0x24, 0x4f, 0x48, 0x52, 0x52, 0x48, 0x48, + 0xab, 0xac, 0xa0, 0x48, 0xad, 0xa6, 0xa6, 0x9f, + 0x48, 0xa2, 0xa9, 0xa6, 0xa2, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x47, 0x32, 0x30, + 0x2a, 0x23, 0x30, 0x23, 0x36, 0x36, 0x36, 0x21, + 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x2a, 0x51, 0x28, 0x28, 0x25, + 0x36, 0x3a, 0x48, 0x48, 0xae, 0xaf, 0x48, 0x48, + 0xad, 0xac, 0xa1, 0x9f, 0xa2, 0xa9, 0xa9, 0xa2, + 0x48, 0xab, 0x78, 0xa7, 0x48, 0x48, 0x48, 0x48, + 0x9f, 0x48, 0x48, 0x48, 0x48, 0x48, 0x38, 0x21, + 0x36, 0x36, 0x22, 0x27, 0x36, 0x36, 0x36, 0x36, + 0x2e, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x25, 0x2c, 0x34, 0x36, 0x30, 0x21, + 0x23, 0x43, 0x48, 0x48, 0xb0, 0xb1, 0xb2, 0x9f, + 0x48, 0xb3, 0xa5, 0xb3, 0xab, 0xa9, 0xa9, 0xb3, + 0xb4, 0xa9, 0xb5, 0xb0, 0x48, 0x48, 0xa0, 0xa5, + 0xa1, 0xad, 0x48, 0x48, 0x48, 0x48, 0x94, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2e, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x2a, 0x51, 0x25, 0x21, 0x2a, 0x36, + 0x2e, 0x9b, 0x48, 0x48, 0x48, 0xb6, 0xb7, 0xa4, + 0xa2, 0xa7, 0xb5, 0x78, 0x6f, 0x6f, 0x6e, 0x6f, + 0xa9, 0xb5, 0xab, 0x48, 0x9f, 0xab, 0xa9, 0xa1, + 0xaa, 0x48, 0x48, 0x48, 0x48, 0x48, 0x98, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x22, 0x2f, 0x30, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x25, 0x2c, 0x34, 0x36, 0x24, 0x28, 0x36, + 0x54, 0x48, 0x48, 0x48, 0x48, 0xa2, 0xa8, 0xa1, + 0xa5, 0xa6, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, + 0x6f, 0x78, 0xa5, 0xa0, 0xa0, 0x78, 0xa6, 0xa2, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x9a, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x36, 0x36, 0x36, 0x36, + 0x21, 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x32, 0x2f, 0x28, 0x36, 0x27, 0x22, 0x21, + 0x43, 0x48, 0x4b, 0xa2, 0x9f, 0x48, 0xa2, 0xa1, + 0xb8, 0x6e, 0x6e, 0xb5, 0x78, 0x6f, 0x78, 0x78, + 0x6e, 0x6f, 0x78, 0xb5, 0xa6, 0xa1, 0xa0, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4b, 0x21, + 0x36, 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x25, 0x2c, 0x39, 0x36, 0x36, 0x30, 0x22, 0x25, + 0x52, 0x48, 0xa3, 0xb1, 0xb6, 0xb3, 0xaa, 0xac, + 0x68, 0x68, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, + 0x78, 0x6f, 0x6f, 0xb5, 0xa6, 0xb4, 0x48, 0x9f, + 0xb4, 0xb4, 0xa2, 0x9f, 0x48, 0x48, 0x4f, 0x21, + 0x36, 0x36, 0x22, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x30, 0x2d, 0x21, 0x36, 0x36, 0x32, 0x23, 0x2a, + 0x47, 0x48, 0xa2, 0xb6, 0xaf, 0xb9, 0xba, 0x68, + 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x78, + 0x6f, 0x6f, 0xa6, 0x6f, 0xb5, 0xa0, 0xaa, 0xa6, + 0xa6, 0xa9, 0xb2, 0xb3, 0x48, 0x48, 0x4c, 0x22, + 0x36, 0x36, 0x24, 0x23, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0x2e, 0x36, 0x36, 0x23, 0x31, 0x27, 0x39, + 0x9b, 0x48, 0x48, 0x48, 0xb0, 0xb0, 0xba, 0xb8, + 0x68, 0x68, 0x69, 0x78, 0x6f, 0xb5, 0x6f, 0xb5, + 0x78, 0x78, 0x78, 0x78, 0x78, 0xa5, 0xbb, 0xa9, + 0xa5, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4c, 0x23, + 0x36, 0x36, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x2b, 0x39, 0x36, 0x36, 0x36, 0x26, 0x32, 0x31, + 0x9b, 0x48, 0x48, 0x48, 0x48, 0x9f, 0xac, 0x68, + 0xbc, 0x6e, 0x6e, 0x6e, 0xb5, 0x6f, 0x6e, 0x6f, + 0x6f, 0x78, 0x78, 0xb5, 0xb5, 0xa5, 0x9f, 0x9f, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x46, 0x22, + 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x39, 0x36, 0x36, 0x36, 0x36, 0x26, 0x2d, + 0x9b, 0x48, 0x48, 0xb0, 0xaa, 0xb3, 0xbd, 0xb8, + 0xb8, 0x68, 0x6e, 0x6e, 0xb5, 0x6f, 0x78, 0x6e, + 0x78, 0x6f, 0x78, 0x78, 0xb5, 0xa9, 0xa2, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x9a, 0x36, + 0x24, 0x27, 0xbe, 0x24, 0x25, 0x28, 0x21, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x25, + 0x39, 0x4d, 0xbf, 0x84, 0x81, 0x57, 0x21, 0x39, + 0x52, 0x48, 0x48, 0x62, 0xb1, 0xc0, 0xc1, 0xc1, + 0xb8, 0xb8, 0x68, 0xbc, 0x6e, 0x6e, 0x6e, 0x78, + 0x78, 0x78, 0x78, 0x6e, 0x78, 0xa9, 0xa0, 0xab, + 0xb3, 0xa2, 0x48, 0x48, 0x48, 0x48, 0x53, 0x28, + 0x23, 0x36, 0x36, 0x36, 0x21, 0x28, 0x2c, 0x30, + 0x21, 0x38, 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x28, 0x30, + 0x2d, 0xc2, 0x7a, 0xc3, 0xc4, 0xc4, 0x7f, 0x22, + 0x51, 0x52, 0x48, 0x48, 0xb0, 0xaa, 0xa8, 0xbd, + 0x68, 0xb8, 0xb8, 0x68, 0x68, 0x6e, 0x6e, 0x6f, + 0x6e, 0x6e, 0xb5, 0x6e, 0x78, 0xab, 0xab, 0xb5, + 0x78, 0xa6, 0xb3, 0xc5, 0xac, 0xac, 0xc6, 0x61, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x30, 0x32, + 0x25, 0x4d, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x24, 0x26, 0x30, 0x33, 0x31, + 0x4d, 0x91, 0x5b, 0xc3, 0xc4, 0xc4, 0xc4, 0x5a, + 0x21, 0x2e, 0x46, 0x48, 0x48, 0x48, 0xb0, 0x64, + 0xc1, 0xb8, 0xb8, 0xb8, 0x68, 0x71, 0x6e, 0x6e, + 0x6f, 0x71, 0x6f, 0x6f, 0xa6, 0xa0, 0x9f, 0xb4, + 0xb4, 0xa0, 0xa1, 0xb7, 0xc7, 0x69, 0x66, 0xc8, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x26, 0x25, + 0x83, 0xc9, 0x2c, 0x25, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x30, 0x35, 0x2d, 0x2f, 0x37, 0x4a, + 0x60, 0x85, 0xca, 0xcb, 0xc4, 0xc4, 0xc4, 0x82, + 0x86, 0x36, 0x32, 0x3f, 0xa2, 0xa4, 0xa8, 0xa9, + 0xb8, 0xb8, 0xb8, 0xb8, 0x68, 0x6e, 0x6e, 0x6e, + 0x6e, 0x71, 0x6f, 0x71, 0xa6, 0xb4, 0x9f, 0x9f, + 0x48, 0x48, 0x48, 0xcc, 0xc3, 0xc7, 0xcd, 0xce, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x57, + 0x77, 0x66, 0x34, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x23, 0x30, 0x31, 0xcf, 0x91, 0x7e, 0x90, 0x90, + 0x8b, 0x5b, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0x5d, 0xd0, 0x36, 0x24, 0xd1, 0xb1, 0xaf, 0xaa, + 0xba, 0xb8, 0x68, 0x68, 0x68, 0x71, 0x6e, 0x6e, + 0x6e, 0x6f, 0x6e, 0x78, 0xa1, 0xa9, 0xa1, 0xb0, + 0x9f, 0x9b, 0x99, 0xcc, 0x64, 0x5c, 0x8b, 0xd0, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x73, 0x5d, + 0x82, 0x5c, 0xd2, 0x2a, 0x23, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x24, 0x2b, 0xcf, 0x8b, 0x5b, 0x76, 0x5b, 0x5b, + 0x7b, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc7, 0x5e, 0x22, 0x36, 0x21, 0x3a, 0x99, 0x48, + 0xa2, 0xa8, 0xb7, 0xc1, 0xb8, 0x68, 0x68, 0xbc, + 0x68, 0x6e, 0xb5, 0xb4, 0xb4, 0xab, 0xb5, 0xa1, + 0xb0, 0x4f, 0x3f, 0xd3, 0x7b, 0x7b, 0x85, 0x80, + 0xbe, 0x36, 0x36, 0x36, 0x21, 0xd4, 0x7e, 0x7b, + 0x64, 0x64, 0xd5, 0x35, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x31, 0xd6, 0x5b, 0x64, 0xc3, 0xc3, 0xcb, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0x66, 0xd7, 0x36, 0x36, 0x36, 0x2c, 0x4b, + 0xd8, 0xd9, 0xb3, 0xa8, 0xbd, 0xbd, 0xbd, 0xbd, + 0xa9, 0xab, 0xb3, 0xa5, 0xa2, 0x9f, 0xa2, 0xa1, + 0x6a, 0x9a, 0x3f, 0xda, 0x76, 0x76, 0x7a, 0x63, + 0xdb, 0xdc, 0x86, 0xdc, 0xdd, 0x90, 0x5b, 0x64, + 0xc3, 0xc3, 0xde, 0x2d, 0x27, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x26, 0x2d, 0x91, 0x5b, 0x64, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc7, 0x83, 0xce, 0x36, 0x36, 0x36, 0x30, + 0xb1, 0xd9, 0x48, 0xa1, 0xb2, 0xb0, 0xb0, 0xb3, + 0xa2, 0x48, 0xa7, 0xbd, 0xa9, 0xa2, 0x48, 0x9f, + 0xaa, 0x9a, 0x3f, 0xb1, 0x5b, 0x7b, 0xdf, 0x85, + 0x7e, 0x90, 0x63, 0x90, 0x85, 0x5b, 0xc3, 0xc4, + 0xc4, 0xcb, 0x5d, 0xd5, 0x39, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xe0, 0xdf, 0x64, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc7, 0x88, 0x36, 0x36, 0x36, 0x36, + 0x2d, 0x9b, 0x48, 0xb9, 0xaf, 0xa2, 0xa2, 0xb9, + 0xa8, 0x9f, 0x48, 0xa7, 0xb7, 0xd9, 0x48, 0x48, + 0x9b, 0x45, 0x3f, 0xe1, 0x6d, 0x7b, 0xca, 0xdf, + 0x7a, 0x8b, 0x8b, 0x7a, 0x5b, 0x64, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc3, 0xe2, 0x37, 0x35, 0x26, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2e, 0xe0, 0x7a, 0x7b, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc7, 0x72, 0x73, 0x36, 0x36, 0x36, + 0x24, 0x52, 0x48, 0xa3, 0xaf, 0x9f, 0x48, 0xb6, + 0xaf, 0xa2, 0x48, 0x9f, 0xe3, 0xd8, 0x48, 0x48, + 0x48, 0x46, 0x42, 0xd6, 0x7a, 0x7b, 0x64, 0x7b, + 0x76, 0x5b, 0x5b, 0x76, 0x7b, 0xc3, 0xc4, 0xc4, + 0xc4, 0xc4, 0xcb, 0x64, 0xe2, 0x4d, 0x2c, 0x27, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xe4, 0x8b, 0x7b, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc7, 0x89, 0xbe, 0x36, 0x36, + 0x32, 0x47, 0x48, 0x4f, 0xa0, 0x48, 0x48, 0xe3, + 0x92, 0x9f, 0x48, 0x9f, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4b, 0x2f, 0x8f, 0x7a, 0x7b, 0xc3, 0xcb, + 0xc3, 0x64, 0x64, 0xc3, 0xc3, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0x5d, 0xe5, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xe4, 0x85, 0x7b, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0x66, 0x57, 0x27, 0x4d, + 0x4b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x99, 0x34, 0xbe, 0xdb, 0x7a, 0x7b, 0xc3, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xe4, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xe4, 0x85, 0x7b, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc7, 0x5f, 0x92, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x44, + 0x35, 0x36, 0xce, 0xdd, 0x7a, 0x7b, 0xcb, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0xc3, 0xe1, + 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x30, 0x2f, 0xd6, 0x8b, 0x7b, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0x66, 0x89, 0x45, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x4e, 0x25, + 0x36, 0x36, 0x61, 0xdb, 0x6d, 0x64, 0xcb, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0x7b, 0xdf, 0xe5, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xe6, 0x63, 0xdf, 0xc3, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0x72, 0x81, 0xe7, + 0x46, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x3f, 0x2c, 0x36, 0x36, + 0x36, 0x36, 0xe8, 0x8f, 0x6d, 0x64, 0xcb, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc3, 0xca, 0x8b, 0xcf, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x96, 0x75, 0xca, 0xc3, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0x7b, 0x81, 0xdb, + 0x73, 0x3b, 0x44, 0x9b, 0x48, 0x48, 0x48, 0x9b, + 0x99, 0x43, 0x94, 0x2c, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x73, 0xdb, 0x7a, 0x7b, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0x64, 0x76, 0x7a, 0x91, 0xd5, 0x31, 0x30, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x39, 0x97, 0x75, 0xdf, 0x7b, 0x64, 0xc3, 0xc3, + 0xcb, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0x7b, 0x7a, 0xe9, + 0xea, 0x36, 0x21, 0x26, 0x2b, 0x39, 0x33, 0x30, + 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xea, 0xdd, 0x8b, 0x7b, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0x64, 0x64, + 0x76, 0x85, 0xe0, 0xd5, 0x34, 0x2b, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xeb, 0x63, 0x7e, 0x7a, 0x6d, 0xdf, 0x5b, + 0x76, 0x7b, 0x64, 0x64, 0xc3, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0x76, 0x85, 0xdb, + 0x79, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xec, 0xdd, 0x75, 0x76, 0xc3, 0xc4, + 0xc4, 0xc4, 0xcb, 0xc3, 0x64, 0x76, 0xdf, 0x8b, + 0xd6, 0xd5, 0x2f, 0x35, 0x30, 0x24, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x31, 0xed, 0xeb, 0xdd, 0x74, 0x63, 0x90, + 0x7e, 0x75, 0x8b, 0x6d, 0xdf, 0x76, 0x64, 0xc3, + 0xcb, 0xcb, 0xcb, 0xcb, 0x64, 0x7a, 0x84, 0xee, + 0x79, 0xbe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xea, 0xee, 0x63, 0x6d, 0x7b, 0x64, + 0xcb, 0xc3, 0x64, 0x7b, 0xdf, 0x75, 0x63, 0x96, + 0x38, 0x39, 0x2a, 0x24, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x27, 0x35, 0x2d, 0x41, 0xd5, 0xe7, 0x8f, + 0xdb, 0xdd, 0xe9, 0x74, 0x84, 0x90, 0x85, 0x6d, + 0x5b, 0x7b, 0x7b, 0xca, 0x6d, 0x90, 0xdb, 0xef, + 0xec, 0x22, 0x36, 0x36, 0x28, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x25, 0x36, + 0x36, 0x21, 0xd4, 0x80, 0xe9, 0x7e, 0x6d, 0x76, + 0xca, 0x76, 0x6d, 0x85, 0x63, 0xdb, 0xd5, 0x34, + 0x33, 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x24, 0x27, 0x2a, 0x35, 0x2e, 0x2f, + 0x41, 0xf0, 0xf1, 0x6c, 0x80, 0xee, 0xdb, 0x74, + 0x84, 0x90, 0x75, 0x7e, 0x74, 0x8f, 0xef, 0x79, + 0xe8, 0x2b, 0x9d, 0x41, 0x2f, 0x34, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x34, 0x2f, 0x38, + 0x4d, 0x37, 0xf2, 0xf3, 0x8f, 0x74, 0x63, 0x7e, + 0x75, 0x7e, 0x63, 0xe9, 0x88, 0xe6, 0x31, 0x2a, + 0x24, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x22, 0x23, 0x24, 0x26, 0x30, + 0x33, 0x39, 0x2e, 0x51, 0x41, 0xd2, 0x6c, 0xf3, + 0x80, 0xee, 0xee, 0xee, 0xf4, 0xf3, 0xd7, 0xf5, + 0x41, 0x34, 0x35, 0x32, 0x30, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x30, 0x2a, + 0x2b, 0x34, 0xf6, 0xec, 0xf7, 0x8f, 0xdd, 0xe9, + 0xe9, 0xdd, 0xee, 0x6c, 0x41, 0x39, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, + 0x28, 0x24, 0x26, 0x2a, 0x33, 0x2c, 0x2f, 0x41, + 0xf8, 0xd7, 0x79, 0x79, 0x79, 0xec, 0xf9, 0x51, + 0x39, 0x30, 0x24, 0x23, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0x22, 0x23, + 0x24, 0x2a, 0x31, 0xfa, 0xea, 0x79, 0xf3, 0x80, + 0xf7, 0xdc, 0xfb, 0x2f, 0x35, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x28, 0x25, 0x30, 0x2b, + 0x31, 0x2f, 0xf6, 0xfa, 0xfa, 0x2f, 0x2e, 0x33, + 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x27, 0x35, 0x34, 0xfa, 0xfa, 0xfa, + 0xfc, 0xf6, 0x2e, 0x33, 0x25, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x23, 0x28, + 0x26, 0x30, 0x32, 0x2b, 0x33, 0x2a, 0x26, 0x28, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x25, 0x30, 0x33, 0x35, 0x35, + 0x2b, 0x2a, 0x26, 0x28, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x21, 0x22, 0x23, 0x28, 0x28, 0x23, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x23, 0x28, 0x24, 0x24, + 0x28, 0x23, 0x22, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }; -unsigned char linux_logo16_red[1]; -unsigned char linux_logo16_green[1]; -unsigned char linux_logo16_blue[1]; unsigned char linux_logo16[1]; -#else +#endif /* INCLUDE_LINUX_LOGO_DATA */ -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; -extern unsigned char linux_logo16[]; +#include -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-sparc/termios.h linux/include/asm-sparc/termios.h --- v2.4.5/linux/include/asm-sparc/termios.h Fri Feb 9 11:37:03 2001 +++ linux/include/asm-sparc/termios.h Tue Jun 5 18:11:42 2001 @@ -1,4 +1,4 @@ -/* $Id: termios.h,v 1.31 2001/02/05 05:54:29 davem Exp $ */ +/* $Id: termios.h,v 1.32 2001/06/01 08:12:11 davem Exp $ */ #ifndef _SPARC_TERMIOS_H #define _SPARC_TERMIOS_H @@ -70,6 +70,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 /* synchronous PPP */ +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/asm-sparc64/audioio.h linux/include/asm-sparc64/audioio.h --- v2.4.5/linux/include/asm-sparc64/audioio.h Tue Oct 10 10:33:52 2000 +++ linux/include/asm-sparc64/audioio.h Tue Jun 5 18:11:44 2001 @@ -428,8 +428,6 @@ extern int unregister_sparcaudio_driver(struct sparcaudio_driver *, int); extern void sparcaudio_output_done(struct sparcaudio_driver *, int); extern void sparcaudio_input_done(struct sparcaudio_driver *, int); -extern int amd7930_init(void); -extern int cs4231_init(void); #endif diff -u --recursive --new-file v2.4.5/linux/include/asm-sparc64/auxio.h linux/include/asm-sparc64/auxio.h --- v2.4.5/linux/include/asm-sparc64/auxio.h Mon Dec 20 22:05:52 1999 +++ linux/include/asm-sparc64/auxio.h Tue Jun 5 18:11:44 2001 @@ -1,4 +1,4 @@ -/* $Id: auxio.h,v 1.2 1999/09/21 14:39:25 davem Exp $ +/* $Id: auxio.h,v 1.3 2001/06/05 08:16:34 davem Exp $ * auxio.h: Definitions and code for the Auxiliary I/O register. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -7,6 +7,7 @@ #define _SPARC64_AUXIO_H #include +#include /* FIXME: All of this should be checked for sun4u. It has /sbus/auxio, but I don't know whether it is the same and don't have a floppy */ diff -u --recursive --new-file v2.4.5/linux/include/asm-sparc64/bitops.h linux/include/asm-sparc64/bitops.h --- v2.4.5/linux/include/asm-sparc64/bitops.h Thu Apr 26 22:17:26 2001 +++ linux/include/asm-sparc64/bitops.h Tue Jun 5 18:11:44 2001 @@ -1,4 +1,4 @@ -/* $Id: bitops.h,v 1.33 2001/04/24 01:09:12 davem Exp $ +/* $Id: bitops.h,v 1.34 2001/05/27 00:09:29 davem Exp $ * bitops.h: Bit string operations on the V9. * * Copyright 1996, 1997 David S. Miller (davem@caip.rutgers.edu) @@ -20,13 +20,46 @@ #define clear_bit(nr,addr) ((void)___test_and_clear_bit(nr,addr)) #define change_bit(nr,addr) ((void)___test_and_change_bit(nr,addr)) -/* "non-atomic" versions, nothing special for now... */ -#define __set_bit(X,Y) set_bit(X,Y) -#define __clear_bit(X,Y) clear_bit(X,Y) -#define __change_bit(X,Y) change_bit(X,Y) -#define __test_and_set_bit(X,Y) test_and_set_bit(X,Y) -#define __test_and_clear_bit(X,Y) test_and_clear_bit(X,Y) -#define __test_and_change_bit(X,Y) test_and_change_bit(X,Y) +/* "non-atomic" versions... */ +#define __set_bit(X,Y) \ +do { unsigned long __nr = (X); \ + long *__m = ((long *) (Y)) + (__nr >> 6); \ + *__m |= (1UL << (__nr & 63)); \ +} while (0) +#define __clear_bit(X,Y) \ +do { unsigned long __nr = (X); \ + long *__m = ((long *) (Y)) + (__nr >> 6); \ + *__m &= ~(1UL << (__nr & 63)); \ +} while (0) +#define __change_bit(X,Y) \ +do { unsigned long __nr = (X); \ + long *__m = ((long *) (Y)) + (__nr >> 6); \ + *__m ^= (1UL << (__nr & 63)); \ +} while (0) +#define __test_and_set_bit(X,Y) \ +({ unsigned long __nr = (X); \ + long *__m = ((long *) (Y)) + (__nr >> 6); \ + long __old = *__m; \ + long __mask = (1UL << (__nr & 63)); \ + *__m = (__old | __mask); \ + ((__old & __mask) != 0); \ +}) +#define __test_and_clear_bit(X,Y) \ +({ unsigned long __nr = (X); \ + long *__m = ((long *) (Y)) + (__nr >> 6); \ + long __old = *__m; \ + long __mask = (1UL << (__nr & 63)); \ + *__m = (__old & ~__mask); \ + ((__old & __mask) != 0); \ +}) +#define __test_and_change_bit(X,Y) \ +({ unsigned long __nr = (X); \ + long *__m = ((long *) (Y)) + (__nr >> 6); \ + long __old = *__m; \ + long __mask = (1UL << (__nr & 63)); \ + *__m = (__old ^ __mask); \ + ((__old & __mask) != 0); \ +}) #define smp_mb__before_clear_bit() do { } while(0) #define smp_mb__after_clear_bit() do { } while(0) diff -u --recursive --new-file v2.4.5/linux/include/asm-sparc64/linux_logo.h linux/include/asm-sparc64/linux_logo.h --- v2.4.5/linux/include/asm-sparc64/linux_logo.h Tue Aug 4 16:03:35 1998 +++ linux/include/asm-sparc64/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -23,1025 +23,912 @@ #define linux_logo_banner "Linux/UltraSPARC version " UTS_RELEASE -#define LINUX_LOGO_COLORS 219 +#define __HAVE_ARCH_LINUX_LOGO +#define __HAVE_ARCH_LINUX_LOGO16 + +#define LINUX_LOGO_COLORS 221 #ifdef INCLUDE_LINUX_LOGO_DATA unsigned char linux_logo_red[] __initdata = { - 0x03, 0x9E, 0xEC, 0xEE, 0xC4, 0xDA, 0x50, 0xC9, - 0xC5, 0xED, 0x65, 0xE3, 0xE3, 0xF4, 0x24, 0xA4, - 0xEC, 0xEE, 0x94, 0xE5, 0xE3, 0x6A, 0xA6, 0xC4, - 0xDC, 0xE5, 0x13, 0xF3, 0xD1, 0xFD, 0xE2, 0xDB, - 0xA0, 0xC2, 0xEC, 0xB8, 0xC2, 0xD5, 0xF2, 0xF4, - 0xC5, 0x3E, 0xF1, 0x1B, 0x55, 0xF5, 0xCF, 0xF7, - 0xA9, 0xB4, 0xEB, 0x6C, 0x0A, 0x74, 0xB4, 0xF7, - 0xF0, 0xF5, 0xD4, 0xF2, 0xCE, 0xF5, 0xC7, 0x26, - 0x5B, 0xF4, 0xBC, 0x7F, 0xAB, 0x82, 0x94, 0xE5, - 0xFC, 0x3A, 0xF2, 0xFD, 0xF0, 0x1C, 0xEF, 0xD4, - 0xF3, 0x0F, 0xED, 0xF7, 0xC9, 0x49, 0xC3, 0xBA, - 0xC8, 0xD4, 0xE7, 0xF3, 0xF5, 0xA7, 0xEC, 0xF9, - 0xFA, 0x0A, 0xF5, 0xCF, 0xFC, 0xEA, 0xE1, 0xA6, - 0xD6, 0xBC, 0xF8, 0xF7, 0xB4, 0xEB, 0xDC, 0x84, - 0xCE, 0xBA, 0x45, 0xD6, 0x86, 0x50, 0x96, 0xC6, - 0x8C, 0x6E, 0xE8, 0x60, 0x3C, 0x70, 0xF0, 0x93, - 0x7C, 0xDA, 0xDA, 0x9C, 0xBA, 0x6D, 0x4D, 0x2B, - 0x2F, 0x8B, 0xE0, 0xCC, 0xDA, 0x5C, 0x3D, 0xEE, - 0xDB, 0x46, 0xAC, 0x96, 0xCE, 0xD1, 0xE3, 0xF1, - 0x96, 0x7A, 0x80, 0xB2, 0xBA, 0xB6, 0xD2, 0x1E, - 0x7E, 0xAA, 0xC4, 0xF0, 0x96, 0x65, 0x9E, 0xC2, - 0xAA, 0xF5, 0xF2, 0xE9, 0xE6, 0xD1, 0x35, 0xC7, - 0xF6, 0xB6, 0xE8, 0x82, 0xBE, 0xC2, 0xF2, 0x9E, - 0xC7, 0xB4, 0x0F, 0xF7, 0xE8, 0xD8, 0xCC, 0x9C, - 0xD8, 0xD8, 0xA0, 0xEA, 0xC6, 0xA8, 0xE0, 0xEC, - 0xD1, 0xF7, 0xF4, 0xFC, 0x75, 0xBD, 0xDC, 0xDD, - 0xCC, 0xE1, 0xFA, 0xEE, 0xAA, 0xEC, 0xF2, 0xB8, - 0xE2, 0xCD, 0x87 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x65, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x76, 0x79, + 0x62, 0x36, 0x9a, 0xe2, 0xec, 0xe1, 0xb8, 0xd7, + 0xaf, 0x25, 0xbc, 0xc0, 0xef, 0xea, 0xe8, 0xe8, + 0xf5, 0xf1, 0xda, 0xd3, 0x79, 0xdb, 0xf4, 0xf6, + 0xf6, 0xf6, 0xe2, 0x3d, 0xb4, 0xce, 0xe6, 0xee, + 0xf6, 0x68, 0xd8, 0xec, 0xf5, 0xc6, 0xc8, 0x9c, + 0x89, 0xd2, 0xee, 0xcb, 0xb9, 0xd2, 0x66, 0x5e, + 0x8b, 0xbe, 0xa8, 0xd5, 0xca, 0xb6, 0xae, 0x9c, + 0xc5, 0xbe, 0xbe, 0xca, 0x90, 0xb2, 0x9a, 0xa8, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0xfe, + 0xf6, 0xec, 0xfe, 0xd2, 0xea, 0xf5, 0xf2, 0xf2, + 0xe9, 0xee, 0xf6, 0xf2, 0xee, 0xf6, 0xda, 0xd4, + 0xfa, 0xca, 0xf2, 0xf6, 0xfe, 0xf2, 0xda, 0xe4, + 0xf6, 0xdd, 0xf2, 0xee, 0xfa, 0xf0, 0x12, 0x4a, + 0xd6, 0xf2, 0x8e, 0xf2, 0xf6, 0xf6, 0xb5, 0xf1, + 0x26, 0x9a, 0xea, 0xf6, 0xe0, 0xd2, 0x16, 0x9a, + 0x2e, 0xd2, 0x70, 0xd6, 0x46, 0x7c, 0xb4, 0x62, + 0xda, 0xee, 0xd6, 0xa3, 0x74, 0xa7, 0xa2, 0xe0, + 0xae, 0xbe, 0xce, 0xe2, 0xa3, 0x8e, 0x6d, 0x8e, + 0x32, 0xaf, 0x50, 0x9e, 0x5b, 0x8a, 0x98, 0x82, + 0x7a, 0x82, 0x56, 0x7c, 0x8a, 0x56, 0x5e, 0x86, + 0x6a, 0x52, 0x59, 0x64, 0x5e, }; unsigned char linux_logo_green[] __initdata = { - 0x03, 0x88, 0xC4, 0xE2, 0x85, 0xC2, 0x44, 0xA3, - 0xA9, 0xD3, 0x65, 0xA6, 0xC5, 0xF3, 0x24, 0xA4, - 0xB4, 0xD6, 0x63, 0xD5, 0xB7, 0x44, 0x86, 0x94, - 0xC2, 0xE4, 0x14, 0xB6, 0xD2, 0xFB, 0xD4, 0xB2, - 0x73, 0x96, 0xDB, 0x92, 0xC2, 0x95, 0xC2, 0xDA, - 0xA4, 0x36, 0xD4, 0x0E, 0x55, 0xF4, 0xC4, 0xE9, - 0x75, 0xB4, 0xBC, 0x52, 0x0A, 0x74, 0x84, 0xEB, - 0xDC, 0xDA, 0xA2, 0xD6, 0x9B, 0xBD, 0xB7, 0x12, - 0x44, 0xCA, 0x8C, 0x65, 0x7B, 0x54, 0x94, 0xAB, - 0xF4, 0x25, 0xC4, 0xFD, 0xE4, 0x1C, 0xDD, 0xAB, - 0xBD, 0x06, 0xCB, 0xD6, 0xCA, 0x33, 0x8C, 0xA2, - 0x92, 0x9C, 0xBC, 0xDB, 0xCD, 0x6E, 0xEC, 0xEE, - 0xBC, 0x03, 0xDA, 0xCE, 0xF4, 0xB6, 0xDB, 0x92, - 0xAD, 0xBC, 0xDE, 0xD5, 0x7B, 0xAE, 0x9D, 0x84, - 0xB6, 0x96, 0x44, 0xBA, 0x6E, 0x3C, 0x7A, 0xB2, - 0x8C, 0x4C, 0xCE, 0x4C, 0x3C, 0x5A, 0xCA, 0x6D, - 0x7C, 0xCE, 0xDA, 0x9C, 0xAA, 0x6D, 0x4D, 0x2B, - 0x1B, 0x5E, 0xCB, 0xAC, 0xBE, 0x5C, 0x2E, 0xDC, - 0xBD, 0x3E, 0xAC, 0x82, 0xB6, 0xBE, 0xD3, 0xBD, - 0x72, 0x62, 0x6C, 0x82, 0x92, 0x9E, 0xB0, 0x13, - 0x4A, 0x8E, 0xBE, 0xCE, 0x86, 0x45, 0x6B, 0xAA, - 0x9A, 0xC5, 0xC6, 0xDA, 0xC5, 0xC4, 0x34, 0x9B, - 0xCC, 0xAC, 0xC4, 0x76, 0x9A, 0x9E, 0xEE, 0x62, - 0xC6, 0x76, 0x0D, 0xE4, 0xDA, 0xD5, 0xA5, 0x92, - 0xCD, 0xB2, 0x7C, 0xCC, 0xBE, 0x7E, 0xDC, 0xD6, - 0xB9, 0xE3, 0xD4, 0xF6, 0x55, 0x82, 0xA4, 0xAA, - 0x8D, 0xBB, 0xCE, 0xD5, 0x8A, 0xDB, 0xD4, 0x8B, - 0xCA, 0x93, 0x63 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x62, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x62, 0x5c, + 0x4e, 0x26, 0x72, 0xaa, 0xba, 0xaf, 0x90, 0xae, + 0x92, 0x1a, 0xa4, 0x85, 0xb6, 0xbe, 0xc3, 0xc8, + 0xcf, 0xd0, 0xc2, 0xce, 0x57, 0xa2, 0xd6, 0xda, + 0xda, 0xd7, 0xb8, 0x2a, 0x7b, 0x91, 0xae, 0xca, + 0xda, 0x45, 0x9e, 0xb2, 0xd7, 0x9b, 0x90, 0x76, + 0x5c, 0xa2, 0xbe, 0xa6, 0x85, 0x96, 0x4e, 0x46, + 0x66, 0x92, 0x7a, 0x9a, 0x96, 0x9d, 0x9a, 0x6b, + 0x8a, 0x8e, 0xb2, 0xca, 0x90, 0xa6, 0x79, 0x7c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0xfa, + 0xea, 0xd7, 0xf6, 0xbc, 0xda, 0xde, 0xda, 0xe6, + 0xca, 0xd8, 0xea, 0xe0, 0xcc, 0xf2, 0xce, 0xb2, + 0xee, 0xa2, 0xd6, 0xe6, 0xf6, 0xd7, 0xc5, 0xb8, + 0xc6, 0xb9, 0xce, 0xde, 0xce, 0xc6, 0x0e, 0x36, + 0xae, 0xbe, 0x86, 0xba, 0xbe, 0xe6, 0x8e, 0xc4, + 0x1e, 0x8e, 0xae, 0xba, 0xb2, 0xa6, 0x12, 0x7a, + 0x20, 0xc6, 0x64, 0xaa, 0x2f, 0x70, 0x85, 0x46, + 0xce, 0xd6, 0xa6, 0x6e, 0x51, 0x72, 0x92, 0xa6, + 0x87, 0x96, 0xa2, 0xd6, 0x85, 0x7a, 0x6a, 0x6e, + 0x22, 0x76, 0x36, 0x76, 0x3c, 0x6e, 0x63, 0x53, + 0x66, 0x62, 0x42, 0x50, 0x56, 0x42, 0x56, 0x56, + 0x56, 0x3e, 0x51, 0x52, 0x56, }; unsigned char linux_logo_blue[] __initdata = { - 0x04, 0x28, 0x10, 0x8C, 0x0B, 0x84, 0x14, 0x1A, - 0x77, 0x1F, 0x64, 0x0E, 0x85, 0xD2, 0x24, 0xA4, - 0x0F, 0x54, 0x0C, 0x7C, 0x3F, 0x04, 0x20, 0x0D, - 0x54, 0xDF, 0x14, 0x0D, 0xD1, 0xE9, 0xB0, 0x11, - 0x0A, 0x40, 0x57, 0x14, 0xC3, 0x0C, 0x04, 0x12, - 0x50, 0x0C, 0x7D, 0x05, 0x55, 0xF2, 0xBA, 0xC7, - 0x09, 0xB4, 0x0E, 0x24, 0x0B, 0x74, 0x0C, 0xB6, - 0x80, 0x48, 0x10, 0x34, 0x0F, 0x0C, 0xA0, 0x04, - 0x19, 0x10, 0x0E, 0x14, 0x0E, 0x05, 0x94, 0x0E, - 0xCA, 0x0B, 0x46, 0xFB, 0xB4, 0x1C, 0x9B, 0x1A, - 0x21, 0x09, 0x14, 0x4D, 0xCB, 0x08, 0x11, 0x7C, - 0x20, 0x10, 0x24, 0x66, 0x79, 0x07, 0xEA, 0xC9, - 0x0C, 0x08, 0x38, 0xC4, 0xD8, 0x24, 0xBE, 0x6C, - 0x51, 0xBB, 0x8C, 0x36, 0x0A, 0x0F, 0x0C, 0x84, - 0x3C, 0x54, 0x44, 0x7C, 0x28, 0x0E, 0x28, 0x7F, - 0x8C, 0x0F, 0x54, 0x24, 0x3C, 0x18, 0x54, 0x17, - 0x7C, 0x9C, 0xDA, 0x9C, 0x7C, 0x6C, 0x4D, 0x2C, - 0x09, 0x0E, 0x8A, 0x50, 0x4C, 0x5B, 0x14, 0xAC, - 0x19, 0x3C, 0xAC, 0x5C, 0x64, 0x97, 0x94, 0x37, - 0x29, 0x3C, 0x44, 0x3C, 0x2C, 0x7C, 0x70, 0x07, - 0x04, 0x29, 0xB2, 0x64, 0x74, 0x07, 0x07, 0x2C, - 0x74, 0x2E, 0x6C, 0xA4, 0x29, 0x9E, 0x34, 0x27, - 0x2F, 0x98, 0x48, 0x5C, 0x0C, 0x5C, 0xE8, 0x04, - 0xC2, 0x0C, 0x0A, 0xB2, 0x74, 0xCB, 0x46, 0x78, - 0xB4, 0x5C, 0x18, 0x80, 0x8C, 0x24, 0xD9, 0xAC, - 0x87, 0x99, 0x1D, 0xE8, 0x14, 0x0D, 0x10, 0x17, - 0x0A, 0x67, 0x3C, 0x68, 0x3C, 0x69, 0x90, 0x22, - 0x6C, 0x0D, 0x17 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x01, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x06, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x59, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x2e, 0x08, + 0x0a, 0x06, 0x0a, 0x0b, 0x0b, 0x0f, 0x0c, 0x0f, + 0x3d, 0x09, 0x73, 0x09, 0x0d, 0x0a, 0x10, 0x1e, + 0x2d, 0x13, 0x86, 0xba, 0x19, 0x0a, 0x36, 0x3c, + 0x26, 0x14, 0x0d, 0x06, 0x07, 0x0a, 0x0b, 0x0f, + 0x4a, 0x06, 0x0a, 0x0c, 0x2b, 0x0a, 0x0b, 0x0a, + 0x06, 0x0a, 0x0a, 0x11, 0x0b, 0x0a, 0x0a, 0x1e, + 0x0f, 0x0d, 0x0a, 0x0b, 0x22, 0x6a, 0x72, 0x0b, + 0x0b, 0x22, 0x90, 0xca, 0x90, 0x92, 0x3c, 0x2c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0xea, + 0xb6, 0x7c, 0xda, 0x8e, 0xa6, 0x87, 0x66, 0xb6, + 0x81, 0x6a, 0xc6, 0x9a, 0x5b, 0xd2, 0xb6, 0x6a, + 0xca, 0x45, 0x92, 0xb2, 0xca, 0x52, 0x8a, 0x3e, + 0x2e, 0x66, 0x66, 0xae, 0x3e, 0x47, 0x06, 0x0e, + 0x52, 0x36, 0x6a, 0x0e, 0x0e, 0xbe, 0x2c, 0x0e, + 0x0a, 0x5a, 0x0d, 0x0e, 0x3e, 0x0a, 0x06, 0x2e, + 0x06, 0x9e, 0x4e, 0x36, 0x06, 0x58, 0x24, 0x06, + 0x9e, 0xae, 0x3a, 0x08, 0x08, 0x07, 0x5e, 0x0a, + 0x32, 0x2e, 0x2a, 0xb2, 0x43, 0x48, 0x5f, 0x2e, + 0x06, 0x06, 0x07, 0x24, 0x06, 0x32, 0x06, 0x06, + 0x46, 0x2e, 0x22, 0x06, 0x06, 0x1e, 0x4c, 0x06, + 0x3a, 0x22, 0x42, 0x34, 0x42, }; unsigned char linux_logo[] __initdata = { - 0xD8, 0xA3, 0x98, 0x98, 0xA3, 0xB2, 0x2F, 0x2F, - 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, 0x2F, 0xA3, - 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, 0x51, 0x2F, - 0x98, 0x55, 0x8F, 0x2F, 0x89, 0x44, 0x89, 0x51, - 0xB2, 0x2F, 0x66, 0xA3, 0x2F, 0x2F, 0x66, 0x66, - 0xA3, 0xB2, 0xB2, 0xB2, 0x89, 0xD8, 0x44, 0x44, - 0xD8, 0x83, 0xD8, 0xA3, 0x98, 0x98, 0xA3, 0xB2, - 0x2F, 0x2F, 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, - 0x2F, 0xA3, 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, - 0x51, 0x2F, 0x98, 0x55, 0x8F, 0x2F, 0x89, 0x44, - 0xA3, 0x55, 0x55, 0x98, 0x2F, 0x2F, 0x2F, 0xA3, - 0x66, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x98, - 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, 0xB2, 0x2F, - 0x66, 0x66, 0xA3, 0x51, 0x89, 0x51, 0xB2, 0x2F, - 0x2F, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, - 0xB2, 0xB2, 0x2F, 0x2F, 0xB2, 0x51, 0x51, 0x51, - 0x51, 0x51, 0xA3, 0x55, 0x55, 0x98, 0x2F, 0x2F, - 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x98, 0x66, 0x66, - 0x66, 0x98, 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, - 0xB2, 0x2F, 0x66, 0x66, 0xA3, 0x51, 0x89, 0x51, - 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, 0x2F, 0xA3, - 0x66, 0x66, 0x98, 0x8F, 0x66, 0x66, 0x66, 0x98, - 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, 0xB2, 0x2F, - 0xA3, 0xA3, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, - 0xA3, 0x66, 0x98, 0xA3, 0x51, 0xB2, 0x2F, 0xA3, - 0xB2, 0x51, 0x51, 0xB2, 0xB2, 0x51, 0xB2, 0xB2, - 0xB2, 0x2F, 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, - 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x8F, 0x66, 0x66, - 0x66, 0x98, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, - 0xB2, 0x2F, 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0xA0, 0xA5, 0x55, 0x66, 0xB2, 0x51, 0xB2, 0xA3, - 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x98, 0x98, - 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, 0xB2, 0xA3, - 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, - 0x66, 0x98, 0xB2, 0x4C, 0x54, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xCE, 0x2F, 0xB2, 0x2F, 0x2F, - 0xA3, 0x98, 0xA0, 0xA5, 0x55, 0x66, 0xB2, 0x51, - 0xB2, 0xA3, 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, - 0x98, 0x98, 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, - 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0xA0, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0xB2, 0x2F, - 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, - 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0xA3, - 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0x2F, 0xA0, 0xDA, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x9C, 0xB2, 0xA3, - 0x66, 0x98, 0xA0, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, - 0xB2, 0x2F, 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, - 0x66, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, - 0x2F, 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0xA3, - 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, - 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x2F, 0x2F, - 0xB2, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, 0xA3, 0x66, - 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xB2, - 0x9C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xDA, 0x3A, 0x20, 0x54, 0x55, - 0xA3, 0x98, 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, - 0xB2, 0xA3, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, - 0x2F, 0x2F, 0xB2, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, - 0xA3, 0x66, 0x66, 0x66, 0x2F, 0xA3, 0x2F, 0x2F, - 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x66, - 0x8F, 0x8F, 0x8F, 0x66, 0xA3, 0xA3, 0xB2, 0xB2, - 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, - 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xAD, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xA7, 0x4C, 0xCE, 0xDA, 0x20, - 0xA6, 0x2F, 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, - 0x2F, 0x66, 0x8F, 0x8F, 0x8F, 0x66, 0xA3, 0xA3, - 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0xB2, 0x2F, 0x98, - 0x8F, 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, - 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x51, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xCE, 0x55, 0xAD, 0xA7, 0x54, - 0x20, 0x8F, 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0xB2, - 0x2F, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0xA3, 0xB2, - 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, - 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0x8F, 0x66, 0x2F, 0xB2, 0x51, 0x2F, 0x98, - 0xA0, 0x8F, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0x66, - 0x98, 0x98, 0x98, 0x66, 0x98, 0x66, 0x55, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xCE, 0x4C, 0x9C, 0x2E, 0xDA, - 0x20, 0xDA, 0x51, 0x8F, 0x66, 0x2F, 0xB2, 0x51, - 0x2F, 0x98, 0xA0, 0x8F, 0x66, 0xA3, 0x2F, 0x51, - 0x51, 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, - 0x66, 0x66, 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, - 0x51, 0x66, 0x2F, 0xB2, 0x51, 0xB2, 0xA3, 0xA0, - 0xA0, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0xA3, - 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x66, 0x98, 0x98, - 0x98, 0x98, 0x98, 0x66, 0x66, 0xB2, 0x6D, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6D, 0x3A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0xA5, 0x66, 0x2F, 0xB2, 0x51, 0xB2, - 0xA3, 0xA0, 0xA0, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, - 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x66, - 0x98, 0x98, 0x8F, 0x98, 0x66, 0x66, 0x66, 0x66, - 0x51, 0x2F, 0xB2, 0x51, 0x51, 0x2F, 0x66, 0xA0, - 0x8F, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x2F, 0x66, - 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x2F, 0xA3, 0x2F, 0x2F, 0x51, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0xDA, 0x51, 0xB2, 0x51, 0x51, 0x2F, - 0x66, 0xA0, 0x8F, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, - 0x2F, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0x51, 0x2F, 0xB2, 0x51, 0x2F, 0xA3, 0x8F, 0x8F, - 0x98, 0xA3, 0xB2, 0xB2, 0x2F, 0xA3, 0x98, 0x66, - 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x2F, - 0xB2, 0xB2, 0x51, 0xB2, 0xB2, 0x66, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xA3, 0xB2, 0x51, 0x2F, 0xA3, - 0x8F, 0x8F, 0x98, 0xA3, 0xB2, 0xB2, 0x2F, 0xA3, - 0x98, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, - 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0xA3, 0x2F, 0x66, 0x98, 0x8F, 0x98, - 0xA3, 0x2F, 0x2F, 0xA3, 0x98, 0x98, 0x98, 0x98, - 0x66, 0x98, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0xB2, - 0x51, 0x51, 0x51, 0xB2, 0xB2, 0x8F, 0x20, 0x20, - 0x20, 0x54, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x6D, 0x6D, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x4C, 0xA3, 0x2F, 0x66, 0x98, - 0x8F, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, 0x98, 0x98, - 0x98, 0x98, 0x66, 0x98, 0x66, 0x98, 0x66, 0xA3, - 0x2F, 0xB2, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x98, - 0x2F, 0x2F, 0x2F, 0x66, 0x8F, 0x8F, 0x98, 0xA3, - 0x66, 0x66, 0x8F, 0x98, 0x98, 0x66, 0x2F, 0xB2, - 0x51, 0xB2, 0x2F, 0xA3, 0xA3, 0xA0, 0x20, 0x20, - 0xDA, 0x2E, 0x3A, 0xA7, 0x20, 0x20, 0x20, 0x20, - 0x20, 0xCE, 0x2A, 0x2A, 0x2E, 0xA7, 0xDA, 0x20, - 0x20, 0x20, 0x20, 0x9C, 0xA3, 0x66, 0x98, 0x98, - 0x8F, 0x98, 0x2F, 0x2F, 0x2F, 0x66, 0x8F, 0x8F, - 0x98, 0xA3, 0x66, 0x66, 0x8F, 0x98, 0x98, 0x66, - 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, 0xA3, 0xA3, - 0xB2, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x66, 0xA3, - 0x2F, 0x2F, 0x66, 0x98, 0x98, 0x66, 0x2F, 0x2F, - 0xA3, 0x98, 0x8F, 0x98, 0x66, 0x2F, 0xB2, 0xB2, - 0xB2, 0xA3, 0x66, 0x66, 0x66, 0x98, 0x20, 0x3A, - 0x98, 0x89, 0x8F, 0x6D, 0x20, 0x20, 0x20, 0x20, - 0x4C, 0x66, 0x51, 0x44, 0x51, 0x2E, 0x54, 0x20, - 0x20, 0x20, 0x20, 0xA7, 0x66, 0x98, 0x8F, 0x8F, - 0x66, 0xA3, 0x2F, 0x2F, 0x66, 0x98, 0x98, 0x66, - 0x2F, 0x2F, 0xA3, 0x98, 0x8F, 0x98, 0x66, 0x2F, - 0xB2, 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0x2F, 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0x2F, - 0x2F, 0xA3, 0x66, 0x98, 0x98, 0xA3, 0x2F, 0xB2, - 0xA3, 0x8F, 0x98, 0xA3, 0xB2, 0x51, 0x89, 0x89, - 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x98, 0x20, 0xA6, - 0x44, 0x39, 0xE6, 0x98, 0x20, 0x20, 0x20, 0x9C, - 0x74, 0xD6, 0x7E, 0xD6, 0x39, 0x8F, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2E, 0x98, 0x8F, 0x8F, 0x98, - 0x66, 0x2F, 0x2F, 0xA3, 0x66, 0x98, 0x98, 0xA3, - 0x2F, 0xB2, 0x66, 0x98, 0x8F, 0xA3, 0xB2, 0x51, - 0x89, 0x89, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x66, - 0x2F, 0x66, 0x8F, 0xA0, 0x8F, 0x98, 0xA3, 0xB2, - 0x2F, 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, - 0x66, 0x98, 0xA3, 0xB2, 0x89, 0x44, 0x89, 0x51, - 0x2F, 0x66, 0x98, 0x98, 0xA3, 0x66, 0x20, 0x2F, - 0x2F, 0xAD, 0x89, 0xD6, 0x3A, 0x20, 0x20, 0x55, - 0x6B, 0x51, 0x6D, 0x4C, 0xD8, 0xD6, 0x2E, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x8F, 0xA0, 0x8F, 0x98, - 0xA3, 0xB2, 0x2F, 0x66, 0x66, 0x66, 0xA3, 0x2F, - 0xB2, 0x2F, 0x66, 0x66, 0xA3, 0xB2, 0x89, 0x44, - 0x89, 0x51, 0x2F, 0x66, 0x98, 0x98, 0xA3, 0xA3, - 0xA3, 0x66, 0x8F, 0xA0, 0x8F, 0x66, 0x2F, 0xB2, - 0xA3, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, - 0xA3, 0x2F, 0xB2, 0x89, 0xD8, 0xD8, 0x51, 0x66, - 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0xA3, 0x20, 0x44, - 0xA7, 0xCE, 0xA6, 0x4D, 0xCE, 0x6D, 0xA7, 0xA0, - 0x6B, 0xA7, 0x20, 0x92, 0xAD, 0x6B, 0x4C, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x98, 0xA0, 0x8F, 0x66, - 0x2F, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0xA3, 0x2F, - 0x2F, 0xA3, 0xA3, 0xA3, 0xB2, 0x89, 0xD8, 0xD8, - 0x51, 0x66, 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0x66, - 0x66, 0x66, 0x8F, 0x55, 0x8F, 0xA3, 0xB2, 0xB2, - 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, - 0xA3, 0xB2, 0x89, 0x44, 0x44, 0x51, 0x66, 0xA0, - 0x55, 0xA5, 0x55, 0x8F, 0x66, 0xA3, 0x20, 0x44, - 0x6D, 0x54, 0xA7, 0x74, 0x2E, 0x4B, 0xBF, 0x9C, - 0x7E, 0xDA, 0x20, 0x54, 0x2E, 0x6B, 0x2A, 0x20, - 0x20, 0x20, 0x20, 0x3A, 0x8F, 0x55, 0x8F, 0xA3, - 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0x2F, - 0xA3, 0xA3, 0xA3, 0xB2, 0x89, 0x44, 0x44, 0x51, - 0x66, 0xA0, 0xA5, 0xA5, 0x55, 0x8F, 0x66, 0x66, - 0xA0, 0xA0, 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0xB2, - 0x66, 0x98, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, 0x2F, - 0xB2, 0x51, 0x89, 0x89, 0xB2, 0x98, 0xA0, 0x2A, - 0xA5, 0x55, 0x98, 0x66, 0xA3, 0xB2, 0x20, 0x2F, - 0x4C, 0x20, 0x4B, 0xBB, 0xCF, 0x6F, 0x27, 0x36, - 0x93, 0xCE, 0x20, 0x20, 0xA6, 0x3D, 0x4C, 0x20, - 0x20, 0x20, 0x20, 0xDA, 0xA0, 0xA0, 0x8F, 0xA3, - 0x2F, 0xB2, 0x66, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, - 0x2F, 0x2F, 0xB2, 0x51, 0x89, 0x89, 0xB2, 0x98, - 0xA0, 0x2A, 0xA5, 0xA0, 0x8F, 0x66, 0xA3, 0xA3, - 0xA0, 0x8F, 0x8F, 0xA0, 0x8F, 0xA3, 0xB2, 0x2F, - 0x66, 0x98, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, - 0xB2, 0x89, 0x44, 0x51, 0x66, 0x55, 0xAD, 0x2A, - 0x55, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0x20, 0x2A, - 0xE6, 0x95, 0xE5, 0x5A, 0x52, 0x52, 0x3F, 0x27, - 0x22, 0xC7, 0x9D, 0x60, 0xA2, 0xA2, 0x3A, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x66, 0xA0, 0x8F, 0xA3, - 0xB2, 0x2F, 0x66, 0x98, 0x2F, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0xB2, 0x89, 0x44, 0x51, 0x66, 0x55, - 0x2A, 0x2A, 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0x2F, - 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x2F, 0xB2, 0xB2, - 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0x2F, 0x2F, - 0x51, 0x89, 0x89, 0x2F, 0x8F, 0x2A, 0x2A, 0xA5, - 0x8F, 0x66, 0xA3, 0xB2, 0x2F, 0x51, 0x20, 0x6D, - 0x77, 0xF7, 0xEE, 0x30, 0xB0, 0x72, 0x72, 0x5B, - 0x82, 0xEA, 0x72, 0xB0, 0x90, 0x96, 0x71, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, 0x98, 0x2F, - 0xB2, 0xB2, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0xB2, 0x2F, 0x51, 0x89, 0x89, 0x2F, 0x8F, 0x2A, - 0xAD, 0xA5, 0x98, 0x66, 0xA3, 0xB2, 0x2F, 0xB2, - 0xD8, 0xB2, 0xA3, 0x98, 0x98, 0x2F, 0xB2, 0xB2, - 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, 0x2F, 0xA3, - 0x51, 0x89, 0x89, 0xA3, 0xA0, 0x2A, 0xA5, 0x8F, - 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x51, 0x20, 0x69, - 0x64, 0xF9, 0x3F, 0x52, 0x52, 0x72, 0x29, 0x82, - 0x47, 0x47, 0x47, 0x8B, 0x72, 0xB7, 0x60, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, 0x98, 0x2F, - 0xB2, 0xB2, 0xA3, 0xA3, 0xB2, 0x89, 0x51, 0x2F, - 0x2F, 0xA3, 0x51, 0x89, 0x89, 0xA3, 0xA0, 0x2A, - 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0xDD, 0xA3, 0x66, 0x98, 0x66, 0x2F, 0xB2, 0xB2, - 0xA3, 0xA3, 0xB2, 0x51, 0xB2, 0x2F, 0xA3, 0x2F, - 0xB2, 0x89, 0xB2, 0x66, 0xA0, 0xA5, 0x8F, 0x98, - 0x66, 0x66, 0xB2, 0x51, 0x51, 0x51, 0x81, 0xFA, - 0x62, 0xEE, 0x30, 0x52, 0x22, 0x72, 0x82, 0x82, - 0x47, 0x47, 0xEA, 0x3F, 0x37, 0x6F, 0x26, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2A, 0x98, 0x66, 0x2F, - 0x51, 0xB2, 0xA3, 0x66, 0xB2, 0x51, 0x51, 0xB2, - 0xA3, 0x2F, 0xB2, 0x89, 0xB2, 0x66, 0x55, 0x55, - 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, - 0x74, 0xA0, 0x8F, 0x98, 0x66, 0xB2, 0xB2, 0xB2, - 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x2F, 0xA3, 0x2F, - 0xB2, 0x51, 0xA3, 0x98, 0xA0, 0x55, 0xA0, 0xA0, - 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0x51, 0x54, 0xA9, - 0x62, 0xEF, 0x52, 0x22, 0x72, 0x29, 0xEA, 0xEA, - 0x29, 0x22, 0x37, 0x37, 0x8E, 0xCF, 0x49, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6D, 0x2F, 0x66, 0x2F, - 0x51, 0xB2, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0x2F, - 0xA3, 0x2F, 0xB2, 0x51, 0x2F, 0x98, 0xA0, 0x55, - 0xA0, 0xA0, 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0xA3, - 0xA3, 0x2A, 0xA5, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, - 0x66, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, - 0xB2, 0x2F, 0xA3, 0x8F, 0xA0, 0xA0, 0xA0, 0xA0, - 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xB2, 0x54, 0xA8, - 0x65, 0x5C, 0x52, 0x22, 0x29, 0x29, 0x29, 0xB0, - 0x62, 0x56, 0xF9, 0x79, 0xF9, 0xBB, 0x4B, 0x20, - 0x6D, 0xA5, 0x2E, 0x20, 0x20, 0xA3, 0xA3, 0x2F, - 0xB2, 0x2F, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, - 0x2F, 0x2F, 0xB2, 0x2F, 0x66, 0x8F, 0xA0, 0xA0, - 0x55, 0xA0, 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xA3, - 0xA0, 0x2A, 0x55, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, - 0xA3, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, 0xA3, 0x66, - 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, 0xA0, 0x98, - 0xA3, 0x51, 0x89, 0x89, 0xA3, 0x2F, 0x20, 0x54, - 0xDF, 0xFA, 0x40, 0x37, 0xD4, 0x43, 0x56, 0x64, - 0x76, 0xF9, 0x78, 0x41, 0x5E, 0x5E, 0x4C, 0x20, - 0x20, 0xAD, 0x8F, 0x9C, 0x20, 0xA5, 0xA3, 0x2F, - 0x2F, 0x2F, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, - 0xA3, 0x66, 0xA3, 0x2F, 0x66, 0x8F, 0x8F, 0x8F, - 0x8F, 0x8F, 0xA3, 0x51, 0x89, 0x51, 0xA3, 0x66, - 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0x2F, 0xA3, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x66, - 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, - 0xB2, 0x89, 0xD8, 0x51, 0x66, 0x51, 0x20, 0x6D, - 0x51, 0x77, 0x9F, 0xF7, 0xEE, 0x8E, 0xF9, 0xF0, - 0x24, 0xF7, 0x77, 0x5E, 0x74, 0xD8, 0x98, 0x20, - 0x20, 0x2E, 0x55, 0x92, 0x20, 0x54, 0x51, 0x2F, - 0x2F, 0xB2, 0xB2, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0xA3, 0xA3, 0x66, 0xA3, 0x66, 0x66, 0x66, 0x66, - 0x66, 0xA3, 0xB2, 0x89, 0xD8, 0x51, 0xA3, 0x98, - 0x98, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0xB2, 0x2F, 0x2F, 0xB2, 0xB2, 0x2F, 0x2F, 0x66, - 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0x89, 0xD8, 0x89, 0xB2, 0x66, 0x66, 0x20, 0x6D, - 0x89, 0xC2, 0xA4, 0x96, 0xC6, 0x64, 0x50, 0x40, - 0xF4, 0x97, 0x89, 0x74, 0x7E, 0x6B, 0x39, 0xA7, - 0x20, 0x20, 0x3A, 0x54, 0x20, 0x20, 0xA7, 0x51, - 0x2F, 0xB2, 0xB2, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, - 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, - 0x2F, 0xB2, 0x89, 0xD8, 0x44, 0x2F, 0x66, 0x66, - 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, - 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, - 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0x51, 0x51, - 0x89, 0x89, 0xB2, 0x66, 0x2F, 0x6D, 0x20, 0xCE, - 0x39, 0x74, 0x89, 0x5E, 0xBD, 0x87, 0xC8, 0xD1, - 0x89, 0x44, 0x3C, 0x4D, 0x6B, 0x6B, 0x6B, 0x2F, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xA3, - 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0x2F, 0xA3, 0x66, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, - 0x51, 0x51, 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66, - 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, - 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0x2F, 0xA3, - 0x66, 0x66, 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0x66, 0x66, 0x2A, 0x20, 0x54, 0x44, - 0x6B, 0x39, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, - 0xD8, 0x39, 0x4D, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, - 0x9C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6D, - 0x51, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, - 0xA3, 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0xB2, 0xB2, 0xB2, 0x2F, 0x66, 0x98, 0x98, 0x66, - 0x98, 0x98, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0x66, - 0x98, 0x66, 0x66, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, - 0x66, 0x98, 0x98, 0x98, 0x3A, 0x54, 0x2A, 0x6B, - 0x6B, 0x6B, 0x83, 0x44, 0x89, 0x89, 0x44, 0x3C, - 0xD6, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0xB2, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0xAD, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0x66, 0x66, 0x98, 0x66, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x8F, 0x98, - 0x8F, 0x98, 0x98, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, - 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x8F, 0x8F, 0x8F, 0x98, 0x98, 0x98, 0x8F, 0xA0, - 0xA0, 0xA0, 0xA3, 0xDA, 0x20, 0x3A, 0x39, 0x6B, - 0x6B, 0x6B, 0x4D, 0xA2, 0x74, 0x3C, 0x7E, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x98, 0x98, 0x98, - 0x8F, 0xA0, 0xA0, 0xA0, 0x8F, 0x8F, 0x8F, 0xA0, - 0x8F, 0x66, 0x66, 0xA3, 0x66, 0xA3, 0xA3, 0x2F, - 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x98, - 0x98, 0xA0, 0x98, 0x66, 0x66, 0x98, 0x8F, 0xA0, - 0xA0, 0xA3, 0x2E, 0x20, 0x20, 0x8F, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x55, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3A, 0x51, 0x2F, 0xA3, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0x98, - 0x8F, 0xA0, 0xA0, 0x8F, 0x8F, 0x8F, 0x8F, 0xA0, - 0x66, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, - 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0x66, 0x66, - 0x66, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, 0x66, 0x8F, - 0x66, 0xA6, 0x20, 0x20, 0x6D, 0x39, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0xB2, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2E, 0x89, 0xA3, 0xA3, 0x66, 0x66, - 0x66, 0x66, 0x98, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, - 0x66, 0x8F, 0x98, 0x98, 0x66, 0x98, 0x98, 0x8F, - 0x2F, 0x51, 0xB2, 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x66, 0x2F, - 0x55, 0x20, 0x20, 0x20, 0x4C, 0x39, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x4D, 0x7E, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2E, 0x51, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0xA3, - 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x66, - 0xB2, 0x51, 0x51, 0xB2, 0xB2, 0xA3, 0x2F, 0xA3, - 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, - 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x98, 0x98, 0xA0, - 0x20, 0x20, 0x20, 0x20, 0xA5, 0x83, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0x4D, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x4D, 0x4D, 0xD6, 0x7E, 0xDD, - 0x3C, 0x39, 0xA7, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x92, 0xB2, 0xA3, 0xA3, - 0xA3, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, 0x98, - 0x98, 0x66, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0x89, 0x89, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x2F, 0xDA, - 0x20, 0x20, 0x20, 0xDA, 0xA0, 0x51, 0x3C, 0x7E, - 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x7E, 0x3C, 0xD8, 0x44, 0xD8, - 0x44, 0x83, 0x89, 0xDA, 0x20, 0x3A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0xB2, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, - 0x98, 0x98, 0x98, 0x98, 0x66, 0xA3, 0xA3, 0x2F, - 0x3C, 0x89, 0x89, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, - 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0xA3, 0xA3, 0xA3, 0x66, 0x98, 0x98, 0xA3, 0x20, - 0x20, 0x20, 0x20, 0x6D, 0x2F, 0xE6, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0xD6, 0x3D, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0xA2, - 0x74, 0x44, 0xA2, 0xA3, 0x20, 0x3A, 0x2E, 0x6D, - 0x20, 0x20, 0x20, 0x20, 0x20, 0xA6, 0xA3, 0x66, - 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0x66, 0x66, 0x98, - 0x66, 0x66, 0x98, 0x98, 0x98, 0x66, 0xA3, 0xA3, - 0x83, 0xB2, 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, - 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x98, 0x66, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA6, 0x20, - 0x3A, 0x3A, 0x54, 0x55, 0x7E, 0x6B, 0x6B, 0x6B, - 0x4D, 0x3D, 0x6B, 0x6B, 0x6B, 0x57, 0x33, 0xEB, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x4D, 0xA2, 0x74, 0x39, 0x92, 0x20, 0x20, 0x6D, - 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, - 0x98, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x66, 0xA3, - 0x89, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, - 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xB2, 0x3A, 0x20, - 0xA7, 0x20, 0x3A, 0x39, 0x6B, 0x6B, 0x6B, 0x6B, - 0xB5, 0xCB, 0x6B, 0x6B, 0x3D, 0x8A, 0x42, 0x3D, - 0x6B, 0x6B, 0x6B, 0x84, 0x6C, 0x4D, 0x6B, 0x6B, - 0x6B, 0x6B, 0x7E, 0x83, 0x51, 0x20, 0x20, 0x20, - 0x6D, 0x3A, 0x20, 0x20, 0x20, 0x20, 0xAD, 0x66, - 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, - 0xB2, 0x98, 0x66, 0x66, 0x98, 0x66, 0x66, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x20, 0x6D, - 0x3A, 0x20, 0x98, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0xAA, 0x33, 0x6B, 0x6B, 0x3D, 0xF5, 0x7B, 0x3D, - 0x6B, 0x6B, 0x4F, 0x4A, 0x58, 0x3D, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x7E, 0x7E, 0x9C, 0x54, 0xA7, - 0x2E, 0xA7, 0x20, 0x20, 0x20, 0x20, 0x54, 0x51, - 0x2F, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, - 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, - 0xB2, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x66, 0xA3, - 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, 0xB2, - 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xA6, 0x20, 0xCE, - 0x20, 0x6D, 0x4D, 0x6B, 0xD6, 0x7E, 0x6B, 0x6B, - 0x6E, 0x9A, 0x57, 0x6B, 0x2D, 0x7B, 0x7B, 0x3D, - 0x6B, 0x84, 0xF5, 0x7B, 0x84, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x98, 0x3A, 0x9C, - 0xCE, 0x3A, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x98, - 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0x89, 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, - 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, 0xB2, 0xB2, - 0xB2, 0x2F, 0x2F, 0x2F, 0x89, 0x54, 0x6D, 0x3A, - 0x20, 0x98, 0x6B, 0x6B, 0xE0, 0xB4, 0x6B, 0x6B, - 0x2D, 0x9E, 0x4A, 0x3D, 0x84, 0xF5, 0xF5, 0x84, - 0x6B, 0x6E, 0x59, 0x6C, 0x6B, 0x6B, 0x6B, 0x6B, - 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0xDD, 0xDA, 0x6D, - 0x54, 0x20, 0xCE, 0x20, 0x20, 0x20, 0x20, 0xA7, - 0x51, 0xB2, 0xB2, 0xB2, 0x2F, 0xB2, 0x2F, 0x2F, - 0x2F, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, - 0x89, 0xA3, 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, - 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0x2F, - 0xB2, 0x2F, 0x2F, 0xA3, 0x98, 0x20, 0xA7, 0x20, - 0x3A, 0x7E, 0x6B, 0x6B, 0x7F, 0xDE, 0xF6, 0x3D, - 0x6B, 0xDB, 0x8A, 0xDB, 0xE9, 0xF3, 0xF3, 0xDB, - 0x68, 0xF3, 0x73, 0x7F, 0x6B, 0x6B, 0x57, 0x58, - 0xDC, 0x2D, 0x6B, 0x6B, 0x6B, 0x6B, 0x3A, 0x20, - 0x20, 0x20, 0x6D, 0x54, 0x20, 0x20, 0x20, 0x20, - 0x51, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0x66, - 0xA3, 0x66, 0x98, 0x98, 0x66, 0x98, 0x98, 0x66, - 0x2F, 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, - 0x66, 0x98, 0x8F, 0x98, 0xCE, 0xDA, 0x2E, 0x20, - 0x2A, 0x6B, 0x6B, 0x6B, 0x6B, 0x2C, 0x34, 0xCB, - 0xEB, 0x6C, 0x31, 0x59, 0x82, 0x82, 0x8B, 0x82, - 0xF3, 0x73, 0xE9, 0x6B, 0x3D, 0x6E, 0xF3, 0x4A, - 0x4F, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x92, 0x20, - 0x20, 0x20, 0x6D, 0x6D, 0x20, 0x20, 0x20, 0x20, - 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x8F, 0x98, - 0x98, 0x98, 0x98, 0x66, 0x98, 0x66, 0x66, 0xA3, - 0xA3, 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, - 0xA3, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0x66, - 0x8F, 0x55, 0xA5, 0x98, 0x20, 0x2E, 0x54, 0x54, - 0x89, 0x6B, 0x6B, 0x6B, 0x6B, 0x84, 0xE3, 0x4A, - 0x58, 0x42, 0x5B, 0x8B, 0x82, 0x82, 0x82, 0x82, - 0x82, 0x59, 0x58, 0x57, 0x57, 0x59, 0x7B, 0x84, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0xAD, 0x20, - 0x20, 0x20, 0x3A, 0x3A, 0x20, 0x20, 0x20, 0x20, - 0x2A, 0x66, 0x8F, 0x55, 0xA5, 0xA5, 0xA0, 0x8F, - 0x66, 0xA3, 0xA3, 0x66, 0x98, 0x66, 0x66, 0x2F, - 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0x66, - 0x8F, 0xA5, 0x8F, 0x2E, 0x20, 0x2E, 0x20, 0x3A, - 0x4D, 0x6B, 0xE6, 0x84, 0x3D, 0x6B, 0xEB, 0x4A, - 0xC9, 0x8B, 0x8B, 0x31, 0x59, 0x82, 0x59, 0x59, - 0x5B, 0x82, 0x59, 0x73, 0x7B, 0xDC, 0x57, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x55, 0x20, - 0x20, 0x20, 0x6D, 0xDA, 0x20, 0x20, 0x20, 0x20, - 0x9C, 0x66, 0x8F, 0xA5, 0xA5, 0x55, 0x8F, 0x66, - 0x2F, 0xB2, 0x2F, 0x66, 0x98, 0x98, 0x2F, 0x51, - 0x89, 0xB2, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, - 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, - 0x8F, 0xA5, 0x8F, 0x20, 0x20, 0xA7, 0x20, 0xA6, - 0x6B, 0x6B, 0xE4, 0x48, 0x2C, 0xDB, 0x4F, 0x9E, - 0xD0, 0xD0, 0x8B, 0x82, 0x82, 0x82, 0x82, 0x82, - 0x59, 0x82, 0x82, 0x73, 0x7B, 0x68, 0x6B, 0x3D, - 0x68, 0x68, 0x84, 0x3D, 0x6B, 0x6B, 0xA0, 0x20, - 0x20, 0x20, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6D, 0x2F, 0xA0, 0xA5, 0x55, 0x98, 0x66, 0xA3, - 0xB2, 0x89, 0xB2, 0x98, 0x8F, 0x98, 0x2F, 0x51, - 0x74, 0xB2, 0xA3, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, - 0xA3, 0xA3, 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0xA3, - 0x98, 0xA3, 0x6D, 0x20, 0x20, 0xCE, 0x20, 0x2A, - 0x6B, 0x6B, 0xEB, 0x2C, 0xE1, 0xF1, 0x7C, 0xD0, - 0x8B, 0x8B, 0x82, 0x82, 0x82, 0x82, 0x82, 0x59, - 0x82, 0x82, 0x42, 0x82, 0x31, 0x57, 0x4F, 0x7B, - 0x7B, 0xF5, 0xF6, 0xDB, 0x6B, 0x6B, 0x98, 0x20, - 0x20, 0x20, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x51, 0x66, 0xA0, 0xA0, 0x66, 0x2F, 0xB2, - 0xB2, 0x51, 0x2F, 0xA0, 0x55, 0xA3, 0x51, 0x89, - 0x44, 0xA3, 0x98, 0x98, 0x2F, 0x2F, 0x2F, 0xA3, - 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, 0x2F, 0x2F, - 0x98, 0x8F, 0x20, 0x20, 0x3A, 0xA6, 0x20, 0xA0, - 0x6B, 0x6B, 0x6B, 0x6B, 0x7F, 0x7F, 0xC3, 0xC9, - 0xD0, 0xD0, 0x29, 0x59, 0x82, 0x73, 0x82, 0x73, - 0x59, 0x59, 0x59, 0x59, 0x59, 0x58, 0xAF, 0xF5, - 0x8A, 0x68, 0xEB, 0x6B, 0x6B, 0x6B, 0x98, 0x20, - 0x20, 0x20, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x51, 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, - 0x51, 0x2F, 0x98, 0x55, 0x8F, 0xB2, 0x89, 0x44, - 0xA3, 0x55, 0x55, 0x98, 0xA3, 0xB2, 0x2F, 0xA3, - 0x66, 0x66, 0x98, 0x8F, 0x66, 0xA3, 0x66, 0x98, - 0x55, 0x4C, 0x20, 0x20, 0xDA, 0xAD, 0x20, 0x98, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x9A, 0xD0, - 0xF2, 0x8B, 0x8B, 0x8B, 0x73, 0x82, 0x5B, 0x82, - 0x82, 0x59, 0x59, 0x73, 0x73, 0x58, 0x3D, 0x3D, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x66, 0x20, - 0x20, 0x3A, 0x3A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2F, 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, - 0xB2, 0xA3, 0x66, 0x66, 0xA3, 0xB2, 0x89, 0x51, - 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, 0xB2, 0xA3, - 0x66, 0x66, 0x98, 0x98, 0x98, 0x66, 0x66, 0x8F, - 0x8F, 0x92, 0x20, 0x20, 0x20, 0x6D, 0x6D, 0xA3, - 0x6B, 0x6B, 0xEB, 0x7F, 0x4F, 0xDB, 0xD2, 0xC9, - 0xC9, 0xD0, 0x8B, 0x8B, 0x73, 0x82, 0x59, 0x8B, - 0x59, 0x82, 0x59, 0x59, 0x73, 0xF5, 0xEB, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x55, 0x20, - 0x20, 0xA7, 0x54, 0xDA, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x98, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, - 0x51, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0x51, 0xB2, - 0xA0, 0xA5, 0x55, 0x66, 0x2F, 0x51, 0x2F, 0xA3, - 0x66, 0x66, 0x66, 0x98, 0x66, 0x66, 0x98, 0x98, - 0x98, 0x2A, 0x54, 0x95, 0x95, 0x71, 0x2E, 0x98, - 0x6B, 0x6B, 0x4D, 0x28, 0xDE, 0x88, 0xB7, 0x70, - 0xC9, 0xC9, 0xD0, 0xF2, 0x8B, 0x8B, 0x8B, 0x59, - 0x59, 0x59, 0x59, 0x5B, 0x59, 0xF3, 0x57, 0xE9, - 0xDB, 0x84, 0x6B, 0x6B, 0x6B, 0x6B, 0x4C, 0xDA, - 0x2E, 0xDA, 0x20, 0xDA, 0x2E, 0x2E, 0x6D, 0x20, - 0x4C, 0x98, 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, - 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0xA0, 0xA0, 0x8F, 0x2F, 0xB2, 0x89, 0xB2, 0xA3, - 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0xA3, - 0x2F, 0xD1, 0xE2, 0x52, 0x52, 0xF4, 0xBF, 0x9C, - 0x39, 0x6B, 0x6B, 0x6B, 0x7F, 0x4F, 0xE3, 0x6A, - 0xD0, 0xC9, 0xC9, 0xD0, 0xD0, 0x8B, 0x8B, 0x82, - 0x5B, 0x5B, 0x73, 0x8B, 0x59, 0x23, 0x6E, 0x31, - 0x59, 0x7B, 0xDB, 0x84, 0x68, 0x7F, 0xAE, 0x54, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0xA6, 0x3A, - 0xA0, 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, - 0x2F, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, - 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, - 0x66, 0x98, 0x98, 0x66, 0x66, 0xA3, 0x2F, 0x2F, - 0x3C, 0x88, 0x8D, 0x52, 0x52, 0x5D, 0xF7, 0xBF, - 0xCE, 0xA2, 0x6B, 0x6B, 0x6B, 0x6B, 0x7F, 0x85, - 0x70, 0xC9, 0xC9, 0xC9, 0xD0, 0xEA, 0x8B, 0x5B, - 0x82, 0xEA, 0x82, 0x82, 0x42, 0x57, 0x3D, 0x68, - 0x68, 0x57, 0x4A, 0x34, 0x22, 0xCC, 0x21, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0xDA, 0xA7, 0x6D, - 0xDF, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, - 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, - 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x66, - 0x8F, 0x8F, 0x8F, 0x98, 0xA3, 0xA3, 0x89, 0xD8, - 0x25, 0x5C, 0x3B, 0x5D, 0x52, 0x80, 0x70, 0x36, - 0x71, 0xA7, 0x44, 0x6B, 0x84, 0xCB, 0xAA, 0xF3, - 0xC9, 0xC9, 0xC9, 0xC9, 0xD0, 0x8B, 0x5B, 0x5B, - 0x5B, 0xEA, 0x82, 0x47, 0x7B, 0x68, 0x3D, 0x3D, - 0x6B, 0x3D, 0x6C, 0x2B, 0x80, 0x61, 0x96, 0x81, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0xDA, 0x63, - 0xAC, 0x6C, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, - 0xA3, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x66, 0x98, 0x66, 0xA3, 0xB2, 0xB2, 0x2F, 0x66, - 0x8F, 0x8F, 0x2F, 0xD8, 0xE4, 0xCD, 0xAA, 0xB4, - 0x78, 0x2B, 0x3B, 0x70, 0x46, 0x5D, 0x5D, 0x52, - 0x9D, 0x81, 0x3A, 0xA3, 0xCD, 0x48, 0xBE, 0x4F, - 0xC3, 0xC9, 0xD0, 0xD0, 0xD0, 0xEA, 0x5B, 0x8B, - 0x5B, 0x82, 0x8B, 0x59, 0x4A, 0xF3, 0x33, 0x7F, - 0x3D, 0x6B, 0x4F, 0x6F, 0x5D, 0x52, 0x63, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x85, - 0x72, 0xDC, 0xD8, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, - 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, - 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0x51, 0xA3, 0x98, - 0xA0, 0xA3, 0x93, 0xCF, 0x79, 0x27, 0x5C, 0x79, - 0x2B, 0x30, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, - 0x3F, 0x69, 0x20, 0x20, 0x2A, 0xD6, 0x3D, 0x6B, - 0x84, 0xE3, 0x34, 0xB7, 0xC9, 0xD0, 0xD0, 0xF2, - 0xD0, 0x8B, 0x31, 0x68, 0x68, 0x6E, 0x31, 0x33, - 0x7F, 0x7E, 0xA1, 0x6F, 0x52, 0x8D, 0xE5, 0xBF, - 0x20, 0x20, 0x20, 0x20, 0x81, 0xA8, 0x78, 0x52, - 0x52, 0xD2, 0xD8, 0xA3, 0xA3, 0x2F, 0x2F, 0xA3, - 0xA3, 0x66, 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, - 0x51, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, 0xA0, - 0xA0, 0x44, 0x78, 0xEF, 0x52, 0x30, 0x30, 0x30, - 0x3B, 0x70, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, - 0x46, 0xC1, 0x71, 0x20, 0x81, 0xB1, 0xDD, 0x3D, - 0xA1, 0xE7, 0xDB, 0xCA, 0xD2, 0x6A, 0x6A, 0x6A, - 0xF3, 0xE9, 0xDB, 0x8A, 0x84, 0x3D, 0x84, 0xDC, - 0x25, 0x44, 0xB5, 0xEE, 0x30, 0xEF, 0xF0, 0x32, - 0x69, 0x5F, 0x4B, 0xA8, 0x99, 0x56, 0x67, 0x30, - 0x30, 0x34, 0xB2, 0x2F, 0xA3, 0xA3, 0x66, 0x66, - 0x98, 0x8F, 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, - 0x51, 0x2F, 0xB2, 0x51, 0x51, 0x2F, 0x66, 0xA0, - 0x8F, 0xE0, 0xF9, 0x8D, 0x52, 0x5D, 0x46, 0x5D, - 0x80, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x52, 0x52, 0x60, 0x81, 0x20, 0x20, 0x6D, 0xD1, - 0x48, 0xE7, 0x6B, 0x33, 0xF6, 0x7F, 0x7F, 0xDB, - 0x84, 0x6B, 0x6C, 0x6A, 0xF3, 0xEB, 0x6B, 0x3D, - 0x4F, 0xD8, 0xCD, 0x79, 0x30, 0x67, 0xF9, 0x24, - 0xED, 0xD9, 0x8C, 0xED, 0x37, 0x2B, 0x3B, 0x5D, - 0x80, 0x85, 0x4E, 0x98, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0x51, 0x2F, 0xB2, 0xB2, 0xB2, 0xA3, 0x8F, 0x8F, - 0x98, 0xE0, 0xF0, 0x67, 0x5D, 0x80, 0x80, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, - 0x5D, 0x70, 0x27, 0x4B, 0x20, 0x81, 0x71, 0x3A, - 0xB5, 0xEB, 0x3D, 0xF1, 0xE1, 0x84, 0x84, 0xF1, - 0xE3, 0x3D, 0x6B, 0x6C, 0x34, 0xE7, 0x6B, 0x6B, - 0xD6, 0x74, 0x5E, 0x78, 0x67, 0x30, 0xEE, 0x5C, - 0xF9, 0xF9, 0x45, 0x5C, 0x2B, 0x3B, 0x5D, 0x5D, - 0x5D, 0x5D, 0xF8, 0x44, 0x66, 0x66, 0x66, 0x66, - 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, 0x98, 0x8F, 0x98, - 0x66, 0x83, 0x76, 0x67, 0x30, 0x80, 0x5D, 0x80, - 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x80, 0x5D, 0x22, 0xFA, 0x20, 0x81, 0x20, 0x20, - 0xA5, 0x6B, 0x6B, 0xE8, 0xBE, 0x3D, 0x6B, 0x2C, - 0xE1, 0xEB, 0x6B, 0x3D, 0x3E, 0xA1, 0x6B, 0x6B, - 0x4D, 0x74, 0xE8, 0x62, 0x67, 0x30, 0x8D, 0x67, - 0xEE, 0xEE, 0xEE, 0x67, 0x30, 0x80, 0x5D, 0x5D, - 0x52, 0x5D, 0x85, 0xAC, 0x3E, 0xA3, 0x66, 0x66, - 0x2F, 0x51, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x66, - 0x2F, 0x83, 0xBC, 0xEE, 0x5D, 0x5D, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, - 0x5D, 0x5D, 0x22, 0xB0, 0xAE, 0x81, 0x20, 0x20, - 0x4C, 0x3D, 0xEB, 0x39, 0x57, 0x6B, 0x6B, 0x3E, - 0x97, 0x3D, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, - 0x3D, 0x3C, 0xBA, 0x62, 0xEE, 0x5D, 0x5D, 0x30, - 0x30, 0x8D, 0x8D, 0x30, 0x52, 0x5D, 0x5D, 0x80, - 0x5D, 0x5D, 0x5D, 0x85, 0xB0, 0x6E, 0x2F, 0x66, - 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, 0xA3, 0xA3, - 0xB2, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x98, 0xA3, - 0x2F, 0x51, 0xDE, 0x8E, 0x30, 0x5D, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x52, 0x80, 0x5D, 0x22, 0x43, 0x4B, 0x20, 0x6D, - 0x44, 0x6B, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x4D, - 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x6B, - 0x4D, 0x2A, 0xAE, 0x76, 0xEE, 0x30, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x80, - 0x5D, 0x5D, 0x80, 0x80, 0x5D, 0x7A, 0xB6, 0x51, - 0xB2, 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, - 0x2F, 0x66, 0x98, 0x8F, 0xA0, 0x98, 0xA3, 0x2F, - 0x2F, 0x51, 0xAB, 0x8E, 0x5D, 0x5D, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, - 0x5D, 0x80, 0x5D, 0x52, 0x52, 0x94, 0x2F, 0x7E, - 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x7E, - 0xAD, 0x54, 0xAE, 0x24, 0x2B, 0x3B, 0x5D, 0x52, - 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x80, - 0x5D, 0x52, 0x52, 0x5D, 0x5D, 0x5D, 0xD2, 0x3E, - 0x89, 0x89, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x66, - 0x2F, 0x66, 0x8F, 0x8F, 0xA0, 0x98, 0xA3, 0xB2, - 0x2F, 0x51, 0xDE, 0x79, 0x5D, 0x80, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x5D, 0x5D, 0x80, 0x5D, 0x52, 0x6F, 0xA4, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0xA2, 0xCE, - 0x20, 0x20, 0x95, 0x24, 0x67, 0x3B, 0x80, 0x80, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x30, 0xB0, 0x86, - 0x89, 0x51, 0x2F, 0x66, 0x98, 0x98, 0xA3, 0xA3, - 0xA3, 0x66, 0x8F, 0xA0, 0x8F, 0x66, 0x2F, 0xB2, - 0x2F, 0x4E, 0x76, 0x2B, 0x30, 0x5D, 0x5D, 0x5D, - 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x5D, 0x46, 0x52, 0x21, 0x74, - 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, - 0x6B, 0x6B, 0x6B, 0x6B, 0x7E, 0x98, 0x3A, 0x20, - 0x20, 0x81, 0x60, 0xED, 0x2B, 0x52, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x80, - 0x22, 0x5D, 0x5D, 0x5D, 0x8D, 0x2B, 0x38, 0x39, - 0x51, 0x66, 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0x66, - 0x66, 0x66, 0x8F, 0x55, 0x8F, 0xA3, 0xB2, 0xB2, - 0xA3, 0xE8, 0xF9, 0x30, 0x3B, 0x80, 0x5D, 0x5D, - 0x5D, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x52, 0x30, 0xD4, 0x99, - 0x51, 0x4D, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0x6B, - 0x6B, 0x6B, 0x7E, 0xA3, 0x2E, 0x20, 0x20, 0x20, - 0x20, 0x81, 0xC5, 0xED, 0x2B, 0x3B, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x80, - 0x5D, 0x52, 0x52, 0x6F, 0xDE, 0x2C, 0x39, 0x51, - 0x66, 0xA0, 0xA5, 0xA5, 0x55, 0x8F, 0x66, 0x66, - 0xA0, 0xA0, 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0x2F, - 0x51, 0xD5, 0x45, 0x8D, 0x3B, 0x5D, 0x80, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x5D, 0x52, 0x67, 0x37, 0xA9, - 0x3A, 0xCE, 0xA0, 0x2F, 0x51, 0x51, 0xB2, 0xA3, - 0xA5, 0x9C, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x54, 0x99, 0xED, 0x67, 0x30, 0x5D, 0x5D, - 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x3B, 0x80, - 0x8D, 0x79, 0x48, 0x2C, 0x39, 0x44, 0xB2, 0x66, - 0xA0, 0x2A, 0xA5, 0xA0, 0x8F, 0x66, 0xA3, 0xA3, - 0xA0, 0x8F, 0x8F, 0xA0, 0x8F, 0xA3, 0xB2, 0xB2, - 0xD8, 0xBC, 0x45, 0xEE, 0x67, 0x8D, 0x30, 0x30, - 0x52, 0x52, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, - 0x5D, 0x5D, 0x5D, 0x80, 0x3B, 0x67, 0xF9, 0x32, - 0x69, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0xBF, 0xEC, 0xED, 0x2B, 0x30, 0x5D, 0x5D, - 0x80, 0x5D, 0x5D, 0x5D, 0x52, 0x30, 0x67, 0x2B, - 0xCF, 0xAA, 0xD8, 0x89, 0x89, 0x51, 0x66, 0x55, - 0x2A, 0x2A, 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0x2F, - 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x2F, 0xB2, 0x2F, - 0xD1, 0x28, 0x56, 0xED, 0x62, 0x37, 0x5C, 0x79, - 0x8E, 0x2B, 0x2B, 0x30, 0x30, 0x30, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x80, 0x3B, 0xEE, 0x56, 0xA9, - 0x75, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5F, 0x99, 0xD9, 0x45, 0x8D, 0x3B, 0x5D, - 0x5D, 0x3B, 0x5D, 0x8D, 0x2B, 0x79, 0x79, 0x41, - 0x83, 0xB2, 0xB2, 0x89, 0x89, 0x2F, 0xA0, 0x2A, - 0xAD, 0xA5, 0x98, 0x66, 0xA3, 0xB2, 0x2F, 0xB2, - 0xD8, 0xB2, 0xA3, 0x98, 0x98, 0x2F, 0x51, 0xB2, - 0xA3, 0x83, 0x3E, 0x25, 0xD5, 0xE5, 0x50, 0x8C, - 0xED, 0x24, 0x24, 0xF0, 0x45, 0x8E, 0x2B, 0x30, - 0x30, 0x5D, 0x3B, 0x30, 0xEE, 0xF0, 0xC6, 0x65, - 0x75, 0x71, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x4B, 0xC5, 0x7D, 0x24, 0xEE, 0x67, 0x30, - 0x30, 0x8D, 0x67, 0x8E, 0xF9, 0xF7, 0x97, 0xDD, - 0x2F, 0x2F, 0x51, 0x89, 0x89, 0x2F, 0x55, 0x2A, - 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0xDD, 0xA3, 0x66, 0x98, 0x66, 0x2F, 0xB2, 0xB2, - 0xA3, 0xA3, 0xB2, 0x51, 0x89, 0x44, 0xE0, 0x5E, - 0x91, 0x9F, 0x9F, 0x7D, 0x7D, 0xD9, 0x24, 0xF0, - 0x79, 0x8E, 0xEE, 0x8E, 0x24, 0x40, 0x65, 0x35, - 0x69, 0x2E, 0x98, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0x98, - 0xA5, 0xA7, 0x95, 0xD7, 0x8C, 0xF0, 0x8E, 0x8E, - 0xEE, 0x79, 0xF0, 0xED, 0x50, 0xE8, 0x89, 0x2F, - 0xA3, 0xA3, 0xB2, 0x89, 0xB2, 0x66, 0xA0, 0x55, - 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, - 0x74, 0xA0, 0xA0, 0x98, 0x66, 0xB2, 0xB2, 0xB2, - 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0xA3, 0x2F, - 0x51, 0x83, 0xE4, 0x87, 0xB8, 0xFA, 0xA9, 0xC6, - 0x40, 0x64, 0x64, 0x50, 0xD7, 0x65, 0x35, 0x60, - 0x98, 0xB2, 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0xA3, - 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xB2, - 0x89, 0xDD, 0x9B, 0xC0, 0x7D, 0x50, 0x8C, 0xED, - 0xED, 0x8C, 0x40, 0x9F, 0x4E, 0x51, 0xB2, 0x2F, - 0x2F, 0x2F, 0xB2, 0x51, 0xA3, 0x98, 0xA0, 0x55, - 0xA0, 0xA0, 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0xA3, - 0xA3, 0x2A, 0x55, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, - 0x66, 0x66, 0x2F, 0xB2, 0xD1, 0x2F, 0x2F, 0xA3, - 0xB2, 0xB2, 0xA3, 0x8F, 0xA3, 0x2F, 0xD1, 0x94, - 0xEC, 0x65, 0x65, 0xC0, 0xC0, 0x35, 0x95, 0xC2, - 0xA3, 0x98, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, - 0xA3, 0x2F, 0xB2, 0x2F, 0x2F, 0x2F, 0x2F, 0x51, - 0x89, 0x44, 0xD1, 0x60, 0x35, 0xA9, 0x32, 0xC6, - 0xD7, 0x32, 0x94, 0x44, 0x2F, 0xB2, 0xB2, 0xB2, - 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x8F, 0xA0, 0xA0, - 0x55, 0xA0, 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xA3, - 0x8F, 0x2A, 0x55, 0x66, 0xA3, 0x2F, 0x2F, 0xB2, - 0xA3, 0x66, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x66, - 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, 0xA0, 0x2F, - 0x5E, 0xDF, 0xB9, 0x60, 0x95, 0xD3, 0x89, 0x2F, - 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0xA3, - 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, - 0x51, 0x2F, 0x8F, 0x2F, 0xC4, 0xB9, 0x9B, 0xEC, - 0x53, 0xB3, 0x4E, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0xA3, 0x66, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, - 0x8F, 0x8F, 0xA3, 0x51, 0x89, 0x51, 0xA3, 0x66, - 0xA0, 0x55, 0x8F, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0x2F, 0xA3, 0x2F, 0x51, 0x51, 0xB2, 0xA3, 0x66, - 0x66, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, - 0xB2, 0xC2, 0x74, 0xD8, 0xB2, 0xA3, 0xA3, 0xA3, - 0x66, 0x66, 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x66, - 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xB2, - 0x2F, 0x66, 0xA0, 0x55, 0x98, 0x2F, 0x89, 0x89, - 0x89, 0xB2, 0x2F, 0xA3, 0x2F, 0x51, 0x51, 0xB2, - 0x2F, 0x66, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, - 0x66, 0xA3, 0xB2, 0x89, 0xD8, 0x51, 0xA3, 0x98, - 0x66, 0x98, 0x66, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, - 0xB2, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, - 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, - 0x89, 0xD8, 0x89, 0x2F, 0x66, 0x66, 0xA3, 0xA3, - 0x98, 0x98, 0x66, 0x66, 0x98, 0x98, 0x66, 0xA3, - 0x2F, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, - 0xB2, 0x2F, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0x2F, - 0x2F, 0xB2, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0x2F, - 0x2F, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, - 0x2F, 0xB2, 0x89, 0xD8, 0x44, 0x2F, 0x66, 0x66, - 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, - 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0x51, 0x51, - 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66, 0xA3, 0x66, - 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, 0xA3, 0x2F, - 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, - 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0x2F, 0xB2, 0xB2, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, - 0x2F, 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, - 0x51, 0x51, 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66 -}; - -unsigned char linux_logo_bw[] __initdata = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, - 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC3, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFB, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xCF, 0xC3, 0xF8, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x81, 0xF9, - 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7, - 0x99, 0xF9, 0xC2, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xF3, 0xBC, 0xF9, 0x90, 0x00, 0x1F, 0xFF, - 0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xA0, 0x00, - 0x8F, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9, - 0x83, 0xE0, 0x2F, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, - 0x19, 0xF0, 0x1F, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x03, 0xF0, 0x3F, 0xF7, 0x8F, 0xFF, - 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0x7F, 0xF7, - 0xC7, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, - 0x6F, 0xF7, 0xE7, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, - 0x01, 0xF8, 0x7F, 0xF7, 0xE7, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x21, 0xD8, 0x7F, 0xE7, 0xEF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0x7B, 0xFF, - 0xEF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4, - 0x7B, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, - 0xC0, 0x7C, 0x79, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, - 0xE3, 0x80, 0x00, 0x7C, 0x7C, 0xFF, 0xCF, 0xFF, - 0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0x77, 0xFF, - 0xDF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F, - 0x3F, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, - 0x00, 0x3F, 0xBF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, - 0x1E, 0x00, 0x00, 0x1F, 0x9F, 0xFF, 0x3F, 0xFF, - 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1F, 0x9F, 0xFF, - 0x7F, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1F, - 0x8F, 0xFE, 0x7F, 0xFF, 0xFF, 0xFC, 0x7C, 0x00, - 0x00, 0x0F, 0xC7, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, - 0xF8, 0x00, 0x00, 0x0F, 0xF7, 0xF9, 0xFF, 0xFF, - 0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x07, 0xFB, 0xF3, - 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x07, - 0xFD, 0xE7, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00, - 0x00, 0x03, 0xFE, 0x8F, 0xFF, 0xFF, 0xFF, 0xF1, - 0xF0, 0x00, 0x00, 0x03, 0xFE, 0x1F, 0xFF, 0xFF, - 0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0xFF, 0xBF, - 0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x00, 0x00, - 0xFE, 0xBF, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00, - 0x00, 0x00, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xC7, - 0xC0, 0x00, 0x00, 0x01, 0xFE, 0xBF, 0xFF, 0xFF, - 0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFE, 0x9F, - 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x00, 0x01, - 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, - 0x00, 0x01, 0xFE, 0x87, 0xFF, 0xFF, 0xFF, 0x9F, - 0x80, 0x00, 0x00, 0x01, 0xFD, 0x33, 0xFF, 0xFF, - 0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0xF3, - 0xFF, 0xFF, 0xFF, 0x9E, 0x80, 0x00, 0x00, 0x03, - 0x8B, 0xF9, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00, - 0x00, 0x02, 0x27, 0xF8, 0xFF, 0xFF, 0xFF, 0x99, - 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0xFF, 0xFF, - 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0x8F, 0xF8, - 0xFF, 0xFF, 0xFE, 0x20, 0x60, 0x00, 0x00, 0x00, - 0xE3, 0xF8, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00, - 0x00, 0x00, 0xF8, 0x78, 0xFF, 0xFF, 0xC0, 0x40, - 0x38, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xFF, - 0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x20, - 0x7F, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00, - 0x78, 0x10, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, - 0x07, 0xC0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, - 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x04, - 0x7F, 0xFF, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x10, - 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01, 0x80, - 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x00, 0x01, 0x4F, 0xFF, - 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, - 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x03, 0xF0, - 0x00, 0x00, 0x8F, 0xFF, 0x80, 0x00, 0x00, 0x40, - 0x0F, 0xF0, 0x00, 0x04, 0x1F, 0xFF, 0x80, 0x00, - 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x10, 0x1F, 0xFF, - 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x40, - 0xFF, 0xFF, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xF0, - 0x00, 0x83, 0xFF, 0xFF, 0x81, 0xE0, 0x01, 0xFF, - 0xFF, 0xF8, 0x02, 0x07, 0xFF, 0xFF, 0x80, 0x3F, - 0x07, 0xE0, 0x00, 0x1C, 0x0C, 0x1F, 0xFF, 0xFF, - 0xF8, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0x78, 0x1F, - 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0x00, 0x07, 0x0F, - 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x0C, 0x07, - 0xFF, 0x83, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x26, 0x26, 0x25, 0x28, 0x23, 0x22, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x25, 0x2a, 0x2b, 0x2c, 0x2d, 0x2d, + 0x2d, 0x2e, 0x2c, 0x2b, 0x2a, 0x25, 0x28, 0x22, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x2a, 0x2c, 0x2f, 0x2c, 0x30, 0x30, 0x24, + 0x25, 0x27, 0x2b, 0x2c, 0x2f, 0x31, 0x32, 0x25, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x33, 0x34, 0x35, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x2b, 0x2f, 0x2c, + 0x30, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x2d, 0x27, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x31, + 0x2d, 0x32, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, 0x2a, 0x34, + 0x25, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x23, 0x32, 0x27, 0x21, 0x36, + 0x2a, 0x2d, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x26, 0x2c, 0x35, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2f, 0x37, 0x32, 0x22, + 0x36, 0x35, 0x31, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x22, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x26, 0x38, 0x38, 0x35, 0x25, + 0x36, 0x21, 0x2d, 0x2b, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x39, 0x39, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2b, 0x30, 0x28, 0x22, + 0x36, 0x36, 0x27, 0x34, 0x30, 0x23, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x26, 0x2d, 0x26, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x22, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2d, 0x33, 0x28, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2b, 0x2c, 0x25, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x36, 0x36, + 0x36, 0x21, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x21, 0x23, 0x22, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x28, 0x34, 0x27, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x21, 0x21, 0x24, 0x27, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x27, 0x22, 0x33, 0x24, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x2f, 0x2a, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x30, 0x3a, 0x38, 0x24, 0x24, 0x36, 0x36, 0x36, + 0x23, 0x2f, 0x3b, 0x3c, 0x3d, 0x30, 0x25, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x32, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x23, + 0x3e, 0x3f, 0x40, 0x3a, 0x22, 0x36, 0x36, 0x21, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x3e, 0x23, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x33, 0x28, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x2b, + 0x44, 0x40, 0x46, 0x47, 0x35, 0x36, 0x36, 0x26, + 0x43, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x34, 0x36, 0x4d, + 0x4e, 0x25, 0x2f, 0x46, 0x4a, 0x22, 0x23, 0x32, + 0x4f, 0x50, 0x21, 0x31, 0x51, 0x52, 0x53, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x21, 0x3a, + 0x4d, 0x21, 0x31, 0x54, 0x55, 0x28, 0x30, 0x2b, + 0x4b, 0x4d, 0x36, 0x23, 0x32, 0x50, 0x3f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x38, 0x23, 0x37, + 0x55, 0x36, 0x28, 0x3a, 0x56, 0x57, 0x57, 0x58, + 0x3c, 0x4d, 0x36, 0x36, 0x36, 0x40, 0x40, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x51, 0x23, 0x35, + 0x43, 0x25, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, + 0x5f, 0x60, 0x61, 0x36, 0x31, 0x47, 0x3b, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x2c, 0x25, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x22, + 0x40, 0x62, 0x63, 0x5d, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x66, 0x5e, 0x6a, 0x6b, 0x2a, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x2e, 0x26, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2f, 0x23, 0x36, + 0x6c, 0x63, 0x6d, 0x64, 0x5c, 0x66, 0x69, 0x6e, + 0x6f, 0x70, 0x71, 0x69, 0x69, 0x72, 0x6c, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x34, 0x27, 0x22, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x34, 0x26, 0x73, + 0x74, 0x75, 0x76, 0x64, 0x65, 0x77, 0x69, 0x78, + 0x70, 0x71, 0x71, 0x71, 0x72, 0x5f, 0x5e, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x25, 0x38, 0x2a, 0x23, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x33, 0x79, + 0x63, 0x7a, 0x7b, 0x5c, 0x66, 0x69, 0x6e, 0x7c, + 0x71, 0x71, 0x69, 0x7d, 0x7e, 0x7a, 0x7f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x51, 0x2b, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x32, 0x24, + 0x80, 0x81, 0x64, 0x82, 0x77, 0x69, 0x71, 0x71, + 0x69, 0x83, 0x84, 0x85, 0x7a, 0x85, 0x86, 0x36, + 0x21, 0x2b, 0x23, 0x36, 0x36, 0x39, 0x2e, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2d, 0x33, 0x21, + 0x87, 0x88, 0x89, 0x72, 0x67, 0x66, 0x5f, 0x89, + 0x8a, 0x63, 0x85, 0x8b, 0x8c, 0x8d, 0x41, 0x36, + 0x36, 0x2d, 0x3a, 0x35, 0x36, 0x24, 0x51, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x33, 0x21, + 0x55, 0x8e, 0x8f, 0x8a, 0x7d, 0x5e, 0x90, 0x7e, + 0x75, 0x75, 0x90, 0x62, 0x40, 0x3f, 0x49, 0x23, + 0x36, 0x24, 0x3a, 0x3a, 0x24, 0x36, 0x2e, 0x31, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x33, 0x37, 0x25, 0x22, + 0x3b, 0x50, 0x8e, 0x8f, 0x90, 0x7e, 0x90, 0x63, + 0x74, 0x91, 0x92, 0x42, 0x93, 0x4b, 0x45, 0x2c, + 0x36, 0x36, 0x33, 0x39, 0x21, 0x36, 0x22, 0x51, + 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x27, 0x2e, 0x2e, 0x36, 0x21, + 0x94, 0x3f, 0x50, 0x95, 0x96, 0x8f, 0x8f, 0x97, + 0x8e, 0x42, 0x50, 0x43, 0x47, 0x48, 0x48, 0x98, + 0x21, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, + 0x2e, 0x27, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x2b, 0x38, 0x28, 0x36, 0x32, + 0x4c, 0x4b, 0x50, 0x50, 0x50, 0x42, 0x42, 0x50, + 0x50, 0x40, 0x45, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x23, + 0x2f, 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x32, 0x51, 0x32, 0x28, 0x21, 0x98, + 0x48, 0x47, 0x9a, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x9a, 0x4f, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x93, 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2f, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x23, 0x30, 0x2e, 0x2c, 0x36, 0x21, 0x51, 0x9b, + 0x48, 0x48, 0x52, 0x3f, 0x50, 0x50, 0x40, 0x4b, + 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2d, 0x31, 0x27, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x2c, 0x2d, 0x21, 0x36, 0x28, 0x44, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x46, 0x4f, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x9c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x28, 0x51, 0x39, 0x26, 0x22, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x35, 0x51, 0x28, 0x36, 0x36, 0x9d, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x9b, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4f, 0x28, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x38, 0x2b, 0x25, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x51, 0x25, 0x36, 0x36, 0x23, 0x40, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x9b, 0x99, 0x2b, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x2f, 0x33, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x23, 0x30, 0x34, + 0x27, 0x36, 0x36, 0x36, 0x2a, 0x40, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x99, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x47, 0x52, + 0x46, 0x4f, 0x37, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x30, 0x34, 0x2a, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, 0x39, 0x2c, + 0x36, 0x36, 0x36, 0x21, 0x31, 0x4e, 0x9a, 0x4c, + 0x47, 0x9b, 0x9b, 0x52, 0x46, 0x4f, 0x52, 0x9b, + 0x9b, 0x9b, 0x47, 0x4f, 0x45, 0x9a, 0x93, 0x93, + 0x3f, 0x93, 0x98, 0x28, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x28, + 0x36, 0x36, 0x36, 0x22, 0x38, 0x98, 0x44, 0x99, + 0x9b, 0x48, 0x48, 0x9b, 0x4c, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x52, 0x46, 0x43, 0x93, + 0x40, 0x40, 0x43, 0x53, 0x21, 0x23, 0x33, 0x23, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x2f, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x2b, 0x31, 0x36, + 0x36, 0x22, 0x36, 0x24, 0x9e, 0x4f, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x9f, 0x52, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x47, + 0x4f, 0x9a, 0x3f, 0x46, 0x38, 0x36, 0x21, 0x30, + 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, + 0x25, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2e, 0x33, 0x36, + 0x25, 0x25, 0x36, 0x4d, 0x52, 0x48, 0x48, 0x48, + 0x47, 0x9f, 0x48, 0x48, 0x48, 0xa0, 0xa1, 0xa2, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x47, 0x44, 0x93, 0x43, 0x23, 0x36, 0x36, + 0x26, 0x24, 0x36, 0x36, 0x36, 0x36, 0x28, 0x2f, + 0x2a, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x51, 0x24, 0x36, + 0x2a, 0x36, 0x28, 0x44, 0x48, 0x48, 0x48, 0x48, + 0xa3, 0xa4, 0x48, 0x48, 0x9f, 0xa5, 0xa6, 0x9f, + 0x48, 0x48, 0x48, 0xa2, 0xa7, 0x47, 0x48, 0x48, + 0x48, 0x48, 0x9b, 0x4b, 0x44, 0x37, 0x36, 0x23, + 0x28, 0x30, 0x22, 0x36, 0x36, 0x36, 0x36, 0x2d, + 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x2b, 0x34, 0x36, 0x25, + 0x24, 0x36, 0x4a, 0x48, 0x48, 0x48, 0x48, 0x48, + 0xa8, 0xa1, 0x48, 0x48, 0x9f, 0xa9, 0xa6, 0x9f, + 0x48, 0x48, 0xaa, 0xa1, 0xa5, 0x9f, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x52, 0x3f, 0x21, 0x30, + 0x35, 0x25, 0x30, 0x36, 0x36, 0x36, 0x36, 0x32, + 0x2d, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x26, 0x2e, 0x35, 0x36, 0x2a, + 0x36, 0x24, 0x4f, 0x48, 0x52, 0x52, 0x48, 0x48, + 0xab, 0xac, 0xa0, 0x48, 0xad, 0xa6, 0xa6, 0x9f, + 0x48, 0xa2, 0xa9, 0xa6, 0xa2, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x47, 0x32, 0x30, + 0x2a, 0x23, 0x30, 0x23, 0x36, 0x36, 0x36, 0x21, + 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x2a, 0x51, 0x28, 0x28, 0x25, + 0x36, 0x3a, 0x48, 0x48, 0xae, 0xaf, 0x48, 0x48, + 0xad, 0xac, 0xa1, 0x9f, 0xa2, 0xa9, 0xa9, 0xa2, + 0x48, 0xab, 0x78, 0xa7, 0x48, 0x48, 0x48, 0x48, + 0x9f, 0x48, 0x48, 0x48, 0x48, 0x48, 0x38, 0x21, + 0x36, 0x36, 0x22, 0x27, 0x36, 0x36, 0x36, 0x36, + 0x2e, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x25, 0x2c, 0x34, 0x36, 0x30, 0x21, + 0x23, 0x43, 0x48, 0x48, 0xb0, 0xb1, 0xb2, 0x9f, + 0x48, 0xb3, 0xa5, 0xb3, 0xab, 0xa9, 0xa9, 0xb3, + 0xb4, 0xa9, 0xb5, 0xb0, 0x48, 0x48, 0xa0, 0xa5, + 0xa1, 0xad, 0x48, 0x48, 0x48, 0x48, 0x94, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2e, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x2a, 0x51, 0x25, 0x21, 0x2a, 0x36, + 0x2e, 0x9b, 0x48, 0x48, 0x48, 0xb6, 0xb7, 0xa4, + 0xa2, 0xa7, 0xb5, 0x78, 0x6f, 0x6f, 0x6e, 0x6f, + 0xa9, 0xb5, 0xab, 0x48, 0x9f, 0xab, 0xa9, 0xa1, + 0xaa, 0x48, 0x48, 0x48, 0x48, 0x48, 0x98, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x22, 0x2f, 0x30, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x25, 0x2c, 0x34, 0x36, 0x24, 0x28, 0x36, + 0x54, 0x48, 0x48, 0x48, 0x48, 0xa2, 0xa8, 0xa1, + 0xa5, 0xa6, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, + 0x6f, 0x78, 0xa5, 0xa0, 0xa0, 0x78, 0xa6, 0xa2, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x9a, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x36, 0x36, 0x36, 0x36, + 0x21, 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x32, 0x2f, 0x28, 0x36, 0x27, 0x22, 0x21, + 0x43, 0x48, 0x4b, 0xa2, 0x9f, 0x48, 0xa2, 0xa1, + 0xb8, 0x6e, 0x6e, 0xb5, 0x78, 0x6f, 0x78, 0x78, + 0x6e, 0x6f, 0x78, 0xb5, 0xa6, 0xa1, 0xa0, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4b, 0x21, + 0x36, 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x25, 0x2c, 0x39, 0x36, 0x36, 0x30, 0x22, 0x25, + 0x52, 0x48, 0xa3, 0xb1, 0xb6, 0xb3, 0xaa, 0xac, + 0x68, 0x68, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, + 0x78, 0x6f, 0x6f, 0xb5, 0xa6, 0xb4, 0x48, 0x9f, + 0xb4, 0xb4, 0xa2, 0x9f, 0x48, 0x48, 0x4f, 0x21, + 0x36, 0x36, 0x22, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x30, 0x2d, 0x21, 0x36, 0x36, 0x32, 0x23, 0x2a, + 0x47, 0x48, 0xa2, 0xb6, 0xaf, 0xb9, 0xba, 0x68, + 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x78, + 0x6f, 0x6f, 0xa6, 0x6f, 0xb5, 0xa0, 0xaa, 0xa6, + 0xa6, 0xa9, 0xb2, 0xb3, 0x48, 0x48, 0x4c, 0x22, + 0x36, 0x36, 0x24, 0x23, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0x2e, 0x36, 0x36, 0x23, 0x31, 0x27, 0x39, + 0x9b, 0x48, 0x48, 0x48, 0xb0, 0xb0, 0xba, 0xb8, + 0x68, 0x68, 0x69, 0x78, 0x6f, 0xb5, 0x6f, 0xb5, + 0x78, 0x78, 0x78, 0x78, 0x78, 0xa5, 0xbb, 0xa9, + 0xa5, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4c, 0x23, + 0x36, 0x36, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x2b, 0x39, 0x36, 0x36, 0x36, 0x26, 0x32, 0x31, + 0x9b, 0x48, 0x48, 0x48, 0x48, 0x9f, 0xac, 0x68, + 0xbc, 0x6e, 0x6e, 0x6e, 0xb5, 0x6f, 0x6e, 0x6f, + 0x6f, 0x78, 0x78, 0xb5, 0xb5, 0xa5, 0x9f, 0x9f, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x46, 0x22, + 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x39, 0x36, 0x36, 0x36, 0x36, 0x26, 0x2d, + 0x9b, 0x48, 0x48, 0xb0, 0xaa, 0xb3, 0xbd, 0xb8, + 0xb8, 0x68, 0x6e, 0x6e, 0xb5, 0x6f, 0x78, 0x6e, + 0x78, 0x6f, 0x78, 0x78, 0xb5, 0xa9, 0xa2, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x9a, 0x36, + 0x24, 0x27, 0xbe, 0x24, 0x25, 0x28, 0x21, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x25, + 0x39, 0x4d, 0xbf, 0x84, 0x81, 0x57, 0x21, 0x39, + 0x52, 0x48, 0x48, 0x62, 0xb1, 0xc0, 0xc1, 0xc1, + 0xb8, 0xb8, 0x68, 0xbc, 0x6e, 0x6e, 0x6e, 0x78, + 0x78, 0x78, 0x78, 0x6e, 0x78, 0xa9, 0xa0, 0xab, + 0xb3, 0xa2, 0x48, 0x48, 0x48, 0x48, 0x53, 0x28, + 0x23, 0x36, 0x36, 0x36, 0x21, 0x28, 0x2c, 0x30, + 0x21, 0x38, 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x28, 0x30, + 0x2d, 0xc2, 0x7a, 0xc3, 0xc4, 0xc4, 0x7f, 0x22, + 0x51, 0x52, 0x48, 0x48, 0xb0, 0xaa, 0xa8, 0xbd, + 0x68, 0xb8, 0xb8, 0x68, 0x68, 0x6e, 0x6e, 0x6f, + 0x6e, 0x6e, 0xb5, 0x6e, 0x78, 0xab, 0xab, 0xb5, + 0x78, 0xa6, 0xb3, 0xc5, 0xac, 0xac, 0xc6, 0x61, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x30, 0x32, + 0x25, 0x4d, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x24, 0x26, 0x30, 0x33, 0x31, + 0x4d, 0x91, 0x5b, 0xc3, 0xc4, 0xc4, 0xc4, 0x5a, + 0x21, 0x2e, 0x46, 0x48, 0x48, 0x48, 0xb0, 0x64, + 0xc1, 0xb8, 0xb8, 0xb8, 0x68, 0x71, 0x6e, 0x6e, + 0x6f, 0x71, 0x6f, 0x6f, 0xa6, 0xa0, 0x9f, 0xb4, + 0xb4, 0xa0, 0xa1, 0xb7, 0xc7, 0x69, 0x66, 0xc8, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x26, 0x25, + 0x83, 0xc9, 0x2c, 0x25, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x30, 0x35, 0x2d, 0x2f, 0x37, 0x4a, + 0x60, 0x85, 0xca, 0xcb, 0xc4, 0xc4, 0xc4, 0x82, + 0x86, 0x36, 0x32, 0x3f, 0xa2, 0xa4, 0xa8, 0xa9, + 0xb8, 0xb8, 0xb8, 0xb8, 0x68, 0x6e, 0x6e, 0x6e, + 0x6e, 0x71, 0x6f, 0x71, 0xa6, 0xb4, 0x9f, 0x9f, + 0x48, 0x48, 0x48, 0xcc, 0xc3, 0xc7, 0xcd, 0xce, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x57, + 0x77, 0x66, 0x34, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x23, 0x30, 0x31, 0xcf, 0x91, 0x7e, 0x90, 0x90, + 0x8b, 0x5b, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0x5d, 0xd0, 0x36, 0x24, 0xd1, 0xb1, 0xaf, 0xaa, + 0xba, 0xb8, 0x68, 0x68, 0x68, 0x71, 0x6e, 0x6e, + 0x6e, 0x6f, 0x6e, 0x78, 0xa1, 0xa9, 0xa1, 0xb0, + 0x9f, 0x9b, 0x99, 0xcc, 0x64, 0x5c, 0x8b, 0xd0, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x73, 0x5d, + 0x82, 0x5c, 0xd2, 0x2a, 0x23, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x24, 0x2b, 0xcf, 0x8b, 0x5b, 0x76, 0x5b, 0x5b, + 0x7b, 0xc3, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc7, 0x5e, 0x22, 0x36, 0x21, 0x3a, 0x99, 0x48, + 0xa2, 0xa8, 0xb7, 0xc1, 0xb8, 0x68, 0x68, 0xbc, + 0x68, 0x6e, 0xb5, 0xb4, 0xb4, 0xab, 0xb5, 0xa1, + 0xb0, 0x4f, 0x3f, 0xd3, 0x7b, 0x7b, 0x85, 0x80, + 0xbe, 0x36, 0x36, 0x36, 0x21, 0xd4, 0x7e, 0x7b, + 0x64, 0x64, 0xd5, 0x35, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x31, 0xd6, 0x5b, 0x64, 0xc3, 0xc3, 0xcb, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0x66, 0xd7, 0x36, 0x36, 0x36, 0x2c, 0x4b, + 0xd8, 0xd9, 0xb3, 0xa8, 0xbd, 0xbd, 0xbd, 0xbd, + 0xa9, 0xab, 0xb3, 0xa5, 0xa2, 0x9f, 0xa2, 0xa1, + 0x6a, 0x9a, 0x3f, 0xda, 0x76, 0x76, 0x7a, 0x63, + 0xdb, 0xdc, 0x86, 0xdc, 0xdd, 0x90, 0x5b, 0x64, + 0xc3, 0xc3, 0xde, 0x2d, 0x27, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x26, 0x2d, 0x91, 0x5b, 0x64, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc7, 0x83, 0xce, 0x36, 0x36, 0x36, 0x30, + 0xb1, 0xd9, 0x48, 0xa1, 0xb2, 0xb0, 0xb0, 0xb3, + 0xa2, 0x48, 0xa7, 0xbd, 0xa9, 0xa2, 0x48, 0x9f, + 0xaa, 0x9a, 0x3f, 0xb1, 0x5b, 0x7b, 0xdf, 0x85, + 0x7e, 0x90, 0x63, 0x90, 0x85, 0x5b, 0xc3, 0xc4, + 0xc4, 0xcb, 0x5d, 0xd5, 0x39, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xe0, 0xdf, 0x64, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc7, 0x88, 0x36, 0x36, 0x36, 0x36, + 0x2d, 0x9b, 0x48, 0xb9, 0xaf, 0xa2, 0xa2, 0xb9, + 0xa8, 0x9f, 0x48, 0xa7, 0xb7, 0xd9, 0x48, 0x48, + 0x9b, 0x45, 0x3f, 0xe1, 0x6d, 0x7b, 0xca, 0xdf, + 0x7a, 0x8b, 0x8b, 0x7a, 0x5b, 0x64, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc3, 0xe2, 0x37, 0x35, 0x26, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2e, 0xe0, 0x7a, 0x7b, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc7, 0x72, 0x73, 0x36, 0x36, 0x36, + 0x24, 0x52, 0x48, 0xa3, 0xaf, 0x9f, 0x48, 0xb6, + 0xaf, 0xa2, 0x48, 0x9f, 0xe3, 0xd8, 0x48, 0x48, + 0x48, 0x46, 0x42, 0xd6, 0x7a, 0x7b, 0x64, 0x7b, + 0x76, 0x5b, 0x5b, 0x76, 0x7b, 0xc3, 0xc4, 0xc4, + 0xc4, 0xc4, 0xcb, 0x64, 0xe2, 0x4d, 0x2c, 0x27, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xe4, 0x8b, 0x7b, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc7, 0x89, 0xbe, 0x36, 0x36, + 0x32, 0x47, 0x48, 0x4f, 0xa0, 0x48, 0x48, 0xe3, + 0x92, 0x9f, 0x48, 0x9f, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4b, 0x2f, 0x8f, 0x7a, 0x7b, 0xc3, 0xcb, + 0xc3, 0x64, 0x64, 0xc3, 0xc3, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0x5d, 0xe5, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xe4, 0x85, 0x7b, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0x66, 0x57, 0x27, 0x4d, + 0x4b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x99, 0x34, 0xbe, 0xdb, 0x7a, 0x7b, 0xc3, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xe4, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xe4, 0x85, 0x7b, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc7, 0x5f, 0x92, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x44, + 0x35, 0x36, 0xce, 0xdd, 0x7a, 0x7b, 0xcb, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0xc3, 0xe1, + 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x30, 0x2f, 0xd6, 0x8b, 0x7b, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0x66, 0x89, 0x45, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x4e, 0x25, + 0x36, 0x36, 0x61, 0xdb, 0x6d, 0x64, 0xcb, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0x7b, 0xdf, 0xe5, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xe6, 0x63, 0xdf, 0xc3, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0x72, 0x81, 0xe7, + 0x46, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x3f, 0x2c, 0x36, 0x36, + 0x36, 0x36, 0xe8, 0x8f, 0x6d, 0x64, 0xcb, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc3, 0xca, 0x8b, 0xcf, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x96, 0x75, 0xca, 0xc3, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0x7b, 0x81, 0xdb, + 0x73, 0x3b, 0x44, 0x9b, 0x48, 0x48, 0x48, 0x9b, + 0x99, 0x43, 0x94, 0x2c, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x73, 0xdb, 0x7a, 0x7b, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0x64, 0x76, 0x7a, 0x91, 0xd5, 0x31, 0x30, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x39, 0x97, 0x75, 0xdf, 0x7b, 0x64, 0xc3, 0xc3, + 0xcb, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0x7b, 0x7a, 0xe9, + 0xea, 0x36, 0x21, 0x26, 0x2b, 0x39, 0x33, 0x30, + 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xea, 0xdd, 0x8b, 0x7b, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0x64, 0x64, + 0x76, 0x85, 0xe0, 0xd5, 0x34, 0x2b, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xeb, 0x63, 0x7e, 0x7a, 0x6d, 0xdf, 0x5b, + 0x76, 0x7b, 0x64, 0x64, 0xc3, 0xcb, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xcb, 0x76, 0x85, 0xdb, + 0x79, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xec, 0xdd, 0x75, 0x76, 0xc3, 0xc4, + 0xc4, 0xc4, 0xcb, 0xc3, 0x64, 0x76, 0xdf, 0x8b, + 0xd6, 0xd5, 0x2f, 0x35, 0x30, 0x24, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x31, 0xed, 0xeb, 0xdd, 0x74, 0x63, 0x90, + 0x7e, 0x75, 0x8b, 0x6d, 0xdf, 0x76, 0x64, 0xc3, + 0xcb, 0xcb, 0xcb, 0xcb, 0x64, 0x7a, 0x84, 0xee, + 0x79, 0xbe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xea, 0xee, 0x63, 0x6d, 0x7b, 0x64, + 0xcb, 0xc3, 0x64, 0x7b, 0xdf, 0x75, 0x63, 0x96, + 0x38, 0x39, 0x2a, 0x24, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x27, 0x35, 0x2d, 0x41, 0xd5, 0xe7, 0x8f, + 0xdb, 0xdd, 0xe9, 0x74, 0x84, 0x90, 0x85, 0x6d, + 0x5b, 0x7b, 0x7b, 0xca, 0x6d, 0x90, 0xdb, 0xef, + 0xec, 0x22, 0x36, 0x36, 0x28, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x25, 0x36, + 0x36, 0x21, 0xd4, 0x80, 0xe9, 0x7e, 0x6d, 0x76, + 0xca, 0x76, 0x6d, 0x85, 0x63, 0xdb, 0xd5, 0x34, + 0x33, 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x24, 0x27, 0x2a, 0x35, 0x2e, 0x2f, + 0x41, 0xf0, 0xf1, 0x6c, 0x80, 0xee, 0xdb, 0x74, + 0x84, 0x90, 0x75, 0x7e, 0x74, 0x8f, 0xef, 0x79, + 0xe8, 0x2b, 0x9d, 0x41, 0x2f, 0x34, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x34, 0x2f, 0x38, + 0x4d, 0x37, 0xf2, 0xf3, 0x8f, 0x74, 0x63, 0x7e, + 0x75, 0x7e, 0x63, 0xe9, 0x88, 0xe6, 0x31, 0x2a, + 0x24, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x22, 0x23, 0x24, 0x26, 0x30, + 0x33, 0x39, 0x2e, 0x51, 0x41, 0xd2, 0x6c, 0xf3, + 0x80, 0xee, 0xee, 0xee, 0xf4, 0xf3, 0xd7, 0xf5, + 0x41, 0x34, 0x35, 0x32, 0x30, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x30, 0x2a, + 0x2b, 0x34, 0xf6, 0xec, 0xf7, 0x8f, 0xdd, 0xe9, + 0xe9, 0xdd, 0xee, 0x6c, 0x41, 0x39, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, + 0x28, 0x24, 0x26, 0x2a, 0x33, 0x2c, 0x2f, 0x41, + 0xf8, 0xd7, 0x79, 0x79, 0x79, 0xec, 0xf9, 0x51, + 0x39, 0x30, 0x24, 0x23, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0x22, 0x23, + 0x24, 0x2a, 0x31, 0xfa, 0xea, 0x79, 0xf3, 0x80, + 0xf7, 0xdc, 0xfb, 0x2f, 0x35, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x28, 0x25, 0x30, 0x2b, + 0x31, 0x2f, 0xf6, 0xfa, 0xfa, 0x2f, 0x2e, 0x33, + 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x27, 0x35, 0x34, 0xfa, 0xfa, 0xfa, + 0xfc, 0xf6, 0x2e, 0x33, 0x25, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x23, 0x28, + 0x26, 0x30, 0x32, 0x2b, 0x33, 0x2a, 0x26, 0x28, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x25, 0x30, 0x33, 0x35, 0x35, + 0x2b, 0x2a, 0x26, 0x28, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x21, 0x22, 0x23, 0x28, 0x28, 0x23, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x23, 0x28, 0x24, 0x24, + 0x28, 0x23, 0x22, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }; -unsigned char linux_logo16_red[0]; -unsigned char linux_logo16_green[0]; -unsigned char linux_logo16_blue[0]; unsigned char linux_logo16[0]; -#else +#endif /* INCLUDE_LINUX_LOGO_DATA */ -/* prototypes only */ -extern unsigned char linux_logo_red[]; -extern unsigned char linux_logo_green[]; -extern unsigned char linux_logo_blue[]; -extern unsigned char linux_logo[]; -extern unsigned char linux_logo_bw[]; -extern unsigned char linux_logo16_red[]; -extern unsigned char linux_logo16_green[]; -extern unsigned char linux_logo16_blue[]; -extern unsigned char linux_logo16[]; +#include -#endif diff -u --recursive --new-file v2.4.5/linux/include/asm-sparc64/sab82532.h linux/include/asm-sparc64/sab82532.h --- v2.4.5/linux/include/asm-sparc64/sab82532.h Fri Apr 14 09:37:10 2000 +++ linux/include/asm-sparc64/sab82532.h Tue Jun 5 18:11:44 2001 @@ -1,4 +1,4 @@ -/* $Id: sab82532.h,v 1.6 2000/04/13 07:22:35 ecd Exp $ +/* $Id: sab82532.h,v 1.7 2001/05/23 23:09:10 ecd Exp $ * sab82532.h: Register Definitions for the Siemens SAB82532 DUSCC * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -9,6 +9,7 @@ #include #include +#include struct sab82532_async_rd_regs { u8 rfifo[0x20]; /* Receive FIFO */ @@ -150,7 +151,7 @@ int close_delay; unsigned short closing_wait; unsigned short closing_wait2; - int all_sent; + unsigned long irqflags; int is_console; unsigned char interrupt_mask0; unsigned char interrupt_mask1; @@ -166,10 +167,7 @@ int blocked_open; long session; long pgrp; - unsigned char *xmit_buf; - int xmit_head; - int xmit_tail; - int xmit_cnt; + struct circ_buf xmit; struct tq_struct tqueue; struct tq_struct tqueue_hangup; struct async_icount icount; @@ -181,6 +179,11 @@ struct sab82532 *next; struct sab82532 *prev; }; + + +/* irqflags bits */ +#define SAB82532_ALLS 0x00000001 +#define SAB82532_XPR 0x00000002 /* RFIFO Status Byte */ diff -u --recursive --new-file v2.4.5/linux/include/asm-sparc64/termios.h linux/include/asm-sparc64/termios.h --- v2.4.5/linux/include/asm-sparc64/termios.h Fri Feb 9 11:37:03 2001 +++ linux/include/asm-sparc64/termios.h Tue Jun 5 18:11:42 2001 @@ -1,4 +1,4 @@ -/* $Id: termios.h,v 1.10 2001/02/05 05:54:29 davem Exp $ */ +/* $Id: termios.h,v 1.11 2001/06/01 08:12:11 davem Exp $ */ #ifndef _SPARC64_TERMIOS_H #define _SPARC64_TERMIOS_H @@ -70,6 +70,7 @@ #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ #define N_HDLC 13 /* synchronous HDLC */ #define N_SYNC_PPP 14 /* synchronous PPP */ +#define N_HCI 15 /* Bluetooth HCI UART */ #ifdef __KERNEL__ diff -u --recursive --new-file v2.4.5/linux/include/linux/dcache.h linux/include/linux/dcache.h --- v2.4.5/linux/include/linux/dcache.h Fri Apr 27 15:48:18 2001 +++ linux/include/linux/dcache.h Fri Jun 8 14:03:27 2001 @@ -68,12 +68,12 @@ unsigned int d_flags; struct inode * d_inode; /* Where the name belongs to - NULL is negative */ struct dentry * d_parent; /* parent directory */ - struct list_head d_vfsmnt; struct list_head d_hash; /* lookup hash list */ struct list_head d_lru; /* d_count = 0 LRU list */ struct list_head d_child; /* child of parent list */ struct list_head d_subdirs; /* our children */ struct list_head d_alias; /* inode alias list */ + int d_mounted; struct qstr d_name; unsigned long d_time; /* used by d_revalidate */ struct dentry_operations *d_op; @@ -265,9 +265,10 @@ static __inline__ int d_mountpoint(struct dentry *dentry) { - return !list_empty(&dentry->d_vfsmnt); + return dentry->d_mounted; } +extern struct vfsmount *lookup_mnt(struct vfsmount *, struct dentry *); #endif /* __KERNEL__ */ #endif /* __LINUX_DCACHE_H */ diff -u --recursive --new-file v2.4.5/linux/include/linux/ext2_fs.h linux/include/linux/ext2_fs.h --- v2.4.5/linux/include/linux/ext2_fs.h Fri Apr 27 15:48:20 2001 +++ linux/include/linux/ext2_fs.h Fri Jun 8 14:03:27 2001 @@ -498,16 +498,17 @@ * Ext2 directory file types. Only the low 3 bits are used. The * other bits are reserved for now. */ -#define EXT2_FT_UNKNOWN 0 -#define EXT2_FT_REG_FILE 1 -#define EXT2_FT_DIR 2 -#define EXT2_FT_CHRDEV 3 -#define EXT2_FT_BLKDEV 4 -#define EXT2_FT_FIFO 5 -#define EXT2_FT_SOCK 6 -#define EXT2_FT_SYMLINK 7 - -#define EXT2_FT_MAX 8 +enum { + EXT2_FT_UNKNOWN, + EXT2_FT_REG_FILE, + EXT2_FT_DIR, + EXT2_FT_CHRDEV, + EXT2_FT_BLKDEV, + EXT2_FT_FIFO, + EXT2_FT_SOCK, + EXT2_FT_SYMLINK, + EXT2_FT_MAX +}; /* * EXT2_DIR_PAD defines the directory entries boundaries @@ -552,9 +553,6 @@ extern unsigned long ext2_count_free (struct buffer_head *, unsigned); /* dir.c */ -extern int ext2_check_dir_entry (const char *, struct inode *, - struct ext2_dir_entry_2 *, struct buffer_head *, - unsigned long); /* file.c */ extern int ext2_read (struct inode *, struct file *, char *, int); @@ -613,6 +611,14 @@ /* dir.c */ extern struct file_operations ext2_dir_operations; +extern int ext2_add_link (struct dentry *, struct inode *); +extern ino_t ext2_inode_by_name(struct inode *, struct dentry *); +extern int ext2_make_empty(struct inode *, struct inode *); +extern struct ext2_dir_entry_2 * ext2_find_entry (struct inode *,struct dentry *, struct page **); +extern int ext2_delete_entry (struct ext2_dir_entry_2 *, struct page *); +extern int ext2_empty_dir (struct inode *); +extern struct ext2_dir_entry_2 * ext2_dotdot (struct inode *, struct page **); +extern void ext2_set_link(struct inode *, struct ext2_dir_entry_2 *, struct page *, struct inode *); /* file.c */ extern struct inode_operations ext2_file_inode_operations; diff -u --recursive --new-file v2.4.5/linux/include/linux/fs.h linux/include/linux/fs.h --- v2.4.5/linux/include/linux/fs.h Fri May 25 18:28:55 2001 +++ linux/include/linux/fs.h Fri Jun 8 14:03:27 2001 @@ -204,15 +204,22 @@ extern void buffer_init(unsigned long); extern void inode_init(unsigned long); +extern void mnt_init(unsigned long); /* bh state bits */ -#define BH_Uptodate 0 /* 1 if the buffer contains valid data */ -#define BH_Dirty 1 /* 1 if the buffer is dirty */ -#define BH_Lock 2 /* 1 if the buffer is locked */ -#define BH_Req 3 /* 0 if the buffer has been invalidated */ -#define BH_Mapped 4 /* 1 if the buffer has a disk mapping */ -#define BH_New 5 /* 1 if the buffer is new and not yet written out */ -#define BH_Protected 6 /* 1 if the buffer is protected */ +enum bh_state_bits { + BH_Uptodate, /* 1 if the buffer contains valid data */ + BH_Dirty, /* 1 if the buffer is dirty */ + BH_Lock, /* 1 if the buffer is locked */ + BH_Req, /* 0 if the buffer has been invalidated */ + BH_Mapped, /* 1 if the buffer has a disk mapping */ + BH_New, /* 1 if the buffer is new and not yet written out */ + BH_Protected, /* 1 if the buffer is protected */ + + BH_PrivateStart,/* not a state bit, but the first bit available + * for private allocation by other entities + */ +}; /* * Try to keep the most commonly used fields in single cache lines (16 diff -u --recursive --new-file v2.4.5/linux/include/linux/if_tun.h linux/include/linux/if_tun.h --- v2.4.5/linux/include/linux/if_tun.h Wed Aug 23 09:30:13 2000 +++ linux/include/linux/if_tun.h Tue Jun 5 18:11:42 2001 @@ -12,7 +12,7 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * $Id: if_tun.h,v 1.1 2000/08/23 05:59:28 davem Exp $ + * $Id: if_tun.h,v 1.2 2001/06/01 18:39:47 davem Exp $ */ #ifndef __IF_TUN_H @@ -32,15 +32,18 @@ #endif struct tun_struct { - char name[8]; + char *name; unsigned long flags; + int attached; + uid_t owner; - struct fasync_struct *fasync; wait_queue_head_t read_wait; + struct sk_buff_head readq; struct net_device dev; - struct sk_buff_head txq; - struct net_device_stats stats; + struct net_device_stats stats; + + struct fasync_struct *fasync; #ifdef TUN_DEBUG int debug; @@ -53,14 +56,8 @@ #endif /* __KERNEL__ */ -/* Number of devices */ -#define TUN_MAX_DEV 255 - -/* TX queue size */ -#define TUN_TXQ_SIZE 10 - -/* Max frame size */ -#define TUN_MAX_FRAME 4096 +/* Read queue size */ +#define TUN_READQ_SIZE 10 /* TUN device flags */ #define TUN_TUN_DEV 0x0001 @@ -70,22 +67,25 @@ #define TUN_FASYNC 0x0010 #define TUN_NOCHECKSUM 0x0020 #define TUN_NO_PI 0x0040 - -#define TUN_IFF_SET 0x1000 +#define TUN_ONE_QUEUE 0x0080 +#define TUN_PERSIST 0x0100 /* Ioctl defines */ -#define TUNSETNOCSUM (('T'<< 8) | 200) -#define TUNSETDEBUG (('T'<< 8) | 201) -#define TUNSETIFF (('T'<< 8) | 202) +#define TUNSETNOCSUM _IOW('T', 200, int) +#define TUNSETDEBUG _IOW('T', 201, int) +#define TUNSETIFF _IOW('T', 202, int) +#define TUNSETPERSIST _IOW('T', 203, int) +#define TUNSETOWNER _IOW('T', 204, int) /* TUNSETIFF ifr flags */ #define IFF_TUN 0x0001 #define IFF_TAP 0x0002 #define IFF_NO_PI 0x1000 +#define IFF_ONE_QUEUE 0x2000 struct tun_pi { - unsigned short flags; - unsigned short proto; + unsigned short flags; + unsigned short proto; }; #define TUN_PKT_STRIP 0x0001 diff -u --recursive --new-file v2.4.5/linux/include/linux/interrupt.h linux/include/linux/interrupt.h --- v2.4.5/linux/include/linux/interrupt.h Fri Apr 27 15:48:27 2001 +++ linux/include/linux/interrupt.h Fri Jun 8 14:03:27 2001 @@ -74,22 +74,6 @@ asmlinkage void do_softirq(void); extern void open_softirq(int nr, void (*action)(struct softirq_action*), void *data); -static inline void __cpu_raise_softirq(int cpu, int nr) -{ - softirq_active(cpu) |= (1<state)) -#define tasklet_unlock_wait(t) while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); } #define tasklet_unlock(t) clear_bit(TASKLET_STATE_RUN, &(t)->state) -#else -#define tasklet_trylock(t) 1 -#define tasklet_unlock_wait(t) do { } while (0) -#define tasklet_unlock(t) do { } while (0) -#endif - -static inline void tasklet_schedule(struct tasklet_struct *t) -{ - if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { - int cpu = smp_processor_id(); - unsigned long flags; - - local_irq_save(flags); - t->next = tasklet_vec[cpu].list; - tasklet_vec[cpu].list = t; - __cpu_raise_softirq(cpu, TASKLET_SOFTIRQ); - local_irq_restore(flags); - } -} - -static inline void tasklet_hi_schedule(struct tasklet_struct *t) -{ - if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { - int cpu = smp_processor_id(); - unsigned long flags; - - local_irq_save(flags); - t->next = tasklet_hi_vec[cpu].list; - tasklet_hi_vec[cpu].list = t; - __cpu_raise_softirq(cpu, HI_SOFTIRQ); - local_irq_restore(flags); - } -} +#define tasklet_unlock_wait(t) while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); } +extern void tasklet_schedule(struct tasklet_struct *t); +extern void tasklet_hi_schedule(struct tasklet_struct *t); static inline void tasklet_disable_nosync(struct tasklet_struct *t) { @@ -196,7 +148,14 @@ static inline void tasklet_enable(struct tasklet_struct *t) { - atomic_dec(&t->count); + if (atomic_dec_and_test(&t->count)) + tasklet_schedule(t); +} + +static inline void tasklet_hi_enable(struct tasklet_struct *t) +{ + if (atomic_dec_and_test(&t->count)) + tasklet_hi_schedule(t); } extern void tasklet_kill(struct tasklet_struct *t); diff -u --recursive --new-file v2.4.5/linux/include/linux/irq_cpustat.h linux/include/linux/irq_cpustat.h --- v2.4.5/linux/include/linux/irq_cpustat.h Fri Apr 27 15:48:20 2001 +++ linux/include/linux/irq_cpustat.h Fri Jun 8 14:03:27 2001 @@ -26,8 +26,7 @@ #endif /* arch independent irq_stat fields */ -#define softirq_active(cpu) __IRQ_STAT((cpu), __softirq_active) -#define softirq_mask(cpu) __IRQ_STAT((cpu), __softirq_mask) +#define softirq_pending(cpu) __IRQ_STAT((cpu), __softirq_pending) #define local_irq_count(cpu) __IRQ_STAT((cpu), __local_irq_count) #define local_bh_count(cpu) __IRQ_STAT((cpu), __local_bh_count) #define syscall_count(cpu) __IRQ_STAT((cpu), __syscall_count) diff -u --recursive --new-file v2.4.5/linux/include/linux/linux_logo.h linux/include/linux/linux_logo.h --- v2.4.5/linux/include/linux/linux_logo.h Wed Sep 30 14:16:33 1998 +++ linux/include/linux/linux_logo.h Wed Jun 6 10:29:05 2001 @@ -18,1428 +18,1403 @@ * but should contain %s to display the version */ -#if LINUX_LOGO_COLORS == 214 +#ifndef __HAVE_ARCH_LINUX_LOGO +#define LINUX_LOGO_COLORS 187 +#endif + +#ifdef INCLUDE_LINUX_LOGO_DATA + +#ifndef __HAVE_ARCH_LINUX_LOGO unsigned char linux_logo_red[] __initdata = { - 0x02, 0x9E, 0xE9, 0xC4, 0x50, 0xC9, 0xC4, 0xE9, - 0x65, 0xE3, 0xC2, 0x25, 0xA4, 0xEC, 0x90, 0xA6, - 0xC4, 0x6A, 0xD1, 0xF3, 0x12, 0xED, 0xA0, 0xC2, - 0xB8, 0xD5, 0xDB, 0xD2, 0x3E, 0x16, 0xEB, 0x54, - 0xA9, 0xCD, 0xF5, 0x0A, 0xBA, 0xB3, 0xDC, 0x74, - 0xCE, 0xF6, 0xD3, 0xC5, 0xEA, 0xB8, 0xED, 0x5E, - 0xE5, 0x26, 0xF4, 0xA9, 0x82, 0x94, 0xE6, 0x38, - 0xF2, 0x0F, 0x7F, 0x49, 0xE5, 0xF4, 0xD3, 0xC3, - 0xC2, 0x1E, 0xD5, 0xC6, 0xA4, 0xFA, 0x0A, 0xBA, - 0xD4, 0xEB, 0xEA, 0xEC, 0xA8, 0xBC, 0xB4, 0xDC, - 0x84, 0xE4, 0xCE, 0xEC, 0x92, 0xCD, 0xDC, 0x8B, - 0xCC, 0x1E, 0xF6, 0xB2, 0x60, 0x2A, 0x96, 0x52, - 0x0F, 0xBD, 0xFA, 0xCC, 0xB8, 0x7A, 0x4C, 0xD2, - 0x06, 0xEF, 0x44, 0x64, 0xF4, 0xBA, 0xCE, 0xE6, - 0x8A, 0x6F, 0x3C, 0x70, 0x7C, 0x9C, 0xBA, 0xDF, - 0x2C, 0x4D, 0x3B, 0xCA, 0xDE, 0xCE, 0xEE, 0x46, - 0x6A, 0xAC, 0x96, 0xE5, 0x96, 0x7A, 0xBA, 0xB6, - 0xE2, 0x7E, 0xAA, 0xC5, 0x96, 0x9E, 0xC2, 0xAA, - 0xDA, 0x35, 0xB6, 0x82, 0x88, 0xBE, 0xC2, 0x9E, - 0xB4, 0xD5, 0xDA, 0x9C, 0xA0, 0xD0, 0xA8, 0xC7, - 0x72, 0xF2, 0xDB, 0x76, 0xDC, 0xBE, 0xAA, 0xF4, - 0x87, 0x2F, 0x53, 0x8E, 0x36, 0xCE, 0xE6, 0xCA, - 0xCB, 0xE4, 0xD6, 0xAA, 0x42, 0x5D, 0xB4, 0x59, - 0x1C, 0xC8, 0x96, 0x6C, 0xDA, 0xCE, 0xE6, 0xCB, - 0x96, 0x16, 0xFA, 0xBE, 0xAE, 0xFE, 0x6E, 0xD6, - 0xCE, 0xB6, 0xE5, 0xED, 0xDB, 0xDC, 0xF4, 0x72, - 0x1F, 0xAE, 0xE6, 0xC2, 0xCA, 0xC4 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x65, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x76, 0x79, + 0x62, 0x36, 0x9a, 0xe2, 0xec, 0xe1, 0xb8, 0xd7, + 0xaf, 0x25, 0xbc, 0xc0, 0xef, 0xea, 0xe8, 0xe8, + 0xf5, 0xf1, 0xda, 0xd3, 0x79, 0xdb, 0xf4, 0xf6, + 0xf6, 0xf6, 0xe2, 0x3d, 0xb4, 0xce, 0xe6, 0xee, + 0xf6, 0x68, 0xd8, 0xec, 0xf5, 0xc6, 0xc8, 0x9c, + 0x89, 0xd2, 0xee, 0xcb, 0xb9, 0xd2, 0x66, 0x5e, + 0x8b, 0xbe, 0xa8, 0xd5, 0xca, 0xb6, 0xae, 0x9c, + 0xc5, 0xbe, 0xbe, 0xca, 0x90, 0xb2, 0x9a, 0xa8, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0x12, + 0x4a, 0x8e, 0xf2, 0xf6, 0xf6, 0xee, 0xb5, 0xe4, + 0xf1, 0x26, 0x9a, 0xea, 0xf6, 0xe0, 0xd2, 0x16, + 0x9a, 0x2e, 0x70, 0xd6, 0x46, 0x7c, 0xb4, 0x62, + 0xd6, 0xa3, 0x74, 0xa7, 0xa2, 0xca, 0xe0, 0xae, + 0xbe, 0xce, 0xa3, 0x8e, 0x6d, 0x8e, 0x32, 0xaf, + 0x50, 0x9e, 0x5b, 0x8a, 0x98, 0x82, 0x7a, 0x82, + 0x56, 0x7c, 0x8a, 0x56, 0x5e, 0x86, 0x6a, 0x52, + 0x59, 0x64, 0x5e, }; unsigned char linux_logo_green[] __initdata = { - 0x02, 0x88, 0xC4, 0x85, 0x44, 0xA2, 0xA8, 0xE5, - 0x65, 0xA6, 0xC2, 0x24, 0xA4, 0xB4, 0x62, 0x86, - 0x94, 0x44, 0xD2, 0xB6, 0x12, 0xD4, 0x73, 0x96, - 0x92, 0x95, 0xB2, 0xC2, 0x36, 0x0E, 0xBC, 0x54, - 0x75, 0xA5, 0xF5, 0x0A, 0xB2, 0x83, 0xC2, 0x74, - 0x9B, 0xBD, 0xA2, 0xCA, 0xDA, 0x8C, 0xCB, 0x42, - 0xAC, 0x12, 0xDA, 0x7B, 0x54, 0x94, 0xD2, 0x24, - 0xBE, 0x06, 0x65, 0x33, 0xBB, 0xBC, 0xAB, 0x8C, - 0x92, 0x1E, 0x9B, 0xB6, 0x6E, 0xFB, 0x04, 0xA2, - 0xC8, 0xBD, 0xAD, 0xEC, 0x92, 0xBC, 0x7B, 0x9D, - 0x84, 0xC4, 0xC4, 0xB4, 0x6C, 0x93, 0xA3, 0x5E, - 0x8D, 0x13, 0xD6, 0x82, 0x4C, 0x2A, 0x7A, 0x5A, - 0x0D, 0x82, 0xBB, 0xCC, 0x8B, 0x6A, 0x3C, 0xBE, - 0x06, 0xC4, 0x44, 0x45, 0xDB, 0x96, 0xB6, 0xDE, - 0x8A, 0x4D, 0x3C, 0x5A, 0x7C, 0x9C, 0xAA, 0xCB, - 0x1C, 0x4D, 0x2E, 0xB2, 0xBE, 0xAA, 0xDE, 0x3E, - 0x6A, 0xAC, 0x82, 0xE5, 0x72, 0x62, 0x92, 0x9E, - 0xCA, 0x4A, 0x8E, 0xBE, 0x86, 0x6B, 0xAA, 0x9A, - 0xBE, 0x34, 0xAB, 0x76, 0x6E, 0x9A, 0x9E, 0x62, - 0x76, 0xCE, 0xD3, 0x92, 0x7C, 0xB8, 0x7E, 0xC6, - 0x5E, 0xE2, 0xC3, 0x54, 0xAA, 0x9E, 0x8A, 0xCA, - 0x63, 0x2D, 0x3B, 0x8E, 0x1A, 0x9E, 0xC2, 0xA6, - 0xCB, 0xDC, 0xD6, 0x8E, 0x26, 0x5C, 0xB4, 0x45, - 0x1C, 0xB8, 0x6E, 0x4C, 0xBC, 0xAE, 0xD6, 0x92, - 0x63, 0x16, 0xF6, 0x8C, 0x7A, 0xFE, 0x6E, 0xBA, - 0xC6, 0x86, 0xAA, 0xAE, 0xDB, 0xA4, 0xD4, 0x56, - 0x0E, 0x6E, 0xB6, 0xB2, 0xBE, 0xBE + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x00, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x02, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x62, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x62, 0x5c, + 0x4e, 0x26, 0x72, 0xaa, 0xba, 0xaf, 0x90, 0xae, + 0x92, 0x1a, 0xa4, 0x85, 0xb6, 0xbe, 0xc3, 0xc8, + 0xcf, 0xd0, 0xc2, 0xce, 0x57, 0xa2, 0xd6, 0xda, + 0xda, 0xd7, 0xb8, 0x2a, 0x7b, 0x91, 0xae, 0xca, + 0xda, 0x45, 0x9e, 0xb2, 0xd7, 0x9b, 0x90, 0x76, + 0x5c, 0xa2, 0xbe, 0xa6, 0x85, 0x96, 0x4e, 0x46, + 0x66, 0x92, 0x7a, 0x9a, 0x96, 0x9d, 0x9a, 0x6b, + 0x8a, 0x8e, 0xb2, 0xca, 0x90, 0xa6, 0x79, 0x7c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0x0e, + 0x36, 0x86, 0xba, 0xbe, 0xe6, 0xcc, 0x8e, 0xb8, + 0xc4, 0x1e, 0x8e, 0xae, 0xba, 0xb2, 0xa6, 0x12, + 0x7a, 0x20, 0x64, 0xaa, 0x2f, 0x70, 0x85, 0x46, + 0xa6, 0x6e, 0x51, 0x72, 0x92, 0xa2, 0xa6, 0x87, + 0x96, 0xa2, 0x85, 0x7a, 0x6a, 0x6e, 0x22, 0x76, + 0x36, 0x76, 0x3c, 0x6e, 0x63, 0x53, 0x66, 0x62, + 0x42, 0x50, 0x56, 0x42, 0x56, 0x56, 0x56, 0x3e, + 0x51, 0x52, 0x56, }; unsigned char linux_logo_blue[] __initdata = { - 0x04, 0x28, 0x10, 0x0B, 0x14, 0x14, 0x74, 0xC7, - 0x64, 0x0E, 0xC3, 0x24, 0xA4, 0x0C, 0x10, 0x20, - 0x0D, 0x04, 0xD1, 0x0D, 0x13, 0x22, 0x0A, 0x40, - 0x14, 0x0C, 0x11, 0x94, 0x0C, 0x08, 0x0B, 0x56, - 0x09, 0x47, 0xF4, 0x0B, 0x9C, 0x07, 0x54, 0x74, - 0x0F, 0x0C, 0x0F, 0xC7, 0x6C, 0x14, 0x14, 0x11, - 0x0B, 0x04, 0x12, 0x0C, 0x05, 0x94, 0x94, 0x0A, - 0x34, 0x09, 0x14, 0x08, 0x2F, 0x15, 0x19, 0x11, - 0x28, 0x0C, 0x0B, 0x94, 0x08, 0xFA, 0x08, 0x7C, - 0xBC, 0x15, 0x0A, 0xEC, 0x64, 0xBB, 0x0A, 0x0C, - 0x84, 0x2C, 0xA0, 0x15, 0x10, 0x0D, 0x0B, 0x0E, - 0x0A, 0x07, 0x10, 0x3C, 0x24, 0x2C, 0x28, 0x5C, - 0x0A, 0x0D, 0x0A, 0xC1, 0x22, 0x4C, 0x10, 0x94, - 0x04, 0x0F, 0x45, 0x08, 0x31, 0x54, 0x3C, 0xBC, - 0x8C, 0x09, 0x3C, 0x18, 0x7C, 0x9C, 0x7C, 0x91, - 0x0C, 0x4D, 0x17, 0x74, 0x0C, 0x48, 0x9C, 0x3C, - 0x6A, 0xAC, 0x5C, 0xE3, 0x29, 0x3C, 0x2C, 0x7C, - 0x6C, 0x04, 0x14, 0xA9, 0x74, 0x07, 0x2C, 0x74, - 0x4C, 0x34, 0x97, 0x5C, 0x38, 0x0C, 0x5C, 0x04, - 0x0C, 0xBA, 0xBC, 0x78, 0x18, 0x88, 0x24, 0xC2, - 0x3C, 0xB4, 0x87, 0x0C, 0x14, 0x4C, 0x3C, 0x10, - 0x17, 0x2C, 0x0A, 0x8C, 0x04, 0x1C, 0x44, 0x2C, - 0xCD, 0xD8, 0xD4, 0x34, 0x0C, 0x5B, 0xB4, 0x1E, - 0x1D, 0xAC, 0x24, 0x18, 0x20, 0x5C, 0xB4, 0x1C, - 0x09, 0x14, 0xFC, 0x0C, 0x10, 0xFC, 0x6C, 0x7C, - 0xB4, 0x1C, 0x15, 0x17, 0xDB, 0x18, 0x21, 0x24, - 0x04, 0x04, 0x44, 0x8C, 0x8C, 0xB7 + 0x00, 0x06, 0x0a, 0x0e, 0x16, 0x1a, 0x1e, 0x22, + 0x12, 0x01, 0x2a, 0x36, 0x42, 0x4e, 0x4a, 0x56, + 0x26, 0x46, 0x2e, 0x32, 0x52, 0x3a, 0x06, 0x65, + 0x5e, 0x3e, 0x74, 0x8a, 0xa2, 0x9a, 0x86, 0xc6, + 0xc3, 0x59, 0xbb, 0xd2, 0xda, 0xd6, 0xe2, 0xf6, + 0xfd, 0xae, 0x7b, 0xdd, 0xea, 0x6a, 0xaa, 0xe7, + 0xbe, 0x5a, 0xee, 0x9e, 0x95, 0x80, 0x2e, 0x08, + 0x0a, 0x06, 0x0a, 0x0b, 0x0b, 0x0f, 0x0c, 0x0f, + 0x3d, 0x09, 0x73, 0x09, 0x0d, 0x0a, 0x10, 0x1e, + 0x2d, 0x13, 0x86, 0xba, 0x19, 0x0a, 0x36, 0x3c, + 0x26, 0x14, 0x0d, 0x06, 0x07, 0x0a, 0x0b, 0x0f, + 0x4a, 0x06, 0x0a, 0x0c, 0x2b, 0x0a, 0x0b, 0x0a, + 0x06, 0x0a, 0x0a, 0x11, 0x0b, 0x0a, 0x0a, 0x1e, + 0x0f, 0x0d, 0x0a, 0x0b, 0x22, 0x6a, 0x72, 0x0b, + 0x0b, 0x22, 0x90, 0xca, 0x90, 0x92, 0x3c, 0x2c, + 0xb6, 0xf2, 0xce, 0xfa, 0xb2, 0x6e, 0xa6, 0x06, + 0x0e, 0x6a, 0x0e, 0x0e, 0xbe, 0x5b, 0x2c, 0x3e, + 0x0e, 0x0a, 0x5a, 0x0d, 0x0e, 0x3e, 0x0a, 0x06, + 0x2e, 0x06, 0x4e, 0x36, 0x06, 0x58, 0x24, 0x06, + 0x3a, 0x08, 0x08, 0x07, 0x5e, 0x45, 0x0a, 0x32, + 0x2e, 0x2a, 0x43, 0x48, 0x5f, 0x2e, 0x06, 0x06, + 0x07, 0x24, 0x06, 0x32, 0x06, 0x06, 0x46, 0x2e, + 0x22, 0x06, 0x06, 0x1e, 0x4c, 0x06, 0x3a, 0x22, + 0x42, 0x34, 0x42, }; unsigned char linux_logo[] __initdata = { - 0xBF, 0x95, 0x90, 0xCB, 0x95, 0xA1, 0x2C, 0x2C, - 0x95, 0x55, 0xCB, 0x90, 0xCB, 0x95, 0x2C, 0x95, - 0xCB, 0x47, 0x94, 0x95, 0xA1, 0xD6, 0xD6, 0x2C, - 0x90, 0x47, 0x70, 0x2C, 0x6D, 0x2A, 0x6D, 0xD6, - 0xA1, 0x2C, 0x55, 0x95, 0x2C, 0x2C, 0x55, 0x55, - 0x95, 0xA1, 0xA1, 0xA1, 0x6D, 0xBF, 0x2A, 0x2A, - 0xBF, 0x83, 0xBF, 0x95, 0x90, 0xCB, 0x95, 0xA1, - 0x2C, 0x2C, 0x95, 0x55, 0xCB, 0x90, 0xCB, 0x95, - 0x2C, 0x95, 0xCB, 0x47, 0x94, 0x95, 0xA1, 0xD6, - 0xD6, 0x2C, 0x90, 0x47, 0x70, 0x2C, 0x6D, 0x2A, - 0x95, 0x47, 0x47, 0x90, 0x2C, 0x2C, 0x2C, 0x95, - 0x55, 0x55, 0xCB, 0x90, 0xCB, 0x55, 0x55, 0xCB, - 0x47, 0xE6, 0x70, 0x95, 0xD6, 0xD6, 0xA1, 0x2C, - 0x55, 0x55, 0x95, 0xD6, 0x6D, 0xD6, 0xA1, 0x2C, - 0x2C, 0x95, 0x55, 0x95, 0x95, 0x95, 0x2C, 0x2C, - 0xA1, 0xA1, 0x2C, 0x2C, 0xA1, 0xD6, 0xD6, 0xD6, - 0xD6, 0xD6, 0x95, 0x47, 0x47, 0x90, 0x2C, 0x2C, - 0x2C, 0x95, 0x55, 0x55, 0xCB, 0x90, 0xCB, 0x55, - 0x55, 0xCB, 0x47, 0xE6, 0x70, 0x95, 0xD6, 0xD6, - 0xA1, 0x2C, 0x55, 0x55, 0x95, 0xD6, 0x6D, 0xD6, - 0x90, 0x47, 0x47, 0x70, 0x2C, 0xA1, 0x2C, 0x95, - 0x55, 0x55, 0x90, 0xCB, 0x55, 0x55, 0x55, 0x70, - 0x94, 0x70, 0x95, 0xA1, 0xD6, 0xD6, 0xA1, 0x2C, - 0x95, 0x95, 0x2C, 0xA1, 0xD6, 0xA1, 0x2C, 0x2C, - 0x95, 0x55, 0xCB, 0x95, 0xD6, 0xA1, 0x2C, 0x95, - 0xA1, 0xD6, 0xD6, 0xA1, 0xA1, 0xD6, 0xA1, 0xA1, - 0xA1, 0x2C, 0x90, 0x47, 0x47, 0x70, 0x2C, 0xA1, - 0x2C, 0x95, 0x55, 0x55, 0x90, 0xCB, 0x55, 0x55, - 0x55, 0x70, 0x94, 0x70, 0x95, 0xA1, 0xD6, 0xD6, - 0xA1, 0x2C, 0x95, 0x95, 0x2C, 0xD6, 0xD6, 0xA1, - 0x94, 0xA0, 0x47, 0x55, 0x2C, 0xD6, 0xA1, 0x95, - 0x55, 0x55, 0xCB, 0xCB, 0x55, 0x55, 0xCB, 0xCB, - 0x55, 0x95, 0x2C, 0xA1, 0xD6, 0xD6, 0xA1, 0x2C, - 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x95, - 0x55, 0x55, 0x2C, 0x3F, 0x80, 0x20, 0x88, 0x88, - 0x88, 0x20, 0x88, 0xB1, 0x2C, 0xA1, 0x2C, 0x2C, - 0x95, 0xCB, 0x94, 0xA0, 0x47, 0x55, 0x2C, 0xD6, - 0xA1, 0x95, 0x55, 0x55, 0xCB, 0xCB, 0x55, 0x55, - 0xCB, 0xCB, 0x55, 0x95, 0x2C, 0xA1, 0xD6, 0xD6, - 0xA1, 0x2C, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, - 0x94, 0x94, 0x70, 0x2C, 0xA1, 0xD6, 0xA1, 0x2C, - 0x55, 0x55, 0xCB, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x95, 0x2C, 0xD6, 0xD6, 0xD6, 0xA1, 0x2C, 0x95, - 0x55, 0x55, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x2C, 0x94, 0x80, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x88, 0x92, 0xA1, 0x95, - 0x55, 0x90, 0x94, 0x94, 0x70, 0x2C, 0xA1, 0xD6, - 0xA1, 0x2C, 0x55, 0x55, 0xCB, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x95, 0x2C, 0xD6, 0xD6, 0xD6, 0xA1, - 0x2C, 0x95, 0x55, 0x55, 0x55, 0x95, 0x95, 0x95, - 0x70, 0x70, 0x55, 0x2C, 0xD6, 0xD6, 0xA1, 0x95, - 0x55, 0x90, 0xCB, 0xCB, 0x55, 0x55, 0x2C, 0x2C, - 0xA1, 0xD6, 0xA1, 0xA1, 0x2C, 0x2C, 0x95, 0x55, - 0x55, 0x55, 0x95, 0x95, 0x2C, 0x95, 0x95, 0xD6, - 0xB1, 0x88, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x80, 0x34, 0x88, 0x43, 0x47, - 0x95, 0xCB, 0x70, 0x70, 0x55, 0x2C, 0xD6, 0xD6, - 0xA1, 0x95, 0x55, 0x90, 0xCB, 0xCB, 0x55, 0x55, - 0x2C, 0x2C, 0xA1, 0xD6, 0xA1, 0xA1, 0xA1, 0x2C, - 0x55, 0x55, 0x55, 0x55, 0x2C, 0x95, 0x2C, 0x2C, - 0x55, 0x55, 0x95, 0x2C, 0xA1, 0xA1, 0x2C, 0x55, - 0x90, 0x70, 0x90, 0x55, 0x95, 0x95, 0xA1, 0xA1, - 0xA1, 0xA1, 0xA1, 0xA1, 0x2C, 0x95, 0x95, 0x95, - 0x95, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0xD5, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x88, 0x7D, 0x3F, 0xB1, 0x80, 0x20, - 0x99, 0x2C, 0x55, 0x55, 0x95, 0x2C, 0xA1, 0xA1, - 0x2C, 0x55, 0x90, 0x70, 0x90, 0x55, 0x95, 0x95, - 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0x2C, 0x2C, 0x2C, - 0x95, 0x55, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, - 0x95, 0x90, 0x55, 0x2C, 0xA1, 0xA1, 0x95, 0xCB, - 0x70, 0x94, 0x90, 0x55, 0x95, 0xA1, 0xA1, 0xA1, - 0x2C, 0x2C, 0x2C, 0x2C, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0xA1, 0x88, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0xB1, 0x47, 0xD5, 0x7D, 0x43, - 0x20, 0x70, 0x95, 0x90, 0x55, 0x2C, 0xA1, 0xA1, - 0x95, 0xCB, 0x70, 0x94, 0x90, 0x55, 0x95, 0xA1, - 0xA1, 0xA1, 0x2C, 0x95, 0x2C, 0x2C, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x2C, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x90, 0x55, 0x2C, 0xD6, 0xD6, 0x2C, 0x90, - 0x94, 0x70, 0x55, 0x95, 0x2C, 0xD6, 0xD6, 0xA1, - 0x95, 0x95, 0x95, 0x2C, 0x2C, 0x95, 0x55, 0x55, - 0xCB, 0xCB, 0xCB, 0x55, 0xCB, 0x55, 0x47, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x88, 0xB1, 0x3F, 0x92, 0x2B, 0x80, - 0x20, 0x80, 0xD6, 0x70, 0x55, 0x2C, 0xD6, 0xD6, - 0x2C, 0x90, 0x94, 0x70, 0x55, 0x95, 0x2C, 0xD6, - 0xD6, 0xA1, 0x2C, 0x95, 0x95, 0x2C, 0x2C, 0x95, - 0x95, 0x55, 0x90, 0xCB, 0xCB, 0xCB, 0xCB, 0x55, - 0xD6, 0x55, 0x95, 0xA1, 0xD6, 0xA1, 0x55, 0x70, - 0x94, 0x55, 0x95, 0xA1, 0xA1, 0xA1, 0xA1, 0x95, - 0x55, 0x55, 0x55, 0x95, 0x55, 0x55, 0xCB, 0x90, - 0x70, 0x90, 0xCB, 0x55, 0x55, 0xA1, 0xD8, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x88, 0xD8, 0xE1, 0x88, 0x20, 0x20, - 0x88, 0x88, 0xE6, 0x55, 0x2C, 0xA1, 0xD6, 0xA1, - 0x55, 0x70, 0x94, 0x55, 0x95, 0xA1, 0xA1, 0xA1, - 0xA1, 0x95, 0x55, 0x55, 0x95, 0x95, 0x55, 0x55, - 0x90, 0x90, 0x90, 0x90, 0xCB, 0x55, 0x55, 0x55, - 0xD6, 0x2C, 0xA1, 0xD6, 0xD6, 0xA1, 0xCB, 0x70, - 0x70, 0x95, 0x2C, 0xA1, 0xA1, 0x2C, 0x2C, 0x55, - 0xCB, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x95, 0x2C, 0x95, 0x2C, 0xD6, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x80, 0xD6, 0xA1, 0xD6, 0xD6, 0xA1, - 0xCB, 0x70, 0x70, 0x95, 0x2C, 0xA1, 0xA1, 0x2C, - 0x2C, 0x55, 0xCB, 0xCB, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x55, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, - 0xD6, 0xA1, 0xA1, 0xA1, 0xA1, 0x55, 0x70, 0x94, - 0xCB, 0x95, 0xA1, 0xA1, 0x2C, 0x95, 0xCB, 0x55, - 0x90, 0xCB, 0x55, 0x55, 0x55, 0x55, 0x95, 0xA1, - 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0x95, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x88, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x88, 0x95, 0xA1, 0xA1, 0xA1, 0x55, - 0x70, 0x94, 0xCB, 0x95, 0xA1, 0xA1, 0x2C, 0x95, - 0xCB, 0xCB, 0x90, 0xCB, 0x55, 0x55, 0x55, 0x55, - 0x95, 0x2C, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, - 0x2C, 0x2C, 0x2C, 0x95, 0x95, 0xCB, 0x70, 0x70, - 0x95, 0x2C, 0x2C, 0x95, 0xCB, 0x70, 0x90, 0xCB, - 0xCB, 0x55, 0x55, 0xCB, 0x55, 0x55, 0x2C, 0xD6, - 0xD6, 0xD6, 0xD6, 0xA1, 0x2C, 0x70, 0x20, 0x20, - 0x88, 0x43, 0xD8, 0x43, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x88, 0x88, 0x43, 0x2B, 0xD8, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3F, 0x2C, 0x95, 0x95, 0xCB, - 0x70, 0x70, 0x95, 0x2C, 0x2C, 0x95, 0xCB, 0x90, - 0x90, 0xCB, 0x55, 0xCB, 0x55, 0xCB, 0x55, 0x95, - 0x2C, 0xD6, 0xD6, 0xD6, 0xD6, 0xA1, 0x2C, 0x2C, - 0xA1, 0x95, 0x95, 0x55, 0xCB, 0x70, 0x90, 0x55, - 0x2C, 0x2C, 0x2C, 0x55, 0x70, 0x70, 0x55, 0x95, - 0x95, 0xCB, 0x90, 0x90, 0x90, 0x95, 0x2C, 0xA1, - 0xD6, 0xD6, 0x2C, 0x2C, 0x95, 0x70, 0x20, 0x20, - 0x80, 0x2B, 0x34, 0x2B, 0x88, 0x20, 0x20, 0x20, - 0x88, 0xB1, 0x28, 0x28, 0x2B, 0x7D, 0x80, 0x20, - 0x20, 0x20, 0x20, 0x92, 0x95, 0x55, 0xCB, 0x70, - 0x90, 0x55, 0x2C, 0x2C, 0x2C, 0x55, 0x70, 0x70, - 0x55, 0x95, 0x55, 0x55, 0x90, 0x90, 0x90, 0x55, - 0x2C, 0xA1, 0xD6, 0xA1, 0x2C, 0x2C, 0x95, 0x95, - 0xA1, 0x95, 0x55, 0xCB, 0x90, 0x70, 0xCB, 0x95, - 0xA1, 0x95, 0x95, 0xCB, 0x90, 0xCB, 0x95, 0x2C, - 0x95, 0x70, 0x70, 0x90, 0x55, 0x2C, 0xA1, 0xA1, - 0x2C, 0x2C, 0x55, 0xCB, 0x55, 0x90, 0x20, 0x34, - 0x90, 0x6D, 0x70, 0xD8, 0x43, 0x20, 0x20, 0x88, - 0x3F, 0x55, 0xA1, 0x2A, 0xD6, 0x7D, 0x43, 0x20, - 0x20, 0x20, 0x88, 0x7D, 0x55, 0xCB, 0x90, 0x70, - 0xCB, 0x95, 0xA1, 0x95, 0x95, 0xCB, 0x70, 0xCB, - 0x95, 0xA1, 0x95, 0x70, 0x70, 0xCB, 0x55, 0x2C, - 0xA1, 0xA1, 0xA1, 0x95, 0x55, 0x55, 0x55, 0x95, - 0x2C, 0x55, 0x90, 0x70, 0x94, 0x90, 0x95, 0x2C, - 0x2C, 0x95, 0xCB, 0x90, 0x55, 0x95, 0xA1, 0xA1, - 0x95, 0x90, 0x90, 0x95, 0xA1, 0xD6, 0xD6, 0x6D, - 0xA1, 0x95, 0x55, 0xCB, 0x55, 0xCB, 0x20, 0x99, - 0xBF, 0xA3, 0xA3, 0x90, 0x20, 0x20, 0x20, 0x92, - 0x83, 0x6B, 0x6B, 0x6B, 0xA3, 0x70, 0x88, 0x20, - 0x20, 0x20, 0x20, 0x2B, 0x90, 0x70, 0x94, 0x90, - 0x95, 0x2C, 0x2C, 0x95, 0xCB, 0x90, 0x55, 0x95, - 0xA1, 0x2C, 0x55, 0x90, 0x90, 0x95, 0xA1, 0xD6, - 0xD6, 0x6D, 0xA1, 0x95, 0x55, 0xCB, 0x55, 0x55, - 0x2C, 0x55, 0x70, 0x70, 0x94, 0x90, 0x95, 0x2C, - 0x2C, 0x55, 0xCB, 0xCB, 0x95, 0x2C, 0x2C, 0x2C, - 0x55, 0x55, 0x95, 0xA1, 0x6D, 0xBF, 0x6D, 0xD6, - 0x95, 0x55, 0x90, 0xCB, 0x55, 0x95, 0x88, 0x95, - 0x2C, 0x3F, 0x6D, 0x6B, 0x34, 0x20, 0x20, 0x47, - 0x65, 0xD6, 0xE1, 0x3F, 0x2A, 0x6B, 0x2B, 0x20, - 0x20, 0x20, 0x20, 0x43, 0x70, 0x70, 0x94, 0x90, - 0x95, 0x2C, 0x2C, 0x55, 0x55, 0x55, 0x95, 0x2C, - 0xA1, 0x2C, 0x55, 0xCB, 0x95, 0xA1, 0x6D, 0xBF, - 0x6D, 0xD6, 0x2C, 0x55, 0x90, 0xCB, 0x95, 0x95, - 0x95, 0x55, 0x70, 0x94, 0x70, 0x55, 0x2C, 0xA1, - 0x2C, 0x55, 0xCB, 0x55, 0x2C, 0x95, 0x2C, 0x95, - 0x95, 0x95, 0xA1, 0x6D, 0xBF, 0x2A, 0xD6, 0x95, - 0x70, 0x94, 0x94, 0x70, 0x55, 0x55, 0x20, 0xBF, - 0xC9, 0xB1, 0x99, 0x42, 0xB1, 0x61, 0x7D, 0x94, - 0x65, 0xB1, 0x88, 0x99, 0xD5, 0xE5, 0x7F, 0x20, - 0x20, 0x20, 0x20, 0x43, 0x70, 0x94, 0x70, 0x55, - 0x2C, 0xA1, 0x2C, 0x55, 0x90, 0x55, 0x2C, 0x95, - 0x2C, 0x95, 0x95, 0x2C, 0xA1, 0x6D, 0xBF, 0xBF, - 0xD6, 0x55, 0x70, 0x94, 0x94, 0x70, 0xCB, 0x55, - 0x55, 0xCB, 0x70, 0x94, 0x70, 0x95, 0xA1, 0xA1, - 0x95, 0x55, 0x55, 0x95, 0x2C, 0x95, 0x95, 0x95, - 0x95, 0xA1, 0x6D, 0x2A, 0x2A, 0xD6, 0x55, 0x94, - 0xE6, 0xE6, 0x47, 0x70, 0x55, 0x95, 0x20, 0x2A, - 0xD8, 0x43, 0xC9, 0x83, 0x98, 0x79, 0x34, 0x9F, - 0x6B, 0x43, 0x20, 0x88, 0x2B, 0x65, 0xA0, 0x20, - 0x20, 0x20, 0x20, 0xE1, 0x70, 0x94, 0x70, 0x95, - 0xA1, 0xA1, 0x95, 0x55, 0x55, 0x95, 0x2C, 0x95, - 0x95, 0x95, 0x95, 0xA1, 0x6D, 0xBF, 0x2A, 0xD6, - 0x55, 0x94, 0xE6, 0xE6, 0x47, 0x70, 0x55, 0x55, - 0x94, 0x70, 0x94, 0x47, 0x70, 0x95, 0x2C, 0x2C, - 0x95, 0xCB, 0x95, 0x2C, 0x2C, 0xA1, 0x2C, 0x2C, - 0xA1, 0xD6, 0x6D, 0x6D, 0xA1, 0xCB, 0x47, 0x28, - 0xE6, 0x47, 0x70, 0x55, 0x95, 0xA1, 0x20, 0x2C, - 0x7F, 0x88, 0xF0, 0xC6, 0x25, 0x5E, 0xCF, 0x2F, - 0xE7, 0x9A, 0x20, 0x88, 0x99, 0x65, 0x3F, 0x20, - 0x20, 0x20, 0x20, 0x34, 0x94, 0x47, 0x70, 0x95, - 0xA1, 0x2C, 0x55, 0xCB, 0x95, 0x2C, 0x2C, 0xA1, - 0x2C, 0x2C, 0xA1, 0xD6, 0x6D, 0x6D, 0xA1, 0xCB, - 0x94, 0x28, 0xA0, 0x47, 0x70, 0x55, 0x95, 0x95, - 0x47, 0x70, 0x90, 0x94, 0x70, 0x95, 0xA1, 0x2C, - 0x55, 0x55, 0x2C, 0xA1, 0xA1, 0xA1, 0xA1, 0x2C, - 0xA1, 0x6D, 0x2A, 0xD6, 0x55, 0x47, 0x28, 0x28, - 0x47, 0x70, 0x55, 0x95, 0x2C, 0xA1, 0x20, 0x28, - 0xEC, 0x86, 0xBE, 0x48, 0x3E, 0x3E, 0x3A, 0x25, - 0x4E, 0xAE, 0x93, 0xD7, 0xEC, 0xD1, 0x34, 0x20, - 0x20, 0x20, 0x20, 0x43, 0x55, 0x94, 0x70, 0x95, - 0xA1, 0xA1, 0x55, 0xCB, 0x2C, 0xA1, 0xA1, 0xA1, - 0xA1, 0x2C, 0xA1, 0x6D, 0x6D, 0xD6, 0x55, 0x47, - 0x28, 0x28, 0x47, 0x70, 0x55, 0x95, 0x2C, 0x2C, - 0x95, 0x95, 0x55, 0x90, 0xCB, 0x2C, 0xA1, 0xA1, - 0x55, 0x55, 0x2C, 0xD6, 0xD6, 0xA1, 0xA1, 0x2C, - 0xD6, 0x6D, 0x6D, 0xA1, 0x70, 0x28, 0xD5, 0xE6, - 0x70, 0x55, 0x95, 0x2C, 0xA1, 0xD6, 0x20, 0xE1, - 0x26, 0x84, 0x76, 0x73, 0x9C, 0x22, 0x4E, 0x35, - 0x8C, 0x7A, 0x4E, 0xDC, 0x8E, 0x7E, 0x3D, 0x88, - 0x20, 0x20, 0x20, 0x88, 0x2C, 0x90, 0x90, 0x95, - 0xA1, 0x2C, 0x55, 0x55, 0x2C, 0xD6, 0xD6, 0xD6, - 0x2C, 0x2C, 0xD6, 0x2A, 0x6D, 0x2C, 0x70, 0x28, - 0xD5, 0xE6, 0x70, 0x55, 0x95, 0xA1, 0x2C, 0xA1, - 0xBF, 0xA1, 0x95, 0xCB, 0xCB, 0x2C, 0xA1, 0xA1, - 0x95, 0x95, 0xA1, 0xD6, 0xD6, 0xA1, 0x2C, 0x95, - 0xD6, 0x6D, 0xD6, 0x95, 0x94, 0x28, 0xE6, 0x70, - 0x55, 0x95, 0xA1, 0xA1, 0xA1, 0xD6, 0x20, 0x57, - 0xE4, 0xDF, 0x50, 0x3E, 0x22, 0x4E, 0x35, 0x8C, - 0x8C, 0x52, 0x52, 0x7A, 0x4E, 0x58, 0xD7, 0x20, - 0x20, 0x20, 0x20, 0x88, 0x2C, 0xCB, 0x55, 0x2C, - 0xA1, 0xA1, 0x95, 0x95, 0xA1, 0xD6, 0xD6, 0xA1, - 0x2C, 0x95, 0xA1, 0x6D, 0x6D, 0x95, 0x47, 0xA0, - 0xE6, 0x70, 0x55, 0x95, 0x2C, 0xA1, 0xA1, 0xA1, - 0xD2, 0x95, 0x55, 0x90, 0x55, 0x2C, 0xD6, 0xA1, - 0x95, 0x95, 0xA1, 0xD6, 0xD6, 0x2C, 0x95, 0x2C, - 0xA1, 0x6D, 0xA1, 0x55, 0x94, 0x47, 0x94, 0xCB, - 0x55, 0x95, 0x2C, 0xA1, 0xD6, 0xD6, 0x59, 0xC8, - 0xE3, 0x76, 0x2D, 0x3E, 0x22, 0x4E, 0x8C, 0x35, - 0x52, 0x52, 0xEE, 0x3A, 0x4D, 0xED, 0x24, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x28, 0xCB, 0x55, 0x2C, - 0xD6, 0xA1, 0x95, 0x95, 0xA1, 0xD6, 0xA1, 0x2C, - 0x95, 0x2C, 0xD6, 0x6D, 0xA1, 0x55, 0x94, 0xE6, - 0x70, 0xCB, 0x55, 0x95, 0xA1, 0xD6, 0xD6, 0xA1, - 0xD0, 0x94, 0x94, 0x90, 0x55, 0x2C, 0xA1, 0xA1, - 0x55, 0x95, 0xA1, 0xA1, 0xA1, 0x2C, 0x95, 0x2C, - 0xA1, 0xD6, 0x2C, 0x70, 0x94, 0x94, 0x94, 0x94, - 0x70, 0x55, 0xA1, 0xD6, 0xA1, 0xD6, 0x88, 0x77, - 0x38, 0xC4, 0x3E, 0x69, 0x4E, 0x35, 0x8C, 0xEE, - 0x35, 0x89, 0x30, 0x30, 0x4A, 0x48, 0x3C, 0x20, - 0x20, 0x88, 0x20, 0x20, 0xD8, 0x2C, 0x55, 0x2C, - 0xD6, 0xA1, 0x95, 0x95, 0x2C, 0xD6, 0xA1, 0x2C, - 0x95, 0x2C, 0xA1, 0xD6, 0x2C, 0x90, 0x94, 0x47, - 0x94, 0x94, 0x70, 0x55, 0x2C, 0xD6, 0xA1, 0x95, - 0x95, 0x28, 0x47, 0x90, 0x95, 0x2C, 0xA1, 0x2C, - 0x95, 0x55, 0x95, 0xA1, 0xD6, 0xA1, 0x2C, 0x2C, - 0xA1, 0xA1, 0x55, 0x70, 0x94, 0x47, 0x94, 0x94, - 0x70, 0x2C, 0xD6, 0xD6, 0x2C, 0xA1, 0x43, 0x98, - 0x54, 0x48, 0x3E, 0x22, 0x35, 0xEE, 0xEE, 0x9C, - 0x4D, 0x45, 0x75, 0x4A, 0xDF, 0x7B, 0x3D, 0x20, - 0xD8, 0x28, 0x2B, 0x88, 0x20, 0x95, 0x95, 0x2C, - 0xA1, 0x2C, 0x55, 0x55, 0x2C, 0xA1, 0xD6, 0xA1, - 0x2C, 0x95, 0xA1, 0x2C, 0x55, 0x70, 0x94, 0x94, - 0x94, 0x94, 0x70, 0x95, 0xD6, 0xD6, 0x2C, 0x95, - 0x70, 0x28, 0x47, 0x55, 0x95, 0x2C, 0x2C, 0x2C, - 0x95, 0x95, 0x95, 0xA1, 0xA1, 0xA1, 0x95, 0x55, - 0x95, 0x95, 0x55, 0x70, 0x70, 0x70, 0x94, 0x70, - 0x55, 0xD6, 0x6D, 0xD6, 0x95, 0x2C, 0x20, 0x43, - 0xBB, 0xC8, 0x36, 0x30, 0x30, 0x38, 0x45, 0x6E, - 0xE3, 0x75, 0x78, 0x37, 0xBD, 0xD9, 0x3F, 0x20, - 0x88, 0xD5, 0x70, 0xB1, 0x88, 0xA0, 0x95, 0x2C, - 0x2C, 0xA1, 0x95, 0x55, 0x95, 0xA1, 0xA1, 0xA1, - 0x2C, 0x55, 0x95, 0x2C, 0x55, 0x70, 0x70, 0x70, - 0x94, 0x70, 0x55, 0xD6, 0x6D, 0x6D, 0x95, 0x55, - 0x94, 0x47, 0x70, 0x95, 0x2C, 0x2C, 0x2C, 0xA1, - 0x2C, 0x95, 0x2C, 0xA1, 0xD6, 0xA1, 0x2C, 0x55, - 0x55, 0x95, 0x95, 0x55, 0x55, 0x55, 0x55, 0x95, - 0xA1, 0x6D, 0x4B, 0xD6, 0x55, 0xD6, 0x20, 0xD8, - 0xD6, 0x67, 0xDA, 0x4D, 0xED, 0x62, 0x78, 0x78, - 0x23, 0x84, 0x67, 0xF5, 0x4B, 0xBF, 0x90, 0x88, - 0x88, 0x2B, 0x47, 0x99, 0x20, 0x43, 0xD6, 0x2C, - 0x2C, 0xA1, 0x2C, 0x95, 0x2C, 0xA1, 0xD6, 0xA1, - 0x95, 0x95, 0x55, 0x95, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x95, 0xD6, 0x6D, 0xBF, 0xD6, 0x55, 0xCB, - 0x55, 0x55, 0x55, 0x2C, 0x2C, 0x2C, 0x2C, 0xA1, - 0x2C, 0x2C, 0x2C, 0xA1, 0xA1, 0x2C, 0x2C, 0x95, - 0x55, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, 0xA1, - 0x6D, 0x2A, 0x2A, 0xA1, 0x55, 0x55, 0x20, 0xD8, - 0x6D, 0xAB, 0x96, 0x7E, 0x64, 0x53, 0x36, 0x36, - 0xC6, 0x63, 0x6D, 0xD0, 0x6B, 0xE5, 0xA3, 0x7D, - 0x20, 0x88, 0x80, 0x88, 0x20, 0x20, 0xC9, 0xA1, - 0x2C, 0xA1, 0xA1, 0x2C, 0x2C, 0xA1, 0xA1, 0xA1, - 0x95, 0x95, 0x55, 0x95, 0x95, 0x2C, 0x2C, 0x2C, - 0x2C, 0xA1, 0x6D, 0xBF, 0x6D, 0xA1, 0x55, 0x55, - 0x95, 0x95, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0xA1, - 0xA1, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, 0x95, - 0x55, 0x55, 0x2C, 0x2C, 0xA1, 0xA1, 0xD6, 0xD6, - 0x6D, 0x6D, 0xA1, 0x55, 0x2C, 0xD8, 0x20, 0xB1, - 0xA3, 0x4B, 0x6D, 0xD9, 0xA7, 0x6C, 0xAF, 0xB2, - 0x6D, 0x2A, 0x83, 0x42, 0xE5, 0xE5, 0x65, 0x2C, - 0x20, 0x20, 0x88, 0x20, 0x20, 0x20, 0x88, 0x95, - 0x2C, 0xA1, 0x2C, 0x95, 0x95, 0x2C, 0x2C, 0x2C, - 0x2C, 0x95, 0x55, 0x55, 0x2C, 0x2C, 0xA1, 0xA1, - 0xD6, 0xD6, 0x6D, 0x6D, 0xA1, 0x55, 0xCB, 0x55, - 0x95, 0x55, 0x95, 0x95, 0x2C, 0x2C, 0x95, 0x2C, - 0x2C, 0x95, 0x95, 0x95, 0x95, 0x95, 0x2C, 0x95, - 0x55, 0x95, 0x2C, 0x2C, 0xA1, 0xA1, 0xD6, 0xA1, - 0xA1, 0x2C, 0x55, 0x55, 0x28, 0x88, 0x43, 0x2A, - 0xE5, 0xA3, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, - 0xBF, 0xA3, 0x42, 0xE5, 0xE5, 0xE5, 0xE5, 0x65, - 0xB1, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xD8, - 0xD6, 0x2C, 0x2C, 0x95, 0x95, 0x95, 0x95, 0x2C, - 0x95, 0x95, 0x55, 0x95, 0x2C, 0x2C, 0xA1, 0xA1, - 0xA1, 0xA1, 0xA1, 0x2C, 0x95, 0x90, 0x90, 0x55, - 0x90, 0xCB, 0x55, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x2C, 0x2C, 0x95, 0x55, 0x95, 0x95, 0x95, 0x55, - 0x55, 0xCB, 0x55, 0x2C, 0x95, 0x95, 0x95, 0x95, - 0x55, 0x90, 0x90, 0x90, 0xE1, 0x43, 0x28, 0xE5, - 0xE5, 0x65, 0xD0, 0x6D, 0x6D, 0x6D, 0x2A, 0xD2, - 0x42, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xD6, 0x20, 0x20, 0x20, 0x20, 0x20, 0x88, 0x88, - 0xD5, 0x2C, 0x2C, 0x2C, 0x95, 0x55, 0x95, 0x95, - 0x95, 0x55, 0x55, 0xCB, 0x55, 0x95, 0x2C, 0x95, - 0x95, 0x95, 0x55, 0x90, 0x70, 0x70, 0x70, 0x90, - 0x70, 0x70, 0xCB, 0x55, 0x55, 0x95, 0x95, 0x95, - 0x2C, 0x95, 0x95, 0x55, 0x55, 0x55, 0x55, 0xCB, - 0x70, 0x70, 0x70, 0xCB, 0x90, 0x90, 0x70, 0x94, - 0x94, 0x94, 0x2C, 0x80, 0x20, 0xE1, 0xA3, 0xE5, - 0xE5, 0xE5, 0x42, 0xEC, 0xD0, 0x83, 0xA3, 0x65, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0x65, 0x7D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x88, 0x2C, 0x95, 0x95, 0x95, 0x55, 0x55, 0x55, - 0x55, 0xCB, 0x70, 0x70, 0x90, 0x90, 0x90, 0x90, - 0x70, 0x94, 0x94, 0x94, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x55, 0x55, 0x55, 0x95, 0x95, 0x95, 0x95, - 0x2C, 0x2C, 0x95, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x90, 0x70, 0x90, 0x55, 0x55, 0xCB, 0x70, 0x94, - 0x94, 0x95, 0xD8, 0x20, 0x88, 0x70, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0x65, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0x47, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0xE1, 0x6D, 0x2C, 0x95, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x90, 0x70, 0x70, 0x55, 0x55, 0xCB, - 0x70, 0x94, 0x94, 0x94, 0x70, 0x90, 0x70, 0x94, - 0x55, 0x2C, 0x2C, 0x2C, 0x95, 0x2C, 0x95, 0x95, - 0x2C, 0x2C, 0x2C, 0x55, 0x55, 0x55, 0x55, 0x55, - 0xCB, 0xCB, 0x95, 0x2C, 0x2C, 0x95, 0x55, 0x90, - 0x55, 0x99, 0x20, 0x20, 0xE1, 0xA3, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xD6, 0x88, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2B, 0x6D, 0x95, 0x95, 0x55, 0x55, - 0x55, 0x55, 0xCB, 0x55, 0x95, 0x2C, 0x2C, 0x95, - 0x55, 0x90, 0xCB, 0xCB, 0xCB, 0xCB, 0x90, 0x70, - 0x2C, 0xD6, 0xD6, 0x2C, 0x2C, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x2C, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x2C, 0xA1, 0x2C, 0x95, 0x55, 0x95, - 0xE6, 0x88, 0x20, 0x20, 0x3F, 0xA3, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0x42, 0xA3, 0x88, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x88, 0x2B, 0xD6, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x2C, 0xA1, 0x2C, 0x95, - 0x55, 0x55, 0x95, 0x95, 0x95, 0x55, 0x55, 0x55, - 0xA1, 0xD6, 0xD6, 0xA1, 0x2C, 0x2C, 0x95, 0x2C, - 0x2C, 0x2C, 0x95, 0x2C, 0x95, 0x95, 0x55, 0x95, - 0x95, 0x2C, 0x2C, 0x2C, 0x95, 0xCB, 0xCB, 0x94, - 0x20, 0x20, 0x20, 0x20, 0xE6, 0x83, 0x65, 0xE5, - 0xE5, 0xE5, 0xE5, 0x42, 0x6B, 0x6B, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0x42, 0x6B, 0x6B, 0xA3, 0xD2, - 0xD2, 0x6B, 0xC9, 0x20, 0x20, 0x88, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x88, 0x8A, 0xA1, 0x95, 0x95, - 0x95, 0x55, 0x95, 0x2C, 0xA1, 0x2C, 0x95, 0xCB, - 0xCB, 0x55, 0x95, 0x95, 0x95, 0x55, 0x55, 0x95, - 0x6D, 0x6D, 0x6D, 0xD6, 0xA1, 0x2C, 0x2C, 0x95, - 0x2C, 0x95, 0x2C, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x55, 0x70, 0x70, 0x2C, 0x80, - 0x88, 0x20, 0x20, 0x80, 0x94, 0xD6, 0x32, 0x6B, - 0xE5, 0xE5, 0xE5, 0x42, 0x6B, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xA3, 0xD2, 0xD0, 0xBF, 0x2A, - 0x2A, 0xD0, 0x6D, 0x34, 0x20, 0xE1, 0x88, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x88, 0xA1, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x55, 0x70, 0x70, - 0x70, 0x90, 0xCB, 0xCB, 0xCB, 0x95, 0x95, 0x2C, - 0xD0, 0x6D, 0xD6, 0xD6, 0xA1, 0xA1, 0xA1, 0x2C, - 0x2C, 0x2C, 0x2C, 0x95, 0x55, 0x55, 0x55, 0x95, - 0x95, 0x2C, 0x95, 0x55, 0xCB, 0xCB, 0x95, 0x88, - 0x20, 0x20, 0x88, 0xD8, 0x2C, 0xD1, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0x65, 0x65, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x42, 0x6B, 0xEC, - 0xBF, 0x2A, 0xEC, 0x95, 0x20, 0x34, 0x2B, 0xE1, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x99, 0x95, 0x55, - 0x55, 0x55, 0x95, 0x95, 0x95, 0x55, 0xCB, 0xCB, - 0x55, 0x55, 0xCB, 0xCB, 0xCB, 0x55, 0x95, 0x95, - 0x32, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0x2C, 0x2C, - 0xA1, 0x95, 0x95, 0x95, 0x55, 0xCB, 0xCB, 0x55, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x55, 0x99, 0x20, - 0xE1, 0xE1, 0x43, 0x47, 0x6B, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0x42, 0xEC, 0xBF, 0xA3, 0x8A, 0x20, 0x88, 0xD8, - 0x2B, 0x20, 0x20, 0x20, 0x88, 0x88, 0x2C, 0xCB, - 0xCB, 0x95, 0x95, 0x2C, 0x95, 0x95, 0x55, 0x95, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x95, 0x55, 0x95, - 0x6D, 0x55, 0x55, 0x55, 0x95, 0x95, 0x2C, 0x95, - 0x2C, 0x95, 0x95, 0x55, 0x55, 0x55, 0x55, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0xA1, 0x34, 0x20, - 0xC9, 0x20, 0xE1, 0xA3, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xA3, 0x83, 0x6D, 0x20, 0x88, 0x88, - 0x2B, 0x34, 0x20, 0x20, 0x20, 0x88, 0xD5, 0x55, - 0x55, 0x55, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x55, 0x55, 0x95, 0x95, - 0x2C, 0x55, 0xCB, 0x55, 0xCB, 0x55, 0x55, 0x95, - 0x95, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0x2C, 0x95, 0x95, 0x55, 0x95, 0x2C, 0x20, 0xD8, - 0xE1, 0x20, 0x70, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0x65, 0xA3, 0x92, 0x43, 0x7D, - 0xD8, 0xC9, 0x88, 0x20, 0x20, 0x20, 0x43, 0xD6, - 0x2C, 0x2C, 0x95, 0x95, 0x95, 0x55, 0x95, 0x2C, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x2C, 0x95, 0x2C, - 0xA1, 0x55, 0x55, 0x55, 0x55, 0x95, 0x95, 0x55, - 0x55, 0x55, 0x95, 0x95, 0x2C, 0x2C, 0xA1, 0x2C, - 0xA1, 0x2C, 0x2C, 0x95, 0x2C, 0x99, 0x88, 0xB1, - 0x20, 0xD8, 0x42, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xCB, 0x34, 0x8A, - 0xC9, 0x34, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x90, - 0xA1, 0xA1, 0xA1, 0x2C, 0x2C, 0x95, 0x95, 0x2C, - 0x2C, 0x95, 0x95, 0x95, 0x95, 0x2C, 0x2C, 0x2C, - 0xD6, 0x2C, 0x55, 0x55, 0x95, 0x2C, 0x2C, 0x2C, - 0x55, 0xCB, 0x55, 0x2C, 0x2C, 0xA1, 0x2C, 0xA1, - 0xA1, 0xA1, 0x2C, 0x2C, 0x6D, 0x43, 0xD8, 0x80, - 0x88, 0xCB, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x32, 0x80, 0xE1, - 0x80, 0x20, 0xB1, 0x20, 0x20, 0x20, 0x20, 0xC9, - 0xD6, 0xA1, 0xA1, 0xA1, 0x2C, 0xA1, 0x2C, 0x2C, - 0x2C, 0x55, 0x55, 0x55, 0x95, 0x95, 0x95, 0x55, - 0xD6, 0x95, 0x95, 0x95, 0x2C, 0xA1, 0x2C, 0x2C, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x2C, 0x95, 0x2C, - 0x2C, 0x2C, 0x2C, 0x95, 0xCB, 0x20, 0xC9, 0x20, - 0xE1, 0xA3, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0x42, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xD8, 0x20, - 0x20, 0x20, 0x2B, 0x43, 0x20, 0x20, 0x20, 0x88, - 0xD6, 0x2C, 0x2C, 0x2C, 0x95, 0x95, 0x95, 0x55, - 0x95, 0x55, 0x55, 0xCB, 0x55, 0xCB, 0xCB, 0x55, - 0x2C, 0x55, 0x55, 0x95, 0x2C, 0x2C, 0xA1, 0x95, - 0x55, 0x95, 0x55, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x55, 0xCB, 0x70, 0xCB, 0xC9, 0x80, 0x2B, 0x20, - 0xA0, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0x42, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x92, 0x20, - 0x20, 0x20, 0xE1, 0xD8, 0x20, 0x20, 0x20, 0x20, - 0x95, 0x95, 0x55, 0xCB, 0x90, 0x90, 0x70, 0x90, - 0x90, 0x90, 0xCB, 0xCB, 0xCB, 0xCB, 0x55, 0x95, - 0x95, 0x55, 0x55, 0x95, 0x95, 0x2C, 0x2C, 0x2C, - 0x95, 0x95, 0x55, 0x55, 0x55, 0x95, 0x95, 0x55, - 0x90, 0x47, 0xA0, 0x55, 0x20, 0x2B, 0x43, 0x88, - 0x6D, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0x6B, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x28, 0x20, - 0x20, 0x20, 0xE1, 0xE1, 0x20, 0x20, 0x20, 0x20, - 0x28, 0x55, 0x90, 0x47, 0xA0, 0x47, 0x94, 0x70, - 0x55, 0x95, 0x95, 0x55, 0xCB, 0x55, 0x55, 0x2C, - 0x2C, 0x2C, 0x95, 0x95, 0x95, 0x2C, 0x2C, 0x2C, - 0x95, 0x2C, 0x95, 0x95, 0x95, 0x95, 0x95, 0x55, - 0x94, 0xE6, 0x70, 0x2B, 0x88, 0x2B, 0x88, 0xE1, - 0x65, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0x6B, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x47, 0x20, - 0x20, 0x20, 0xE1, 0x34, 0x20, 0x20, 0x20, 0x20, - 0xB1, 0x95, 0x94, 0xE6, 0xA0, 0x47, 0x70, 0x55, - 0x2C, 0xA1, 0x2C, 0x55, 0x90, 0xCB, 0x2C, 0xD6, - 0x6D, 0xA1, 0x2C, 0x95, 0x95, 0xA1, 0x2C, 0xA1, - 0x2C, 0x2C, 0x95, 0x95, 0x95, 0x95, 0x95, 0x55, - 0x70, 0xE6, 0x70, 0x20, 0x20, 0x7D, 0x20, 0x8A, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0x65, 0xA3, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x94, 0x20, - 0x20, 0x20, 0xD8, 0x88, 0x20, 0x20, 0x20, 0x20, - 0xD8, 0x2C, 0x94, 0x47, 0x47, 0x90, 0x95, 0x95, - 0xA1, 0x6D, 0xA1, 0x90, 0x94, 0x55, 0x2C, 0xD6, - 0xD0, 0xA1, 0x95, 0x95, 0x2C, 0x2C, 0xA1, 0x2C, - 0x95, 0x95, 0x55, 0x55, 0x55, 0x95, 0x2C, 0x2C, - 0xCB, 0x95, 0xD8, 0x20, 0x20, 0xB1, 0x88, 0x28, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE2, 0xA3, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xCB, 0x20, - 0x20, 0x20, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x88, 0xD6, 0x55, 0x47, 0x94, 0x55, 0x2C, 0xA1, - 0xA1, 0xD6, 0x95, 0x94, 0x94, 0x55, 0xD6, 0x6D, - 0xBF, 0x95, 0x90, 0xCB, 0x2C, 0x2C, 0x2C, 0x2C, - 0x55, 0x95, 0xCB, 0x90, 0x90, 0x95, 0x2C, 0x95, - 0x90, 0x70, 0x20, 0x20, 0x34, 0x8A, 0x20, 0x94, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0x65, 0x6B, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xCB, 0x20, - 0x20, 0x88, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x88, 0xD6, 0xCB, 0x47, 0x94, 0x55, 0xA1, 0xD6, - 0xD6, 0x2C, 0xCB, 0x47, 0x70, 0xA1, 0x6D, 0x2A, - 0x95, 0x47, 0x47, 0x70, 0x95, 0xA1, 0x2C, 0x95, - 0x55, 0x55, 0x90, 0x90, 0x55, 0x55, 0x55, 0x90, - 0x47, 0xD5, 0x20, 0x20, 0x80, 0xD5, 0x43, 0xCB, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0x42, 0x6B, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xCB, 0x20, - 0x20, 0x80, 0x34, 0x20, 0x20, 0x20, 0x88, 0x20, - 0x20, 0x2C, 0x47, 0xE6, 0x70, 0x2C, 0xD6, 0xD6, - 0xA1, 0x2C, 0x55, 0xCB, 0x95, 0xA1, 0x6D, 0xD6, - 0x90, 0x47, 0x47, 0x90, 0x2C, 0xA1, 0x2C, 0x95, - 0x55, 0x55, 0x90, 0x90, 0x55, 0x55, 0x55, 0x70, - 0x94, 0x8A, 0x20, 0x88, 0x88, 0xE1, 0xD8, 0x95, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE2, 0x42, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x47, 0x20, - 0x43, 0x7D, 0x43, 0x80, 0x88, 0x20, 0x20, 0x20, - 0x88, 0xCB, 0x94, 0x70, 0x55, 0xA1, 0xD6, 0xD6, - 0xA1, 0x2C, 0x2C, 0x95, 0xA1, 0xA1, 0xD6, 0xA1, - 0x94, 0xE6, 0x47, 0x55, 0x2C, 0xD6, 0xA1, 0x95, - 0x55, 0x55, 0xCB, 0xCB, 0x55, 0x55, 0xCB, 0xCB, - 0x55, 0xA0, 0x43, 0x86, 0x86, 0x43, 0xD8, 0xCB, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0x65, 0x6B, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x3F, 0x80, - 0xD8, 0x80, 0x88, 0x34, 0xD8, 0x2B, 0xD8, 0x20, - 0x99, 0x90, 0x55, 0x95, 0x2C, 0xA1, 0xD6, 0xD6, - 0xA1, 0x95, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, - 0x94, 0x94, 0x70, 0x2C, 0xA1, 0xD6, 0xA1, 0x2C, - 0x55, 0x55, 0xCB, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x95, 0x44, 0xBC, 0x3E, 0x5D, 0xD3, 0x79, 0x92, - 0xA3, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0x65, 0x42, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x65, 0x9A, 0x34, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x99, 0xE1, - 0x70, 0x55, 0x95, 0xA1, 0xD6, 0xD6, 0xD6, 0xA1, - 0x2C, 0x95, 0x55, 0x55, 0x95, 0x95, 0x95, 0x95, - 0x70, 0x70, 0x55, 0x2C, 0xD6, 0xD6, 0xA1, 0x95, - 0x55, 0x90, 0xCB, 0xCB, 0x55, 0x55, 0x2C, 0x2C, - 0x32, 0x9D, 0xEB, 0x5D, 0x69, 0x49, 0x84, 0xF0, - 0xB1, 0xEC, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0x42, 0x6B, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xC1, 0x4E, 0x21, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0xC9, 0xD8, - 0xBB, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0x2C, 0x2C, - 0x95, 0x55, 0x55, 0x55, 0x95, 0x95, 0x2C, 0x2C, - 0x55, 0xCB, 0x95, 0x2C, 0xA1, 0xA1, 0x2C, 0x55, - 0x90, 0x70, 0x90, 0x55, 0x95, 0x95, 0x6D, 0xD0, - 0xC2, 0x48, 0x6A, 0x49, 0x69, 0x82, 0x5D, 0x2F, - 0x59, 0x7D, 0xBF, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0x65, 0x6B, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xEA, 0xC7, 0x7E, 0x66, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x43, 0x5A, - 0x46, 0x27, 0xA1, 0xA1, 0xA1, 0xA1, 0x2C, 0x95, - 0x95, 0x55, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0x95, 0x90, 0x55, 0x2C, 0xA1, 0xA1, 0x95, 0x55, - 0x94, 0x94, 0x2C, 0x2A, 0x72, 0x3B, 0x56, 0xDD, - 0xDF, 0x29, 0x5D, 0x49, 0x89, 0x5D, 0x3E, 0x69, - 0x93, 0x66, 0x34, 0xA1, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0x65, 0x42, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xEA, 0x3E, 0x5A, 0x66, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x5B, 0x73, - 0x89, 0x4C, 0xBF, 0x2C, 0x95, 0x2C, 0x2C, 0x95, - 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, - 0x2C, 0x70, 0x55, 0x2C, 0xD6, 0xD6, 0x2C, 0xCB, - 0x70, 0x55, 0xE7, 0x60, 0x4A, 0x48, 0xCD, 0x4A, - 0x29, 0x73, 0x5D, 0x82, 0x49, 0x49, 0x49, 0x49, - 0x3A, 0x57, 0x88, 0x88, 0x70, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0x42, 0x73, 0x50, 0xBE, 0x79, - 0x20, 0x20, 0x20, 0x20, 0x66, 0xCC, 0x37, 0x9C, - 0x3E, 0xCE, 0xBF, 0x95, 0x95, 0x95, 0x2C, 0x95, - 0x95, 0x55, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0x55, - 0xA1, 0x55, 0x95, 0xA1, 0xD6, 0xA1, 0x55, 0x94, - 0x94, 0xE8, 0x60, 0xC4, 0x3E, 0x2D, 0x2D, 0x2D, - 0x33, 0x5D, 0x82, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x89, 0xAA, 0x59, 0x20, 0x20, 0x28, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xEC, 0x4A, 0x2D, 0x50, 0x78, 0x2E, - 0x57, 0x51, 0xF0, 0x57, 0x31, 0x4D, 0x50, 0x2D, - 0x5D, 0xF2, 0xA1, 0x2C, 0x95, 0x95, 0x55, 0x55, - 0x90, 0x90, 0x70, 0x90, 0xCB, 0x55, 0x55, 0x55, - 0x6D, 0x2C, 0xA1, 0xD6, 0xD6, 0xA1, 0x55, 0x94, - 0x70, 0xB9, 0x75, 0x50, 0x3E, 0x49, 0x49, 0x49, - 0x5D, 0x82, 0x49, 0x49, 0x82, 0x49, 0x49, 0x49, - 0x89, 0x69, 0x4F, 0x20, 0x20, 0x20, 0x8A, 0x42, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0x83, 0x4A, 0x3A, 0x50, 0x62, 0x23, - 0x81, 0xB8, 0xB8, 0xE9, 0x5F, 0x29, 0x33, 0x5D, - 0x5D, 0x73, 0xE8, 0xCB, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, - 0xD6, 0xA1, 0xA1, 0xA1, 0xA1, 0x55, 0x70, 0x70, - 0xCB, 0x68, 0x75, 0x50, 0x82, 0x49, 0x49, 0x49, - 0x5D, 0x49, 0x49, 0x5D, 0x49, 0x49, 0x5D, 0x82, - 0x69, 0x5D, 0x25, 0xF0, 0x20, 0x20, 0x20, 0xE1, - 0x2A, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0x4B, 0xF4, 0xDF, 0x50, 0x73, 0x76, 0x48, - 0x75, 0xDF, 0x75, 0x62, 0xC4, 0x33, 0x82, 0x49, - 0x5D, 0x5D, 0xA8, 0xF5, 0x55, 0x55, 0x55, 0x55, - 0x2C, 0x2C, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, - 0x2C, 0x2C, 0x2C, 0x95, 0x95, 0xCB, 0x70, 0x70, - 0x95, 0x83, 0x5F, 0xEA, 0x2D, 0x49, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x5D, 0x49, 0x22, 0x5A, 0x79, 0x20, 0x20, 0x20, - 0x80, 0xD2, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0x65, 0xD0, 0x63, 0x5F, 0x29, 0x2D, 0x2D, 0xEA, - 0x29, 0x29, 0x76, 0x50, 0x2D, 0x82, 0x49, 0x49, - 0x3E, 0x49, 0x5C, 0xB0, 0xBA, 0x95, 0x55, 0x55, - 0x2C, 0xA1, 0xD6, 0xD6, 0xD6, 0xA1, 0x2C, 0x2C, - 0xA1, 0x95, 0x95, 0x55, 0xCB, 0x70, 0x70, 0x55, - 0x2C, 0x83, 0x60, 0x76, 0x5D, 0x49, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x49, 0x5D, 0x89, 0xDC, 0x8B, 0x20, 0x20, 0x20, - 0x20, 0x95, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE2, 0x32, 0x85, 0xE3, 0x29, 0x2D, 0x33, 0x2D, - 0x2D, 0x2D, 0x6A, 0x2D, 0x33, 0x5D, 0x49, 0x82, - 0x49, 0x49, 0x82, 0x73, 0x5C, 0x9E, 0x2C, 0x55, - 0x2C, 0xA1, 0xD6, 0xA1, 0x2C, 0x2C, 0x95, 0x95, - 0x2C, 0x95, 0x55, 0xCB, 0x90, 0x90, 0xCB, 0x95, - 0x2C, 0x6D, 0x41, 0x6F, 0x3E, 0x49, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x49, 0x82, 0x3E, 0x4E, 0x38, 0xCA, 0x20, 0x20, - 0x20, 0x55, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0x65, - 0x42, 0xA0, 0xD4, 0xE3, 0x29, 0x2D, 0x82, 0x5D, - 0x5D, 0x82, 0x82, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x49, 0x3E, 0x49, 0x49, 0x49, 0x5C, 0x56, 0xD6, - 0xA1, 0xA1, 0xA1, 0x95, 0x55, 0x55, 0x55, 0x95, - 0xA1, 0x55, 0x90, 0x70, 0x94, 0x70, 0x95, 0x2C, - 0x2C, 0xD6, 0xDD, 0x6F, 0x33, 0x49, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x5D, 0x5D, 0x82, 0x69, 0x22, 0x62, 0x80, 0x34, - 0x94, 0x6B, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0x65, 0xE5, 0x65, 0x6B, - 0xD5, 0x88, 0x5B, 0xE3, 0x29, 0x5D, 0x5D, 0x5D, - 0x5D, 0x5D, 0x5D, 0x5D, 0x49, 0x49, 0x49, 0x82, - 0x49, 0x49, 0x89, 0x49, 0x82, 0x49, 0x71, 0xBA, - 0x6D, 0x6D, 0xA1, 0x95, 0x55, 0xCB, 0x55, 0x55, - 0x2C, 0x55, 0x70, 0x70, 0x70, 0x90, 0x95, 0xA1, - 0x2C, 0xA1, 0x41, 0x76, 0x5D, 0x5D, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x49, 0x5D, 0x82, 0x5D, 0x89, 0x5E, 0x96, 0x65, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0xE5, 0xE5, 0xE5, 0xE5, 0x65, 0x65, 0xEC, 0xB1, - 0x20, 0x20, 0xCA, 0x23, 0x29, 0x33, 0x49, 0x5D, - 0x49, 0x82, 0x49, 0x49, 0x49, 0x49, 0x49, 0x82, - 0x49, 0x82, 0x5D, 0x5D, 0x5D, 0x2D, 0x5C, 0x8F, - 0x6D, 0xD6, 0x2C, 0x55, 0x90, 0xCB, 0x95, 0x95, - 0x95, 0x55, 0x70, 0x94, 0x70, 0x55, 0x2C, 0xA1, - 0x95, 0xE8, 0x5F, 0x76, 0x33, 0x5D, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x3E, 0x9C, 0x2F, 0x68, - 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, - 0x65, 0xE5, 0x65, 0xE5, 0x6B, 0x90, 0x80, 0x20, - 0x20, 0x20, 0x4F, 0x81, 0x50, 0x3E, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x69, 0x69, 0x49, 0x5D, 0x2D, 0xC4, 0x46, 0xA3, - 0xD6, 0x55, 0x70, 0x94, 0x94, 0x70, 0xCB, 0x55, - 0x55, 0xCB, 0x70, 0x47, 0x70, 0x95, 0xA1, 0xA1, - 0x95, 0xBD, 0x75, 0x2D, 0x33, 0x49, 0x49, 0x49, - 0x49, 0x49, 0x5D, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x5D, 0x2D, 0xB5, 0xDB, - 0xD6, 0x65, 0xE5, 0x65, 0xE5, 0xE5, 0x65, 0xE5, - 0x65, 0x65, 0x6B, 0x95, 0x2B, 0x88, 0x20, 0x20, - 0x20, 0x20, 0x8B, 0x81, 0x29, 0x33, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x49, 0x3E, 0x3E, 0x5E, 0x41, 0x97, 0x27, 0xD6, - 0x55, 0x94, 0xE6, 0xE6, 0x47, 0x70, 0x55, 0x55, - 0x94, 0x70, 0x94, 0x94, 0x70, 0x55, 0xA1, 0x2C, - 0x6D, 0xC5, 0x39, 0x6A, 0x5D, 0x5D, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x3E, 0xEA, 0x30, 0x77, - 0xE1, 0xC9, 0x94, 0x2C, 0xD6, 0xD6, 0xA1, 0x55, - 0x47, 0x9F, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x80, 0x91, 0x81, 0x6A, 0x2D, 0x49, 0x49, - 0x49, 0x5D, 0x5D, 0x49, 0x49, 0x5D, 0x5D, 0x82, - 0xEB, 0x4A, 0x41, 0xC2, 0x8F, 0xF5, 0xA1, 0x55, - 0x94, 0x28, 0xA0, 0x47, 0x70, 0x55, 0x95, 0x95, - 0x47, 0x70, 0x70, 0x94, 0x90, 0x95, 0xA1, 0x2C, - 0xE8, 0xA6, 0x39, 0x76, 0x50, 0x50, 0x2D, 0x2D, - 0x3E, 0x3E, 0x5D, 0x3E, 0x5D, 0x5D, 0x49, 0x82, - 0x49, 0x49, 0x49, 0x82, 0x82, 0x50, 0x75, 0xE0, - 0x57, 0x20, 0x88, 0x88, 0x20, 0x20, 0x88, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x79, 0x91, 0x81, 0x76, 0x33, 0x49, 0x49, - 0x5D, 0x82, 0x49, 0x49, 0x3E, 0x6A, 0xEA, 0x29, - 0xDF, 0x97, 0xBF, 0x6D, 0x6D, 0xD6, 0x55, 0x47, - 0x28, 0x28, 0x47, 0x70, 0x55, 0x95, 0x2C, 0x2C, - 0x95, 0x95, 0x55, 0x90, 0x90, 0x95, 0xA1, 0xA1, - 0xD6, 0x26, 0x45, 0x81, 0x5F, 0x30, 0x48, 0x6F, - 0x6F, 0x29, 0x29, 0x6A, 0x2D, 0x2D, 0x5D, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x2D, 0x76, 0x6E, 0x77, - 0x5B, 0x66, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x79, 0xA9, 0xB8, 0x39, 0x50, 0x5D, 0x5D, - 0x5D, 0x5D, 0x3E, 0x2D, 0x29, 0x76, 0xCD, 0x37, - 0xB9, 0xA1, 0xA1, 0x6D, 0x6D, 0x2C, 0x94, 0x28, - 0xD5, 0xE6, 0x70, 0x55, 0x95, 0xA1, 0x2C, 0xA1, - 0xBF, 0xA1, 0x95, 0xCB, 0x55, 0x95, 0xA1, 0x2C, - 0x95, 0x83, 0xDE, 0x87, 0xB6, 0xBE, 0x40, 0x6E, - 0x81, 0x81, 0x78, 0x78, 0x39, 0x6F, 0xEA, 0x2D, - 0x2D, 0x33, 0x33, 0x33, 0x76, 0x30, 0x64, 0x54, - 0x5B, 0x66, 0x20, 0x20, 0x66, 0x20, 0x88, 0x20, - 0x20, 0x20, 0x88, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x88, 0x34, 0x8B, 0xF1, 0x23, 0x6F, 0x50, 0x2D, - 0x2D, 0x6A, 0x29, 0x6F, 0x78, 0x84, 0x9B, 0xD2, - 0x2C, 0x2C, 0xD6, 0x6D, 0x6D, 0x2C, 0x47, 0xA0, - 0xE6, 0x70, 0x55, 0x95, 0x2C, 0xA1, 0xA1, 0xA1, - 0xD2, 0x95, 0x55, 0xCB, 0x55, 0x2C, 0xD6, 0xA1, - 0x95, 0x95, 0xA1, 0xD6, 0x6D, 0x6D, 0xBA, 0xF3, - 0x8D, 0x36, 0x74, 0x36, 0xF1, 0xB8, 0x23, 0x78, - 0x62, 0x4A, 0x29, 0x62, 0x23, 0xF1, 0x54, 0x31, - 0x57, 0x2B, 0x90, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, - 0xA1, 0xA1, 0xA1, 0xA1, 0x2C, 0x2C, 0x2C, 0xCB, - 0xE6, 0x7D, 0xCA, 0xB7, 0xB8, 0x75, 0x6F, 0x6F, - 0x76, 0x6F, 0x78, 0x81, 0x53, 0xBD, 0x6D, 0x2C, - 0x95, 0x95, 0xA1, 0x6D, 0xA1, 0x55, 0x94, 0xE6, - 0x70, 0xCB, 0x55, 0x95, 0xA1, 0xD6, 0xD6, 0xA1, - 0xD0, 0x94, 0x94, 0x90, 0x95, 0x2C, 0xD6, 0xA1, - 0x95, 0x55, 0x2C, 0xA1, 0xD6, 0xA1, 0x95, 0x2C, - 0xD6, 0x68, 0xAB, 0x6C, 0xA4, 0x77, 0x77, 0xAD, - 0x40, 0x53, 0x6E, 0x40, 0xB7, 0x54, 0x31, 0xD7, - 0xAC, 0xD6, 0x55, 0x55, 0x95, 0x95, 0x95, 0x55, - 0x95, 0x2C, 0x2C, 0xA1, 0x95, 0x95, 0x2C, 0xA1, - 0x6D, 0xD2, 0x7C, 0x54, 0xAD, 0x40, 0x6E, 0x81, - 0x81, 0x6E, 0x36, 0xDA, 0xE8, 0xD6, 0xD6, 0x2C, - 0x2C, 0x2C, 0xA1, 0xD6, 0x95, 0x90, 0x94, 0x47, - 0x94, 0x94, 0x70, 0x55, 0x2C, 0xD6, 0xA1, 0x95, - 0x95, 0x28, 0x47, 0x90, 0x95, 0x2C, 0xA1, 0x2C, - 0x55, 0x95, 0x2C, 0xA1, 0xA1, 0x2C, 0x2C, 0x2C, - 0x2C, 0xA1, 0x55, 0x70, 0x95, 0x2C, 0xB2, 0xB4, - 0xC3, 0xC3, 0x54, 0x54, 0xA9, 0x31, 0xCA, 0x2A, - 0x95, 0x90, 0x55, 0x95, 0x2C, 0xA1, 0x2C, 0x95, - 0x95, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0xD6, - 0x6D, 0x2A, 0xB2, 0x4F, 0x31, 0x2E, 0xE0, 0xAD, - 0xB7, 0xC8, 0xB4, 0xF5, 0x2C, 0xA1, 0xA1, 0xA1, - 0x95, 0x2C, 0xA1, 0x2C, 0x95, 0x70, 0x94, 0x94, - 0x94, 0x94, 0x70, 0x95, 0xD6, 0xD6, 0x2C, 0x95, - 0x94, 0x28, 0x47, 0xCB, 0x95, 0x2C, 0xA1, 0xA1, - 0x95, 0x55, 0x2C, 0xA1, 0xD6, 0xA1, 0x95, 0x95, - 0x95, 0x2C, 0x55, 0x70, 0x70, 0x70, 0x94, 0x2C, - 0x63, 0xBB, 0xA5, 0xD7, 0xCA, 0xB3, 0x6D, 0x2C, - 0x55, 0x55, 0x95, 0x2C, 0x2C, 0x2C, 0x95, 0x95, - 0x95, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0xA1, - 0xD6, 0x2C, 0x70, 0x95, 0xAC, 0xC0, 0xDB, 0xEF, - 0xEF, 0xA2, 0xE8, 0x95, 0x95, 0xA1, 0xD6, 0xA1, - 0x95, 0x55, 0x2C, 0x95, 0x55, 0x70, 0x70, 0x70, - 0x94, 0x70, 0x55, 0xD6, 0x6D, 0x6D, 0x95, 0x55, - 0x70, 0x47, 0x70, 0x95, 0x2C, 0x2C, 0x2C, 0xA1, - 0x2C, 0x95, 0x2C, 0xA1, 0xD6, 0xA1, 0x95, 0x55, - 0x55, 0x95, 0x55, 0x55, 0x55, 0x55, 0x55, 0x95, - 0xA1, 0xF5, 0xBF, 0xBF, 0xA1, 0x95, 0x95, 0x95, - 0x95, 0x55, 0x2C, 0x2C, 0x95, 0x55, 0x55, 0x95, - 0x95, 0x95, 0xA1, 0xA1, 0xA1, 0xA1, 0x2C, 0xA1, - 0x2C, 0x55, 0x70, 0x94, 0x90, 0x2C, 0x6D, 0x6D, - 0x6D, 0xA1, 0x2C, 0x95, 0x2C, 0xA1, 0xD6, 0xA1, - 0x2C, 0x55, 0x55, 0x95, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x95, 0xD6, 0x6D, 0xBF, 0xD6, 0x55, 0xCB, - 0x55, 0x55, 0x55, 0x2C, 0x2C, 0x2C, 0x2C, 0xA1, - 0xA1, 0x95, 0x2C, 0xA1, 0xA1, 0xA1, 0x2C, 0x95, - 0x55, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, 0xA1, - 0x6D, 0xBF, 0x6D, 0x2C, 0x55, 0x55, 0x95, 0x95, - 0xCB, 0xCB, 0x55, 0x55, 0xCB, 0x55, 0x55, 0x95, - 0x95, 0x2C, 0x2C, 0xA1, 0xA1, 0xA1, 0x2C, 0x2C, - 0xA1, 0x95, 0xCB, 0xCB, 0x95, 0x95, 0x2C, 0x2C, - 0x2C, 0xA1, 0x2C, 0x2C, 0x2C, 0xA1, 0xA1, 0x2C, - 0x2C, 0x95, 0x55, 0x95, 0x95, 0x2C, 0x2C, 0x2C, - 0x2C, 0xA1, 0x6D, 0xBF, 0x6D, 0xA1, 0x55, 0x55, - 0x95, 0x95, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x2C, - 0x2C, 0x95, 0x95, 0x95, 0x2C, 0x2C, 0x2C, 0x95, - 0x55, 0x95, 0x2C, 0x2C, 0xA1, 0xA1, 0xD6, 0xD6, - 0x6D, 0x6D, 0xA1, 0x95, 0xCB, 0x55, 0x95, 0x55, - 0x90, 0x70, 0xCB, 0xCB, 0x90, 0xCB, 0x95, 0x95, - 0x2C, 0x2C, 0xA1, 0xD6, 0xA1, 0xA1, 0xA1, 0xA1, - 0xA1, 0xA1, 0x2C, 0x95, 0x95, 0x2C, 0x2C, 0x2C, - 0x2C, 0xA1, 0x2C, 0x95, 0x95, 0x95, 0x2C, 0x2C, - 0x2C, 0x95, 0x55, 0x55, 0x2C, 0x2C, 0xA1, 0xA1, - 0xD6, 0xD6, 0x6D, 0x6D, 0xA1, 0x55, 0xCB, 0x55 + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x26, 0x26, 0x25, 0x28, 0x23, 0x22, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x25, 0x2a, 0x2b, 0x2c, 0x2d, 0x2d, + 0x2d, 0x2e, 0x2c, 0x2b, 0x2a, 0x25, 0x28, 0x22, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x2a, 0x2c, 0x2f, 0x2c, 0x30, 0x30, 0x24, + 0x25, 0x27, 0x2b, 0x2c, 0x2f, 0x31, 0x32, 0x25, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x33, 0x34, 0x35, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x2b, 0x2f, 0x2c, + 0x30, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x2d, 0x27, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x31, + 0x2d, 0x32, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, 0x2a, 0x34, + 0x25, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x23, 0x32, 0x27, 0x21, 0x36, + 0x2a, 0x2d, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x26, 0x2c, 0x35, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2f, 0x37, 0x32, 0x22, + 0x36, 0x35, 0x31, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x22, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x26, 0x38, 0x38, 0x35, 0x25, + 0x36, 0x21, 0x2d, 0x2b, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x39, 0x39, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x25, 0x2b, 0x30, 0x28, 0x22, + 0x36, 0x36, 0x27, 0x34, 0x30, 0x23, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x26, 0x2d, 0x26, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x22, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2d, 0x33, 0x28, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x2b, 0x2c, 0x25, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x36, 0x36, + 0x36, 0x21, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x21, 0x23, 0x22, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x28, 0x34, 0x27, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x21, 0x21, 0x24, 0x27, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x27, 0x22, 0x33, 0x24, 0x36, + 0x36, 0x36, 0x36, 0x22, 0x2f, 0x2a, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x36, + 0x30, 0x3a, 0x38, 0x24, 0x24, 0x36, 0x36, 0x36, + 0x23, 0x2f, 0x3b, 0x3c, 0x3d, 0x30, 0x25, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x32, 0x23, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x23, + 0x3e, 0x3f, 0x40, 0x3a, 0x22, 0x36, 0x36, 0x21, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x3e, 0x23, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2f, 0x33, 0x28, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x2f, 0x36, 0x2b, + 0x44, 0x40, 0x46, 0x47, 0x35, 0x36, 0x36, 0x26, + 0x43, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x2e, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x32, 0x34, 0x36, 0x4d, + 0x4e, 0x25, 0x2f, 0x46, 0x4a, 0x22, 0x23, 0x32, + 0x4f, 0x50, 0x21, 0x31, 0x51, 0x52, 0x53, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x35, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x29, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x2f, 0x21, 0x3a, + 0x4d, 0x21, 0x31, 0x54, 0x55, 0x28, 0x30, 0x2b, + 0x4b, 0x4d, 0x36, 0x23, 0x32, 0x50, 0x3f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x20, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x38, 0x23, 0x37, + 0x55, 0x36, 0x28, 0x3a, 0x56, 0x57, 0x57, 0x58, + 0x3c, 0x4d, 0x36, 0x36, 0x36, 0x40, 0x40, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x2e, 0x39, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x29, 0x29, 0x29, 0x20, 0x29, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x51, 0x23, 0x35, + 0x43, 0x25, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, + 0x5f, 0x60, 0x61, 0x36, 0x31, 0x47, 0x3b, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x31, 0x2c, 0x25, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x22, + 0x40, 0x62, 0x63, 0x5d, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x66, 0x5e, 0x6a, 0x6b, 0x2a, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x2e, 0x26, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2f, 0x23, 0x36, + 0x6c, 0x63, 0x6d, 0x64, 0x5c, 0x66, 0x69, 0x6e, + 0x6f, 0x70, 0x71, 0x69, 0x69, 0x72, 0x6c, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x33, 0x34, 0x27, 0x22, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x34, 0x26, 0x73, + 0x74, 0x75, 0x76, 0x64, 0x65, 0x77, 0x69, 0x78, + 0x70, 0x71, 0x71, 0x71, 0x72, 0x5f, 0x5e, 0x21, + 0x36, 0x36, 0x36, 0x36, 0x25, 0x38, 0x2a, 0x23, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x33, 0x79, + 0x63, 0x7a, 0x7b, 0x5c, 0x66, 0x69, 0x6e, 0x7c, + 0x71, 0x71, 0x69, 0x7d, 0x7e, 0x7a, 0x7f, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x21, 0x51, 0x2b, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2d, 0x32, 0x24, + 0x80, 0x81, 0x64, 0x82, 0x77, 0x69, 0x71, 0x71, + 0x69, 0x83, 0x84, 0x85, 0x7a, 0x85, 0x86, 0x36, + 0x21, 0x2b, 0x23, 0x36, 0x36, 0x39, 0x2e, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x27, 0x2d, 0x33, 0x21, + 0x87, 0x88, 0x89, 0x72, 0x67, 0x66, 0x5f, 0x89, + 0x8a, 0x63, 0x85, 0x8b, 0x8c, 0x8d, 0x41, 0x36, + 0x36, 0x2d, 0x3a, 0x35, 0x36, 0x24, 0x51, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x30, 0x2f, 0x33, 0x21, + 0x55, 0x8e, 0x8f, 0x8a, 0x7d, 0x5e, 0x90, 0x7e, + 0x75, 0x75, 0x90, 0x62, 0x40, 0x3f, 0x49, 0x23, + 0x36, 0x24, 0x3a, 0x3a, 0x24, 0x36, 0x2e, 0x31, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x33, 0x37, 0x25, 0x22, + 0x3b, 0x50, 0x8e, 0x8f, 0x90, 0x7e, 0x90, 0x63, + 0x74, 0x91, 0x92, 0x42, 0x93, 0x4b, 0x45, 0x2c, + 0x36, 0x36, 0x33, 0x39, 0x21, 0x36, 0x22, 0x51, + 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x27, 0x2e, 0x2e, 0x36, 0x21, + 0x94, 0x3f, 0x50, 0x95, 0x96, 0x8f, 0x8f, 0x97, + 0x8e, 0x42, 0x50, 0x43, 0x47, 0x48, 0x48, 0x98, + 0x21, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, + 0x2e, 0x27, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x2b, 0x38, 0x28, 0x36, 0x32, + 0x4c, 0x4b, 0x50, 0x50, 0x50, 0x42, 0x42, 0x50, + 0x50, 0x40, 0x45, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x23, + 0x2f, 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x32, 0x51, 0x32, 0x28, 0x21, 0x98, + 0x48, 0x47, 0x9a, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x9a, 0x4f, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x93, 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2f, 0x2a, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x23, 0x30, 0x2e, 0x2c, 0x36, 0x21, 0x51, 0x9b, + 0x48, 0x48, 0x52, 0x3f, 0x50, 0x50, 0x40, 0x4b, + 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x34, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2d, 0x31, 0x27, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x2c, 0x2d, 0x21, 0x36, 0x28, 0x44, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x46, 0x4f, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x9c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x28, 0x51, 0x39, 0x26, 0x22, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, + 0x35, 0x51, 0x28, 0x36, 0x36, 0x9d, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x9b, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4f, 0x28, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x28, 0x38, 0x2b, 0x25, 0x22, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, 0x33, + 0x51, 0x25, 0x36, 0x36, 0x23, 0x40, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x9b, 0x99, 0x2b, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x2f, 0x33, 0x24, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x23, 0x30, 0x34, + 0x27, 0x36, 0x36, 0x36, 0x2a, 0x40, 0x47, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x99, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x47, 0x52, + 0x46, 0x4f, 0x37, 0x21, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x30, 0x34, 0x2a, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x25, 0x39, 0x2c, + 0x36, 0x36, 0x36, 0x21, 0x31, 0x4e, 0x9a, 0x4c, + 0x47, 0x9b, 0x9b, 0x52, 0x46, 0x4f, 0x52, 0x9b, + 0x9b, 0x9b, 0x47, 0x4f, 0x45, 0x9a, 0x93, 0x93, + 0x3f, 0x93, 0x98, 0x28, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, 0x26, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x2a, 0x34, 0x28, + 0x36, 0x36, 0x36, 0x22, 0x38, 0x98, 0x44, 0x99, + 0x9b, 0x48, 0x48, 0x9b, 0x4c, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x47, 0x52, 0x46, 0x43, 0x93, + 0x40, 0x40, 0x43, 0x53, 0x21, 0x23, 0x33, 0x23, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x2f, 0x32, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x24, 0x2b, 0x31, 0x36, + 0x36, 0x22, 0x36, 0x24, 0x9e, 0x4f, 0x9b, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x99, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x47, + 0x4f, 0x9a, 0x3f, 0x46, 0x38, 0x36, 0x21, 0x30, + 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, 0x39, 0x2c, + 0x25, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x26, 0x2e, 0x33, 0x36, + 0x25, 0x25, 0x36, 0x4d, 0x52, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x47, 0x44, 0x93, 0x43, 0x23, 0x36, 0x36, + 0x26, 0x24, 0x36, 0x36, 0x36, 0x36, 0x28, 0x2f, + 0x2a, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x2a, 0x51, 0x24, 0x36, + 0x2a, 0x36, 0x28, 0x44, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x9b, 0x4b, 0x44, 0x37, 0x36, 0x23, + 0x28, 0x30, 0x22, 0x36, 0x36, 0x36, 0x36, 0x2d, + 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x28, 0x2b, 0x34, 0x36, 0x25, + 0x24, 0x36, 0x4a, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x52, 0x3f, 0x21, 0x30, + 0x35, 0x25, 0x30, 0x36, 0x36, 0x36, 0x36, 0x32, + 0x2d, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x26, 0x2e, 0x35, 0x36, 0x2a, + 0x36, 0x24, 0x4f, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x9b, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x47, 0x32, 0x30, + 0x2a, 0x23, 0x30, 0x23, 0x36, 0x36, 0x36, 0x21, + 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x2a, 0x51, 0x28, 0x28, 0x25, + 0x36, 0x3a, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x9b, 0x52, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x38, 0x21, + 0x36, 0x36, 0x22, 0x27, 0x36, 0x36, 0x36, 0x36, + 0x2e, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x25, 0x2c, 0x34, 0x36, 0x30, 0x21, + 0x23, 0x43, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x47, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x94, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x2a, 0x2e, 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x2a, 0x51, 0x25, 0x21, 0x2a, 0x36, + 0x2e, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x99, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x98, 0x36, + 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x36, + 0x22, 0x2f, 0x30, 0x22, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x25, 0x2c, 0x34, 0x36, 0x24, 0x28, 0x36, + 0x54, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4c, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x9a, 0x36, + 0x36, 0x36, 0x36, 0x30, 0x36, 0x36, 0x36, 0x36, + 0x21, 0x2f, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x32, 0x2f, 0x28, 0x36, 0x27, 0x22, 0x21, + 0x43, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4c, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4b, 0x21, + 0x36, 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x25, 0x2c, 0x39, 0x36, 0x36, 0x30, 0x22, 0x25, + 0x52, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4f, 0x52, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4f, 0x21, + 0x36, 0x36, 0x22, 0x26, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x30, 0x2d, 0x21, 0x36, 0x36, 0x32, 0x23, 0x2a, + 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4f, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4c, 0x22, + 0x36, 0x36, 0x24, 0x23, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0x2e, 0x36, 0x36, 0x23, 0x31, 0x27, 0x39, + 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4f, 0x47, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x4c, 0x23, + 0x36, 0x36, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x39, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x2b, 0x39, 0x36, 0x36, 0x36, 0x26, 0x32, 0x31, + 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4f, 0x47, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x46, 0x22, + 0x36, 0x21, 0x26, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x2c, 0x35, 0x24, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x39, 0x36, 0x36, 0x36, 0x36, 0x26, 0x2d, + 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4f, 0x47, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x9a, 0x36, + 0x24, 0x27, 0x9f, 0x24, 0x25, 0x28, 0x21, 0x36, + 0x36, 0x34, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x25, + 0x39, 0x4d, 0xa0, 0x84, 0x81, 0x57, 0x21, 0x39, + 0x52, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4f, 0x47, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x53, 0x28, + 0x23, 0x36, 0x36, 0x36, 0x21, 0x28, 0x2c, 0x30, + 0x21, 0x38, 0x33, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x28, 0x30, + 0x2d, 0xa1, 0x7a, 0xa2, 0xa3, 0xa3, 0x7f, 0x22, + 0x51, 0x52, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4f, 0x9b, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0xa4, 0xa5, 0xa5, 0xa6, 0x61, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x30, 0x32, + 0x25, 0x4d, 0x2b, 0x28, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x24, 0x26, 0x30, 0x33, 0x31, + 0x4d, 0x91, 0x5b, 0xa2, 0xa3, 0xa3, 0xa3, 0x5a, + 0x21, 0x2e, 0x46, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4f, 0x9b, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0xa7, 0xa8, 0x69, 0x66, 0xa9, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x26, 0x25, + 0x83, 0xaa, 0x2c, 0x25, 0x21, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x30, 0x35, 0x2d, 0x2f, 0x37, 0x4a, + 0x60, 0x85, 0xab, 0xac, 0xa3, 0xa3, 0xa3, 0x82, + 0x86, 0x36, 0x32, 0x3f, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x4c, 0x99, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0xad, 0xa2, 0xa8, 0xae, 0xaf, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x57, + 0x77, 0x66, 0x34, 0x27, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x23, 0x30, 0x31, 0xb0, 0x91, 0x7e, 0x90, 0x90, + 0x8b, 0x5b, 0xa2, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0x5d, 0xb1, 0x36, 0x24, 0x53, 0x9b, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x9b, 0x99, 0xad, 0x64, 0x5c, 0x8b, 0xb1, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x73, 0x5d, + 0x82, 0x5c, 0xb2, 0x2a, 0x23, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x24, 0x2b, 0xb0, 0x8b, 0x5b, 0x76, 0x5b, 0x5b, + 0x7b, 0xa2, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa8, 0x5e, 0x22, 0x36, 0x21, 0x3a, 0x99, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4f, 0x3f, 0xb3, 0x7b, 0x7b, 0x85, 0x80, + 0x9f, 0x36, 0x36, 0x36, 0x21, 0xb4, 0x7e, 0x7b, + 0x64, 0x64, 0xb5, 0x35, 0x24, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x31, 0xb6, 0x5b, 0x64, 0xa2, 0xa2, 0xac, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0x66, 0xb7, 0x36, 0x36, 0x36, 0x2c, 0x4b, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x9a, 0x3f, 0xb8, 0x76, 0x76, 0x7a, 0x63, + 0xb9, 0xba, 0x86, 0xba, 0xbb, 0x90, 0x5b, 0x64, + 0xa2, 0xa2, 0xbc, 0x2d, 0x27, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x26, 0x2d, 0x91, 0x5b, 0x64, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa8, 0x83, 0xaf, 0x36, 0x36, 0x36, 0x30, + 0x44, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x9b, 0x9a, 0x3f, 0xbd, 0x5b, 0x7b, 0xbe, 0x85, + 0x7e, 0x90, 0x63, 0x90, 0x85, 0x5b, 0xa2, 0xa3, + 0xa3, 0xac, 0x5d, 0xb5, 0x39, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xbf, 0xbe, 0x64, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa8, 0x88, 0x36, 0x36, 0x36, 0x36, + 0x2d, 0x9b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x9b, 0x45, 0x3f, 0xc0, 0x6d, 0x7b, 0xab, 0xbe, + 0x7a, 0x8b, 0x8b, 0x7a, 0x5b, 0x64, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa2, 0xc1, 0x37, 0x35, 0x26, 0x23, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2e, 0xbf, 0x7a, 0x7b, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa8, 0x72, 0x73, 0x36, 0x36, 0x36, + 0x24, 0x52, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x46, 0x42, 0xb6, 0x7a, 0x7b, 0x64, 0x7b, + 0x76, 0x5b, 0x5b, 0x76, 0x7b, 0xa2, 0xa3, 0xa3, + 0xa3, 0xa3, 0xac, 0x64, 0xc1, 0x4d, 0x2c, 0x27, + 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xc2, 0x8b, 0x7b, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa8, 0x89, 0x9f, 0x36, 0x36, + 0x32, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x4b, 0x2f, 0x8f, 0x7a, 0x7b, 0xa2, 0xac, + 0xa2, 0x64, 0x64, 0xa2, 0xa2, 0xac, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0x5d, 0xc3, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x25, 0x31, 0xc2, 0x85, 0x7b, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0x66, 0x57, 0x27, 0x4d, + 0x4b, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x99, 0x34, 0x9f, 0xb9, 0x7a, 0x7b, 0xa2, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xc2, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x26, 0x2d, 0xc2, 0x85, 0x7b, 0xac, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa8, 0x5f, 0x92, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x44, + 0x35, 0x36, 0xaf, 0xbb, 0x7a, 0x7b, 0xac, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xac, 0xa2, 0xc0, + 0x2b, 0x24, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x30, 0x2f, 0xb6, 0x8b, 0x7b, 0xac, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0x66, 0x89, 0x45, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x9b, 0x4e, 0x25, + 0x36, 0x36, 0x61, 0xb9, 0x6d, 0x64, 0xac, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xac, 0x7b, 0xbe, 0xc3, + 0x32, 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xc4, 0x63, 0xbe, 0xa2, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0x72, 0x81, 0xc5, + 0x46, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x3f, 0x2c, 0x36, 0x36, + 0x36, 0x36, 0xc6, 0x8f, 0x6d, 0x64, 0xac, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa2, 0xab, 0x8b, 0xb0, 0x2c, + 0x26, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x35, 0x96, 0x75, 0xab, 0xa2, 0xac, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xac, 0x7b, 0x81, 0xb9, + 0x73, 0x3b, 0x44, 0x9b, 0x48, 0x48, 0x48, 0x9b, + 0x99, 0x43, 0x94, 0x2c, 0x21, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x73, 0xb9, 0x7a, 0x7b, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0x64, 0x76, 0x7a, 0x91, 0xb5, 0x31, 0x30, + 0x28, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x24, + 0x39, 0x97, 0x75, 0xbe, 0x7b, 0x64, 0xa2, 0xa2, + 0xac, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0x7b, 0x7a, 0xc7, + 0xc8, 0x36, 0x21, 0x26, 0x2b, 0x39, 0x33, 0x30, + 0x23, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xc8, 0xbb, 0x8b, 0x7b, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0x64, 0x64, + 0x76, 0x85, 0xbf, 0xb5, 0x34, 0x2b, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x28, + 0x33, 0xc9, 0x63, 0x7e, 0x7a, 0x6d, 0xbe, 0x5b, + 0x76, 0x7b, 0x64, 0x64, 0xa2, 0xac, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xac, 0x76, 0x85, 0xb9, + 0x79, 0x22, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xca, 0xbb, 0x75, 0x76, 0xa2, 0xa3, + 0xa3, 0xa3, 0xac, 0xa2, 0x64, 0x76, 0xbe, 0x8b, + 0xb6, 0xb5, 0x2f, 0x35, 0x30, 0x24, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x27, 0x31, 0xcb, 0xc9, 0xbb, 0x74, 0x63, 0x90, + 0x7e, 0x75, 0x8b, 0x6d, 0xbe, 0x76, 0x64, 0xa2, + 0xac, 0xac, 0xac, 0xac, 0x64, 0x7a, 0x84, 0xcc, + 0x79, 0x9f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x21, 0xc8, 0xcc, 0x63, 0x6d, 0x7b, 0x64, + 0xac, 0xa2, 0x64, 0x7b, 0xbe, 0x75, 0x63, 0x96, + 0x38, 0x39, 0x2a, 0x24, 0x23, 0x21, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x28, 0x27, 0x35, 0x2d, 0x41, 0xb5, 0xc5, 0x8f, + 0xb9, 0xbb, 0xc7, 0x74, 0x84, 0x90, 0x85, 0x6d, + 0x5b, 0x7b, 0x7b, 0xab, 0x6d, 0x90, 0xb9, 0xcd, + 0xca, 0x22, 0x36, 0x36, 0x28, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x25, 0x36, + 0x36, 0x21, 0xb4, 0x80, 0xc7, 0x7e, 0x6d, 0x76, + 0xab, 0x76, 0x6d, 0x85, 0x63, 0xb9, 0xb5, 0x34, + 0x33, 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x23, 0x24, 0x27, 0x2a, 0x35, 0x2e, 0x2f, + 0x41, 0xce, 0xcf, 0x6c, 0x80, 0xcc, 0xb9, 0x74, + 0x84, 0x90, 0x75, 0x7e, 0x74, 0x8f, 0xcd, 0x79, + 0xc6, 0x2b, 0x9d, 0x41, 0x2f, 0x34, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x34, 0x2f, 0x38, + 0x4d, 0x37, 0xd0, 0xd1, 0x8f, 0x74, 0x63, 0x7e, + 0x75, 0x7e, 0x63, 0xc7, 0x88, 0xc4, 0x31, 0x2a, + 0x24, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x21, 0x22, 0x23, 0x24, 0x26, 0x30, + 0x33, 0x39, 0x2e, 0x51, 0x41, 0xb2, 0x6c, 0xd1, + 0x80, 0xcc, 0xcc, 0xcc, 0xd2, 0xd1, 0xb7, 0xd3, + 0x41, 0x34, 0x35, 0x32, 0x30, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x30, 0x2a, + 0x2b, 0x34, 0xd4, 0xca, 0xd5, 0x8f, 0xbb, 0xc7, + 0xc7, 0xbb, 0xcc, 0x6c, 0x41, 0x39, 0x27, 0x28, + 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, + 0x28, 0x24, 0x26, 0x2a, 0x33, 0x2c, 0x2f, 0x41, + 0xd6, 0xb7, 0x79, 0x79, 0x79, 0xca, 0xd7, 0x51, + 0x39, 0x30, 0x24, 0x23, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0x22, 0x23, + 0x24, 0x2a, 0x31, 0xd8, 0xc8, 0x79, 0xd1, 0x80, + 0xd5, 0xba, 0xd9, 0x2f, 0x35, 0x26, 0x23, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x22, 0x23, 0x28, 0x25, 0x30, 0x2b, + 0x31, 0x2f, 0xd4, 0xd8, 0xd8, 0x2f, 0x2e, 0x33, + 0x26, 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x21, 0x28, 0x27, 0x35, 0x34, 0xd8, 0xd8, 0xd8, + 0xda, 0xd4, 0x2e, 0x33, 0x25, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x23, 0x28, + 0x26, 0x30, 0x32, 0x2b, 0x33, 0x2a, 0x26, 0x28, + 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x21, 0x23, 0x25, 0x30, 0x33, 0x35, 0x35, + 0x2b, 0x2a, 0x26, 0x28, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, + 0x21, 0x22, 0x23, 0x28, 0x28, 0x23, 0x22, 0x21, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x21, 0x23, 0x28, 0x24, 0x24, + 0x28, 0x23, 0x22, 0x21, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }; -#endif +#endif /* !__HAVE_ARCH_LINUX_LOGO */ -#ifdef INCLUDE_LINUX_LOGOBW +#ifndef __HAVE_ARCH_LINUX_LOGOBW unsigned char linux_logo_bw[] __initdata = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, - 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC3, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFB, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xCF, 0xC3, 0xF8, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x81, 0xF9, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7, - 0x99, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xF3, 0xBC, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, - 0x19, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, - 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x21, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0xC0, 0x1F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, - 0xC0, 0x7C, 0x04, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE3, 0x80, 0x00, 0x7C, 0x40, 0x11, 0xFF, 0xFF, - 0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0xD2, 0x29, - 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F, - 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, - 0x00, 0x3F, 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x19, 0xFF, 0xFF, - 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1E, 0x80, 0x19, - 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1E, - 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, 0x7C, 0x00, - 0x00, 0x0F, 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, - 0xF8, 0x00, 0x00, 0x0E, 0x80, 0x11, 0xFF, 0xFF, - 0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x06, 0x00, 0x11, - 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x06, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00, - 0x00, 0x02, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF1, - 0xF0, 0x00, 0x00, 0x02, 0x80, 0x10, 0xFF, 0xFF, - 0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x97, 0x10, - 0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x00, 0x00, - 0xDF, 0xF0, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00, - 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xC7, - 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, - 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x00, 0x01, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, - 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F, - 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0x18, - 0xFF, 0xFF, 0xFF, 0x9E, 0x80, 0x00, 0x00, 0x03, - 0xA8, 0x11, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00, - 0x00, 0x02, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x99, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, - 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x01, - 0xFF, 0xFF, 0xFE, 0x20, 0x60, 0x00, 0x00, 0x00, - 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00, - 0x00, 0x00, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, 0x40, - 0x38, 0x00, 0x00, 0x00, 0xFE, 0x47, 0xFF, 0xFF, - 0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x23, - 0xFF, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00, - 0x78, 0x11, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80, - 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, - 0x07, 0xC0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, - 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x04, - 0x7F, 0xFF, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x10, - 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01, 0x80, - 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x00, 0x01, 0x4F, 0xFF, - 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, - 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x03, 0xF0, - 0x00, 0x00, 0x8F, 0xFF, 0x80, 0x00, 0x00, 0x40, - 0x0F, 0xF0, 0x00, 0x04, 0x1F, 0xFF, 0x80, 0x00, - 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x10, 0x1F, 0xFF, - 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x40, - 0xFF, 0xFF, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xF0, - 0x00, 0x83, 0xFF, 0xFF, 0x81, 0xE0, 0x01, 0xFF, - 0xFF, 0xF8, 0x02, 0x07, 0xFF, 0xFF, 0x80, 0x3F, - 0x07, 0xE0, 0x00, 0x1C, 0x0C, 0x1F, 0xFF, 0xFF, - 0xF8, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0x78, 0x1F, - 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0x00, 0x07, 0x0F, - 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x0C, 0x07, - 0xFF, 0x83, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x9f, 0x87, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0f, 0x03, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x67, 0x33, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xe7, 0x79, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xf7, 0x79, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xf9, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x60, 0x3b, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x89, 0x07, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x00, 0x03, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x00, 0x0d, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x80, 0x33, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xc0, 0xc3, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0x0d, 0xdd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x40, 0x31, 0xee, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x20, 0xc1, 0xee, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x1f, 0x00, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0x00, 0x00, 0x7f, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x7f, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xde, 0x00, 0x00, 0x7f, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbc, 0x00, 0x00, 0x3f, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x3f, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x1f, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0x1c, 0x07, 0xdf, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xfc, 0x08, 0x0f, 0xef, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xf8, 0x00, 0x01, 0xef, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xf0, 0x00, 0x00, 0x7f, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xe0, 0x00, 0x00, 0x1f, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xe0, 0x00, 0x00, 0x07, 0xbf, 0x7f, 0xff, + 0xff, 0xff, 0xf7, 0xc0, 0x00, 0x00, 0x03, 0xbf, 0x7f, 0xff, + 0xff, 0xff, 0xef, 0xc0, 0x00, 0x00, 0x03, 0xdf, 0xbf, 0xff, + 0xff, 0xff, 0xef, 0x80, 0x00, 0x00, 0x03, 0xdf, 0xbf, 0xff, + 0xff, 0xff, 0xdf, 0x80, 0x00, 0x00, 0x03, 0xdf, 0xbf, 0xff, + 0xff, 0xff, 0xdf, 0x80, 0x00, 0x00, 0x01, 0xef, 0xdf, 0xff, + 0xff, 0xff, 0xdf, 0x80, 0x00, 0x00, 0x01, 0xef, 0xdf, 0xff, + 0xff, 0xff, 0xbf, 0x00, 0x20, 0x00, 0x01, 0xef, 0xdf, 0xff, + 0xff, 0xff, 0xbf, 0x00, 0x20, 0x00, 0x01, 0xef, 0xdf, 0xff, + 0xff, 0xff, 0xbf, 0x00, 0x20, 0x00, 0x01, 0xef, 0xdf, 0xff, + 0xff, 0xff, 0xbf, 0x00, 0x20, 0x00, 0x01, 0xef, 0xdf, 0xff, + 0xff, 0xff, 0xbf, 0x00, 0x20, 0x00, 0x03, 0x03, 0xdf, 0xff, + 0xff, 0xff, 0xbf, 0x00, 0x20, 0x00, 0x02, 0xfd, 0xdf, 0xff, + 0xff, 0xff, 0xa3, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xc1, 0xc0, 0x00, 0x00, 0x11, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0x80, 0xe0, 0x00, 0x00, 0x21, 0xfe, 0x3f, 0xff, + 0xff, 0xff, 0x00, 0x70, 0x00, 0x00, 0x21, 0xfc, 0x3f, 0xff, + 0xff, 0xfe, 0x00, 0x3c, 0x00, 0x00, 0x20, 0xf8, 0x3f, 0xff, + 0xff, 0xf0, 0x00, 0x3e, 0x00, 0x00, 0x20, 0x00, 0x3f, 0xff, + 0xff, 0xc0, 0x00, 0x1f, 0x00, 0x00, 0x20, 0x00, 0x3f, 0xff, + 0xff, 0xc0, 0x00, 0x1f, 0x80, 0x00, 0x20, 0x00, 0x1f, 0xff, + 0xff, 0xc0, 0x00, 0x0f, 0x80, 0x00, 0x20, 0x00, 0x07, 0xff, + 0xff, 0xc0, 0x00, 0x07, 0x80, 0x00, 0x20, 0x00, 0x03, 0xff, + 0xff, 0xc0, 0x00, 0x07, 0x80, 0x00, 0x60, 0x00, 0x01, 0xff, + 0xff, 0xc0, 0x00, 0x02, 0x00, 0x00, 0xe0, 0x00, 0x01, 0xff, + 0xff, 0xc0, 0x00, 0x01, 0x00, 0x01, 0xe0, 0x00, 0x01, 0xff, + 0xff, 0xc0, 0x00, 0x00, 0x80, 0x07, 0xe0, 0x00, 0x03, 0xff, + 0xff, 0xc0, 0x00, 0x00, 0x80, 0x3f, 0xe0, 0x00, 0x0f, 0xff, + 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x1f, 0xff, + 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x7f, 0xff, + 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0xff, 0xff, + 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x03, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x00, 0x70, 0x00, 0xc0, 0x07, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x00, 0x8f, 0xff, 0x20, 0x0f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }; -#endif +#endif /* !__HAVE_ARCH_LINUX_LOGOBW */ -#ifdef INCLUDE_LINUX_LOGO16 +#ifndef __HAVE_ARCH_LINUX_LOGO16 -unsigned char linux_logo16_red[] __initdata = { - 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x35, 0x83, 0xa5, - 0x65, 0x8f, 0x98, 0xc9, 0xdb, 0xe1, 0xe7, 0xf8 +unsigned char linux_logo16[] __initdata = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x80, 0x00, 0x00, 0x08, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x08, 0x70, 0x00, 0x00, 0x00, 0x77, 0x70, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x87, 0x77, 0x00, 0x00, 0x07, 0xff, 0xf7, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x77, 0xff, 0x00, 0x00, 0x7f, 0x77, 0xf7, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x70, 0x0f, 0x80, 0x00, 0xf7, 0x08, 0x7f, 0x70, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x80, 0x07, 0x80, 0x00, 0xf8, 0x00, 0x8f, 0x70, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x70, 0x07, 0x88, 0x88, 0xf8, 0x00, 0x8f, 0x70, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0xf0, 0x06, 0xe6, 0xe6, 0xe6, 0x00, 0x8f, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x77, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x77, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x06, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x60, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x60, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x66, 0x66, 0x80, + 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, + 0x86, 0xe6, 0xe6, 0xe6, 0x66, 0x66, 0x66, 0x80, + 0x08, 0x78, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, + 0x86, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x70, + 0x00, 0x77, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x87, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x78, + 0x00, 0x88, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x87, 0x76, 0x66, 0x66, 0x77, 0x77, 0xff, 0xf7, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, + 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, + 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, + 0x70, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x8f, + 0xff, 0xf7, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x87, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x87, 0x77, + 0xff, 0xf7, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, + 0x77, 0x78, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x77, 0x7f, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, + 0x77, 0x78, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x77, 0x00, 0x08, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x08, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x77, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x80, 0x07, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x78, 0x00, 0x08, 0x80, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x08, 0x00, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x08, 0x80, 0x80, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x08, 0x08, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x08, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x08, 0x07, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x00, 0x08, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x80, 0x0f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x00, 0x08, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x80, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x00, 0x08, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x08, 0x00, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x00, 0x08, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x00, 0x08, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x00, 0x08, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x08, 0x08, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x00, 0x08, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x08, 0x08, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x00, 0x08, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x88, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x00, 0x08, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x88, 0x88, 0x80, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x06, 0xe6, 0x00, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0x80, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6e, 0x6e, 0x60, 0x08, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0xe0, 0x00, 0x00, 0x00, 0x88, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xe6, 0xe6, 0xe6, 0x00, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x6e, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x6e, 0x6e, 0x6e, 0x60, 0x08, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xe6, 0xe0, 0x00, 0x00, 0x00, 0x06, + 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe0, 0x00, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x6e, 0x60, 0x00, 0x00, 0x00, 0x0e, + 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x00, 0x08, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x76, 0xe6, 0xe6, 0x00, 0x00, 0x00, 0xe6, + 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe0, 0x00, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, + 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x60, 0x00, 0x08, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x76, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x00, 0x00, + 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x60, 0x00, + 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x76, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe0, 0x00, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x8e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x88, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x78, 0x86, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x80, 0x06, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, + 0x00, 0x06, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x80, + 0x00, 0x06, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x66, + 0x67, 0xff, 0xff, 0xff, 0xff, 0x78, 0x80, 0x00, + 0x00, 0x86, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x86, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, + 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x66, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x86, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x86, 0x6e, 0x6e, 0x6e, 0x6e, 0x66, 0x66, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x66, 0x66, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x66, + 0x60, 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x80, + 0x00, 0x06, 0x66, 0xe6, 0xe6, 0xe6, 0x66, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x66, 0x66, 0x66, 0xe6, 0xe6, 0x66, + 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x88, 0x86, 0x66, 0x6e, 0x6e, 0x66, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x66, 0x66, 0x66, 0x66, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x66, 0x66, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -unsigned char linux_logo16_green[] __initdata = { - 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x2e, 0x83, 0xa5, - 0x65, 0x6e, 0x98, 0x89, 0xbf, 0xac, 0xda, 0xf8 -}; +#endif /* !__HAVE_ARCH_LINUX_LOGO16 */ -unsigned char linux_logo16_blue[] __initdata = { - 0x00, 0x90, 0xaf, 0x9c, 0xf7, 0x2b, 0x82, 0xa5, - 0x65, 0x41, 0x97, 0x1e, 0x60, 0x29, 0xa5, 0xf8 -}; +#else /* !INCLUDE_LINUX_LOGO_DATA */ -unsigned char linux_logo16[] __initdata = { - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa1, 0x11, 0x11, - 0x61, 0x16, 0x66, 0x66, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0xa8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x87, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x73, 0x33, 0x33, 0x3a, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x27, 0x77, 0x77, 0x77, 0x33, 0x3a, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xa3, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x55, 0x50, 0x08, 0x33, 0x77, 0x77, - 0x77, 0x72, 0x72, 0x27, 0x77, 0x77, 0x33, 0x33, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xa3, 0x33, 0x33, 0x77, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x58, 0x85, 0x00, 0x11, 0x11, 0xaa, - 0xa3, 0x37, 0x77, 0x72, 0x22, 0x22, 0x77, 0x73, - 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, - 0x33, 0x37, 0x77, 0x33, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x56, 0x85, 0x00, 0x06, 0x66, 0x11, - 0x11, 0x1a, 0xa3, 0x37, 0x77, 0x72, 0x22, 0x77, - 0x73, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, - 0x33, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x55, 0x00, 0x00, 0x06, 0x66, 0x66, - 0x66, 0x66, 0x11, 0x1a, 0xa3, 0x77, 0x72, 0x22, - 0x77, 0x73, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, - 0x33, 0x33, 0x33, 0xa0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, - 0x66, 0x66, 0x66, 0x66, 0x11, 0xa3, 0x77, 0x22, - 0x22, 0x77, 0x33, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, - 0x33, 0x3a, 0xa1, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x33, - 0xaa, 0x11, 0x16, 0x66, 0x66, 0x61, 0x1a, 0x37, - 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x33, - 0x3a, 0xa1, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x22, - 0x22, 0x77, 0x3a, 0x11, 0x66, 0x66, 0x66, 0x1a, - 0x37, 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, 0x3a, - 0xa1, 0x11, 0x11, 0x10, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x05, 0x80, 0x50, 0x00, 0x00, 0x07, 0x72, - 0x22, 0x22, 0x22, 0x73, 0xa1, 0x66, 0x66, 0x61, - 0x1a, 0x77, 0x22, 0x27, 0x73, 0x33, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x3a, 0xaa, - 0x11, 0x11, 0x1a, 0xa0, 0x08, 0x71, 0x05, 0x00, - 0x00, 0x12, 0x22, 0x50, 0x00, 0x00, 0x07, 0x77, - 0x77, 0x72, 0x22, 0x22, 0x27, 0x31, 0x16, 0x66, - 0x61, 0x13, 0x77, 0x22, 0x77, 0x33, 0x3a, 0xaa, - 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xa1, - 0x11, 0x1a, 0x33, 0x70, 0x07, 0x2e, 0x70, 0x00, - 0x01, 0x44, 0x42, 0x60, 0x00, 0x00, 0x02, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x27, 0x31, 0x66, - 0x66, 0x61, 0xa3, 0x72, 0x22, 0x77, 0x33, 0xaa, - 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xaa, 0x11, - 0x1a, 0x33, 0x77, 0x30, 0x04, 0x82, 0x40, 0x00, - 0x54, 0x48, 0x54, 0x40, 0x00, 0x00, 0x01, 0xaa, - 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x31, - 0x66, 0x66, 0x11, 0x37, 0x22, 0x27, 0x73, 0x3a, - 0xaa, 0xaa, 0xa3, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, - 0xa3, 0x77, 0xaa, 0x10, 0x50, 0x08, 0x46, 0x05, - 0x54, 0x80, 0x50, 0x42, 0x00, 0x00, 0x08, 0x66, - 0x66, 0x1a, 0x32, 0x22, 0x22, 0x22, 0x22, 0x27, - 0x31, 0x66, 0x66, 0x13, 0x72, 0x22, 0x77, 0x33, - 0xaa, 0xaa, 0xaa, 0x33, 0xaa, 0xa1, 0xaa, 0xa3, - 0x37, 0xa1, 0x1a, 0x30, 0x50, 0x06, 0x26, 0x00, - 0x54, 0x00, 0x00, 0x44, 0x00, 0x00, 0x08, 0xe2, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, 0x22, - 0x27, 0xa6, 0x66, 0x61, 0xa7, 0x72, 0x27, 0x73, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, - 0x31, 0x11, 0x37, 0x70, 0x02, 0x00, 0xab, 0xbb, - 0xb6, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, - 0x22, 0x23, 0x16, 0x66, 0x1a, 0x37, 0x22, 0x77, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x3a, - 0x11, 0xa7, 0x33, 0x10, 0x04, 0x09, 0xbd, 0xdd, - 0xbd, 0xd0, 0x04, 0x45, 0x00, 0x0e, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, - 0x22, 0x22, 0x71, 0x66, 0x66, 0x13, 0x72, 0x27, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x11, - 0xa3, 0x73, 0xa1, 0x60, 0x08, 0xbd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdb, 0x90, 0x00, 0x02, 0xec, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xce, 0x22, - 0x22, 0x22, 0x27, 0xa6, 0x66, 0x61, 0x37, 0x27, - 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x1a, - 0x33, 0xa1, 0x16, 0x60, 0x0b, 0xbd, 0xdd, 0xdd, - 0xcd, 0xdd, 0xdd, 0xd9, 0x00, 0x00, 0xec, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xa2, - 0x22, 0x22, 0x22, 0x7a, 0x66, 0x66, 0x13, 0x77, - 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0x3a, 0x11, 0x33, - 0xaa, 0x11, 0x66, 0x60, 0x9b, 0xdd, 0xdd, 0xdd, - 0xcd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0xec, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x61, - 0x72, 0x22, 0x22, 0x22, 0xa1, 0x66, 0x61, 0x37, - 0x1a, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x13, 0x3a, - 0x11, 0x11, 0x11, 0x10, 0x5b, 0xdd, 0xdd, 0xdc, - 0xdd, 0xdd, 0xbd, 0xd9, 0x00, 0x00, 0xec, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x86, - 0x17, 0x22, 0x22, 0x22, 0x23, 0x16, 0x66, 0xaa, - 0xaa, 0xa3, 0x3a, 0xaa, 0xaa, 0x1a, 0x3a, 0xa1, - 0x11, 0x11, 0x1a, 0x70, 0x05, 0xbd, 0xdd, 0xdd, - 0xdb, 0x5b, 0xdd, 0xb0, 0x00, 0x60, 0x2e, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe6, 0x88, - 0x66, 0x32, 0x22, 0x22, 0x22, 0x36, 0x66, 0x11, - 0x33, 0x33, 0x3a, 0xaa, 0x11, 0xaa, 0xaa, 0xa1, - 0x11, 0x1a, 0x3a, 0x60, 0x02, 0x99, 0xbb, 0xb9, - 0x9b, 0xbb, 0xbc, 0x22, 0x00, 0x86, 0x5e, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe1, 0x68, - 0x86, 0x63, 0x22, 0x22, 0x22, 0x2a, 0x66, 0x66, - 0x33, 0x33, 0xaa, 0xaa, 0x1a, 0xaa, 0xaa, 0x11, - 0x1a, 0xa7, 0x68, 0x80, 0x02, 0x2b, 0xbd, 0xbb, - 0xbb, 0xb9, 0x22, 0x22, 0x00, 0x06, 0x6e, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0xa6, - 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, 0xa6, 0x66, - 0x33, 0x3a, 0xaa, 0xa1, 0xaa, 0xaa, 0xa1, 0x11, - 0xa3, 0xa6, 0x88, 0x80, 0x02, 0x22, 0x9b, 0xbb, - 0xbb, 0x22, 0x24, 0xf4, 0x60, 0x00, 0x0c, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x21, - 0x68, 0x88, 0x63, 0x22, 0x22, 0x22, 0x71, 0x66, - 0x33, 0x3a, 0x11, 0x11, 0xaa, 0xaa, 0x11, 0xaa, - 0x71, 0x88, 0x88, 0x00, 0x02, 0xe2, 0x26, 0x99, - 0x22, 0x22, 0x4f, 0xf4, 0x40, 0x00, 0x0c, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x22, 0x22, - 0x16, 0x88, 0x86, 0xa2, 0x22, 0x22, 0x27, 0x11, - 0x33, 0xa1, 0x11, 0x11, 0xaa, 0x31, 0x1a, 0xa3, - 0x68, 0x88, 0x81, 0x00, 0x54, 0x42, 0x22, 0x22, - 0x22, 0x44, 0xff, 0xff, 0x48, 0x00, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x22, - 0x21, 0x88, 0x88, 0x6a, 0x22, 0x22, 0x22, 0x31, - 0x3a, 0xa1, 0x11, 0x1a, 0xa3, 0x11, 0x33, 0x36, - 0x88, 0x86, 0x30, 0x00, 0x4f, 0x44, 0x22, 0x22, - 0x24, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x95, 0x22, 0x72, - 0x22, 0x18, 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, - 0xaa, 0x11, 0x11, 0x1a, 0x31, 0x13, 0x33, 0x68, - 0x88, 0x6a, 0x00, 0x02, 0x4f, 0x4f, 0x42, 0x24, - 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x50, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x73, - 0x72, 0x26, 0x88, 0x88, 0x63, 0x22, 0x22, 0x22, - 0x11, 0x11, 0x11, 0xa3, 0xa1, 0x73, 0xa6, 0x88, - 0x81, 0xa5, 0x00, 0x04, 0x4f, 0x4f, 0x44, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x40, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x12, 0x27, - 0xaa, 0x22, 0x68, 0x55, 0x86, 0x72, 0x22, 0x22, - 0x11, 0x11, 0x1a, 0x33, 0x13, 0x3a, 0x18, 0x88, - 0x1a, 0x10, 0x00, 0x44, 0x4f, 0x4f, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x61, 0x22, - 0x3a, 0xa2, 0x26, 0x85, 0x58, 0x67, 0x22, 0x22, - 0x61, 0x61, 0x1a, 0x7a, 0x37, 0x31, 0x88, 0x81, - 0x11, 0x00, 0x05, 0xe4, 0x44, 0xff, 0xff, 0xff, - 0x4f, 0xf4, 0x44, 0xff, 0xff, 0xf5, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x12, - 0x2a, 0xaa, 0x72, 0x68, 0x55, 0x81, 0x22, 0x22, - 0x66, 0x61, 0xa3, 0x33, 0x73, 0x16, 0x88, 0x11, - 0x10, 0x00, 0x08, 0x74, 0x44, 0x4f, 0x44, 0x44, - 0xf4, 0xf4, 0x44, 0x44, 0xe2, 0x44, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x81, - 0x22, 0xaa, 0xa7, 0x26, 0x85, 0x88, 0x12, 0x22, - 0x66, 0x61, 0x37, 0xa7, 0x3a, 0x66, 0x66, 0x11, - 0x80, 0x00, 0x0a, 0x72, 0x44, 0x4f, 0x44, 0x4f, - 0xff, 0x44, 0x44, 0x22, 0x22, 0x24, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x85, 0x88, - 0x12, 0x2a, 0xaa, 0x22, 0x68, 0x58, 0x63, 0x22, - 0x66, 0x1a, 0x73, 0x77, 0x31, 0x66, 0x61, 0x11, - 0x00, 0x00, 0x07, 0x44, 0xff, 0x4f, 0xf4, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0x42, 0x22, 0x40, 0x9b, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x85, 0x55, - 0x81, 0x27, 0xaa, 0xa2, 0x78, 0x88, 0x86, 0x72, - 0x66, 0x13, 0x77, 0x73, 0x11, 0x66, 0x61, 0x76, - 0x00, 0x50, 0x84, 0xf4, 0xff, 0x4f, 0xf4, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x42, 0x40, 0x9b, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x68, 0x55, - 0x58, 0x12, 0x3a, 0xaa, 0x23, 0x88, 0x88, 0xa7, - 0x66, 0xa7, 0x77, 0x7a, 0x16, 0x66, 0x1a, 0x15, - 0x05, 0x00, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0x24, 0x9b, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x26, 0x55, - 0x55, 0x81, 0x23, 0xaa, 0x32, 0x18, 0x88, 0x6a, - 0x61, 0x37, 0x77, 0x31, 0x66, 0x66, 0x17, 0x60, - 0x05, 0x08, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4e, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0xa2, 0x65, - 0x55, 0x58, 0xa2, 0x7a, 0xa2, 0x26, 0x88, 0x61, - 0x61, 0x32, 0x27, 0xa1, 0x66, 0x61, 0x31, 0x60, - 0x00, 0x04, 0x4f, 0xf4, 0xff, 0x44, 0x44, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x9b, 0xaa, 0x26, - 0x55, 0x55, 0x87, 0x27, 0x33, 0x27, 0x68, 0x61, - 0x1a, 0x72, 0x27, 0xa6, 0x66, 0x6a, 0x71, 0x00, - 0x80, 0x84, 0xff, 0xf4, 0xff, 0x44, 0x44, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, - 0x9b, 0x9b, 0x99, 0xb9, 0xb9, 0x99, 0xaa, 0xa2, - 0x85, 0x55, 0x56, 0x22, 0x27, 0x22, 0x36, 0x66, - 0x13, 0x22, 0x23, 0x16, 0x86, 0x63, 0x73, 0x00, - 0x00, 0x44, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4f, 0x99, - 0x9b, 0x99, 0x99, 0x99, 0xb9, 0x99, 0xaa, 0xaa, - 0x28, 0x55, 0x58, 0x12, 0x22, 0x22, 0x21, 0x11, - 0xa3, 0x27, 0x7a, 0x66, 0x86, 0x17, 0x75, 0x05, - 0x05, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, - 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x44, 0x4f, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x3a, 0xaa, - 0xa2, 0x85, 0x58, 0x67, 0x72, 0x22, 0x27, 0xa1, - 0x37, 0x27, 0x7a, 0x68, 0x86, 0xa2, 0x70, 0x00, - 0x02, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xf4, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x23, 0xaa, - 0xa7, 0x78, 0x88, 0x81, 0x77, 0x22, 0x27, 0x3a, - 0x72, 0x73, 0x71, 0x68, 0x66, 0x32, 0x50, 0x00, - 0x04, 0x4f, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x95, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x55, 0x12, 0x3a, - 0xaa, 0x21, 0x88, 0x81, 0x77, 0x27, 0x73, 0x73, - 0x72, 0x33, 0x36, 0x86, 0x61, 0x72, 0x00, 0x00, - 0x04, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0x55, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x8a, 0x27, - 0xaa, 0x77, 0x68, 0x61, 0x23, 0x71, 0x11, 0x3a, - 0x27, 0xa3, 0x36, 0x86, 0x61, 0x20, 0x00, 0x00, - 0x04, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x59, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x58, 0x77, - 0x27, 0x32, 0x36, 0x63, 0x23, 0x71, 0x66, 0x11, - 0x27, 0x13, 0xa6, 0x86, 0x6a, 0x20, 0x00, 0x50, - 0x04, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x99, - 0x9b, 0xbb, 0xbb, 0xbb, 0xb9, 0x99, 0x68, 0x13, - 0x32, 0x22, 0x73, 0xa7, 0x2a, 0x31, 0x88, 0x66, - 0x7a, 0x13, 0x18, 0x66, 0x63, 0x20, 0x00, 0x06, - 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x49, 0x95, - 0xa9, 0xa9, 0x99, 0x97, 0x92, 0x99, 0x65, 0x6a, - 0x17, 0x22, 0x23, 0x72, 0x27, 0xaa, 0x88, 0x88, - 0xa1, 0x17, 0x68, 0x66, 0x67, 0x70, 0x00, 0x05, - 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x49, 0x9c, - 0x2e, 0xee, 0xee, 0xee, 0xee, 0xa9, 0x65, 0x8a, - 0x1a, 0xaa, 0x37, 0x72, 0x27, 0x37, 0x88, 0x88, - 0x11, 0x17, 0x68, 0x66, 0x67, 0x10, 0x9d, 0xd0, - 0x84, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0xf4, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x4f, 0x69, - 0xcc, 0xee, 0xee, 0xee, 0xec, 0x99, 0x88, 0x63, - 0x61, 0x68, 0x61, 0x72, 0x22, 0x7a, 0x68, 0x88, - 0x11, 0x17, 0x88, 0x66, 0x12, 0x1b, 0xdd, 0xdd, - 0x02, 0x44, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0xff, 0x4f, 0x4c, 0xc5, - 0x0c, 0xc1, 0x11, 0x1c, 0xc0, 0x26, 0x66, 0x17, - 0x66, 0x88, 0x88, 0x12, 0x22, 0x23, 0xa8, 0x88, - 0x11, 0x13, 0x88, 0x66, 0x17, 0xbb, 0xdd, 0xdd, - 0xd0, 0x8f, 0xff, 0xf4, 0xf4, 0x44, 0xf4, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0x4f, 0x44, 0xdd, 0xdd, - 0x00, 0x00, 0x00, 0x05, 0x9d, 0x21, 0x66, 0x27, - 0xa6, 0x65, 0x58, 0x67, 0x22, 0x27, 0x28, 0x88, - 0x11, 0xaa, 0x86, 0x68, 0x1a, 0xbb, 0xdd, 0xdd, - 0xdb, 0x05, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xdd, 0xdb, - 0x00, 0x00, 0x00, 0x00, 0xdd, 0xda, 0x66, 0x22, - 0x71, 0x15, 0x55, 0x81, 0x22, 0x22, 0x76, 0x88, - 0x11, 0x31, 0x88, 0x88, 0xab, 0xbd, 0xdd, 0xdd, - 0xdd, 0x00, 0x04, 0x44, 0xff, 0xff, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0x44, 0xdd, 0xdb, - 0x00, 0x00, 0x00, 0x0b, 0xdd, 0xda, 0x11, 0x22, - 0x23, 0x68, 0x55, 0x86, 0x22, 0x22, 0x7a, 0x88, - 0x1a, 0x71, 0x88, 0x89, 0xbb, 0xdd, 0xdd, 0xdd, - 0xdd, 0xd0, 0x00, 0x4f, 0x44, 0xff, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xff, 0xe2, 0xdd, 0xdb, - 0x90, 0x00, 0x05, 0xbd, 0xdd, 0xb8, 0x63, 0x22, - 0x27, 0xa6, 0x55, 0x88, 0x77, 0x22, 0x22, 0x88, - 0x1a, 0x28, 0xbd, 0xdb, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdb, 0x00, 0x07, 0x44, 0x4f, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x22, 0xdd, 0xdb, - 0xbb, 0x9b, 0xbb, 0xbd, 0xdd, 0xd5, 0x86, 0x22, - 0x22, 0x77, 0x85, 0x88, 0x17, 0x22, 0x22, 0x88, - 0xaa, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0x00, 0x00, 0x54, 0x4f, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0x44, 0x22, 0xbd, 0xdd, - 0xbb, 0xbb, 0xbb, 0xdd, 0xdd, 0xdd, 0x88, 0x72, - 0x27, 0x22, 0x88, 0x88, 0x67, 0x72, 0x22, 0x18, - 0x33, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xd0, 0x00, 0x05, 0x4f, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0x44, 0x4f, 0x22, 0xbd, 0xdd, - 0xdb, 0xbb, 0xdd, 0xdd, 0xdd, 0xdd, 0x88, 0x17, - 0x27, 0x72, 0x68, 0x88, 0x87, 0x32, 0x22, 0x36, - 0x37, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xd5, 0x00, 0x00, 0x4f, 0x4f, 0x4f, - 0xff, 0xf4, 0xf4, 0xf4, 0xf4, 0x22, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x67, - 0x72, 0x77, 0x38, 0x88, 0x83, 0x37, 0x22, 0x26, - 0x72, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0x00, 0x00, 0x4f, 0x4f, 0x4f, - 0xff, 0xf4, 0xf4, 0xf4, 0x44, 0x25, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3, - 0x32, 0x73, 0x76, 0x88, 0x81, 0x33, 0x22, 0x2a, - 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xb0, 0x54, 0x4f, 0x4f, 0x4f, - 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x00, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xa7, 0x73, 0x26, 0x88, 0x86, 0x7a, 0x72, 0x27, - 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0xff, 0x4f, 0x4f, - 0xff, 0xf4, 0xf4, 0x44, 0x40, 0x05, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0x13, 0x23, 0x21, 0x68, 0x86, 0x17, 0x72, 0x22, - 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0x4f, 0x4f, 0x4f, - 0xff, 0xff, 0x44, 0x42, 0x00, 0x05, 0xbd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0x87, 0x27, 0x27, 0x16, 0x66, 0x67, 0x22, 0x22, - 0x72, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0x94, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x00, 0x00, 0x05, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb8, - 0x86, 0x22, 0x22, 0x7a, 0x68, 0x81, 0x22, 0x22, - 0x37, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x44, 0x44, 0x44, - 0x44, 0x47, 0x00, 0x00, 0x00, 0x05, 0xbd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x68, - 0x58, 0x72, 0x22, 0x27, 0x18, 0x86, 0x72, 0x22, - 0x1a, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x18, 0x85, - 0x58, 0x12, 0x22, 0x36, 0x18, 0x88, 0x32, 0x22, - 0x61, 0x3b, 0xbb, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x7a, 0x68, 0x85, - 0x88, 0x62, 0x27, 0x16, 0x18, 0x88, 0x12, 0x27, - 0x86, 0x18, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, - 0xdd, 0xdd, 0xdd, 0xbb, 0xb5, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbb, 0xbd, - 0xdd, 0xdd, 0xdb, 0xbb, 0x87, 0x31, 0x68, 0x65, - 0x88, 0x82, 0x23, 0x16, 0x18, 0x88, 0x12, 0x23, - 0x88, 0x67, 0x27, 0xa8, 0x9b, 0xbb, 0xbb, 0xbb, - 0xbd, 0xdd, 0xbb, 0xbb, 0x95, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9b, 0xbb, - 0xbb, 0xbb, 0xbb, 0x96, 0x87, 0x16, 0x68, 0x18, - 0x88, 0x62, 0x31, 0x66, 0x18, 0x88, 0x62, 0x73, - 0x88, 0x63, 0x27, 0x33, 0x65, 0x55, 0x99, 0x9b, - 0xbb, 0xbb, 0xbb, 0x99, 0x55, 0x0a, 0xa1, 0x86, - 0x81, 0x68, 0x88, 0x55, 0x58, 0x85, 0x9b, 0xbb, - 0xbb, 0xbb, 0x95, 0x88, 0x83, 0x66, 0x66, 0x18, - 0x66, 0x82, 0xa1, 0x66, 0x18, 0x88, 0x62, 0x33, - 0x88, 0x81, 0x27, 0x7a, 0x18, 0x58, 0x86, 0x85, - 0x99, 0x99, 0x99, 0x95, 0x53, 0x2a, 0xaa, 0x88, - 0x67, 0x31, 0x68, 0x55, 0x58, 0x85, 0x59, 0xbb, - 0xbb, 0xb9, 0x58, 0x68, 0x83, 0x66, 0x61, 0x16, - 0x66, 0x62, 0x16, 0x66, 0x68, 0x88, 0x62, 0xaa, - 0x88, 0x86, 0x27, 0x77, 0x78, 0x55, 0x88, 0x22, - 0x25, 0x55, 0x95, 0x55, 0x6a, 0xa2, 0x2a, 0x88, - 0x62, 0x27, 0x37, 0x38, 0x88, 0x87, 0x55, 0x59, - 0x95, 0x58, 0x16, 0x88, 0x8a, 0x66, 0x63, 0x68, - 0x86, 0x67, 0x66, 0x66, 0x68, 0x88, 0x12, 0x11, - 0x88, 0x88, 0x72, 0x77, 0x78, 0x85, 0x58, 0x17, - 0x23, 0x32, 0x55, 0x55, 0x81, 0x13, 0x73, 0x66, - 0x62, 0x7a, 0xaa, 0x38, 0x88, 0x58, 0x27, 0x55, - 0x58, 0x32, 0x38, 0x88, 0x81, 0x66, 0xa2, 0x88, - 0x86, 0x61, 0x66, 0x61, 0x66, 0x68, 0x13, 0x11, - 0x88, 0x88, 0x12, 0x22, 0x71, 0x85, 0x58, 0x62, - 0x23, 0xa2, 0x68, 0x88, 0x81, 0x66, 0x88, 0x88, - 0x63, 0x2a, 0xaa, 0x28, 0x88, 0x55, 0x86, 0x61, - 0x66, 0x66, 0x68, 0x88, 0x66, 0x66, 0x77, 0x88, - 0x68, 0x16, 0x66, 0x62, 0x66, 0x68, 0xa1, 0x61, - 0x88, 0x88, 0x62, 0x22, 0x22, 0x85, 0x55, 0x83, - 0x72, 0x37, 0xa8, 0x88, 0x61, 0x66, 0x85, 0x55, - 0x86, 0x23, 0xaa, 0x71, 0x88, 0x85, 0x88, 0x66, - 0x88, 0x86, 0x88, 0x88, 0x16, 0x61, 0x21, 0x88, - 0x66, 0xa6, 0x86, 0x17, 0x66, 0x66, 0x31, 0x61, - 0x88, 0x88, 0x87, 0x72, 0x22, 0x68, 0x55, 0x86, - 0x77, 0x77, 0x36, 0x88, 0x13, 0x68, 0x85, 0x55, - 0x58, 0x12, 0x73, 0x72, 0x76, 0x88, 0x88, 0x68, - 0x88, 0x88, 0x88, 0x66, 0x36, 0x63, 0x26, 0x86, - 0x86, 0x36, 0x86, 0x11, 0x66, 0x66, 0x76, 0x61, - 0x88, 0x88, 0x81, 0x22, 0x22, 0x38, 0x85, 0x58, - 0x37, 0x22, 0x21, 0x68, 0xa2, 0x31, 0x68, 0x55, - 0x55, 0x81, 0x22, 0x22, 0xa8, 0x88, 0x88, 0x68, - 0x86, 0x88, 0x68, 0x81, 0x36, 0x17, 0x21, 0x68, - 0x86, 0x16, 0x66, 0x26, 0x66, 0x61, 0x36, 0x66, - 0x68, 0x88, 0x86, 0x27, 0x22, 0x28, 0x88, 0x88, - 0x17, 0x72, 0x2a, 0x66, 0xa2, 0x22, 0x36, 0x55, - 0x55, 0x58, 0x37, 0x3a, 0x16, 0x66, 0x66, 0x66, - 0x66, 0x18, 0x88, 0x67, 0x16, 0x12, 0x71, 0x68, - 0x81, 0x68, 0x61, 0x76, 0x66, 0x6a, 0x16, 0x66, - 0x88, 0x88, 0x86, 0x77, 0x22, 0x26, 0x88, 0x88, - 0x13, 0x37, 0x71, 0x66, 0xa2, 0x33, 0x2a, 0x85, - 0x55, 0x55, 0x17, 0x73, 0x16, 0x66, 0x66, 0x68, - 0x63, 0x88, 0x88, 0xa2, 0x66, 0xa2, 0xa6, 0x88, - 0x61, 0x68, 0x6a, 0x76, 0x66, 0x6a, 0x66, 0x6a -}; +/* prototypes only */ +extern unsigned char linux_logo_red[]; +extern unsigned char linux_logo_green[]; +extern unsigned char linux_logo_blue[]; +extern unsigned char linux_logo[]; +extern unsigned char linux_logo_bw[]; +extern unsigned char linux_logo16[]; + +#endif /* !INCLUDE_LINUX_LOGO_DATA */ -#endif diff -u --recursive --new-file v2.4.5/linux/include/linux/mm.h linux/include/linux/mm.h --- v2.4.5/linux/include/linux/mm.h Fri May 25 18:28:55 2001 +++ linux/include/linux/mm.h Fri Jun 8 14:03:27 2001 @@ -10,6 +10,7 @@ #include #include #include +#include extern unsigned long max_mapnr; extern unsigned long num_physpages; @@ -167,6 +168,7 @@ #define PG_skip 10 #define PG_inactive_clean 11 #define PG_highmem 12 +#define PG_checked 13 /* kill me in 2.5.. */ /* bits 21-29 unused */ #define PG_arch_1 30 #define PG_reserved 31 @@ -181,6 +183,8 @@ #define PageLocked(page) test_bit(PG_locked, &(page)->flags) #define LockPage(page) set_bit(PG_locked, &(page)->flags) #define TryLockPage(page) test_and_set_bit(PG_locked, &(page)->flags) +#define PageChecked(page) test_bit(PG_checked, &(page)->flags) +#define SetPageChecked(page) set_bit(PG_checked, &(page)->flags) extern void __set_page_dirty(struct page *); @@ -337,10 +341,10 @@ * can allocate highmem pages, the *get*page*() variants return * virtual kernel addresses to the allocated page(s). */ -extern struct page * FASTCALL(__alloc_pages(zonelist_t *zonelist, unsigned long order)); +extern struct page * FASTCALL(_alloc_pages(unsigned int gfp_mask, unsigned long order)); +extern struct page * FASTCALL(__alloc_pages(unsigned int gfp_mask, unsigned long order, zonelist_t *zonelist)); extern struct page * alloc_pages_node(int nid, int gfp_mask, unsigned long order); -#ifndef CONFIG_DISCONTIGMEM static inline struct page * alloc_pages(int gfp_mask, unsigned long order) { /* @@ -348,11 +352,8 @@ */ if (order >= MAX_ORDER) return NULL; - return __alloc_pages(contig_page_data.node_zonelists+(gfp_mask), order); + return _alloc_pages(gfp_mask, order); } -#else /* !CONFIG_DISCONTIGMEM */ -extern struct page * alloc_pages(int gfp_mask, unsigned long order); -#endif /* !CONFIG_DISCONTIGMEM */ #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0) @@ -427,6 +428,23 @@ extern void si_meminfo(struct sysinfo * val); extern void swapin_readahead(swp_entry_t); +/* + * Work out if there are any other processes sharing this + * swap cache page. Never mind the buffers. + */ +static inline int exclusive_swap_page(struct page *page) +{ + unsigned int count; + + if (!PageLocked(page)) + BUG(); + if (!PageSwapCache(page)) + return 0; + count = page_count(page) - !!page->buffers; /* 2: us + swap cache */ + count += swap_count(page); /* +1: just swap cache */ + return count == 3; /* =3: total */ +} + /* mmap.c */ extern void lock_vma_mappings(struct vm_area_struct *); extern void unlock_vma_mappings(struct vm_area_struct *); @@ -471,18 +489,17 @@ /* * GFP bitmasks.. */ -#define __GFP_WAIT 0x01 -#define __GFP_HIGH 0x02 -#define __GFP_IO 0x04 -#define __GFP_DMA 0x08 -#ifdef CONFIG_HIGHMEM -#define __GFP_HIGHMEM 0x10 -#else -#define __GFP_HIGHMEM 0x0 /* noop */ -#endif - +/* Zone modifiers in GFP_ZONEMASK (see linux/mmzone.h - low four bits) */ +#define __GFP_DMA 0x01 +#define __GFP_HIGHMEM 0x02 + +/* Action modifiers - doesn't change the zoning */ +#define __GFP_WAIT 0x10 +#define __GFP_HIGH 0x20 +#define __GFP_IO 0x40 +#define __GFP_BUFFER 0x80 -#define GFP_BUFFER (__GFP_HIGH | __GFP_WAIT) +#define GFP_BUFFER (__GFP_HIGH | __GFP_WAIT | __GFP_BUFFER) #define GFP_ATOMIC (__GFP_HIGH) #define GFP_USER ( __GFP_WAIT | __GFP_IO) #define GFP_HIGHUSER ( __GFP_WAIT | __GFP_IO | __GFP_HIGHMEM) diff -u --recursive --new-file v2.4.5/linux/include/linux/mmzone.h linux/include/linux/mmzone.h --- v2.4.5/linux/include/linux/mmzone.h Fri May 25 18:28:55 2001 +++ linux/include/linux/mmzone.h Fri Jun 8 14:03:27 2001 @@ -78,10 +78,9 @@ */ typedef struct zonelist_struct { zone_t * zones [MAX_NR_ZONES+1]; // NULL delimited - int gfp_mask; } zonelist_t; -#define NR_GFPINDEX 0x20 +#define GFP_ZONEMASK 0x0f /* * The pg_data_t structure is used in machines with CONFIG_DISCONTIGMEM @@ -97,7 +96,7 @@ struct bootmem_data; typedef struct pglist_data { zone_t node_zones[MAX_NR_ZONES]; - zonelist_t node_zonelists[NR_GFPINDEX]; + zonelist_t node_zonelists[GFP_ZONEMASK+1]; struct page *node_mem_map; unsigned long *valid_addr_bitmap; struct bootmem_data *bdata; diff -u --recursive --new-file v2.4.5/linux/include/linux/mount.h linux/include/linux/mount.h --- v2.4.5/linux/include/linux/mount.h Fri May 25 18:28:55 2001 +++ linux/include/linux/mount.h Tue Jun 5 16:55:22 2001 @@ -14,12 +14,11 @@ struct vfsmount { + struct list_head mnt_hash; + struct vfsmount *mnt_parent; /* fs we are mounted on */ struct dentry *mnt_mountpoint; /* dentry of mountpoint */ struct dentry *mnt_root; /* root of the mounted tree */ - struct vfsmount *mnt_parent; /* fs we are mounted on */ struct list_head mnt_instances; /* other vfsmounts of the same fs */ - struct list_head mnt_clash; /* those who are mounted on (other */ - /* instances) of the same dentry */ struct super_block *mnt_sb; /* pointer to superblock */ struct list_head mnt_mounts; /* list of children, anchored here */ struct list_head mnt_child; /* and going through their mnt_child */ diff -u --recursive --new-file v2.4.5/linux/include/linux/netfilter_bridge.h linux/include/linux/netfilter_bridge.h --- v2.4.5/linux/include/linux/netfilter_bridge.h Wed Dec 31 16:00:00 1969 +++ linux/include/linux/netfilter_bridge.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,24 @@ +#ifndef __LINUX_BRIDGE_NETFILTER_H +#define __LINUX_BRIDGE_NETFILTER_H + +/* bridge-specific defines for netfilter. + */ + +#include +#include + +/* Bridge Hooks */ +/* After promisc drops, checksum checks. */ +#define NF_BR_PRE_ROUTING 0 +/* If the packet is destined for this box. */ +#define NF_BR_LOCAL_IN 1 +/* If the packet is destined for another interface. */ +#define NF_BR_FORWARD 2 +/* Packets coming from a local process. */ +#define NF_BR_LOCAL_OUT 3 +/* Packets about to hit the wire. */ +#define NF_BR_POST_ROUTING 4 +#define NF_BR_NUMHOOKS 5 + + +#endif diff -u --recursive --new-file v2.4.5/linux/include/linux/netfilter_ipv4/ip_tables.h linux/include/linux/netfilter_ipv4/ip_tables.h --- v2.4.5/linux/include/linux/netfilter_ipv4/ip_tables.h Mon Dec 11 13:31:24 2000 +++ linux/include/linux/netfilter_ipv4/ip_tables.h Tue Jun 5 18:11:43 2001 @@ -300,14 +300,14 @@ ({ \ unsigned int __i; \ int __ret = 0; \ - struct ipt_entry_match *__m; \ + struct ipt_entry_match *__match; \ \ for (__i = sizeof(struct ipt_entry); \ __i < (e)->target_offset; \ - __i += __m->u.match_size) { \ - __m = (void *)(e) + __i; \ + __i += __match->u.match_size) { \ + __match = (void *)(e) + __i; \ \ - __ret = fn(__m , ## args); \ + __ret = fn(__match , ## args); \ if (__ret != 0) \ break; \ } \ @@ -319,12 +319,12 @@ ({ \ unsigned int __i; \ int __ret = 0; \ - struct ipt_entry *__e; \ + struct ipt_entry *__entry; \ \ - for (__i = 0; __i < (size); __i += __e->next_offset) { \ - __e = (void *)(entries) + __i; \ + for (__i = 0; __i < (size); __i += __entry->next_offset) { \ + __entry = (void *)(entries) + __i; \ \ - __ret = fn(__e , ## args); \ + __ret = fn(__entry , ## args); \ if (__ret != 0) \ break; \ } \ diff -u --recursive --new-file v2.4.5/linux/include/linux/parport_pc.h linux/include/linux/parport_pc.h --- v2.4.5/linux/include/linux/parport_pc.h Fri May 25 18:28:55 2001 +++ linux/include/linux/parport_pc.h Tue Jun 5 18:03:34 2001 @@ -224,5 +224,6 @@ unsigned long base_hi, int irq, int dma, struct pci_dev *dev); +extern void parport_pc_unregister_port (struct parport *p); #endif diff -u --recursive --new-file v2.4.5/linux/include/linux/slab.h linux/include/linux/slab.h --- v2.4.5/linux/include/linux/slab.h Fri Apr 27 15:48:37 2001 +++ linux/include/linux/slab.h Fri Jun 8 14:03:27 2001 @@ -22,7 +22,7 @@ #define SLAB_NFS GFP_NFS #define SLAB_DMA GFP_DMA -#define SLAB_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO) +#define SLAB_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_BUFFER) #define SLAB_NO_GROW 0x00001000UL /* don't grow a cache */ /* flags to pass to kmem_cache_create(). diff -u --recursive --new-file v2.4.5/linux/include/linux/socket.h linux/include/linux/socket.h --- v2.4.5/linux/include/linux/socket.h Fri Apr 27 15:48:20 2001 +++ linux/include/linux/socket.h Fri Jun 8 14:03:27 2001 @@ -156,6 +156,7 @@ #define AF_IRDA 23 /* IRDA sockets */ #define AF_PPPOX 24 /* PPPoX sockets */ #define AF_WANPIPE 25 /* Wanpipe API Sockets */ +#define AF_BLUETOOTH 31 /* Bluetooth sockets */ #define AF_MAX 32 /* For now.. */ /* Protocol families, same as address families. */ @@ -186,6 +187,7 @@ #define PF_IRDA AF_IRDA #define PF_PPPOX AF_PPPOX #define PF_WANPIPE AF_WANPIPE +#define PF_BLUETOOTH AF_BLUETOOTH #define PF_MAX AF_MAX /* Maximum queue length specifiable by listen. */ diff -u --recursive --new-file v2.4.5/linux/include/linux/swap.h linux/include/linux/swap.h --- v2.4.5/linux/include/linux/swap.h Fri May 25 18:28:55 2001 +++ linux/include/linux/swap.h Fri Jun 8 14:03:27 2001 @@ -133,6 +133,7 @@ extern void __delete_from_swap_cache(struct page *page); extern void delete_from_swap_cache(struct page *page); extern void delete_from_swap_cache_nolock(struct page *page); +extern void free_page_and_swap_cache(struct page *page); /* linux/mm/swapfile.c */ extern unsigned int nr_swapfiles; diff -u --recursive --new-file v2.4.5/linux/include/linux/udf_167.h linux/include/linux/udf_167.h --- v2.4.5/linux/include/linux/udf_167.h Mon Dec 11 13:27:05 2000 +++ linux/include/linux/udf_167.h Wed Jun 6 10:24:10 2001 @@ -31,7 +31,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public diff -u --recursive --new-file v2.4.5/linux/include/linux/udf_fs.h linux/include/linux/udf_fs.h --- v2.4.5/linux/include/linux/udf_fs.h Mon Jan 1 09:57:08 2001 +++ linux/include/linux/udf_fs.h Wed Jun 6 10:24:10 2001 @@ -16,7 +16,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -35,10 +35,20 @@ #define _LINUX_UDF_FS_H #define UDF_PREALLOCATE -#define UDF_DEFAULT_PREALLOC_BLOCKS 8 +#define UDF_DEFAULT_PREALLOC_BLOCKS 8 -#define UDFFS_DATE "2000/02/29" -#define UDFFS_VERSION "0.9.1" +#define UDFFS_DATE "2001/06/06" +#define UDFFS_VERSION "0.9.4" + +#if !defined(UDFFS_RW) + +#if defined(CONFIG_UDF_RW) +#define UDFFS_RW 1 +#else /* !defined(CONFIG_UDF_RW) */ +#define UDFFS_RW 0 +#endif /* defined(CONFIG_UDF_RW) */ + +#endif /* !defined(UDFFS_RW) */ #define UDFFS_DEBUG diff -u --recursive --new-file v2.4.5/linux/include/linux/udf_fs_i.h linux/include/linux/udf_fs_i.h --- v2.4.5/linux/include/linux/udf_fs_i.h Thu Mar 2 11:17:32 2000 +++ linux/include/linux/udf_fs_i.h Wed Jun 6 10:24:10 2001 @@ -6,7 +6,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -38,6 +38,7 @@ __u64 i_unique; __u32 i_lenEAttr; __u32 i_lenAlloc; + __u64 i_lenExtents; __u32 i_next_alloc_block; __u32 i_next_alloc_goal; unsigned i_alloc_type : 3; @@ -54,5 +55,6 @@ #define UDF_GETEASIZE _IOR('l', 0x40, int) #define UDF_GETEABLOCK _IOR('l', 0x41, void *) #define UDF_GETVOLIDENT _IOR('l', 0x42, void *) +#define UDF_RELOCATE_BLOCKS _IOWR('l', 0x43, long) #endif /* !defined(_LINUX_UDF_FS_I_H) */ diff -u --recursive --new-file v2.4.5/linux/include/linux/udf_fs_sb.h linux/include/linux/udf_fs_sb.h --- v2.4.5/linux/include/linux/udf_fs_sb.h Mon Mar 20 08:17:43 2000 +++ linux/include/linux/udf_fs_sb.h Fri Jun 8 14:03:20 2001 @@ -6,7 +6,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public @@ -18,6 +18,10 @@ #if !defined(_LINUX_UDF_FS_SB_H) #define _LINUX_UDF_FS_SB_H +#ifndef LINUX_VERSION_CODE +#include +#endif + #pragma pack(1) #define UDF_MAX_BLOCK_LOADED 8 @@ -29,16 +33,8 @@ struct udf_sparing_data { - __u32 s_spar_loc[4]; - __u8 s_spar_pshift; - __u8 s_spar_indexsize; - __u32 *s_spar_map; - union - { - __u8 *s_spar_remap8; - __u16 *s_spar_remap16; - __u32 *s_spar_remap32; - } s_spar_remap; + __u16 s_packet_len; + struct buffer_head *s_spar_map[4]; }; struct udf_virtual_data @@ -47,18 +43,26 @@ __u16 s_start_offset; }; +struct udf_bitmap +{ + __u32 s_extLength; + __u32 s_extPosition; + __u16 s_nr_groups; + struct buffer_head **s_block_bitmap; +}; + struct udf_part_map { union { - __u32 bitmap; - struct inode *table; - } s_uspace; + struct udf_bitmap *s_bitmap; + struct inode *s_table; + } s_uspace; union { - __u32 bitmap; - struct inode *table; - } s_fspace; + struct udf_bitmap *s_bitmap; + struct inode *s_table; + } s_fspace; __u32 s_partition_root; __u32 s_partition_len; __u16 s_partition_type; @@ -77,43 +81,42 @@ struct udf_sb_info { - struct udf_part_map *s_partmaps; - __u8 s_volident[32]; + struct udf_part_map *s_partmaps; + __u8 s_volident[32]; /* Overall info */ - __u16 s_partitions; - __u16 s_partition; + __u16 s_partitions; + __u16 s_partition; /* Sector headers */ - __u32 s_session; - __u32 s_anchor[4]; - __u32 s_lastblock; - - struct buffer_head *s_lvidbh; - - __u16 s_loaded_block_bitmaps; - __u32 s_block_bitmap_number[UDF_MAX_BLOCK_LOADED]; - struct buffer_head *s_block_bitmap[UDF_MAX_BLOCK_LOADED]; + __u32 s_session; + __u32 s_anchor[4]; + __u32 s_lastblock; + + struct buffer_head *s_lvidbh; /* Default permissions */ - mode_t s_umask; - gid_t s_gid; - uid_t s_uid; + mode_t s_umask; + gid_t s_gid; + uid_t s_uid; /* Root Info */ - time_t s_recordtime; + time_t s_recordtime; /* Fileset Info */ - __u16 s_serialnum; + __u16 s_serialnum; /* highest UDF revision we have recorded to this media */ - __u16 s_udfrev; + __u16 s_udfrev; /* Miscellaneous flags */ - __u32 s_flags; + __u32 s_flags; + + /* Encoding info */ + struct nls_table *s_nls_map; /* VAT inode */ - struct inode *s_vat; + struct inode *s_vat; }; #endif /* !defined(_LINUX_UDF_FS_SB_H) */ diff -u --recursive --new-file v2.4.5/linux/include/linux/udf_udf.h linux/include/linux/udf_udf.h --- v2.4.5/linux/include/linux/udf_udf.h Mon Dec 11 13:27:05 2000 +++ linux/include/linux/udf_udf.h Wed Jun 6 10:24:10 2001 @@ -10,7 +10,7 @@ * CONTACTS * E-mail regarding any portion of the Linux UDF file system should be * directed to the development team mailing list (run by majordomo): - * linux_udf@hootie.lvld.hp.com + * linux_udf@hpesjro.fc.hp.com * * COPYRIGHT * This file is distributed under the terms of the GNU General Public diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/bluetooth.h linux/include/net/bluetooth/bluetooth.h --- v2.4.5/linux/include/net/bluetooth/bluetooth.h Wed Dec 31 16:00:00 1969 +++ linux/include/net/bluetooth/bluetooth.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,82 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id: bluetooth.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#ifndef __IF_BLUETOOTH_H +#define __IF_BLUETOOTH_H + +#include +#include + +#define BTPROTO_L2CAP 0 +#define BTPROTO_HCI 1 + +#define SOL_HCI 0 +#define SOL_L2CAP 6 + +typedef struct { + __u8 b0, b1, b2, b3, b4, b5; +} bdaddr_t; + +#define BDADDR_ANY ((bdaddr_t *)"\000\000\000\000\000") + +/* Connection and socket states */ +enum { + BT_CONNECTED = 1, /* Equal to TCP_ESTABLISHED to make net code happy */ + BT_OPEN, + BT_BOUND, + BT_LISTEN, + BT_CONNECT, + BT_CONFIG, + BT_DISCONN, + BT_CLOSED +}; + +/* Copy, swap, convert BD Address */ +static __inline__ int bacmp(bdaddr_t *ba1, bdaddr_t *ba2) +{ + return memcmp(ba1, ba2, sizeof(bdaddr_t)); +} +static __inline__ void bacpy(bdaddr_t *dst, bdaddr_t *src) +{ + memcpy(dst, src, sizeof(bdaddr_t)); +} + +extern void baswap(bdaddr_t *dst, bdaddr_t *src); + +extern char *batostr(bdaddr_t *ba); +extern bdaddr_t *strtoba(char *str); + +/* Endianness conversions */ +#define htobs(a) __cpu_to_le16(a) +#define htobl(a) __cpu_to_le32(a) +#define btohs(a) __le16_to_cpu(a) +#define btohl(a) __le32_to_cpu(a) + +int bterr(__u16 code); + +#endif /* __IF_BLUETOOTH_H */ diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/bluez.h linux/include/net/bluetooth/bluez.h --- v2.4.5/linux/include/net/bluetooth/bluez.h Wed Dec 31 16:00:00 1969 +++ linux/include/net/bluetooth/bluez.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,176 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id: bluez.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#ifndef __IF_BLUEZ_H +#define __IF_BLUEZ_H + +#include + +#define BLUEZ_VER "1.0" + +#define BLUEZ_MAX_PROTO 2 + +/* Reserv for core and drivers use */ +#define BLUEZ_SKB_RESERVE 8 + +#ifndef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +/* Debugging */ +#ifdef BLUEZ_DEBUG + +#define HCI_CORE_DEBUG 1 +#define HCI_SOCK_DEBUG 1 +#define HCI_UART_DEBUG 1 +#define HCI_USB_DEBUG 1 +//#define HCI_DATA_DUMP 1 + +#define L2CAP_DEBUG 1 + +#endif /* BLUEZ_DEBUG */ + +extern void bluez_dump(char *pref, __u8 *buf, int count); + +#define INF(fmt, arg...) printk(KERN_INFO fmt "\n" , ## arg) +#define DBG(fmt, arg...) printk(KERN_INFO __FUNCTION__ ": " fmt "\n" , ## arg) +#define ERR(fmt, arg...) printk(KERN_ERR __FUNCTION__ ": " fmt "\n" , ## arg) + +#ifdef HCI_DATA_DUMP +#define DMP(buf, len) bluez_dump(__FUNCTION__, buf, len) +#else +#define DMP(D...) +#endif + +/* ----- Sockets ------ */ +struct bluez_sock_list { + struct sock *head; + rwlock_t lock; +}; + +extern int bluez_sock_register(int proto, struct net_proto_family *ops); +extern int bluez_sock_unregister(int proto); + +extern void bluez_sock_link(struct bluez_sock_list *l, struct sock *s); +extern void bluez_sock_unlink(struct bluez_sock_list *l, struct sock *s); + +/* ----- SKB helpers ----- */ +struct bluez_skb_cb { + int incomming, fragmented; + struct sk_buff_head frags; +}; +#define bluez_cb(skb) ((struct bluez_skb_cb *)(skb->cb)) + +static __inline__ struct sk_buff *bluez_skb_alloc(unsigned int len, int how) +{ + struct sk_buff *skb; + + if ((skb = alloc_skb(len + BLUEZ_SKB_RESERVE, how))) { + bluez_cb(skb)->incomming = 0; + bluez_cb(skb)->fragmented = 0; + skb_reserve(skb, BLUEZ_SKB_RESERVE); + } + return skb; +} + +static __inline__ struct sk_buff *bluez_skb_clone(struct sk_buff *skb, int how) +{ + struct sk_buff *new; + + if ((new = skb_clone(skb, how))) + bluez_cb(new)->fragmented = 0; + return new; +} + +static __inline__ struct sk_buff *bluez_skb_send_alloc(struct sock *sk, unsigned long len, + int nb, int *err) +{ + struct sk_buff *skb; + + if ((skb = sock_alloc_send_skb(sk, len + BLUEZ_SKB_RESERVE, nb, err))) { + bluez_cb(skb)->incomming = 0; + bluez_cb(skb)->fragmented = 0; + skb_reserve(skb, BLUEZ_SKB_RESERVE); + } + + return skb; +} + +static __inline__ int bluez_skb_frags(struct sk_buff *skb) +{ + if (bluez_cb(skb)->fragmented) + return skb_queue_len(&bluez_cb(skb)->frags); + return 0; +} + +static __inline__ void bluez_skb_add_frag(struct sk_buff *skb, struct sk_buff *frag) +{ + if (!bluez_cb(skb)->fragmented) { + skb_queue_head_init(&bluez_cb(skb)->frags); + bluez_cb(skb)->fragmented = 1; + } + __skb_queue_tail(&bluez_cb(skb)->frags, frag); +} + +static __inline__ struct sk_buff *bluez_skb_next_frag(struct sk_buff *skb) +{ + if (bluez_cb(skb)->fragmented) + return skb_peek(&bluez_cb(skb)->frags); + if (skb->next == (void *) skb->list) + return NULL; + return skb->next; +} + +static __inline__ struct sk_buff *bluez_skb_get_frag(struct sk_buff *skb) +{ + if (bluez_cb(skb)->fragmented) + return __skb_dequeue(&bluez_cb(skb)->frags); + return NULL; +} + +static __inline__ void bluez_skb_free(struct sk_buff *skb) +{ + if (bluez_cb(skb)->fragmented) + __skb_queue_purge(&bluez_cb(skb)->frags); + kfree_skb(skb); +} + +static __inline__ void bluez_skb_queue_purge(struct sk_buff_head *q) +{ + struct sk_buff *skb; + + while((skb = skb_dequeue(q))) + bluez_skb_free(skb); +} + +extern int hci_core_init(void); +extern int hci_core_cleanup(void); +extern int hci_sock_init(void); +extern int hci_sock_cleanup(void); + +#endif /* __IF_BLUEZ_H */ diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/hci.h linux/include/net/bluetooth/hci.h --- v2.4.5/linux/include/net/bluetooth/hci.h Wed Dec 31 16:00:00 1969 +++ linux/include/net/bluetooth/hci.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,370 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id: hci.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#ifndef __IF_HCI_H +#define __IF_HCI_H + +#include + +/* HCI Packet types */ +#define HCI_COMMAND_PKT 0x01 +#define HCI_ACLDATA_PKT 0x02 +#define HCI_SCODATA_PKT 0x03 +#define HCI_EVENT_PKT 0x04 +#define HCI_UNKNOWN_PKT 0xff + +/* ----- HCI Commands ----- */ +/* OGF & OCF values */ + +/* Informational Parameters */ +#define OGF_INFO_PARAM 0x04 +#define OCF_NOP 0x0000 + +#define OCF_READ_BUFFER_SIZE 0x0005 +typedef struct { + __u8 status; + __u16 acl_mtu; + __u8 sco_mtu; + __u16 acl_max_pkt; + __u16 sco_max_pkt; +} __attribute__ ((packed)) read_buffer_size_rp; + +#define OCF_READ_BD_ADDR 0x0009 +typedef struct { + __u8 status; + bdaddr_t bdaddr; +} __attribute__ ((packed)) read_bd_addr_rp; + +/* Host Controller and Baseband */ +#define OGF_HOST_CTL 0x03 +#define OCF_RESET 0x0003 +#define OCF_WRITE_AUTH_ENABLE 0x0020 + #define AUTH_DISABLED 0x00 + #define AUTH_ENABLED 0x01 + +#define OCF_WRITE_CA_TIMEOUT 0x0016 /* Write_Connection_Accept_Timeout */ +#define OCF_WRITE_PG_TIMEOUT 0x0018 /* Write_Page_Timeout */ + +#define OCF_WRITE_SCAN_ENABLE 0x001A + #define SCANS_DISABLED 0x00 + #define IS_ENA_PS_DIS 0x01 /* Inquiry scan enabled Page Scan disabled */ + #define IS_DIS_PS_ENA 0x02 /* Inquiry scan disabled Page Scan enabled */ + #define IS_ENA_PS_ENA 0x03 /* Inquiry scan enabled Page Scan enabled */ + +#define OCF_SET_EVENT_FLT 0x0005 +typedef struct { + __u8 flt_type; + __u8 cond_type; + __u8 condition; +} __attribute__ ((packed)) set_event_flt_cp; +#define SET_EVENT_FLT_CP_SIZE 3 + +/* Filter types */ +#define FLT_CLEAR_ALL 0x00 +#define FLT_INQ_RESULT 0x01 +#define FLT_CONN_SETUP 0x02 + +/* CONN_SETUP Condition types */ +#define CONN_SETUP_ALLOW_ALL 0x00 +#define CONN_SETUP_ALLOW_CLASS 0x01 +#define CONN_SETUP_ALLOW_BDADDR 0x02 + +/* CONN_SETUP Conditions */ +#define CONN_SETUP_AUTO_OFF 0x01 +#define CONN_SETUP_AUTO_ON 0x02 + +/* Link Control */ +#define OGF_LINK_CTL 0x01 +#define OCF_CREATE_CONN 0x0005 +typedef struct { + bdaddr_t bdaddr; + __u16 pkt_type; + __u8 pscan_rep_mode; + __u8 pscan_mode; + __u16 clock_offset; + __u8 role_switch; +} __attribute__ ((packed)) create_conn_cp; +#define CREATE_CONN_CP_SIZE 13 + +#define OCF_ACCEPT_CONN_REQ 0x0009 +typedef struct { + bdaddr_t bdaddr; + __u8 role; +} __attribute__ ((packed)) accept_conn_req_cp; +#define ACCEPT_CONN_REQ_CP_SIZE 7 + +#define OCF_DISCONNECT 0x0006 +typedef struct { + __u16 handle; + __u8 reason; +} __attribute__ ((packed)) disconnect_cp; +#define DISCONNECT_CP_SIZE 3 + +#define OCF_INQUIRY 0x0001 +typedef struct { + __u8 lap[3]; + __u8 lenght; + __u8 num_rsp; +} __attribute__ ((packed)) inquiry_cp; +#define INQUIRY_CP_SIZE 5 + +#define OGF_LINK_POLICY 0x02 /* Link Policy */ + +/* --------- HCI Events --------- */ +#define EVT_INQUIRY_COMPLETE 0x01 + +#define EVT_INQUIRY_RESULT 0x02 +typedef struct { + bdaddr_t bdaddr; + __u8 pscan_rep_mode; + __u8 pscan_period_mode; + __u8 pscan_mode; + __u8 class[3]; + __u16 clock_offset; +} __attribute__ ((packed)) inquiry_info; +#define INQUIRY_INFO_SIZE 14 + +#define EVT_CONN_COMPLETE 0x03 +typedef struct { + __u8 status; + __u16 handle; + bdaddr_t bdaddr; + __u8 link_type; + __u8 encr_mode; +} __attribute__ ((packed)) evt_conn_complete; +#define EVT_CONN_COMPLETE_SIZE 13 + +#define EVT_CONN_REQUEST 0x04 +typedef struct { + bdaddr_t bdaddr; +#if defined (__LITTLE_ENDIAN_BITFIELD) + __u32 class :24; + __u32 type :8; +#else /* (__BIG_ENDIAN_BITFIELD) */ + __u32 type :8; + __u32 class :24; +#endif +} __attribute__ ((packed)) evt_conn_request; +#define EVT_CONN_REQUEST_SIZE 10 + +#define EVT_DISCONN_COMPLETE 0x05 +typedef struct { + __u8 status; + __u16 handle; + __u8 reason; +} __attribute__ ((packed)) evt_disconn_complete; +#define EVT_DISCONN_COMPLETE_SIZE 4 + +#define EVT_CMD_COMPLETE 0x0e +typedef struct { + __u8 ncmd; + __u16 opcode; +} __attribute__ ((packed)) evt_cmd_complete; +#define EVT_CMD_COMPLETE_SIZE 3 + +#define EVT_CMD_STATUS 0x0f +typedef struct { + __u8 status; + __u8 ncmd; + __u16 opcode; +} __attribute__ ((packed)) evt_cmd_status; +#define EVT_CMD_STATUS_SIZE 4 + +#define EVT_NUM_COMP_PKTS 0x13 +typedef struct { + __u8 num_hndl; + /* variable lenght part */ +} __attribute__ ((packed)) evt_num_comp_pkts; +#define EVT_NUM_COMP_PKTS_SIZE 1 + +#define EVT_HCI_DEV_EVENT 0xfd +typedef struct { + __u16 event; + __u16 param; +} __attribute__ ((packed)) evt_hci_dev_event; +#define EVT_HCI_DEV_EVENT_SIZE 4 + +/* -------- HCI Packet structures -------- */ +#define HCI_TYPE_LEN 1 + +typedef struct { + __u16 opcode; /* OCF & OGF */ + __u8 plen; +} __attribute__ ((packed)) hci_command_hdr; +#define HCI_COMMAND_HDR_SIZE 3 + +typedef struct { + __u8 evt; + __u8 plen; +} __attribute__ ((packed)) hci_event_hdr; +#define HCI_EVENT_HDR_SIZE 2 + +typedef struct { + __u16 handle; /* Handle & Flags(PB, BC) */ + __u16 dlen; +} __attribute__ ((packed)) hci_acl_hdr; +#define HCI_ACL_HDR_SIZE 4 + +typedef struct { + __u16 handle; + __u8 dlen; +} __attribute__ ((packed)) hci_sco_hdr; +#define HCI_SCO_HDR_SIZE 3 + +/* Command opcode pack/unpack */ +#define cmd_opcode_pack(ocf, ogf) (__u16)((ocf & 0x03ff)|(ogf << 10)) +#define cmd_opcode_ogf(op) (op >> 10) +#define cmd_opcode_ocf(op) (op & 0x03ff) + +/* ACL handle and flags pack/unpack */ +#define acl_handle_pack(h, f) (__u16)((h & 0x0fff)|(f << 12)) +#define acl_handle(h) (h & 0x0fff) +#define acl_flags(h) (h >> 12) + +/* ACL flags */ +#define ACL_CONT 0x0001 +#define ACL_START 0x0002 +#define ACL_ACTIVE_BCAST 0x0010 +#define ACL_PICO_BCAST 0x0020 + +/* Max frame size */ +#define HCI_MAX_FRAME 4096 + +/* HCI device types */ +#define HCI_UART 0 +#define HCI_USB 1 +#define HCI_EMU 2 + +/* HCI device modes */ +#define HCI_NORMAL 0x0001 +#define HCI_RAW 0x0002 +#define HCI_MODE_MASK (HCI_NORMAL | HCI_RAW) +#define HCI_SOCK 0x1000 + +/* HCI device states */ +#define HCI_INIT 0x0010 +#define HCI_UP 0x0020 +#define HCI_RUNNING 0x0040 + +/* HCI device flags */ +#define HCI_PSCAN 0x0100 +#define HCI_ISCAN 0x0200 +#define HCI_AUTH 0x0400 + +/* HCI Packet types */ +#define HCI_DM1 0x0008 +#define HCI_DM3 0x0400 +#define HCI_DM5 0x4000 +#define HCI_DH1 0x0010 +#define HCI_DH3 0x0800 +#define HCI_DH5 0x8000 + +/* HCI Ioctl defines */ +#define HCIDEVUP _IOW('H', 201, int) +#define HCIDEVDOWN _IOW('H', 202, int) +#define HCIDEVRESET _IOW('H', 203, int) +#define HCIRESETSTAT _IOW('H', 204, int) +#define HCIGETINFO _IOR('H', 205, int) +#define HCIGETDEVLIST _IOR('H', 206, int) +#define HCISETRAW _IOW('H', 207, int) +#define HCISETSCAN _IOW('H', 208, int) +#define HCISETAUTH _IOW('H', 209, int) +#define HCIINQUIRY _IOWR('H', 210, int) + +/* HCI Socket options */ +#define HCI_DATA_DIR 0x0001 +#define HCI_FILTER 0x0002 + +/* HCI CMSG types */ +#define HCI_CMSG_DIR 0x0001 + +struct sockaddr_hci { + sa_family_t hci_family; + unsigned short hci_dev; +}; +#define HCI_DEV_NONE 0xffff + +struct hci_dev_req { + __u16 dev_id; + __u32 dev_opt; +}; + +struct hci_dev_list_req { + __u16 dev_num; + struct hci_dev_req dev_req[0]; /* hci_dev_req structures */ +}; + +struct hci_inquiry_req { + __u16 dev_id; + __u16 flags; + __u8 lap[3]; + __u8 length; + __u8 num_rsp; +}; +#define IREQ_CACHE_FLUSH 0x0001 + +struct hci_dev_stats { + __u32 err_rx; + __u32 err_tx; + __u32 cmd_tx; + __u32 evt_rx; + __u32 acl_tx; + __u32 acl_rx; + __u32 sco_tx; + __u32 sco_rx; + __u32 byte_rx; + __u32 byte_tx; +}; + +struct hci_dev_info { + __u16 dev_id; + char name[8]; + + __u32 flags; + __u8 type; + + __u16 acl_mtu; + __u16 acl_max; + __u16 sco_mtu; + __u16 sco_max; + + bdaddr_t bdaddr; + + struct hci_dev_stats stat; +}; + +/* Number of devices */ +#define HCI_MAX_DEV 8 + +/* HCI dev events */ +#define HCI_DEV_REG 1 +#define HCI_DEV_UNREG 2 +#define HCI_DEV_UP 3 +#define HCI_DEV_DOWN 4 + +#endif /* __IF_HCI_H */ diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/hci_core.h linux/include/net/bluetooth/hci_core.h --- v2.4.5/linux/include/net/bluetooth/hci_core.h Wed Dec 31 16:00:00 1969 +++ linux/include/net/bluetooth/hci_core.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,343 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id: hci_core.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#ifndef __IF_HCI_CORE_H +#define __IF_HCI_CORE_H + +#include "hci.h" + +/* HCI upper protocols */ +#define HCI_MAX_PROTO 1 +#define HCI_PROTO_L2CAP 0 + +#define HCI_INIT_TIMEOUT (HZ * 10) + +/* ----- Inquiry cache ----- */ +#define INQUIRY_CACHE_AGE_MAX (HZ*5) // 5 seconds +#define INQUIRY_ENTRY_AGE_MAX (HZ*60) // 60 seconds + +struct inquiry_entry { + struct inquiry_entry *next; + __u32 timestamp; + inquiry_info info; +}; + +struct inquiry_cache { + spinlock_t lock; + __u32 timestamp; + struct inquiry_entry *list; +}; + +static __inline__ void inquiry_cache_init(struct inquiry_cache *cache) +{ + spin_lock_init(&cache->lock); + cache->list = NULL; +} + +static __inline__ void inquiry_cache_lock(struct inquiry_cache *cache) +{ + spin_lock(&cache->lock); +} + +static __inline__ void inquiry_cache_unlock(struct inquiry_cache *cache) +{ + spin_unlock(&cache->lock); +} + +static __inline__ void inquiry_cache_lock_bh(struct inquiry_cache *cache) +{ + spin_lock_bh(&cache->lock); +} + +static __inline__ void inquiry_cache_unlock_bh(struct inquiry_cache *cache) +{ + spin_unlock_bh(&cache->lock); +} + +static __inline__ long inquiry_cache_age(struct inquiry_cache *cache) +{ + return jiffies - cache->timestamp; +} + +static __inline__ long inquiry_entry_age(struct inquiry_entry *e) +{ + return jiffies - e->timestamp; +} +extern void inquiry_cache_flush(struct inquiry_cache *cache); + +/* ----- Connection hash ----- */ +#define HCI_MAX_CONN 10 + +/* FIXME: + * We assume that handle is a number - 0 ... HCI_MAX_CONN. + */ +struct conn_hash { + spinlock_t lock; + unsigned int num; + void *conn[HCI_MAX_CONN]; +}; + +static __inline__ void conn_hash_init(struct conn_hash *h) +{ + memset(h, 0, sizeof(struct conn_hash)); + spin_lock_init(&h->lock); +} + +static __inline__ void conn_hash_lock(struct conn_hash *h) +{ + spin_lock(&h->lock); +} + +static __inline__ void conn_hash_unlock(struct conn_hash *h) +{ + spin_unlock(&h->lock); +} + +static __inline__ void *__conn_hash_add(struct conn_hash *h, __u16 handle, void *conn) +{ + if (!h->conn[handle]) { + h->conn[handle] = conn; + h->num++; + return conn; + } else + return NULL; +} + +static __inline__ void *conn_hash_add(struct conn_hash *h, __u16 handle, void *conn) +{ + if (handle >= HCI_MAX_CONN) + return NULL; + + conn_hash_lock(h); + conn = __conn_hash_add(h, handle, conn); + conn_hash_unlock(h); + + return conn; +} + +static __inline__ void *__conn_hash_del(struct conn_hash *h, __u16 handle) +{ + void *conn = h->conn[handle]; + + if (conn) { + h->conn[handle] = NULL; + h->num--; + return conn; + } else + return NULL; +} + +static __inline__ void *conn_hash_del(struct conn_hash *h, __u16 handle) +{ + void *conn; + + if (handle >= HCI_MAX_CONN) + return NULL; + conn_hash_lock(h); + conn = __conn_hash_del(h, handle); + conn_hash_unlock(h); + + return conn; +} + +static __inline__ void *__conn_hash_lookup(struct conn_hash *h, __u16 handle) +{ + return h->conn[handle]; +} + +static __inline__ void *conn_hash_lookup(struct conn_hash *h, __u16 handle) +{ + void *conn; + + if (handle >= HCI_MAX_CONN) + return NULL; + + conn_hash_lock(h); + conn = __conn_hash_lookup(h, handle); + conn_hash_unlock(h); + + return conn; +} + +struct hci_dev; + +/* ----- HCI Connections ----- */ +struct hci_conn { + bdaddr_t dst; + __u16 handle; + + unsigned int acl_sent; + unsigned int sco_sent; + + struct hci_dev *hdev; + void *l2cap_data; + void *priv; + + struct sk_buff_head acl_q; + struct sk_buff_head sco_q; +}; + +/* ----- HCI Devices ----- */ +struct hci_dev { + atomic_t refcnt; + + char name[8]; + __u32 flags; + __u16 id; + __u8 type; + bdaddr_t bdaddr; + + atomic_t cmd_cnt; + unsigned int acl_cnt; + unsigned int sco_cnt; + + unsigned int acl_mtu; + unsigned int sco_mtu; + unsigned int acl_max; + unsigned int sco_max; + + void *driver_data; + void *l2cap_data; + void *priv; + + struct tasklet_struct cmd_task; + struct tasklet_struct rx_task; + struct tasklet_struct tx_task; + + struct sk_buff_head rx_q; + struct sk_buff_head raw_q; + struct sk_buff_head cmd_q; + struct sk_buff *cmd_sent; + + struct semaphore req_lock; + wait_queue_head_t req_wait_q; + __u32 req_status; + __u32 req_result; + + struct inquiry_cache inq_cache; + + struct conn_hash conn_hash; + + struct hci_dev_stats stat; + + int (*open)(struct hci_dev *hdev); + int (*close)(struct hci_dev *hdev); + int (*flush)(struct hci_dev *hdev); + int (*send)(struct sk_buff *skb); +}; + +static __inline__ void hci_dev_hold(struct hci_dev *hdev) +{ + atomic_inc(&hdev->refcnt); +} + +static __inline__ void hci_dev_put(struct hci_dev *hdev) +{ + atomic_dec(&hdev->refcnt); +} + +extern struct hci_dev *hci_dev_get(int index); + +#define SENT_CMD_PARAM(X) (((X->cmd_sent->data) + HCI_COMMAND_HDR_SIZE)) + +extern int hci_register_dev(struct hci_dev *hdev); +extern int hci_unregister_dev(struct hci_dev *hdev); +extern int hci_dev_open(__u16 dev); +extern int hci_dev_close(__u16 dev); +extern int hci_dev_reset(__u16 dev); +extern int hci_dev_reset_stat(__u16 dev); +extern int hci_dev_info(unsigned long arg); +extern int hci_dev_list(unsigned long arg); +extern int hci_dev_setscan(unsigned long arg); +extern int hci_dev_setauth(unsigned long arg); +extern int hci_inquiry(unsigned long arg); + +extern __u32 hci_dev_setmode(struct hci_dev *hdev, __u32 mode); +extern __u32 hci_dev_getmode(struct hci_dev *hdev); + +extern int hci_recv_frame(struct sk_buff *skb); + +/* ----- HCI tasks ----- */ +static __inline__ void hci_sched_cmd(struct hci_dev *hdev) +{ + tasklet_schedule(&hdev->cmd_task); +} + +static __inline__ void hci_sched_rx(struct hci_dev *hdev) +{ + tasklet_schedule(&hdev->rx_task); +} + +static __inline__ void hci_sched_tx(struct hci_dev *hdev) +{ + tasklet_schedule(&hdev->tx_task); +} + +/* ----- HCI protocols ----- */ +struct hci_proto { + char *name; + __u32 id; + __u32 flags; + + void *priv; + + int (*connect_ind) (struct hci_dev *hdev, bdaddr_t *bdaddr); + int (*connect_cfm) (struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 status, struct hci_conn *conn); + int (*disconn_ind) (struct hci_conn *conn, __u8 reason); + int (*recv_acldata) (struct hci_conn *conn, struct sk_buff *skb , __u16 flags); + int (*recv_scodata) (struct hci_conn *conn, struct sk_buff *skb); +}; + +extern int hci_register_proto(struct hci_proto *hproto); +extern int hci_unregister_proto(struct hci_proto *hproto); +extern int hci_register_notifier(struct notifier_block *nb); +extern int hci_unregister_notifier(struct notifier_block *nb); +extern int hci_connect(struct hci_dev * hdev, bdaddr_t * bdaddr); +extern int hci_disconnect(struct hci_conn *conn, __u8 reason); +extern int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void * param); +extern int hci_send_raw(struct sk_buff *skb); +extern int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags); +extern int hci_send_sco(struct hci_conn *conn, struct sk_buff *skb); + +/* ----- HCI Sockets ----- */ +extern void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb); + +/* HCI info for socket */ +#define hci_pi(sk) ((struct hci_pinfo *) &sk->protinfo) +struct hci_pinfo { + struct hci_dev *hdev; + __u32 cmsg_flags; + __u32 mask; +}; + +/* ----- HCI requests ----- */ +#define HCI_REQ_DONE 0 +#define HCI_REQ_PEND 1 +#define HCI_REQ_CANCELED 2 + +#endif /* __IF_HCI_CORE_H */ diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/hci_emu.h linux/include/net/bluetooth/hci_emu.h --- v2.4.5/linux/include/net/bluetooth/hci_emu.h Wed Dec 31 16:00:00 1969 +++ linux/include/net/bluetooth/hci_emu.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,52 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id: hci_emu.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#ifndef __IF_HCI_EMU_H +#define __IF_HCI_EMU_H + +#ifdef __KERNEL__ + +struct hci_emu_struct { + struct hci_dev hdev; + __u32 flags; + wait_queue_head_t read_wait; + struct sk_buff_head readq; + struct fasync_struct *fasync; +}; + +#endif /* __KERNEL__ */ + +#define HCI_EMU_MINOR 250 + +/* Max frame size */ +#define HCI_EMU_MAX_FRAME 4096 + +/* HCI_EMU device flags */ +#define HCI_EMU_FASYNC 0x0010 + +#endif /* __IF_HCI_EMU_H */ diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/hci_uart.h linux/include/net/bluetooth/hci_uart.h --- v2.4.5/linux/include/net/bluetooth/hci_uart.h Wed Dec 31 16:00:00 1969 +++ linux/include/net/bluetooth/hci_uart.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,60 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id: hci_uart.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#define HCI_MAX_READ 2048 + +#ifdef __KERNEL__ + +#define tty2n_hci(tty) ((struct n_hci *)((tty)->disc_data)) +#define n_hci2tty(n_hci) ((n_hci)->tty) + +struct n_hci { + struct tty_struct *tty; + struct hci_dev hdev; + + struct sk_buff_head txq; + unsigned long tx_state; + + spinlock_t rx_lock; + unsigned long rx_state; + unsigned long rx_count; + struct sk_buff *rx_skb; +}; + +/* Transmit states */ +#define TRANS_SENDING 1 +#define TRANS_WAKEUP 2 + +/* Receiver States */ +#define WAIT_PACKET_TYPE 0 +#define WAIT_EVENT_HDR 1 +#define WAIT_ACL_HDR 2 +#define WAIT_SCO_HDR 3 +#define WAIT_DATA 4 + +#endif /* __KERNEL__ */ diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/hci_usb.h linux/include/net/bluetooth/hci_usb.h --- v2.4.5/linux/include/net/bluetooth/hci_usb.h Wed Dec 31 16:00:00 1969 +++ linux/include/net/bluetooth/hci_usb.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,70 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id: hci_usb.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#ifdef __KERNEL__ + +#define HCI_USB_MAX_READ 2048 + +/* Class, SubClass, and Protocol codes that describe a Bluetooth device */ +#define HCI_DEV_CLASS 0xe0 /* Wireless class */ +#define HCI_DEV_SUBCLASS 0x01 /* RF subclass */ +#define HCI_DEV_PROTOCOL 0x01 /* Bluetooth programming protocol */ + +#define HCI_CTRL_REQ 0x20 + +struct hci_usb { + struct usb_device *udev; + + devrequest dev_req; + struct urb *ctrl_urb; + struct urb *intr_urb; + struct urb *read_urb; + struct urb *write_urb; + + __u8 *read_buf; + __u8 *intr_buf; + struct sk_buff *intr_skb; + int intr_count; + + __u8 bulk_out_ep_addr; + __u8 bulk_in_ep_addr; + __u8 intr_in_ep_addr; + __u8 intr_in_interval; + + struct hci_dev hdev; + + unsigned long tx_state; + struct sk_buff_head tx_ctrl_q; + struct sk_buff_head tx_write_q; +}; + +/* Transmit states */ +#define HCI_TX_CTRL 1 +#define HCI_TX_WRITE 2 + +#endif /* __KERNEL__ */ diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/l2cap.h linux/include/net/bluetooth/l2cap.h --- v2.4.5/linux/include/net/bluetooth/l2cap.h Wed Dec 31 16:00:00 1969 +++ linux/include/net/bluetooth/l2cap.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,155 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id: l2cap.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#ifndef __L2CAP_H +#define __L2CAP_H + +#include +#include + +/* L2CAP socket address */ +struct sockaddr_l2 { + sa_family_t l2_family; + unsigned short l2_psm; + bdaddr_t l2_bdaddr; +}; + +/* set/get sockopt defines */ +#define L2CAP_OPTIONS 0x01 +struct l2cap_options { + __u16 omtu; + __u16 imtu; + __u16 flush_to; + __u32 token_rate; + __u32 bucket_size; + __u32 pick_band; + __u32 latency; + __u32 delay_var; +}; + +/* L2CAP defaults */ +#define L2CAP_DEFAULT_MTU 672 +#define L2CAP_DEFAULT_FLUSH_TO 0xFFFF + +#define L2CAP_CONN_TIMEOUT (HZ * 40) + +/* L2CAP command codes */ +#define L2CAP_COMMAND_REJ 0x01 +#define L2CAP_CONN_REQ 0x02 +#define L2CAP_CONN_RSP 0x03 +#define L2CAP_CONF_REQ 0x04 +#define L2CAP_CONF_RSP 0x05 +#define L2CAP_DISCONN_REQ 0x06 +#define L2CAP_DISCONN_RSP 0x07 +#define L2CAP_ECHO_REQ 0x08 +#define L2CAP_ECHO_RSP 0x09 +#define L2CAP_INFO_REQ 0x0a +#define L2CAP_INFO_RSP 0x0b + +/* L2CAP structures */ + +typedef struct { + __u16 len; + __u16 cid; +} __attribute__ ((packed)) l2cap_hdr; +#define L2CAP_HDR_SIZE 4 + +typedef struct { + __u8 code; + __u8 ident; + __u16 len; +} __attribute__ ((packed)) l2cap_cmd_hdr; +#define L2CAP_CMD_HDR_SIZE 4 + +typedef struct { + __u16 reason; +} __attribute__ ((packed)) l2cap_cmd_rej; +#define L2CAP_CMD_REJ_SIZE 2 + +typedef struct { + __u16 psm; + __u16 scid; +} __attribute__ ((packed)) l2cap_conn_req; +#define L2CAP_CONN_REQ_SIZE 4 + +typedef struct { + __u16 dcid; + __u16 scid; + __u16 result; + __u16 status; +} __attribute__ ((packed)) l2cap_conn_rsp; +#define L2CAP_CONN_RSP_SIZE 8 + +#define L2CAP_CONN_SUCCESS 0x0000 +#define L2CAP_CONN_PEND 0x0001 +#define L2CAP_CONN_BAD_PSM 0x0002 +#define L2CAP_CONN_SEC_BLOCK 0x0003 +#define L2CAP_CONN_NO_MEM 0x0004 + +typedef struct { + __u16 dcid; + __u16 flags; + __u8 data[0]; +} __attribute__ ((packed)) l2cap_conf_req; +#define L2CAP_CONF_REQ_SIZE 4 + +typedef struct { + __u16 scid; + __u16 flags; + __u16 result; + __u8 data[0]; +} __attribute__ ((packed)) l2cap_conf_rsp; +#define L2CAP_CONF_RSP_SIZE 6 + +#define L2CAP_CONF_SUCCESS 0x00 +#define L2CAP_CONF_UNACCEPT 0x01 + +typedef struct { + __u8 type; + __u8 len; + __u8 val[0]; +} __attribute__ ((packed)) l2cap_conf_opt; +#define L2CAP_CONF_OPT_SIZE 2 + +#define L2CAP_CONF_MTU 0x01 +#define L2CAP_CONF_FLUSH_TO 0x02 +#define L2CAP_CONF_QOS 0x03 + +typedef struct { + __u16 dcid; + __u16 scid; +} __attribute__ ((packed)) l2cap_disconn_req; +#define L2CAP_DISCONN_REQ_SIZE 4 + +typedef struct { + __u16 dcid; + __u16 scid; +} __attribute__ ((packed)) l2cap_disconn_rsp; +#define L2CAP_DISCONN_RSP_SIZE 4 + +#endif /* __L2CAP_H */ diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/l2cap_core.h linux/include/net/bluetooth/l2cap_core.h --- v2.4.5/linux/include/net/bluetooth/l2cap_core.h Wed Dec 31 16:00:00 1969 +++ linux/include/net/bluetooth/l2cap_core.h Tue Jun 5 18:11:42 2001 @@ -0,0 +1,142 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id: l2cap_core.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#ifndef __L2CAP_CORE_H +#define __L2CAP_CORE_H + +#ifdef __KERNEL__ + +/* ----- L2CAP interface ----- */ +struct l2cap_iff { + struct list_head list; + struct hci_dev *hdev; + bdaddr_t *bdaddr; + __u16 mtu; + spinlock_t lock; + struct list_head conn_list; +}; + +static __inline__ void l2cap_iff_lock(struct l2cap_iff *iff) +{ + spin_lock(&iff->lock); +} + +static __inline__ void l2cap_iff_unlock(struct l2cap_iff *iff) +{ + spin_unlock(&iff->lock); +} + +/* ----- L2CAP connections ----- */ +struct l2cap_chan_list { + struct sock *head; + rwlock_t lock; + long num; +}; + +struct l2cap_conn { + struct l2cap_iff *iff; + struct list_head list; + + struct hci_conn *hconn; + + __u16 state; + __u8 out; + bdaddr_t src; + bdaddr_t dst; + + spinlock_t lock; + atomic_t refcnt; + + struct sk_buff *rx_skb; + __u32 rx_len; + __u8 rx_ident; + __u8 tx_ident; + + struct l2cap_chan_list chan_list; +}; + +static __inline__ void __l2cap_conn_link(struct l2cap_iff *iff, struct l2cap_conn *c) +{ + list_add(&c->list, &iff->conn_list); +} + +static __inline__ void __l2cap_conn_unlink(struct l2cap_iff *iff, struct l2cap_conn *c) +{ + list_del(&c->list); +} + +/* ----- L2CAP channel and socket info ----- */ +#define l2cap_pi(sk) ((struct l2cap_pinfo *) &sk->protinfo) + +struct l2cap_accept_q { + struct sock *head; + struct sock *tail; +}; + +struct l2cap_pinfo { + bdaddr_t src; + bdaddr_t dst; + __u16 psm; + __u16 dcid; + __u16 scid; + __u32 flags; + + __u16 imtu; + __u16 omtu; + __u16 flush_to; + + __u8 conf_state; + __u16 conf_mtu; + + __u8 ident; + + struct l2cap_conn *conn; + struct sock *next_c; + struct sock *prev_c; + + struct sock *parent; + struct sock *next_q; + struct sock *prev_q; + + struct l2cap_accept_q accept_q; +}; + +#define CONF_INPUT 0x01 +#define CONF_OUTPUT 0x02 +#define CONF_DONE (CONF_INPUT | CONF_OUTPUT) + +extern struct bluez_sock_list l2cap_sk_list; +extern struct list_head l2cap_iff_list; +extern rwlock_t l2cap_rt_lock; + +extern void l2cap_register_proc(void); +extern void l2cap_unregister_proc(void); + +#endif /* __KERNEL__ */ + +#endif /* __L2CAP_CORE_H */ diff -u --recursive --new-file v2.4.5/linux/kernel/ksyms.c linux/kernel/ksyms.c --- v2.4.5/linux/kernel/ksyms.c Fri May 25 18:28:55 2001 +++ linux/kernel/ksyms.c Tue Jun 5 16:55:22 2001 @@ -90,17 +90,13 @@ EXPORT_SYMBOL(exit_sighand); /* internal kernel memory management */ +EXPORT_SYMBOL(_alloc_pages); EXPORT_SYMBOL(__alloc_pages); EXPORT_SYMBOL(alloc_pages_node); EXPORT_SYMBOL(__get_free_pages); EXPORT_SYMBOL(get_zeroed_page); EXPORT_SYMBOL(__free_pages); EXPORT_SYMBOL(free_pages); -#ifndef CONFIG_DISCONTIGMEM -EXPORT_SYMBOL(contig_page_data); -#else -EXPORT_SYMBOL(alloc_pages); -#endif EXPORT_SYMBOL(num_physpages); EXPORT_SYMBOL(kmem_find_general_cachep); EXPORT_SYMBOL(kmem_cache_create); @@ -144,6 +140,7 @@ EXPORT_SYMBOL(force_delete); EXPORT_SYMBOL(follow_up); EXPORT_SYMBOL(follow_down); +EXPORT_SYMBOL(lookup_mnt); EXPORT_SYMBOL(path_init); EXPORT_SYMBOL(path_walk); EXPORT_SYMBOL(path_release); @@ -539,6 +536,9 @@ EXPORT_SYMBOL(tasklet_init); EXPORT_SYMBOL(tasklet_kill); EXPORT_SYMBOL(__run_task_queue); +EXPORT_SYMBOL(do_softirq); +EXPORT_SYMBOL(tasklet_schedule); +EXPORT_SYMBOL(tasklet_hi_schedule); /* init task, for moving kthread roots - ought to export a function ?? */ diff -u --recursive --new-file v2.4.5/linux/kernel/sched.c linux/kernel/sched.c --- v2.4.5/linux/kernel/sched.c Fri Apr 20 18:26:16 2001 +++ linux/kernel/sched.c Mon Jun 4 15:57:49 2001 @@ -544,7 +544,7 @@ release_kernel_lock(prev, this_cpu); /* Do "administrative" work here while we don't hold any locks */ - if (softirq_active(this_cpu) & softirq_mask(this_cpu)) + if (softirq_pending(this_cpu)) goto handle_softirq; handle_softirq_back: diff -u --recursive --new-file v2.4.5/linux/kernel/softirq.c linux/kernel/softirq.c --- v2.4.5/linux/kernel/softirq.c Fri Dec 29 14:07:24 2000 +++ linux/kernel/softirq.c Wed Jun 6 10:03:11 2001 @@ -50,70 +50,50 @@ asmlinkage void do_softirq() { int cpu = smp_processor_id(); - __u32 active, mask; + __u32 pending; if (in_interrupt()) return; - local_bh_disable(); - local_irq_disable(); - mask = softirq_mask(cpu); - active = softirq_active(cpu) & mask; - if (active) { + pending = softirq_pending(cpu); + + if (pending) { struct softirq_action *h; + local_bh_disable(); restart: - /* Reset active bitmask before enabling irqs */ - softirq_active(cpu) &= ~active; + /* Reset the pending bitmask before enabling irqs */ + softirq_pending(cpu) = 0; local_irq_enable(); h = softirq_vec; - mask &= ~active; do { - if (active & 1) + if (pending & 1) h->action(h); h++; - active >>= 1; - } while (active); + pending >>= 1; + } while (pending); local_irq_disable(); - active = softirq_active(cpu); - if ((active &= mask) != 0) - goto retry; + pending = softirq_pending(cpu); + if (pending) + goto restart; + __local_bh_enable(); } - local_bh_enable(); - - /* Leave with locally disabled hard irqs. It is critical to close - * window for infinite recursion, while we help local bh count, - * it protected us. Now we are defenceless. - */ - return; - -retry: - goto restart; + local_irq_enable(); } -static spinlock_t softirq_mask_lock = SPIN_LOCK_UNLOCKED; - void open_softirq(int nr, void (*action)(struct softirq_action*), void *data) { - unsigned long flags; - int i; - - spin_lock_irqsave(&softirq_mask_lock, flags); softirq_vec[nr].data = data; softirq_vec[nr].action = action; - - for (i=0; istate) && + tasklet_trylock(t)) { + t->next = tasklet_vec[cpu].list; + tasklet_vec[cpu].list = t; + __cpu_raise_softirq(cpu, TASKLET_SOFTIRQ); + tasklet_unlock(t); + } + local_irq_restore(flags); +} + +void tasklet_hi_schedule(struct tasklet_struct *t) +{ + unsigned long flags; + int cpu; + + cpu = smp_processor_id(); + local_irq_save(flags); + + if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state) && + tasklet_trylock(t)) { + t->next = tasklet_hi_vec[cpu].list; + tasklet_hi_vec[cpu].list = t; + __cpu_raise_softirq(cpu, HI_SOFTIRQ); + tasklet_unlock(t); + } + local_irq_restore(flags); +} + static void tasklet_action(struct softirq_action *a) { int cpu = smp_processor_id(); @@ -129,37 +148,37 @@ local_irq_disable(); list = tasklet_vec[cpu].list; tasklet_vec[cpu].list = NULL; - local_irq_enable(); - while (list != NULL) { + while (list) { struct tasklet_struct *t = list; list = list->next; - if (tasklet_trylock(t)) { - if (atomic_read(&t->count) == 0) { - clear_bit(TASKLET_STATE_SCHED, &t->state); - - t->func(t->data); - /* - * talklet_trylock() uses test_and_set_bit that imply - * an mb when it returns zero, thus we need the explicit - * mb only here: while closing the critical section. - */ -#ifdef CONFIG_SMP - smp_mb__before_clear_bit(); -#endif - tasklet_unlock(t); - continue; - } - tasklet_unlock(t); + /* + * A tasklet is only added to the queue while it's + * locked, so no other CPU can have this tasklet + * pending: + */ + if (!tasklet_trylock(t)) + BUG(); +repeat: + if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) + BUG(); + if (!atomic_read(&t->count)) { + local_irq_enable(); + t->func(t->data); + local_irq_disable(); + /* + * One more run if the tasklet got reactivated: + */ + if (test_bit(TASKLET_STATE_SCHED, &t->state)) + goto repeat; } - local_irq_disable(); - t->next = tasklet_vec[cpu].list; - tasklet_vec[cpu].list = t; - __cpu_raise_softirq(cpu, TASKLET_SOFTIRQ); - local_irq_enable(); + tasklet_unlock(t); + if (test_bit(TASKLET_STATE_SCHED, &t->state)) + tasklet_schedule(t); } + local_irq_enable(); } @@ -174,39 +193,40 @@ local_irq_disable(); list = tasklet_hi_vec[cpu].list; tasklet_hi_vec[cpu].list = NULL; - local_irq_enable(); - while (list != NULL) { + while (list) { struct tasklet_struct *t = list; list = list->next; - if (tasklet_trylock(t)) { - if (atomic_read(&t->count) == 0) { - clear_bit(TASKLET_STATE_SCHED, &t->state); - - t->func(t->data); - tasklet_unlock(t); - continue; - } - tasklet_unlock(t); + if (!tasklet_trylock(t)) + BUG(); +repeat: + if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) + BUG(); + if (!atomic_read(&t->count)) { + local_irq_enable(); + t->func(t->data); + local_irq_disable(); + if (test_bit(TASKLET_STATE_SCHED, &t->state)) + goto repeat; } - local_irq_disable(); - t->next = tasklet_hi_vec[cpu].list; - tasklet_hi_vec[cpu].list = t; - __cpu_raise_softirq(cpu, HI_SOFTIRQ); - local_irq_enable(); + tasklet_unlock(t); + if (test_bit(TASKLET_STATE_SCHED, &t->state)) + tasklet_hi_schedule(t); } + local_irq_enable(); } void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data) { - t->func = func; - t->data = data; + t->next = NULL; t->state = 0; atomic_set(&t->count, 0); + t->func = func; + t->data = data; } void tasklet_kill(struct tasklet_struct *t) diff -u --recursive --new-file v2.4.5/linux/lib/brlock.c linux/lib/brlock.c --- v2.4.5/linux/lib/brlock.c Mon Apr 24 13:59:56 2000 +++ linux/lib/brlock.c Tue Jun 5 01:29:06 2001 @@ -25,7 +25,7 @@ int i; for (i = 0; i < smp_num_cpus; i++) - write_lock(__brlock_array[idx] + cpu_logical_map(i)); + write_lock(&__brlock_array[cpu_logical_map(i)][idx]); } void __br_write_unlock (enum brlock_indices idx) @@ -33,7 +33,7 @@ int i; for (i = 0; i < smp_num_cpus; i++) - write_unlock(__brlock_array[idx] + cpu_logical_map(i)); + write_unlock(&__brlock_array[cpu_logical_map(i)][idx]); } #else /* ! __BRLOCK_USE_ATOMICS */ diff -u --recursive --new-file v2.4.5/linux/mm/filemap.c linux/mm/filemap.c --- v2.4.5/linux/mm/filemap.c Fri May 25 18:28:55 2001 +++ linux/mm/filemap.c Sun Jun 3 17:42:16 2001 @@ -529,7 +529,7 @@ if (PageLocked(page)) BUG(); - flags = page->flags & ~((1 << PG_uptodate) | (1 << PG_error) | (1 << PG_dirty) | (1 << PG_referenced) | (1 << PG_arch_1)); + flags = page->flags & ~((1 << PG_uptodate) | (1 << PG_error) | (1 << PG_dirty) | (1 << PG_referenced) | (1 << PG_arch_1) | (1 << PG_checked)); page->flags = flags | (1 << PG_locked); page_cache_get(page); page->index = offset; diff -u --recursive --new-file v2.4.5/linux/mm/memory.c linux/mm/memory.c --- v2.4.5/linux/mm/memory.c Fri Apr 27 14:23:25 2001 +++ linux/mm/memory.c Thu Jun 7 14:29:22 2001 @@ -274,7 +274,7 @@ */ if (pte_dirty(pte) && page->mapping) set_page_dirty(page); - page_cache_release(page); + free_page_and_swap_cache(page); return 1; } swap_free(pte_to_swp_entry(pte)); @@ -870,24 +870,6 @@ flush_cache_page(vma, address); establish_pte(vma, address, page_table, pte_mkwrite(pte_mkdirty(mk_pte(new_page, vma->vm_page_prot)))); } - -/* - * Work out if there are any other processes sharing this - * swap cache page. Never mind the buffers. - */ -static inline int exclusive_swap_page(struct page *page) -{ - unsigned int count; - - if (!PageLocked(page)) - BUG(); - if (!PageSwapCache(page)) - return 0; - count = page_count(page) - !!page->buffers; /* 2: us + swap cache */ - count += swap_count(page); /* +1: just swap cache */ - return count == 3; /* =3: total */ -} - /* * This routine handles present pages, when users try to write diff -u --recursive --new-file v2.4.5/linux/mm/numa.c linux/mm/numa.c --- v2.4.5/linux/mm/numa.c Mon Oct 16 15:25:45 2000 +++ linux/mm/numa.c Mon Jun 4 19:04:01 2001 @@ -34,7 +34,7 @@ struct page * alloc_pages_node(int nid, int gfp_mask, unsigned long order) { #ifdef CONFIG_NUMA - return __alloc_pages(NODE_DATA(nid)->node_zonelists + gfp_mask, order); + return __alloc_pages(gfp_mask, order, NODE_DATA(nid)->node_zonelists + (gfp_mask & GFP_ZONEMASK)); #else return alloc_pages(gfp_mask, order); #endif @@ -85,14 +85,14 @@ static struct page * alloc_pages_pgdat(pg_data_t *pgdat, int gfp_mask, unsigned long order) { - return __alloc_pages(pgdat->node_zonelists + gfp_mask, order); + return __alloc_pages(gfp_mask, order, pgdat->node_zonelists + (gfp_mask & GFP_ZONEMASK)); } /* * This can be refined. Currently, tries to do round robin, instead * should do concentratic circle search, starting from current node. */ -struct page * alloc_pages(int gfp_mask, unsigned long order) +struct page * _alloc_pages(int gfp_mask, unsigned long order) { struct page *ret = 0; pg_data_t *start, *temp; diff -u --recursive --new-file v2.4.5/linux/mm/page_alloc.c linux/mm/page_alloc.c --- v2.4.5/linux/mm/page_alloc.c Fri May 25 18:28:55 2001 +++ linux/mm/page_alloc.c Mon Jun 4 19:04:42 2001 @@ -268,15 +268,21 @@ return NULL; } +#ifndef CONFIG_DISCONTIGMEM +struct page *_alloc_pages(unsigned int gfp_mask, unsigned long order) +{ + return __alloc_pages(gfp_mask, order, + contig_page_data.node_zonelists+(gfp_mask & GFP_ZONEMASK)); +} +#endif /* * This is the 'heart' of the zoned buddy allocator: */ -struct page * __alloc_pages(zonelist_t *zonelist, unsigned long order) +struct page * __alloc_pages(unsigned int gfp_mask, unsigned long order, zonelist_t *zonelist) { zone_t **zone; int direct_reclaim = 0; - unsigned int gfp_mask = zonelist->gfp_mask; struct page * page; /* @@ -428,18 +434,26 @@ } /* * When we arrive here, we are really tight on memory. + * Since kswapd didn't succeed in freeing pages for us, + * we try to help it. * - * We try to free pages ourselves by: - * - shrinking the i/d caches. - * - reclaiming unused memory from the slab caches. - * - swapping/syncing pages to disk (done by page_launder) - * - moving clean pages from the inactive dirty list to - * the inactive clean list. (done by page_launder) + * Single page allocs loop until the allocation succeeds. + * Multi-page allocs can fail due to memory fragmentation; + * in that case we bail out to prevent infinite loops and + * hanging device drivers ... + * + * Another issue are GFP_BUFFER allocations; because they + * do not have __GFP_IO set it's possible we cannot make + * any progress freeing pages, in that case it's better + * to give up than to deadlock the kernel looping here. */ if (gfp_mask & __GFP_WAIT) { memory_pressure++; - try_to_free_pages(gfp_mask); - goto try_again; + if (!order || free_shortage()) { + int progress = try_to_free_pages(gfp_mask); + if (progress || gfp_mask & __GFP_IO) + goto try_again; + } } } @@ -671,14 +685,13 @@ { int i, j, k; - for (i = 0; i < NR_GFPINDEX; i++) { + for (i = 0; i <= GFP_ZONEMASK; i++) { zonelist_t *zonelist; zone_t *zone; zonelist = pgdat->node_zonelists + i; memset(zonelist, 0, sizeof(*zonelist)); - zonelist->gfp_mask = i; j = 0; k = ZONE_NORMAL; if (i & __GFP_HIGHMEM) diff -u --recursive --new-file v2.4.5/linux/mm/swap_state.c linux/mm/swap_state.c --- v2.4.5/linux/mm/swap_state.c Fri May 25 18:28:55 2001 +++ linux/mm/swap_state.c Thu Jun 7 14:29:22 2001 @@ -145,6 +145,30 @@ UnlockPage(page); } +/* + * Perform a free_page(), also freeing any swap cache associated with + * this page if it is the last user of the page. Can not do a lock_page, + * as we are holding the page_table_lock spinlock. + */ +void free_page_and_swap_cache(struct page *page) +{ + /* + * If we are the only user, then try to free up the swap cache. + * + * Its ok to check for PageSwapCache without the page lock + * here because we are going to recheck again inside + * exclusive_swap_page() _with_ the lock. + * - Marcelo + */ + if (PageSwapCache(page) && !TryLockPage(page)) { + if (exclusive_swap_page(page)) + delete_from_swap_cache_nolock(page); + UnlockPage(page); + } + page_cache_release(page); +} + + /* * Lookup a swap entry in the swap cache. A found page will be returned * unlocked and with its refcount incremented - we rely on the kernel diff -u --recursive --new-file v2.4.5/linux/mm/swapfile.c linux/mm/swapfile.c --- v2.4.5/linux/mm/swapfile.c Fri May 25 18:28:55 2001 +++ linux/mm/swapfile.c Thu Jun 7 14:35:33 2001 @@ -343,6 +343,16 @@ while (1) { /* + * The algorithm is inefficient but seldomly used + * and probably not worth fixing. + * + * Make sure that we aren't completely killing + * interactive performance. + */ + if (current->need_resched) + schedule(); + + /* * Find a swap page in use and read it in. */ swap_device_lock(si); diff -u --recursive --new-file v2.4.5/linux/mm/vmscan.c linux/mm/vmscan.c --- v2.4.5/linux/mm/vmscan.c Fri May 25 18:28:55 2001 +++ linux/mm/vmscan.c Fri Jun 8 13:23:45 2001 @@ -265,12 +265,9 @@ return !count; } -/* - * N.B. This function returns only 0 or 1. Return values != 1 from - * the lower level routines result in continued processing. - */ -#define SWAP_SHIFT 5 -#define SWAP_MIN 8 +#define SWAP_MM_SHIFT 2 +#define SWAP_SHIFT 5 +#define SWAP_MIN 8 static inline int swap_amount(struct mm_struct *mm) { @@ -283,7 +280,7 @@ return nr; } -static int swap_out(unsigned int priority, int gfp_mask) +static void swap_out(unsigned int priority, int gfp_mask) { int counter; int retval = 0; @@ -294,7 +291,7 @@ retval = swap_out_mm(mm, swap_amount(mm)); /* Then, look at the other mm's */ - counter = (mmlist_nr << SWAP_SHIFT) >> priority; + counter = (mmlist_nr << SWAP_MM_SHIFT) >> priority; do { struct list_head *p; @@ -316,11 +313,10 @@ retval |= swap_out_mm(mm, swap_amount(mm)); mmput(mm); } while (--counter >= 0); - return retval; + return; empty: spin_unlock(&mmlist_lock); - return 0; } @@ -428,19 +424,14 @@ * go out to Matthew Dillon. */ #define MAX_LAUNDER (4 * (1 << page_cluster)) +#define CAN_DO_IO (gfp_mask & __GFP_IO) +#define CAN_DO_BUFFERS (gfp_mask & __GFP_BUFFER) int page_launder(int gfp_mask, int sync) { int launder_loop, maxscan, cleaned_pages, maxlaunder; - int can_get_io_locks; struct list_head * page_lru; struct page * page; - /* - * We can only grab the IO locks (eg. for flushing dirty - * buffers to disk) if __GFP_IO is set. - */ - can_get_io_locks = gfp_mask & __GFP_IO; - launder_loop = 0; maxlaunder = 0; cleaned_pages = 0; @@ -463,6 +454,7 @@ /* Page is or was in use? Move it to the active list. */ if (PageReferenced(page) || page->age > 0 || + page->zone->free_pages > page->zone->pages_high || (!page->buffers && page_count(page) > 1) || page_ramdisk(page)) { del_page_from_inactive_dirty_list(page); @@ -491,7 +483,7 @@ goto page_active; /* First time through? Move it to the back of the list */ - if (!launder_loop) { + if (!launder_loop || !CAN_DO_IO) { list_del(page_lru); list_add(page_lru, &inactive_dirty_list); UnlockPage(page); @@ -621,7 +613,7 @@ * loads, flush out the dirty pages before we have to wait on * IO. */ - if (can_get_io_locks && !launder_loop && free_shortage()) { + if ((CAN_DO_IO || CAN_DO_BUFFERS) && !launder_loop && free_shortage()) { launder_loop = 1; /* If we cleaned pages, never do synchronous IO. */ if (cleaned_pages) @@ -655,24 +647,10 @@ /* * When we are background aging, we try to increase the page aging - * information in the system. When we have too many inactive pages - * we don't do background aging since having all pages on the - * inactive list decreases aging information. - * - * Since not all active pages have to be on the active list, we round - * nr_active_pages up to num_physpages/2, if needed. + * information in the system. */ - if (!target) { - int inactive = nr_free_pages() + nr_inactive_clean_pages() + - nr_inactive_dirty_pages; - int active = MAX(nr_active_pages, num_physpages / 2); - if (active > 10 * inactive) - maxscan = nr_active_pages >> 4; - else if (active > 3 * inactive) - maxscan = nr_active_pages >> 8; - else - return 0; - } + if (!target) + maxscan = nr_active_pages >> 4; /* Take the lock while messing with the list... */ spin_lock(&pagemap_lru_lock); @@ -792,6 +770,8 @@ int zone_shortage; zone_t *zone = pgdat->node_zones+ i; + if (!zone->size) + continue; zone_shortage = zone->pages_high; zone_shortage -= zone->inactive_dirty_pages; zone_shortage -= zone->inactive_clean_pages; @@ -843,12 +823,12 @@ return 1; } + /* Walk the VM space for a bit.. */ + swap_out(DEF_PRIORITY, gfp_mask); + count -= refill_inactive_scan(DEF_PRIORITY, count); if (count <= 0) goto done; - - /* If refill_inactive_scan failed, try to page stuff out.. */ - swap_out(DEF_PRIORITY, gfp_mask); if (--maxtry <= 0) return 0; diff -u --recursive --new-file v2.4.5/linux/net/Makefile linux/net/Makefile --- v2.4.5/linux/net/Makefile Fri Dec 29 14:07:24 2000 +++ linux/net/Makefile Tue Jun 5 18:11:42 2001 @@ -7,7 +7,7 @@ O_TARGET := network.o -mod-subdirs := ipv4/netfilter ipv6/netfilter ipx irda atm netlink sched +mod-subdirs := ipv4/netfilter ipv6/netfilter ipx irda bluetooth atm netlink sched export-objs := netsyms.o subdir-y := core ethernet @@ -40,6 +40,7 @@ subdir-$(CONFIG_ROSE) += rose subdir-$(CONFIG_AX25) += ax25 subdir-$(CONFIG_IRDA) += irda +subdir-$(CONFIG_BLUEZ) += bluetooth subdir-$(CONFIG_SUNRPC) += sunrpc subdir-$(CONFIG_ATM) += atm subdir-$(CONFIG_DECNET) += decnet diff -u --recursive --new-file v2.4.5/linux/net/README linux/net/README --- v2.4.5/linux/net/README Fri May 25 18:28:55 2001 +++ linux/net/README Tue Jun 5 18:11:42 2001 @@ -22,5 +22,5 @@ wanrouter gene@compuserve.com, jaspreet@sangoma and dm@sangoma.com unix alan@lxorguk.ukuu.org.uk x25 g4klx@g4klx.demon.co.uk - +bluetooth maxk@qualcomm.com diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/Config.in linux/net/bluetooth/Config.in --- v2.4.5/linux/net/bluetooth/Config.in Wed Dec 31 16:00:00 1969 +++ linux/net/bluetooth/Config.in Tue Jun 5 18:11:42 2001 @@ -0,0 +1,16 @@ +# +# Bluetooth configuration +# + +if [ "$CONFIG_NET" != "n" ]; then + mainmenu_option next_comment + comment 'Bluetooth support' + dep_tristate 'Bluetooth subsystem support' CONFIG_BLUEZ $CONFIG_NET + + if [ "$CONFIG_BLUEZ" != "n" ]; then + dep_tristate 'L2CAP protocol support' CONFIG_BLUEZ_L2CAP $CONFIG_BLUEZ + source drivers/bluetooth/Config.in + fi + endmenu +fi + diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/Makefile linux/net/bluetooth/Makefile --- v2.4.5/linux/net/bluetooth/Makefile Wed Dec 31 16:00:00 1969 +++ linux/net/bluetooth/Makefile Tue Jun 5 18:11:42 2001 @@ -0,0 +1,20 @@ +# +# Makefile for the Bluetooth subsystem +# +O_TARGET := bluetooth.o + +list-multi := hci.o l2cap.o +export-objs := syms.o +hci-objs := af_bluetooth.o hci_core.o hci_sock.o lib.o syms.o +l2cap-objs := l2cap_core.o l2cap_proc.o + +obj-$(CONFIG_BLUEZ) += hci.o +obj-$(CONFIG_BLUEZ_L2CAP) += l2cap.o + +include $(TOPDIR)/Rules.make + +hci.o: $(hci-objs) + $(LD) -r -o $@ $(hci-objs) + +l2cap.o: $(l2cap-objs) + $(LD) -r -o $@ $(l2cap-objs) diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/af_bluetooth.c linux/net/bluetooth/af_bluetooth.c --- v2.4.5/linux/net/bluetooth/af_bluetooth.c Wed Dec 31 16:00:00 1969 +++ linux/net/bluetooth/af_bluetooth.c Tue Jun 5 18:11:42 2001 @@ -0,0 +1,164 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ Bluetooth address family and sockets. + * + * $Id: af_bluetooth.c,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(CONFIG_KMOD) +#include +#endif + +#include +#include + +/* Bluetooth sockets */ +static struct net_proto_family *bluez_sock[BLUEZ_MAX_PROTO]; + +int bluez_sock_register(int proto, struct net_proto_family *ops) +{ + if (proto > BLUEZ_MAX_PROTO) + return -EINVAL; + + if (bluez_sock[proto]) + return -EEXIST; + + bluez_sock[proto] = ops; + return 0; +} + +int bluez_sock_unregister(int proto) +{ + if (proto > BLUEZ_MAX_PROTO) + return -EINVAL; + + if (!bluez_sock[proto]) + return -ENOENT; + + bluez_sock[proto] = NULL; + return 0; +} + +static int bluez_sock_create(struct socket *sock, int proto) +{ + if (proto > BLUEZ_MAX_PROTO) + return -EINVAL; + +#if defined(CONFIG_KMOD) + if (!bluez_sock[proto]) { + char module_name[30]; + sprintf(module_name, "bt-proto-%d", proto); + request_module(module_name); + } +#endif + + if (!bluez_sock[proto]) + return -ENOENT; + + return bluez_sock[proto]->create(sock, proto); +} + +void bluez_sock_link(struct bluez_sock_list *l, struct sock *sk) +{ + write_lock(&l->lock); + + sk->next = l->head; + l->head = sk; + sock_hold(sk); + + write_unlock(&l->lock); +} + +void bluez_sock_unlink(struct bluez_sock_list *l, struct sock *sk) +{ + struct sock **skp; + + write_lock(&l->lock); + for (skp = &l->head; *skp; skp = &((*skp)->next)) { + if (*skp == sk) { + *skp = sk->next; + __sock_put(sk); + break; + } + } + write_unlock(&l->lock); +} + +struct net_proto_family bluez_sock_family_ops = +{ + PF_BLUETOOTH, bluez_sock_create +}; + +int bluez_init(void) +{ + INF("BlueZ HCI Core ver %s Copyright (C) 2000,2001 Qualcomm Inc", + BLUEZ_VER); + INF("Written 2000,2001 by Maxim Krasnyansky "); + + proc_mkdir("bluetooth", NULL); + + sock_register(&bluez_sock_family_ops); + + /* Init HCI Core */ + hci_core_init(); + + /* Init sockets */ + hci_sock_init(); + + return 0; +} + +void bluez_cleanup(void) +{ + /* Release socket */ + hci_sock_cleanup(); + + /* Release core */ + hci_core_cleanup(); + + sock_unregister(PF_BLUETOOTH); + + remove_proc_entry("bluetooth", NULL); +} + +#ifdef MODULE +module_init(bluez_init); +module_exit(bluez_cleanup); +#endif diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/hci_core.c linux/net/bluetooth/hci_core.c --- v2.4.5/linux/net/bluetooth/hci_core.c Wed Dec 31 16:00:00 1969 +++ linux/net/bluetooth/hci_core.c Tue Jun 5 18:11:42 2001 @@ -0,0 +1,1870 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ HCI Core. + * + * $Id: hci_core.c,v 1.2 2001/06/01 16:57:03 davem Exp $ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#ifndef HCI_CORE_DEBUG +#undef DBG +#define DBG( A... ) +#endif + +static void hci_cmd_task(unsigned long arg); +static void hci_rx_task(unsigned long arg); +static void hci_tx_task(unsigned long arg); +static void hci_notify(struct hci_dev *hdev, int event); + +static rwlock_t hci_task_lock = RW_LOCK_UNLOCKED; + +/* HCI device list */ +struct hci_dev *hdev_list[HCI_MAX_DEV]; +spinlock_t hdev_list_lock; +#define GET_HDEV(a) (hdev_list[a]) + +/* HCI protocol list */ +struct hci_proto *hproto_list[HCI_MAX_PROTO]; +#define GET_HPROTO(a) (hproto_list[a]) + +/* HCI notifiers list */ +struct notifier_block *hci_dev_notifier; + +/* HCI device notifications */ +int hci_register_notifier(struct notifier_block *nb) +{ + int err, i; + struct hci_dev *hdev; + + if ((err = notifier_chain_register(&hci_dev_notifier, nb))) + return err; + + /* Notify about already registered devices */ + spin_lock(&hdev_list_lock); + for (i = 0; i < HCI_MAX_DEV; i++) { + if (!(hdev = GET_HDEV(i))) + continue; + if (hdev->flags & HCI_UP) + (*nb->notifier_call)(nb, HCI_DEV_UP, hdev); + } + spin_unlock(&hdev_list_lock); + + return 0; +} + +int hci_unregister_notifier(struct notifier_block *nb) +{ + return notifier_chain_unregister(&hci_dev_notifier, nb); +} + +static __inline__ void hci_notify(struct hci_dev *hdev, int event) +{ + notifier_call_chain(&hci_dev_notifier, event, hdev); +} + +/* Get HCI device by index (device is locked on return)*/ +struct hci_dev *hci_dev_get(int index) +{ + struct hci_dev *hdev; + DBG("%d", index); + + if (index < 0 || index >= HCI_MAX_DEV) + return NULL; + + spin_lock(&hdev_list_lock); + if ((hdev = GET_HDEV(index))) + hci_dev_hold(hdev); + spin_unlock(&hdev_list_lock); + + return hdev; +} + +/* Flush inquiry cache */ +void inquiry_cache_flush(struct inquiry_cache *cache) +{ + struct inquiry_entry *next = cache->list, *e; + + DBG("cache %p", cache); + + cache->list = NULL; + while ((e = next)) { + next = e->next; + kfree(e); + } +} + +/* Lookup by bdaddr. + * Cache must be locked. */ +static struct inquiry_entry * __inquiry_cache_lookup(struct inquiry_cache *cache, bdaddr_t *bdaddr) +{ + struct inquiry_entry *e; + + DBG("cache %p, %s", cache, batostr(bdaddr)); + + for (e = cache->list; e; e = e->next) + if (!bacmp(&e->info.bdaddr, bdaddr)) + break; + + return e; +} + +static void inquiry_cache_update(struct inquiry_cache *cache, inquiry_info *info) +{ + struct inquiry_entry *e; + + DBG("cache %p, %s", cache, batostr(&info->bdaddr)); + + inquiry_cache_lock(cache); + + if (!(e = __inquiry_cache_lookup(cache, &info->bdaddr))) { + /* Entry not in the cache. Add new one. */ + if (!(e = kmalloc(sizeof(struct inquiry_entry), GFP_ATOMIC))) + goto unlock; + memset(e, 0, sizeof(struct inquiry_entry)); + e->next = cache->list; + cache->list = e; + } + + memcpy(&e->info, info, sizeof(inquiry_info)); + e->timestamp = jiffies; + cache->timestamp = jiffies; +unlock: + inquiry_cache_unlock(cache); +} + +static int inquiry_cache_dump(struct inquiry_cache *cache, int num, __u8 *buf) +{ + inquiry_info *info = (inquiry_info *) buf; + struct inquiry_entry *e; + int copied = 0; + + inquiry_cache_lock(cache); + + for (e = cache->list; e && copied < num; e = e->next, copied++) + memcpy(info++, &e->info, sizeof(inquiry_info)); + + inquiry_cache_unlock(cache); + + DBG("cache %p, copied %d", cache, copied); + return copied; +} + +/* --------- BaseBand connections --------- */ +static struct hci_conn *hci_conn_add(struct hci_dev *hdev, __u16 handle, bdaddr_t *dst) +{ + struct hci_conn *conn; + + DBG("%s handle %d dst %s", hdev->name, handle, batostr(dst)); + + if (handle > HCI_MAX_CONN) { + ERR("%s BUG handle %d is to large", hdev->name, handle); + return NULL; + } + + if (!(conn = kmalloc(sizeof(struct hci_conn), GFP_ATOMIC))) + return NULL; + memset(conn, 0, sizeof(struct hci_conn)); + + bacpy(&conn->dst, dst); + conn->handle = handle; + conn->hdev = hdev; + + skb_queue_head_init(&conn->acl_q); + skb_queue_head_init(&conn->sco_q); + + if (conn_hash_add(&hdev->conn_hash, handle, conn)) { + hci_dev_hold(hdev); + return conn; + } else { + kfree(conn); + return NULL; + } +} + +static int hci_conn_del(struct hci_dev *hdev, struct hci_conn *conn) +{ + DBG("%s conn %p handle %d", hdev->name, conn, conn->handle); + + if (conn_hash_del(&hdev->conn_hash, conn->handle)) { + hci_dev_put(hdev); + + /* Unacked frames */ + hdev->acl_cnt += conn->acl_sent; + } + + bluez_skb_queue_purge(&conn->acl_q); + bluez_skb_queue_purge(&conn->sco_q); + + kfree(conn); + return 0; +} + +/* Drop all connection on the device */ +static void hci_conn_hash_flush(struct hci_dev *hdev) +{ + struct hci_proto *hp = GET_HPROTO(HCI_PROTO_L2CAP); + struct conn_hash *h = &hdev->conn_hash; + int i; + + DBG("hdev %s", hdev->name); + + for (i = 0; i < HCI_MAX_CONN; i++) { + struct hci_conn *conn; + + if (!(conn = conn_hash_lookup(h, i))) + continue; + + if (hp && hp->disconn_ind) + hp->disconn_ind(conn, 0x16); + + hci_conn_del(hdev, conn); + } +} + +int hci_connect(struct hci_dev *hdev, bdaddr_t *bdaddr) +{ + struct inquiry_cache *cache = &hdev->inq_cache; + struct inquiry_entry *e; + create_conn_cp cc; + __u16 clock_offset; + + DBG("%s bdaddr %s", hdev->name, batostr(bdaddr)); + + if (!(hdev->flags & HCI_UP)) + return -ENODEV; + + inquiry_cache_lock_bh(cache); + + if (!(e = __inquiry_cache_lookup(cache, bdaddr)) || inquiry_entry_age(e) > INQUIRY_ENTRY_AGE_MAX) { + cc.pscan_rep_mode = 0; + cc.pscan_mode = 0; + clock_offset = 0; + } else { + cc.pscan_rep_mode = e->info.pscan_rep_mode; + cc.pscan_mode = e->info.pscan_mode; + clock_offset = __le16_to_cpu(e->info.clock_offset) & 0x8000; + } + + inquiry_cache_unlock_bh(cache); + + bacpy(&cc.bdaddr, bdaddr); + cc.pkt_type = __cpu_to_le16(HCI_DM1 | HCI_DM3 | HCI_DM5 | HCI_DH1 | HCI_DH3 | HCI_DH5); + cc.clock_offset = __cpu_to_le16(clock_offset); + cc.role_switch = 0; + hci_send_cmd(hdev, OGF_LINK_CTL, OCF_CREATE_CONN, CREATE_CONN_CP_SIZE, &cc); + + return 0; +} + +int hci_disconnect(struct hci_conn *conn, __u8 reason) +{ + disconnect_cp dc; + + DBG("conn %p handle %d", conn, conn->handle); + + dc.handle = __cpu_to_le16(conn->handle); + dc.reason = reason; + hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_DISCONNECT, DISCONNECT_CP_SIZE, &dc); + + return 0; +} + +/* --------- HCI request handling ------------ */ +static __inline__ void hci_req_lock(struct hci_dev *hdev) +{ + down(&hdev->req_lock); +} + +static __inline__ void hci_req_unlock(struct hci_dev *hdev) +{ + up(&hdev->req_lock); +} + +static __inline__ void hci_req_complete(struct hci_dev *hdev, int result) +{ + DBG("%s result 0x%2.2x", hdev->name, result); + + if (hdev->req_status == HCI_REQ_PEND) { + hdev->req_result = result; + hdev->req_status = HCI_REQ_DONE; + wake_up_interruptible(&hdev->req_wait_q); + } +} + +static __inline__ void hci_req_cancel(struct hci_dev *hdev, int err) +{ + DBG("%s err 0x%2.2x", hdev->name, err); + + if (hdev->req_status == HCI_REQ_PEND) { + hdev->req_result = err; + hdev->req_status = HCI_REQ_CANCELED; + wake_up_interruptible(&hdev->req_wait_q); + } +} + +/* Execute request and wait for completion. */ +static int __hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt), + unsigned long opt, __u32 timeout) +{ + DECLARE_WAITQUEUE(wait, current); + int err = 0; + + DBG("%s start", hdev->name); + + hdev->req_status = HCI_REQ_PEND; + + add_wait_queue(&hdev->req_wait_q, &wait); + current->state = TASK_INTERRUPTIBLE; + + req(hdev, opt); + schedule_timeout(timeout); + + current->state = TASK_RUNNING; + remove_wait_queue(&hdev->req_wait_q, &wait); + + if (signal_pending(current)) + return -EINTR; + + switch (hdev->req_status) { + case HCI_REQ_DONE: + err = -bterr(hdev->req_result); + break; + + case HCI_REQ_CANCELED: + err = -hdev->req_result; + break; + + default: + err = -ETIMEDOUT; + break; + }; + + hdev->req_status = hdev->req_result = 0; + + DBG("%s end: err %d", hdev->name, err); + + return err; +} + +static __inline__ int hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt), + unsigned long opt, __u32 timeout) +{ + int ret; + + /* Serialize all requests */ + hci_req_lock(hdev); + ret = __hci_request(hdev, req, opt, timeout); + hci_req_unlock(hdev); + + return ret; +} + +/* --------- HCI requests ---------- */ +static void hci_reset_req(struct hci_dev *hdev, unsigned long opt) +{ + DBG("%s %ld", hdev->name, opt); + + /* Reset device */ + hci_send_cmd(hdev, OGF_HOST_CTL, OCF_RESET, 0, NULL); +} + +static void hci_init_req(struct hci_dev *hdev, unsigned long opt) +{ + set_event_flt_cp ec; + __u16 param; + + DBG("%s %ld", hdev->name, opt); + + /* Mandatory initialization */ + + /* Read Buffer Size (ACL mtu, max pkt, etc.) */ + hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_BUFFER_SIZE, 0, NULL); + + /* Read BD Address */ + hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_BD_ADDR, 0, NULL); + + /* Optional initialization */ + + /* Clear Event Filters */ + ec.flt_type = FLT_CLEAR_ALL; + ec.cond_type = 0; + hci_send_cmd(hdev, OGF_HOST_CTL, OCF_SET_EVENT_FLT, SET_EVENT_FLT_CP_SIZE, &ec); + + /* Page timeout ~ 20 secs */ + param = __cpu_to_le16(0x8000); + hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_PG_TIMEOUT, 2, ¶m); + + /* Connection accept timeout ~20 secs */ + param = __cpu_to_le16(0x7d00); + hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_CA_TIMEOUT, 2, ¶m); +} + +static void hci_scan_req(struct hci_dev *hdev, unsigned long opt) +{ + __u8 scan = opt; + + DBG("%s %x", hdev->name, scan); + + /* Inquiry and Page scans */ + hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE, 1, &scan); +} + +static void hci_auth_req(struct hci_dev *hdev, unsigned long opt) +{ + __u8 auth = opt; + + DBG("%s %x", hdev->name, auth); + + /* Authentication */ + hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_AUTH_ENABLE, 1, &auth); +} + +static void hci_inq_req(struct hci_dev *hdev, unsigned long opt) +{ + struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt; + inquiry_cp ic; + + DBG("%s", hdev->name); + + /* Start Inquiry */ + memcpy(&ic.lap, &ir->lap, 3); + ic.lenght = ir->length; + ic.num_rsp = ir->num_rsp; + hci_send_cmd(hdev, OGF_LINK_CTL, OCF_INQUIRY, INQUIRY_CP_SIZE, &ic); +} + +/* Open HCI device */ +int hci_dev_open(__u16 dev) +{ + struct hci_dev *hdev; + int ret = 0; + + if (!(hdev = hci_dev_get(dev))) + return -ENODEV; + + DBG("%s %p", hdev->name, hdev); + + hci_req_lock(hdev); + + if (hdev->flags & HCI_UP) { + ret = -EALREADY; + goto done; + } + + /* Initialize device */ + if (hdev->open(hdev)) { + ret = -EIO; + goto done; + } + + atomic_set(&hdev->cmd_cnt, 1); + hdev->cmd_sent= NULL; + hdev->flags |= HCI_INIT; + + __hci_request(hdev, hci_reset_req, 0, HZ); + + if (!(ret = __hci_request(hdev, hci_init_req, 0, HCI_INIT_TIMEOUT))) { + hdev->flags |= HCI_UP; + hci_notify(hdev, HCI_DEV_UP); + } + + hdev->flags &= ~HCI_INIT; + +done: + hci_req_unlock(hdev); + hci_dev_put(hdev); + + return ret; +} + +/* Close HCI device */ +int hci_dev_close(__u16 dev) +{ + struct hci_dev *hdev; + + if (!(hdev = hci_dev_get(dev))) + return -ENODEV; + + DBG("%s %p", hdev->name, hdev); + + hci_req_cancel(hdev, ENODEV); + hci_req_lock(hdev); + + if (!(hdev->flags & HCI_UP)) + goto done; + + /* Kill RX and TX tasks */ + tasklet_kill(&hdev->rx_task); + tasklet_kill(&hdev->tx_task); + + inquiry_cache_flush(&hdev->inq_cache); + + hci_conn_hash_flush(hdev); + + /* Clear flags */ + hdev->flags &= (HCI_NORMAL | HCI_SOCK); + + hci_notify(hdev, HCI_DEV_DOWN); + + if (hdev->flush) + hdev->flush(hdev); + + /* Reset device */ + bluez_skb_queue_purge(&hdev->cmd_q); + atomic_set(&hdev->cmd_cnt, 1); + hdev->flags |= HCI_INIT; + __hci_request(hdev, hci_reset_req, 0, HZ); + hdev->flags &= ~HCI_INIT; + + /* Kill cmd task */ + tasklet_kill(&hdev->cmd_task); + + /* Drop queues */ + bluez_skb_queue_purge(&hdev->rx_q); + bluez_skb_queue_purge(&hdev->cmd_q); + bluez_skb_queue_purge(&hdev->raw_q); + + /* Drop last sent command */ + if (hdev->cmd_sent) { + bluez_skb_free(hdev->cmd_sent); + hdev->cmd_sent = NULL; + } + + /* After this point our queues are empty + * and no tasks are scheduled. + */ + hdev->close(hdev); + +done: + hci_req_unlock(hdev); + hci_dev_put(hdev); + + return 0; +} + +/* Interface to HCI drivers */ + +/* Register HCI device */ +int hci_register_dev(struct hci_dev *hdev) +{ + int i; + + DBG("%p name %s type %d", hdev, hdev->name, hdev->type); + + /* Find free slot */ + spin_lock_bh(&hdev_list_lock); + for (i = 0; i < HCI_MAX_DEV; i++) { + if (!hdev_list[i]) { + hdev_list[i] = hdev; + + sprintf(hdev->name, "hci%d", i); + atomic_set(&hdev->refcnt, 0); + hdev->id = i; + hdev->flags = HCI_NORMAL; + + tasklet_init(&hdev->cmd_task, hci_cmd_task, (unsigned long) hdev); + tasklet_init(&hdev->rx_task, hci_rx_task, (unsigned long) hdev); + tasklet_init(&hdev->tx_task, hci_tx_task, (unsigned long) hdev); + + skb_queue_head_init(&hdev->rx_q); + skb_queue_head_init(&hdev->cmd_q); + skb_queue_head_init(&hdev->raw_q); + + init_waitqueue_head(&hdev->req_wait_q); + init_MUTEX(&hdev->req_lock); + + inquiry_cache_init(&hdev->inq_cache); + + conn_hash_init(&hdev->conn_hash); + + memset(&hdev->stat, 0, sizeof(struct hci_dev_stats)); + + hci_notify(hdev, HCI_DEV_REG); + + MOD_INC_USE_COUNT; + break; + } + } + spin_unlock_bh(&hdev_list_lock); + + return (i == HCI_MAX_DEV) ? -1 : i; +} + +/* Unregister HCI device */ +int hci_unregister_dev(struct hci_dev *hdev) +{ + int i; + + DBG("%p name %s type %d", hdev, hdev->name, hdev->type); + + if (hdev->flags & HCI_UP) + hci_dev_close(hdev->id); + + /* Find device slot */ + spin_lock(&hdev_list_lock); + for (i = 0; i < HCI_MAX_DEV; i++) { + if (hdev_list[i] == hdev) { + hdev_list[i] = NULL; + MOD_DEC_USE_COUNT; + break; + } + } + spin_unlock(&hdev_list_lock); + + hci_notify(hdev, HCI_DEV_UNREG); + + /* Sleep while device is in use */ + while (atomic_read(&hdev->refcnt)) { + int sleep_cnt = 100; + + DBG("%s sleeping on lock %d", hdev->name, atomic_read(&hdev->refcnt)); + + sleep_on_timeout(&hdev->req_wait_q, HZ*10); + if (!(--sleep_cnt)) + break; + } + + return 0; +} + +/* Interface to upper protocols */ + +/* Register/Unregister protocols. + * hci_task_lock is used to ensure that no tasks are running. + */ +int hci_register_proto(struct hci_proto *hproto) +{ + int err = 0; + + DBG("%p name %s", hproto, hproto->name); + + if (hproto->id >= HCI_MAX_PROTO) + return -EINVAL; + + write_lock_bh(&hci_task_lock); + + if (!hproto_list[hproto->id]) + hproto_list[hproto->id] = hproto; + else + err = -1; + + write_unlock_bh(&hci_task_lock); + + return err; +} + +int hci_unregister_proto(struct hci_proto *hproto) +{ + int err = 0; + + DBG("%p name %s", hproto, hproto->name); + + if (hproto->id > HCI_MAX_PROTO) + return -EINVAL; + + write_lock_bh(&hci_task_lock); + + if (hproto_list[hproto->id]) + hproto_list[hproto->id] = NULL; + else + err = -ENOENT; + + write_unlock_bh(&hci_task_lock); + + return err; +} + +static int hci_send_frame(struct sk_buff *skb) +{ + struct hci_dev *hdev = (struct hci_dev *) skb->dev; + + if (!hdev) { + bluez_skb_free(skb); + return -ENODEV; + } + + DBG("%s type %d len %d", hdev->name, skb->pkt_type, skb->len); + + if (hdev->flags & HCI_SOCK) + hci_send_to_sock(hdev, skb); + + /* Get rid of skb owner, prior to sending to the driver. */ + skb_orphan(skb); + + return hdev->send(skb); +} + +/* ACL scheduler */ +static __inline__ struct hci_conn *hci_low_acl_sent(struct hci_dev *hdev, int *quote) +{ + struct conn_hash *h = &hdev->conn_hash; + struct hci_conn *conn = NULL; + int i, num = 0, min = 0xffff; + + conn_hash_lock(h); + for (i = 0; i < HCI_MAX_CONN; i++) { + struct hci_conn *c; + + if (!(c = __conn_hash_lookup(h,i)) || !skb_queue_len(&c->acl_q)) + continue; + num++; + + if (c->acl_sent < min) { + min = c->acl_sent; + conn = c; + } + } + conn_hash_unlock(h); + + if (conn) { + int q = hdev->acl_cnt / num; + *quote = q ? q : 1; + } else + *quote = 0; + + DBG("conn %p quote %d", conn, *quote); + + return conn; +} + +static __inline__ void hci_sched_acl(struct hci_dev *hdev) +{ + struct hci_conn *conn; + struct sk_buff *skb, *frag; + int quote; + + DBG("%s", hdev->name); + + while (hdev->acl_cnt) { + if (!(conn = hci_low_acl_sent(hdev, "e))) + break; + + while (quote && (skb = skb_peek(&conn->acl_q))) { + if (bluez_skb_frags(skb)+1 > hdev->acl_cnt) { + /* FIXME: Schedule next connection */ + goto done; + } + + if (!(frag = bluez_skb_clone(skb, GFP_ATOMIC))) + break; + + skb_unlink(skb); + do { + DBG("frag %p len %d", frag, frag->len); + + hci_send_frame(frag); + + conn->acl_sent++; + hdev->acl_cnt--; + quote--; + } while ((frag = bluez_skb_get_frag(skb))); + kfree_skb(skb); + } + } +done: + return; +} + +/* Schedule SCO */ +static __inline__ void hci_sched_sco(struct hci_dev *hdev) +{ + struct conn_hash *h = &hdev->conn_hash; + struct sk_buff *skb; + int i; + + DBG("%s", hdev->name); + + conn_hash_lock(h); + for (i = 0; i< HCI_MAX_CONN; i++) { + struct hci_conn *conn; + + if (!(conn = __conn_hash_lookup(h, i))) + continue; + + while (hdev->sco_cnt && (skb = skb_dequeue(&conn->sco_q))) { + hci_send_frame(skb); + conn->sco_sent++; + hdev->sco_cnt--; + } + } + conn_hash_unlock(h); +} + +/* Send raw HCI frame */ +int hci_send_raw(struct sk_buff *skb) +{ + struct hci_dev *hdev = (struct hci_dev *) skb->dev; + + if (!hdev) { + bluez_skb_free(skb); + return -ENODEV; + } + + DBG("%s type %d len %d", hdev->name, skb->pkt_type, skb->len); + + /* Queue frame according it's type */ + switch (skb->pkt_type) { + case HCI_COMMAND_PKT: + skb_queue_tail(&hdev->cmd_q, skb); + hci_sched_cmd(hdev); + break; + + case HCI_ACLDATA_PKT: + case HCI_SCODATA_PKT: + /* FIXME: + * Check header here and queue to aproptiate connection. + */ + default: + skb_queue_tail(&hdev->raw_q, skb); + hci_sched_tx(hdev); + + return 0; + }; + + return 0; +} + +/* Send HCI command */ +int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void *param) +{ + int len = HCI_COMMAND_HDR_SIZE + plen; + hci_command_hdr *hc; + struct sk_buff *skb; + + DBG("%s ogf 0x%x ocf 0x%x plen %d", hdev->name, ogf, ocf, plen); + + if (!(skb = bluez_skb_alloc(len, GFP_ATOMIC))) { + ERR("%s Can't allocate memory for HCI command", hdev->name); + return -ENOMEM; + } + + hc = (hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE); + hc->opcode = __cpu_to_le16(cmd_opcode_pack(ocf, ogf)); + hc->plen = plen; + + if (plen) + memcpy(skb_put(skb, plen), param, plen); + + DBG("skb len %d", skb->len); + + skb->pkt_type = HCI_COMMAND_PKT; + skb->dev = (void *) hdev; + skb_queue_tail(&hdev->cmd_q, skb); + hci_sched_cmd(hdev); + + return 0; +} + +/* Send ACL data */ + +static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags) +{ + int len = skb->len; + hci_acl_hdr *ah; + + ah = (hci_acl_hdr *) skb_push(skb, HCI_ACL_HDR_SIZE); + ah->handle = __cpu_to_le16(acl_handle_pack(handle, flags)); + ah->dlen = __cpu_to_le16(len); + + skb->h.raw = (void *) ah; +} + +int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags) +{ + struct hci_dev *hdev = conn->hdev; + struct sk_buff *frag; + int sent = 0; + + DBG("%s conn %p len %d flags 0x%x", hdev->name, conn, skb->len, flags); + DBG("frags %d", bluez_skb_frags(skb)); + + /* Add ACL header to all fragments */ + flags |= ACL_START; + frag = skb; + do { + DBG("frag %p len %d", frag, frag->len); + sent += frag->len; + + hci_add_acl_hdr(frag, conn->handle, flags); + frag->pkt_type = HCI_ACLDATA_PKT; + frag->dev = (void *) hdev; + + flags = ACL_CONT; + } while ((frag = bluez_skb_next_frag(frag))); + + skb_queue_tail(&conn->acl_q, skb); + hci_sched_tx(hdev); + + return sent; +} + +/* Send SCO data */ +int hci_send_sco(struct hci_conn *conn, struct sk_buff *skb) +{ + struct hci_dev *hdev = conn->hdev; + hci_sco_hdr hs; + + DBG("%s len %d", hdev->name, skb->len); + + if (skb->len > hdev->sco_mtu) { + bluez_skb_free(skb); + return -EINVAL; + } + + hs.handle = __cpu_to_le16(conn->handle); + hs.dlen = skb->len; + + skb->h.raw = skb_push(skb, HCI_SCO_HDR_SIZE); + memcpy(skb->h.raw, &hs, HCI_SCO_HDR_SIZE); + + skb->dev = (void *) hdev; + skb->pkt_type = HCI_SCODATA_PKT; + skb_queue_tail(&conn->sco_q, skb); + hci_sched_tx(hdev); + + return 0; +} + +/* Handle HCI Event packets */ + +/* Command Complete OGF LINK_CTL */ +static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) +{ + DBG("%s ocf 0x%x", hdev->name, ocf); + + switch (ocf) { + default: + DBG("%s Command complete: ogf LINK_CTL ocf %x", hdev->name, ocf); + break; + }; +} + +/* Command Complete OGF LINK_POLICY */ +static void hci_cc_link_policy(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) +{ + DBG("%s ocf 0x%x", hdev->name, ocf); + + switch (ocf) { + default: + DBG("%s: Command complete: ogf LINK_POLICY ocf %x", hdev->name, ocf); + break; + }; +} + +/* Command Complete OGF HOST_CTL */ +static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) +{ + __u8 status, param; + + DBG("%s ocf 0x%x", hdev->name, ocf); + + switch (ocf) { + case OCF_RESET: + status = *((__u8 *) skb->data); + + hci_req_complete(hdev, status); + break; + + case OCF_SET_EVENT_FLT: + status = *((__u8 *) skb->data); + + if (status) { + DBG("%s SET_EVENT_FLT failed %d", hdev->name, status); + } else { + DBG("%s SET_EVENT_FLT succeseful", hdev->name); + } + break; + + case OCF_WRITE_AUTH_ENABLE: + status = *((__u8 *) skb->data); + param = *(SENT_CMD_PARAM(hdev)); + + if (!status) { + if (param == AUTH_ENABLED) + hdev->flags |= HCI_AUTH; + else + hdev->flags &= ~HCI_AUTH; + } + hci_req_complete(hdev, status); + break; + + case OCF_WRITE_CA_TIMEOUT: + status = *((__u8 *) skb->data); + + if (status) { + DBG("%s OCF_WRITE_CA_TIMEOUT failed %d", hdev->name, status); + } else { + DBG("%s OCF_WRITE_CA_TIMEOUT succeseful", hdev->name); + } + break; + + case OCF_WRITE_PG_TIMEOUT: + status = *((__u8 *) skb->data); + + if (status) { + DBG("%s OCF_WRITE_PG_TIMEOUT failed %d", hdev->name, status); + } else { + DBG("%s: OCF_WRITE_PG_TIMEOUT succeseful", hdev->name); + } + break; + + case OCF_WRITE_SCAN_ENABLE: + status = *((__u8 *) skb->data); + param = *(SENT_CMD_PARAM(hdev)); + + if (!status) { + switch (param) { + case IS_ENA_PS_ENA: + hdev->flags |= HCI_PSCAN | HCI_ISCAN; + break; + + case IS_ENA_PS_DIS: + hdev->flags &= ~HCI_PSCAN; + hdev->flags |= HCI_ISCAN; + break; + + case IS_DIS_PS_ENA: + hdev->flags &= ~HCI_ISCAN; + hdev->flags |= HCI_PSCAN; + break; + + default: + hdev->flags &= ~(HCI_ISCAN | HCI_PSCAN); + break; + }; + } + hci_req_complete(hdev, status); + break; + + default: + DBG("%s Command complete: ogf HOST_CTL ocf %x", hdev->name, ocf); + break; + }; +} + +/* Command Complete OGF INFO_PARAM */ +static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) +{ + read_buffer_size_rp *rsp; + read_bd_addr_rp *rap; + + DBG("%s ocf 0x%x", hdev->name, ocf); + + switch (ocf) { + case OCF_READ_BUFFER_SIZE: + rsp = (read_buffer_size_rp *) skb->data; + + if (rsp->status) { + DBG("%s READ_BUFFER_SIZE failed %d", hdev->name, rsp->status); + break; + } + + hdev->acl_mtu = __le16_to_cpu(rsp->acl_mtu); + hdev->sco_mtu = rsp->sco_mtu; + hdev->acl_max = hdev->acl_cnt = __le16_to_cpu(rsp->acl_max_pkt); + hdev->sco_max = hdev->sco_cnt = __le16_to_cpu(rsp->sco_max_pkt); + + DBG("%s mtu: acl %d, sco %d max_pkt: acl %d, sco %d", hdev->name, + hdev->acl_mtu, hdev->sco_mtu, hdev->acl_max, hdev->sco_max); + + break; + + case OCF_READ_BD_ADDR: + rap = (read_bd_addr_rp *) skb->data; + + if (!rap->status) { + bacpy(&hdev->bdaddr, &rap->bdaddr); + } else { + DBG("%s: READ_BD_ADDR failed %d", hdev->name, rap->status); + } + + hci_req_complete(hdev, rap->status); + break; + + default: + DBG("%s Command complete: ogf INFO_PARAM ocf %x", hdev->name, ocf); + break; + }; +} + +/* Command Status OGF LINK_CTL */ +static void hci_cs_link_ctl(struct hci_dev *hdev, __u16 ocf, __u8 status) +{ + struct hci_proto * hp; + + DBG("%s ocf 0x%x", hdev->name, ocf); + + switch (ocf) { + case OCF_CREATE_CONN: + if (status) { + create_conn_cp *cc = (void *) SENT_CMD_PARAM(hdev); + DBG("%s Create connection error: status 0x%x %s", hdev->name, + status, batostr(&cc->bdaddr)); + + /* Notify upper protocols */ + if ((hp = GET_HPROTO(HCI_PROTO_L2CAP)) && hp->connect_cfm) { + tasklet_disable(&hdev->tx_task); + hp->connect_cfm(hdev, &cc->bdaddr, status, NULL); + tasklet_enable(&hdev->tx_task); + } + } + break; + + case OCF_INQUIRY: + if (status) { + DBG("%s Inquiry error: status 0x%x", hdev->name, status); + hci_req_complete(hdev, status); + } + break; + + default: + DBG("%s Command status: ogf LINK_CTL ocf %x", hdev->name, ocf); + break; + }; +} + +/* Command Status OGF LINK_POLICY */ +static void hci_cs_link_policy(struct hci_dev *hdev, __u16 ocf, __u8 status) +{ + DBG("%s ocf 0x%x", hdev->name, ocf); + + switch (ocf) { + default: + DBG("%s Command status: ogf HOST_POLICY ocf %x", hdev->name, ocf); + break; + }; +} + +/* Command Status OGF HOST_CTL */ +static void hci_cs_host_ctl(struct hci_dev *hdev, __u16 ocf, __u8 status) +{ + DBG("%s ocf 0x%x", hdev->name, ocf); + + switch (ocf) { + default: + DBG("%s Command status: ogf HOST_CTL ocf %x", hdev->name, ocf); + break; + }; +} + +/* Command Status OGF INFO_PARAM */ +static void hci_cs_info_param(struct hci_dev *hdev, __u16 ocf, __u8 status) +{ + DBG("%s: hci_cs_info_param: ocf 0x%x", hdev->name, ocf); + + switch (ocf) { + default: + DBG("%s Command status: ogf INFO_PARAM ocf %x", hdev->name, ocf); + break; + }; +} + +/* Inquiry Complete */ +static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) +{ + __u8 status = *((__u8 *) skb->data); + + DBG("%s status %d", hdev->name, status); + + hci_req_complete(hdev, status); +} + +/* Inquiry Result */ +static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb) +{ + inquiry_info *info = (inquiry_info *) (skb->data + 1); + int num_rsp = *((__u8 *) skb->data); + + DBG("%s num_rsp %d", hdev->name, num_rsp); + + for (; num_rsp; num_rsp--) + inquiry_cache_update(&hdev->inq_cache, info++); +} + +/* Connect Request */ +static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) +{ + evt_conn_request *cr = (evt_conn_request *) skb->data; + struct hci_proto *hp; + accept_conn_req_cp ac; + int accept = 0; + + DBG("%s Connection request: %s type 0x%x", hdev->name, batostr(&cr->bdaddr), cr->type); + + /* Notify upper protocols */ + if ((hp = GET_HPROTO(HCI_PROTO_L2CAP)) && hp->connect_ind) { + tasklet_disable(&hdev->tx_task); + accept = hp->connect_ind(hdev, &cr->bdaddr); + tasklet_enable(&hdev->tx_task); + } + + if (accept) { + /* Connection accepted by upper layer */ + bacpy(&ac.bdaddr, &cr->bdaddr); + ac.role = 0x01; /* Remain slave */ + hci_send_cmd(hdev, OGF_LINK_CTL, OCF_ACCEPT_CONN_REQ, ACCEPT_CONN_REQ_CP_SIZE, &ac); + } else { + /* Connection rejected by upper layer */ + /* FIXME: + * Should we use HCI reject here ? + */ + return; + } +} + +/* Connect Complete */ +static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) +{ + evt_conn_complete *cc = (evt_conn_complete *) skb->data; + struct hci_conn *conn = NULL; + struct hci_proto *hp; + + DBG("%s", hdev->name); + + tasklet_disable(&hdev->tx_task); + + if (!cc->status) + conn = hci_conn_add(hdev, __le16_to_cpu(cc->handle), &cc->bdaddr); + + /* Notify upper protocols */ + if ((hp = GET_HPROTO(HCI_PROTO_L2CAP)) && hp->connect_cfm) + hp->connect_cfm(hdev, &cc->bdaddr, cc->status, conn); + + tasklet_enable(&hdev->tx_task); +} + +/* Disconnect Complete */ +static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) +{ + evt_disconn_complete *dc = (evt_disconn_complete *) skb->data; + struct hci_conn *conn = NULL; + struct hci_proto *hp; + __u16 handle = __le16_to_cpu(dc->handle); + + DBG("%s", hdev->name); + + if (!dc->status && (conn = conn_hash_lookup(&hdev->conn_hash, handle))) { + tasklet_disable(&hdev->tx_task); + + /* Notify upper protocols */ + if ((hp = GET_HPROTO(HCI_PROTO_L2CAP)) && hp->disconn_ind) + hp->disconn_ind(conn, dc->reason); + + hci_conn_del(hdev, conn); + + tasklet_enable(&hdev->tx_task); + } +} + +/* Number of completed packets */ +static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb) +{ + evt_num_comp_pkts *nc = (evt_num_comp_pkts *) skb->data; + __u16 *ptr; + int i; + + skb_pull(skb, EVT_NUM_COMP_PKTS_SIZE); + + DBG("%s num_hndl %d", hdev->name, nc->num_hndl); + + if (skb->len < nc->num_hndl * 4) { + DBG("%s bad parameters", hdev->name); + return; + } + + tasklet_disable(&hdev->tx_task); + + for (i = 0, ptr = (__u16 *) skb->data; i < nc->num_hndl; i++) { + struct hci_conn *conn; + __u16 handle, count; + + handle = __le16_to_cpu(*ptr++); + count = __le16_to_cpu(*ptr++); + + hdev->acl_cnt += count; + + if ((conn = conn_hash_lookup(&hdev->conn_hash, handle))) + conn->acl_sent -= count; + } + + tasklet_enable(&hdev->tx_task); + + hci_sched_tx(hdev); +} + +static __inline__ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) +{ + hci_event_hdr *he = (hci_event_hdr *) skb->data; + evt_cmd_status *cs; + evt_cmd_complete *ec; + __u16 opcode, ocf, ogf; + + skb_pull(skb, HCI_EVENT_HDR_SIZE); + + DBG("%s evt 0x%x", hdev->name, he->evt); + + switch (he->evt) { + case EVT_NUM_COMP_PKTS: + hci_num_comp_pkts_evt(hdev, skb); + break; + + case EVT_INQUIRY_COMPLETE: + hci_inquiry_complete_evt(hdev, skb); + break; + + case EVT_INQUIRY_RESULT: + hci_inquiry_result_evt(hdev, skb); + break; + + case EVT_CONN_REQUEST: + hci_conn_request_evt(hdev, skb); + break; + + case EVT_CONN_COMPLETE: + hci_conn_complete_evt(hdev, skb); + break; + + case EVT_DISCONN_COMPLETE: + hci_disconn_complete_evt(hdev, skb); + break; + + case EVT_CMD_STATUS: + cs = (evt_cmd_status *) skb->data; + skb_pull(skb, EVT_CMD_STATUS_SIZE); + + opcode = __le16_to_cpu(cs->opcode); + ogf = cmd_opcode_ogf(opcode); + ocf = cmd_opcode_ocf(opcode); + + if (cs->ncmd) { + atomic_set(&hdev->cmd_cnt, 1); + hci_sched_cmd(hdev); + } + + switch (ogf) { + case OGF_INFO_PARAM: + hci_cs_info_param(hdev, ocf, cs->status); + break; + + case OGF_HOST_CTL: + hci_cs_host_ctl(hdev, ocf, cs->status); + break; + + case OGF_LINK_CTL: + hci_cs_link_ctl(hdev, ocf, cs->status); + break; + + case OGF_LINK_POLICY: + hci_cs_link_policy(hdev, ocf, cs->status); + break; + + default: + DBG("%s Command Status OGF %x", hdev->name, ogf); + break; + }; + + break; + + case EVT_CMD_COMPLETE: + ec = (evt_cmd_complete *) skb->data; + skb_pull(skb, EVT_CMD_COMPLETE_SIZE); + + opcode = __le16_to_cpu(ec->opcode); + ogf = cmd_opcode_ogf(opcode); + ocf = cmd_opcode_ocf(opcode); + + if (ec->ncmd) { + atomic_set(&hdev->cmd_cnt, 1); + hci_sched_cmd(hdev); + } + + switch (ogf) { + case OGF_INFO_PARAM: + hci_cc_info_param(hdev, ocf, skb); + break; + + case OGF_HOST_CTL: + hci_cc_host_ctl(hdev, ocf, skb); + break; + + case OGF_LINK_CTL: + hci_cc_link_ctl(hdev, ocf, skb); + break; + + case OGF_LINK_POLICY: + hci_cc_link_policy(hdev, ocf, skb); + break; + + default: + DBG("%s Command Completed OGF %x", hdev->name, ogf); + break; + }; + + break; + }; + + bluez_skb_free(skb); + hdev->stat.evt_rx++; +} + +/* ACL data packet */ +static __inline__ void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) +{ + hci_acl_hdr *ah = (void *) skb->data; + struct hci_conn *conn; + __u16 handle, flags; + + skb_pull(skb, HCI_ACL_HDR_SIZE); + + handle = __le16_to_cpu(ah->handle); + flags = acl_flags(handle); + handle = acl_handle(handle); + + DBG("%s len %d handle 0x%x flags 0x%x", hdev->name, skb->len, handle, flags); + + if ((conn = conn_hash_lookup(&hdev->conn_hash, handle))) { + struct hci_proto *hp; + + /* Send to upper protocol */ + if ((hp = GET_HPROTO(HCI_PROTO_L2CAP)) && hp->recv_acldata) + hp->recv_acldata(conn, skb, flags); + else + bluez_skb_free(skb); + } + + hdev->stat.acl_rx++; +} + +/* SCO data packet */ +static __inline__ void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb) +{ + hci_sco_hdr *sh = (void *) skb->data; + struct hci_conn *conn; + + skb_pull(skb, HCI_SCO_HDR_SIZE); + + DBG("%s len %d", hdev->name, skb->len); + + if ((conn = conn_hash_lookup(&hdev->conn_hash, __le16_to_cpu(sh->handle)))) { + struct hci_proto *hp; + + /* Send to upper protocol */ + if ((hp = GET_HPROTO(HCI_PROTO_L2CAP)) && hp->recv_acldata) + hp->recv_scodata(conn, skb); + else + bluez_skb_free(skb); + } + + hdev->stat.sco_rx++; +} + +/* ----- HCI tasks ----- */ +void hci_rx_task(unsigned long arg) +{ + struct hci_dev *hdev = (struct hci_dev *) arg; + struct sk_buff *skb; + + DBG("%s", hdev->name); + + read_lock(&hci_task_lock); + + while ((skb = skb_dequeue(&hdev->rx_q))) { + if (hdev->flags & HCI_SOCK) { + /* Send copy to the sockets */ + hci_send_to_sock(hdev, skb); + } + + if (hdev->flags & HCI_INIT) { + /* Don't process data packets in this states. */ + switch (skb->pkt_type) { + case HCI_ACLDATA_PKT: + case HCI_SCODATA_PKT: + bluez_skb_free(skb); + continue; + }; + } + + if (hdev->flags & HCI_NORMAL) { + /* Handle frame */ + switch (skb->pkt_type) { + case HCI_EVENT_PKT: + hci_event_packet(hdev, skb); + break; + + case HCI_ACLDATA_PKT: + DBG("%s ACL data packet", hdev->name); + hci_acldata_packet(hdev, skb); + break; + + case HCI_SCODATA_PKT: + DBG("%s SCO data packet", hdev->name); + hci_scodata_packet(hdev, skb); + break; + + default: + bluez_skb_free(skb); + break; + }; + } else { + bluez_skb_free(skb); + } + } + + read_unlock(&hci_task_lock); +} + +static void hci_tx_task(unsigned long arg) +{ + struct hci_dev *hdev = (struct hci_dev *) arg; + struct sk_buff *skb; + + read_lock(&hci_task_lock); + + DBG("%s acl %d sco %d", hdev->name, hdev->acl_cnt, hdev->sco_cnt); + + /* Schedule queues and send stuff to HCI driver */ + + hci_sched_acl(hdev); + + hci_sched_sco(hdev); + + /* Send next queued raw(unknown type) packet */ + while ((skb = skb_dequeue(&hdev->raw_q))) + hci_send_frame(skb); + + read_unlock(&hci_task_lock); +} + +static void hci_cmd_task(unsigned long arg) +{ + struct hci_dev *hdev = (struct hci_dev *) arg; + struct sk_buff *skb; + + DBG("%s cmd %d", hdev->name, atomic_read(&hdev->cmd_cnt)); + + /* Send queued commands */ + if (atomic_read(&hdev->cmd_cnt) && (skb = skb_dequeue(&hdev->cmd_q))) { + if (hdev->cmd_sent) + bluez_skb_free(hdev->cmd_sent); + + if ((hdev->cmd_sent = bluez_skb_clone(skb, GFP_ATOMIC))) { + atomic_dec(&hdev->cmd_cnt); + hci_send_frame(skb); + } else { + skb_queue_head(&hdev->cmd_q, skb); + hci_sched_cmd(hdev); + } + } +} + +/* Receive frame from HCI drivers */ +int hci_recv_frame(struct sk_buff *skb) +{ + struct hci_dev *hdev = (struct hci_dev *) skb->dev; + + if (!hdev || !(hdev->flags & (HCI_UP | HCI_INIT))) { + bluez_skb_free(skb); + return -1; + } + + DBG("%s type %d len %d", hdev->name, skb->pkt_type, skb->len); + + /* Incomming skb */ + bluez_cb(skb)->incomming = 1; + + /* Queue frame for rx task */ + skb_queue_tail(&hdev->rx_q, skb); + hci_sched_rx(hdev); + + return 0; +} + +/* ----- HCI Ioctl helpers ----- */ +int hci_dev_reset(__u16 dev) +{ + struct hci_dev *hdev; + int ret = 0; + + if (!(hdev = hci_dev_get(dev))) + return -ENODEV; + + hci_req_lock(hdev); + tasklet_disable(&hdev->tx_task); + + if (!(hdev->flags & HCI_UP)) + goto done; + + /* Drop queues */ + bluez_skb_queue_purge(&hdev->rx_q); + bluez_skb_queue_purge(&hdev->cmd_q); + + inquiry_cache_flush(&hdev->inq_cache); + + hci_conn_hash_flush(hdev); + + if (hdev->flush) + hdev->flush(hdev); + + atomic_set(&hdev->cmd_cnt, 1); + hdev->acl_cnt = 0; hdev->sco_cnt = 0; + + ret = __hci_request(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT); + +done: + tasklet_enable(&hdev->tx_task); + hci_req_unlock(hdev); + hci_dev_put(hdev); + + return ret; +} + +int hci_dev_reset_stat(__u16 dev) +{ + struct hci_dev *hdev; + int ret = 0; + + if (!(hdev = hci_dev_get(dev))) + return -ENODEV; + + memset(&hdev->stat, 0, sizeof(struct hci_dev_stats)); + + hci_dev_put(hdev); + + return ret; +} + +int hci_dev_setauth(unsigned long arg) +{ + struct hci_dev *hdev; + struct hci_dev_req dr; + int ret = 0; + + if (copy_from_user(&dr, (void *) arg, sizeof(dr))) + return -EFAULT; + + if (!(hdev = hci_dev_get(dr.dev_id))) + return -ENODEV; + + ret = hci_request(hdev, hci_auth_req, dr.dev_opt, HCI_INIT_TIMEOUT); + + hci_dev_put(hdev); + + return ret; +} + +int hci_dev_setscan(unsigned long arg) +{ + struct hci_dev *hdev; + struct hci_dev_req dr; + int ret = 0; + + if (copy_from_user(&dr, (void *) arg, sizeof(dr))) + return -EFAULT; + + if (!(hdev = hci_dev_get(dr.dev_id))) + return -ENODEV; + + ret = hci_request(hdev, hci_scan_req, dr.dev_opt, HCI_INIT_TIMEOUT); + + hci_dev_put(hdev); + + return ret; +} + +int hci_dev_list(unsigned long arg) +{ + struct hci_dev_list_req *dl; + struct hci_dev_req *dr; + struct hci_dev *hdev; + int i, n, size; + __u16 dev_num; + + if (get_user(dev_num, (__u16 *) arg)) + return -EFAULT; + + size = dev_num * sizeof(struct hci_dev_req) + sizeof(__u16); + + if (verify_area(VERIFY_WRITE, (void *) arg, size)) + return -EFAULT; + + if (!(dl = kmalloc(size, GFP_KERNEL))) + return -ENOMEM; + dr = dl->dev_req; + + spin_lock_bh(&hdev_list_lock); + for (i = 0, n = 0; i < HCI_MAX_DEV && n < dev_num; i++) { + if ((hdev = hdev_list[i])) { + (dr + n)->dev_id = hdev->id; + (dr + n)->dev_opt = hdev->flags; + n++; + } + } + spin_unlock_bh(&hdev_list_lock); + + dl->dev_num = n; + size = n * sizeof(struct hci_dev_req) + sizeof(__u16); + + copy_to_user((void *) arg, dl, size); + + return 0; +} + +int hci_dev_info(unsigned long arg) +{ + struct hci_dev *hdev; + struct hci_dev_info di; + int err = 0; + + if (copy_from_user(&di, (void *) arg, sizeof(di))) + return -EFAULT; + + if (!(hdev = hci_dev_get(di.dev_id))) + return -ENODEV; + + strcpy(di.name, hdev->name); + di.type = hdev->type; + di.flags = hdev->flags; + di.acl_mtu = hdev->acl_mtu; + di.acl_max = hdev->acl_max; + di.sco_mtu = hdev->sco_mtu; + di.sco_max = hdev->sco_max; + di.bdaddr = hdev->bdaddr; + + memcpy(&di.stat, &hdev->stat, sizeof(di.stat)); + + if (copy_to_user((void *) arg, &di, sizeof(di))) + err = -EFAULT; + + hci_dev_put(hdev); + + return err; +} + +__u32 hci_dev_setmode(struct hci_dev *hdev, __u32 mode) +{ + __u32 omode = hdev->flags & HCI_MODE_MASK; + + hdev->flags &= ~HCI_MODE_MASK; + hdev->flags |= (mode & HCI_MODE_MASK); + + return omode; +} + +__u32 hci_dev_getmode(struct hci_dev *hdev) +{ + return hdev->flags & HCI_MODE_MASK; +} + +int hci_inquiry(unsigned long arg) +{ + struct inquiry_cache *cache; + struct hci_inquiry_req ir; + struct hci_dev *hdev; + int err = 0, do_inquiry = 0; + long timeo; + __u8 *buf, *ptr; + + ptr = (void *) arg; + if (copy_from_user(&ir, ptr, sizeof(ir))) + return -EFAULT; + + if (!(hdev = hci_dev_get(ir.dev_id))) + return -ENODEV; + + cache = &hdev->inq_cache; + + inquiry_cache_lock(cache); + if (inquiry_cache_age(cache) > INQUIRY_CACHE_AGE_MAX || ir.flags & IREQ_CACHE_FLUSH) { + inquiry_cache_flush(cache); + do_inquiry = 1; + } + inquiry_cache_unlock(cache); + + timeo = ir.length * 2 * HZ; + if (do_inquiry && (err = hci_request(hdev, hci_inq_req, (unsigned long)&ir, timeo)) < 0) + goto done; + + /* cache_dump can't sleep. Therefore we allocate temp buffer and then + * copy it to the user space. + */ + if (!(buf = kmalloc(sizeof(inquiry_info) * ir.num_rsp, GFP_KERNEL))) { + err = -ENOMEM; + goto done; + } + ir.num_rsp = inquiry_cache_dump(cache, ir.num_rsp, buf); + + DBG("num_rsp %d", ir.num_rsp); + + if (!verify_area(VERIFY_WRITE, ptr, sizeof(ir) + (sizeof(inquiry_info) * ir.num_rsp))) { + copy_to_user(ptr, &ir, sizeof(ir)); + ptr += sizeof(ir); + copy_to_user(ptr, buf, sizeof(inquiry_info) * ir.num_rsp); + } else + err = -EFAULT; + + kfree(buf); + +done: + hci_dev_put(hdev); + + return err; +} + +int hci_core_init(void) +{ + /* Init locks */ + spin_lock_init(&hdev_list_lock); + + return 0; +} + +int hci_core_cleanup(void) +{ + return 0; +} diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/hci_sock.c linux/net/bluetooth/hci_sock.c --- v2.4.5/linux/net/bluetooth/hci_sock.c Wed Dec 31 16:00:00 1969 +++ linux/net/bluetooth/hci_sock.c Tue Jun 5 18:11:42 2001 @@ -0,0 +1,511 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ HCI socket layer. + * + * $Id: hci_sock.c,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#ifndef HCI_SOCK_DEBUG +#undef DBG +#define DBG( A... ) +#endif + +/* HCI socket interface */ + +static struct bluez_sock_list hci_sk_list = { + lock: RW_LOCK_UNLOCKED +}; + +static struct sock *hci_sock_lookup(struct hci_dev *hdev) +{ + struct sock *sk; + + read_lock(&hci_sk_list.lock); + for (sk = hci_sk_list.head; sk; sk = sk->next) { + if (hci_pi(sk)->hdev == hdev) + break; + } + read_unlock(&hci_sk_list.lock); + return sk; +} + +/* Send frame to RAW socket */ +void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb) +{ + struct sk_buff *nskb; + struct sock * sk; + + DBG("hdev %p len %d", hdev, skb->len); + + read_lock(&hci_sk_list.lock); + for (sk = hci_sk_list.head; sk; sk = sk->next) { + if (sk->state != BT_BOUND || hci_pi(sk)->hdev != hdev) + continue; + + /* Don't send frame to the socket it came from */ + if (skb->sk == sk) + continue; + + if (!(nskb = bluez_skb_clone(skb, GFP_ATOMIC))) + continue; + + /* Put type byte before the data */ + memcpy(skb_push(nskb, 1), &nskb->pkt_type, 1); + + skb_queue_tail(&sk->receive_queue, nskb); + sk->data_ready(sk, nskb->len); + } + read_unlock(&hci_sk_list.lock); +} + +static int hci_sock_release(struct socket *sock) +{ + struct sock *sk = sock->sk; + struct hci_dev *hdev = hci_pi(sk)->hdev; + + DBG("sock %p sk %p", sock, sk); + + if (!sk) + return 0; + + bluez_sock_unlink(&hci_sk_list, sk); + + if (hdev) { + if (!hci_sock_lookup(hdev)) + hdev->flags &= ~HCI_SOCK; + + hci_dev_put(hdev); + } + + sock_orphan(sk); + + bluez_skb_queue_purge(&sk->receive_queue); + bluez_skb_queue_purge(&sk->write_queue); + + sock_put(sk); + + MOD_DEC_USE_COUNT; + + return 0; +} + +static int hci_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) +{ + struct sock *sk = sock->sk; + struct hci_dev *hdev = hci_pi(sk)->hdev; + __u32 mode; + + DBG("cmd %x", cmd); + + switch (cmd) { + case HCIGETINFO: + return hci_dev_info(arg); + + case HCIGETDEVLIST: + return hci_dev_list(arg); + + case HCIDEVUP: + if (!capable(CAP_NET_ADMIN)) + return -EACCES; + + return hci_dev_open(arg); + + case HCIDEVDOWN: + if (!capable(CAP_NET_ADMIN)) + return -EACCES; + + return hci_dev_close(arg); + + case HCIDEVRESET: + if (!capable(CAP_NET_ADMIN)) + return -EACCES; + + return hci_dev_reset(arg); + + case HCIRESETSTAT: + if (!capable(CAP_NET_ADMIN)) + return -EACCES; + + return hci_dev_reset_stat(arg); + + case HCISETSCAN: + if (!capable(CAP_NET_ADMIN)) + return -EACCES; + + return hci_dev_setscan(arg); + + case HCISETAUTH: + if (!capable(CAP_NET_ADMIN)) + return -EACCES; + + return hci_dev_setauth(arg); + + case HCISETRAW: + if (!capable(CAP_NET_ADMIN)) + return -EACCES; + + if (!hdev) + return -EBADFD; + + if (arg) + mode = HCI_RAW; + else + mode = HCI_NORMAL; + + return hci_dev_setmode(hdev, mode); + + case HCIINQUIRY: + return hci_inquiry(arg); + + default: + return -EINVAL; + }; +} + +static int hci_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len) +{ + struct sockaddr_hci *haddr = (struct sockaddr_hci *) addr; + struct sock *sk = sock->sk; + struct hci_dev *hdev = NULL; + + DBG("sock %p sk %p", sock, sk); + + if (!haddr || haddr->hci_family != AF_BLUETOOTH) + return -EINVAL; + + if (hci_pi(sk)->hdev) { + /* Already bound */ + return 0; + } + + if (haddr->hci_dev != HCI_DEV_NONE) { + if (!(hdev = hci_dev_get(haddr->hci_dev))) + return -ENODEV; + + hdev->flags |= HCI_SOCK; + } + + hci_pi(sk)->hdev = hdev; + sk->state = BT_BOUND; + + return 0; +} + +static int hci_sock_getname(struct socket *sock, struct sockaddr *addr, int *addr_len, int peer) +{ + struct sockaddr_hci *haddr = (struct sockaddr_hci *) addr; + struct sock *sk = sock->sk; + + DBG("sock %p sk %p", sock, sk); + + *addr_len = sizeof(*haddr); + haddr->hci_family = AF_BLUETOOTH; + haddr->hci_dev = hci_pi(sk)->hdev->id; + + return 0; +} + +static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg, int len, + struct scm_cookie *scm) +{ + struct sock *sk = sock->sk; + struct hci_dev *hdev = hci_pi(sk)->hdev; + struct sk_buff *skb; + int err; + + DBG("sock %p sk %p", sock, sk); + + if (msg->msg_flags & MSG_OOB) + return -EOPNOTSUPP; + + if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_NOSIGNAL|MSG_ERRQUEUE)) + return -EINVAL; + + if (!hdev) + return -EBADFD; + + if (!(skb = bluez_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err))) + return err; + + if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) { + kfree_skb(skb); + return -EFAULT; + } + + skb->dev = (void *) hdev; + skb->pkt_type = *((unsigned char *) skb->data); + skb_pull(skb, 1); + + /* Send frame to HCI core */ + hci_send_raw(skb); + + return len; +} + +static __inline__ void hci_sock_cmsg(struct sock *sk, struct msghdr *msg, struct sk_buff *skb) +{ + __u32 flags = hci_pi(sk)->cmsg_flags; + + if (flags & HCI_CMSG_DIR) + put_cmsg(msg, SOL_HCI, HCI_CMSG_DIR, sizeof(int), &bluez_cb(skb)->incomming); +} + +static int hci_sock_recvmsg(struct socket *sock, struct msghdr *msg, int len, + int flags, struct scm_cookie *scm) +{ + int noblock = flags & MSG_DONTWAIT; + struct sock *sk = sock->sk; + struct sk_buff *skb; + int copied, err; + + DBG("sock %p sk %p", sock, sk); + + if (flags & (MSG_OOB | MSG_PEEK)) + return -EOPNOTSUPP; + + if (!(skb = skb_recv_datagram(sk, flags, noblock, &err))) + return err; + + msg->msg_namelen = 0; + + copied = skb->len; + if (len < copied) { + msg->msg_flags |= MSG_TRUNC; + copied = len; + } + + skb->h.raw = skb->data; + err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); + + if (hci_pi(sk)->cmsg_flags) + hci_sock_cmsg(sk, msg, skb); + + skb_free_datagram(sk, skb); + + return err ? : copied; +} + +int hci_sock_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen) +{ + struct sock *sk = sock->sk; + int err = 0, opt; + + if (get_user(opt, (int *)optval)) + return -EFAULT; + + DBG("sk %p, opt %d", sk, opt); + + lock_sock(sk); + + switch (optname) { + case HCI_DATA_DIR: + if (opt) + hci_pi(sk)->cmsg_flags |= HCI_CMSG_DIR; + else + hci_pi(sk)->cmsg_flags &= ~HCI_CMSG_DIR; + break; + + default: + err = -ENOPROTOOPT; + break; + }; + + release_sock(sk); + return err; +} + +int hci_sock_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen) +{ + struct sock *sk = sock->sk; + int len, opt; + + if (get_user(len, optlen)) + return -EFAULT; + + switch (optname) { + case HCI_DATA_DIR: + if (hci_pi(sk)->cmsg_flags & HCI_CMSG_DIR) + opt = 1; + else + opt = 0; + + if (put_user(opt, optval)) + return -EFAULT; + break; + + default: + return -ENOPROTOOPT; + break; + }; + + return 0; +} + +struct proto_ops hci_sock_ops = { + family: PF_BLUETOOTH, + release: hci_sock_release, + bind: hci_sock_bind, + getname: hci_sock_getname, + sendmsg: hci_sock_sendmsg, + recvmsg: hci_sock_recvmsg, + ioctl: hci_sock_ioctl, + poll: datagram_poll, + listen: sock_no_listen, + shutdown: sock_no_shutdown, + setsockopt: hci_sock_setsockopt, + getsockopt: hci_sock_getsockopt, + connect: sock_no_connect, + socketpair: sock_no_socketpair, + accept: sock_no_accept, + mmap: sock_no_mmap +}; + +static int hci_sock_create(struct socket *sock, int protocol) +{ + struct sock *sk; + + DBG("sock %p", sock); + + if (sock->type != SOCK_RAW) + return -ESOCKTNOSUPPORT; + + sock->ops = &hci_sock_ops; + + if (!(sk = sk_alloc(PF_BLUETOOTH, GFP_KERNEL, 1))) + return -ENOMEM; + + sock->state = SS_UNCONNECTED; + sock_init_data(sock, sk); + + memset(&sk->protinfo, 0, sizeof(struct hci_pinfo)); + sk->destruct = NULL; + sk->protocol = protocol; + sk->state = BT_OPEN; + + bluez_sock_link(&hci_sk_list, sk); + + MOD_INC_USE_COUNT; + + return 0; +} + +static int hci_sock_dev_event(struct notifier_block *this, unsigned long event, void *ptr) +{ + struct hci_dev *hdev = (struct hci_dev *) ptr; + struct sk_buff *skb; + + DBG("hdev %s event %ld", hdev->name, event); + + /* Send event to sockets */ + if ((skb = bluez_skb_alloc(HCI_EVENT_HDR_SIZE + EVT_HCI_DEV_EVENT_SIZE, GFP_ATOMIC))) { + hci_event_hdr eh = { EVT_HCI_DEV_EVENT, EVT_HCI_DEV_EVENT_SIZE }; + evt_hci_dev_event he = { event, hdev->id }; + + skb->pkt_type = HCI_EVENT_PKT; + memcpy(skb_put(skb, HCI_EVENT_HDR_SIZE), &eh, HCI_EVENT_HDR_SIZE); + memcpy(skb_put(skb, EVT_HCI_DEV_EVENT_SIZE), &he, EVT_HCI_DEV_EVENT_SIZE); + + hci_send_to_sock(NULL, skb); + bluez_skb_free(skb); + } + + if (event == HCI_DEV_UNREG) { + struct sock *sk; + + /* Detach sockets from device */ + read_lock(&hci_sk_list.lock); + for (sk = hci_sk_list.head; sk; sk = sk->next) { + if (hci_pi(sk)->hdev == hdev) { + hci_pi(sk)->hdev = NULL; + sk->err = EPIPE; + sk->state = BT_OPEN; + sk->state_change(sk); + + hci_dev_put(hdev); + } + } + read_unlock(&hci_sk_list.lock); + } + + return NOTIFY_DONE; +} + +struct net_proto_family hci_sock_family_ops = { + family: PF_BLUETOOTH, + create: hci_sock_create +}; + +struct notifier_block hci_sock_nblock = { + notifier_call: hci_sock_dev_event +}; + +int hci_sock_init(void) +{ + if (bluez_sock_register(BTPROTO_HCI, &hci_sock_family_ops)) { + ERR("Can't register HCI socket"); + return -EPROTO; + } + + hci_register_notifier(&hci_sock_nblock); + + return 0; +} + +int hci_sock_cleanup(void) +{ + if (bluez_sock_unregister(BTPROTO_HCI)) + ERR("Can't unregister HCI socket"); + + hci_unregister_notifier(&hci_sock_nblock); + + return 0; +} diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/l2cap_core.c linux/net/bluetooth/l2cap_core.c --- v2.4.5/linux/net/bluetooth/l2cap_core.c Wed Dec 31 16:00:00 1969 +++ linux/net/bluetooth/l2cap_core.c Tue Jun 5 18:11:42 2001 @@ -0,0 +1,2202 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ L2CAP core and sockets. + * + * $Id: l2cap_core.c,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#ifndef L2CAP_DEBUG +#undef DBG +#define DBG( A... ) +#endif + +struct proto_ops l2cap_sock_ops; + +struct bluez_sock_list l2cap_sk_list = { + lock: RW_LOCK_UNLOCKED +}; + +struct list_head l2cap_iff_list = LIST_HEAD_INIT(l2cap_iff_list); +rwlock_t l2cap_rt_lock = RW_LOCK_UNLOCKED; + +static int l2cap_conn_del(struct l2cap_conn *conn, int err); + +static __inline__ void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent); +static void l2cap_chan_del(struct sock *sk, int err); +static int l2cap_chan_send(struct sock *sk, struct msghdr *msg, int len); + +static void l2cap_sock_close(struct sock *sk); +static void l2cap_sock_kill(struct sock *sk); + +static int l2cap_send_req(struct l2cap_conn *conn, __u8 code, __u16 len, void *data); +static int l2cap_send_rsp(struct l2cap_conn *conn, __u8 ident, __u8 code, __u16 len, void *data); + +/* -------- L2CAP interfaces & routing --------- */ +/* Add/delete L2CAP interface. + * Must be called with locked rt_lock + */ + +static void l2cap_iff_add(struct hci_dev *hdev) +{ + struct l2cap_iff *iff; + + DBG("%s", hdev->name); + + DBG("iff_list %p next %p prev %p", &l2cap_iff_list, l2cap_iff_list.next, l2cap_iff_list.prev); + + /* Allocate new interface and lock HCI device */ + if (!(iff = kmalloc(sizeof(struct l2cap_iff), GFP_KERNEL))) { + ERR("Can't allocate new interface %s", hdev->name); + return; + } + memset(iff, 0, sizeof(struct l2cap_iff)); + + hci_dev_hold(hdev); + hdev->l2cap_data = iff; + iff->hdev = hdev; + iff->mtu = hdev->acl_mtu - HCI_ACL_HDR_SIZE; + iff->bdaddr = &hdev->bdaddr; + + spin_lock_init(&iff->lock); + INIT_LIST_HEAD(&iff->conn_list); + + list_add(&iff->list, &l2cap_iff_list); +} + +static void l2cap_iff_del(struct hci_dev *hdev) +{ + struct l2cap_iff *iff; + + if (!(iff = hdev->l2cap_data)) + return; + + DBG("%s iff %p", hdev->name, iff); + + list_del(&iff->list); + + l2cap_iff_lock(iff); + + /* Drop connections */ + while (!list_empty(&iff->conn_list)) { + struct l2cap_conn *c; + + c = list_entry(iff->conn_list.next, struct l2cap_conn, list); + l2cap_conn_del(c, ENODEV); + } + + l2cap_iff_unlock(iff); + + /* Unlock HCI device */ + hdev->l2cap_data = NULL; + hci_dev_put(hdev); + + kfree(iff); +} + +/* Get route. Returns L2CAP interface. + * Must be called with locked rt_lock + */ +static struct l2cap_iff *l2cap_get_route(bdaddr_t *src, bdaddr_t *dst) +{ + struct list_head *p; + int use_src; + + DBG("%s -> %s", batostr(src), batostr(dst)); + + use_src = bacmp(src, BDADDR_ANY) ? 0 : 1; + + /* Simple routing: + * No source address - find interface with bdaddr != dst + * Source address - find interface with bdaddr == src + */ + + list_for_each(p, &l2cap_iff_list) { + struct l2cap_iff *iff; + + iff = list_entry(p, struct l2cap_iff, list); + + if (use_src && !bacmp(iff->bdaddr, src)) + return iff; + else if (bacmp(iff->bdaddr, dst)) + return iff; + } + return NULL; +} + +/* ----- L2CAP timers ------ */ +static void l2cap_timeout(unsigned long arg) +{ + struct sock *sk = (struct sock *) arg; + + DBG("sock %p state %d", sk, sk->state); + + bh_lock_sock(sk); + switch (sk->state) { + case BT_DISCONN: + l2cap_chan_del(sk, ETIMEDOUT); + break; + + default: + sk->err = ETIMEDOUT; + sk->state_change(sk); + break; + }; + bh_unlock_sock(sk); + + l2cap_sock_kill(sk); + sock_put(sk); +} + +static void l2cap_set_timer(struct sock *sk, long timeout) +{ + DBG("sock %p state %d timeout %ld", sk, sk->state, timeout); + + if (!mod_timer(&sk->timer, jiffies + timeout)) + sock_hold(sk); +} + +static void l2cap_clear_timer(struct sock *sk) +{ + DBG("sock %p state %d", sk, sk->state); + + if (timer_pending(&sk->timer) && del_timer(&sk->timer)) + __sock_put(sk); +} + +static void l2cap_init_timer(struct sock *sk) +{ + init_timer(&sk->timer); + sk->timer.function = l2cap_timeout; + sk->timer.data = (unsigned long)sk; +} + +/* -------- L2CAP connections --------- */ +/* Add new connection to the interface. + * Interface must be locked + */ +static struct l2cap_conn *l2cap_conn_add(struct l2cap_iff *iff, bdaddr_t *dst) +{ + struct l2cap_conn *conn; + bdaddr_t *src = iff->bdaddr; + + if (!(conn = kmalloc(sizeof(struct l2cap_conn), GFP_KERNEL))) + return NULL; + + memset(conn, 0, sizeof(struct l2cap_conn)); + + conn->state = BT_OPEN; + conn->iff = iff; + bacpy(&conn->src, src); + bacpy(&conn->dst, dst); + + spin_lock_init(&conn->lock); + conn->chan_list.lock = RW_LOCK_UNLOCKED; + + __l2cap_conn_link(iff, conn); + + DBG("%s -> %s, %p", batostr(src), batostr(dst), conn); + + MOD_INC_USE_COUNT; + + return conn; +} + +/* Delete connection on the interface. + * Interface must be locked + */ +static int l2cap_conn_del(struct l2cap_conn *conn, int err) +{ + struct sock *sk; + + DBG("conn %p, state %d, err %d", conn, conn->state, err); + + __l2cap_conn_unlink(conn->iff, conn); + + conn->state = BT_CLOSED; + + if (conn->rx_skb) + bluez_skb_free(conn->rx_skb); + + /* Kill channels */ + while ((sk = conn->chan_list.head)) { + bh_lock_sock(sk); + l2cap_clear_timer(sk); + l2cap_chan_del(sk, err); + bh_unlock_sock(sk); + + l2cap_sock_kill(sk); + } + + kfree(conn); + + MOD_DEC_USE_COUNT; + return 0; +} + +static __inline__ struct l2cap_conn *l2cap_get_conn_by_addr(struct l2cap_iff *iff, bdaddr_t *dst) +{ + struct list_head *p; + + list_for_each(p, &iff->conn_list){ + struct l2cap_conn *c; + + c = list_entry(p, struct l2cap_conn, list); + if (!bacmp(&c->dst, dst)) + return c; + } + return NULL; +} + +int l2cap_connect(struct sock *sk) +{ + bdaddr_t *src = &l2cap_pi(sk)->src; + bdaddr_t *dst = &l2cap_pi(sk)->dst; + struct l2cap_conn *conn; + struct l2cap_iff *iff; + int err = 0; + + DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst), l2cap_pi(sk)->psm); + + read_lock_bh(&l2cap_rt_lock); + + /* Get route to remote BD address */ + if (!(iff = l2cap_get_route(src, dst))) { + err = -EHOSTUNREACH; + goto done; + } + + /* Update source addr of the socket */ + bacpy(src, iff->bdaddr); + + l2cap_iff_lock(iff); + + if (!(conn = l2cap_get_conn_by_addr(iff, dst))) { + /* Connection doesn't exist */ + if (!(conn = l2cap_conn_add(iff, dst))) { + l2cap_iff_unlock(iff); + err = -ENOMEM; + goto done; + } + conn->out = 1; + } + + l2cap_iff_unlock(iff); + + l2cap_chan_add(conn, sk, NULL); + + sk->state = BT_CONNECT; + l2cap_set_timer(sk, sk->sndtimeo); + + switch (conn->state) { + case BT_CONNECTED: + if (sk->type == SOCK_SEQPACKET) { + l2cap_conn_req req; + req.scid = __cpu_to_le16(l2cap_pi(sk)->scid); + req.psm = l2cap_pi(sk)->psm; + l2cap_send_req(conn, L2CAP_CONN_REQ, L2CAP_CONN_REQ_SIZE, &req); + } else { + sk->state = BT_CONNECTED; + l2cap_clear_timer(sk); + } + break; + + case BT_CONNECT: + break; + + default: + /* Create ACL connection */ + conn->state = BT_CONNECT; + hci_connect(iff->hdev, dst); + break; + }; + +done: + read_unlock_bh(&l2cap_rt_lock); + + return err; +} + +/* ------ Channel queues for listening sockets ------ */ +void l2cap_accept_queue(struct sock *parent, struct sock *sk) +{ + struct l2cap_accept_q *q = &l2cap_pi(parent)->accept_q; + + DBG("parent %p, sk %p", parent, sk); + + sock_hold(sk); + l2cap_pi(sk)->parent = parent; + l2cap_pi(sk)->next_q = NULL; + + if (!q->head) { + q->head = q->tail = sk; + } else { + struct sock *tail = q->tail; + + l2cap_pi(sk)->prev_q = tail; + l2cap_pi(tail)->next_q = sk; + q->tail = sk; + } + + parent->ack_backlog++; +} + +void l2cap_accept_unlink(struct sock *sk) +{ + struct sock *parent = l2cap_pi(sk)->parent; + struct l2cap_accept_q *q = &l2cap_pi(parent)->accept_q; + struct sock *next, *prev; + + DBG("sk %p", sk); + + next = l2cap_pi(sk)->next_q; + prev = l2cap_pi(sk)->prev_q; + + if (sk == q->head) + q->head = next; + if (sk == q->tail) + q->tail = prev; + + if (next) + l2cap_pi(next)->prev_q = prev; + if (prev) + l2cap_pi(prev)->next_q = next; + + l2cap_pi(sk)->parent = NULL; + + parent->ack_backlog--; + __sock_put(sk); +} + +/* Get next connected channel in queue. */ +struct sock *l2cap_accept_dequeue(struct sock *parent, int state) +{ + struct l2cap_accept_q *q = &l2cap_pi(parent)->accept_q; + struct sock *sk; + + for (sk = q->head; sk; sk = l2cap_pi(sk)->next_q){ + if (!state || sk->state == state) { + l2cap_accept_unlink(sk); + break; + } + } + + DBG("parent %p, sk %p", parent, sk); + + return sk; +} + +/* -------- Socket interface ---------- */ +static struct sock *__l2cap_get_sock_by_addr(struct sockaddr_l2 *addr) +{ + bdaddr_t *src = &addr->l2_bdaddr; + __u16 psm = addr->l2_psm; + struct sock *sk; + + for (sk = l2cap_sk_list.head; sk; sk = sk->next) { + if (l2cap_pi(sk)->psm == psm && + !bacmp(&l2cap_pi(sk)->src, src)) + break; + } + + return sk; +} + +/* Find socket listening on psm and source bdaddr. + * Returns closest match. + */ +static struct sock *l2cap_get_sock_listen(bdaddr_t *src, __u16 psm) +{ + struct sock *sk, *sk1 = NULL; + + read_lock(&l2cap_sk_list.lock); + + for (sk = l2cap_sk_list.head; sk; sk = sk->next) { + struct l2cap_pinfo *pi; + + if (sk->state != BT_LISTEN) + continue; + + pi = l2cap_pi(sk); + + if (pi->psm == psm) { + /* Exact match. */ + if (!bacmp(&pi->src, src)) + break; + + /* Closest match */ + if (!bacmp(&pi->src, BDADDR_ANY)) + sk1 = sk; + } + } + + read_unlock(&l2cap_sk_list.lock); + + return sk ? sk : sk1; +} + +static void l2cap_sock_destruct(struct sock *sk) +{ + DBG("sk %p", sk); + + bluez_skb_queue_purge(&sk->receive_queue); + bluez_skb_queue_purge(&sk->write_queue); + + MOD_DEC_USE_COUNT; +} + +static void l2cap_sock_cleanup_listen(struct sock *parent) +{ + struct sock *sk; + + DBG("parent %p", parent); + + /* Close not yet accepted channels */ + while ((sk = l2cap_accept_dequeue(parent, 0))) + l2cap_sock_close(sk); + + parent->state = BT_CLOSED; + parent->zapped = 1; +} + +/* Kill socket (only if zapped and orphan) + * Must be called on unlocked socket. + */ +static void l2cap_sock_kill(struct sock *sk) +{ + if (!sk->zapped || sk->socket) + return; + + DBG("sk %p state %d", sk, sk->state); + + /* Kill poor orphan */ + bluez_sock_unlink(&l2cap_sk_list, sk); + sk->dead = 1; + sock_put(sk); +} + +/* Close socket. + * Must be called on unlocked socket. + */ +static void l2cap_sock_close(struct sock *sk) +{ + struct l2cap_conn *conn; + + lock_sock(sk); + + conn = l2cap_pi(sk)->conn; + + DBG("sk %p state %d conn %p socket %p", sk, sk->state, conn, sk->socket); + + switch (sk->state) { + case BT_LISTEN: + l2cap_sock_cleanup_listen(sk); + break; + + case BT_CONNECTED: + case BT_CONFIG: + if (sk->type == SOCK_SEQPACKET) { + l2cap_disconn_req req; + + sk->state = BT_DISCONN; + + req.dcid = __cpu_to_le16(l2cap_pi(sk)->dcid); + req.scid = __cpu_to_le16(l2cap_pi(sk)->scid); + l2cap_send_req(conn, L2CAP_DISCONN_REQ, L2CAP_DISCONN_REQ_SIZE, &req); + + l2cap_set_timer(sk, sk->sndtimeo); + } else { + l2cap_chan_del(sk, ECONNRESET); + } + break; + + case BT_CONNECT: + case BT_DISCONN: + l2cap_chan_del(sk, ECONNRESET); + break; + + default: + sk->zapped = 1; + break; + }; + + release_sock(sk); + + l2cap_sock_kill(sk); +} + +static void l2cap_sock_init(struct sock *sk, struct sock *parent) +{ + struct l2cap_pinfo *pi = l2cap_pi(sk); + + DBG("sk %p", sk); + + if (parent) { + sk->type = parent->type; + + pi->imtu = l2cap_pi(parent)->imtu; + pi->omtu = l2cap_pi(parent)->omtu; + } else { + pi->imtu = L2CAP_DEFAULT_MTU; + pi->omtu = 0; + } + + /* Default config options */ + pi->conf_mtu = L2CAP_DEFAULT_MTU; + pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; +} + +static struct sock *l2cap_sock_alloc(struct socket *sock, int proto, int prio) +{ + struct sock *sk; + + if (!(sk = sk_alloc(PF_BLUETOOTH, prio, 1))) + return NULL; + + sock_init_data(sock, sk); + + sk->zapped = 0; + + sk->destruct = l2cap_sock_destruct; + sk->sndtimeo = L2CAP_CONN_TIMEOUT; + + sk->protocol = proto; + sk->state = BT_OPEN; + + l2cap_init_timer(sk); + + bluez_sock_link(&l2cap_sk_list, sk); + + MOD_INC_USE_COUNT; + + return sk; +} + +static int l2cap_sock_create(struct socket *sock, int protocol) +{ + struct sock *sk; + + DBG("sock %p", sock); + + sock->state = SS_UNCONNECTED; + + if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_RAW) + return -ESOCKTNOSUPPORT; + + sock->ops = &l2cap_sock_ops; + + if (!(sk = l2cap_sock_alloc(sock, protocol, GFP_KERNEL))) + return -ENOMEM; + + l2cap_sock_init(sk, NULL); + + return 0; +} + +static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len) +{ + struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr; + struct sock *sk = sock->sk; + int err = 0; + + DBG("sk %p, %s %d", sk, batostr(&la->l2_bdaddr), la->l2_psm); + + if (!addr || addr->sa_family != AF_BLUETOOTH) + return -EINVAL; + + lock_sock(sk); + + if (sk->state != BT_OPEN) { + err = -EBADFD; + goto done; + } + + write_lock(&l2cap_sk_list.lock); + + if (la->l2_psm && __l2cap_get_sock_by_addr(la)) { + err = -EADDRINUSE; + goto unlock; + } + + /* Save source address */ + bacpy(&l2cap_pi(sk)->src, &la->l2_bdaddr); + l2cap_pi(sk)->psm = la->l2_psm; + sk->state = BT_BOUND; + +unlock: + write_unlock(&l2cap_sk_list.lock); + +done: + release_sock(sk); + + return err; +} + +static int l2cap_sock_w4_connect(struct sock *sk, int flags) +{ + DECLARE_WAITQUEUE(wait, current); + long timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); + int err = 0; + + add_wait_queue(sk->sleep, &wait); + current->state = TASK_INTERRUPTIBLE; + + while (sk->state != BT_CONNECTED) { + if (!timeo) { + err = -EAGAIN; + break; + } + + release_sock(sk); + timeo = schedule_timeout(timeo); + lock_sock(sk); + + err = 0; + if (sk->state == BT_CONNECTED) + break; + + if (sk->err) { + err = sock_error(sk); + break; + } + + if (signal_pending(current)) { + err = sock_intr_errno(timeo); + break; + } + } + current->state = TASK_RUNNING; + remove_wait_queue(sk->sleep, &wait); + + return err; +} + +static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags) +{ + struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr; + struct sock *sk = sock->sk; + int err = 0; + + lock_sock(sk); + + DBG("sk %p", sk); + + if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_l2)) { + err = -EINVAL; + goto done; + } + + if (sk->state != BT_OPEN && sk->state != BT_BOUND) { + err = -EBADFD; + goto done; + } + + if (sk->type == SOCK_SEQPACKET && !la->l2_psm) { + err = -EINVAL; + goto done; + } + + /* Set destination address and psm */ + bacpy(&l2cap_pi(sk)->dst, &la->l2_bdaddr); + l2cap_pi(sk)->psm = la->l2_psm; + + if ((err = l2cap_connect(sk))) + goto done; + + err = l2cap_sock_w4_connect(sk, flags); + +done: + release_sock(sk); + return err; +} + +int l2cap_sock_listen(struct socket *sock, int backlog) +{ + struct sock *sk = sock->sk; + int err = 0; + + DBG("sk %p backlog %d", sk, backlog); + + lock_sock(sk); + + if (sk->state != BT_BOUND || sock->type != SOCK_SEQPACKET) { + err = -EBADFD; + goto done; + } + + if (!l2cap_pi(sk)->psm) { + err = -EINVAL; + goto done; + } + + sk->max_ack_backlog = backlog; + sk->ack_backlog = 0; + sk->state = BT_LISTEN; + +done: + release_sock(sk); + return err; +} + +int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags) +{ + DECLARE_WAITQUEUE(wait, current); + struct sock *sk = sock->sk, *ch; + long timeo; + int err = 0; + + lock_sock(sk); + + if (sk->state != BT_LISTEN) { + err = -EBADFD; + goto done; + } + + timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); + + DBG("sk %p timeo %ld", sk, timeo); + + /* Wait for an incoming connection. (wake-one). */ + add_wait_queue_exclusive(sk->sleep, &wait); + current->state = TASK_INTERRUPTIBLE; + while (!(ch = l2cap_accept_dequeue(sk, BT_CONNECTED))) { + if (!timeo) { + err = -EAGAIN; + break; + } + + release_sock(sk); + timeo = schedule_timeout(timeo); + lock_sock(sk); + + if (sk->state != BT_LISTEN) { + err = -EBADFD; + break; + } + + if (signal_pending(current)) { + err = sock_intr_errno(timeo); + break; + } + } + current->state = TASK_RUNNING; + remove_wait_queue(sk->sleep, &wait); + + if (err) + goto done; + + sock_graft(ch, newsock); + newsock->state = SS_CONNECTED; + + DBG("new socket %p", ch); + +done: + release_sock(sk); + + return err; +} + +static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer) +{ + struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr; + struct sock *sk = sock->sk; + + DBG("sock %p, sk %p", sock, sk); + + addr->sa_family = AF_BLUETOOTH; + *len = sizeof(struct sockaddr_l2); + + if (peer) + bacpy(&la->l2_bdaddr, &l2cap_pi(sk)->dst); + else + bacpy(&la->l2_bdaddr, &l2cap_pi(sk)->src); + + la->l2_psm = l2cap_pi(sk)->psm; + + return 0; +} + +static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg, int len, struct scm_cookie *scm) +{ + struct sock *sk = sock->sk; + int err = 0; + + DBG("sock %p, sk %p", sock, sk); + + if (sk->err) + return sock_error(sk); + + if (msg->msg_flags & MSG_OOB) + return -EOPNOTSUPP; + + lock_sock(sk); + + if (sk->state == BT_CONNECTED) + err = l2cap_chan_send(sk, msg, len); + else + err = -ENOTCONN; + + release_sock(sk); + return err; +} + +static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg, int len, int flags, struct scm_cookie *scm) +{ + struct sock *sk = sock->sk; + int noblock = flags & MSG_DONTWAIT; + int copied, err; + struct sk_buff *skb; + + DBG("sock %p, sk %p", sock, sk); + + if (flags & (MSG_OOB)) + return -EOPNOTSUPP; + + if (sk->state == BT_CLOSED) + return 0; + + if (!(skb = skb_recv_datagram(sk, flags, noblock, &err))) + return err; + + msg->msg_namelen = 0; + + copied = skb->len; + if (len < copied) { + msg->msg_flags |= MSG_TRUNC; + copied = len; + } + + skb->h.raw = skb->data; + err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); + + skb_free_datagram(sk, skb); + + return err ? : copied; +} + +int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen) +{ + struct sock *sk = sock->sk; + struct l2cap_options opts; + int err = 0; + + DBG("sk %p", sk); + + lock_sock(sk); + + switch (optname) { + case L2CAP_OPTIONS: + if (copy_from_user((char *)&opts, optval, optlen)) { + err = -EFAULT; + break; + } + l2cap_pi(sk)->imtu = opts.imtu; + l2cap_pi(sk)->omtu = opts.omtu; + break; + + default: + err = -ENOPROTOOPT; + break; + }; + + release_sock(sk); + + return err; +} + +int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen) +{ + struct sock *sk = sock->sk; + struct l2cap_options opts; + int len; + + if (get_user(len, optlen)) + return -EFAULT; + + switch (optname) { + case L2CAP_OPTIONS: + opts.imtu = l2cap_pi(sk)->imtu; + opts.omtu = l2cap_pi(sk)->omtu; + opts.flush_to = l2cap_pi(sk)->flush_to; + + len = MIN(len, sizeof(opts)); + if (copy_to_user(optval, (char *)&opts, len)) + return -EFAULT; + + break; + + default: + return -ENOPROTOOPT; + break; + }; + + return 0; +} + +static int l2cap_sock_release(struct socket *sock) +{ + struct sock *sk = sock->sk; + + DBG("sock %p, sk %p", sock, sk); + + if (!sk) + return 0; + + sock_orphan(sk); + + l2cap_sock_close(sk); + + return 0; +} + +/* --------- L2CAP channels --------- */ +static struct sock * __l2cap_get_chan_by_dcid(struct l2cap_chan_list *l, __u16 cid) +{ + struct sock *s; + + for (s = l->head; s; s = l2cap_pi(s)->next_c) { + if (l2cap_pi(s)->dcid == cid) + break; + } + + return s; +} + +static __inline__ struct sock *l2cap_get_chan_by_dcid(struct l2cap_chan_list *l, __u16 cid) +{ + struct sock *s; + + read_lock(&l->lock); + s = __l2cap_get_chan_by_dcid(l, cid); + read_unlock(&l->lock); + + return s; +} + +static struct sock *__l2cap_get_chan_by_scid(struct l2cap_chan_list *l, __u16 cid) +{ + struct sock *s; + + for (s = l->head; s; s = l2cap_pi(s)->next_c) { + if (l2cap_pi(s)->scid == cid) + break; + } + + return s; +} +static __inline__ struct sock *l2cap_get_chan_by_scid(struct l2cap_chan_list *l, __u16 cid) +{ + struct sock *s; + + read_lock(&l->lock); + s = __l2cap_get_chan_by_scid(l, cid); + read_unlock(&l->lock); + + return s; +} + +static struct sock *__l2cap_get_chan_by_ident(struct l2cap_chan_list *l, __u8 ident) +{ + struct sock *s; + + for (s = l->head; s; s = l2cap_pi(s)->next_c) { + if (l2cap_pi(s)->ident == ident) + break; + } + + return s; +} + +static __inline__ struct sock *l2cap_get_chan_by_ident(struct l2cap_chan_list *l, __u8 ident) +{ + struct sock *s; + + read_lock(&l->lock); + s = __l2cap_get_chan_by_ident(l, ident); + read_unlock(&l->lock); + + return s; +} + +static __u16 l2cap_alloc_cid(struct l2cap_chan_list *l) +{ + __u16 cid = 0x0040; + + for (; cid < 0xffff; cid++) { + if(!__l2cap_get_chan_by_scid(l, cid)) + return cid; + } + + return 0; +} + +static __inline__ void __l2cap_chan_link(struct l2cap_chan_list *l, struct sock *sk) +{ + sock_hold(sk); + + if (l->head) + l2cap_pi(l->head)->prev_c = sk; + + l2cap_pi(sk)->next_c = l->head; + l2cap_pi(sk)->prev_c = NULL; + l->head = sk; +} + +static __inline__ void l2cap_chan_unlink(struct l2cap_chan_list *l, struct sock *sk) +{ + struct sock *next = l2cap_pi(sk)->next_c, *prev = l2cap_pi(sk)->prev_c; + + write_lock(&l->lock); + if (sk == l->head) + l->head = next; + + if (next) + l2cap_pi(next)->prev_c = prev; + if (prev) + l2cap_pi(prev)->next_c = next; + write_unlock(&l->lock); + + __sock_put(sk); +} + +static void __l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent) +{ + struct l2cap_chan_list *l = &conn->chan_list; + + DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn, l2cap_pi(sk)->psm, l2cap_pi(sk)->dcid); + + atomic_inc(&conn->refcnt); + l2cap_pi(sk)->conn = conn; + + if (sk->type == SOCK_SEQPACKET) { + /* Alloc CID for normal socket */ + l2cap_pi(sk)->scid = l2cap_alloc_cid(l); + } else { + /* Raw socket can send only signalling messages */ + l2cap_pi(sk)->scid = 0x0001; + l2cap_pi(sk)->dcid = 0x0001; + l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; + } + + __l2cap_chan_link(l, sk); + + if (parent) + l2cap_accept_queue(parent, sk); +} + +static __inline__ void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent) +{ + struct l2cap_chan_list *l = &conn->chan_list; + + write_lock(&l->lock); + __l2cap_chan_add(conn, sk, parent); + write_unlock(&l->lock); +} + +/* Delete channel. Must be called on the locked socket. */ +static void l2cap_chan_del(struct sock *sk, int err) +{ + struct l2cap_conn *conn; + struct sock *parent; + + conn = l2cap_pi(sk)->conn; + parent = l2cap_pi(sk)->parent; + + DBG("sk %p, conn %p, err %d", sk, conn, err); + + if (parent) { + /* Unlink from parent accept queue */ + bh_lock_sock(parent); + l2cap_accept_unlink(sk); + bh_unlock_sock(parent); + } + + if (conn) { + /* Unlink from channel list */ + l2cap_chan_unlink(&conn->chan_list, sk); + l2cap_pi(sk)->conn = NULL; + + if (conn->out && + conn->state == BT_CONNECTED && + atomic_dec_and_test(&conn->refcnt)) { + /* Disconnect baseband */ + hci_disconnect(conn->hconn, 0x13); + } + } + + sk->state = BT_CLOSED; + sk->err = err; + sk->state_change(sk); + + sk->zapped = 1; +} + +static void l2cap_conn_ready(struct l2cap_conn *conn) +{ + struct l2cap_chan_list *l = &conn->chan_list; + struct sock *sk; + + DBG("conn %p", conn); + + read_lock(&l->lock); + + for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { + bh_lock_sock(sk); + + if (sk->type != SOCK_SEQPACKET) { + sk->state = BT_CONNECTED; + sk->state_change(sk); + l2cap_clear_timer(sk); + } else if (sk->state == BT_CONNECT) { + l2cap_conn_req req; + req.scid = __cpu_to_le16(l2cap_pi(sk)->scid); + req.psm = l2cap_pi(sk)->psm; + l2cap_send_req(conn, L2CAP_CONN_REQ, L2CAP_CONN_REQ_SIZE, &req); + + l2cap_set_timer(sk, sk->sndtimeo); + } + + bh_unlock_sock(sk); + } + + read_unlock(&l->lock); +} + +static void l2cap_chan_ready(struct sock *sk) +{ + struct sock *parent = l2cap_pi(sk)->parent; + + DBG("sk %p, parent %p", sk, parent); + + l2cap_pi(sk)->conf_state = 0; + l2cap_clear_timer(sk); + + if (!parent) { + /* Outgoing channel. + * Wake up socket sleeping on connect. + */ + sk->state = BT_CONNECTED; + sk->state_change(sk); + } else { + /* Incomming channel. + * Wake up socket sleeping on accept. + */ + parent->state_change(parent); + } +} + +/* Copy frame to all raw sockets on that connection */ +void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb) +{ + struct l2cap_chan_list *l = &conn->chan_list; + struct sk_buff *nskb; + struct sock * sk; + + DBG("conn %p", conn); + + read_lock(&l->lock); + for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { + if (sk->type != SOCK_RAW) + continue; + + /* Don't send frame to the socket it came from */ + if (skb->sk == sk) + continue; + + if (!(nskb = bluez_skb_clone(skb, GFP_ATOMIC))) + continue; + + skb_queue_tail(&sk->receive_queue, nskb); + sk->data_ready(sk, nskb->len); + } + read_unlock(&l->lock); +} + +static int l2cap_chan_send(struct sock *sk, struct msghdr *msg, int len) +{ + struct l2cap_conn *conn = l2cap_pi(sk)->conn; + struct l2cap_iff *iff = conn->iff; + struct sk_buff *skb, *frag; + int err, size, count, sent=0; + l2cap_hdr * lh; + + /* Check outgoing MTU */ + if (len > l2cap_pi(sk)->omtu) + return -EINVAL; + + /* First fragment (with L2CAP header) */ + count = MIN(iff->mtu - L2CAP_HDR_SIZE, len); + size = L2CAP_HDR_SIZE + count; + if (!(skb = bluez_skb_send_alloc(sk, size, msg->msg_flags & MSG_DONTWAIT, &err))) + return err; + + /* Create L2CAP header */ + lh = (l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); + lh->len = __cpu_to_le16(len); + lh->cid = __cpu_to_le16(l2cap_pi(sk)->dcid); + + if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count)) { + err = -EFAULT; + goto fail; + } + + sent += count; + len -= count; + + /* Continuation fragments (no L2CAP header) */ + while (len) { + count = MIN(iff->mtu, len); + + if (!(frag = bluez_skb_send_alloc(sk, count, msg->msg_flags & MSG_DONTWAIT, &err))) + goto fail; + + bluez_skb_add_frag(skb, frag); + + if (memcpy_fromiovec(skb_put(frag, count), msg->msg_iov, count)) { + err = -EFAULT; + goto fail; + } + + sent += count; + len -= count; + } + + if ((err = hci_send_acl(conn->hconn, skb, 0)) < 0) + goto fail; + + return sent; + +fail: + bluez_skb_free(skb); + + return err; +} +/* --------- L2CAP signalling commands --------- */ +static __inline__ __u8 l2cap_get_ident(struct l2cap_conn *conn) +{ + __u8 id; + + /* Get next available identificator. + * 1 - 199 are used by kernel. + * 200 - 254 are used by utilities like l2ping, etc + */ + + spin_lock(&conn->lock); + + if (++conn->tx_ident > 199) + conn->tx_ident = 1; + + id = conn->tx_ident; + + spin_unlock(&conn->lock); + + return id; +} + +static __inline__ struct sk_buff *l2cap_build_cmd(__u8 code, __u8 ident, __u16 len, void *data) +{ + struct sk_buff *skb; + l2cap_cmd_hdr *cmd; + l2cap_hdr *lh; + int size; + + DBG("code 0x%2.2x, ident 0x%2.2x, len %d", code, ident, len); + + size = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + len; + if (!(skb = bluez_skb_alloc(size, GFP_ATOMIC))) + return NULL; + + lh = (l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE); + lh->len = __cpu_to_le16(L2CAP_CMD_HDR_SIZE + len); + lh->cid = __cpu_to_le16(0x0001); + + cmd = (l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE); + cmd->code = code; + cmd->ident = ident; + cmd->len = __cpu_to_le16(len); + + if (len) + memcpy(skb_put(skb, len), data, len); + + return skb; +} + +static int l2cap_send_req(struct l2cap_conn *conn, __u8 code, __u16 len, void *data) +{ + struct sk_buff *skb; + __u8 ident; + + DBG("code 0x%2.2x", code); + + ident = l2cap_get_ident(conn); + if (!(skb = l2cap_build_cmd(code, ident, len, data))) + return -ENOMEM; + skb->dev = (void *) conn->iff->hdev; + return hci_send_acl(conn->hconn, skb, 0); +} + +static int l2cap_send_rsp(struct l2cap_conn *conn, __u8 ident, __u8 code, __u16 len, void *data) +{ + struct sk_buff *skb; + + DBG("code 0x%2.2x", code); + + if (!(skb = l2cap_build_cmd(code, ident, len, data))) + return -ENOMEM; + + skb->dev = (void *) conn->iff->hdev; + + return hci_send_acl(conn->hconn, skb, 0); +} + +static __inline__ int l2cap_get_conf_opt(__u8 **ptr, __u8 *type, __u32 *val) +{ + l2cap_conf_opt *opt = (l2cap_conf_opt *) (*ptr); + int len; + + *type = opt->type; + switch (opt->len) { + case 1: + *val = *((__u8 *) opt->val); + break; + + case 2: + *val = __le16_to_cpu(*((__u16 *)opt->val)); + break; + + case 4: + *val = __le32_to_cpu(*((__u32 *)opt->val)); + break; + + default: + *val = 0L; + break; + }; + + DBG("type 0x%2.2x len %d val 0x%8.8x", *type, opt->len, *val); + + len = L2CAP_CONF_OPT_SIZE + opt->len; + + *ptr += len; + + return len; +} + +static __inline__ void l2cap_parse_conf_req(struct sock *sk, char *data, int len) +{ + __u8 type; __u32 val; + __u8 *ptr = data; + + DBG("sk %p len %d", sk, len); + + while (len >= L2CAP_CONF_OPT_SIZE) { + len -= l2cap_get_conf_opt(&ptr, &type, &val); + + switch (type) { + case L2CAP_CONF_MTU: + l2cap_pi(sk)->conf_mtu = val; + break; + + case L2CAP_CONF_FLUSH_TO: + l2cap_pi(sk)->flush_to = val; + break; + + case L2CAP_CONF_QOS: + break; + }; + } +} + +static __inline__ void l2cap_add_conf_opt(__u8 **ptr, __u8 type, __u8 len, __u32 val) +{ + register l2cap_conf_opt *opt = (l2cap_conf_opt *) (*ptr); + + DBG("type 0x%2.2x len %d val 0x%8.8x", type, len, val); + + opt->type = type; + opt->len = len; + switch (len) { + case 1: + *((__u8 *) opt->val) = val; + break; + + case 2: + *((__u16 *) opt->val) = __cpu_to_le16(val); + break; + + case 4: + *((__u32 *) opt->val) = __cpu_to_le32(val); + break; + }; + + *ptr += L2CAP_CONF_OPT_SIZE + len; +} + +static int l2cap_build_conf_req(struct sock *sk, __u8 *data) +{ + struct l2cap_pinfo *pi = l2cap_pi(sk); + l2cap_conf_req *req = (l2cap_conf_req *) data; + __u8 *ptr = req->data; + + DBG("sk %p", sk); + + if (pi->imtu != L2CAP_DEFAULT_MTU) + l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu); + + /* FIXME. Need actual value of the flush timeout */ + //if (flush_to != L2CAP_DEFAULT_FLUSH_TO) + // l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, 2, pi->flush_to); + + req->dcid = __cpu_to_le16(pi->dcid); + req->flags = __cpu_to_le16(0); + + return ptr - data; +} + +static int l2cap_conf_output(struct sock *sk, __u8 **ptr) +{ + struct l2cap_pinfo *pi = l2cap_pi(sk); + int result = 0; + + /* Configure output options and let other side know + * which ones we don't like. + */ + if (pi->conf_mtu < pi->omtu) { + l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, l2cap_pi(sk)->omtu); + result = L2CAP_CONF_UNACCEPT; + } else { + pi->omtu = pi->conf_mtu; + } + + DBG("sk %p result %d", sk, result); + return result; +} + +static int l2cap_build_conf_rsp(struct sock *sk, __u8 *data, int *result) +{ + l2cap_conf_rsp *rsp = (l2cap_conf_rsp *) data; + __u8 *ptr = rsp->data; + + DBG("sk %p complete %d", sk, result ? 1 : 0); + + if (result) + *result = l2cap_conf_output(sk, &ptr); + + rsp->scid = __cpu_to_le16(l2cap_pi(sk)->dcid); + rsp->result = __cpu_to_le16(result ? *result : 0); + rsp->flags = __cpu_to_le16(0); + + return ptr - data; +} + +static __inline__ int l2cap_connect_req(struct l2cap_conn *conn, l2cap_cmd_hdr *cmd, __u8 *data) +{ + struct l2cap_chan_list *list = &conn->chan_list; + l2cap_conn_req *req = (l2cap_conn_req *) data; + l2cap_conn_rsp rsp; + struct sock *sk, *parent; + + __u16 scid = __le16_to_cpu(req->scid); + __u16 psm = req->psm; + + DBG("psm 0x%2.2x scid 0x%4.4x", psm, scid); + + /* Check if we have socket listening on psm */ + if (!(parent = l2cap_get_sock_listen(&conn->src, psm))) + goto reject; + + bh_lock_sock(parent); + write_lock(&list->lock); + + /* Check if we already have channel with that dcid */ + if (__l2cap_get_chan_by_dcid(list, scid)) + goto unlock; + + /* Check for backlog size */ + if (parent->ack_backlog > parent->max_ack_backlog) + goto unlock; + + if (!(sk = l2cap_sock_alloc(NULL, BTPROTO_L2CAP, GFP_ATOMIC))) + goto unlock; + + l2cap_sock_init(sk, parent); + + bacpy(&l2cap_pi(sk)->src, &conn->src); + bacpy(&l2cap_pi(sk)->dst, &conn->dst); + l2cap_pi(sk)->psm = psm; + l2cap_pi(sk)->dcid = scid; + + __l2cap_chan_add(conn, sk, parent); + sk->state = BT_CONFIG; + + write_unlock(&list->lock); + bh_unlock_sock(parent); + + rsp.dcid = __cpu_to_le16(l2cap_pi(sk)->scid); + rsp.scid = __cpu_to_le16(l2cap_pi(sk)->dcid); + rsp.result = __cpu_to_le16(0); + rsp.status = __cpu_to_le16(0); + l2cap_send_rsp(conn, cmd->ident, L2CAP_CONN_RSP, L2CAP_CONN_RSP_SIZE, &rsp); + + return 0; + +unlock: + write_unlock(&list->lock); + bh_unlock_sock(parent); + +reject: + rsp.scid = __cpu_to_le16(scid); + rsp.dcid = __cpu_to_le16(0); + rsp.status = __cpu_to_le16(0); + rsp.result = __cpu_to_le16(L2CAP_CONN_NO_MEM); + l2cap_send_rsp(conn, cmd->ident, L2CAP_CONN_RSP, L2CAP_CONN_RSP_SIZE, &rsp); + + return 0; +} + +static __inline__ int l2cap_connect_rsp(struct l2cap_conn *conn, l2cap_cmd_hdr *cmd, __u8 *data) +{ + l2cap_conn_rsp *rsp = (l2cap_conn_rsp *) data; + __u16 scid, dcid, result, status; + struct sock *sk; + + scid = __le16_to_cpu(rsp->scid); + dcid = __le16_to_cpu(rsp->dcid); + result = __le16_to_cpu(rsp->result); + status = __le16_to_cpu(rsp->status); + + DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x", dcid, scid, result, status); + + if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, scid))) + return -ENOENT; + + bh_lock_sock(sk); + + if (!result) { + char req[64]; + + l2cap_pi(sk)->dcid = dcid; + sk->state = BT_CONFIG; + + l2cap_send_req(conn, L2CAP_CONF_REQ, l2cap_build_conf_req(sk, req), req); + } else { + l2cap_chan_del(sk, ECONNREFUSED); + } + + bh_unlock_sock(sk); + return 0; +} + +static __inline__ int l2cap_config_req(struct l2cap_conn *conn, l2cap_cmd_hdr *cmd, __u8 *data) +{ + l2cap_conf_req * req = (l2cap_conf_req *) data; + __u16 dcid, flags; + __u8 rsp[64]; + struct sock *sk; + int result; + + dcid = __le16_to_cpu(req->dcid); + flags = __le16_to_cpu(req->flags); + + DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags); + + if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid))) + return -ENOENT; + + bh_lock_sock(sk); + + l2cap_parse_conf_req(sk, req->data, cmd->len - L2CAP_CONF_REQ_SIZE); + + if (flags & 0x01) { + /* Incomplete config. Send empty response. */ + l2cap_send_rsp(conn, cmd->ident, L2CAP_CONF_RSP, l2cap_build_conf_rsp(sk, rsp, NULL), rsp); + goto unlock; + } + + /* Complete config. */ + l2cap_send_rsp(conn, cmd->ident, L2CAP_CONF_RSP, l2cap_build_conf_rsp(sk, rsp, &result), rsp); + + if (result) + goto unlock; + + /* Output config done */ + l2cap_pi(sk)->conf_state |= CONF_OUTPUT; + + if (l2cap_pi(sk)->conf_state == CONF_DONE) { + sk->state = BT_CONNECTED; + l2cap_chan_ready(sk); + } else { + char req[64]; + l2cap_send_req(conn, L2CAP_CONF_REQ, l2cap_build_conf_req(sk, req), req); + } + +unlock: + bh_unlock_sock(sk); + + return 0; +} + +static __inline__ int l2cap_config_rsp(struct l2cap_conn *conn, l2cap_cmd_hdr *cmd, __u8 *data) +{ + l2cap_conf_rsp *rsp = (l2cap_conf_rsp *)data; + __u16 scid, flags, result; + struct sock *sk; + int err = 0; + + scid = __le16_to_cpu(rsp->scid); + flags = __le16_to_cpu(rsp->flags); + result = __le16_to_cpu(rsp->result); + + DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x", scid, flags, result); + + if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, scid))) + return -ENOENT; + + bh_lock_sock(sk); + + if (sk->state != BT_CONFIG) { + err = -EINVAL; + goto done; + } + + if (result) { + l2cap_disconn_req req; + + /* They didn't like our options. Well... we do not negotiate. + * Close channel. + */ + sk->state = BT_DISCONN; + + req.dcid = __cpu_to_le16(l2cap_pi(sk)->dcid); + req.scid = __cpu_to_le16(l2cap_pi(sk)->scid); + l2cap_send_req(conn, L2CAP_DISCONN_REQ, L2CAP_DISCONN_REQ_SIZE, &req); + + l2cap_set_timer(sk, sk->sndtimeo); + goto done; + } + + if (flags & 0x01) + goto done; + + /* Input config done */ + l2cap_pi(sk)->conf_state |= CONF_INPUT; + + if (l2cap_pi(sk)->conf_state == CONF_DONE) { + sk->state = BT_CONNECTED; + l2cap_chan_ready(sk); + } + +done: + bh_unlock_sock(sk); + + return err; +} + +static __inline__ int l2cap_disconnect_req(struct l2cap_conn *conn, l2cap_cmd_hdr *cmd, __u8 *data) +{ + l2cap_disconn_req *req = (l2cap_disconn_req *) data; + l2cap_disconn_rsp rsp; + __u16 dcid, scid; + struct sock *sk; + + scid = __le16_to_cpu(req->scid); + dcid = __le16_to_cpu(req->dcid); + + DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid); + + if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid))) + return 0; + + bh_lock_sock(sk); + + rsp.dcid = __cpu_to_le16(l2cap_pi(sk)->scid); + rsp.scid = __cpu_to_le16(l2cap_pi(sk)->dcid); + l2cap_send_rsp(conn, cmd->ident, L2CAP_DISCONN_RSP, L2CAP_DISCONN_RSP_SIZE, &rsp); + + l2cap_chan_del(sk, ECONNRESET); + + bh_unlock_sock(sk); + + l2cap_sock_kill(sk); + + return 0; +} + +static __inline__ int l2cap_disconnect_rsp(struct l2cap_conn *conn, l2cap_cmd_hdr *cmd, __u8 *data) +{ + l2cap_disconn_rsp *rsp = (l2cap_disconn_rsp *) data; + __u16 dcid, scid; + struct sock *sk; + + scid = __le16_to_cpu(rsp->scid); + dcid = __le16_to_cpu(rsp->dcid); + + DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid); + + if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, scid))) + return -ENOENT; + + bh_lock_sock(sk); + l2cap_clear_timer(sk); + l2cap_chan_del(sk, ECONNABORTED); + bh_unlock_sock(sk); + + l2cap_sock_kill(sk); + + return 0; +} + +static __inline__ void l2cap_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb) +{ + __u8 *data = skb->data; + int len = skb->len; + l2cap_cmd_hdr cmd; + int err = 0; + + while (len >= L2CAP_CMD_HDR_SIZE) { + memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE); + data += L2CAP_CMD_HDR_SIZE; + len -= L2CAP_CMD_HDR_SIZE; + + cmd.len = le16_to_cpu(cmd.len); + + DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd.len, cmd.ident); + + if (cmd.len > len || !cmd.ident) { + DBG("corrupted command"); + break; + } + + switch (cmd.code) { + case L2CAP_CONN_REQ: + err = l2cap_connect_req(conn, &cmd, data); + break; + + case L2CAP_CONN_RSP: + err = l2cap_connect_rsp(conn, &cmd, data); + break; + + case L2CAP_CONF_REQ: + err = l2cap_config_req(conn, &cmd, data); + break; + + case L2CAP_CONF_RSP: + err = l2cap_config_rsp(conn, &cmd, data); + break; + + case L2CAP_DISCONN_REQ: + err = l2cap_disconnect_req(conn, &cmd, data); + break; + + case L2CAP_DISCONN_RSP: + err = l2cap_disconnect_rsp(conn, &cmd, data); + break; + + case L2CAP_COMMAND_REJ: + /* FIXME: We should process this */ + l2cap_raw_recv(conn, skb); + break; + + case L2CAP_ECHO_REQ: + l2cap_send_rsp(conn, cmd.ident, L2CAP_ECHO_RSP, cmd.len, data); + break; + + case L2CAP_ECHO_RSP: + case L2CAP_INFO_REQ: + case L2CAP_INFO_RSP: + l2cap_raw_recv(conn, skb); + break; + + default: + ERR("Uknown signaling command 0x%2.2x", cmd.code); + err = -EINVAL; + break; + }; + + if (err) { + l2cap_cmd_rej rej; + DBG("error %d", err); + + /* FIXME: Map err to a valid reason. */ + rej.reason = cpu_to_le16(0); + l2cap_send_rsp(conn, cmd.ident, L2CAP_COMMAND_REJ, L2CAP_CMD_REJ_SIZE, &rej); + } + + data += cmd.len; + len -= cmd.len; + } + + bluez_skb_free(skb); +} + +static __inline__ int l2cap_data_channel(struct l2cap_conn *conn, __u16 cid, struct sk_buff *skb) +{ + struct sock *sk; + + if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, cid))) { + DBG("unknown cid 0x%4.4x", cid); + goto drop; + } + + DBG("sk %p, len %d", sk, skb->len); + + if (sk->state != BT_CONNECTED) + goto drop; + + if (l2cap_pi(sk)->imtu < skb->len) + goto drop; + + skb_queue_tail(&sk->receive_queue, skb); + sk->data_ready(sk, skb->len); + + return 0; + +drop: + bluez_skb_free(skb); + + return 0; +} + +static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb) +{ + l2cap_hdr *lh = (l2cap_hdr *) skb->data; + __u16 cid, len; + + skb_pull(skb, L2CAP_HDR_SIZE); + cid = le16_to_cpu(lh->cid); + len = le16_to_cpu(lh->len); + + DBG("len %d, cid 0x%4.4x", len, cid); + + if (cid == 0x0001) + l2cap_sig_channel(conn, skb); + else + l2cap_data_channel(conn, cid, skb); +} + +/* ------------ L2CAP interface with lower layer (HCI) ------------- */ +static int l2cap_dev_event(struct notifier_block *this, unsigned long event, void *ptr) +{ + struct hci_dev *hdev = (struct hci_dev *) ptr; + + DBG("hdev %s, event %ld", hdev->name, event); + + write_lock(&l2cap_rt_lock); + + switch (event) { + case HCI_DEV_UP: + l2cap_iff_add(hdev); + break; + + case HCI_DEV_DOWN: + l2cap_iff_del(hdev); + break; + }; + + write_unlock(&l2cap_rt_lock); + + return NOTIFY_DONE; +} + +int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr) +{ + struct l2cap_iff *iff; + + DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr)); + + if (!(iff = hdev->l2cap_data)) { + ERR("unknown interface"); + return 0; + } + + /* Always accept connection */ + return 1; +} + +int l2cap_connect_cfm(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 status, struct hci_conn *hconn) +{ + struct l2cap_conn *conn; + struct l2cap_iff *iff; + int err = 0; + + DBG("hdev %s bdaddr %s hconn %p", hdev->name, batostr(bdaddr), hconn); + + if (!(iff = hdev->l2cap_data)) { + ERR("unknown interface"); + return 0; + } + + l2cap_iff_lock(iff); + + conn = l2cap_get_conn_by_addr(iff, bdaddr); + + if (conn) { + /* Outgoing connection */ + DBG("Outgoing connection: %s -> %s, %p, %2.2x", batostr(iff->bdaddr), batostr(bdaddr), conn, status); + + if (!status && hconn) { + conn->state = BT_CONNECTED; + conn->hconn = hconn; + + hconn->l2cap_data = (void *)conn; + + /* Establish channels */ + l2cap_conn_ready(conn); + } else { + l2cap_conn_del(conn, bterr(status)); + } + } else { + /* Incomming connection */ + DBG("Incomming connection: %s -> %s, %2.2x", batostr(iff->bdaddr), batostr(bdaddr), status); + + if (status || !hconn) + goto done; + + if (!(conn = l2cap_conn_add(iff, bdaddr))) { + err = -ENOMEM; + goto done; + } + + conn->state = BT_CONNECTED; + conn->hconn = hconn; + + hconn->l2cap_data = (void *)conn; + } + +done: + l2cap_iff_unlock(iff); + + return err; +} + +int l2cap_disconn_ind(struct hci_conn *hconn, __u8 reason) +{ + struct l2cap_conn *conn = hconn->l2cap_data; + + DBG("hconn %p reason %d", hconn, reason); + + if (!conn) { + ERR("unknown connection"); + return 0; + } + conn->hconn = NULL; + + l2cap_iff_lock(conn->iff); + l2cap_conn_del(conn, bterr(reason)); + l2cap_iff_unlock(conn->iff); + + return 0; +} + +int l2cap_recv_acldata(struct hci_conn *hconn, struct sk_buff *skb, __u16 flags) +{ + struct l2cap_conn *conn = hconn->l2cap_data; + + if (!conn) { + ERR("unknown connection"); + goto drop; + } + + DBG("conn %p len %d flags 0x%x", conn, skb->len, flags); + + if (flags & ACL_START) { + int flen, tlen, size; + l2cap_hdr *lh; + + if (skb->len < L2CAP_HDR_SIZE) { + DBG("Corrupted L2CAP frame %d", skb->len); + goto drop; + } + + lh = (l2cap_hdr *)skb->data; + tlen = __le16_to_cpu(lh->len); + flen = skb->len - L2CAP_HDR_SIZE; + + DBG("Start: total len %d, frag len %d", tlen, flen); + + if (flen == tlen) { + /* Complete frame received */ + l2cap_recv_frame(conn, skb); + return 0; + } + + /* Allocate skb for the complete frame (with header) */ + size = L2CAP_HDR_SIZE + tlen; + if (!(conn->rx_skb = bluez_skb_alloc(size, GFP_ATOMIC))) + goto drop; + + memcpy(skb_put(conn->rx_skb, skb->len), skb->data, skb->len); + + conn->rx_len = tlen - flen; + } else { + DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len); + + /* Check length */ + if (skb->len > conn->rx_len) { + if (conn->rx_skb) { + bluez_skb_free(conn->rx_skb); + conn->rx_skb = NULL; + } + goto drop; + } + + memcpy(skb_put(conn->rx_skb, skb->len), skb->data, skb->len); + conn->rx_len -= skb->len; + + if (!conn->rx_len) { + /* Complete frame received */ + l2cap_recv_frame(conn, conn->rx_skb); + conn->rx_skb = NULL; + conn->rx_len = 0; + } + } + +drop: + bluez_skb_free(skb); + + return 0; +} + +struct proto_ops l2cap_sock_ops = { + family: PF_BLUETOOTH, + release: l2cap_sock_release, + bind: l2cap_sock_bind, + connect: l2cap_sock_connect, + listen: l2cap_sock_listen, + accept: l2cap_sock_accept, + getname: l2cap_sock_getname, + sendmsg: l2cap_sock_sendmsg, + recvmsg: l2cap_sock_recvmsg, + poll: datagram_poll, + socketpair: sock_no_socketpair, + ioctl: sock_no_ioctl, + shutdown: sock_no_shutdown, + setsockopt: l2cap_sock_setsockopt, + getsockopt: l2cap_sock_getsockopt, + mmap: sock_no_mmap +}; + +struct net_proto_family l2cap_sock_family_ops = { + family: PF_BLUETOOTH, + create: l2cap_sock_create +}; + +struct hci_proto l2cap_hci_proto = { + name: "L2CAP", + id: HCI_PROTO_L2CAP, + connect_ind: l2cap_connect_ind, + connect_cfm: l2cap_connect_cfm, + disconn_ind: l2cap_disconn_ind, + recv_acldata: l2cap_recv_acldata, +}; + +struct notifier_block l2cap_nblock = { + notifier_call: l2cap_dev_event +}; + +int __init l2cap_init(void) +{ + INF("BlueZ L2CAP ver %s Copyright (C) 2000,2001 Qualcomm Inc", + BLUEZ_VER); + INF("Written 2000,2001 by Maxim Krasnyansky "); + + if (bluez_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops)) { + ERR("Can't register L2CAP socket"); + return -EPROTO; + } + + if (hci_register_proto(&l2cap_hci_proto) < 0) { + ERR("Can't register L2CAP protocol"); + return -EPROTO; + } + + hci_register_notifier(&l2cap_nblock); + + l2cap_register_proc(); + + return 0; +} + +void l2cap_cleanup(void) +{ + l2cap_unregister_proc(); + + /* Unregister socket, protocol and notifier */ + if (bluez_sock_unregister(BTPROTO_L2CAP)) + ERR("Can't unregister L2CAP socket"); + + if (hci_unregister_proto(&l2cap_hci_proto) < 0) + ERR("Can't unregister L2CAP protocol"); + + hci_unregister_notifier(&l2cap_nblock); + + /* We _must_ not have any sockets and/or connections + * at this stage. + */ + + /* Free interface list and unlock HCI devices */ + { + struct list_head *list = &l2cap_iff_list; + + while (!list_empty(list)) { + struct l2cap_iff *iff; + + iff = list_entry(list->next, struct l2cap_iff, list); + l2cap_iff_del(iff->hdev); + } + } +} + +module_init(l2cap_init); +module_exit(l2cap_cleanup); diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/l2cap_proc.c linux/net/bluetooth/l2cap_proc.c --- v2.4.5/linux/net/bluetooth/l2cap_proc.c Wed Dec 31 16:00:00 1969 +++ linux/net/bluetooth/l2cap_proc.c Tue Jun 5 18:11:42 2001 @@ -0,0 +1,165 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ L2CAP proc fs support. + * + * $Id: l2cap_proc.c,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#ifndef L2CAP_DEBUG +#undef DBG +#define DBG( A... ) +#endif + +/* ----- PROC fs support ----- */ +static int l2cap_conn_dump(char *buf, struct l2cap_iff *iff) +{ + struct list_head *p; + char *ptr = buf; + + list_for_each(p, &iff->conn_list) { + struct l2cap_conn *c; + + c = list_entry(p, struct l2cap_conn, list); + ptr += sprintf(ptr, " %p %d %p %p %s %s\n", + c, c->state, c->iff, c->hconn, batostr(&c->src), batostr(&c->dst)); + } + + return ptr - buf; +} + +static int l2cap_iff_dump(char *buf) +{ + struct list_head *p; + char *ptr = buf; + + ptr += sprintf(ptr, "Interfaces:\n"); + + write_lock(&l2cap_rt_lock); + + list_for_each(p, &l2cap_iff_list) { + struct l2cap_iff *iff; + + iff = list_entry(p, struct l2cap_iff, list); + + ptr += sprintf(ptr, " %s %p %p\n", iff->hdev->name, iff, iff->hdev); + + l2cap_iff_lock(iff); + ptr += l2cap_conn_dump(ptr, iff); + l2cap_iff_unlock(iff); + } + + write_unlock(&l2cap_rt_lock); + + ptr += sprintf(ptr, "\n"); + + return ptr - buf; +} + +static int l2cap_sock_dump(char *buf, struct bluez_sock_list *list) +{ + struct l2cap_pinfo *pi; + struct sock *sk; + char *ptr = buf; + + ptr += sprintf(ptr, "Sockets:\n"); + + write_lock(&list->lock); + + for (sk = list->head; sk; sk = sk->next) { + pi = l2cap_pi(sk); + ptr += sprintf(ptr, " %p %d %p %d %s %s 0x%4.4x 0x%4.4x %d %d\n", sk, sk->state, pi->conn, pi->psm, + batostr(&pi->src), batostr(&pi->dst), pi->scid, pi->dcid, pi->imtu, pi->omtu ); + } + + write_unlock(&list->lock); + + ptr += sprintf(ptr, "\n"); + + return ptr - buf; +} + +static int l2cap_read_proc(char *buf, char **start, off_t offset, int count, int *eof, void *priv) +{ + char *ptr = buf; + int len; + + DBG("count %d, offset %ld", count, offset); + + ptr += l2cap_iff_dump(ptr); + ptr += l2cap_sock_dump(ptr, &l2cap_sk_list); + len = ptr - buf; + + if (len <= count + offset) + *eof = 1; + + *start = buf + offset; + len -= offset; + + if (len > count) + len = count; + if (len < 0) + len = 0; + + return len; +} + +void l2cap_register_proc(void) +{ + create_proc_read_entry("bluetooth/l2cap", 0, 0, l2cap_read_proc, NULL); +} + +void l2cap_unregister_proc(void) +{ + remove_proc_entry("bluetooth/l2cap", NULL); +} diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/lib.c linux/net/bluetooth/lib.c --- v2.4.5/linux/net/bluetooth/lib.c Wed Dec 31 16:00:00 1969 +++ linux/net/bluetooth/lib.c Tue Jun 5 18:11:42 2001 @@ -0,0 +1,174 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ kernel library. + * + * $Id: lib.c,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#include +#include +#include +#include + +#include + +void bluez_dump(char *pref, __u8 *buf, int count) +{ + char *ptr; + char line[100]; + int i; + + printk(KERN_INFO "%s: dump, len %d\n", pref, count); + + ptr = line; + *ptr = 0; + for (i = 0; ib0, ba->b1, ba->b2, ba->b3, ba->b4, ba->b5); + + return str[i]; +} + +/* Bluetooth error codes to Unix errno mapping */ +int bterr(__u16 code) +{ + switch (code) { + case 0: + return 0; + + case 0x01: + return EBADRQC; + + case 0x02: + return ENOTCONN; + + case 0x03: + return EIO; + + case 0x04: + return EHOSTDOWN; + + case 0x05: + return EACCES; + + case 0x06: + return EINVAL; + + case 0x07: + return ENOMEM; + + case 0x08: + return ETIMEDOUT; + + case 0x09: + return EMLINK; + + case 0x0a: + return EMLINK; + + case 0x0b: + return EALREADY; + + case 0x0c: + return EBUSY; + + case 0x0d: + case 0x0e: + case 0x0f: + return ECONNREFUSED; + + case 0x10: + return ETIMEDOUT; + + case 0x11: + case 0x27: + case 0x29: + case 0x20: + return EOPNOTSUPP; + + case 0x12: + return EINVAL; + + case 0x13: + case 0x14: + case 0x15: + return ECONNRESET; + + case 0x16: + return ECONNABORTED; + + case 0x17: + return ELOOP; + + case 0x18: + return EACCES; + + case 0x1a: + return EPROTONOSUPPORT; + + case 0x1b: + return ECONNREFUSED; + + case 0x19: + case 0x1e: + case 0x23: + case 0x24: + case 0x25: + return EPROTO; + + default: + return ENOSYS; + }; +} diff -u --recursive --new-file v2.4.5/linux/net/bluetooth/syms.c linux/net/bluetooth/syms.c --- v2.4.5/linux/net/bluetooth/syms.c Wed Dec 31 16:00:00 1969 +++ linux/net/bluetooth/syms.c Tue Jun 5 18:11:42 2001 @@ -0,0 +1,72 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + SOFTWARE IS DISCLAIMED. +*/ + +/* + * BlueZ symbols. + * + * $Id: syms.c,v 1.1 2001/06/01 08:12:11 davem Exp $ + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/* HCI Core */ +EXPORT_SYMBOL(hci_register_dev); +EXPORT_SYMBOL(hci_unregister_dev); +EXPORT_SYMBOL(hci_register_proto); +EXPORT_SYMBOL(hci_unregister_proto); +EXPORT_SYMBOL(hci_register_notifier); +EXPORT_SYMBOL(hci_unregister_notifier); + +EXPORT_SYMBOL(hci_connect); +EXPORT_SYMBOL(hci_disconnect); +EXPORT_SYMBOL(hci_dev_get); + +EXPORT_SYMBOL(hci_recv_frame); +EXPORT_SYMBOL(hci_send_acl); +EXPORT_SYMBOL(hci_send_sco); +EXPORT_SYMBOL(hci_send_raw); + +/* BlueZ lib */ +EXPORT_SYMBOL(bluez_dump); +EXPORT_SYMBOL(baswap); +EXPORT_SYMBOL(batostr); +EXPORT_SYMBOL(bterr); + +/* BlueZ sockets */ +EXPORT_SYMBOL(bluez_sock_register); +EXPORT_SYMBOL(bluez_sock_unregister); +EXPORT_SYMBOL(bluez_sock_link); +EXPORT_SYMBOL(bluez_sock_unlink); diff -u --recursive --new-file v2.4.5/linux/net/bridge/br_device.c linux/net/bridge/br_device.c --- v2.4.5/linux/net/bridge/br_device.c Thu Mar 2 11:41:11 2000 +++ linux/net/bridge/br_device.c Tue Jun 5 18:11:42 2001 @@ -5,7 +5,7 @@ * Authors: * Lennert Buytenhek * - * $Id: br_device.c,v 1.3 2000/03/01 02:58:09 davem Exp $ + * $Id: br_device.c,v 1.4 2001/06/01 09:28:28 davem Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -56,17 +56,17 @@ dest = skb->data; if (dest[0] & 1) { - br_flood(br, skb, 0); + br_flood_deliver(br, skb, 0); return 0; } if ((dst = br_fdb_get(br, dest)) != NULL) { - br_forward(dst->dst, skb); + br_deliver(dst->dst, skb); br_fdb_put(dst); return 0; } - br_flood(br, skb, 0); + br_flood_deliver(br, skb, 0); return 0; } diff -u --recursive --new-file v2.4.5/linux/net/bridge/br_forward.c linux/net/bridge/br_forward.c --- v2.4.5/linux/net/bridge/br_forward.c Mon Feb 21 17:35:06 2000 +++ linux/net/bridge/br_forward.c Tue Jun 5 18:11:42 2001 @@ -5,7 +5,7 @@ * Authors: * Lennert Buytenhek * - * $Id: br_forward.c,v 1.2 2000/02/21 15:51:33 davem Exp $ + * $Id: br_forward.c,v 1.3 2001/06/01 09:28:28 davem Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -18,9 +18,10 @@ #include #include #include +#include #include "br_private.h" -static inline int should_forward(struct net_bridge_port *p, struct sk_buff *skb) +static inline int should_deliver(struct net_bridge_port *p, struct sk_buff *skb) { if (skb->dev == p->dev || p->state != BR_STATE_FORWARDING) @@ -29,16 +30,51 @@ return 1; } +static int __br_forward_finish(struct sk_buff *skb) +{ + NF_HOOK(PF_BRIDGE, NF_BR_POST_ROUTING, skb, NULL, skb->dev, + dev_queue_xmit); + + return 0; +} + +static void __br_deliver(struct net_bridge_port *to, struct sk_buff *skb) +{ + struct net_device *indev; + + indev = skb->dev; + skb->dev = to->dev; + + NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_OUT, skb, indev, skb->dev, + __br_forward_finish); +} + static void __br_forward(struct net_bridge_port *to, struct sk_buff *skb) { + struct net_device *indev; + + indev = skb->dev; skb->dev = to->dev; - dev_queue_xmit(skb); + + NF_HOOK(PF_BRIDGE, NF_BR_FORWARD, skb, indev, skb->dev, + __br_forward_finish); +} + +/* called under bridge lock */ +void br_deliver(struct net_bridge_port *to, struct sk_buff *skb) +{ + if (should_deliver(to, skb)) { + __br_deliver(to, skb); + return; + } + + kfree_skb(skb); } /* called under bridge lock */ void br_forward(struct net_bridge_port *to, struct sk_buff *skb) { - if (should_forward(to, skb)) { + if (should_deliver(to, skb)) { __br_forward(to, skb); return; } @@ -47,7 +83,8 @@ } /* called under bridge lock */ -void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone) +static void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone, + void (*__packet_hook)(struct net_bridge_port *p, struct sk_buff *skb)) { struct net_bridge_port *p; struct net_bridge_port *prev; @@ -67,7 +104,7 @@ p = br->port_list; while (p != NULL) { - if (should_forward(p, skb)) { + if (should_deliver(p, skb)) { if (prev != NULL) { struct sk_buff *skb2; @@ -77,7 +114,7 @@ return; } - __br_forward(prev, skb2); + __packet_hook(prev, skb2); } prev = p; @@ -87,9 +124,21 @@ } if (prev != NULL) { - __br_forward(prev, skb); + __packet_hook(prev, skb); return; } kfree_skb(skb); +} + +/* called under bridge lock */ +void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb, int clone) +{ + br_flood(br, skb, clone, __br_deliver); +} + +/* called under bridge lock */ +void br_flood_forward(struct net_bridge *br, struct sk_buff *skb, int clone) +{ + br_flood(br, skb, clone, __br_forward); } diff -u --recursive --new-file v2.4.5/linux/net/bridge/br_input.c linux/net/bridge/br_input.c --- v2.4.5/linux/net/bridge/br_input.c Fri Dec 29 14:07:24 2000 +++ linux/net/bridge/br_input.c Tue Jun 5 18:11:42 2001 @@ -5,7 +5,7 @@ * Authors: * Lennert Buytenhek * - * $Id: br_input.c,v 1.7 2000/12/13 16:44:14 davem Exp $ + * $Id: br_input.c,v 1.8 2001/06/01 09:28:28 davem Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -17,20 +17,33 @@ #include #include #include +#include #include "br_private.h" unsigned char bridge_ula[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; +static int br_pass_frame_up_finish(struct sk_buff *skb) +{ + netif_rx(skb); + + return 0; +} + static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb) { + struct net_device *indev; + br->statistics.rx_packets++; br->statistics.rx_bytes += skb->len; + indev = skb->dev; skb->dev = &br->dev; skb->pkt_type = PACKET_HOST; skb_pull(skb, skb->mac.raw - skb->data); skb->protocol = eth_type_trans(skb, &br->dev); - netif_rx(skb); + + NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL, + br_pass_frame_up_finish); } static void __br_handle_frame(struct sk_buff *skb) @@ -91,7 +104,7 @@ goto freeandout; if (dest[0] & 1) { - br_flood(br, skb, 1); + br_flood_forward(br, skb, 1); if (!passedup) br_pass_frame_up(br, skb); else @@ -116,7 +129,7 @@ return; } - br_flood(br, skb, 0); + br_flood_forward(br, skb, 0); return; handle_special_frame: @@ -129,7 +142,7 @@ kfree_skb(skb); } -void br_handle_frame(struct sk_buff *skb) +static int br_handle_frame_finish(struct sk_buff *skb) { struct net_bridge *br; @@ -137,4 +150,12 @@ read_lock(&br->lock); __br_handle_frame(skb); read_unlock(&br->lock); + + return 0; +} + +void br_handle_frame(struct sk_buff *skb) +{ + NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL, + br_handle_frame_finish); } diff -u --recursive --new-file v2.4.5/linux/net/bridge/br_private.h linux/net/bridge/br_private.h --- v2.4.5/linux/net/bridge/br_private.h Fri Feb 9 11:34:13 2001 +++ linux/net/bridge/br_private.h Tue Jun 5 18:11:42 2001 @@ -4,7 +4,7 @@ * Authors: * Lennert Buytenhek * - * $Id: br_private.h,v 1.5 2001/02/05 06:03:47 davem Exp $ + * $Id: br_private.h,v 1.6 2001/06/01 09:28:28 davem Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -141,11 +141,16 @@ int is_local); /* br_forward.c */ +extern void br_deliver(struct net_bridge_port *to, + struct sk_buff *skb); extern void br_forward(struct net_bridge_port *to, struct sk_buff *skb); -extern void br_flood(struct net_bridge *br, - struct sk_buff *skb, - int clone); +extern void br_flood_deliver(struct net_bridge *br, + struct sk_buff *skb, + int clone); +extern void br_flood_forward(struct net_bridge *br, + struct sk_buff *skb, + int clone); /* br_if.c */ extern int br_add_bridge(char *name); diff -u --recursive --new-file v2.4.5/linux/net/core/dev.c linux/net/core/dev.c --- v2.4.5/linux/net/core/dev.c Fri May 25 18:28:55 2001 +++ linux/net/core/dev.c Mon Jun 4 15:57:49 2001 @@ -1278,7 +1278,7 @@ ret = pt->func(skb, skb->dev, pt); - tasklet_enable(bh_task_vec+TIMER_BH); + tasklet_hi_enable(bh_task_vec+TIMER_BH); spin_unlock(&net_bh_lock); return ret; } diff -u --recursive --new-file v2.4.5/linux/net/core/neighbour.c linux/net/core/neighbour.c --- v2.4.5/linux/net/core/neighbour.c Tue Nov 28 21:53:45 2000 +++ linux/net/core/neighbour.c Tue Jun 5 18:11:42 2001 @@ -308,7 +308,7 @@ } /* Device specific setup. */ - if (n->parms && n->parms->neigh_setup && + if (n->parms->neigh_setup && (error = n->parms->neigh_setup(n)) < 0) { neigh_release(n); return ERR_PTR(error); diff -u --recursive --new-file v2.4.5/linux/net/ipv4/fib_frontend.c linux/net/ipv4/fib_frontend.c --- v2.4.5/linux/net/ipv4/fib_frontend.c Fri May 25 18:28:55 2001 +++ linux/net/ipv4/fib_frontend.c Tue Jun 5 18:11:42 2001 @@ -5,7 +5,7 @@ * * IPv4 Forwarding Information Base: FIB frontend. * - * Version: $Id: fib_frontend.c,v 1.24 2001/05/13 18:14:46 davem Exp $ + * Version: $Id: fib_frontend.c,v 1.25 2001/05/29 22:16:25 davem Exp $ * * Authors: Alexey Kuznetsov, * @@ -236,8 +236,7 @@ if (res.type != RTN_UNICAST) goto e_inval_res; *spec_dst = FIB_RES_PREFSRC(res); - if (itag) - fib_combine_itag(itag, &res); + fib_combine_itag(itag, &res); #ifdef CONFIG_IP_ROUTE_MULTIPATH if (FIB_RES_DEV(res) == dev || res.fi->fib_nhs > 1) #else diff -u --recursive --new-file v2.4.5/linux/net/ipv4/ip_output.c linux/net/ipv4/ip_output.c --- v2.4.5/linux/net/ipv4/ip_output.c Thu Apr 12 12:11:39 2001 +++ linux/net/ipv4/ip_output.c Tue Jun 5 18:11:42 2001 @@ -5,7 +5,7 @@ * * The Internet Protocol (IP) output module. * - * Version: $Id: ip_output.c,v 1.91 2001/03/29 06:25:55 davem Exp $ + * Version: $Id: ip_output.c,v 1.93 2001/06/01 14:59:31 davem Exp $ * * Authors: Ross Biro, * Fred N. van Kempen, @@ -499,7 +499,7 @@ * Begin outputting the bytes. */ - id = (sk ? sk->protinfo.af_inet.id++ : 0); + id = sk->protinfo.af_inet.id++; do { char *data; @@ -848,6 +848,7 @@ offset += len; #ifdef CONFIG_NETFILTER + skb2->nfmark = skb->nfmark; /* Connection association is same as pre-frag packet */ skb2->nfct = skb->nfct; nf_conntrack_get(skb2->nfct); diff -u --recursive --new-file v2.4.5/linux/net/ipv4/netfilter/ipfwadm_core.c linux/net/ipv4/netfilter/ipfwadm_core.c --- v2.4.5/linux/net/ipv4/netfilter/ipfwadm_core.c Fri Aug 4 18:18:49 2000 +++ linux/net/ipv4/netfilter/ipfwadm_core.c Tue Jun 5 18:11:42 2001 @@ -20,7 +20,7 @@ * license in recognition of the original copyright. * -- Alan Cox. * - * $Id: ipfwadm_core.c,v 1.4 2000/07/26 01:04:21 davem Exp $ + * $Id: ipfwadm_core.c,v 1.5 2001/06/01 14:56:53 davem Exp $ * * Ported from BSD to Linux, * Alan Cox 22/Nov/1994. @@ -515,7 +515,7 @@ } continue; /* Mismatch */ - ifa_ok: + ifa_ok:; } /* diff -u --recursive --new-file v2.4.5/linux/net/ipv4/netfilter/ipt_REJECT.c linux/net/ipv4/netfilter/ipt_REJECT.c --- v2.4.5/linux/net/ipv4/netfilter/ipt_REJECT.c Fri Apr 27 14:15:01 2001 +++ linux/net/ipv4/netfilter/ipt_REJECT.c Tue Jun 5 18:11:42 2001 @@ -309,9 +309,9 @@ break; case IPT_TCP_RESET: send_reset(*pskb, hooknum == NF_IP_LOCAL_IN); - break; case IPT_ICMP_ECHOREPLY: /* Doesn't happen. */ + break; } return NF_DROP; diff -u --recursive --new-file v2.4.5/linux/net/ipv4/tcp_input.c linux/net/ipv4/tcp_input.c --- v2.4.5/linux/net/ipv4/tcp_input.c Fri May 25 18:28:55 2001 +++ linux/net/ipv4/tcp_input.c Tue Jun 5 18:11:43 2001 @@ -5,7 +5,7 @@ * * Implementation of the Transmission Control Protocol(TCP). * - * Version: $Id: tcp_input.c,v 1.231 2001/05/22 05:15:16 davem Exp $ + * Version: $Id: tcp_input.c,v 1.232 2001/05/24 22:32:49 davem Exp $ * * Authors: Ross Biro, * Fred N. van Kempen, @@ -2611,10 +2611,10 @@ if (!after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt)) { /* A retransmit, 2nd most common case. Force an immediate ack. */ NET_INC_STATS_BH(DelayedACKLost); - tcp_enter_quickack_mode(tp); tcp_dsack_set(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq); out_of_window: + tcp_enter_quickack_mode(tp); tcp_schedule_ack(tp); drop: __kfree_skb(skb); diff -u --recursive --new-file v2.4.5/linux/net/irda/irnet/irnet.h linux/net/irda/irnet/irnet.h --- v2.4.5/linux/net/irda/irnet/irnet.h Fri May 25 18:28:55 2001 +++ linux/net/irda/irnet/irnet.h Tue Jun 5 18:06:52 2001 @@ -168,6 +168,23 @@ * (but PPP doesn't read the MTU value :-() * o Declare hashbin HB_NOLOCK instead of HB_LOCAL to avoid * disabling and enabling irq twice + * + * v6 - 31/05/01 - Jean II + * o Print source address in Found, Discovery, Expiry & Request events + * o Print requested source address in /proc/net/irnet + * o Change control channel input. Allow multiple commands in one line. + * o Add saddr command to change ap->rsaddr (and use that in IrDA) + * --- + * o Make the IrDA connection procedure totally asynchronous. + * Heavy rewrite of the IAS query code and the whole connection + * procedure. Now, irnet_connect() no longer need to be called from + * a process context... + * o Enable IrDA connect retries in ppp_irnet_send(). The good thing + * is that IrDA connect retries are directly driven by PPP LCP + * retries (we retry for each LCP packet), so that everything + * is transparently controlled from pppd lcp-max-configure. + * o Add ttp_connect flag to prevent rentry on the connect procedure + * o Test and fixups to eliminate side effects of retries */ /***************************** INCLUDES *****************************/ @@ -181,6 +198,8 @@ #include #include #include +#include +#include /* isspace() */ #include #include @@ -214,7 +233,7 @@ /* PPP side of the business */ #define BLOCK_WHEN_CONNECT /* Block packets when connecting */ -#undef CONNECT_IN_SEND /* Will crash hard your box... */ +#define CONNECT_IN_SEND /* Retry IrDA connection procedure */ #undef FLUSH_TO_PPP /* Not sure about this one, let's play safe */ #undef SECURE_DEVIRNET /* Bah... */ @@ -249,9 +268,11 @@ #define DEBUG_IRDA_SERV_INFO 0 /* various info */ #define DEBUG_IRDA_SERV_ERROR 1 /* problems */ #define DEBUG_IRDA_TCB_TRACE 0 /* IRDA IrTTP callbacks */ -#define DEBUG_IRDA_OCB_TRACE 0 /* IRDA other callbacks */ #define DEBUG_IRDA_CB_INFO 0 /* various info */ #define DEBUG_IRDA_CB_ERROR 1 /* problems */ +#define DEBUG_IRDA_OCB_TRACE 0 /* IRDA other callbacks */ +#define DEBUG_IRDA_OCB_INFO 0 /* various info */ +#define DEBUG_IRDA_OCB_ERROR 1 /* problems */ #define DEBUG_ASSERT 0 /* Verify all assertions */ @@ -351,13 +372,15 @@ /* ------------------------ IrTTP part ------------------------ */ /* We create a pseudo "socket" over the IrDA tranport */ int ttp_open; /* Set when IrTTP is ready */ + int ttp_connect; /* Set when IrTTP is connecting */ struct tsap_cb * tsap; /* IrTTP instance (the connection) */ char rname[NICKNAME_MAX_LEN + 1]; /* IrDA nickname of destination */ - __u32 raddr; /* Requested peer IrDA address */ - __u32 saddr; /* my local IrDA address */ + __u32 rdaddr; /* Requested peer IrDA address */ + __u32 rsaddr; /* Requested local IrDA address */ __u32 daddr; /* actual peer IrDA address */ + __u32 saddr; /* my local IrDA address */ __u8 dtsap_sel; /* Remote TSAP selector */ __u8 stsap_sel; /* Local TSAP selector */ @@ -374,17 +397,14 @@ int nslots; /* Number of slots for discovery */ struct iriap_cb * iriap; /* Used to query remote IAS */ - wait_queue_head_t query_wait; /* Wait for the answer to a query */ - struct ias_value * ias_result; /* Result of remote IAS query */ int errno; /* status of the IAS query */ - /* ---------------------- Optional parts ---------------------- */ -#ifdef INITIAL_DISCOVERY - /* Stuff used to dump discovery log */ + /* -------------------- Discovery log part -------------------- */ + /* Used by initial discovery on the control channel + * and by irnet_discover_daddr_and_lsap_sel() */ struct irda_device_info *discoveries; /* Copy of the discovery log */ int disco_index; /* Last read in the discovery log */ int disco_number; /* Size of the discovery log */ -#endif /* INITIAL_DISCOVERY */ } irnet_socket; @@ -411,8 +431,9 @@ { irnet_event event; int unit; - __u32 addr; - char name[NICKNAME_MAX_LEN + 1]; + __u32 saddr; + __u32 daddr; + char name[NICKNAME_MAX_LEN + 1]; /* 21 + 1 */ } irnet_log; /* diff -u --recursive --new-file v2.4.5/linux/net/irda/irnet/irnet_irda.c linux/net/irda/irnet/irnet_irda.c --- v2.4.5/linux/net/irda/irnet/irnet_irda.c Fri May 25 18:28:55 2001 +++ linux/net/irda/irnet/irnet_irda.c Tue Jun 5 18:06:52 2001 @@ -8,7 +8,6 @@ * and exchange frames with IrTTP. */ -#include #include "irnet_irda.h" /* Private header */ /************************* CONTROL CHANNEL *************************/ @@ -27,14 +26,15 @@ static void irnet_post_event(irnet_socket * ap, irnet_event event, - __u32 addr, + __u32 saddr, + __u32 daddr, char * name) { unsigned long flags; /* For spinlock */ int index; /* In the log */ - DENTER(CTRL_TRACE, "(ap=0x%X, event=%d, addr=%08x, name=``%s'')\n", - (unsigned int) ap, event, addr, name); + DENTER(CTRL_TRACE, "(ap=0x%X, event=%d, daddr=%08x, name=``%s'')\n", + (unsigned int) ap, event, daddr, name); /* Protect this section via spinlock. * Note : as we are the only event producer, we only need to exclude @@ -45,7 +45,8 @@ /* Copy the event in the log */ index = irnet_events.index; irnet_events.log[index].event = event; - irnet_events.log[index].addr = addr; + irnet_events.log[index].daddr = daddr; + irnet_events.log[index].saddr = saddr; /* Try to copy IrDA nickname */ if(name) strcpy(irnet_events.log[index].name, name); @@ -129,6 +130,92 @@ /*------------------------------------------------------------------*/ /* + * Function irnet_ias_to_tsap (self, result, value) + * + * Examine an IAS object and extract TSAP + * + * We do an IAP query to find the TSAP associated with the IrNET service. + * When IrIAP pass us the result of the query, this function look at + * the return values to check for failures and extract the TSAP if + * possible. + * Also deallocate value + * The failure is in self->errno + * Return TSAP or -1 + */ +static inline __u8 +irnet_ias_to_tsap(irnet_socket * self, + int result, + struct ias_value * value) +{ + __u8 dtsap_sel = 0; /* TSAP we are looking for */ + + DENTER(IRDA_SR_TRACE, "(self=0x%X)\n", (unsigned int) self); + + /* By default, no error */ + self->errno = 0; + + /* Check if request succeeded */ + switch(result) + { + /* Standard errors : service not available */ + case IAS_CLASS_UNKNOWN: + case IAS_ATTRIB_UNKNOWN: + DEBUG(IRDA_SR_INFO, "IAS object doesn't exist ! (%d)\n", result); + self->errno = -EADDRNOTAVAIL; + break; + + /* Other errors, most likely IrDA stack failure */ + default : + DEBUG(IRDA_SR_INFO, "IAS query failed ! (%d)\n", result); + self->errno = -EHOSTUNREACH; + break; + + /* Success : we got what we wanted */ + case IAS_SUCCESS: + break; + } + + /* Check what was returned to us */ + if(value != NULL) + { + /* What type of argument have we got ? */ + switch(value->type) + { + case IAS_INTEGER: + DEBUG(IRDA_SR_INFO, "result=%d\n", value->t.integer); + if(value->t.integer != -1) + /* Get the remote TSAP selector */ + dtsap_sel = value->t.integer; + else + self->errno = -EADDRNOTAVAIL; + break; + default: + self->errno = -EADDRNOTAVAIL; + DERROR(IRDA_SR_ERROR, "bad type ! (0x%X)\n", value->type); + break; + } + + /* Cleanup */ + irias_delete_value(value); + } + else /* value == NULL */ + { + /* Nothing returned to us - usually result != SUCCESS */ + if(!(self->errno)) + { + DERROR(IRDA_SR_ERROR, + "IrDA bug : result == SUCCESS && value == NULL\n"); + self->errno = -EHOSTUNREACH; + } + } + DEXIT(IRDA_SR_TRACE, "\n"); + + /* Return the TSAP */ + return(dtsap_sel); +} + +/*------------------------------------------------------------------*/ +/* * Function irnet_find_lsap_sel (self) * * Try to lookup LSAP selector in remote LM-IAS @@ -139,7 +226,7 @@ * Note that in some case, the query fail even before we go to sleep, * creating some races... */ -static int +static inline int irnet_find_lsap_sel(irnet_socket * self) { DENTER(IRDA_SR_TRACE, "(self=0x%X)\n", (unsigned int) self); @@ -155,48 +242,101 @@ self->errno = -EHOSTUNREACH; /* Query remote LM-IAS */ - iriap_getvaluebyclass_request(self->iriap, self->saddr, self->daddr, + iriap_getvaluebyclass_request(self->iriap, self->rsaddr, self->daddr, IRNET_SERVICE_NAME, IRNET_IAS_VALUE); - /* Wait for answer (if not already failed) */ - if(self->iriap != NULL) - interruptible_sleep_on(&self->query_wait); - /* Check what happened */ - if(self->errno) + /* The above request is non-blocking. + * After a while, IrDA will call us back in irnet_getvalue_confirm() + * We will then call irnet_ias_to_tsap() and finish the + * connection procedure */ + + DEXIT(IRDA_SR_TRACE, "\n"); + return 0; +} + +/*------------------------------------------------------------------*/ +/* + * Function irnet_connect_tsap (self) + * + * Initialise the TTP socket and initiate TTP connection + * + */ +static inline int +irnet_connect_tsap(irnet_socket * self) +{ + int err; + + DENTER(IRDA_SR_TRACE, "(self=0x%X)\n", (unsigned int) self); + + /* Open a local TSAP (an IrTTP instance) */ + err = irnet_open_tsap(self); + if(err != 0) { - DEBUG(IRDA_SR_INFO, "IAS query failed! (%d)\n", self->errno); - /* Requested object/attribute doesn't exist */ - if((self->errno == IAS_CLASS_UNKNOWN) || - (self->errno == IAS_ATTRIB_UNKNOWN)) - return (-EADDRNOTAVAIL); - else - return (-EHOSTUNREACH); + self->ttp_connect = 0; + DERROR(IRDA_SR_ERROR, "connect aborted!\n"); + return(err); } - /* Get the remote TSAP selector */ - switch(self->ias_result->type) + /* Connect to remote device */ + err = irttp_connect_request(self->tsap, self->dtsap_sel, + self->rsaddr, self->daddr, NULL, + self->max_sdu_size_rx, NULL); + if(err != 0) { - case IAS_INTEGER: - DEBUG(IRDA_SR_INFO, "result=%d\n", self->ias_result->t.integer); - if(self->ias_result->t.integer != -1) - self->dtsap_sel = self->ias_result->t.integer; - else - self->dtsap_sel = 0; - break; - default: - self->dtsap_sel = 0; - DERROR(IRDA_SR_ERROR, "bad type ! (0x%X)\n", self->ias_result->type); - break; + self->ttp_connect = 0; + DERROR(IRDA_SR_ERROR, "connect aborted!\n"); + return(err); } - /* Cleanup */ - if(self->ias_result) - irias_delete_value(self->ias_result); + + /* The above call is non-blocking. + * After a while, the IrDA stack will either call us back in + * irnet_connect_confirm() or irnet_disconnect_indication() + * See you there ;-) */ DEXIT(IRDA_SR_TRACE, "\n"); - if(self->dtsap_sel) - return 0; + return(err); +} + +/*------------------------------------------------------------------*/ +/* + * Function irnet_discover_next_daddr (self) + * + * Query the IrNET TSAP of the next device in the log. + * + * Used in the TSAP discovery procedure. + */ +static inline int +irnet_discover_next_daddr(irnet_socket * self) +{ + /* Close the last instance of IrIAP, and open a new one. + * We can't reuse the IrIAP instance in the IrIAP callback */ + if(self->iriap) + { + iriap_close(self->iriap); + self->iriap = NULL; + } + /* Create a new IAP instance */ + self->iriap = iriap_open(LSAP_ANY, IAS_CLIENT, self, + irnet_discovervalue_confirm); - return -EADDRNOTAVAIL; + /* Next discovery - before the call to avoid races */ + self->disco_index++; + + /* Check if we have one more address to try */ + if(self->disco_index < self->disco_number) + { + /* Query remote LM-IAS */ + iriap_getvaluebyclass_request(self->iriap, + self->discoveries[self->disco_index].saddr, + self->discoveries[self->disco_index].daddr, + IRNET_SERVICE_NAME, IRNET_IAS_VALUE); + /* The above request is non-blocking. + * After a while, IrDA will call us back in irnet_discovervalue_confirm() + * We will then call irnet_ias_to_tsap() and come back here again... */ + return(0); + } + else + return(1); } /*------------------------------------------------------------------*/ @@ -205,100 +345,67 @@ * * This try to find a device with the requested service. * + * Initiate a TSAP discovery procedure. * It basically look into the discovery log. For each address in the list, * it queries the LM-IAS of the device to find if this device offer * the requested service. * If there is more than one node supporting the service, we complain * to the user (it should move devices around). - * The, we set both the destination address and the lsap selector to point - * on the service on the unique device we have found. + * If we find one node which have the requested TSAP, we connect to it. * - * Note : this function fails if there is more than one device in range, - * because IrLMP doesn't disconnect the LAP when the last LSAP is closed. - * Moreover, we would need to wait the LAP disconnection... + * This function just start the whole procedure. It request the discovery + * log and submit the first IAS query. + * The bulk of the job is handled in irnet_discovervalue_confirm() + * + * Note : this procedure fails if there is more than one device in range + * on the same dongle, because IrLMP doesn't disconnect the LAP when the + * last LSAP is closed. Moreover, we would need to wait the LAP + * disconnection... */ static inline int irnet_discover_daddr_and_lsap_sel(irnet_socket * self) { - struct irda_device_info *discoveries; /* Copy of the discovery log */ - int number; /* Number of nodes in the log */ - int i; - int err = -ENETUNREACH; - __u32 daddr = DEV_ADDR_ANY; /* Address we found the service on */ - __u8 dtsap_sel = 0x0; /* TSAP associated with it */ + int ret; DENTER(IRDA_SR_TRACE, "(self=0x%X)\n", (unsigned int) self); - /* Ask lmp for the current discovery log - * Note : we have to use irlmp_get_discoveries(), as opposed - * to play with the cachelog directly, because while we are - * making our ias query, le log might change... */ - discoveries = irlmp_get_discoveries(&number, self->mask); - /* Check if the we got some results */ - if (discoveries == NULL) - DRETURN(-ENETUNREACH, IRDA_SR_INFO, "Cachelog empty...\n"); + /* Ask lmp for the current discovery log */ + self->discoveries = irlmp_get_discoveries(&self->disco_number, self->mask); - /* - * Now, check all discovered devices (if any), and connect - * client only about the services that the client is - * interested in... - */ - for(i = 0; i < number; i++) + /* Check if the we got some results */ + if(self->discoveries == NULL) { - /* Try the address in the log */ - self->daddr = discoveries[i].daddr; - self->saddr = 0x0; - DEBUG(IRDA_SR_INFO, "trying daddr = %08x\n", self->daddr); - - /* Query remote LM-IAS for this service */ - err = irnet_find_lsap_sel(self); - switch(err) - { - case 0: - /* We found the requested service */ - if(daddr != DEV_ADDR_ANY) - { - DEBUG(IRDA_SR_INFO, "More than one device in range supports IrNET...\n"); - } - else - { - /* First time we found that one, save it ! */ - daddr = self->daddr; - dtsap_sel = self->dtsap_sel; - } - break; - case -EADDRNOTAVAIL: - /* Requested service simply doesn't exist on this node */ - break; - default: - /* Something bad did happen :-( */ - DERROR(IRDA_SR_ERROR, "unexpected IAS query failure\n"); - self->daddr = DEV_ADDR_ANY; - kfree(discoveries); - return(-EHOSTUNREACH); - break; - } + self->disco_number = -1; + self->ttp_connect = 0; + DRETURN(-ENETUNREACH, IRDA_SR_INFO, "No Cachelog...\n"); } - /* Cleanup our copy of the discovery log */ - kfree(discoveries); + DEBUG(IRDA_SR_INFO, "Got the log (0x%X), size is %d\n", + (unsigned int) self->discoveries, self->disco_number); - /* Check out what we found */ - if(daddr == DEV_ADDR_ANY) + /* Start with the first discovery */ + self->disco_index = -1; + self->daddr = DEV_ADDR_ANY; + + /* This will fail if the log is empty - this is non-blocking */ + ret = irnet_discover_next_daddr(self); + if(ret) { - self->daddr = DEV_ADDR_ANY; - DEXIT(IRDA_SR_INFO, "cannot discover IrNET in any device !!!\n"); - return(-EADDRNOTAVAIL); + /* Close IAP */ + iriap_close(self->iriap); + self->iriap = NULL; + + /* Cleanup our copy of the discovery log */ + kfree(self->discoveries); + self->discoveries = NULL; + + self->ttp_connect = 0; + DRETURN(-ENETUNREACH, IRDA_SR_INFO, "Cachelog empty...\n"); } - /* Revert back to discovered device & service */ - self->daddr = daddr; - self->saddr = 0x0; - self->dtsap_sel = dtsap_sel; + /* Follow me in irnet_discovervalue_confirm() */ - DEBUG(IRDA_SR_INFO, "discovered IrNET at address %08x\n", self->daddr); DEXIT(IRDA_SR_TRACE, "\n"); - - return 0; + return(0); } /*------------------------------------------------------------------*/ @@ -367,13 +474,13 @@ self->magic = IRNET_MAGIC; /* Paranoia */ - init_waitqueue_head(&self->query_wait); - self->ttp_open = 0; /* Prevent higher layer from accessing IrTTP */ + self->ttp_connect = 0; /* Not connecting yet */ self->rname[0] = '\0'; /* May be set via control channel */ - self->raddr = DEV_ADDR_ANY; /* May be set via control channel */ + self->rdaddr = DEV_ADDR_ANY; /* May be set via control channel */ + self->rsaddr = 0x0; /* May be set via control channel */ self->daddr = DEV_ADDR_ANY; /* Until we get connected */ - self->saddr = 0x0; /* so IrLMP assign us any link */ + self->saddr = 0x0; /* Until we get connected */ self->max_sdu_size_rx = TTP_SAR_UNBOUND; /* Register as a client with IrLMP */ @@ -395,6 +502,12 @@ * o convert device name to an address * o find the socket number (dlsap) * o Establish the connection + * + * Note : We no longer mimic af_irda. The IAS query for finding the TSAP + * is done asynchronously, like the TTP connection. This allow us to + * call this function from any context (not only process). + * The downside is that following what's happening in there is tricky + * because it involve various functions all over the place... */ int irda_irnet_connect(irnet_socket * self) @@ -406,8 +519,11 @@ /* Check if we have opened a local TSAP : * If we have already opened a TSAP, it means that either we are already * connected or in the process of doing so... */ - if(self->tsap != NULL) + if(self->ttp_connect) DRETURN(-EBUSY, IRDA_SOCK_INFO, "Already connecting...\n"); + self->ttp_connect = 1; + if((self->iriap != NULL) || (self->tsap != NULL)) + DERROR(IRDA_SOCK_ERROR, "Socket not cleaned up...\n"); /* Insert ourselves in the hashbin so that the IrNET server can find us. * Notes : 4th arg is string of 32 char max and must be null terminated @@ -423,41 +539,34 @@ } /* If we don't have anything (no address, no name) */ - if((self->raddr == DEV_ADDR_ANY) && (self->rname[0] == '\0')) + if((self->rdaddr == DEV_ADDR_ANY) && (self->rname[0] == '\0')) { /* Try to find a suitable address */ - if((err = irnet_discover_daddr_and_lsap_sel(self)) != 0) + if((err = irnet_discover_daddr_and_lsap_sel(self)) != 0) DRETURN(err, IRDA_SOCK_INFO, "auto-connect failed!\n"); + /* In most cases, the call above is non-blocking */ } else { /* If we have only the name (no address), try to get an address */ - if(self->raddr == DEV_ADDR_ANY) + if(self->rdaddr == DEV_ADDR_ANY) { if((err = irnet_dname_to_daddr(self)) != 0) - DRETURN(err, IRDA_SOCK_INFO, "name-connect failed!\n"); + DRETURN(err, IRDA_SOCK_INFO, "name connect failed!\n"); } else /* Use the requested destination address */ - self->daddr = self->raddr; + self->daddr = self->rdaddr; /* Query remote LM-IAS to find LSAP selector */ - if((err = irnet_find_lsap_sel(self)) != 0) - DRETURN(err, IRDA_SOCK_INFO, "connect failed!\n"); + irnet_find_lsap_sel(self); + /* The above call is non blocking */ } - DEBUG(IRDA_SOCK_INFO, "daddr = %08x, lsap = %d, starting IrTTP connection\n", - self->daddr, self->dtsap_sel); - - /* Open a local TSAP (an IrTTP instance) */ - err = irnet_open_tsap(self); - DABORT(err != 0, err, IRDA_SOCK_ERROR, "connect aborted!\n"); - - /* Connect to remote device */ - err = irttp_connect_request(self->tsap, self->dtsap_sel, - self->saddr, self->daddr, NULL, - self->max_sdu_size_rx, NULL); - DABORT(err != 0, err, IRDA_SOCK_ERROR, "connect aborted!\n"); + /* At this point, we are waiting for the IrDA stack to call us back, + * or we have already failed. + * We will finish the connection procedure in irnet_connect_tsap(). + */ DEXIT(IRDA_SOCK_TRACE, "\n"); return(0); } @@ -494,8 +603,21 @@ irlmp_unregister_client(self->ckey); /* Unregister with LM-IAS */ - if(self->iriap) - iriap_close(self->iriap); + if(self->iriap) + { + iriap_close(self->iriap); + self->iriap = NULL; + } + + /* If we were connected, post a message */ + if(self->ttp_open) + { + /* Note : as the disconnect comes from ppp_generic, the unit number + * doesn't exist anymore when we post the event, so we need to pass + * NULL as the first arg... */ + irnet_post_event(NULL, IRNET_DISCONNECT_TO, + self->saddr, self->daddr, self->rname); + } /* Prevent higher layer from accessing IrTTP */ self->ttp_open = 0; @@ -507,10 +629,6 @@ irttp_disconnect_request(self->tsap, NULL, P_NORMAL); irttp_close_tsap(self->tsap); self->tsap = NULL; - /* Note : as the disconnect comes from ppp_generic, the unit number - * doesn't exist anymore when we post the event, so we need to pass - * NULL as the first arg... */ - irnet_post_event(NULL, IRNET_DISCONNECT_TO, self->daddr, self->rname); } self->stsap_sel = 0; @@ -591,8 +709,9 @@ DENTER(IRDA_SERV_TRACE, "(self=0x%X)\n", (unsigned int) self); - /* Get the address of the requester */ + /* Get the addresses of the requester */ self->daddr = irttp_get_daddr(self->tsap); + self->saddr = irttp_get_saddr(self->tsap); /* Try to get the IrDA nickname of the requester */ err = irnet_daddr_to_dname(self); @@ -621,7 +740,7 @@ while(new !=(irnet_socket *) NULL) { /* Does it have the same address ? */ - if((new->raddr == self->daddr) || (new->daddr == self->daddr)) + if((new->rdaddr == self->daddr) || (new->daddr == self->daddr)) { /* Yes !!! Get it.. */ DEBUG(IRDA_SERV_INFO, "Socket 0x%X matches daddr %#08x.\n", @@ -639,7 +758,7 @@ while(new !=(irnet_socket *) NULL) { /* Is it available ? */ - if(!(new->ttp_open) && (new->raddr == DEV_ADDR_ANY) && + if(!(new->ttp_open) && (new->rdaddr == DEV_ADDR_ANY) && (new->rname[0] == '\0') && (new->ppp_open)) { /* Yes !!! Get it.. */ @@ -703,6 +822,7 @@ /* Allow PPP to send its junk over the new socket... */ new->ttp_open = 1; + new->ttp_connect = 0; #ifdef CONNECT_INDIC_KICK /* As currently we don't packets in ppp_irnet_send(), this is not needed... * Also, not doing it give IrDA a chance to finish the setup properly @@ -711,7 +831,8 @@ #endif /* CONNECT_INDIC_KICK */ /* Notify the control channel */ - irnet_post_event(new, IRNET_CONNECT_FROM, new->daddr, self->rname); + irnet_post_event(new, IRNET_CONNECT_FROM, + new->saddr, new->daddr, self->rname); DEXIT(IRDA_SERV_TRACE, "\n"); return 0; @@ -740,13 +861,14 @@ irttp_disconnect_request(self->tsap, NULL, P_NORMAL); #endif /* FAIL_SEND_DISCONNECT */ + /* Notify the control channel (see irnet_find_socket()) */ + irnet_post_event(NULL, IRNET_REQUEST_FROM, + self->saddr, self->daddr, self->rname); + /* Clean up the server to keep it in listen state */ self->tsap->dtsap_sel = self->tsap->lsap->dlsap_sel = LSAP_ANY; self->tsap->lsap->lsap_state = LSAP_DISCONNECTED; - /* Notify the control channel */ - irnet_post_event(NULL, IRNET_REQUEST_FROM, self->daddr, self->rname); - DEXIT(IRDA_SERV_TRACE, "\n"); return; } @@ -934,14 +1056,17 @@ /* If we were active, notify the control channel */ if(self->ttp_open) - irnet_post_event(self, IRNET_DISCONNECT_FROM, self->daddr, self->rname); + irnet_post_event(self, IRNET_DISCONNECT_FROM, + self->saddr, self->daddr, self->rname); else /* If we were trying to connect, notify the control channel */ if((self->tsap) && (self != &irnet_server.s)) - irnet_post_event(self, IRNET_NOANSWER_FROM, self->daddr, self->rname); + irnet_post_event(self, IRNET_NOANSWER_FROM, + self->saddr, self->daddr, self->rname); /* Prevent higher layer from accessing IrTTP */ self->ttp_open = 0; + self->ttp_connect = 0; /* Close our IrTTP connection */ if((self->tsap) && (self != &irnet_server.s)) @@ -1001,6 +1126,7 @@ self->saddr = irttp_get_saddr(self->tsap); /* Allow higher layer to access IrTTP */ + self->ttp_connect = 0; self->ttp_open = 1; /* Give a kick in the ass of ppp_generic so that he sends us some data */ ppp_output_wakeup(&self->chan); @@ -1021,7 +1147,8 @@ kfree_skb(skb); /* Notify the control channel */ - irnet_post_event(self, IRNET_CONNECT_TO, self->daddr, self->rname); + irnet_post_event(self, IRNET_CONNECT_TO, + self->saddr, self->daddr, self->rname); DEXIT(IRDA_TCB_TRACE, "\n"); } @@ -1081,7 +1208,6 @@ LOCK_STATUS lock) { irnet_socket * self = (irnet_socket *) instance; - LOCAL_FLOW oldflow = self->tx_flow; DENTER(IRDA_TCB_TRACE, "(self=0x%X)\n", (unsigned int) self); DASSERT(self != NULL, , IRDA_CB_ERROR, "Self is NULL !!!\n"); @@ -1090,7 +1216,8 @@ switch(link) { case STATUS_NO_ACTIVITY: - irnet_post_event(self, IRNET_BLOCKED_LINK, self->daddr, self->rname); + irnet_post_event(self, IRNET_BLOCKED_LINK, + self->saddr, self->daddr, self->rname); break; default: DEBUG(IRDA_CB_INFO, "Unknown status...\n"); @@ -1199,10 +1326,14 @@ /*------------------------------------------------------------------*/ /* - * Function irnet_getvalue_confirm (obj_id, value, priv) + * Function irnet_getvalue_confirm (result, obj_id, value, priv) * - * Got answer from remote LM-IAS, just pass object to requester... + * Got answer from remote LM-IAS, just connect * + * This is the reply to a IAS query we were doing to find the TSAP of + * the device we want to connect to. + * If we have found a valid TSAP, just initiate the TTP connection + * on this TSAP. */ static void irnet_getvalue_confirm(int result, @@ -1213,27 +1344,146 @@ irnet_socket * self = (irnet_socket *) priv; DENTER(IRDA_OCB_TRACE, "(self=0x%X)\n", (unsigned int) self); - DASSERT(self != NULL, , IRDA_CB_ERROR, "Self is NULL !!!\n"); + DASSERT(self != NULL, , IRDA_OCB_ERROR, "Self is NULL !!!\n"); /* We probably don't need to make any more queries */ iriap_close(self->iriap); self->iriap = NULL; - /* Check if request succeeded */ - if(result != IAS_SUCCESS) + /* Check if already connected (via irnet_connect_socket()) */ + if(self->ttp_open) { - DEBUG(IRDA_CB_INFO, "IAS query failed! (%d)\n", result); - self->errno = result; /* We really need it later */ + DERROR(IRDA_OCB_ERROR, "Socket already connected. Ouch !\n"); + return; } - else + + /* Post process the IAS reply */ + self->dtsap_sel = irnet_ias_to_tsap(self, result, value); + + /* If error, just go out */ + if(self->errno) + { + self->ttp_connect = 0; + DERROR(IRDA_OCB_ERROR, "IAS connect failed ! (0x%X)\n", self->errno); + return; + } + + DEBUG(IRDA_OCB_INFO, "daddr = %08x, lsap = %d, starting IrTTP connection\n", + self->daddr, self->dtsap_sel); + + /* Start up TTP - non blocking */ + irnet_connect_tsap(self); + + DEXIT(IRDA_OCB_TRACE, "\n"); +} + +/*------------------------------------------------------------------*/ +/* + * Function irnet_discovervalue_confirm (result, obj_id, value, priv) + * + * Handle the TSAP discovery procedure state machine. + * Got answer from remote LM-IAS, try next device + * + * We are doing a TSAP discovery procedure, and we got an answer to + * a IAS query we were doing to find the TSAP on one of the address + * in the discovery log. + * + * If we have found a valid TSAP for the first time, save it. If it's + * not the first time we found one, complain. + * + * If we have more addresses in the log, just initiate a new query. + * Note that those query may fail (see irnet_discover_daddr_and_lsap_sel()) + * + * Otherwise, wrap up the procedure (cleanup), check if we have found + * any device and connect to it. + */ +static void +irnet_discovervalue_confirm(int result, + __u16 obj_id, + struct ias_value *value, + void * priv) +{ + irnet_socket * self = (irnet_socket *) priv; + __u8 dtsap_sel; /* TSAP we are looking for */ + + DENTER(IRDA_OCB_TRACE, "(self=0x%X)\n", (unsigned int) self); + DASSERT(self != NULL, , IRDA_OCB_ERROR, "Self is NULL !!!\n"); + + /* Post process the IAS reply */ + dtsap_sel = irnet_ias_to_tsap(self, result, value); + + /* Have we got something ? */ + if(self->errno == 0) + { + /* We found the requested service */ + if(self->daddr != DEV_ADDR_ANY) + { + DERROR(IRDA_OCB_ERROR, "More than one device in range supports IrNET...\n"); + } + else + { + /* First time we found that one, save it ! */ + self->daddr = self->discoveries[self->disco_index].daddr; + self->dtsap_sel = dtsap_sel; + } + } + + /* If no failure */ + if((self->errno == -EADDRNOTAVAIL) || (self->errno == 0)) + { + int ret; + + /* Search the next node */ + ret = irnet_discover_next_daddr(self); + if(!ret) + { + /* In this case, the above request was non-blocking. + * We will return here after a while... */ + return; + } + /* In this case, we have processed the last discovery item */ + } + + /* No more queries to be done (failure or last one) */ + + /* We probably don't need to make any more queries */ + iriap_close(self->iriap); + self->iriap = NULL; + + /* No more items : remove the log and signal termination */ + DEBUG(IRDA_OCB_INFO, "Cleaning up log (0x%X)\n", + (unsigned int) self->discoveries); + if(self->discoveries != NULL) + { + /* Cleanup our copy of the discovery log */ + kfree(self->discoveries); + self->discoveries = NULL; + } + self->disco_number = -1; + + /* Check out what we found */ + if(self->daddr == DEV_ADDR_ANY) { - /* Pass the object to the caller (so the caller must delete it) */ - self->ias_result = value; - self->errno = 0; + self->daddr = DEV_ADDR_ANY; + self->ttp_connect = 0; + DEXIT(IRDA_OCB_TRACE, ": cannot discover IrNET in any device !!!\n"); + return; } - /* Wake up any processes waiting for result */ - wake_up_interruptible(&self->query_wait); + /* Check if already connected (via irnet_connect_socket()) */ + if(self->ttp_open) + { + DERROR(IRDA_OCB_ERROR, "Socket already connected. Ouch !\n"); + return; + } + + /* We have a valid address - just connect */ + + DEBUG(IRDA_OCB_INFO, "daddr = %08x, lsap = %d, starting IrTTP connection\n", + self->daddr, self->dtsap_sel); + + /* Start up TTP - non blocking */ + irnet_connect_tsap(self); DEXIT(IRDA_OCB_TRACE, "\n"); } @@ -1268,7 +1518,7 @@ irnet_socket * self = &irnet_server.s; DENTER(IRDA_OCB_TRACE, "(self=0x%X)\n", (unsigned int) self); - DASSERT(priv == &irnet_server, , IRDA_CB_ERROR, + DASSERT(priv == &irnet_server, , IRDA_OCB_ERROR, "Invalid instance (0x%X) !!!\n", (unsigned int) priv); /* Check if node is discovered is a new one or an old one. @@ -1280,12 +1530,12 @@ return; /* Too old, not interesting -> goodbye */ } - DEBUG(IRDA_CB_INFO, "Discovered new IrNET/IrLAN node %s...\n", + DEBUG(IRDA_OCB_INFO, "Discovered new IrNET/IrLAN node %s...\n", discovery->nickname); /* Notify the control channel */ - irnet_post_event(NULL, IRNET_DISCOVER, discovery->daddr, - discovery->nickname); + irnet_post_event(NULL, IRNET_DISCOVER, + discovery->saddr, discovery->daddr, discovery->nickname); DEXIT(IRDA_OCB_TRACE, "\n"); } @@ -1306,15 +1556,15 @@ irnet_socket * self = &irnet_server.s; DENTER(IRDA_OCB_TRACE, "(self=0x%X)\n", (unsigned int) self); - DASSERT(priv == &irnet_server, , IRDA_CB_ERROR, + DASSERT(priv == &irnet_server, , IRDA_OCB_ERROR, "Invalid instance (0x%X) !!!\n", (unsigned int) priv); - DEBUG(IRDA_CB_INFO, "IrNET/IrLAN node %s expired...\n", + DEBUG(IRDA_OCB_INFO, "IrNET/IrLAN node %s expired...\n", expiry->nickname); /* Notify the control channel */ - irnet_post_event(NULL, IRNET_EXPIRE, expiry->daddr, - expiry->nickname); + irnet_post_event(NULL, IRNET_EXPIRE, + expiry->saddr, expiry->daddr, expiry->nickname); DEXIT(IRDA_OCB_TRACE, "\n"); } @@ -1370,7 +1620,8 @@ /* First, get the requested configuration */ len += sprintf(buf+len, "Requested IrDA name: \"%s\", ", self->rname); - len += sprintf(buf+len, "addr: %08x\n", self->raddr); + len += sprintf(buf+len, "daddr: %08x, ", self->rdaddr); + len += sprintf(buf+len, "saddr: %08x\n", self->rsaddr); /* Second, get all the PPP info */ len += sprintf(buf+len, " PPP state: %s", @@ -1393,7 +1644,13 @@ if(self->tsap != NULL) state = "connecting"; else - state = "idle"; + if(self->iriap != NULL) + state = "searching"; + else + if(self->ttp_connect) + state = "weird"; + else + state = "idle"; len += sprintf(buf+len, "\n IrDA state: %s, ", state); len += sprintf(buf+len, "daddr: %08x, ", self->daddr); len += sprintf(buf+len, "stsap_sel: %02x, ", self->stsap_sel); diff -u --recursive --new-file v2.4.5/linux/net/irda/irnet/irnet_irda.h linux/net/irda/irnet/irnet_irda.h --- v2.4.5/linux/net/irda/irnet/irnet_irda.h Fri May 25 18:28:55 2001 +++ linux/net/irda/irnet/irnet_irda.h Tue Jun 5 18:06:52 2001 @@ -13,7 +13,6 @@ #define IRNET_IRDA_H /***************************** INCLUDES *****************************/ -#include /* Please add other headers in irnet.h */ #include "irnet.h" /* Module global include */ @@ -69,13 +68,22 @@ irnet_post_event(irnet_socket *, irnet_event, __u32, + __u32, char *); /* ----------------------- IRDA SUBROUTINES ----------------------- */ static inline int irnet_open_tsap(irnet_socket *); -static int +static inline __u8 + irnet_ias_to_tsap(irnet_socket *, + int, + struct ias_value *); +static inline int irnet_find_lsap_sel(irnet_socket *); static inline int + irnet_connect_tsap(irnet_socket *); +static inline int + irnet_discover_next_daddr(irnet_socket *); +static inline int irnet_discover_daddr_and_lsap_sel(irnet_socket *); static inline int irnet_dname_to_daddr(irnet_socket *); @@ -135,6 +143,11 @@ __u16, struct ias_value *, void *); +static void + irnet_discovervalue_confirm(int, + __u16, + struct ias_value *, + void *); #ifdef DISCOVERY_EVENTS static void irnet_discovery_indication(discovery_t *, diff -u --recursive --new-file v2.4.5/linux/net/irda/irnet/irnet_ppp.c linux/net/irda/irnet/irnet_ppp.c --- v2.4.5/linux/net/irda/irnet/irnet_ppp.c Fri May 25 18:28:55 2001 +++ linux/net/irda/irnet/irnet_ppp.c Tue Jun 5 18:06:52 2001 @@ -37,13 +37,15 @@ const char * buf, size_t count) { - char command[5 + NICKNAME_MAX_LEN + 2]; - int length = count; + char command[IRNET_MAX_COMMAND]; + char * start; /* Current command beeing processed */ + char * next; /* Next command to process */ + int length; /* Length of current command */ DENTER(CTRL_TRACE, "(ap=0x%X, count=%d)\n", (unsigned int) ap, count); /* Check for overflow... */ - DABORT(count > (5 + NICKNAME_MAX_LEN + 1), -ENOMEM, + DABORT(count >= IRNET_MAX_COMMAND, -ENOMEM, CTRL_ERROR, "Too much data !!!\n"); /* Get the data in the driver */ @@ -53,58 +55,110 @@ return -EFAULT; } - /* Strip out '\n' if needed, and safe terminate the string */ - if(command[length - 1] == '\0') - length--; - if(command[length - 1] == '\n') - length--; - command[length] = '\0'; - DEBUG(CTRL_INFO, "Command received is ``%s'' (%d-%d).\n", - command, length, count); - - /* Check if we recognised the command */ - /* First command : name */ - if(!strncmp(command, "name", 4)) - { - /* Copy the name only if is included and not "any" */ - if((length > 5) && (strcmp(command + 5, "any"))) + /* Safe terminate the string */ + command[count] = '\0'; + DEBUG(CTRL_INFO, "Command line received is ``%s'' (%d).\n", + command, count); + + /* Check every commands in the command line */ + next = command; + while(next != NULL) + { + /* Look at the next command */ + start = next; + + /* Scrap whitespaces before the command */ + while(isspace(*start)) + start++; + + /* ',' is our command separator */ + next = strchr(start, ','); + if(next) { - /* Copy the name for later reuse (including the '/0') */ - memcpy(ap->rname, command + 5, length - 5 + 1); + *next = '\0'; /* Terminate command */ + length = next - start; /* Length */ + next++; /* Skip the '\0' */ } else - ap->rname[0] = '\0'; - DEXIT(CTRL_TRACE, " - rname = ``%s''\n", ap->rname); - return(count); - } + length = strlen(start); - /* Second command : addr */ - if(!strncmp(command, "addr", 4)) - { - /* Copy the address only if is included and not "any" */ - if((length > 5) && (strcmp(command + 5, "any"))) + DEBUG(CTRL_INFO, "Found command ``%s'' (%d).\n", start, length); + + /* Check if we recognised one of the known command + * We can't use "switch" with strings, so hack with "continue" */ + + /* First command : name -> Requested IrDA nickname */ + if(!strncmp(start, "name", 4)) { - char * endp; - __u32 daddr; + /* Copy the name only if is included and not "any" */ + if((length > 5) && (strcmp(start + 5, "any"))) + { + /* Strip out trailing whitespaces */ + while(isspace(start[length - 1])) + length--; + + /* Copy the name for later reuse */ + memcpy(ap->rname, start + 5, length - 5); + ap->rname[length - 5] = '\0'; + } + else + ap->rname[0] = '\0'; + DEBUG(CTRL_INFO, "Got rname = ``%s''\n", ap->rname); - /* Convert argument to a number (last arg is the base) */ - daddr = simple_strtoul(command + 5, &endp, 16); - /* Has it worked ? (endp should be command + count) */ - DABORT(endp <= (command + 5), -EINVAL, - CTRL_ERROR, "Invalid address.\n"); - /* Save it */ - ap->raddr = daddr; + /* Restart the loop */ + continue; + } + + /* Second command : addr, daddr -> Requested IrDA destination address + * Also process : saddr -> Requested IrDA source address */ + if((!strncmp(start, "addr", 4)) || + (!strncmp(start, "daddr", 5)) || + (!strncmp(start, "saddr", 5))) + { + __u32 addr = DEV_ADDR_ANY; + + /* Copy the address only if is included and not "any" */ + if((length > 5) && (strcmp(start + 5, "any"))) + { + char * begp = start + 5; + char * endp; + + /* Scrap whitespaces before the command */ + while(isspace(*begp)) + begp++; + + /* Convert argument to a number (last arg is the base) */ + addr = simple_strtoul(begp, &endp, 16); + /* Has it worked ? (endp should be start + length) */ + DABORT(endp <= (start + 5), -EINVAL, + CTRL_ERROR, "Invalid address.\n"); + } + /* Which type of address ? */ + if(start[0] == 's') + { + /* Save it */ + ap->rsaddr = addr; + DEBUG(CTRL_INFO, "Got rsaddr = %08x\n", ap->rsaddr); + } + else + { + /* Save it */ + ap->rdaddr = addr; + DEBUG(CTRL_INFO, "Got rdaddr = %08x\n", ap->rdaddr); + } + + /* Restart the loop */ + continue; } - else - ap->raddr = DEV_ADDR_ANY; - DEXIT(CTRL_TRACE, " - raddr = %08x\n", ap->raddr); - return(count); - } - /* Other possible command : connect N (number of retries) */ + /* Other possible command : connect N (number of retries) */ - /* Failed... */ - DABORT(1, -EINVAL, CTRL_ERROR, "Not a recognised IrNET command.\n"); + /* No command matched -> Failed... */ + DABORT(1, -EINVAL, CTRL_ERROR, "Not a recognised IrNET command.\n"); + } + + /* Success : we have parsed all commands successfully */ + return(count); } #ifdef INITIAL_DISCOVERY @@ -157,9 +211,10 @@ if(ap->disco_index < ap->disco_number) { /* Write an event */ - sprintf(event, "Found %08x (%s)\n", + sprintf(event, "Found %08x (%s) behind %08x\n", ap->discoveries[ap->disco_index].daddr, - ap->discoveries[ap->disco_index].info); + ap->discoveries[ap->disco_index].info, + ap->discoveries[ap->disco_index].saddr); DEBUG(CTRL_INFO, "Writing discovery %d : %s\n", ap->disco_index, ap->discoveries[ap->disco_index].info); @@ -256,53 +311,56 @@ switch(irnet_events.log[ap->event_index].event) { case IRNET_DISCOVER: - sprintf(event, "Discovered %08x (%s)\n", - irnet_events.log[ap->event_index].addr, - irnet_events.log[ap->event_index].name); + sprintf(event, "Discovered %08x (%s) behind %08x\n", + irnet_events.log[ap->event_index].daddr, + irnet_events.log[ap->event_index].name, + irnet_events.log[ap->event_index].saddr); break; case IRNET_EXPIRE: - sprintf(event, "Expired %08x (%s)\n", - irnet_events.log[ap->event_index].addr, - irnet_events.log[ap->event_index].name); + sprintf(event, "Expired %08x (%s) behind %08x\n", + irnet_events.log[ap->event_index].daddr, + irnet_events.log[ap->event_index].name, + irnet_events.log[ap->event_index].saddr); break; case IRNET_CONNECT_TO: sprintf(event, "Connected to %08x (%s) on ppp%d\n", - irnet_events.log[ap->event_index].addr, + irnet_events.log[ap->event_index].daddr, irnet_events.log[ap->event_index].name, irnet_events.log[ap->event_index].unit); break; case IRNET_CONNECT_FROM: sprintf(event, "Connection from %08x (%s) on ppp%d\n", - irnet_events.log[ap->event_index].addr, + irnet_events.log[ap->event_index].daddr, irnet_events.log[ap->event_index].name, irnet_events.log[ap->event_index].unit); break; case IRNET_REQUEST_FROM: - sprintf(event, "Request from %08x (%s)\n", - irnet_events.log[ap->event_index].addr, - irnet_events.log[ap->event_index].name); + sprintf(event, "Request from %08x (%s) behind %08x\n", + irnet_events.log[ap->event_index].daddr, + irnet_events.log[ap->event_index].name, + irnet_events.log[ap->event_index].saddr); break; case IRNET_NOANSWER_FROM: sprintf(event, "No-answer from %08x (%s) on ppp%d\n", - irnet_events.log[ap->event_index].addr, + irnet_events.log[ap->event_index].daddr, irnet_events.log[ap->event_index].name, irnet_events.log[ap->event_index].unit); break; case IRNET_BLOCKED_LINK: sprintf(event, "Blocked link with %08x (%s) on ppp%d\n", - irnet_events.log[ap->event_index].addr, + irnet_events.log[ap->event_index].daddr, irnet_events.log[ap->event_index].name, irnet_events.log[ap->event_index].unit); break; case IRNET_DISCONNECT_FROM: sprintf(event, "Disconnection from %08x (%s) on ppp%d\n", - irnet_events.log[ap->event_index].addr, + irnet_events.log[ap->event_index].daddr, irnet_events.log[ap->event_index].name, irnet_events.log[ap->event_index].unit); break; case IRNET_DISCONNECT_TO: sprintf(event, "Disconnected to %08x (%s)\n", - irnet_events.log[ap->event_index].addr, + irnet_events.log[ap->event_index].daddr, irnet_events.log[ap->event_index].name); break; default: @@ -794,11 +852,9 @@ { #ifdef CONNECT_IN_SEND /* Let's try to connect one more time... */ - /* Note : we won't connect fully yet, but we should be ready for - * next packet... */ - /* Note : we can't do that, we need to have a process context to - * go through interruptible_sleep_on() in irnet_find_lsap_sel() - * We need to find another way... */ + /* Note : we won't be connected after this call, but we should be + * ready for next packet... */ + /* If we are already connecting, this will fail */ irda_irnet_connect(self); #endif /* CONNECT_IN_SEND */ diff -u --recursive --new-file v2.4.5/linux/net/irda/irnet/irnet_ppp.h linux/net/irda/irnet/irnet_ppp.h --- v2.4.5/linux/net/irda/irnet/irnet_ppp.h Fri May 25 18:28:55 2001 +++ linux/net/irda/irnet/irnet_ppp.h Tue Jun 5 18:06:52 2001 @@ -22,13 +22,8 @@ #define IRNET_MAJOR 10 /* Misc range */ #define IRNET_MINOR 187 /* Official allocation */ -#ifdef LINKNAME_IOCTL -/* Compatibility with old ppp drivers - * Should be defined in */ -#ifndef PPPIOCSLINKNAME -#define PPPIOCSLINKNAME _IOW('t', 74, struct ppp_option_data) -#endif /* PPPIOCSLINKNAME */ -#endif /* LINKNAME_IOCTL */ +/* IrNET control channel stuff */ +#define IRNET_MAX_COMMAND 256 /* Max length of a command line */ /* PPP hardcore stuff */ diff -u --recursive --new-file v2.4.5/linux/net/sched/sch_cbq.c linux/net/sched/sch_cbq.c --- v2.4.5/linux/net/sched/sch_cbq.c Sun Mar 25 18:14:25 2001 +++ linux/net/sched/sch_cbq.c Tue Jun 5 18:11:43 2001 @@ -282,6 +282,7 @@ case TC_POLICE_SHOT: return NULL; default: + break; } #endif if (cl->level == 0) diff -u --recursive --new-file v2.4.5/linux/net/socket.c linux/net/socket.c --- v2.4.5/linux/net/socket.c Wed Apr 25 16:13:50 2001 +++ linux/net/socket.c Tue Jun 5 18:11:42 2001 @@ -1668,6 +1668,10 @@ extern void wanrouter_init(void); #endif +#ifdef CONFIG_BLUEZ +extern void bluez_init(void); +#endif + void __init sock_init(void) { int i; @@ -1726,6 +1730,10 @@ #endif #ifdef CONFIG_NETFILTER netfilter_init(); +#endif + +#ifdef CONFIG_BLUEZ + bluez_init(); #endif }